packages feed

canadian-income-tax-2022.2: src/Tax/Canada/ON428/Types.hs

{-# LANGUAGE DuplicateRecordFields #-}
{-# LANGUAGE ImportQualifiedPost #-}
{-# LANGUAGE InstanceSigs #-}
{-# LANGUAGE NoFieldSelectors #-}
{-# LANGUAGE OverloadedRecordDot #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE StandaloneDeriving #-}
{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE UndecidableInstances #-}

module Tax.Canada.ON428.Types where

import Data.Fixed (Centi)
import Language.Haskell.TH qualified as TH
import Rank2.TH qualified

data ON428 line = ON428 {
   page1 :: Page1 line,
   page2 :: Page2 line,
   page3 :: Page3 line,
   page4 :: Page4 line}

data Page1 line = Page1 {
   line1 :: line Centi,
   partA :: Page1PartA line,
   partB :: Page1PartB line}

data Page1PartA line = Page1PartA {
   column1 :: TaxIncomeBracket line,
   column2 :: TaxIncomeBracket line,
   column3 :: TaxIncomeBracket line,
   column4 :: TaxIncomeBracket line,
   column5 :: TaxIncomeBracket line}

data TaxIncomeBracket line = TaxIncomeBracket {
   line2_income :: line Centi,
   line3_threshold :: line Centi,
   line4_overThreshold :: line Centi,
   line5_rate :: line Rational,
   line6_timesRate :: line Centi,
   line7_baseTax :: line Centi,
   line8_equalsTax :: line Centi
   }

data Page1PartB line = Page1PartB {
   line9_basic :: line Centi,
   line10_age :: line Centi,
   line11_base :: line Centi,
   line12_spouseIncome :: line Centi,
   line13_difference :: line Centi,
   line13_cont :: line Centi,
   line14_base :: line Centi,
   line15_dependentIncome :: line Centi,
   line16_difference :: line Centi,
   line16_cont :: line Centi,
   line17_caregiver :: line Centi,
   line18 :: line Centi,
   line19_cppQpp :: line Centi,
   line20_cppQpp :: line Centi,
   line21_employmentInsurance :: line Centi,
   line22_employmentInsurance :: line Centi,
   line23_adoption :: line Centi,
   line24_sum :: line Centi,
   line24_cont :: line Centi,
   line25 :: line Centi}

data Page2 line = Page2 {
  partB :: Page2PartB line,
  partC :: Page2PartC line}

data Page2PartB line = Page2PartB {
   line26 :: line Centi,
   line27_pension :: line Centi,
   line28 :: line Centi,
   line29_disability :: line Centi,
   line30 :: line Centi,
   line31 :: line Centi,
   line32_interest :: line Centi,
   line33_education :: line Centi,
   line34_transferred :: line Centi,
   line35 :: line Centi,
   medicalExpenses :: MedicalExpenses line,
   line42 :: line Centi,
   line43_sum :: line Centi,
   line43_cont :: line Centi,
   line44 :: line Centi,
   line45_rate :: line Rational,
   line46_fraction :: line Centi,
   donations :: Donations line,
   line50 :: line Centi}

data MedicalExpenses line = MedicalExpenses {
   line36_expenses :: line Centi,
   line37_income :: line Centi,
   line38_rate :: line Rational,
   line39_fraction :: line Centi,
   line40_lesser :: line Centi,
   line41_difference :: line Centi}

data Donations line = Donations {
   line47_base :: line Centi,
   line47_fraction :: line Centi,
   line48_base :: line Centi,
   line48_fraction :: line Centi,
   line49_sum :: line Centi,
   line49_cont :: line Centi}

data Page2PartC line = Page2PartC {
   line51_tax :: line Centi,
   line52_credits :: line Centi,
   line53 :: line Centi,
   line54 :: line Centi,
   line55 :: line Centi,
   line56 :: line Centi,
   line57 :: line Centi,
   line58 :: line Centi,
   line59_copy :: line Centi,
   line59_product :: line Centi,
   line60_lesser :: line Centi,
   line61 :: line Centi}

data Page3 line = Page3 {
   line62 :: line Centi,
   line63 :: line Centi,
   line64 :: line Centi,
   line65 :: line Centi,
   line66_copy :: line Centi,
   line66_surtax :: line Centi,
   line67_copy :: line Centi,
   line67_surtax :: line Centi,
   line68_cont :: line Centi,
   line68_sum :: line Centi,
   line69 :: line Centi,
   line70 :: line Centi,
   line71 :: line Centi,
   line72 :: line Centi,
   line73 :: line Centi,
   line74_basicReduction :: line Centi,
   line75_amount :: line Centi,
   line75_childrenNum :: line Word,
   line76_amount :: line Centi,
   line76_childrenNum :: line Word,
   line77 :: line Centi,
   line78_copy :: line Centi,
   line78_product :: line Centi,
   line79 :: line Centi,
   line80_cont :: line Centi,
   line80_difference :: line Centi,
   line81 :: line Centi,
   line82 :: line Centi,
   line83 :: line Centi}

data Page4 line = Page4 {
   line84 :: line Centi,
   line85_lift :: line Centi,
   line86 :: line Centi,
   line87_foodDonations :: line Centi,
   line87_fraction :: line Centi,
   line88 :: line Centi,
   line89_health :: line Centi,
   line90 :: line Centi,
   healthPremium :: HealthPremium line}

data HealthPremium line = HealthPremium {
   row1 :: HealthPremiumBracket line,
   row2 :: HealthPremiumBracket line,
   row3 :: HealthPremiumBracket line,
   row4 :: HealthPremiumBracket line,
   row5 :: HealthPremiumBracket line}

data HealthPremiumBracket line = HealthPremiumBracket {
   taxableIncome :: line Centi,
   overThreshold :: line Centi,
   timesRate :: line Centi,
   equalsTax :: line Centi}

$(foldMap
   (\t-> [d|
           deriving instance (Show (line Centi), Show (line Rational), Show (line Word))
                          => Show ($(TH.conT t) line)
           deriving instance (Eq (line Centi), Eq (line Rational), Eq (line Word))
                          => Eq ($(TH.conT t) line)
    |])
   [''ON428, ''Page1, ''Page2, ''Page3, ''Page4,
    ''Page1PartA, ''Page1PartB, ''Page2PartB, ''Page2PartC,
    ''MedicalExpenses, ''Donations,
    ''TaxIncomeBracket, ''HealthPremium, ''HealthPremiumBracket])

$(foldMap Rank2.TH.deriveAll
   [''ON428, ''Page1, ''Page2, ''Page3, ''Page4,
    ''Page1PartA, ''Page1PartB, ''Page2PartB, ''Page2PartC,
    ''MedicalExpenses, ''Donations,
    ''TaxIncomeBracket, ''HealthPremium, ''HealthPremiumBracket])