///|
pub fn tax_policy(rate_bp~ : Int, threshold~ : Money) -> TaxPolicy {
{ rate_bp, threshold }
}
///|
pub fn calculate_tax(
policy : TaxPolicy,
taxable : Money,
exempt : Money,
) -> TaxResult {
let basis = taxable.max(Money::zero()).max(policy.threshold)
let tax = basis.percent_bp(policy.rate_bp.max(0))
{
taxable: basis,
exempt: exempt.max(Money::zero()),
tax,
gross: basis.add(exempt.max(Money::zero())).add(tax),
}
}
///|
pub fn TaxPolicy::valid(self : TaxPolicy) -> Bool {
self.rate_bp >= 0 && self.rate_bp <= 10000 && self.threshold.cents >= 0
}
///|
pub fn TaxResult::net_of_tax(self : TaxResult) -> Money {
self.gross.sub(self.tax)
}