JSFiddle - React, Tailwind, and code Playground
by ducas
HTML
<h1>
Australian Income Tax Calculator
</h1>
<div>
This calculator was developed with information available on the <a href="https://www.ato.gov.au/rates/individual-income-tax-rates/">ATO - Individual tax income rates</a> and <a href="http://paycalculator.com.au/">PayCalculator.com.au</a>. It takes into
account:
<ul>
<li>Tax rates/amounts due to brackets</li>
<li>Medicare levy (2%)</li>
<li>Temporary budget repair levy (2% each $1 over $180,000)</li>
<li>Low income tax offset</li>
</ul>
</div>
<h2>
Tests
</h2>
<table>
<thead>
<tr>
<th>Income</th>
<th>Expected</th>
<th>Actual</th>
</tr>
</thead>
<tbody>
</tbody>
</table>
CSS
table {
width: 400px;
padding: 10px;
}
td,
th {
text-align: right;
}
JavaScript
const brackets = [{
start: 0,
end: 18200,
rate: 0
}, {
start: 18201,
end: 37000,
rate: 0.19
}, {
start: 37001,
end: 87000,
rate: 0.325
}, {
start: 87001,
end: 180000,
rate: 0.37
}, {
start: 180001,
end: Number.MAX_SAFE_INTEGER,
rate: 0.45
}];
const offsets = [{
name: 'Low Income Tax Offset',
func: (i, t) => {
if (i < 18201) return 0;
if (i > 66666) return 0;
if (i < 37001) return Math.min(445, t);
return Math.min(445 - (i - 37000) * 0.015);
}
}]
const levies = [{
name: 'Medicare Levy',
func: (i => i > 18200 ? i * 0.02 : 0)
}, {
name: 'Temporary Budget Repair Levy',
func: (i => i > 180000 ? (i - 180000) * 0.02 : 0)
}];
var calculator = function(income) {
income = Math.floor(income);
var result = {
income: income
};
var tax = 0;
for (var b = 0; b < brackets.length; b++) {
var bracket = brackets[b];
if (bracket.start > income) break;
tax += (Math.min(income, bracket.end) - bracket.start + 1) * bracket.rate;
}
result.incomeTax = tax;
result.levies = levies.map(l => ({
name: l.name,
amount: l.func(income)
}));
tax += result.levies.reduce((acc, val) => acc + val.amount, 0);
result.offsets = offsets.map(o => ({ name: o.name, amount: o.func(income, tax) }));
tax -= result.offsets.reduce((acc, val) => acc + val.amount, 0);
result.totalTax = Math.round(tax);
result.netPay = income - result.totalTax;
return result;
}
var tests = [{
income: 10000,
expected: 0
}, {
income: 18200,
expected: 0
}, {
income: 18201,
expected: 0
}, {
income: 30000,
expected: 2397
}, {
income: 37000,
expected: 3867
}, {
income: 37002,
expected: 3868
}, {
income: 66667,
expected: 14547
}, {
income: 80000,
expected: 19147
}, {
income: 87000,
expected: 21562
}, {
income: 87002,
expected: 21563
}, {
income: 90000,
expected: 22732
}, {
income: 180000,
expected: 57832
}, {
income: 190000,
expected: 62732
}];
var table = $('table...