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...