{-# 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 Data.Fixed (Centi) 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 page3 :: forall (line :: * -> *). MB428 line -> Page3 line page2 :: forall (line :: * -> *). MB428 line -> Page2 line page1 :: forall (line :: * -> *). MB428 line -> Page1 line ..}-> MB428{page1 :: Page1 Maybe page1 = Page1 Maybe -> Page1 Maybe fixPage1 Page1 Maybe page1, page2 :: Page2 Maybe page2 = MB428 Maybe -> Page2 Maybe -> Page2 Maybe fixPage2 MB428 Maybe mb428 Page2 Maybe page2, page3 :: 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 partB :: forall (line :: * -> *). Page1 line -> Page1PartB line partA :: forall (line :: * -> *). Page1 line -> Page1PartA line income :: forall (line :: * -> *). Page1 line -> line Centi ..}-> Page1{ income :: Maybe Centi income = Maybe Centi income, partA :: Page1PartA Maybe partA = Maybe Centi -> Page1PartA Maybe -> Page1PartA Maybe fixPage1PartA Maybe Centi income Page1PartA Maybe partA, partB :: 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 column3 :: forall (line :: * -> *). Page1PartA line -> TaxIncomeBracket line column2 :: forall (line :: * -> *). Page1PartA line -> TaxIncomeBracket line column1 :: forall (line :: * -> *). Page1PartA line -> TaxIncomeBracket line ..}-> Page1PartA{ column1 :: 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, column2 :: 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, column3 :: 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 line29 :: forall (line :: * -> *). Page1PartB line -> line Centi line28_sum :: forall (line :: * -> *). Page1PartB line -> SubCalculation line line27_adoption :: forall (line :: * -> *). Page1PartB line -> line Centi line26_arts :: forall (line :: * -> *). Page1PartB line -> line Centi line25_fitness :: forall (line :: * -> *). Page1PartB line -> line Centi line24_rescue :: forall (line :: * -> *). Page1PartB line -> line Centi line23_firefighters :: forall (line :: * -> *). Page1PartB line -> line Centi line22_employmentInsurance :: forall (line :: * -> *). Page1PartB line -> line Centi line21_employmentInsurance :: forall (line :: * -> *). Page1PartB line -> line Centi line20_cppQpp :: forall (line :: * -> *). Page1PartB line -> line Centi line19_cppQpp :: forall (line :: * -> *). Page1PartB line -> line Centi line18 :: forall (line :: * -> *). Page1PartB line -> line Centi line17_infirm :: forall (line :: * -> *). Page1PartB line -> line Centi dependantAmount :: forall (line :: * -> *). Page1PartB line -> BaseCredit line spouseAmount :: forall (line :: * -> *). Page1PartB line -> BaseCredit line line10_age :: forall (line :: * -> *). Page1PartB line -> line Centi line9_basic :: forall (line :: * -> *). Page1PartB line -> line Centi ..}-> Page1PartB Maybe part{ line9_basic = Just 15780, spouseAmount = fixBaseCredit spouseAmount, dependantAmount = fixBaseCredit dependantAmount, line18 = totalOf [line9_basic, line10_age, spouseAmount.cont, dependantAmount.cont, line17_infirm], line28_sum = fixSubCalculation id $ 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 partB :: forall (line :: * -> *). Page2 line -> Page2PartB line ..}-> Page2{ partB :: 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 line57 :: forall (line :: * -> *). Page2PartB line -> line Centi line56_sum :: forall (line :: * -> *). Page2PartB line -> SubCalculation line donations :: forall (line :: * -> *). Page2PartB line -> Donations line line53_fraction :: forall (line :: * -> *). Page2PartB line -> line Centi line52_rate :: forall (line :: * -> *). Page2PartB line -> line Rational line51 :: forall (line :: * -> *). Page2PartB line -> line Centi line50_sum :: forall (line :: * -> *). Page2PartB line -> SubCalculation line line49 :: forall (line :: * -> *). Page2PartB line -> line Centi medicalExpenses :: forall (line :: * -> *). Page2PartB line -> MedicalExpenses line line42_sum :: forall (line :: * -> *). Page2PartB line -> line Centi line41_family :: forall (line :: * -> *). Page2PartB line -> line Centi line40_transferredSpouse :: forall (line :: * -> *). Page2PartB line -> line Centi line39_transferredChild :: forall (line :: * -> *). Page2PartB line -> line Centi line38_education :: forall (line :: * -> *). Page2PartB line -> line Centi line37_interest :: forall (line :: * -> *). Page2PartB line -> line Centi line36 :: forall (line :: * -> *). Page2PartB line -> line Centi line35 :: forall (line :: * -> *). Page2PartB line -> line Centi line34_disability :: forall (line :: * -> *). Page2PartB line -> line Centi line33 :: forall (line :: * -> *). Page2PartB line -> line Centi line32_caregiver :: forall (line :: * -> *). Page2PartB line -> line Centi line31_pension :: forall (line :: * -> *). Page2PartB line -> line Centi line30 :: 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 id $ totalOf [medicalExpenses.difference, line49], line51 = totalOf [line42_sum, line50_sum.result], line53_fraction = line52_rate `fractionOf` line51, donations = fixDonations donations, line56_sum = fixSubCalculation id $ 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 line55_fraction :: forall (line :: * -> *). Donations line -> line Centi line55_base :: forall (line :: * -> *). Donations line -> line Centi line54_fraction :: forall (line :: * -> *). Donations line -> line Centi line54_base :: 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 partC :: 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 line82_tax :: forall (line :: * -> *). PartC line -> line Centi line81_mineral :: forall (line :: * -> *). PartC line -> line Centi line80_difference :: forall (line :: * -> *). PartC line -> line Centi line79_sharePurchase :: forall (line :: * -> *). PartC line -> line Centi line78_difference :: forall (line :: * -> *). PartC line -> line Centi line77_venture :: forall (line :: * -> *). PartC line -> line Centi line76_difference :: forall (line :: * -> *). PartC line -> line Centi line75_community :: forall (line :: * -> *). PartC line -> line Centi line74_difference :: forall (line :: * -> *). PartC line -> line Centi line73_foreignCredit :: forall (line :: * -> *). PartC line -> line Centi line72_difference :: forall (line :: * -> *). PartC line -> line Centi line71_labour :: forall (line :: * -> *). PartC line -> line Centi line70_difference :: forall (line :: * -> *). PartC line -> line Centi line69_political :: forall (line :: * -> *). PartC line -> line Centi line68_political :: forall (line :: * -> *). PartC line -> line Centi line67 :: forall (line :: * -> *). PartC line -> line Centi line66_fraction :: forall (line :: * -> *). PartC line -> line Centi line66_fromT691 :: forall (line :: * -> *). PartC line -> line Centi line65_difference :: forall (line :: * -> *). PartC line -> line Centi line64_sum :: forall (line :: * -> *). PartC line -> SubCalculation line line63_fraction :: forall (line :: * -> *). PartC line -> line Centi line63_copy :: forall (line :: * -> *). PartC line -> line Centi line62_dividendCredits :: forall (line :: * -> *). PartC line -> line Centi line61_copy :: forall (line :: * -> *). PartC line -> line Centi line60 :: forall (line :: * -> *). PartC line -> line Centi line59_splitIncomeTax :: forall (line :: * -> *). PartC line -> line Centi line58_tax :: 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 id $ 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}