{-# LANGUAGE ImportQualifiedPost #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE GADTs #-}
{-# LANGUAGE NamedFieldPuns #-}
{-# LANGUAGE NumericUnderscores #-}
{-# 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
page4 :: forall (line :: * -> *). ON428 line -> Page4 line
page3 :: forall (line :: * -> *). ON428 line -> Page3 line
page2 :: forall (line :: * -> *). ON428 line -> Page2 line
page1 :: forall (line :: * -> *). ON428 line -> Page1 line
..}-> ON428{page1 :: Page1 Maybe
page1 = Page1 Maybe -> Page1 Maybe
fixPage1 Page1 Maybe
page1,
                                            page2 :: Page2 Maybe
page2 = ON428 Maybe -> Page2 Maybe -> Page2 Maybe
fixPage2 ON428 Maybe
on428 Page2 Maybe
page2,
                                            page3 :: Page3 Maybe
page3 = ON428 Maybe -> Page3 Maybe -> Page3 Maybe
fixPage3 ON428 Maybe
on428 Page3 Maybe
page3,
                                            page4 :: 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
partB :: forall (line :: * -> *). Page1 line -> Page1PartB line
partA :: forall (line :: * -> *). Page1 line -> Page1PartA line
line1 :: forall (line :: * -> *). Page1 line -> line Centi
..}-> Page1{
   line1 :: Maybe Centi
line1 = Maybe Centi
line1,
   partA :: Page1PartA Maybe
partA = Maybe Centi -> Page1PartA Maybe -> Page1PartA Maybe
fixPage1PartA Maybe Centi
line1 Page1PartA Maybe
partA,
   partB :: 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
column5 :: forall (line :: * -> *). Page1PartA line -> TaxIncomeBracket line
column4 :: forall (line :: * -> *). Page1PartA line -> TaxIncomeBracket line
column3 :: forall (line :: * -> *). Page1PartA line -> TaxIncomeBracket line
column2 :: forall (line :: * -> *). Page1PartA line -> TaxIncomeBracket line
column1 :: forall (line :: * -> *). Page1PartA line -> TaxIncomeBracket line
..}-> Page1PartA{
   column1 :: 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,
   column2 :: 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,
   column3 :: 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,
   column4 :: 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,
   column5 :: 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
line25 :: forall (line :: * -> *). Page1PartB line -> line Centi
line24_sum :: forall (line :: * -> *). Page1PartB line -> SubCalculation line
line23_adoption :: forall (line :: * -> *). Page1PartB line -> line Centi
line22_employmentInsurance :: forall (line :: * -> *). Page1PartB line -> line Centi
line21_employmentInsurance :: forall (line :: * -> *). Page1PartB line -> line Centi
line20_cppQpp :: forall (line :: * -> *). Page1PartB line -> line Centi
line19_cppQpp :: forall (line :: * -> *). Page1PartB line -> line Centi
line18 :: forall (line :: * -> *). Page1PartB line -> line Centi
line17_caregiver :: forall (line :: * -> *). Page1PartB line -> line Centi
dependantAmount :: forall (line :: * -> *). Page1PartB line -> BaseCredit line
spouseAmount :: forall (line :: * -> *). Page1PartB line -> BaseCredit line
line10_age :: forall (line :: * -> *). Page1PartB line -> line Centi
line9_basic :: forall (line :: * -> *). Page1PartB line -> line Centi
..}-> Page1PartB Maybe
part{
   line9_basic = Just 12_399,
   spouseAmount = fixBaseCredit spouseAmount,
   dependantAmount = fixBaseCredit dependantAmount,
   line18 = totalOf [line9_basic, line10_age, spouseAmount.cont, dependantAmount.cont, line17_caregiver],
   line24_sum = fixSubCalculation id $
                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
partC :: forall (line :: * -> *). Page2 line -> Page2PartC line
partB :: forall (line :: * -> *). Page2 line -> Page2PartB line
..}-> Page2{
  partB :: Page2PartB Maybe
partB = ON428 Maybe -> Page2PartB Maybe -> Page2PartB Maybe
fixPage2PartB ON428 Maybe
on428 Page2PartB Maybe
partB,
  partC :: 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
line50 :: forall (line :: * -> *). Page2PartB line -> line Centi
donations :: forall (line :: * -> *). Page2PartB line -> Donations line
line46_fraction :: forall (line :: * -> *). Page2PartB line -> line Centi
line45_rate :: forall (line :: * -> *). Page2PartB line -> line Rational
line44 :: forall (line :: * -> *). Page2PartB line -> line Centi
line43_sum :: forall (line :: * -> *). Page2PartB line -> SubCalculation line
line42 :: forall (line :: * -> *). Page2PartB line -> line Centi
medicalExpenses :: forall (line :: * -> *). Page2PartB line -> MedicalExpenses line
line35 :: forall (line :: * -> *). Page2PartB line -> line Centi
line34_transferred :: forall (line :: * -> *). Page2PartB line -> line Centi
line33_education :: forall (line :: * -> *). Page2PartB line -> line Centi
line32_interest :: forall (line :: * -> *). Page2PartB line -> line Centi
line31 :: forall (line :: * -> *). Page2PartB line -> line Centi
line30 :: forall (line :: * -> *). Page2PartB line -> line Centi
line29_disability :: forall (line :: * -> *). Page2PartB line -> line Centi
line28 :: forall (line :: * -> *). Page2PartB line -> line Centi
line27_pension :: forall (line :: * -> *). Page2PartB line -> line Centi
line26 :: 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 2806 medicalExpenses,
   line43_sum = fixSubCalculation id $ 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
line61 :: forall (line :: * -> *). Page2PartC line -> line Centi
line60_lesser :: forall (line :: * -> *). Page2PartC line -> line Centi
line59_product :: forall (line :: * -> *). Page2PartC line -> line Centi
line59_copy :: forall (line :: * -> *). Page2PartC line -> line Centi
line58 :: forall (line :: * -> *). Page2PartC line -> line Centi
line57 :: forall (line :: * -> *). Page2PartC line -> line Centi
line56 :: forall (line :: * -> *). Page2PartC line -> line Centi
line55 :: forall (line :: * -> *). Page2PartC line -> line Centi
line54 :: forall (line :: * -> *). Page2PartC line -> line Centi
line53 :: forall (line :: * -> *). Page2PartC line -> line Centi
line52_credits :: forall (line :: * -> *). Page2PartC line -> line Centi
line51_tax :: 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
line49_sum :: forall (line :: * -> *). Donations line -> SubCalculation line
line48_fraction :: forall (line :: * -> *). Donations line -> line Centi
line48_base :: forall (line :: * -> *). Donations line -> line Centi
line47_fraction :: forall (line :: * -> *). Donations line -> line Centi
line47_base :: forall (line :: * -> *). Donations line -> line Centi
..} -> Donations Maybe
part{
   line47_fraction = Just 0.0505 `fractionOf` line47_base,
   line48_fraction = Just 0.1116 `fractionOf` line48_base,
   line49_sum = fixSubCalculation id $ 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_surtax :: SubCalculation Maybe
line67_surtax :: SubCalculation Maybe
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_double :: SubCalculation Maybe
line79 :: Maybe Centi
line80_difference :: SubCalculation Maybe
line81 :: Maybe Centi
line82 :: Maybe Centi
line83 :: Maybe Centi
line83 :: forall (line :: * -> *). Page3 line -> line Centi
line82 :: forall (line :: * -> *). Page3 line -> line Centi
line81 :: forall (line :: * -> *). Page3 line -> line Centi
line80_difference :: forall (line :: * -> *). Page3 line -> SubCalculation line
line79 :: forall (line :: * -> *). Page3 line -> line Centi
line78_double :: forall (line :: * -> *). Page3 line -> SubCalculation line
line77 :: forall (line :: * -> *). Page3 line -> line Centi
line76_childrenNum :: forall (line :: * -> *). Page3 line -> line Word
line76_amount :: forall (line :: * -> *). Page3 line -> line Centi
line75_childrenNum :: forall (line :: * -> *). Page3 line -> line Word
line75_amount :: forall (line :: * -> *). Page3 line -> line Centi
line74_basicReduction :: forall (line :: * -> *). Page3 line -> line Centi
line73 :: forall (line :: * -> *). Page3 line -> line Centi
line72 :: forall (line :: * -> *). Page3 line -> line Centi
line71 :: forall (line :: * -> *). Page3 line -> line Centi
line70 :: forall (line :: * -> *). Page3 line -> line Centi
line69 :: forall (line :: * -> *). Page3 line -> line Centi
line68_sum :: forall (line :: * -> *). Page3 line -> SubCalculation line
line67_surtax :: forall (line :: * -> *). Page3 line -> SubCalculation line
line66_surtax :: forall (line :: * -> *). Page3 line -> SubCalculation line
line65 :: forall (line :: * -> *). Page3 line -> line Centi
line64 :: forall (line :: * -> *). Page3 line -> line Centi
line63 :: forall (line :: * -> *). Page3 line -> line Centi
line62 :: 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_surtax = fixSubCalculation (\Rational
x-> Rational
0.2 Rational -> Rational -> Rational
forall a. Num a => a -> a -> a
* Rational -> Rational -> Rational
forall a. Ord a => a -> a -> a
max Rational
0 (Rational
x Rational -> Rational -> Rational
forall a. Num a => a -> a -> a
- Rational
5554)) line65,
   line67_surtax = fixSubCalculation (\Rational
x-> Rational
0.36 Rational -> Rational -> Rational
forall a. Num a => a -> a -> a
* Rational -> Rational -> Rational
forall a. Ord a => a -> a -> a
max Rational
0 (Rational
x Rational -> Rational -> Rational
forall a. Num a => a -> a -> a
- Rational
7108)) line65,
   line68_sum = fixSubCalculation id $ totalOf [line66_surtax.result, line67_surtax.result],
   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_double = fixSubCalculation (2 *) line77,
   line79 = line73,
   line80_difference = fixSubCalculation id $ nonNegativeDifference line78_double.result 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
healthPremium :: forall (line :: * -> *). Page4 line -> HealthPremium line
line90 :: forall (line :: * -> *). Page4 line -> line Centi
line89_health :: forall (line :: * -> *). Page4 line -> line Centi
line88 :: forall (line :: * -> *). Page4 line -> line Centi
line87_fraction :: forall (line :: * -> *). Page4 line -> line Centi
line87_foodDonations :: forall (line :: * -> *). Page4 line -> line Centi
line86 :: forall (line :: * -> *). Page4 line -> line Centi
line85_lift :: forall (line :: * -> *). Page4 line -> line Centi
line84 :: forall (line :: * -> *). Page4 line -> line Centi
..}-> 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
row5 :: forall (line :: * -> *).
HealthPremium line -> HealthPremiumBracket line
row4 :: forall (line :: * -> *).
HealthPremium line -> HealthPremiumBracket line
row3 :: forall (line :: * -> *).
HealthPremium line -> HealthPremiumBracket line
row2 :: forall (line :: * -> *).
HealthPremium line -> HealthPremiumBracket line
row1 :: forall (line :: * -> *).
HealthPremium line -> HealthPremiumBracket line
..}-> HealthPremium{
   row1 :: 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,
   row2 :: 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,
   row3 :: 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,
   row4 :: 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,
   row5 :: 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
equalsTax :: forall (line :: * -> *). HealthPremiumBracket line -> line Centi
timesRate :: forall (line :: * -> *). HealthPremiumBracket line -> line Centi
overThreshold :: forall (line :: * -> *). HealthPremiumBracket line -> line Centi
taxableIncome :: 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{
       taxableIncome :: Maybe Centi
taxableIncome = Centi -> Maybe Centi
forall a. a -> Maybe a
Just Centi
income,
       overThreshold :: 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,
       timesRate :: Maybe Centi
timesRate = Rational -> Maybe Rational
forall a. a -> Maybe a
Just Rational
rate Maybe Rational -> Maybe Centi -> Maybe Centi
`fractionOf` Maybe Centi
overThreshold,
       equalsTax :: Maybe Centi
equalsTax = [Maybe Centi] -> Maybe Centi
forall (f :: * -> *) a.
(Foldable f, Num a) =>
f (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