-- This file is part of hs-tax-ato
-- Copyright (C) 2022  Fraser Tweedale
--
-- hs-tax-ato is free software: you can redistribute it and/or modify
-- it under the terms of the GNU Affero General Public License as published by
-- the Free Software Foundation, either version 3 of the License, or
-- (at your option) any later version.
--
-- This program is distributed in the hope that it will be useful,
-- but WITHOUT ANY WARRANTY; without even the implied warranty of
-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-- GNU Affero General Public License for more details.
--
-- You should have received a copy of the GNU Affero General Public License
-- along with this program.  If not, see <http://www.gnu.org/licenses/>.

{-# LANGUAGE DataKinds #-}

-- | Tax tables for 2021–22 financial year.
module Data.Tax.ATO.FY.FY2022 (tables) where

import Control.Lens (review)

import Data.Tax
import Data.Tax.ATO.Common
import Data.Tax.ATO.PrivateHealthInsuranceRebate
import qualified Data.Tax.ATO.FY.FY2021 as FY2021

help :: (Fractional a, Ord a) => Tax (Money a) (Money a)
help :: forall a. (Fractional a, Ord a) => Tax (Money a) (Money a)
help = forall a.
(Fractional a, Ord a) =>
[(a, a)] -> Tax (Money a) (Money a)
thresholds'
  [ (a
47014, a
0.01)
  , (a
54283, a
0.01)
  , (a
57539, a
0.005)
  , (a
60992, a
0.005)
  , (a
64652, a
0.005)
  , (a
68530, a
0.005)
  , (a
72642, a
0.005)
  , (a
77002, a
0.005)
  , (a
81621, a
0.005)
  , (a
86519, a
0.005)
  , (a
91710, a
0.005)
  , (a
97213, a
0.005)
  , (a
103046, a
0.005)
  , (a
109228, a
0.005)
  , (a
115782, a
0.005)
  , (a
122729, a
0.005)
  , (a
130093, a
0.005)
  , (a
137898, a
0.005)
  ]

tables :: (Ord a, Fractional a) => TaxTables 2022 a
tables :: forall a. (Ord a, Fractional a) => TaxTables 2022 a
tables = forall {k} (y :: k) a.
Tax (Money a) (Money a)
-> Tax (Money a) (Money a)
-> Tax (Money a) (Money a)
-> Tax (Money a) (Money a)
-> Tax (Money a) (Money a)
-> Tax (Money a) (Money a)
-> PrivateHealthInsuranceRebateRates a
-> TaxTables y a
TaxTables
  forall a. (Fractional a, Ord a) => Tax (Money a) (Money a)
FY2021.individualIncomeTax
  (forall a.
(Fractional a, Ord a) =>
Money a -> Tax (Money a) (Money a)
medicareLevy (forall b (m :: * -> *) t. MonadReader b m => AReview t b -> m t
review forall a b. Iso (Money a) (Money b) a b
money a
23365))
  forall a. (Fractional a, Ord a) => Tax (Money a) (Money a)
medicareLevySurcharge
  forall a. (Fractional a, Ord a) => Tax (Money a) (Money a)
help
  forall a. (Fractional a, Ord a) => Tax (Money a) (Money a)
help
  (forall a. (Fractional a, Ord a) => Tax (Money a) (Money a)
lowIncomeTaxOffset2021 forall a. Semigroup a => a -> a -> a
<> forall a. (Fractional a, Ord a) => Tax (Money a) (Money a)
lmito2022)
  forall a. Fractional a => PrivateHealthInsuranceRebateRates a
privateHealthInsuranceRebateRates

-- https://www.health.gov.au/news/phi-circulars/phi-0422-private-health-insurance-rebate-adjustment-factor-effective-1-april-2022
privateHealthInsuranceRebateRates
  :: (Fractional a) => PrivateHealthInsuranceRebateRates a
privateHealthInsuranceRebateRates :: forall a. Fractional a => PrivateHealthInsuranceRebateRates a
privateHealthInsuranceRebateRates =
  [ ( a
90000, (a
0.24608, a
0.24608), (a
0.28710, a
0.28710), (a
0.32812, a
0.32812) )
  , (a
105000, (a
0.16405, a
0.16405), (a
0.20507, a
0.20507), (a
0.24608, a
0.24608) )
  , (a
140000, (a
0.08202, a
0.08202), (a
0.12303, a
0.12303), (a
0.16405, a
0.16405) )
  ]

-- | LMITO ceiling increased by $420 to $1500 in FY2022
lmito2022 :: (Fractional a, Ord a) => Tax (Money a) (Money a)
lmito2022 :: forall a. (Fractional a, Ord a) => Tax (Money a) (Money a)
lmito2022 = forall a b. Ord a => a -> Tax b a -> Tax b a
limit forall a. Monoid a => a
mempty forall a b. (a -> b) -> a -> b
$
  forall a b. Ord a => Tax b a -> Tax b a -> Tax b a
greaterOf (forall a b. a -> Tax b a
lump (forall b (m :: * -> *) t. MonadReader b m => AReview t b -> m t
review forall a b. Iso (Money a) (Money b) a b
money (-a
1500)))
    ( forall a b. a -> Tax b a
lump (forall b (m :: * -> *) t. MonadReader b m => AReview t b -> m t
review forall a b. Iso (Money a) (Money b) a b
money (-a
255))
    forall a. Semigroup a => a -> a -> a
<> forall a. (Num a, Ord a) => Money a -> a -> Tax (Money a) (Money a)
above (forall b (m :: * -> *) t. MonadReader b m => AReview t b -> m t
review forall a b. Iso (Money a) (Money b) a b
money a
37000) (-a
0.075) )
  forall a. Semigroup a => a -> a -> a
<> forall a. (Num a, Ord a) => Money a -> a -> Tax (Money a) (Money a)
above (forall b (m :: * -> *) t. MonadReader b m => AReview t b -> m t
review forall a b. Iso (Money a) (Money b) a b
money a
90000) a
0.03