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