{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE PolyKinds #-}
module Data.Tax.ATO.Common
(
TaxTables(..)
, HasIncome(..)
, medicareLevy
, medicareLevySurcharge
, lowIncomeTaxOffset
, lowIncomeTaxOffset2021
, lamito
, corporateTax
, thresholds'
, marginal'
) where
import Control.Lens (Getter, review, to, view)
import Data.Bifunctor (first)
import Data.Tax
import Data.Tax.ATO.PrivateHealthInsuranceRebate
data TaxTables y a = TaxTables
{ forall {k} (y :: k) a. TaxTables y a -> Tax (Money a) (Money a)
ttIndividualIncomeTax :: Tax (Money a) (Money a)
, forall {k} (y :: k) a. TaxTables y a -> Tax (Money a) (Money a)
ttMedicareLevy :: Tax (Money a) (Money a)
, forall {k} (y :: k) a. TaxTables y a -> Tax (Money a) (Money a)
ttMedicareLevySurcharge :: Tax (Money a) (Money a)
, forall {k} (y :: k) a. TaxTables y a -> Tax (Money a) (Money a)
ttHelp :: Tax (Money a) (Money a)
, forall {k} (y :: k) a. TaxTables y a -> Tax (Money a) (Money a)
ttSfss :: Tax (Money a) (Money a)
, forall {k} (y :: k) a. TaxTables y a -> Tax (Money a) (Money a)
ttAdditional :: Tax (Money a) (Money a)
, forall {k} (y :: k) a.
TaxTables y a -> PrivateHealthInsuranceRebateRates a
ttPHIRebateRates :: PrivateHealthInsuranceRebateRates a
}
medicareLevy :: (Fractional a, Ord a) => Money a -> Tax (Money a) (Money a)
medicareLevy :: forall a.
(Fractional a, Ord a) =>
Money a -> Tax (Money a) (Money a)
medicareLevy Money a
l = forall a b. Ord a => Tax b a -> Tax b a -> Tax b a
lesserOf (forall a. (Num a, Ord a) => Money a -> a -> Tax (Money a) (Money a)
above Money a
l a
0.1) (forall a. Num a => a -> Tax (Money a) (Money a)
flat a
0.02)
medicareLevySurcharge :: (Fractional a, Ord a) => Tax (Money a) (Money a)
medicareLevySurcharge :: forall a. (Fractional a, Ord a) => Tax (Money a) (Money a)
medicareLevySurcharge =
forall a. (Num a, Ord a) => Money a -> a -> Tax (Money a) (Money a)
threshold (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.01
forall a. Semigroup a => a -> a -> a
<> forall a. (Num a, Ord a) => Money a -> a -> Tax (Money a) (Money a)
threshold (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
105000) a
0.0025
forall a. Semigroup a => a -> a -> a
<> forall a. (Num a, Ord a) => Money a -> a -> Tax (Money a) (Money a)
threshold (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
140000) a
0.0025
lowIncomeTaxOffset :: (Fractional a, Ord a) => Tax (Money a) (Money a)
lowIncomeTaxOffset :: forall a. (Fractional a, Ord a) => Tax (Money a) (Money a)
lowIncomeTaxOffset =
forall a b. Ord a => a -> Tax b a -> Tax b a
limit forall a. Monoid a => a
mempty
(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
445)) 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.015)
lowIncomeTaxOffset2021 :: (Fractional a, Ord a) => Tax (Money a) (Money a)
lowIncomeTaxOffset2021 :: forall a. (Fractional a, Ord a) => Tax (Money a) (Money a)
lowIncomeTaxOffset2021 =
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. 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
700))
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
37500) a
0.05
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
45000) (-a
0.035)
lamito :: (Fractional a, Ord a) => Tax (Money a) (Money a)
lamito :: forall a. (Fractional a, Ord a) => Tax (Money a) (Money a)
lamito = 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
1080)))
( 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
corporateTax :: (Fractional a) => Tax (Money a) (Money a)
corporateTax :: forall a. Fractional a => Tax (Money a) (Money a)
corporateTax = forall a. Num a => a -> Tax (Money a) (Money a)
flat a
0.3
thresholds', marginal'
:: (Fractional a, Ord a) => [(a, a)] -> Tax (Money a) (Money a)
thresholds' :: forall a.
(Fractional a, Ord a) =>
[(a, a)] -> Tax (Money a) (Money a)
thresholds' = forall a.
(Fractional a, Ord a) =>
[(Money a, a)] -> Tax (Money a) (Money a)
thresholds forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (forall (p :: * -> * -> *) a b c.
Bifunctor p =>
(a -> b) -> p a c -> p b c
first (forall b (m :: * -> *) t. MonadReader b m => AReview t b -> m t
review forall a b. Iso (Money a) (Money b) a b
money))
marginal' :: forall a.
(Fractional a, Ord a) =>
[(a, a)] -> Tax (Money a) (Money a)
marginal' = forall a.
(Fractional a, Ord a) =>
[(Money a, a)] -> Tax (Money a) (Money a)
marginal forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (forall (p :: * -> * -> *) a b c.
Bifunctor p =>
(a -> b) -> p a c -> p b c
first (forall b (m :: * -> *) t. MonadReader b m => AReview t b -> m t
review forall a b. Iso (Money a) (Money b) a b
money))
class HasIncome a b c where
income :: Getter (a b) (Money c)
instance (Foldable t, HasIncome x a a, Num a) => HasIncome t (x a) a where
income :: Getter (t (x a)) (Money a)
income = forall (p :: * -> * -> *) (f :: * -> *) s a.
(Profunctor p, Contravariant f) =>
(s -> a) -> Optic' p f s a
to (forall (t :: * -> *) m a.
(Foldable t, Monoid m) =>
(a -> m) -> t a -> m
foldMap (forall s (m :: * -> *) a. MonadReader s m => Getting a s a -> m a
view forall {k} (a :: k -> *) (b :: k) c.
HasIncome a b c =>
Getter (a b) (Money c)
income))