{-# 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 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}