packages feed

canadian-income-tax-2023.0: src/Tax/Canada/Province/BC/BC428/FieldNames.hs

{-# LANGUAGE ImportQualifiedPost #-}
{-# LANGUAGE DisambiguateRecordFields #-}
{-# LANGUAGE NamedFieldPuns #-}
{-# LANGUAGE NumericUnderscores #-}
{-# LANGUAGE OverloadedStrings #-}

module Tax.Canada.Province.BC.BC428.FieldNames (bc428Fields) where

import Data.Fixed (Centi)
import Rank2 qualified

import Tax.Canada.Province.BC.BC428.Types
import Tax.Canada.Shared (BaseCredit(..), MedicalExpenses(..), TaxIncomeBracket (..), subCalculationFields)
import Tax.FDF (Entry (Count, Constant, Amount, Percent), FieldConst (Field, NoField), within)

bc428Fields = within "form1" Rank2.<$> BC428 {
   page1 = within "Page1" Rank2.<$> page1Fields,
   page2 = within "Page2" Rank2.<$> page2Fields,
   page3 = within "Page3" Rank2.<$> page3Fields}


page1Fields = Page1 {
   partA = within "PartA" Rank2.<$> page1PartAFields,
   partB = within "PartB" Rank2.<$> page1PartBFields}

page1PartAFields = Page1PartA {
   income = Field ["Line1", "Amount"] Amount,
   column1 = within "Column1" Rank2.<$>  taxIncomeBracketFields        0 0.0506      0,
   column2 = within "Column2" Rank2.<$>  taxIncomeBracketFields   45_654 0.077   2_310.09,
   column3 = within "Column3" Rank2.<$>  taxIncomeBracketFields   91_310 0.105   5_825.60,
   column4 = within "Column4" Rank2.<$>  taxIncomeBracketFields  104_835 0.1229  7_245.73,
   column5 = within "Column5" Rank2.<$> (taxIncomeBracketFields' 127_299 0.147  10_006.56){equalsTax = Field ["LIne15", "Amount"] Amount},
   column6 = within "Column6" Rank2.<$> (taxIncomeBracketFields' 172_602 0.168  16_666.10){rate = Field ["Line12", "Percent_amount"] $ Constant 0.168 Percent},
   column7 = within "Column7" Rank2.<$>  taxIncomeBracketFields' 240_716 0.205  28_109.25}

taxIncomeBracketFields :: Centi -> Rational -> Centi -> TaxIncomeBracket FieldConst
taxIncomeBracketFields threshold rate baseTax = TaxIncomeBracket {
   income = Field ["Line2", "Amount"] Amount,
   threshold = Field ["Line3", "Amount_ReadOnly"] $ Constant threshold Amount,
   overThreshold = Field ["Line4", "Amount"] Amount,
   rate = Field ["Line5", "Percent_Amount"] $ Constant rate Percent,
   timesRate = Field ["Line6", "Amount"] Amount,
   baseTax = Field ["Line7", "Amount_ReadOnly"] $ Constant baseTax Amount,
   equalsTax = Field ["Line8", "Amount"] Amount}

taxIncomeBracketFields' :: Centi -> Rational -> Centi -> TaxIncomeBracket FieldConst
taxIncomeBracketFields' threshold rate baseTax = TaxIncomeBracket {
   income = Field ["Line9", "Amount"] Amount,
   threshold = Field ["Line10", "Amount_ReadOnly"] $ Constant threshold Amount,
   overThreshold = Field ["Line11", "Amount"] Amount,
   rate = Field ["Line12", "Percent_Amount"] $ Constant rate Percent,
   timesRate = Field ["Line13", "Amount"] Amount,
   baseTax = Field ["Line14", "Amount_ReadOnly"] $ Constant baseTax Amount,
   equalsTax = Field ["Line15", "Amount"] Amount}

page1PartBFields = Page1PartB {
   line16_basic = Field ["Line16", "Amount"] Amount,
   line17_age = Field ["Line17", "Amount"] Amount,
   spouseAmount = within "Spouse_CPL_Amount" Rank2.<$> BaseCredit{
       baseAmount = Field ["Line18", "Amount"] $ Constant 11_285 Amount,
       reduction = Field ["Line19", "Amount"] Amount,
       difference = Field ["Line20", "Amount1"] Amount,
       cont = Field ["Line20", "Amount2"] Amount},
   dependantAmount = within "Amount_Eligible_Dependant" Rank2.<$> BaseCredit{
       baseAmount = Field ["Line21", "Amount"] $ Constant 11_285 Amount,
       reduction = Field ["Line22", "Amount"] Amount,
       difference = Field ["Line23", "Amount1"] Amount,
       cont = Field ["Line23", "Amount2"] Amount},
   line24_caregiver = Field ["Line24", "Amount"] Amount,
   line25 = Field ["Line25", "Amount"] Amount}

page2Fields = Page2 {
  partB = page2PartBFields}

page2PartBFields = Page2PartB {
   line26 = Field ["Line26", "Amount"] Amount,
   line27_cppQpp = Field ["Line27", "Amount"] Amount,
   line28_cppQpp = Field ["Line28", "Amount"] Amount,
   line29_employmentInsurance = Field ["Line29", "Amount"] Amount,
   line30_employmentInsurance = Field ["Line30", "Amount"] Amount,
   line31_firefighters = Field ["Line31", "Amount"] Amount,
   line32_rescue = Field ["Line32", "Amount"] Amount,
   line33_sum = subCalculationFields "Line33" ["I1", "Amount"] ["I2", "Amount"],
   line34_adoption = Field ["Line34", "Amount"] Amount,
   line35 = Field ["Line35", "Amount"] Amount,
   line36_pension = Field ["Line36", "Amount"] Amount,
   line37 = Field ["Line37", "Amount"] Amount,
   line38_disability = Field ["Line38", "Amount"] Amount,
   line39 = Field ["Line39", "Amount"] Amount,
   line40 = Field ["Line40", "Amount"] Amount,
   line41_interest = Field ["Line41", "Amount"] Amount,
   line42_education = Field ["Line42", "Amount"] Amount,
   line43_transferredChild = Field ["Line43", "Amount"] Amount,
   line44_transferredSpouse = Field ["Line44", "Amount"] Amount,
   line45 = Field ["Line45", "Amount"] Amount,
   medicalExpenses = within "MedicalExp" Rank2.<$> medicalExpensesFields,
   line52 = Field ["Line52", "Amount"] Amount,
   line53_sum = subCalculationFields "Line53" ["Amount1"] ["Amount2"],
   line54 = Field ["Line54", "Amount"] Amount,
   line55_rate = Field ["Line55", "PercentAmount_ReadOnly"] $ Constant 0.0506 Percent,
   line56_fraction = Field ["Line56", "Amount"] Amount,
   line57_donations = Field ["Line57", "Amount"] Amount,
   line58 = Field ["Line58", "Amount"] Amount,
   line59_food = Field ["Line59", "Gifts_from_57", "Amount"] Amount,
   line59_fraction = Field ["Line59", "Amount"] Amount,
   line60 = Field ["Line60", "Amount"] Amount}

medicalExpensesFields = MedicalExpenses {
   expenses = Field ["Line46", "Amount"] Amount,
   netIncome = Field ["Line47", "Amount"] Amount,
   incomeRate = Field ["Line48", "PercentAmount_ReadOnly"] $ Constant 0.03 Percent,
   fraction = Field ["Line49", "Amount"] Amount,
   lesser = Field ["Line50", "Amount"] Amount,
   difference = Field ["Line51", "Amount"] Amount}

partCFields = PartC {
   line61_tax = Field ["Line61", "Amount"] Amount,
   line62_splitIncomeTax = Field ["Line62", "Amount"] Amount,
   line63 = Field ["Line63", "Amount"] Amount,
   line64_copy = Field ["Line64", "Amount"] Amount,
   line65_dividendCredits = Field ["Line65", "Amount"] Amount,
   line66_copy = Field ["Line66", "Line40427", "Amount"] Amount,
   line66_fraction = Field ["Line66", "Amount"] Amount,
   line67_sum = subCalculationFields "Line67" ["Amount1"] ["Amount2"],
   line68 = Field ["Line68", "Amount"] Amount,
   line69_copy = Field ["Line69", "Line120", "Amount"] Amount,
   line69_fraction = Field ["Line69", "Amount"] Amount,
   line70 = Field ["Line70", "Amount"] Amount,
   line71_foreignCredit = Field ["Line71", "Amount"] Amount,
   line72 = Field ["Line72", "Amount"] Amount}

page3Fields = Page3 {
   partC = partCFields,
   line73_basicReduction = Field ["Line73", "Amount"] Amount,
   line74_copy = Field ["Line74", "Amount"] Amount,
   line75_base = Field ["Line75", "Amount_ReadOnly"] $ Constant 23_179 Amount,
   line76_difference = Field ["Line76", "Amount"] Amount,
   line77_rate = Field ["Line77", "PercentAmount_ReadOnly"] $ Constant 0.0356 Percent,
   line78_fraction = subCalculationFields "Line78" ["Amount1"] ["Amount2"],
   line79_difference = subCalculationFields "Line79" ["Amount1"] ["Amount2"],
   line80_difference = Field ["Line80", "Amount"] Amount,
   line81_logging = Field ["Line81", "Amount"] Amount,
   line82_difference = Field ["Line82", "Amount"] Amount,
   line83_political = Field ["Line83", "Amount"] Amount,
   line84_political = Field ["Line84", "Amount"] Amount,
   line85_difference = Field ["Line85", "Amount"] Amount,
   line86_esop20 = Field ["Line86", "Amount"] Amount,
   line87_evcc30 = Field ["Line87", "Amount"] Amount,
   line88_sum = subCalculationFields "Line88" ["Amount1"] ["Amount2"],
   line89_difference = Field ["Line89", "Amount"] Amount,
   line90_mining = Field ["Line90", "Amount"] Amount,
   line91_tax = Field ["Line91", "Amount"] Amount}