{-# LANGUAGE ImportQualifiedPost #-} {-# LANGUAGE FlexibleInstances #-} {-# LANGUAGE GADTs #-} {-# LANGUAGE NamedFieldPuns #-} {-# LANGUAGE OverloadedRecordDot #-} {-# LANGUAGE OverloadedStrings #-} {-# LANGUAGE RecordWildCards #-} module Tax.Canada.Province.MB.MB428.Fix (MB428, fixMB428) where import Control.Applicative (liftA2) import Control.Monad (guard) import Data.Fixed (Centi) import Rank2 qualified import Tax.Canada.Province.MB.MB428.Types import Tax.Canada.Shared (fixBaseCredit, fixMedicalExpenses, fixSubCalculation, fixTaxIncomeBracket, BaseCredit(cont), MedicalExpenses (difference), SubCalculation (result), TaxIncomeBracket (equalsTax)) import Tax.Util (fixEq, fractionOf, nonNegativeDifference, totalOf) fixMB428 :: MB428 Maybe -> MB428 Maybe fixMB428 :: MB428 Maybe -> MB428 Maybe fixMB428 = (MB428 Maybe -> MB428 Maybe) -> MB428 Maybe -> MB428 Maybe forall a. Eq a => (a -> a) -> a -> a fixEq ((MB428 Maybe -> MB428 Maybe) -> MB428 Maybe -> MB428 Maybe) -> (MB428 Maybe -> MB428 Maybe) -> MB428 Maybe -> MB428 Maybe forall a b. (a -> b) -> a -> b $ \mb428 :: MB428 Maybe mb428@MB428{Page3 Maybe Page2 Maybe Page1 Maybe page1 :: Page1 Maybe page2 :: Page2 Maybe page3 :: Page3 Maybe $sel:page1:MB428 :: forall (line :: * -> *). MB428 line -> Page1 line $sel:page2:MB428 :: forall (line :: * -> *). MB428 line -> Page2 line $sel:page3:MB428 :: forall (line :: * -> *). MB428 line -> Page3 line ..}-> MB428{$sel:page1:MB428 :: Page1 Maybe page1 = Page1 Maybe -> Page1 Maybe fixPage1 Page1 Maybe page1, $sel:page2:MB428 :: Page2 Maybe page2 = MB428 Maybe -> Page2 Maybe -> Page2 Maybe fixPage2 MB428 Maybe mb428 Page2 Maybe page2, $sel:page3:MB428 :: Page3 Maybe page3 = MB428 Maybe -> Page3 Maybe -> Page3 Maybe fixPage3 MB428 Maybe mb428 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 $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 ..}-> 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 Maybe (TaxIncomeBracket Maybe) forall a. Maybe a Nothing TaxIncomeBracket Maybe column3} 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_firefighters :: Maybe Centi line24_rescue :: Maybe Centi line25_fitness :: Maybe Centi line26_arts :: Maybe Centi line27_adoption :: Maybe Centi line28_sum :: SubCalculation Maybe line29 :: 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_firefighters:Page1PartB :: forall (line :: * -> *). Page1PartB line -> line Centi $sel:line24_rescue:Page1PartB :: forall (line :: * -> *). Page1PartB line -> line Centi $sel:line25_fitness:Page1PartB :: forall (line :: * -> *). Page1PartB line -> line Centi $sel:line26_arts:Page1PartB :: forall (line :: * -> *). Page1PartB line -> line Centi $sel:line27_adoption:Page1PartB :: forall (line :: * -> *). Page1PartB line -> line Centi $sel:line28_sum:Page1PartB :: forall (line :: * -> *). Page1PartB line -> SubCalculation line $sel:line29:Page1PartB :: forall (line :: * -> *). Page1PartB line -> line Centi ..}-> Page1PartB Maybe part{ line9_basic = Just 15000, spouseAmount = fixBaseCredit spouseAmount, dependantAmount = fixBaseCredit dependantAmount, line18 = totalOf [line9_basic, line10_age, spouseAmount.cont, dependantAmount.cont, line17_infirm], line28_sum = fixSubCalculation $ totalOf [line19_cppQpp, line20_cppQpp, line21_employmentInsurance, line22_employmentInsurance, line23_firefighters, line24_rescue, line25_fitness, line26_arts, line27_adoption], line29 = totalOf [line18, line28_sum.result]} fixPage2 :: MB428 Maybe -> Page2 Maybe -> Page2 Maybe fixPage2 :: MB428 Maybe -> Page2 Maybe -> Page2 Maybe fixPage2 MB428 Maybe mb428 = (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 = MB428 Maybe -> Page2PartB Maybe -> Page2PartB Maybe fixPage2PartB MB428 Maybe mb428 Page2PartB Maybe partB} fixPage2PartB :: MB428 Maybe -> Page2PartB Maybe -> Page2PartB Maybe fixPage2PartB :: MB428 Maybe -> Page2PartB Maybe -> Page2PartB Maybe fixPage2PartB MB428 Maybe mb428 = (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 line30 :: Maybe Centi line31_pension :: Maybe Centi line32_caregiver :: Maybe Centi line33 :: Maybe Centi line34_disability :: Maybe Centi line35 :: Maybe Centi line36 :: Maybe Centi line37_interest :: Maybe Centi line38_education :: Maybe Centi line39_transferredChild :: Maybe Centi line40_transferredSpouse :: Maybe Centi line41_family :: Maybe Centi line42_sum :: Maybe Centi medicalExpenses :: MedicalExpenses Maybe line49 :: Maybe Centi line50_sum :: SubCalculation Maybe line51 :: Maybe Centi line52_rate :: Maybe Rational line53_fraction :: Maybe Centi donations :: Donations Maybe line56_sum :: SubCalculation Maybe line57 :: Maybe Centi $sel:line30:Page2PartB :: forall (line :: * -> *). Page2PartB line -> line Centi $sel:line31_pension:Page2PartB :: forall (line :: * -> *). Page2PartB line -> line Centi $sel:line32_caregiver:Page2PartB :: forall (line :: * -> *). Page2PartB line -> line Centi $sel:line33:Page2PartB :: forall (line :: * -> *). Page2PartB line -> line Centi $sel:line34_disability:Page2PartB :: forall (line :: * -> *). Page2PartB line -> line Centi $sel:line35:Page2PartB :: forall (line :: * -> *). Page2PartB line -> line Centi $sel:line36:Page2PartB :: forall (line :: * -> *). Page2PartB line -> line Centi $sel:line37_interest:Page2PartB :: forall (line :: * -> *). Page2PartB line -> line Centi $sel:line38_education:Page2PartB :: forall (line :: * -> *). Page2PartB line -> line Centi $sel:line39_transferredChild:Page2PartB :: forall (line :: * -> *). Page2PartB line -> line Centi $sel:line40_transferredSpouse:Page2PartB :: forall (line :: * -> *). Page2PartB line -> line Centi $sel:line41_family:Page2PartB :: forall (line :: * -> *). Page2PartB line -> line Centi $sel:line42_sum:Page2PartB :: forall (line :: * -> *). Page2PartB line -> line Centi $sel:medicalExpenses:Page2PartB :: forall (line :: * -> *). Page2PartB line -> MedicalExpenses line $sel:line49:Page2PartB :: forall (line :: * -> *). Page2PartB line -> line Centi $sel:line50_sum:Page2PartB :: forall (line :: * -> *). Page2PartB line -> SubCalculation line $sel:line51:Page2PartB :: forall (line :: * -> *). Page2PartB line -> line Centi $sel:line52_rate:Page2PartB :: forall (line :: * -> *). Page2PartB line -> line Rational $sel:line53_fraction:Page2PartB :: forall (line :: * -> *). Page2PartB line -> line Centi $sel:donations:Page2PartB :: forall (line :: * -> *). Page2PartB line -> Donations line $sel:line56_sum:Page2PartB :: forall (line :: * -> *). Page2PartB line -> SubCalculation line $sel:line57:Page2PartB :: forall (line :: * -> *). Page2PartB line -> line Centi ..}-> Page2PartB Maybe part{ line30 = mb428.page1.partB.line29, line33 = totalOf [line30, line31_pension, line32_caregiver], line36 = totalOf [line33, line34_disability, line35], line42_sum = totalOf [line36, line37_interest, line38_education, line39_transferredChild, line40_transferredSpouse, line41_family], medicalExpenses = fixMedicalExpenses 1728 medicalExpenses, line50_sum = fixSubCalculation $ totalOf [medicalExpenses.difference, line49], line51 = totalOf [line42_sum, line50_sum.result], line53_fraction = line52_rate `fractionOf` line51, donations = fixDonations donations, line56_sum = fixSubCalculation $ totalOf [donations.line54_fraction, donations.line55_fraction], line57 = totalOf [line53_fraction, line56_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 line54_base :: Maybe Centi line54_fraction :: Maybe Centi line55_base :: Maybe Centi line55_fraction :: Maybe Centi $sel:line54_base:Donations :: forall (line :: * -> *). Donations line -> line Centi $sel:line54_fraction:Donations :: forall (line :: * -> *). Donations line -> line Centi $sel:line55_base:Donations :: forall (line :: * -> *). Donations line -> line Centi $sel:line55_fraction:Donations :: forall (line :: * -> *). Donations line -> line Centi ..} -> Donations Maybe part{ line54_fraction = Just 0.108 `fractionOf` line54_base, line55_fraction = Just 0.174 `fractionOf` line55_base} fixPage3 :: MB428 Maybe -> Page3 Maybe -> Page3 Maybe fixPage3 :: MB428 Maybe -> Page3 Maybe -> Page3 Maybe fixPage3 MB428 Maybe mb428 = (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{PartC Maybe partC :: PartC Maybe $sel:partC:Page3 :: forall (line :: * -> *). Page3 line -> PartC line ..}-> Page3 Maybe page{ partC = fixPartC mb428 partC} fixPartC :: MB428 Maybe -> PartC Maybe -> PartC Maybe fixPartC :: MB428 Maybe -> PartC Maybe -> PartC Maybe fixPartC MB428 Maybe mb428 = (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 line58_tax :: Maybe Centi line59_splitIncomeTax :: Maybe Centi line60 :: Maybe Centi line61_copy :: Maybe Centi line62_dividendCredits :: Maybe Centi line63_copy :: Maybe Centi line63_fraction :: Maybe Centi line64_sum :: SubCalculation Maybe line65_difference :: Maybe Centi line66_fromT691 :: Maybe Centi line66_fraction :: Maybe Centi line67 :: Maybe Centi line68_political :: Maybe Centi line69_political :: Maybe Centi line70_difference :: Maybe Centi line71_labour :: Maybe Centi line72_difference :: Maybe Centi line73_foreignCredit :: Maybe Centi line74_difference :: Maybe Centi line75_community :: Maybe Centi line76_difference :: Maybe Centi line77_venture :: Maybe Centi line78_difference :: Maybe Centi line79_sharePurchase :: Maybe Centi line80_difference :: Maybe Centi line81_mineral :: Maybe Centi line82_tax :: Maybe Centi $sel:line58_tax:PartC :: forall (line :: * -> *). PartC line -> line Centi $sel:line59_splitIncomeTax:PartC :: forall (line :: * -> *). PartC line -> line Centi $sel:line60:PartC :: forall (line :: * -> *). PartC line -> line Centi $sel:line61_copy:PartC :: forall (line :: * -> *). PartC line -> line Centi $sel:line62_dividendCredits:PartC :: forall (line :: * -> *). PartC line -> line Centi $sel:line63_copy:PartC :: forall (line :: * -> *). PartC line -> line Centi $sel:line63_fraction:PartC :: forall (line :: * -> *). PartC line -> line Centi $sel:line64_sum:PartC :: forall (line :: * -> *). PartC line -> SubCalculation line $sel:line65_difference:PartC :: forall (line :: * -> *). PartC line -> line Centi $sel:line66_fromT691:PartC :: forall (line :: * -> *). PartC line -> line Centi $sel:line66_fraction:PartC :: forall (line :: * -> *). PartC line -> line Centi $sel:line67:PartC :: forall (line :: * -> *). PartC line -> line Centi $sel:line68_political:PartC :: forall (line :: * -> *). PartC line -> line Centi $sel:line69_political:PartC :: forall (line :: * -> *). PartC line -> line Centi $sel:line70_difference:PartC :: forall (line :: * -> *). PartC line -> line Centi $sel:line71_labour:PartC :: forall (line :: * -> *). PartC line -> line Centi $sel:line72_difference:PartC :: forall (line :: * -> *). PartC line -> line Centi $sel:line73_foreignCredit:PartC :: forall (line :: * -> *). PartC line -> line Centi $sel:line74_difference:PartC :: forall (line :: * -> *). PartC line -> line Centi $sel:line75_community:PartC :: forall (line :: * -> *). PartC line -> line Centi $sel:line76_difference:PartC :: forall (line :: * -> *). PartC line -> line Centi $sel:line77_venture:PartC :: forall (line :: * -> *). PartC line -> line Centi $sel:line78_difference:PartC :: forall (line :: * -> *). PartC line -> line Centi $sel:line79_sharePurchase:PartC :: forall (line :: * -> *). PartC line -> line Centi $sel:line80_difference:PartC :: forall (line :: * -> *). PartC line -> line Centi $sel:line81_mineral:PartC :: forall (line :: * -> *). PartC line -> line Centi $sel:line82_tax:PartC :: forall (line :: * -> *). PartC line -> line Centi ..}-> PartC Maybe part{ line58_tax = totalOf [mb428.page1.partA.column1.equalsTax, mb428.page1.partA.column2.equalsTax, mb428.page1.partA.column3.equalsTax], line60 = totalOf [line58_tax, line59_splitIncomeTax], line61_copy = mb428.page2.partB.line57, line63_fraction = Just 0.5 `fractionOf` line63_copy, line64_sum = fixSubCalculation $ totalOf [line61_copy, line62_dividendCredits, line63_fraction], line65_difference = nonNegativeDifference line60 line64_sum.result, line66_fraction = Just 0.5 `fractionOf` line66_fromT691, line67 = totalOf [line65_difference, line66_fraction], line70_difference = nonNegativeDifference line67 line69_political, line72_difference = nonNegativeDifference line70_difference line71_labour, line74_difference = nonNegativeDifference line72_difference line73_foreignCredit, line76_difference = nonNegativeDifference line74_difference line75_community, line78_difference = nonNegativeDifference line76_difference line77_venture, line80_difference = nonNegativeDifference line78_difference line79_sharePurchase, line82_tax = nonNegativeDifference line80_difference line81_mineral}