{-# LANGUAGE ImportQualifiedPost #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE GADTs #-}
{-# LANGUAGE NamedFieldPuns #-}
{-# LANGUAGE OverloadedRecordDot #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE RecordWildCards #-}

module Tax.Canada.Province.ON.ON428.Fix (ON428, fixON428) where

import Control.Applicative (liftA2)
import Control.Monad (guard, mfilter)
import Data.Fixed (Centi)
import Rank2 qualified

import Tax.Canada.Province.ON.ON428.Types
import Tax.Canada.Shared (fixBaseCredit, fixMedicalExpenses, fixSubCalculation, fixTaxIncomeBracket,
                          BaseCredit(cont), MedicalExpenses (difference),
                          SubCalculation (result), TaxIncomeBracket (equalsTax))
import Tax.Util (fixEq, fractionOf, nonNegativeDifference, totalOf)

fixON428 :: ON428 Maybe -> ON428 Maybe
fixON428 :: ON428 Maybe -> ON428 Maybe
fixON428 = (ON428 Maybe -> ON428 Maybe) -> ON428 Maybe -> ON428 Maybe
forall a. Eq a => (a -> a) -> a -> a
fixEq ((ON428 Maybe -> ON428 Maybe) -> ON428 Maybe -> ON428 Maybe)
-> (ON428 Maybe -> ON428 Maybe) -> ON428 Maybe -> ON428 Maybe
forall a b. (a -> b) -> a -> b
$ \on428 :: ON428 Maybe
on428@ON428{Page4 Maybe
Page3 Maybe
Page2 Maybe
Page1 Maybe
page1 :: Page1 Maybe
page2 :: Page2 Maybe
page3 :: Page3 Maybe
page4 :: Page4 Maybe
$sel:page1:ON428 :: forall (line :: * -> *). ON428 line -> Page1 line
$sel:page2:ON428 :: forall (line :: * -> *). ON428 line -> Page2 line
$sel:page3:ON428 :: forall (line :: * -> *). ON428 line -> Page3 line
$sel:page4:ON428 :: forall (line :: * -> *). ON428 line -> Page4 line
..}-> ON428{$sel:page1:ON428 :: Page1 Maybe
page1 = Page1 Maybe -> Page1 Maybe
fixPage1 Page1 Maybe
page1,
                                            $sel:page2:ON428 :: Page2 Maybe
page2 = ON428 Maybe -> Page2 Maybe -> Page2 Maybe
fixPage2 ON428 Maybe
on428 Page2 Maybe
page2,
                                            $sel:page3:ON428 :: Page3 Maybe
page3 = ON428 Maybe -> Page3 Maybe -> Page3 Maybe
fixPage3 ON428 Maybe
on428 Page3 Maybe
page3,
                                            $sel:page4:ON428 :: Page4 Maybe
page4 = ON428 Maybe -> Page4 Maybe -> Page4 Maybe
fixPage4 ON428 Maybe
on428 Page4 Maybe
page4}

fixPage1 :: Page1 Maybe -> Page1 Maybe
fixPage1 :: Page1 Maybe -> Page1 Maybe
fixPage1 = (Page1 Maybe -> Page1 Maybe) -> Page1 Maybe -> Page1 Maybe
forall a. Eq a => (a -> a) -> a -> a
fixEq ((Page1 Maybe -> Page1 Maybe) -> Page1 Maybe -> Page1 Maybe)
-> (Page1 Maybe -> Page1 Maybe) -> Page1 Maybe -> Page1 Maybe
forall a b. (a -> b) -> a -> b
$ \Page1{Maybe Centi
Page1PartB Maybe
Page1PartA Maybe
line1 :: Maybe Centi
partA :: Page1PartA Maybe
partB :: Page1PartB Maybe
$sel:line1:Page1 :: forall (line :: * -> *). Page1 line -> line Centi
$sel:partA:Page1 :: forall (line :: * -> *). Page1 line -> Page1PartA line
$sel:partB:Page1 :: forall (line :: * -> *). Page1 line -> Page1PartB line
..}-> Page1{
   $sel:line1:Page1 :: Maybe Centi
line1 = Maybe Centi
line1,
   $sel:partA:Page1 :: Page1PartA Maybe
partA = Maybe Centi -> Page1PartA Maybe -> Page1PartA Maybe
fixPage1PartA Maybe Centi
line1 Page1PartA Maybe
partA,
   $sel:partB:Page1 :: Page1PartB Maybe
partB = Page1PartB Maybe -> Page1PartB Maybe
fixPage1PartB Page1PartB Maybe
partB}

fixPage1PartA :: Maybe Centi -> Page1PartA Maybe -> Page1PartA Maybe
fixPage1PartA :: Maybe Centi -> Page1PartA Maybe -> Page1PartA Maybe
fixPage1PartA Maybe Centi
income = (Page1PartA Maybe -> Page1PartA Maybe)
-> Page1PartA Maybe -> Page1PartA Maybe
forall a. Eq a => (a -> a) -> a -> a
fixEq ((Page1PartA Maybe -> Page1PartA Maybe)
 -> Page1PartA Maybe -> Page1PartA Maybe)
-> (Page1PartA Maybe -> Page1PartA Maybe)
-> Page1PartA Maybe
-> Page1PartA Maybe
forall a b. (a -> b) -> a -> b
$ \Page1PartA{TaxIncomeBracket Maybe
column1 :: TaxIncomeBracket Maybe
column2 :: TaxIncomeBracket Maybe
column3 :: TaxIncomeBracket Maybe
column4 :: TaxIncomeBracket Maybe
column5 :: TaxIncomeBracket Maybe
$sel:column1:Page1PartA :: forall (line :: * -> *). Page1PartA line -> TaxIncomeBracket line
$sel:column2:Page1PartA :: forall (line :: * -> *). Page1PartA line -> TaxIncomeBracket line
$sel:column3:Page1PartA :: forall (line :: * -> *). Page1PartA line -> TaxIncomeBracket line
$sel:column4:Page1PartA :: forall (line :: * -> *). Page1PartA line -> TaxIncomeBracket line
$sel:column5:Page1PartA :: forall (line :: * -> *). Page1PartA line -> TaxIncomeBracket line
..}-> Page1PartA{
   $sel:column1:Page1PartA :: TaxIncomeBracket Maybe
column1 = Maybe Centi
-> Maybe (TaxIncomeBracket Maybe)
-> TaxIncomeBracket Maybe
-> TaxIncomeBracket Maybe
fixTaxIncomeBracket Maybe Centi
income (TaxIncomeBracket Maybe -> Maybe (TaxIncomeBracket Maybe)
forall a. a -> Maybe a
Just TaxIncomeBracket Maybe
column2) TaxIncomeBracket Maybe
column1,
   $sel:column2:Page1PartA :: TaxIncomeBracket Maybe
column2 = Maybe Centi
-> Maybe (TaxIncomeBracket Maybe)
-> TaxIncomeBracket Maybe
-> TaxIncomeBracket Maybe
fixTaxIncomeBracket Maybe Centi
income (TaxIncomeBracket Maybe -> Maybe (TaxIncomeBracket Maybe)
forall a. a -> Maybe a
Just TaxIncomeBracket Maybe
column3) TaxIncomeBracket Maybe
column2,
   $sel:column3:Page1PartA :: TaxIncomeBracket Maybe
column3 = Maybe Centi
-> Maybe (TaxIncomeBracket Maybe)
-> TaxIncomeBracket Maybe
-> TaxIncomeBracket Maybe
fixTaxIncomeBracket Maybe Centi
income (TaxIncomeBracket Maybe -> Maybe (TaxIncomeBracket Maybe)
forall a. a -> Maybe a
Just TaxIncomeBracket Maybe
column4) TaxIncomeBracket Maybe
column3,
   $sel:column4:Page1PartA :: TaxIncomeBracket Maybe
column4 = Maybe Centi
-> Maybe (TaxIncomeBracket Maybe)
-> TaxIncomeBracket Maybe
-> TaxIncomeBracket Maybe
fixTaxIncomeBracket Maybe Centi
income (TaxIncomeBracket Maybe -> Maybe (TaxIncomeBracket Maybe)
forall a. a -> Maybe a
Just TaxIncomeBracket Maybe
column5) TaxIncomeBracket Maybe
column4,
   $sel:column5:Page1PartA :: TaxIncomeBracket Maybe
column5 = Maybe Centi
-> Maybe (TaxIncomeBracket Maybe)
-> TaxIncomeBracket Maybe
-> TaxIncomeBracket Maybe
fixTaxIncomeBracket Maybe Centi
income Maybe (TaxIncomeBracket Maybe)
forall a. Maybe a
Nothing TaxIncomeBracket Maybe
column5}

fixPage1PartB :: Page1PartB Maybe -> Page1PartB Maybe
fixPage1PartB :: Page1PartB Maybe -> Page1PartB Maybe
fixPage1PartB = (Page1PartB Maybe -> Page1PartB Maybe)
-> Page1PartB Maybe -> Page1PartB Maybe
forall a. Eq a => (a -> a) -> a -> a
fixEq ((Page1PartB Maybe -> Page1PartB Maybe)
 -> Page1PartB Maybe -> Page1PartB Maybe)
-> (Page1PartB Maybe -> Page1PartB Maybe)
-> Page1PartB Maybe
-> Page1PartB Maybe
forall a b. (a -> b) -> a -> b
$ \part :: Page1PartB Maybe
part@Page1PartB{Maybe Centi
SubCalculation Maybe
BaseCredit Maybe
line9_basic :: Maybe Centi
line10_age :: Maybe Centi
spouseAmount :: BaseCredit Maybe
dependantAmount :: BaseCredit Maybe
line17_caregiver :: Maybe Centi
line18 :: Maybe Centi
line19_cppQpp :: Maybe Centi
line20_cppQpp :: Maybe Centi
line21_employmentInsurance :: Maybe Centi
line22_employmentInsurance :: Maybe Centi
line23_adoption :: Maybe Centi
line24_sum :: SubCalculation Maybe
line25 :: Maybe Centi
$sel:line9_basic:Page1PartB :: forall (line :: * -> *). Page1PartB line -> line Centi
$sel:line10_age:Page1PartB :: forall (line :: * -> *). Page1PartB line -> line Centi
$sel:spouseAmount:Page1PartB :: forall (line :: * -> *). Page1PartB line -> BaseCredit line
$sel:dependantAmount:Page1PartB :: forall (line :: * -> *). Page1PartB line -> BaseCredit line
$sel:line17_caregiver:Page1PartB :: forall (line :: * -> *). Page1PartB line -> line Centi
$sel:line18:Page1PartB :: forall (line :: * -> *). Page1PartB line -> line Centi
$sel:line19_cppQpp:Page1PartB :: forall (line :: * -> *). Page1PartB line -> line Centi
$sel:line20_cppQpp:Page1PartB :: forall (line :: * -> *). Page1PartB line -> line Centi
$sel:line21_employmentInsurance:Page1PartB :: forall (line :: * -> *). Page1PartB line -> line Centi
$sel:line22_employmentInsurance:Page1PartB :: forall (line :: * -> *). Page1PartB line -> line Centi
$sel:line23_adoption:Page1PartB :: forall (line :: * -> *). Page1PartB line -> line Centi
$sel:line24_sum:Page1PartB :: forall (line :: * -> *). Page1PartB line -> SubCalculation line
$sel:line25:Page1PartB :: forall (line :: * -> *). Page1PartB line -> line Centi
..}-> Page1PartB Maybe
part{
   line9_basic = Just 11865,
   spouseAmount = fixBaseCredit spouseAmount,
   dependantAmount = fixBaseCredit dependantAmount,
   line18 = totalOf [line9_basic, line10_age, spouseAmount.cont, dependantAmount.cont, line17_caregiver],
   line24_sum = fixSubCalculation $
                totalOf [line19_cppQpp,
                         line20_cppQpp,
                         line21_employmentInsurance,
                         line22_employmentInsurance,
                         line23_adoption],
   line25 = totalOf [line18, line24_sum.result]}

fixPage2 :: ON428 Maybe -> Page2 Maybe -> Page2 Maybe
fixPage2 :: ON428 Maybe -> Page2 Maybe -> Page2 Maybe
fixPage2 ON428 Maybe
on428 = (Page2 Maybe -> Page2 Maybe) -> Page2 Maybe -> Page2 Maybe
forall a. Eq a => (a -> a) -> a -> a
fixEq ((Page2 Maybe -> Page2 Maybe) -> Page2 Maybe -> Page2 Maybe)
-> (Page2 Maybe -> Page2 Maybe) -> Page2 Maybe -> Page2 Maybe
forall a b. (a -> b) -> a -> b
$ \Page2{Page2PartC Maybe
Page2PartB Maybe
partB :: Page2PartB Maybe
partC :: Page2PartC Maybe
$sel:partB:Page2 :: forall (line :: * -> *). Page2 line -> Page2PartB line
$sel:partC:Page2 :: forall (line :: * -> *). Page2 line -> Page2PartC line
..}-> Page2{
  $sel:partB:Page2 :: Page2PartB Maybe
partB = ON428 Maybe -> Page2PartB Maybe -> Page2PartB Maybe
fixPage2PartB ON428 Maybe
on428 Page2PartB Maybe
partB,
  $sel:partC:Page2 :: Page2PartC Maybe
partC = ON428 Maybe -> Page2PartC Maybe -> Page2PartC Maybe
fixPage2PartC ON428 Maybe
on428 Page2PartC Maybe
partC}

fixPage2PartB :: ON428 Maybe -> Page2PartB Maybe -> Page2PartB Maybe
fixPage2PartB :: ON428 Maybe -> Page2PartB Maybe -> Page2PartB Maybe
fixPage2PartB ON428 Maybe
on428 = (Page2PartB Maybe -> Page2PartB Maybe)
-> Page2PartB Maybe -> Page2PartB Maybe
forall a. Eq a => (a -> a) -> a -> a
fixEq ((Page2PartB Maybe -> Page2PartB Maybe)
 -> Page2PartB Maybe -> Page2PartB Maybe)
-> (Page2PartB Maybe -> Page2PartB Maybe)
-> Page2PartB Maybe
-> Page2PartB Maybe
forall a b. (a -> b) -> a -> b
$ \part :: Page2PartB Maybe
part@Page2PartB{Maybe Rational
Maybe Centi
SubCalculation Maybe
MedicalExpenses Maybe
Donations Maybe
line26 :: Maybe Centi
line27_pension :: Maybe Centi
line28 :: Maybe Centi
line29_disability :: Maybe Centi
line30 :: Maybe Centi
line31 :: Maybe Centi
line32_interest :: Maybe Centi
line33_education :: Maybe Centi
line34_transferred :: Maybe Centi
line35 :: Maybe Centi
medicalExpenses :: MedicalExpenses Maybe
line42 :: Maybe Centi
line43_sum :: SubCalculation Maybe
line44 :: Maybe Centi
line45_rate :: Maybe Rational
line46_fraction :: Maybe Centi
donations :: Donations Maybe
line50 :: Maybe Centi
$sel:line26:Page2PartB :: forall (line :: * -> *). Page2PartB line -> line Centi
$sel:line27_pension:Page2PartB :: forall (line :: * -> *). Page2PartB line -> line Centi
$sel:line28:Page2PartB :: forall (line :: * -> *). Page2PartB line -> line Centi
$sel:line29_disability:Page2PartB :: forall (line :: * -> *). Page2PartB line -> line Centi
$sel:line30:Page2PartB :: forall (line :: * -> *). Page2PartB line -> line Centi
$sel:line31:Page2PartB :: forall (line :: * -> *). Page2PartB line -> line Centi
$sel:line32_interest:Page2PartB :: forall (line :: * -> *). Page2PartB line -> line Centi
$sel:line33_education:Page2PartB :: forall (line :: * -> *). Page2PartB line -> line Centi
$sel:line34_transferred:Page2PartB :: forall (line :: * -> *). Page2PartB line -> line Centi
$sel:line35:Page2PartB :: forall (line :: * -> *). Page2PartB line -> line Centi
$sel:medicalExpenses:Page2PartB :: forall (line :: * -> *). Page2PartB line -> MedicalExpenses line
$sel:line42:Page2PartB :: forall (line :: * -> *). Page2PartB line -> line Centi
$sel:line43_sum:Page2PartB :: forall (line :: * -> *). Page2PartB line -> SubCalculation line
$sel:line44:Page2PartB :: forall (line :: * -> *). Page2PartB line -> line Centi
$sel:line45_rate:Page2PartB :: forall (line :: * -> *). Page2PartB line -> line Rational
$sel:line46_fraction:Page2PartB :: forall (line :: * -> *). Page2PartB line -> line Centi
$sel:donations:Page2PartB :: forall (line :: * -> *). Page2PartB line -> Donations line
$sel:line50:Page2PartB :: forall (line :: * -> *). Page2PartB line -> line Centi
..}-> Page2PartB Maybe
part{
   line26 = on428.page1.partB.line25,
   line28 = totalOf [line26, line27_pension],
   line31 = totalOf [line28, line29_disability, line30],
   line35 = totalOf [line31, line32_interest, line33_education, line34_transferred],
   medicalExpenses = fixMedicalExpenses 2685 medicalExpenses,
   line43_sum = fixSubCalculation $ totalOf [medicalExpenses.difference, line42],
   line44 = totalOf [line35, line43_sum.result],
   line46_fraction = line45_rate `fractionOf` line44,
   donations = fixDonations donations,
   line50 = totalOf [line46_fraction, donations.line49_sum.result]}

fixPage2PartC :: ON428 Maybe -> Page2PartC Maybe -> Page2PartC Maybe
fixPage2PartC :: ON428 Maybe -> Page2PartC Maybe -> Page2PartC Maybe
fixPage2PartC ON428 Maybe
on428 = (Page2PartC Maybe -> Page2PartC Maybe)
-> Page2PartC Maybe -> Page2PartC Maybe
forall a. Eq a => (a -> a) -> a -> a
fixEq ((Page2PartC Maybe -> Page2PartC Maybe)
 -> Page2PartC Maybe -> Page2PartC Maybe)
-> (Page2PartC Maybe -> Page2PartC Maybe)
-> Page2PartC Maybe
-> Page2PartC Maybe
forall a b. (a -> b) -> a -> b
$ \part :: Page2PartC Maybe
part@Page2PartC{Maybe Centi
line51_tax :: Maybe Centi
line52_credits :: Maybe Centi
line53 :: Maybe Centi
line54 :: Maybe Centi
line55 :: Maybe Centi
line56 :: Maybe Centi
line57 :: Maybe Centi
line58 :: Maybe Centi
line59_copy :: Maybe Centi
line59_product :: Maybe Centi
line60_lesser :: Maybe Centi
line61 :: Maybe Centi
$sel:line51_tax:Page2PartC :: forall (line :: * -> *). Page2PartC line -> line Centi
$sel:line52_credits:Page2PartC :: forall (line :: * -> *). Page2PartC line -> line Centi
$sel:line53:Page2PartC :: forall (line :: * -> *). Page2PartC line -> line Centi
$sel:line54:Page2PartC :: forall (line :: * -> *). Page2PartC line -> line Centi
$sel:line55:Page2PartC :: forall (line :: * -> *). Page2PartC line -> line Centi
$sel:line56:Page2PartC :: forall (line :: * -> *). Page2PartC line -> line Centi
$sel:line57:Page2PartC :: forall (line :: * -> *). Page2PartC line -> line Centi
$sel:line58:Page2PartC :: forall (line :: * -> *). Page2PartC line -> line Centi
$sel:line59_copy:Page2PartC :: forall (line :: * -> *). Page2PartC line -> line Centi
$sel:line59_product:Page2PartC :: forall (line :: * -> *). Page2PartC line -> line Centi
$sel:line60_lesser:Page2PartC :: forall (line :: * -> *). Page2PartC line -> line Centi
$sel:line61:Page2PartC :: forall (line :: * -> *). Page2PartC line -> line Centi
..}-> Page2PartC Maybe
part{
   line51_tax = totalOf [on428.page1.partA.column1.equalsTax,
                         on428.page1.partA.column2.equalsTax,
                         on428.page1.partA.column3.equalsTax,
                         on428.page1.partA.column4.equalsTax,
                         on428.page1.partA.column5.equalsTax],
   line52_credits = on428.page2.partB.line50,
   line53 = nonNegativeDifference line51_tax line52_credits,
   line55 = totalOf [line53, line54],
   line56 = line53,
   line58 = nonNegativeDifference line56 line57,
   line59_product = Just 0.3367 `fractionOf` line59_copy,
   line60_lesser = min <$> line58 <*> line59_product,
   line61 = nonNegativeDifference line55 line60_lesser}

fixDonations :: Donations Maybe -> Donations Maybe
fixDonations :: Donations Maybe -> Donations Maybe
fixDonations = (Donations Maybe -> Donations Maybe)
-> Donations Maybe -> Donations Maybe
forall a. Eq a => (a -> a) -> a -> a
fixEq ((Donations Maybe -> Donations Maybe)
 -> Donations Maybe -> Donations Maybe)
-> (Donations Maybe -> Donations Maybe)
-> Donations Maybe
-> Donations Maybe
forall a b. (a -> b) -> a -> b
$ \part :: Donations Maybe
part@Donations{Maybe Centi
SubCalculation Maybe
line47_base :: Maybe Centi
line47_fraction :: Maybe Centi
line48_base :: Maybe Centi
line48_fraction :: Maybe Centi
line49_sum :: SubCalculation Maybe
$sel:line47_base:Donations :: forall (line :: * -> *). Donations line -> line Centi
$sel:line47_fraction:Donations :: forall (line :: * -> *). Donations line -> line Centi
$sel:line48_base:Donations :: forall (line :: * -> *). Donations line -> line Centi
$sel:line48_fraction:Donations :: forall (line :: * -> *). Donations line -> line Centi
$sel:line49_sum:Donations :: forall (line :: * -> *). Donations line -> SubCalculation line
..} -> Donations Maybe
part{
   line47_fraction = Just 0.0505 `fractionOf` line47_base,
   line48_fraction = Just 0.1116 `fractionOf` line48_base,
   line49_sum = fixSubCalculation $ totalOf [line47_fraction, line48_fraction]}

fixPage3 :: ON428 Maybe -> Page3 Maybe -> Page3 Maybe
fixPage3 :: ON428 Maybe -> Page3 Maybe -> Page3 Maybe
fixPage3 ON428 Maybe
on428 = (Page3 Maybe -> Page3 Maybe) -> Page3 Maybe -> Page3 Maybe
forall a. Eq a => (a -> a) -> a -> a
fixEq ((Page3 Maybe -> Page3 Maybe) -> Page3 Maybe -> Page3 Maybe)
-> (Page3 Maybe -> Page3 Maybe) -> Page3 Maybe -> Page3 Maybe
forall a b. (a -> b) -> a -> b
$ \page :: Page3 Maybe
page@Page3{Maybe Word
Maybe Centi
SubCalculation Maybe
line62 :: Maybe Centi
line63 :: Maybe Centi
line64 :: Maybe Centi
line65 :: Maybe Centi
line66_copy :: Maybe Centi
line66_surtax :: Maybe Centi
line67_copy :: Maybe Centi
line67_surtax :: Maybe Centi
line68_sum :: SubCalculation Maybe
line69 :: Maybe Centi
line70 :: Maybe Centi
line71 :: Maybe Centi
line72 :: Maybe Centi
line73 :: Maybe Centi
line74_basicReduction :: Maybe Centi
line75_amount :: Maybe Centi
line75_childrenNum :: Maybe Word
line76_amount :: Maybe Centi
line76_childrenNum :: Maybe Word
line77 :: Maybe Centi
line78_copy :: Maybe Centi
line78_product :: Maybe Centi
line79 :: Maybe Centi
line80_difference :: SubCalculation Maybe
line81 :: Maybe Centi
line82 :: Maybe Centi
line83 :: Maybe Centi
$sel:line62:Page3 :: forall (line :: * -> *). Page3 line -> line Centi
$sel:line63:Page3 :: forall (line :: * -> *). Page3 line -> line Centi
$sel:line64:Page3 :: forall (line :: * -> *). Page3 line -> line Centi
$sel:line65:Page3 :: forall (line :: * -> *). Page3 line -> line Centi
$sel:line66_copy:Page3 :: forall (line :: * -> *). Page3 line -> line Centi
$sel:line66_surtax:Page3 :: forall (line :: * -> *). Page3 line -> line Centi
$sel:line67_copy:Page3 :: forall (line :: * -> *). Page3 line -> line Centi
$sel:line67_surtax:Page3 :: forall (line :: * -> *). Page3 line -> line Centi
$sel:line68_sum:Page3 :: forall (line :: * -> *). Page3 line -> SubCalculation line
$sel:line69:Page3 :: forall (line :: * -> *). Page3 line -> line Centi
$sel:line70:Page3 :: forall (line :: * -> *). Page3 line -> line Centi
$sel:line71:Page3 :: forall (line :: * -> *). Page3 line -> line Centi
$sel:line72:Page3 :: forall (line :: * -> *). Page3 line -> line Centi
$sel:line73:Page3 :: forall (line :: * -> *). Page3 line -> line Centi
$sel:line74_basicReduction:Page3 :: forall (line :: * -> *). Page3 line -> line Centi
$sel:line75_amount:Page3 :: forall (line :: * -> *). Page3 line -> line Centi
$sel:line75_childrenNum:Page3 :: forall (line :: * -> *). Page3 line -> line Word
$sel:line76_amount:Page3 :: forall (line :: * -> *). Page3 line -> line Centi
$sel:line76_childrenNum:Page3 :: forall (line :: * -> *). Page3 line -> line Word
$sel:line77:Page3 :: forall (line :: * -> *). Page3 line -> line Centi
$sel:line78_copy:Page3 :: forall (line :: * -> *). Page3 line -> line Centi
$sel:line78_product:Page3 :: forall (line :: * -> *). Page3 line -> line Centi
$sel:line79:Page3 :: forall (line :: * -> *). Page3 line -> line Centi
$sel:line80_difference:Page3 :: forall (line :: * -> *). Page3 line -> SubCalculation line
$sel:line81:Page3 :: forall (line :: * -> *). Page3 line -> line Centi
$sel:line82:Page3 :: forall (line :: * -> *). Page3 line -> line Centi
$sel:line83:Page3 :: forall (line :: * -> *). Page3 line -> line Centi
..}-> Page3 Maybe
page{
   line62 = on428.page2.partC.line61,
   line63 = line62,
   line64 = on428.page2.partC.line54,
   line65 = nonNegativeDifference line63 line64,
   line66_copy = line65,
   line66_surtax = Just 0.2 `fractionOf` nonNegativeDifference line66_copy (Just 5315),
   line67_copy = line65,
   line67_surtax = Just 0.36 `fractionOf` nonNegativeDifference line67_copy (Just 6802),
   line68_sum = fixSubCalculation $ totalOf [line66_surtax, line67_surtax],
   line69 = totalOf [line62, line68_sum.result],
   line70 = on428.page2.partC.line57,
   line71 = nonNegativeDifference line69 line70,
   line73 = totalOf [line71, line72],
   line75_amount = ((506 *) . fromIntegral) <$> line75_childrenNum,
   line76_amount = ((506 *) . fromIntegral) <$> line76_childrenNum,
   line77 = totalOf [line74_basicReduction, line75_amount, line76_amount],
   line78_copy = line77,
   line78_product = (2 *) <$> line78_copy,
   line79 = line73,
   line80_difference = fixSubCalculation $ nonNegativeDifference line78_product line79,
   line81 = nonNegativeDifference line73 line80_difference.result,
   line83 = nonNegativeDifference line81 line82}

fixPage4 :: ON428 Maybe -> Page4 Maybe -> Page4 Maybe
fixPage4 :: ON428 Maybe -> Page4 Maybe -> Page4 Maybe
fixPage4 ON428 Maybe
on428 = (Page4 Maybe -> Page4 Maybe) -> Page4 Maybe -> Page4 Maybe
forall a. Eq a => (a -> a) -> a -> a
fixEq ((Page4 Maybe -> Page4 Maybe) -> Page4 Maybe -> Page4 Maybe)
-> (Page4 Maybe -> Page4 Maybe) -> Page4 Maybe -> Page4 Maybe
forall a b. (a -> b) -> a -> b
$ \page :: Page4 Maybe
page@Page4{Maybe Centi
HealthPremium Maybe
line84 :: Maybe Centi
line85_lift :: Maybe Centi
line86 :: Maybe Centi
line87_foodDonations :: Maybe Centi
line87_fraction :: Maybe Centi
line88 :: Maybe Centi
line89_health :: Maybe Centi
line90 :: Maybe Centi
healthPremium :: HealthPremium Maybe
$sel:line84:Page4 :: forall (line :: * -> *). Page4 line -> line Centi
$sel:line85_lift:Page4 :: forall (line :: * -> *). Page4 line -> line Centi
$sel:line86:Page4 :: forall (line :: * -> *). Page4 line -> line Centi
$sel:line87_foodDonations:Page4 :: forall (line :: * -> *). Page4 line -> line Centi
$sel:line87_fraction:Page4 :: forall (line :: * -> *). Page4 line -> line Centi
$sel:line88:Page4 :: forall (line :: * -> *). Page4 line -> line Centi
$sel:line89_health:Page4 :: forall (line :: * -> *). Page4 line -> line Centi
$sel:line90:Page4 :: forall (line :: * -> *). Page4 line -> line Centi
$sel:healthPremium:Page4 :: forall (line :: * -> *). Page4 line -> HealthPremium line
..}-> Page4 Maybe
page{
   line84 = on428.page3.line83,
   line86 = nonNegativeDifference line84 line85_lift,
   line87_fraction = Just 0.25 `fractionOf` line87_foodDonations,
   line88 = nonNegativeDifference line86 line87_fraction,
   line89_health = totalOf [between 0 20000 0,
                            healthPremium.row1.equalsTax,
                            between 25000 36000 300,
                            healthPremium.row2.equalsTax,
                            between 38500 48000 450,
                            healthPremium.row3.equalsTax,
                            between 48600 72000 600,
                            healthPremium.row4.equalsTax,
                            between 72600 200000 750,
                            healthPremium.row5.equalsTax,
                            if income > 200600 then Just 900 else Nothing],
   line90 = totalOf [line88, line89_health],
   healthPremium = fixHealthPremium income healthPremium}
   where income :: Centi
income = Maybe Centi -> Centi
forall a. Num a => Maybe a -> a
forall (t :: * -> *) a. (Foldable t, Num a) => t a -> a
sum ON428 Maybe
on428.page1.line1
         between :: Centi -> Centi -> Centi -> Maybe Centi
between Centi
floor Centi
ceiling Centi
tax
            | Centi
income Centi -> Centi -> Bool
forall a. Ord a => a -> a -> Bool
> Centi
floor Bool -> Bool -> Bool
&& Centi
income Centi -> Centi -> Bool
forall a. Ord a => a -> a -> Bool
<= Centi
ceiling = Centi -> Maybe Centi
forall a. a -> Maybe a
Just Centi
tax
            | Bool
otherwise = Maybe Centi
forall a. Maybe a
Nothing

fixHealthPremium :: Centi -> HealthPremium Maybe -> HealthPremium Maybe
fixHealthPremium :: Centi -> HealthPremium Maybe -> HealthPremium Maybe
fixHealthPremium Centi
income = (HealthPremium Maybe -> HealthPremium Maybe)
-> HealthPremium Maybe -> HealthPremium Maybe
forall a. Eq a => (a -> a) -> a -> a
fixEq ((HealthPremium Maybe -> HealthPremium Maybe)
 -> HealthPremium Maybe -> HealthPremium Maybe)
-> (HealthPremium Maybe -> HealthPremium Maybe)
-> HealthPremium Maybe
-> HealthPremium Maybe
forall a b. (a -> b) -> a -> b
$ \HealthPremium{HealthPremiumBracket Maybe
row1 :: HealthPremiumBracket Maybe
row2 :: HealthPremiumBracket Maybe
row3 :: HealthPremiumBracket Maybe
row4 :: HealthPremiumBracket Maybe
row5 :: HealthPremiumBracket Maybe
$sel:row1:HealthPremium :: forall (line :: * -> *).
HealthPremium line -> HealthPremiumBracket line
$sel:row2:HealthPremium :: forall (line :: * -> *).
HealthPremium line -> HealthPremiumBracket line
$sel:row3:HealthPremium :: forall (line :: * -> *).
HealthPremium line -> HealthPremiumBracket line
$sel:row4:HealthPremium :: forall (line :: * -> *).
HealthPremium line -> HealthPremiumBracket line
$sel:row5:HealthPremium :: forall (line :: * -> *).
HealthPremium line -> HealthPremiumBracket line
..}-> HealthPremium{
   $sel:row1:HealthPremium :: HealthPremiumBracket Maybe
row1 = Centi
-> Centi
-> Centi
-> Rational
-> Centi
-> HealthPremiumBracket Maybe
-> HealthPremiumBracket Maybe
fixHealthPremiumBracket Centi
income Centi
20000 Centi
25000 Rational
0.06 Centi
0 HealthPremiumBracket Maybe
row1,
   $sel:row2:HealthPremium :: HealthPremiumBracket Maybe
row2 = Centi
-> Centi
-> Centi
-> Rational
-> Centi
-> HealthPremiumBracket Maybe
-> HealthPremiumBracket Maybe
fixHealthPremiumBracket Centi
income Centi
36000 Centi
38500 Rational
0.06 Centi
300 HealthPremiumBracket Maybe
row2,
   $sel:row3:HealthPremium :: HealthPremiumBracket Maybe
row3 = Centi
-> Centi
-> Centi
-> Rational
-> Centi
-> HealthPremiumBracket Maybe
-> HealthPremiumBracket Maybe
fixHealthPremiumBracket Centi
income Centi
48000 Centi
48600 Rational
0.25 Centi
450 HealthPremiumBracket Maybe
row3,
   $sel:row4:HealthPremium :: HealthPremiumBracket Maybe
row4 = Centi
-> Centi
-> Centi
-> Rational
-> Centi
-> HealthPremiumBracket Maybe
-> HealthPremiumBracket Maybe
fixHealthPremiumBracket Centi
income Centi
72000 Centi
72600 Rational
0.25 Centi
600 HealthPremiumBracket Maybe
row4,
   $sel:row5:HealthPremium :: HealthPremiumBracket Maybe
row5 = Centi
-> Centi
-> Centi
-> Rational
-> Centi
-> HealthPremiumBracket Maybe
-> HealthPremiumBracket Maybe
fixHealthPremiumBracket Centi
income Centi
200000 Centi
200600 Rational
0.25 Centi
750 HealthPremiumBracket Maybe
row5}

fixHealthPremiumBracket :: Centi -> Centi -> Centi -> Rational -> Centi
                        -> HealthPremiumBracket Maybe -> HealthPremiumBracket Maybe
fixHealthPremiumBracket :: Centi
-> Centi
-> Centi
-> Rational
-> Centi
-> HealthPremiumBracket Maybe
-> HealthPremiumBracket Maybe
fixHealthPremiumBracket Centi
income Centi
floor Centi
ceiling Rational
rate Centi
base HealthPremiumBracket{Maybe Centi
taxableIncome :: Maybe Centi
overThreshold :: Maybe Centi
timesRate :: Maybe Centi
equalsTax :: Maybe Centi
$sel:taxableIncome:HealthPremiumBracket :: forall (line :: * -> *). HealthPremiumBracket line -> line Centi
$sel:overThreshold:HealthPremiumBracket :: forall (line :: * -> *). HealthPremiumBracket line -> line Centi
$sel:timesRate:HealthPremiumBracket :: forall (line :: * -> *). HealthPremiumBracket line -> line Centi
$sel:equalsTax:HealthPremiumBracket :: forall (line :: * -> *). HealthPremiumBracket line -> line Centi
..}
   | Centi
income Centi -> Centi -> Bool
forall a. Ord a => a -> a -> Bool
> Centi
floor Bool -> Bool -> Bool
&& Centi
income Centi -> Centi -> Bool
forall a. Ord a => a -> a -> Bool
< Centi
ceiling = HealthPremiumBracket{
       $sel:taxableIncome:HealthPremiumBracket :: Maybe Centi
taxableIncome = Centi -> Maybe Centi
forall a. a -> Maybe a
Just Centi
income,
       $sel:overThreshold:HealthPremiumBracket :: Maybe Centi
overThreshold = Centi -> Maybe Centi
forall a. a -> Maybe a
Just (Centi -> Maybe Centi) -> Centi -> Maybe Centi
forall a b. (a -> b) -> a -> b
$ Centi
income Centi -> Centi -> Centi
forall a. Num a => a -> a -> a
- Centi
floor,
       $sel:timesRate:HealthPremiumBracket :: Maybe Centi
timesRate = Rational -> Maybe Rational
forall a. a -> Maybe a
Just Rational
rate Maybe Rational -> Maybe Centi -> Maybe Centi
`fractionOf` Maybe Centi
overThreshold,
       $sel:equalsTax:HealthPremiumBracket :: Maybe Centi
equalsTax = [Maybe Centi] -> Maybe Centi
forall a. Num a => [Maybe a] -> Maybe a
totalOf [Maybe Centi
timesRate, Centi -> Maybe Centi
forall a. a -> Maybe a
Just Centi
base]}
   | Bool
otherwise = (forall a. Maybe a) -> HealthPremiumBracket Maybe
forall {k} (g :: (k -> *) -> *) (f :: k -> *).
Applicative g =>
(forall (a :: k). f a) -> g f
forall (f :: * -> *). (forall a. f a) -> HealthPremiumBracket f
Rank2.pure Maybe a
forall a. Maybe a
Nothing