{-# LANGUAGE ImportQualifiedPost #-} {-# LANGUAGE FlexibleInstances #-} {-# LANGUAGE GADTs #-} {-# LANGUAGE NamedFieldPuns #-} {-# LANGUAGE OverloadedRecordDot #-} {-# LANGUAGE OverloadedStrings #-} {-# LANGUAGE RecordWildCards #-} module Tax.Canada.Province.BC.BC428.Fix (BC428, fixBC428) where import Control.Applicative (liftA2) import Control.Monad (guard, mfilter) import Data.Fixed (Centi) import Rank2 qualified import Tax.Canada.Province.BC.BC428.Types import Tax.Canada.Shared (fixBaseCredit, fixMedicalExpenses, fixSubCalculation, fixTaxIncomeBracket, BaseCredit(cont), MedicalExpenses (difference), SubCalculation (result), TaxIncomeBracket (equalsTax)) import Tax.Util (fixEq, fractionOf, nonNegativeDifference, totalOf) fixBC428 :: BC428 Maybe -> BC428 Maybe fixBC428 :: BC428 Maybe -> BC428 Maybe fixBC428 = (BC428 Maybe -> BC428 Maybe) -> BC428 Maybe -> BC428 Maybe forall a. Eq a => (a -> a) -> a -> a fixEq ((BC428 Maybe -> BC428 Maybe) -> BC428 Maybe -> BC428 Maybe) -> (BC428 Maybe -> BC428 Maybe) -> BC428 Maybe -> BC428 Maybe forall a b. (a -> b) -> a -> b $ \bc428 :: BC428 Maybe bc428@BC428{Page3 Maybe Page2 Maybe Page1 Maybe page1 :: Page1 Maybe page2 :: Page2 Maybe page3 :: Page3 Maybe page3 :: forall (line :: * -> *). BC428 line -> Page3 line page2 :: forall (line :: * -> *). BC428 line -> Page2 line page1 :: forall (line :: * -> *). BC428 line -> Page1 line ..}-> BC428{page1 :: Page1 Maybe page1 = Page1 Maybe -> Page1 Maybe fixPage1 Page1 Maybe page1, page2 :: Page2 Maybe page2 = BC428 Maybe -> Page2 Maybe -> Page2 Maybe fixPage2 BC428 Maybe bc428 Page2 Maybe page2, page3 :: Page3 Maybe page3 = BC428 Maybe -> Page3 Maybe -> Page3 Maybe fixPage3 BC428 Maybe bc428 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{Page1PartB Maybe Page1PartA Maybe partA :: Page1PartA Maybe partB :: Page1PartB Maybe partB :: forall (line :: * -> *). Page1 line -> Page1PartB line partA :: forall (line :: * -> *). Page1 line -> Page1PartA line ..}-> Page1{ partA :: Page1PartA Maybe partA = Page1PartA Maybe -> Page1PartA Maybe fixPage1PartA Page1PartA Maybe partA, partB :: Page1PartB Maybe partB = Page1PartB Maybe -> Page1PartB Maybe fixPage1PartB Page1PartB Maybe partB} fixPage1PartA :: Page1PartA Maybe -> Page1PartA Maybe fixPage1PartA :: Page1PartA Maybe -> Page1PartA Maybe fixPage1PartA = (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{Maybe Centi TaxIncomeBracket Maybe income :: Maybe Centi column1 :: TaxIncomeBracket Maybe column2 :: TaxIncomeBracket Maybe column3 :: TaxIncomeBracket Maybe column4 :: TaxIncomeBracket Maybe column5 :: TaxIncomeBracket Maybe column6 :: TaxIncomeBracket Maybe column7 :: TaxIncomeBracket Maybe column7 :: forall (line :: * -> *). Page1PartA line -> TaxIncomeBracket line column6 :: forall (line :: * -> *). Page1PartA line -> TaxIncomeBracket line column5 :: forall (line :: * -> *). Page1PartA line -> TaxIncomeBracket line column4 :: forall (line :: * -> *). Page1PartA line -> TaxIncomeBracket line column3 :: forall (line :: * -> *). Page1PartA line -> TaxIncomeBracket line column2 :: forall (line :: * -> *). Page1PartA line -> TaxIncomeBracket line column1 :: forall (line :: * -> *). Page1PartA line -> TaxIncomeBracket line income :: forall (line :: * -> *). Page1PartA line -> line Centi ..}-> Page1PartA{ income :: Maybe Centi income = Maybe Centi income, 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 (TaxIncomeBracket Maybe -> Maybe (TaxIncomeBracket Maybe) forall a. a -> Maybe a Just TaxIncomeBracket Maybe column4) TaxIncomeBracket Maybe column3, column4 :: 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, column5 :: TaxIncomeBracket Maybe column5 = 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 column6) TaxIncomeBracket Maybe column5, column6 :: TaxIncomeBracket Maybe column6 = 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 column7) TaxIncomeBracket Maybe column6, column7 :: TaxIncomeBracket Maybe column7 = Maybe Centi -> Maybe (TaxIncomeBracket Maybe) -> TaxIncomeBracket Maybe -> TaxIncomeBracket Maybe fixTaxIncomeBracket Maybe Centi income Maybe (TaxIncomeBracket Maybe) forall a. Maybe a Nothing TaxIncomeBracket Maybe column7} 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 BaseCredit Maybe line16_basic :: Maybe Centi line17_age :: Maybe Centi spouseAmount :: BaseCredit Maybe dependantAmount :: BaseCredit Maybe line24_caregiver :: Maybe Centi line25 :: Maybe Centi line25 :: forall (line :: * -> *). Page1PartB line -> line Centi line24_caregiver :: forall (line :: * -> *). Page1PartB line -> line Centi dependantAmount :: forall (line :: * -> *). Page1PartB line -> BaseCredit line spouseAmount :: forall (line :: * -> *). Page1PartB line -> BaseCredit line line17_age :: forall (line :: * -> *). Page1PartB line -> line Centi line16_basic :: forall (line :: * -> *). Page1PartB line -> line Centi ..}-> Page1PartB Maybe part{ line16_basic = Just 12580, spouseAmount = fixBaseCredit spouseAmount, dependantAmount = fixBaseCredit dependantAmount, line25 = totalOf [line16_basic, line17_age, spouseAmount.cont, dependantAmount.cont, line24_caregiver]} fixPage2 :: BC428 Maybe -> Page2 Maybe -> Page2 Maybe fixPage2 :: BC428 Maybe -> Page2 Maybe -> Page2 Maybe fixPage2 BC428 Maybe bc428 = (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 = BC428 Maybe -> Page2PartB Maybe -> Page2PartB Maybe fixPage2PartB BC428 Maybe bc428 Page2PartB Maybe partB} fixPage2PartB :: BC428 Maybe -> Page2PartB Maybe -> Page2PartB Maybe fixPage2PartB :: BC428 Maybe -> Page2PartB Maybe -> Page2PartB Maybe fixPage2PartB BC428 Maybe bc428 = (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 line26 :: Maybe Centi line27_cppQpp :: Maybe Centi line28_cppQpp :: Maybe Centi line29_employmentInsurance :: Maybe Centi line30_employmentInsurance :: Maybe Centi line31_firefighters :: Maybe Centi line32_rescue :: Maybe Centi line33_sum :: SubCalculation Maybe line34_adoption :: Maybe Centi line35 :: Maybe Centi line36_pension :: Maybe Centi line37 :: Maybe Centi line38_disability :: Maybe Centi line39 :: Maybe Centi line40 :: Maybe Centi line41_interest :: Maybe Centi line42_education :: Maybe Centi line43_transferredChild :: Maybe Centi line44_transferredSpouse :: Maybe Centi line45 :: Maybe Centi medicalExpenses :: MedicalExpenses Maybe line52 :: Maybe Centi line53_sum :: SubCalculation Maybe line54 :: Maybe Centi line55_rate :: Maybe Rational line56_fraction :: Maybe Centi line57_donations :: Maybe Centi line58 :: Maybe Centi line59_food :: Maybe Centi line59_fraction :: Maybe Centi line60 :: Maybe Centi line60 :: forall (line :: * -> *). Page2PartB line -> line Centi line59_fraction :: forall (line :: * -> *). Page2PartB line -> line Centi line59_food :: forall (line :: * -> *). Page2PartB line -> line Centi line58 :: forall (line :: * -> *). Page2PartB line -> line Centi line57_donations :: forall (line :: * -> *). Page2PartB line -> line Centi line56_fraction :: forall (line :: * -> *). Page2PartB line -> line Centi line55_rate :: forall (line :: * -> *). Page2PartB line -> line Rational line54 :: forall (line :: * -> *). Page2PartB line -> line Centi line53_sum :: forall (line :: * -> *). Page2PartB line -> SubCalculation line line52 :: forall (line :: * -> *). Page2PartB line -> line Centi medicalExpenses :: forall (line :: * -> *). Page2PartB line -> MedicalExpenses line line45 :: forall (line :: * -> *). Page2PartB line -> line Centi line44_transferredSpouse :: forall (line :: * -> *). Page2PartB line -> line Centi line43_transferredChild :: forall (line :: * -> *). Page2PartB line -> line Centi line42_education :: forall (line :: * -> *). Page2PartB line -> line Centi line41_interest :: forall (line :: * -> *). Page2PartB line -> line Centi line40 :: forall (line :: * -> *). Page2PartB line -> line Centi line39 :: forall (line :: * -> *). Page2PartB line -> line Centi line38_disability :: forall (line :: * -> *). Page2PartB line -> line Centi line37 :: forall (line :: * -> *). Page2PartB line -> line Centi line36_pension :: forall (line :: * -> *). Page2PartB line -> line Centi line35 :: forall (line :: * -> *). Page2PartB line -> line Centi line34_adoption :: forall (line :: * -> *). Page2PartB line -> line Centi line33_sum :: forall (line :: * -> *). Page2PartB line -> SubCalculation line line32_rescue :: forall (line :: * -> *). Page2PartB line -> line Centi line31_firefighters :: forall (line :: * -> *). Page2PartB line -> line Centi line30_employmentInsurance :: forall (line :: * -> *). Page2PartB line -> line Centi line29_employmentInsurance :: forall (line :: * -> *). Page2PartB line -> line Centi line28_cppQpp :: forall (line :: * -> *). Page2PartB line -> line Centi line27_cppQpp :: forall (line :: * -> *). Page2PartB line -> line Centi line26 :: forall (line :: * -> *). Page2PartB line -> line Centi ..}-> Page2PartB Maybe part{ line26 = bc428.page1.partB.line25, line33_sum = fixSubCalculation id $ totalOf [line27_cppQpp, line28_cppQpp, line29_employmentInsurance, line30_employmentInsurance, line31_firefighters, line32_rescue], line35 = totalOf [line26, line33_sum.result, line34_adoption], line37 = totalOf [line35, line36_pension], line40 = totalOf [line37, line38_disability, line39], line45 = totalOf [line40, line41_interest, line42_education, line43_transferredChild, line44_transferredSpouse], medicalExpenses = fixMedicalExpenses 2616 medicalExpenses, line53_sum = fixSubCalculation id $ totalOf [medicalExpenses.difference, line52], line54 = totalOf [line45, line53_sum.result], line56_fraction = line55_rate `fractionOf` line54, line58 = totalOf [line56_fraction, line57_donations], line59_fraction = Just 0.25 `fractionOf` line59_food, line60 = totalOf [line58, line59_fraction]} fixPartC :: BC428 Maybe -> PartC Maybe -> PartC Maybe fixPartC :: BC428 Maybe -> PartC Maybe -> PartC Maybe fixPartC BC428 Maybe bc428 = (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 line61_tax :: Maybe Centi line62_splitIncomeTax :: Maybe Centi line63 :: Maybe Centi line64_copy :: Maybe Centi line65_dividendCredits :: Maybe Centi line66_copy :: Maybe Centi line66_fraction :: Maybe Centi line67_sum :: SubCalculation Maybe line68 :: Maybe Centi line69_copy :: Maybe Centi line69_fraction :: Maybe Centi line70 :: Maybe Centi line71_foreignCredit :: Maybe Centi line72 :: Maybe Centi line72 :: forall (line :: * -> *). PartC line -> line Centi line71_foreignCredit :: forall (line :: * -> *). PartC line -> line Centi line70 :: forall (line :: * -> *). PartC line -> line Centi line69_fraction :: forall (line :: * -> *). PartC line -> line Centi line69_copy :: forall (line :: * -> *). PartC line -> line Centi line68 :: forall (line :: * -> *). PartC line -> line Centi line67_sum :: forall (line :: * -> *). PartC line -> SubCalculation line line66_fraction :: forall (line :: * -> *). PartC line -> line Centi line66_copy :: forall (line :: * -> *). PartC line -> line Centi line65_dividendCredits :: forall (line :: * -> *). PartC line -> line Centi line64_copy :: forall (line :: * -> *). PartC line -> line Centi line63 :: forall (line :: * -> *). PartC line -> line Centi line62_splitIncomeTax :: forall (line :: * -> *). PartC line -> line Centi line61_tax :: forall (line :: * -> *). PartC line -> line Centi ..}-> PartC Maybe part{ line61_tax = totalOf [bc428.page1.partA.column1.equalsTax, bc428.page1.partA.column2.equalsTax, bc428.page1.partA.column3.equalsTax, bc428.page1.partA.column4.equalsTax, bc428.page1.partA.column5.equalsTax, bc428.page1.partA.column6.equalsTax, bc428.page1.partA.column7.equalsTax], line63 = totalOf [line61_tax, line62_splitIncomeTax], line64_copy = bc428.page2.partB.line60, line66_fraction = Just 0.337 `fractionOf` line66_copy, line67_sum = fixSubCalculation id $ totalOf [line64_copy, line65_dividendCredits, line66_fraction], line68 = nonNegativeDifference line63 line67_sum.result, line69_fraction = Just 0.337 `fractionOf` line69_copy, line70 = totalOf [line68, line69_fraction], line72 = nonNegativeDifference line70 line71_foreignCredit} fixPage3 :: BC428 Maybe -> Page3 Maybe -> Page3 Maybe fixPage3 :: BC428 Maybe -> Page3 Maybe -> Page3 Maybe fixPage3 BC428 Maybe bc428 = (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{Maybe Rational Maybe Text Maybe Centi SubCalculation Maybe PartC Maybe partC :: PartC Maybe line73_basicReduction :: Maybe Centi line74_copy :: Maybe Centi line75_base :: Maybe Centi line76_difference :: Maybe Centi line77_rate :: Maybe Rational line78_fraction :: SubCalculation Maybe line79_difference :: SubCalculation Maybe line80_difference :: Maybe Centi line81_logging :: Maybe Centi line82_difference :: Maybe Centi line83_political :: Maybe Centi line84_political :: Maybe Centi line85_difference :: Maybe Centi line86_esop20 :: Maybe Text line_60450_esop20 :: Maybe Centi line87_evcc30 :: Maybe Text line_60470_evcc30 :: Maybe Centi line88_sum :: SubCalculation Maybe line89_difference :: Maybe Centi line90_mining :: Maybe Centi line91_tax :: Maybe Centi line91_tax :: forall (line :: * -> *). Page3 line -> line Centi line90_mining :: forall (line :: * -> *). Page3 line -> line Centi line89_difference :: forall (line :: * -> *). Page3 line -> line Centi line88_sum :: forall (line :: * -> *). Page3 line -> SubCalculation line line_60470_evcc30 :: forall (line :: * -> *). Page3 line -> line Centi line87_evcc30 :: forall (line :: * -> *). Page3 line -> line Text line_60450_esop20 :: forall (line :: * -> *). Page3 line -> line Centi line86_esop20 :: forall (line :: * -> *). Page3 line -> line Text line85_difference :: forall (line :: * -> *). Page3 line -> line Centi line84_political :: forall (line :: * -> *). Page3 line -> line Centi line83_political :: forall (line :: * -> *). Page3 line -> line Centi line82_difference :: forall (line :: * -> *). Page3 line -> line Centi line81_logging :: forall (line :: * -> *). Page3 line -> line Centi line80_difference :: forall (line :: * -> *). Page3 line -> line Centi line79_difference :: forall (line :: * -> *). Page3 line -> SubCalculation line line78_fraction :: forall (line :: * -> *). Page3 line -> SubCalculation line line77_rate :: forall (line :: * -> *). Page3 line -> line Rational line76_difference :: forall (line :: * -> *). Page3 line -> line Centi line75_base :: forall (line :: * -> *). Page3 line -> line Centi line74_copy :: forall (line :: * -> *). Page3 line -> line Centi line73_basicReduction :: forall (line :: * -> *). Page3 line -> line Centi partC :: forall (line :: * -> *). Page3 line -> PartC line ..}-> Page3 Maybe page{ partC = fixPartC bc428 partC, line73_basicReduction = Just 547, line76_difference = nonNegativeDifference line74_copy line75_base, line78_fraction = fixSubCalculation id $ line77_rate `fractionOf` line76_difference, line79_difference = fixSubCalculation id $ nonNegativeDifference line73_basicReduction line78_fraction.result, line80_difference = nonNegativeDifference partC.line72 line79_difference.result, line82_difference = nonNegativeDifference line80_difference line81_logging, line85_difference = nonNegativeDifference line82_difference line84_political, line88_sum = fixSubCalculation id $ min 2000 <$> totalOf [line_60450_esop20, line_60470_evcc30], line89_difference = nonNegativeDifference line85_difference line88_sum.result, line91_tax = nonNegativeDifference line89_difference line90_mining}