[
{
"name": "1257L month 1 on 3,000 pounds: free pay 1,048.26, tax 20% of 1,951",
"args": [
"1257L",
"monthly",
1,
{
"minor": 300000,
"currency": "GBP"
},
{
"minor": 0,
"currency": "GBP"
},
{
"minor": 0,
"currency": "GBP"
},
"2026-04-28"
],
"expect": {
"tax": {
"minor": 39020,
"currency": "GBP"
},
"taxToDate": {
"minor": 39020,
"currency": "GBP"
},
"payToDate": {
"minor": 300000,
"currency": "GBP"
},
"allowanceToDate": {
"minor": 104826,
"currency": "GBP"
},
"taxablePay": {
"minor": 195100,
"currency": "GBP"
},
"cumulative": true,
"limitApplied": false,
"taxNotDeducted": {
"minor": 0,
"currency": "GBP"
}
}
},
{
"name": "the same pay for a Scottish taxpayer runs through starter, basic and intermediate bands",
"args": [
"S1257L",
"monthly",
1,
{
"minor": 300000,
"currency": "GBP"
},
{
"minor": 0,
"currency": "GBP"
},
{
"minor": 0,
"currency": "GBP"
},
"2026-04-28"
],
"expect": {
"tax": {
"minor": 39227,
"currency": "GBP"
},
"taxToDate": {
"minor": 39227,
"currency": "GBP"
},
"payToDate": {
"minor": 300000,
"currency": "GBP"
},
"allowanceToDate": {
"minor": 104826,
"currency": "GBP"
},
"taxablePay": {
"minor": 195100,
"currency": "GBP"
},
"cumulative": true,
"limitApplied": false,
"taxNotDeducted": {
"minor": 0,
"currency": "GBP"
}
}
},
{
"name": "a Welsh taxpayer pays the rest-of-UK rates",
"args": [
"C1257L",
"monthly",
1,
{
"minor": 300000,
"currency": "GBP"
},
{
"minor": 0,
"currency": "GBP"
},
{
"minor": 0,
"currency": "GBP"
},
"2026-04-28"
],
"expect": {
"tax": {
"minor": 39020,
"currency": "GBP"
},
"taxToDate": {
"minor": 39020,
"currency": "GBP"
},
"payToDate": {
"minor": 300000,
"currency": "GBP"
},
"allowanceToDate": {
"minor": 104826,
"currency": "GBP"
},
"taxablePay": {
"minor": 195100,
"currency": "GBP"
},
"cumulative": true,
"limitApplied": false,
"taxNotDeducted": {
"minor": 0,
"currency": "GBP"
}
}
},
{
"name": "higher rate in month 1 uses the exact threshold of 3,141.6666",
"args": [
"1257L",
"monthly",
1,
{
"minor": 600000,
"currency": "GBP"
},
{
"minor": 0,
"currency": "GBP"
},
{
"minor": 0,
"currency": "GBP"
},
"2025-04-28"
],
"expect": {
"tax": {
"minor": 135206,
"currency": "GBP"
},
"taxToDate": {
"minor": 135206,
"currency": "GBP"
},
"payToDate": {
"minor": 600000,
"currency": "GBP"
},
"allowanceToDate": {
"minor": 104826,
"currency": "GBP"
},
"taxablePay": {
"minor": 495100,
"currency": "GBP"
},
"cumulative": true,
"limitApplied": false,
"taxNotDeducted": {
"minor": 0,
"currency": "GBP"
}
}
},
{
"name": "additional rate on a weekly payroll",
"args": [
"1257L",
"weekly",
1,
{
"minor": 300000,
"currency": "GBP"
},
{
"minor": 0,
"currency": "GBP"
},
{
"minor": 0,
"currency": "GBP"
},
"2024-04-12"
],
"expect": {
"tax": {
"minor": 97577,
"currency": "GBP"
},
"taxToDate": {
"minor": 97577,
"currency": "GBP"
},
"payToDate": {
"minor": 300000,
"currency": "GBP"
},
"allowanceToDate": {
"minor": 24192,
"currency": "GBP"
},
"taxablePay": {
"minor": 275800,
"currency": "GBP"
},
"cumulative": true,
"limitApplied": false,
"taxNotDeducted": {
"minor": 0,
"currency": "GBP"
}
}
},
{
"name": "month 12 of a 60,000 pound year settles to the annual tax",
"args": [
"1257L",
"monthly",
12,
{
"minor": 500000,
"currency": "GBP"
},
{
"minor": 5500000,
"currency": "GBP"
},
{
"minor": 1047000,
"currency": "GBP"
},
"2027-03-31"
],
"expect": {
"tax": {
"minor": 95800,
"currency": "GBP"
},
"taxToDate": {
"minor": 1142800,
"currency": "GBP"
},
"payToDate": {
"minor": 6000000,
"currency": "GBP"
},
"allowanceToDate": {
"minor": 1257912,
"currency": "GBP"
},
"taxablePay": {
"minor": 4742000,
"currency": "GBP"
},
"cumulative": true,
"limitApplied": false,
"taxNotDeducted": {
"minor": 0,
"currency": "GBP"
}
}
},
{
"name": "a refund when pay stops: month 3 with no pay",
"args": [
"1257L",
"monthly",
3,
{
"minor": 0,
"currency": "GBP"
},
{
"minor": 600000,
"currency": "GBP"
},
{
"minor": 78040,
"currency": "GBP"
},
"2025-06-30"
],
"expect": {
"tax": {
"minor": -20940,
"currency": "GBP"
},
"taxToDate": {
"minor": 57100,
"currency": "GBP"
},
"payToDate": {
"minor": 600000,
"currency": "GBP"
},
"allowanceToDate": {
"minor": 314478,
"currency": "GBP"
},
"taxablePay": {
"minor": 285500,
"currency": "GBP"
},
"cumulative": true,
"limitApplied": false,
"taxNotDeducted": {
"minor": 0,
"currency": "GBP"
}
}
},
{
"name": "K1000 month 1: the 50% overriding limit holds the deduction to 250 pounds",
"args": [
"K1000",
"monthly",
1,
{
"minor": 50000,
"currency": "GBP"
},
{
"minor": 0,
"currency": "GBP"
},
{
"minor": 0,
"currency": "GBP"
},
"2026-04-30"
],
"expect": {
"tax": {
"minor": 25000,
"currency": "GBP"
},
"taxToDate": {
"minor": 25000,
"currency": "GBP"
},
"payToDate": {
"minor": 50000,
"currency": "GBP"
},
"allowanceToDate": {
"minor": -83409,
"currency": "GBP"
},
"taxablePay": {
"minor": 133400,
"currency": "GBP"
},
"cumulative": true,
"limitApplied": true,
"taxNotDeducted": {
"minor": 1680,
"currency": "GBP"
}
}
},
{
"name": "K1000 month 2 recovers what the limit held back",
"args": [
"K1000",
"monthly",
2,
{
"minor": 300000,
"currency": "GBP"
},
{
"minor": 50000,
"currency": "GBP"
},
{
"minor": 25000,
"currency": "GBP"
},
"2026-05-29"
],
"expect": {
"tax": {
"minor": 78360,
"currency": "GBP"
},
"taxToDate": {
"minor": 103360,
"currency": "GBP"
},
"payToDate": {
"minor": 350000,
"currency": "GBP"
},
"allowanceToDate": {
"minor": -166818,
"currency": "GBP"
},
"taxablePay": {
"minor": 516800,
"currency": "GBP"
},
"cumulative": true,
"limitApplied": false,
"taxNotDeducted": {
"minor": 0,
"currency": "GBP"
}
}
},
{
"name": "a K code with negative pay deducts nothing: the limit is zero",
"args": [
"K100",
"monthly",
2,
{
"minor": -50000,
"currency": "GBP"
},
{
"minor": 100000,
"currency": "GBP"
},
{
"minor": 5000,
"currency": "GBP"
},
"2026-05-29"
],
"expect": {
"tax": {
"minor": 0,
"currency": "GBP"
},
"taxToDate": {
"minor": 5000,
"currency": "GBP"
},
"payToDate": {
"minor": 50000,
"currency": "GBP"
},
"allowanceToDate": {
"minor": -16818,
"currency": "GBP"
},
"taxablePay": {
"minor": 66800,
"currency": "GBP"
},
"cumulative": true,
"limitApplied": true,
"taxNotDeducted": {
"minor": 8360,
"currency": "GBP"
}
}
},
{
"name": "BR taxes all pay, rounded down to the pound",
"args": [
"BR",
"monthly",
1,
{
"minor": 123456,
"currency": "GBP"
},
{
"minor": 0,
"currency": "GBP"
},
{
"minor": 0,
"currency": "GBP"
},
"2026-04-30"
],
"expect": {
"tax": {
"minor": 24680,
"currency": "GBP"
},
"taxToDate": {
"minor": 24680,
"currency": "GBP"
},
"payToDate": {
"minor": 123456,
"currency": "GBP"
},
"allowanceToDate": {
"minor": 0,
"currency": "GBP"
},
"taxablePay": {
"minor": 123400,
"currency": "GBP"
},
"cumulative": true,
"limitApplied": false,
"taxNotDeducted": {
"minor": 0,
"currency": "GBP"
}
}
},
{
"name": "BR on a week 1 basis ignores the year to date",
"args": [
"BR W1",
"weekly",
10,
{
"minor": 30099,
"currency": "GBP"
},
{
"minor": 300000,
"currency": "GBP"
},
{
"minor": 50000,
"currency": "GBP"
},
"2026-06-12"
],
"expect": {
"tax": {
"minor": 6000,
"currency": "GBP"
},
"taxToDate": {
"minor": 56000,
"currency": "GBP"
},
"payToDate": {
"minor": 330099,
"currency": "GBP"
},
"allowanceToDate": {
"minor": 0,
"currency": "GBP"
},
"taxablePay": {
"minor": 30000,
"currency": "GBP"
},
"cumulative": false,
"limitApplied": false,
"taxNotDeducted": {
"minor": 0,
"currency": "GBP"
}
}
},
{
"name": "D0 is 40% on everything in England",
"args": [
"D0",
"monthly",
1,
{
"minor": 200000,
"currency": "GBP"
},
{
"minor": 0,
"currency": "GBP"
},
{
"minor": 0,
"currency": "GBP"
},
"2026-04-30"
],
"expect": {
"tax": {
"minor": 80000,
"currency": "GBP"
},
"taxToDate": {
"minor": 80000,
"currency": "GBP"
},
"payToDate": {
"minor": 200000,
"currency": "GBP"
},
"allowanceToDate": {
"minor": 0,
"currency": "GBP"
},
"taxablePay": {
"minor": 200000,
"currency": "GBP"
},
"cumulative": true,
"limitApplied": false,
"taxNotDeducted": {
"minor": 0,
"currency": "GBP"
}
}
},
{
"name": "SD0 is the 21% intermediate rate in Scotland",
"args": [
"SD0",
"monthly",
1,
{
"minor": 100050,
"currency": "GBP"
},
{
"minor": 0,
"currency": "GBP"
},
{
"minor": 0,
"currency": "GBP"
},
"2026-04-30"
],
"expect": {
"tax": {
"minor": 21000,
"currency": "GBP"
},
"taxToDate": {
"minor": 21000,
"currency": "GBP"
},
"payToDate": {
"minor": 100050,
"currency": "GBP"
},
"allowanceToDate": {
"minor": 0,
"currency": "GBP"
},
"taxablePay": {
"minor": 100000,
"currency": "GBP"
},
"cumulative": true,
"limitApplied": false,
"taxNotDeducted": {
"minor": 0,
"currency": "GBP"
}
}
},
{
"name": "SD3 is the 48% top rate from 2024-25",
"args": [
"SD3",
"monthly",
1,
{
"minor": 100000,
"currency": "GBP"
},
{
"minor": 0,
"currency": "GBP"
},
{
"minor": 0,
"currency": "GBP"
},
"2025-04-30"
],
"expect": {
"tax": {
"minor": 48000,
"currency": "GBP"
},
"taxToDate": {
"minor": 48000,
"currency": "GBP"
},
"payToDate": {
"minor": 100000,
"currency": "GBP"
},
"allowanceToDate": {
"minor": 0,
"currency": "GBP"
},
"taxablePay": {
"minor": 100000,
"currency": "GBP"
},
"cumulative": true,
"limitApplied": false,
"taxNotDeducted": {
"minor": 0,
"currency": "GBP"
}
}
},
{
"name": "SD2 was the 47% top rate in 2023-24",
"args": [
"SD2",
"monthly",
1,
{
"minor": 100000,
"currency": "GBP"
},
{
"minor": 0,
"currency": "GBP"
},
{
"minor": 0,
"currency": "GBP"
},
"2023-04-28"
],
"expect": {
"tax": {
"minor": 47000,
"currency": "GBP"
},
"taxToDate": {
"minor": 47000,
"currency": "GBP"
},
"payToDate": {
"minor": 100000,
"currency": "GBP"
},
"allowanceToDate": {
"minor": 0,
"currency": "GBP"
},
"taxablePay": {
"minor": 100000,
"currency": "GBP"
},
"cumulative": true,
"limitApplied": false,
"taxNotDeducted": {
"minor": 0,
"currency": "GBP"
}
}
},
{
"name": "NT on a cumulative basis refunds everything deducted so far",
"args": [
"NT",
"monthly",
4,
{
"minor": 200000,
"currency": "GBP"
},
{
"minor": 600000,
"currency": "GBP"
},
{
"minor": 60000,
"currency": "GBP"
},
"2026-07-31"
],
"expect": {
"tax": {
"minor": -60000,
"currency": "GBP"
},
"taxToDate": {
"minor": 0,
"currency": "GBP"
},
"payToDate": {
"minor": 800000,
"currency": "GBP"
},
"allowanceToDate": {
"minor": 0,
"currency": "GBP"
},
"taxablePay": {
"minor": 0,
"currency": "GBP"
},
"cumulative": true,
"limitApplied": false,
"taxNotDeducted": {
"minor": 0,
"currency": "GBP"
}
}
},
{
"name": "0T on a week 1 basis: no allowance at all",
"args": [
"0T W1",
"weekly",
5,
{
"minor": 50000,
"currency": "GBP"
},
{
"minor": 200000,
"currency": "GBP"
},
{
"minor": 20000,
"currency": "GBP"
},
"2026-05-08"
],
"expect": {
"tax": {
"minor": 10000,
"currency": "GBP"
},
"taxToDate": {
"minor": 30000,
"currency": "GBP"
},
"payToDate": {
"minor": 250000,
"currency": "GBP"
},
"allowanceToDate": {
"minor": 0,
"currency": "GBP"
},
"taxablePay": {
"minor": 50000,
"currency": "GBP"
},
"cumulative": false,
"limitApplied": false,
"taxNotDeducted": {
"minor": 0,
"currency": "GBP"
}
}
},
{
"name": "week 53 is taxed non-cumulatively on the week 1 figures",
"args": [
"1257L",
"weekly",
53,
{
"minor": 50000,
"currency": "GBP"
},
{
"minor": 2600000,
"currency": "GBP"
},
{
"minor": 300000,
"currency": "GBP"
},
"2027-04-05"
],
"expect": {
"tax": {
"minor": 5160,
"currency": "GBP"
},
"taxToDate": {
"minor": 305160,
"currency": "GBP"
},
"payToDate": {
"minor": 2650000,
"currency": "GBP"
},
"allowanceToDate": {
"minor": 24192,
"currency": "GBP"
},
"taxablePay": {
"minor": 25800,
"currency": "GBP"
},
"cumulative": false,
"limitApplied": false,
"taxNotDeducted": {
"minor": 0,
"currency": "GBP"
}
}
},
{
"name": "fortnightly on a week 1 basis uses the week 2 figures",
"args": [
"1257L W1",
"fortnightly",
10,
{
"minor": 100000,
"currency": "GBP"
},
{
"minor": 0,
"currency": "GBP"
},
{
"minor": 0,
"currency": "GBP"
},
"2026-08-07"
],
"expect": {
"tax": {
"minor": 10320,
"currency": "GBP"
},
"taxToDate": {
"minor": 10320,
"currency": "GBP"
},
"payToDate": {
"minor": 100000,
"currency": "GBP"
},
"allowanceToDate": {
"minor": 48384,
"currency": "GBP"
},
"taxablePay": {
"minor": 51600,
"currency": "GBP"
},
"cumulative": false,
"limitApplied": false,
"taxNotDeducted": {
"minor": 0,
"currency": "GBP"
}
}
},
{
"name": "four-weekly, second payment in week 8",
"args": [
"1257L",
"four-weekly",
8,
{
"minor": 200000,
"currency": "GBP"
},
{
"minor": 200000,
"currency": "GBP"
},
{
"minor": 20640,
"currency": "GBP"
},
"2026-05-29"
],
"expect": {
"tax": {
"minor": 20640,
"currency": "GBP"
},
"taxToDate": {
"minor": 41280,
"currency": "GBP"
},
"payToDate": {
"minor": 400000,
"currency": "GBP"
},
"allowanceToDate": {
"minor": 193536,
"currency": "GBP"
},
"taxablePay": {
"minor": 206400,
"currency": "GBP"
},
"cumulative": true,
"limitApplied": false,
"taxNotDeducted": {
"minor": 0,
"currency": "GBP"
}
}
},
{
"name": "SD3 did not exist in 2023-24",
"args": [
"SD3",
"monthly",
1,
{
"minor": 100000,
"currency": "GBP"
},
{
"minor": 0,
"currency": "GBP"
},
{
"minor": 0,
"currency": "GBP"
},
"2023-04-28"
],
"expectError": "no SD3 rate for scotland"
},
{
"name": "a date before the bands on file",
"args": [
"1257L",
"monthly",
1,
{
"minor": 100000,
"currency": "GBP"
},
{
"minor": 0,
"currency": "GBP"
},
{
"minor": 0,
"currency": "GBP"
},
"2022-04-28"
],
"expectError": "no income tax bands for rest-of-uk"
},
{
"name": "pay in euros is refused",
"args": [
"1257L",
"monthly",
1,
{
"minor": 100000,
"currency": "EUR"
},
{
"minor": 0,
"currency": "GBP"
},
{
"minor": 0,
"currency": "GBP"
},
"2026-04-28"
],
"expectError": "payroll amounts must be in GBP"
},
{
"name": "there is no month 13",
"args": [
"1257L",
"monthly",
13,
{
"minor": 100000,
"currency": "GBP"
},
{
"minor": 0,
"currency": "GBP"
},
{
"minor": 0,
"currency": "GBP"
},
"2026-04-28"
],
"expectError": "is not a tax period for monthly pay"
},
{
"name": "fortnightly pay has week 54, not week 53",
"args": [
"1257L",
"fortnightly",
53,
{
"minor": 100000,
"currency": "GBP"
},
{
"minor": 0,
"currency": "GBP"
},
{
"minor": 0,
"currency": "GBP"
},
"2027-04-05"
],
"expectError": "is not a tax period for fortnightly pay"
},
{
"name": "an unrecognised code is refused",
"args": [
"1257X9",
"monthly",
1,
{
"minor": 100000,
"currency": "GBP"
},
{
"minor": 0,
"currency": "GBP"
},
{
"minor": 0,
"currency": "GBP"
},
"2026-04-28"
],
"expectError": "unrecognised tax code"
},
{
"name": "a malformed date is refused",
"args": [
"1257L",
"monthly",
1,
{
"minor": 100000,
"currency": "GBP"
},
{
"minor": 0,
"currency": "GBP"
},
{
"minor": 0,
"currency": "GBP"
},
"28/04/2026"
],
"expectError": "ISO date"
}
]