canadian-income-tax-2025.0: src/Tax/Canada/Province/AB/AB428/Fix.hs
{-# 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 = fixEq $ \ab428@AB428{..}-> AB428{page1 = fixPage1 page1,
page2 = fixPage2 ab428 page2,
page3 = fixPage3 ab428 page3}
fixPage1 :: Page1 Maybe -> Page1 Maybe
fixPage1 = fixEq $ \Page1{..}-> Page1{
income = income,
partA = fixPage1PartA income partA,
partB = fixPage1PartB partB}
fixPage1PartA :: Maybe Centi -> Page1PartA Maybe -> Page1PartA Maybe
fixPage1PartA income = fixEq $ \Page1PartA{..}-> Page1PartA{
column1 = fixTaxIncomeBracket income (Just column2) column1,
column2 = fixTaxIncomeBracket income (Just column3) column2,
column3 = fixTaxIncomeBracket income (Just column4) column3,
column4 = fixTaxIncomeBracket income (Just column5) column4,
column5 = fixTaxIncomeBracket income (Just column6) column5,
column6 = fixTaxIncomeBracket income Nothing column6}
fixPage1PartB :: Page1PartB Maybe -> Page1PartB Maybe
fixPage1PartB = fixEq $ \part@Page1PartB{..}-> part{
line9_basic = Just 22323,
spouseAmount = fixBaseCredit spouseAmount,
dependantAmount = fixBaseCredit dependantAmount,
line18 = totalOf [line9_basic, line10_age, spouseAmount.cont, dependantAmount.cont, line17_infirm]}
fixPage2 :: AB428 Maybe -> Page2 Maybe -> Page2 Maybe
fixPage2 ab428 = fixEq $ \Page2{..}-> Page2{
partB = fixPage2PartB ab428 partB}
fixPage2PartB :: AB428 Maybe -> Page2PartB Maybe -> Page2PartB Maybe
fixPage2PartB ab428 = fixEq $ \part@Page2PartB{..}-> part{
line26_copy = ab428.page1.partB.line18,
line24_sum = fixSubCalculation id $
totalOf [line19_cppQpp,
line20_cppQpp,
line21_employmentInsurance,
line22_employmentInsurance,
line23_adoption],
line25 = totalOf [line26_copy, line24_sum.result],
line29 = totalOf [line25, line27_pension, line28_caregiver],
line32 = totalOf [line29, line30_disability, line31],
line36 = totalOf [line32, line33_interest, line34_education, line35_transferredSpouse],
medicalExpenses = fixMedicalExpenses 2884 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 = fixEq $ \part@Donations{..} -> 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 = fixEq $ \page@Page3{..}-> page{
partC = fixPartC ab428 partC}
fixPartC :: AB428 Maybe -> PartC Maybe -> PartC Maybe
fixPartC ab428 = fixEq $ \part@PartC{..}-> 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,
line73_difference = nonNegativeDifference line63_difference line65_political,
line66_tax = nonNegativeDifference line73_difference line_61545_supplemental}