{-# LANGUAGE DisambiguateRecordFields #-} {-# LANGUAGE ImportQualifiedPost #-} {-# LANGUAGE NamedFieldPuns #-} {-# LANGUAGE NoFieldSelectors #-} {-# LANGUAGE OverloadedRecordDot #-} {-# LANGUAGE OverloadedStrings #-} module Tax.Canada.Province.AB (AB428, ab428Fields, fixAB428, fixReturns, returnFields, t1Fields) where import Data.CAProvinceCodes (Code(AB)) import qualified Rank2 import Tax.Canada.Federal qualified as Federal import Tax.Canada.Federal (Forms(t1), fixFederalForms) import Tax.Canada.Federal.Schedule9 qualified as Schedule9 import Tax.Canada.T1.Types (T1 (T1, page7, page8), Page7(Page7, step6_RefundOrBalanceOwing), Page8(Page8)) import Tax.Canada.T1.Types qualified as T1 import Tax.Canada.T1.Types qualified as Page8 (Page8(..)) import Tax.Canada.T1.FieldNames.AB (t1Fields) import Tax.Canada.Province.AB.AB428.Types qualified as AB import Tax.Canada.Province.AB.AB428.Types qualified as AB.Page1 (Page1(..)) import Tax.Canada.Province.AB.AB428.Types qualified as AB.Page2 (Page2(..)) import Tax.Canada.Province.AB.AB428.Types (AB428 (AB428)) import Tax.Canada.Province.AB.AB428.Fix (fixAB428) import Tax.Canada.Province.AB.AB428.FieldNames (ab428Fields) import Tax.Canada.Shared(MedicalExpenses(..), BaseCredit(..)) import Tax.FDF (FieldConst, within) import Tax.Util (fixEq) import Data.Functor.Product (Product(Pair)) type Returns = Product Federal.Forms AB428 fixReturns :: Returns Maybe -> Returns Maybe fixReturns = fixEq $ \(Pair ff@Federal.Forms{t1 = t1@T1{page7 = page7@Page7{step6_RefundOrBalanceOwing}, page8 = page8@Page8{step6_RefundOrBalanceOwing = page8step6}}, schedule9} ab428@AB428{page1 = page1@AB.Page1{partA, partB = partB1@AB.Page1PartB{spouseAmount}}, page2 = page2@AB.Page2{AB.partB = partB2@AB.Page2PartB{AB.medicalExpenses}}, page3 = page3@AB.Page3{AB.partC}}) -> (fixFederalForms ff{t1 = t1{page7 = page7{step6_RefundOrBalanceOwing = step6_RefundOrBalanceOwing{T1.line_42800_ProvTerrTax = ab428.page3.partC.line66_tax}}, page8 = page8{Page8.step6_RefundOrBalanceOwing = page8step6{T1.line_47900_ProvTerrCredits = ab428.page3.partD.line69_credits}}}} `Pair` fixAB428 ab428{AB.page1 = page1{AB.Page1.income = t1.page5.step4_TaxableIncome.line_26000_TaxableIncome, AB.Page1.partB = partB1{AB.spouseAmount = spouseAmount{reduction = t1.page1.spouse.line23600}, AB.line19_cppQpp = t1.page6.line30800, AB.line20_cppQpp = t1.page6.line31000, AB.line21_employmentInsurance = t1.page6.line31200, AB.line22_employmentInsurance = t1.page6.line31217}}, AB.page2 = page2{AB.Page2.partB = partB2{AB.line33_interest = t1.page6.line31900, AB.medicalExpenses = medicalExpenses{ expenses = t1.page6.medical_expenses.familyExpenses, netIncome = t1.page4.line_23600_NetIncome}, AB.donations = partB2.donations{ AB.line48_base = schedule9.line13_min, AB.line49_base = schedule9.line14_difference}}}, AB.page3 = page3{AB.partC = partC{AB.line57_copy = t1.page7.partC_NetFederalTax.line40427}}}) returnFields :: Returns FieldConst returnFields = Pair (Federal.formFieldsForProvince AB) (within "428" Rank2.<$> ab428Fields)