-
Notifications
You must be signed in to change notification settings - Fork 0
/
cutcalc.js
161 lines (132 loc) · 4.14 KB
/
cutcalc.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
/**
* "Cut Calc"
* Created by philipjohn on 27/04/16.
*/
$(function(){
// Act on form submission
$('#cutcalc').submit( function ( event ) {
// Stop form submission
event.preventDefault();
// Grab the salary
var salary = $('#gross_salary').val();
// Check that salary is actually an integer
if ( ! isNormalInteger( salary ) ) {
console.error( "Salary isn't a number!" );
return;
}
var tax_2016 = get_tax_for_year( 2016, salary );
var tax_2017 = get_tax_for_year( 2017, salary );
// How much less tax for 2017?
var tax_diff = tax_2016 - tax_2017;
var result = $('#tax_cut_amount');
if ( tax_diff > 0 ) {
result.text( '£' + tax_diff );
make_suggestions( tax_diff );
$('#tax_cut').show();
} else {
result.text( '£0' );
}
});
function make_suggestions( tax_diff ) {
// Donate to the Trussel Trust
$('.trussell')
.text( 'Donate £' + tax_diff + ' to the ' )
.append( function () {
return $('<a/>')
.attr( 'href', '' )
.text( 'Trussell Trust' );
} );
var monthly = Math.round( tax_diff / 12 );
if ( monthly > 5 ) {
// Monthly donation to Disability Rights UK
$('.druk')
.text( 'Donate £' + monthly + ' per month to ' )
.append( function () {
return $('<a/>')
.attr( 'href', '' )
.text('Disability Rights UK');
});
// Monthly donation to food bank
$('.food-bank')
.text( 'Add £' + monthly + ' of food to one of your shopping trips each month, and donate the food to your ' )
.append( function () {
return $('<a/>')
.attr( 'href', 'https://www.trusselltrust.org/get-help/find-a-foodbank/' )
.text( 'local food bank' );
});
} else {
// One-off donation to Disability Rights UK
$('.druk')
.text( 'Donate £' + monthly + ' to ' )
.append( function () {
return $('<a/>')
.attr( 'href', '' )
.text('Disability Rights UK');
});
// One-off donation to local food bank
$('.food-bank')
.text( 'Do a £' + monthly + ' food shop to take to your ' )
.append( function () {
return $('<a/>')
.attr( 'href', 'https://www.trusselltrust.org/get-help/find-a-foodbank/' )
.text( 'local food bank' );
});
}
}
/**
* Calculate the tax for a tax year, based on a salary
*
* @param year int The year in which the tax year we want finishes (e.g. 2016-17 would be "2017")
* @param salary int The salary we need to get the tax amount for
*/
function get_tax_for_year( year, salary ) {
// Storage for later
var taxable_income = {};
var tax = {};
// What are the tax-free allowances?
var allowance = {};
allowance["2016"] = 10600;
allowance["2017"] = 11000;
// Calculate the taxable income
// Don't tax folks earning up to the tax-free allowance
if ( salary <= allowance[ year ] ) {
taxable_income[ year ] = 0;
}
// Everyone else, under £100,001 is pretty standard
else if ( salary < 100001 ) {
taxable_income[ year ] = salary - allowance[ year ];
}
// Above £100k, the allowance gradually decreases
else if ( salary < 122000 ) {
var over_100 = salary - 100000;
var adjusted_allowance = allowance[ year ] - ( over_100 / 2 );
taxable_income[ year ] = salary - adjusted_allowance;
}
// Above £100k, there is no allowance
else {
taxable_income[ year ] = salary;
}
// The size of the gap between the tax free allowance and the next tax bracket
var tax_bracket = {};
tax_bracket["2016"] = 31785;
tax_bracket["2017"] = 32000;
// Get the tax rate and tax amount
if ( taxable_income[ year ] <= tax_bracket[ year ] ) {
tax = taxable_income[ year ] * 0.2;
} else if ( taxable_income[ year ] <= 150000 ) {
tax = tax_bracket[ year ] * 0.2;
tax += ( taxable_income[ year ] - tax_bracket[ year ] ) * 0.4;
} else {
tax = tax_bracket[ year ] * 0.2; // basic rate
tax += ( 150000 - tax_bracket[ year ] ) * 0.4; // higher rate
tax += ( taxable_income[ year ] - 150000 ) * 0.45;
}
return tax;
}
// Validate integers
// http://stackoverflow.com/questions/10834796/validate-that-a-string-is-a-positive-integer
function isNormalInteger( str ) {
var n = ~~Number( str );
return String( n ) === str && n > 0;
}
});