function [it_pounds, it_pct, nic_pounds, nic_pct, total_pounds, total_pct, takehome_pounds] = tax(gross, tax_rates, tax_widths, claw_start, claw_rate, nic_rates, nic_widths, plot_all)
%TAX: Compute the pounds and percentage cost of taxable pay of income tax
%and National Insurance. (Or just tax in places without NI).
%
%[it_pounds it_pct nic_pounds nic_pct total_pounds total_pct takehome_pounds] = tax(gross, tax_rates, tax_widths, nic_rates, nic_widths, plot_all)
%
%Inputs:
% GROSS: Vector of taxable pay amounts to compute all outputs for.
% TAX_RATES: Percentages of tax rates matching entries in tax_widths.
% TAX_WIDTHS: Width in pounds of each tax band, ended by Inf. NOT the
% income levels at which they begin to apply. For example, for 2007-08:
%
% Personal allowance, or 0% band = £5225.
% 10% band = First £2230 taxable = £2230 in width.
% 22% band = £2230 - £34600 taxable = £32370 in width.
% 40% band = £34600 - (unlimited) taxable = £Inf in width.
%
% Therefore, tax_rates and tax_widths are set up as follows:
%
% TAX_RATES = [ 0 10 22 40];
% TAX_WIDTHS = [5225 2230 32370 Inf];
%
% CLAW_START: Value of GROSS at which the clawback of personal allowance
% starts.
% CLAW_RATE: A 2-vector, [PER STEP], where PER is the clawback for each
% increment in GROSS of STEP. E.g. a clawback of £1 for every £2 of GROSS
% is expressed as CLAW_RATE = [1 2].
%
% NIC_RATES: As TAX_RATES. (Omit if no NIC-equivalent needed).
% NIC_WIDTHS: As TAX_WIDTHS. (Omit if no NIC-equivalent needed).
% PLOT_ALL : Single boolean true/false whether to draw the output plot.
%
%Outputs:
% These all have obvious names, and each produce a vector with entries
% corresponding to the entries of input GROSS.
for g = 1:length(gross)
it_pounds(g) = tax_calc(gross(g), tax_rates, tax_widths, claw_start, claw_rate);
it_pct(g) = 100*it_pounds(g)/gross(g);
nic_pounds(g) = tax_calc(gross(g), nic_rates, nic_widths);
nic_pct(g) = 100*nic_pounds(g)/gross(g);
total_pounds(g) = it_pounds(g) + nic_pounds(g);
total_pct(g) = 100*total_pounds(g)/gross(g);
takehome_pounds(g) = gross(g) - total_pounds(g);
end
if exist('plot_all', 'var') && plot_all
%Plots for amounts in pounds
figure;
plot(gross, it_pounds, 'b', gross, nic_pounds, 'r', gross, total_pounds, 'm', gross, takehome_pounds, 'g');
set(get(gca, 'Children'), 'LineWidth',2);
set(gca, 'XMinorTick', 'off', 'YMinorTick', 'on');
legend('Income tax', 'National insurance', 'Combined', 'Take home');
xlabel('Annual taxable pay, GBP');
ylabel('Annual amount, GBP');
grid on;
%Plots for percentages
figure;
plot(gross, it_pct, 'b', gross, nic_pct, 'r', gross, total_pct, 'm');
set(get(gca, 'Children'), 'LineWidth',2);
set(gca, 'XMinorTick', 'off', 'YMinorTick', 'on');
legend('Income tax', 'National insurance', 'Combined');
xlabel('Annual taxable pay, GBP');
ylabel('Percentage of taxable pay');
grid on;
end
%%%%Calculation engine%%%%
function total_tax = tax_calc(gross, rates, widths, claw_start, claw_rate)
tax_band = 1;
income_left = gross;
total_tax = 0;
%Clawback if necessary
if exist('claw_start', 'var') && exist('claw_rate', 'var')
widths(1) = clawback(gross, claw_start, claw_rate, widths(1));
end
while tax_band <= length(widths) && income_left > 0
taxable_this_band = min([widths(tax_band) income_left]);
total_tax = total_tax + taxable_this_band*rates(tax_band)/100;
income_left = income_left - taxable_this_band;
tax_band = tax_band + 1;
end
function new_limit = clawback(gross, claw_start, claw_rate, initial_limit)
%GROSS: Vector of taxable pay amounts to compute all outputs for.
%CLAW_START: Values of GROSS at which the clawback starts
%CLAW_RATE: A 2-vector, [PER STEP], where PER is the clawback for each
%increment in GROSS of STEP. E.g. a clawback of £1 for every £2 of GROSS
%is expressed as CLAW_RATE = [1 2].
%INITIAL_LIMIT: The un-clawedback value to begin with.
%
%NEW_LIMIT is the clawed-back value of INITIAL_LIMIT.
claw_length = max(gross - claw_start, 0);
claw = claw_rate(1) * floor(claw_length/claw_rate(2));
new_limit = max(initial_limit - claw, 0);
</syntaxhighlight>
;For the 20010-11 tax year:
<syntaxhighlight lang="matlab">
tax_rates = [0 20 40 50];
tax_widths = [6475 37400 112600 Inf];
claw_start = 100000;
claw_rate = [1 2];
nic_rates = [0 11 1];
nic_widths = [110*52 (844-110)*52 Inf];