canadian-income-tax-2024.0.0.1: src/Tax/Canada/Province/BC/BC428/Fix.hs
{-# 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 = fixEq $ \bc428@BC428{..}-> BC428{page1 = fixPage1 page1,
page2 = fixPage2 bc428 page2,
page3 = fixPage3 bc428 page3}
fixPage1 :: Page1 Maybe -> Page1 Maybe
fixPage1 = fixEq $ \Page1{..}-> Page1{
partA = fixPage1PartA partA,
partB = fixPage1PartB partB}
fixPage1PartA :: Page1PartA Maybe -> Page1PartA Maybe
fixPage1PartA = fixEq $ \Page1PartA{..}-> Page1PartA{
income = income,
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 (Just column7) column6,
column7 = fixTaxIncomeBracket income Nothing column7}
fixPage1PartB :: Page1PartB Maybe -> Page1PartB Maybe
fixPage1PartB = fixEq $ \part@Page1PartB{..}-> 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 = fixEq $ \Page2{..}-> Page2{
partB = fixPage2PartB bc428 partB}
fixPage2PartB :: BC428 Maybe -> Page2PartB Maybe -> Page2PartB Maybe
fixPage2PartB bc428 = fixEq $ \part@Page2PartB{..}-> 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 = fixEq $ \part@PartC{..}-> 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 = fixEq $ \page@Page3{..}-> 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}