packages feed

canadian-income-tax-2024.0.0.1: src/Tax/Canada/Province/MB/MB428/Fix.hs

{-# 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 = fixEq $ \mb428@MB428{..}-> MB428{page1 = fixPage1 page1,
                                            page2 = fixPage2 mb428 page2,
                                            page3 = fixPage3 mb428 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 Nothing column3}

fixPage1PartB :: Page1PartB Maybe -> Page1PartB Maybe
fixPage1PartB = fixEq $ \part@Page1PartB{..}-> 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 = fixEq $ \Page2{..}-> Page2{
  partB = fixPage2PartB mb428 partB}

fixPage2PartB :: MB428 Maybe -> Page2PartB Maybe -> Page2PartB Maybe
fixPage2PartB mb428 = fixEq $ \part@Page2PartB{..}-> 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 = fixEq $ \part@Donations{..} -> 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 = fixEq $ \page@Page3{..}-> page{
   partC = fixPartC mb428 partC}

fixPartC :: MB428 Maybe -> PartC Maybe -> PartC Maybe
fixPartC mb428 = fixEq $ \part@PartC{..}-> 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}