{-# LANGUAGE ImportQualifiedPost #-} {-# LANGUAGE FlexibleInstances #-} {-# LANGUAGE GADTs #-} {-# LANGUAGE NamedFieldPuns #-} {-# LANGUAGE OverloadedRecordDot #-} {-# LANGUAGE OverloadedStrings #-} {-# LANGUAGE RecordWildCards #-} module Tax.Canada.Province.AB.AB428.Fix (AB428, fixAB428) where import Control.Applicative (liftA2) import Control.Monad (guard) import Data.Fixed (Centi) import Rank2 qualified import Tax.Canada.Province.AB.AB428.Types import Tax.Canada.Shared (fixBaseCredit, fixMedicalExpenses, fixSubCalculation, fixTaxIncomeBracket, BaseCredit(cont), MedicalExpenses (difference), SubCalculation (result), TaxIncomeBracket (equalsTax)) import Tax.Util (fixEq, fractionOf, nonNegativeDifference, totalOf) fixAB428 :: AB428 Maybe -> AB428 Maybe fixAB428 :: AB428 Maybe -> AB428 Maybe fixAB428 = (AB428 Maybe -> AB428 Maybe) -> AB428 Maybe -> AB428 Maybe forall a. Eq a => (a -> a) -> a -> a fixEq ((AB428 Maybe -> AB428 Maybe) -> AB428 Maybe -> AB428 Maybe) -> (AB428 Maybe -> AB428 Maybe) -> AB428 Maybe -> AB428 Maybe forall a b. (a -> b) -> a -> b $ \ab428 :: AB428 Maybe ab428@AB428{Page3 Maybe Page2 Maybe Page1 Maybe page1 :: Page1 Maybe page2 :: Page2 Maybe page3 :: Page3 Maybe $sel:page1:AB428 :: forall (line :: * -> *). AB428 line -> Page1 line $sel:page2:AB428 :: forall (line :: * -> *). AB428 line -> Page2 line $sel:page3:AB428 :: forall (line :: * -> *). AB428 line -> Page3 line ..}-> AB428{$sel:page1:AB428 :: Page1 Maybe page1 = Page1 Maybe -> Page1 Maybe fixPage1 Page1 Maybe page1, $sel:page2:AB428 :: Page2 Maybe page2 = AB428 Maybe -> Page2 Maybe -> Page2 Maybe fixPage2 AB428 Maybe ab428 Page2 Maybe page2, $sel:page3:AB428 :: Page3 Maybe page3 = AB428 Maybe -> Page3 Maybe -> Page3 Maybe fixPage3 AB428 Maybe ab428 Page3 Maybe page3} fixPage1 :: Page1 Maybe -> Page1 Maybe fixPage1 :: Page1 Maybe -> Page1 Maybe fixPage1 = (Page1 Maybe -> Page1 Maybe) -> Page1 Maybe -> Page1 Maybe forall a. Eq a => (a -> a) -> a -> a fixEq ((Page1 Maybe -> Page1 Maybe) -> Page1 Maybe -> Page1 Maybe) -> (Page1 Maybe -> Page1 Maybe) -> Page1 Maybe -> Page1 Maybe forall a b. (a -> b) -> a -> b $ \Page1{Maybe Centi Page1PartB Maybe Page1PartA Maybe income :: Maybe Centi partA :: Page1PartA Maybe partB :: Page1PartB Maybe $sel:income:Page1 :: forall (line :: * -> *). Page1 line -> line Centi $sel:partA:Page1 :: forall (line :: * -> *). Page1 line -> Page1PartA line $sel:partB:Page1 :: forall (line :: * -> *). Page1 line -> Page1PartB line ..}-> Page1{ $sel:income:Page1 :: Maybe Centi income = Maybe Centi income, $sel:partA:Page1 :: Page1PartA Maybe partA = Maybe Centi -> Page1PartA Maybe -> Page1PartA Maybe fixPage1PartA Maybe Centi income Page1PartA Maybe partA, $sel:partB:Page1 :: Page1PartB Maybe partB = Page1PartB Maybe -> Page1PartB Maybe fixPage1PartB Page1PartB Maybe partB} fixPage1PartA :: Maybe Centi -> Page1PartA Maybe -> Page1PartA Maybe fixPage1PartA :: Maybe Centi -> Page1PartA Maybe -> Page1PartA Maybe fixPage1PartA Maybe Centi income = (Page1PartA Maybe -> Page1PartA Maybe) -> Page1PartA Maybe -> Page1PartA Maybe forall a. Eq a => (a -> a) -> a -> a fixEq ((Page1PartA Maybe -> Page1PartA Maybe) -> Page1PartA Maybe -> Page1PartA Maybe) -> (Page1PartA Maybe -> Page1PartA Maybe) -> Page1PartA Maybe -> Page1PartA Maybe forall a b. (a -> b) -> a -> b $ \Page1PartA{TaxIncomeBracket Maybe column1 :: TaxIncomeBracket Maybe column2 :: TaxIncomeBracket Maybe column3 :: TaxIncomeBracket Maybe column4 :: TaxIncomeBracket Maybe column5 :: TaxIncomeBracket Maybe $sel:column1:Page1PartA :: forall (line :: * -> *). Page1PartA line -> TaxIncomeBracket line $sel:column2:Page1PartA :: forall (line :: * -> *). Page1PartA line -> TaxIncomeBracket line $sel:column3:Page1PartA :: forall (line :: * -> *). Page1PartA line -> TaxIncomeBracket line $sel:column4:Page1PartA :: forall (line :: * -> *). Page1PartA line -> TaxIncomeBracket line $sel:column5:Page1PartA :: forall (line :: * -> *). Page1PartA line -> TaxIncomeBracket line ..}-> Page1PartA{ $sel:column1:Page1PartA :: TaxIncomeBracket Maybe column1 = Maybe Centi -> Maybe (TaxIncomeBracket Maybe) -> TaxIncomeBracket Maybe -> TaxIncomeBracket Maybe fixTaxIncomeBracket Maybe Centi income (TaxIncomeBracket Maybe -> Maybe (TaxIncomeBracket Maybe) forall a. a -> Maybe a Just TaxIncomeBracket Maybe column2) TaxIncomeBracket Maybe column1, $sel:column2:Page1PartA :: TaxIncomeBracket Maybe column2 = Maybe Centi -> Maybe (TaxIncomeBracket Maybe) -> TaxIncomeBracket Maybe -> TaxIncomeBracket Maybe fixTaxIncomeBracket Maybe Centi income (TaxIncomeBracket Maybe -> Maybe (TaxIncomeBracket Maybe) forall a. a -> Maybe a Just TaxIncomeBracket Maybe column3) TaxIncomeBracket Maybe column2, $sel:column3:Page1PartA :: TaxIncomeBracket Maybe column3 = Maybe Centi -> Maybe (TaxIncomeBracket Maybe) -> TaxIncomeBracket Maybe -> TaxIncomeBracket Maybe fixTaxIncomeBracket Maybe Centi income (TaxIncomeBracket Maybe -> Maybe (TaxIncomeBracket Maybe) forall a. a -> Maybe a Just TaxIncomeBracket Maybe column4) TaxIncomeBracket Maybe column3, $sel:column4:Page1PartA :: TaxIncomeBracket Maybe column4 = Maybe Centi -> Maybe (TaxIncomeBracket Maybe) -> TaxIncomeBracket Maybe -> TaxIncomeBracket Maybe fixTaxIncomeBracket Maybe Centi income (TaxIncomeBracket Maybe -> Maybe (TaxIncomeBracket Maybe) forall a. a -> Maybe a Just TaxIncomeBracket Maybe column5) TaxIncomeBracket Maybe column4, $sel:column5:Page1PartA :: TaxIncomeBracket Maybe column5 = Maybe Centi -> Maybe (TaxIncomeBracket Maybe) -> TaxIncomeBracket Maybe -> TaxIncomeBracket Maybe fixTaxIncomeBracket Maybe Centi income Maybe (TaxIncomeBracket Maybe) forall a. Maybe a Nothing TaxIncomeBracket Maybe column5} fixPage1PartB :: Page1PartB Maybe -> Page1PartB Maybe fixPage1PartB :: Page1PartB Maybe -> Page1PartB Maybe fixPage1PartB = (Page1PartB Maybe -> Page1PartB Maybe) -> Page1PartB Maybe -> Page1PartB Maybe forall a. Eq a => (a -> a) -> a -> a fixEq ((Page1PartB Maybe -> Page1PartB Maybe) -> Page1PartB Maybe -> Page1PartB Maybe) -> (Page1PartB Maybe -> Page1PartB Maybe) -> Page1PartB Maybe -> Page1PartB Maybe forall a b. (a -> b) -> a -> b $ \part :: Page1PartB Maybe part@Page1PartB{Maybe Centi SubCalculation Maybe BaseCredit Maybe line9_basic :: Maybe Centi line10_age :: Maybe Centi spouseAmount :: BaseCredit Maybe dependantAmount :: BaseCredit Maybe line17_infirm :: Maybe Centi line18 :: Maybe Centi line19_cppQpp :: Maybe Centi line20_cppQpp :: Maybe Centi line21_employmentInsurance :: Maybe Centi line22_employmentInsurance :: Maybe Centi line23_adoption :: Maybe Centi line24_sum :: SubCalculation Maybe line25 :: Maybe Centi $sel:line9_basic:Page1PartB :: forall (line :: * -> *). Page1PartB line -> line Centi $sel:line10_age:Page1PartB :: forall (line :: * -> *). Page1PartB line -> line Centi $sel:spouseAmount:Page1PartB :: forall (line :: * -> *). Page1PartB line -> BaseCredit line $sel:dependantAmount:Page1PartB :: forall (line :: * -> *). Page1PartB line -> BaseCredit line $sel:line17_infirm:Page1PartB :: forall (line :: * -> *). Page1PartB line -> line Centi $sel:line18:Page1PartB :: forall (line :: * -> *). Page1PartB line -> line Centi $sel:line19_cppQpp:Page1PartB :: forall (line :: * -> *). Page1PartB line -> line Centi $sel:line20_cppQpp:Page1PartB :: forall (line :: * -> *). Page1PartB line -> line Centi $sel:line21_employmentInsurance:Page1PartB :: forall (line :: * -> *). Page1PartB line -> line Centi $sel:line22_employmentInsurance:Page1PartB :: forall (line :: * -> *). Page1PartB line -> line Centi $sel:line23_adoption:Page1PartB :: forall (line :: * -> *). Page1PartB line -> line Centi $sel:line24_sum:Page1PartB :: forall (line :: * -> *). Page1PartB line -> SubCalculation line $sel:line25:Page1PartB :: forall (line :: * -> *). Page1PartB line -> line Centi ..}-> Page1PartB Maybe part{ line9_basic = Just 21003, spouseAmount = fixBaseCredit spouseAmount, dependantAmount = fixBaseCredit dependantAmount, line18 = totalOf [line9_basic, line10_age, spouseAmount.cont, dependantAmount.cont, line17_infirm], line24_sum = fixSubCalculation $ totalOf [line19_cppQpp, line20_cppQpp, line21_employmentInsurance, line22_employmentInsurance, line23_adoption], line25 = totalOf [line18, line24_sum.result]} fixPage2 :: AB428 Maybe -> Page2 Maybe -> Page2 Maybe fixPage2 :: AB428 Maybe -> Page2 Maybe -> Page2 Maybe fixPage2 AB428 Maybe ab428 = (Page2 Maybe -> Page2 Maybe) -> Page2 Maybe -> Page2 Maybe forall a. Eq a => (a -> a) -> a -> a fixEq ((Page2 Maybe -> Page2 Maybe) -> Page2 Maybe -> Page2 Maybe) -> (Page2 Maybe -> Page2 Maybe) -> Page2 Maybe -> Page2 Maybe forall a b. (a -> b) -> a -> b $ \Page2{Page2PartB Maybe partB :: Page2PartB Maybe $sel:partB:Page2 :: forall (line :: * -> *). Page2 line -> Page2PartB line ..}-> Page2{ $sel:partB:Page2 :: Page2PartB Maybe partB = AB428 Maybe -> Page2PartB Maybe -> Page2PartB Maybe fixPage2PartB AB428 Maybe ab428 Page2PartB Maybe partB} fixPage2PartB :: AB428 Maybe -> Page2PartB Maybe -> Page2PartB Maybe fixPage2PartB :: AB428 Maybe -> Page2PartB Maybe -> Page2PartB Maybe fixPage2PartB AB428 Maybe ab428 = (Page2PartB Maybe -> Page2PartB Maybe) -> Page2PartB Maybe -> Page2PartB Maybe forall a. Eq a => (a -> a) -> a -> a fixEq ((Page2PartB Maybe -> Page2PartB Maybe) -> Page2PartB Maybe -> Page2PartB Maybe) -> (Page2PartB Maybe -> Page2PartB Maybe) -> Page2PartB Maybe -> Page2PartB Maybe forall a b. (a -> b) -> a -> b $ \part :: Page2PartB Maybe part@Page2PartB{Maybe Rational Maybe Centi SubCalculation Maybe MedicalExpenses Maybe Donations Maybe line26 :: Maybe Centi line27_pension :: Maybe Centi line28_caregiver :: Maybe Centi line29 :: Maybe Centi line30_disability :: Maybe Centi line31 :: Maybe Centi line32 :: Maybe Centi line33_interest :: Maybe Centi line34_education :: Maybe Centi line35_transferredSpouse :: Maybe Centi line36 :: Maybe Centi medicalExpenses :: MedicalExpenses Maybe line43 :: Maybe Centi line44_sum :: SubCalculation Maybe line45 :: Maybe Centi line46_rate :: Maybe Rational line47_fraction :: Maybe Centi donations :: Donations Maybe line50_sum :: SubCalculation Maybe line51 :: Maybe Centi $sel:line26:Page2PartB :: forall (line :: * -> *). Page2PartB line -> line Centi $sel:line27_pension:Page2PartB :: forall (line :: * -> *). Page2PartB line -> line Centi $sel:line28_caregiver:Page2PartB :: forall (line :: * -> *). Page2PartB line -> line Centi $sel:line29:Page2PartB :: forall (line :: * -> *). Page2PartB line -> line Centi $sel:line30_disability:Page2PartB :: forall (line :: * -> *). Page2PartB line -> line Centi $sel:line31:Page2PartB :: forall (line :: * -> *). Page2PartB line -> line Centi $sel:line32:Page2PartB :: forall (line :: * -> *). Page2PartB line -> line Centi $sel:line33_interest:Page2PartB :: forall (line :: * -> *). Page2PartB line -> line Centi $sel:line34_education:Page2PartB :: forall (line :: * -> *). Page2PartB line -> line Centi $sel:line35_transferredSpouse:Page2PartB :: forall (line :: * -> *). Page2PartB line -> line Centi $sel:line36:Page2PartB :: forall (line :: * -> *). Page2PartB line -> line Centi $sel:medicalExpenses:Page2PartB :: forall (line :: * -> *). Page2PartB line -> MedicalExpenses line $sel:line43:Page2PartB :: forall (line :: * -> *). Page2PartB line -> line Centi $sel:line44_sum:Page2PartB :: forall (line :: * -> *). Page2PartB line -> SubCalculation line $sel:line45:Page2PartB :: forall (line :: * -> *). Page2PartB line -> line Centi $sel:line46_rate:Page2PartB :: forall (line :: * -> *). Page2PartB line -> line Rational $sel:line47_fraction:Page2PartB :: forall (line :: * -> *). Page2PartB line -> line Centi $sel:donations:Page2PartB :: forall (line :: * -> *). Page2PartB line -> Donations line $sel:line50_sum:Page2PartB :: forall (line :: * -> *). Page2PartB line -> SubCalculation line $sel:line51:Page2PartB :: forall (line :: * -> *). Page2PartB line -> line Centi ..}-> Page2PartB Maybe part{ line26 = ab428.page1.partB.line25, line29 = totalOf [line26, line27_pension, line28_caregiver], line32 = totalOf [line29, line30_disability, line31], line36 = totalOf [line32, line33_interest, line34_education, line35_transferredSpouse], medicalExpenses = fixMedicalExpenses 2714 medicalExpenses, line44_sum = fixSubCalculation $ totalOf [medicalExpenses.difference, line43], line45 = totalOf [line36, line44_sum.result], line47_fraction = line46_rate `fractionOf` line45, donations = fixDonations donations, line50_sum = fixSubCalculation $ totalOf [donations.line48_fraction, donations.line49_fraction], line51 = totalOf [line47_fraction, line50_sum.result]} fixDonations :: Donations Maybe -> Donations Maybe fixDonations :: Donations Maybe -> Donations Maybe fixDonations = (Donations Maybe -> Donations Maybe) -> Donations Maybe -> Donations Maybe forall a. Eq a => (a -> a) -> a -> a fixEq ((Donations Maybe -> Donations Maybe) -> Donations Maybe -> Donations Maybe) -> (Donations Maybe -> Donations Maybe) -> Donations Maybe -> Donations Maybe forall a b. (a -> b) -> a -> b $ \part :: Donations Maybe part@Donations{Maybe Centi line48_base :: Maybe Centi line48_fraction :: Maybe Centi line49_base :: Maybe Centi line49_fraction :: Maybe Centi $sel:line48_base:Donations :: forall (line :: * -> *). Donations line -> line Centi $sel:line48_fraction:Donations :: forall (line :: * -> *). Donations line -> line Centi $sel:line49_base:Donations :: forall (line :: * -> *). Donations line -> line Centi $sel:line49_fraction:Donations :: forall (line :: * -> *). Donations line -> line Centi ..} -> Donations Maybe part{ line48_fraction = Just 0.6 `fractionOf` line48_base, line49_fraction = Just 0.21 `fractionOf` line49_base} fixPage3 :: AB428 Maybe -> Page3 Maybe -> Page3 Maybe fixPage3 :: AB428 Maybe -> Page3 Maybe -> Page3 Maybe fixPage3 AB428 Maybe ab428 = (Page3 Maybe -> Page3 Maybe) -> Page3 Maybe -> Page3 Maybe forall a. Eq a => (a -> a) -> a -> a fixEq ((Page3 Maybe -> Page3 Maybe) -> Page3 Maybe -> Page3 Maybe) -> (Page3 Maybe -> Page3 Maybe) -> Page3 Maybe -> Page3 Maybe forall a b. (a -> b) -> a -> b $ \page :: Page3 Maybe page@Page3{PartD Maybe PartC Maybe partC :: PartC Maybe partD :: PartD Maybe $sel:partC:Page3 :: forall (line :: * -> *). Page3 line -> PartC line $sel:partD:Page3 :: forall (line :: * -> *). Page3 line -> PartD line ..}-> Page3 Maybe page{ partC = fixPartC ab428 partC, partD = fixPartD ab428 partD} fixPartC :: AB428 Maybe -> PartC Maybe -> PartC Maybe fixPartC :: AB428 Maybe -> PartC Maybe -> PartC Maybe fixPartC AB428 Maybe ab428 = (PartC Maybe -> PartC Maybe) -> PartC Maybe -> PartC Maybe forall a. Eq a => (a -> a) -> a -> a fixEq ((PartC Maybe -> PartC Maybe) -> PartC Maybe -> PartC Maybe) -> (PartC Maybe -> PartC Maybe) -> PartC Maybe -> PartC Maybe forall a b. (a -> b) -> a -> b $ \part :: PartC Maybe part@PartC{Maybe Centi SubCalculation Maybe line52_tax :: Maybe Centi line53_splitIncomeTax :: Maybe Centi line54 :: Maybe Centi line55_copy :: Maybe Centi line56_dividendCredits :: Maybe Centi line57_copy :: Maybe Centi line57_fraction :: Maybe Centi line58_sum :: SubCalculation Maybe line59_difference :: Maybe Centi line60_fromT691 :: Maybe Centi line60_fraction :: Maybe Centi line61 :: Maybe Centi line62_foreignCredit :: Maybe Centi line63_difference :: Maybe Centi line64_political :: Maybe Centi line65_political :: Maybe Centi line66_tax :: Maybe Centi $sel:line52_tax:PartC :: forall (line :: * -> *). PartC line -> line Centi $sel:line53_splitIncomeTax:PartC :: forall (line :: * -> *). PartC line -> line Centi $sel:line54:PartC :: forall (line :: * -> *). PartC line -> line Centi $sel:line55_copy:PartC :: forall (line :: * -> *). PartC line -> line Centi $sel:line56_dividendCredits:PartC :: forall (line :: * -> *). PartC line -> line Centi $sel:line57_copy:PartC :: forall (line :: * -> *). PartC line -> line Centi $sel:line57_fraction:PartC :: forall (line :: * -> *). PartC line -> line Centi $sel:line58_sum:PartC :: forall (line :: * -> *). PartC line -> SubCalculation line $sel:line59_difference:PartC :: forall (line :: * -> *). PartC line -> line Centi $sel:line60_fromT691:PartC :: forall (line :: * -> *). PartC line -> line Centi $sel:line60_fraction:PartC :: forall (line :: * -> *). PartC line -> line Centi $sel:line61:PartC :: forall (line :: * -> *). PartC line -> line Centi $sel:line62_foreignCredit:PartC :: forall (line :: * -> *). PartC line -> line Centi $sel:line63_difference:PartC :: forall (line :: * -> *). PartC line -> line Centi $sel:line64_political:PartC :: forall (line :: * -> *). PartC line -> line Centi $sel:line65_political:PartC :: forall (line :: * -> *). PartC line -> line Centi $sel:line66_tax:PartC :: forall (line :: * -> *). PartC line -> line Centi ..}-> PartC Maybe part{ line52_tax = totalOf [ab428.page1.partA.column1.equalsTax, ab428.page1.partA.column2.equalsTax, ab428.page1.partA.column3.equalsTax, ab428.page1.partA.column4.equalsTax, ab428.page1.partA.column5.equalsTax], line54 = totalOf [line52_tax, line53_splitIncomeTax], line55_copy = ab428.page2.partB.line51, line57_fraction = Just 0.35 `fractionOf` line57_copy, line58_sum = fixSubCalculation $ totalOf [line55_copy, line56_dividendCredits, line57_fraction], line59_difference = nonNegativeDifference line54 line58_sum.result, line60_fraction = Just 0.35 `fractionOf` line60_fromT691, line61 = totalOf [line59_difference, line60_fraction], line63_difference = nonNegativeDifference line61 line62_foreignCredit, line66_tax = nonNegativeDifference line63_difference line65_political} fixPartD :: AB428 Maybe -> PartD Maybe -> PartD Maybe fixPartD :: AB428 Maybe -> PartD Maybe -> PartD Maybe fixPartD AB428 Maybe _ab428 = (PartD Maybe -> PartD Maybe) -> PartD Maybe -> PartD Maybe forall a. Eq a => (a -> a) -> a -> a fixEq ((PartD Maybe -> PartD Maybe) -> PartD Maybe -> PartD Maybe) -> (PartD Maybe -> PartD Maybe) -> PartD Maybe -> PartD Maybe forall a b. (a -> b) -> a -> b $ \part :: PartD Maybe part@PartD{Maybe Centi line67_investorCredit :: Maybe Centi line68_stockCredit :: Maybe Centi line69_credits :: Maybe Centi $sel:line67_investorCredit:PartD :: forall (line :: * -> *). PartD line -> line Centi $sel:line68_stockCredit:PartD :: forall (line :: * -> *). PartD line -> line Centi $sel:line69_credits:PartD :: forall (line :: * -> *). PartD line -> line Centi ..}-> PartD Maybe part{ line69_credits = totalOf [line67_investorCredit, line68_stockCredit]}