[
{
"name": "mixed standard, zero and discounted lines",
"args": [
[
{ "description": "Consultancy, 3 days", "unitPrice": { "minor": 50000, "currency": "GBP" }, "quantity": 3, "discountBasisPoints": 0, "taxCategory": "STANDARD" },
{ "description": "Printed report", "unitPrice": { "minor": 1250, "currency": "GBP" }, "quantity": 2, "discountBasisPoints": 0, "taxCategory": "ZERO" },
{ "description": "Software licence", "unitPrice": { "minor": 9999, "currency": "GBP" }, "quantity": 1, "discountBasisPoints": 1000, "taxCategory": "STANDARD" }
],
"GB",
"2026-09-16"
],
"expect": {
"currency": "GBP",
"lines": [
{ "description": "Consultancy, 3 days", "net": { "minor": 150000, "currency": "GBP" }, "tax": { "minor": 30000, "currency": "GBP" }, "gross": { "minor": 180000, "currency": "GBP" }, "basisPoints": 2000 },
{ "description": "Printed report", "net": { "minor": 2500, "currency": "GBP" }, "tax": { "minor": 0, "currency": "GBP" }, "gross": { "minor": 2500, "currency": "GBP" }, "basisPoints": 0 },
{ "description": "Software licence", "net": { "minor": 8999, "currency": "GBP" }, "tax": { "minor": 1800, "currency": "GBP" }, "gross": { "minor": 10799, "currency": "GBP" }, "basisPoints": 2000 }
],
"subtotal": { "minor": 161499, "currency": "GBP" },
"taxTotal": { "minor": 31800, "currency": "GBP" },
"total": { "minor": 193299, "currency": "GBP" },
"taxBreakdown": [
{ "basisPoints": 0, "taxable": { "minor": 2500, "currency": "GBP" }, "tax": { "minor": 0, "currency": "GBP" } },
{ "basisPoints": 2000, "taxable": { "minor": 158999, "currency": "GBP" }, "tax": { "minor": 31800, "currency": "GBP" } }
]
}
},
{
"name": "hospitality invoice during the covid rate cut",
"args": [
[{ "description": "Dinner, 4 covers", "unitPrice": { "minor": 5000, "currency": "GBP" }, "quantity": 4, "discountBasisPoints": 0, "taxCategory": "HOSPITALITY" }],
"GB",
"2020-12-25"
],
"expect": {
"currency": "GBP",
"lines": [{ "description": "Dinner, 4 covers", "net": { "minor": 20000, "currency": "GBP" }, "tax": { "minor": 1000, "currency": "GBP" }, "gross": { "minor": 21000, "currency": "GBP" }, "basisPoints": 500 }],
"subtotal": { "minor": 20000, "currency": "GBP" },
"taxTotal": { "minor": 1000, "currency": "GBP" },
"total": { "minor": 21000, "currency": "GBP" },
"taxBreakdown": [{ "basisPoints": 500, "taxable": { "minor": 20000, "currency": "GBP" }, "tax": { "minor": 1000, "currency": "GBP" } }]
}
},
{
"name": "the same goods invoiced in 2009 use the 2009 rate",
"args": [
[{ "description": "Widget", "unitPrice": { "minor": 10000, "currency": "GBP" }, "quantity": 1, "discountBasisPoints": 0, "taxCategory": "STANDARD" }],
"GB",
"2009-06-01"
],
"expect": {
"currency": "GBP",
"lines": [{ "description": "Widget", "net": { "minor": 10000, "currency": "GBP" }, "tax": { "minor": 1500, "currency": "GBP" }, "gross": { "minor": 11500, "currency": "GBP" }, "basisPoints": 1500 }],
"subtotal": { "minor": 10000, "currency": "GBP" },
"taxTotal": { "minor": 1500, "currency": "GBP" },
"total": { "minor": 11500, "currency": "GBP" },
"taxBreakdown": [{ "basisPoints": 1500, "taxable": { "minor": 10000, "currency": "GBP" }, "tax": { "minor": 1500, "currency": "GBP" } }]
}
},
{
"name": "a credit note is an invoice with negative quantities",
"args": [
[{ "description": "Returned widget", "unitPrice": { "minor": 10000, "currency": "GBP" }, "quantity": -1, "discountBasisPoints": 0, "taxCategory": "STANDARD" }],
"GB",
"2026-09-16"
],
"expect": {
"currency": "GBP",
"lines": [{ "description": "Returned widget", "net": { "minor": -10000, "currency": "GBP" }, "tax": { "minor": -2000, "currency": "GBP" }, "gross": { "minor": -12000, "currency": "GBP" }, "basisPoints": 2000 }],
"subtotal": { "minor": -10000, "currency": "GBP" },
"taxTotal": { "minor": -2000, "currency": "GBP" },
"total": { "minor": -12000, "currency": "GBP" },
"taxBreakdown": [{ "basisPoints": 2000, "taxable": { "minor": -10000, "currency": "GBP" }, "tax": { "minor": -2000, "currency": "GBP" } }]
}
},
{
"name": "an Irish invoice uses Irish rates",
"args": [
[{ "description": "Consultancy", "unitPrice": { "minor": 100000, "currency": "EUR" }, "quantity": 1, "discountBasisPoints": 0, "taxCategory": "STANDARD" }],
"IE",
"2026-09-16"
],
"expect": {
"currency": "EUR",
"lines": [{ "description": "Consultancy", "net": { "minor": 100000, "currency": "EUR" }, "tax": { "minor": 23000, "currency": "EUR" }, "gross": { "minor": 123000, "currency": "EUR" }, "basisPoints": 2300 }],
"subtotal": { "minor": 100000, "currency": "EUR" },
"taxTotal": { "minor": 23000, "currency": "EUR" },
"total": { "minor": 123000, "currency": "EUR" },
"taxBreakdown": [{ "basisPoints": 2300, "taxable": { "minor": 100000, "currency": "EUR" }, "tax": { "minor": 23000, "currency": "EUR" } }]
}
},
{
"name": "an invoice with no lines is an error",
"args": [[], "GB", "2026-09-16"],
"expectError": "at least one line"
},
{
"name": "mixing currencies across lines is an error",
"args": [
[
{ "description": "In pounds", "unitPrice": { "minor": 1000, "currency": "GBP" }, "quantity": 1, "discountBasisPoints": 0, "taxCategory": "STANDARD" },
{ "description": "In euros", "unitPrice": { "minor": 1000, "currency": "EUR" }, "quantity": 1, "discountBasisPoints": 0, "taxCategory": "STANDARD" }
],
"GB",
"2026-09-16"
],
"expectError": "currency mismatch"
}
]