{-# 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 Data.Fixed (Centi)

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
page3 :: forall (line :: * -> *). AB428 line -> Page3 line
page2 :: forall (line :: * -> *). AB428 line -> Page2 line
page1 :: forall (line :: * -> *). AB428 line -> Page1 line
..}-> AB428{page1 :: Page1 Maybe
page1 = Page1 Maybe -> Page1 Maybe
fixPage1 Page1 Maybe
page1,
                                            page2 :: Page2 Maybe
page2 = AB428 Maybe -> Page2 Maybe -> Page2 Maybe
fixPage2 AB428 Maybe
ab428 Page2 Maybe
page2,
                                            page3 :: 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
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
column4 :: TaxIncomeBracket Maybe
column5 :: TaxIncomeBracket Maybe
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
..}-> 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 (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 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
line25 :: forall (line :: * -> *). Page1PartB line -> line Centi
line24_sum :: forall (line :: * -> *). Page1PartB line -> SubCalculation line
line23_adoption :: 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 21885,
   spouseAmount = fixBaseCredit spouseAmount,
   dependantAmount = fixBaseCredit dependantAmount,
   line18 = totalOf [line9_basic, line10_age, spouseAmount.cont, dependantAmount.cont, line17_infirm],
   line24_sum = fixSubCalculation id $
                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
partB :: forall (line :: * -> *). Page2 line -> Page2PartB line
..}-> Page2{
  partB :: 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
line51 :: forall (line :: * -> *). Page2PartB line -> line Centi
line50_sum :: forall (line :: * -> *). Page2PartB line -> SubCalculation line
donations :: forall (line :: * -> *). Page2PartB line -> Donations line
line47_fraction :: forall (line :: * -> *). Page2PartB line -> line Centi
line46_rate :: forall (line :: * -> *). Page2PartB line -> line Rational
line45 :: forall (line :: * -> *). Page2PartB line -> line Centi
line44_sum :: forall (line :: * -> *). Page2PartB line -> SubCalculation line
line43 :: forall (line :: * -> *). Page2PartB line -> line Centi
medicalExpenses :: forall (line :: * -> *). Page2PartB line -> MedicalExpenses line
line36 :: forall (line :: * -> *). Page2PartB line -> line Centi
line35_transferredSpouse :: forall (line :: * -> *). Page2PartB line -> line Centi
line34_education :: forall (line :: * -> *). Page2PartB line -> line Centi
line33_interest :: forall (line :: * -> *). Page2PartB line -> line Centi
line32 :: forall (line :: * -> *). Page2PartB line -> line Centi
line31 :: forall (line :: * -> *). Page2PartB line -> line Centi
line30_disability :: forall (line :: * -> *). Page2PartB line -> line Centi
line29 :: forall (line :: * -> *). Page2PartB line -> line Centi
line28_caregiver :: forall (line :: * -> *). Page2PartB line -> line Centi
line27_pension :: forall (line :: * -> *). Page2PartB line -> line Centi
line26 :: 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 2828 medicalExpenses,
   line44_sum = fixSubCalculation id $ totalOf [medicalExpenses.difference, line43],
   line45 = totalOf [line36, line44_sum.result],
   line47_fraction = line46_rate `fractionOf` line45,
   donations = fixDonations donations,
   line50_sum = fixSubCalculation id $ 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
line49_fraction :: forall (line :: * -> *). Donations line -> line Centi
line49_base :: forall (line :: * -> *). Donations line -> line Centi
line48_fraction :: forall (line :: * -> *). Donations line -> line Centi
line48_base :: 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{PartC Maybe
partC :: PartC Maybe
partC :: forall (line :: * -> *). Page3 line -> PartC line
..}-> Page3 Maybe
page{
   partC = fixPartC ab428 partC}

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
line66_tax :: forall (line :: * -> *). PartC line -> line Centi
line65_political :: forall (line :: * -> *). PartC line -> line Centi
line64_political :: forall (line :: * -> *). PartC line -> line Centi
line63_difference :: forall (line :: * -> *). PartC line -> line Centi
line62_foreignCredit :: forall (line :: * -> *). PartC line -> line Centi
line61 :: forall (line :: * -> *). PartC line -> line Centi
line60_fraction :: forall (line :: * -> *). PartC line -> line Centi
line60_fromT691 :: forall (line :: * -> *). PartC line -> line Centi
line59_difference :: forall (line :: * -> *). PartC line -> line Centi
line58_sum :: forall (line :: * -> *). PartC line -> SubCalculation line
line57_fraction :: forall (line :: * -> *). PartC line -> line Centi
line57_copy :: forall (line :: * -> *). PartC line -> line Centi
line56_dividendCredits :: forall (line :: * -> *). PartC line -> line Centi
line55_copy :: forall (line :: * -> *). PartC line -> line Centi
line54 :: forall (line :: * -> *). PartC line -> line Centi
line53_splitIncomeTax :: forall (line :: * -> *). PartC line -> line Centi
line52_tax :: 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 id $ 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}