[
{"name": "a quarter with sales, a credit note, reverse charges, import VAT and out-of-period items", "args": [[{"date": "2026-04-10", "direction": "sale", "treatment": "taxable", "net": {"minor": 100000, "currency": "GBP"}, "vat": {"minor": 20000, "currency": "GBP"}}, {"date": "2026-05-01", "direction": "sale", "treatment": "taxable", "net": {"minor": 5050, "currency": "GBP"}, "vat": {"minor": 0, "currency": "GBP"}}, {"date": "2026-05-02", "direction": "sale", "treatment": "exempt", "net": {"minor": 2000, "currency": "GBP"}, "vat": {"minor": 0, "currency": "GBP"}}, {"date": "2026-05-10", "direction": "purchase", "treatment": "taxable", "net": {"minor": 30000, "currency": "GBP"}, "vat": {"minor": 6000, "currency": "GBP"}}, {"date": "2026-06-01", "direction": "purchase", "treatment": "domestic-reverse-charge", "net": {"minor": 10000, "currency": "GBP"}, "vat": {"minor": 2000, "currency": "GBP"}}, {"date": "2026-06-02", "direction": "purchase", "treatment": "services-reverse-charge", "net": {"minor": 5000, "currency": "GBP"}, "vat": {"minor": 1000, "currency": "GBP"}}, {"date": "2026-06-03", "direction": "purchase", "treatment": "postponed-import-vat", "net": {"minor": 20000, "currency": "GBP"}, "vat": {"minor": 4000, "currency": "GBP"}}, {"date": "2026-06-04", "direction": "sale", "treatment": "outside-scope", "net": {"minor": 50000, "currency": "GBP"}, "vat": {"minor": 0, "currency": "GBP"}}, {"date": "2026-06-10", "direction": "sale", "treatment": "taxable", "net": {"minor": -10000, "currency": "GBP"}, "vat": {"minor": -2000, "currency": "GBP"}}, {"date": "2026-07-01", "direction": "sale", "treatment": "taxable", "net": {"minor": 99900, "currency": "GBP"}, "vat": {"minor": 19980, "currency": "GBP"}}, {"date": "2026-03-31", "direction": "purchase", "treatment": "taxable", "net": {"minor": 1000, "currency": "GBP"}, "vat": {"minor": 200, "currency": "GBP"}}], "2026-04-01", "2026-06-30"], "expect": {"box1": {"minor": 25000, "currency": "GBP"}, "box2": {"minor": 0, "currency": "GBP"}, "box3": {"minor": 25000, "currency": "GBP"}, "box4": {"minor": 13000, "currency": "GBP"}, "box5": {"minor": 12000, "currency": "GBP"}, "box6": {"minor": 102000, "currency": "GBP"}, "box7": {"minor": 65000, "currency": "GBP"}, "box8": {"minor": 0, "currency": "GBP"}, "box9": {"minor": 0, "currency": "GBP"}, "repayment": false, "transactions": 9}},
{"name": "Northern Ireland goods to and from the EU fill boxes 2, 8 and 9", "args": [[{"date": "2026-04-15", "direction": "sale", "treatment": "ni-eu-goods", "net": {"minor": 12345, "currency": "GBP"}, "vat": {"minor": 0, "currency": "GBP"}}, {"date": "2026-04-20", "direction": "purchase", "treatment": "ni-eu-goods", "net": {"minor": 20099, "currency": "GBP"}, "vat": {"minor": 4020, "currency": "GBP"}}], "2026-04-01", "2026-06-30"], "expect": {"box1": {"minor": 0, "currency": "GBP"}, "box2": {"minor": 4020, "currency": "GBP"}, "box3": {"minor": 4020, "currency": "GBP"}, "box4": {"minor": 4020, "currency": "GBP"}, "box5": {"minor": 0, "currency": "GBP"}, "box6": {"minor": 12300, "currency": "GBP"}, "box7": {"minor": 20000, "currency": "GBP"}, "box8": {"minor": 12300, "currency": "GBP"}, "box9": {"minor": 20000, "currency": "GBP"}, "repayment": false, "transactions": 2}},
{"name": "more VAT reclaimed than due is a repayment, and box 5 has no sign", "args": [[{"date": "2026-05-01", "direction": "purchase", "treatment": "taxable", "net": {"minor": 100000, "currency": "GBP"}, "vat": {"minor": 20000, "currency": "GBP"}}, {"date": "2026-05-02", "direction": "sale", "treatment": "taxable", "net": {"minor": 1000, "currency": "GBP"}, "vat": {"minor": 200, "currency": "GBP"}}], "2026-04-01", "2026-06-30"], "expect": {"box1": {"minor": 200, "currency": "GBP"}, "box2": {"minor": 0, "currency": "GBP"}, "box3": {"minor": 200, "currency": "GBP"}, "box4": {"minor": 20000, "currency": "GBP"}, "box5": {"minor": 19800, "currency": "GBP"}, "box6": {"minor": 1000, "currency": "GBP"}, "box7": {"minor": 100000, "currency": "GBP"}, "box8": {"minor": 0, "currency": "GBP"}, "box9": {"minor": 0, "currency": "GBP"}, "repayment": true, "transactions": 2}},
{"name": "boxes 6 and 7 drop the pence rather than round them", "args": [[{"date": "2026-05-01", "direction": "sale", "treatment": "taxable", "net": {"minor": 99999, "currency": "GBP"}, "vat": {"minor": 20000, "currency": "GBP"}}, {"date": "2026-05-02", "direction": "purchase", "treatment": "taxable", "net": {"minor": 1, "currency": "GBP"}, "vat": {"minor": 0, "currency": "GBP"}}], "2026-04-01", "2026-06-30"], "expect": {"box1": {"minor": 20000, "currency": "GBP"}, "box2": {"minor": 0, "currency": "GBP"}, "box3": {"minor": 20000, "currency": "GBP"}, "box4": {"minor": 0, "currency": "GBP"}, "box5": {"minor": 20000, "currency": "GBP"}, "box6": {"minor": 99900, "currency": "GBP"}, "box7": {"minor": 0, "currency": "GBP"}, "box8": {"minor": 0, "currency": "GBP"}, "box9": {"minor": 0, "currency": "GBP"}, "repayment": false, "transactions": 2}},
{"name": "pence are dropped after totalling, not per line", "args": [[{"date": "2026-05-01", "direction": "sale", "treatment": "taxable", "net": {"minor": 50050, "currency": "GBP"}, "vat": {"minor": 0, "currency": "GBP"}}, {"date": "2026-05-02", "direction": "sale", "treatment": "taxable", "net": {"minor": 50050, "currency": "GBP"}, "vat": {"minor": 0, "currency": "GBP"}}], "2026-04-01", "2026-06-30"], "expect": {"box1": {"minor": 0, "currency": "GBP"}, "box2": {"minor": 0, "currency": "GBP"}, "box3": {"minor": 0, "currency": "GBP"}, "box4": {"minor": 0, "currency": "GBP"}, "box5": {"minor": 0, "currency": "GBP"}, "box6": {"minor": 100100, "currency": "GBP"}, "box7": {"minor": 0, "currency": "GBP"}, "box8": {"minor": 0, "currency": "GBP"}, "box9": {"minor": 0, "currency": "GBP"}, "repayment": false, "transactions": 2}},
{"name": "a period of only a credit note: negative boxes, dropped towards zero", "args": [[{"date": "2026-05-01", "direction": "sale", "treatment": "taxable", "net": {"minor": -12345, "currency": "GBP"}, "vat": {"minor": -2469, "currency": "GBP"}}], "2026-04-01", "2026-06-30"], "expect": {"box1": {"minor": -2469, "currency": "GBP"}, "box2": {"minor": 0, "currency": "GBP"}, "box3": {"minor": -2469, "currency": "GBP"}, "box4": {"minor": 0, "currency": "GBP"}, "box5": {"minor": 2469, "currency": "GBP"}, "box6": {"minor": -12300, "currency": "GBP"}, "box7": {"minor": 0, "currency": "GBP"}, "box8": {"minor": 0, "currency": "GBP"}, "box9": {"minor": 0, "currency": "GBP"}, "repayment": true, "transactions": 1}},
{"name": "transactions on the first and last days are in the period", "args": [[{"date": "2026-04-01", "direction": "sale", "treatment": "taxable", "net": {"minor": 1000, "currency": "GBP"}, "vat": {"minor": 200, "currency": "GBP"}}, {"date": "2026-06-30", "direction": "sale", "treatment": "taxable", "net": {"minor": 1000, "currency": "GBP"}, "vat": {"minor": 200, "currency": "GBP"}}], "2026-04-01", "2026-06-30"], "expect": {"box1": {"minor": 400, "currency": "GBP"}, "box2": {"minor": 0, "currency": "GBP"}, "box3": {"minor": 400, "currency": "GBP"}, "box4": {"minor": 0, "currency": "GBP"}, "box5": {"minor": 400, "currency": "GBP"}, "box6": {"minor": 2000, "currency": "GBP"}, "box7": {"minor": 0, "currency": "GBP"}, "box8": {"minor": 0, "currency": "GBP"}, "box9": {"minor": 0, "currency": "GBP"}, "repayment": false, "transactions": 2}},
{"name": "a supplier's reverse-charge sales go in box 6 only", "args": [[{"date": "2026-05-01", "direction": "sale", "treatment": "domestic-reverse-charge", "net": {"minor": 40000, "currency": "GBP"}, "vat": {"minor": 0, "currency": "GBP"}}, {"date": "2026-05-02", "direction": "sale", "treatment": "services-reverse-charge", "net": {"minor": 10000, "currency": "GBP"}, "vat": {"minor": 0, "currency": "GBP"}}], "2026-04-01", "2026-06-30"], "expect": {"box1": {"minor": 0, "currency": "GBP"}, "box2": {"minor": 0, "currency": "GBP"}, "box3": {"minor": 0, "currency": "GBP"}, "box4": {"minor": 0, "currency": "GBP"}, "box5": {"minor": 0, "currency": "GBP"}, "box6": {"minor": 50000, "currency": "GBP"}, "box7": {"minor": 0, "currency": "GBP"}, "box8": {"minor": 0, "currency": "GBP"}, "box9": {"minor": 0, "currency": "GBP"}, "repayment": false, "transactions": 2}},
{"name": "exempt and outside-scope purchases: box 7 for the first, nothing for the second", "args": [[{"date": "2026-05-01", "direction": "purchase", "treatment": "exempt", "net": {"minor": 3000, "currency": "GBP"}, "vat": {"minor": 0, "currency": "GBP"}}, {"date": "2026-05-02", "direction": "purchase", "treatment": "outside-scope", "net": {"minor": 250000, "currency": "GBP"}, "vat": {"minor": 0, "currency": "GBP"}}], "2026-04-01", "2026-06-30"], "expect": {"box1": {"minor": 0, "currency": "GBP"}, "box2": {"minor": 0, "currency": "GBP"}, "box3": {"minor": 0, "currency": "GBP"}, "box4": {"minor": 0, "currency": "GBP"}, "box5": {"minor": 0, "currency": "GBP"}, "box6": {"minor": 0, "currency": "GBP"}, "box7": {"minor": 3000, "currency": "GBP"}, "box8": {"minor": 0, "currency": "GBP"}, "box9": {"minor": 0, "currency": "GBP"}, "repayment": false, "transactions": 2}},
{"name": "an empty period", "args": [[], "2026-04-01", "2026-06-30"], "expect": {"box1": {"minor": 0, "currency": "GBP"}, "box2": {"minor": 0, "currency": "GBP"}, "box3": {"minor": 0, "currency": "GBP"}, "box4": {"minor": 0, "currency": "GBP"}, "box5": {"minor": 0, "currency": "GBP"}, "box6": {"minor": 0, "currency": "GBP"}, "box7": {"minor": 0, "currency": "GBP"}, "box8": {"minor": 0, "currency": "GBP"}, "box9": {"minor": 0, "currency": "GBP"}, "repayment": false, "transactions": 0}},
{"name": "a period that ends before it starts is refused", "args": [[], "2026-04-01", "2026-03-31"], "expectError": "VAT return period ends 2026-03-31, before it starts 2026-04-01"},
{"name": "VAT on an exempt sale is refused", "args": [[{"date": "2026-05-01", "direction": "sale", "treatment": "exempt", "net": {"minor": 1000, "currency": "GBP"}, "vat": {"minor": 200, "currency": "GBP"}}], "2026-04-01", "2026-06-30"], "expectError": "transaction 1: exempt sales must have zero VAT"},
{"name": "VAT on a supplier's reverse-charge sale is refused", "args": [[{"date": "2026-05-01", "direction": "sale", "treatment": "taxable", "net": {"minor": 1, "currency": "GBP"}, "vat": {"minor": 0, "currency": "GBP"}}, {"date": "2026-05-01", "direction": "sale", "treatment": "domestic-reverse-charge", "net": {"minor": 1000, "currency": "GBP"}, "vat": {"minor": 200, "currency": "GBP"}}], "2026-04-01", "2026-06-30"], "expectError": "transaction 2: domestic-reverse-charge sales must have zero VAT"},
{"name": "postponed import VAT on a sale is refused", "args": [[{"date": "2026-05-01", "direction": "sale", "treatment": "postponed-import-vat", "net": {"minor": 1000, "currency": "GBP"}, "vat": {"minor": 200, "currency": "GBP"}}], "2026-04-01", "2026-06-30"], "expectError": "transaction 1: postponed-import-vat applies to purchases only"},
{"name": "amounts in another currency are refused", "args": [[{"date": "2026-05-01", "direction": "sale", "treatment": "taxable", "net": {"minor": 1000, "currency": "EUR"}, "vat": {"minor": 200, "currency": "EUR"}}], "2026-04-01", "2026-06-30"], "expectError": "transaction 1: amounts must be in GBP"},
{"name": "an unknown treatment is refused", "args": [[{"date": "2026-05-01", "direction": "sale", "treatment": "standard", "net": {"minor": 1000, "currency": "GBP"}, "vat": {"minor": 200, "currency": "GBP"}}], "2026-04-01", "2026-06-30"], "expectError": "transaction 1: unknown VAT treatment \"standard\""},
{"name": "an unknown direction is refused", "args": [[{"date": "2026-05-01", "direction": "refund", "treatment": "taxable", "net": {"minor": 1000, "currency": "GBP"}, "vat": {"minor": 200, "currency": "GBP"}}], "2026-04-01", "2026-06-30"], "expectError": "transaction 1: unknown direction \"refund\""},
{"name": "transactions outside the period are still checked", "args": [[{"date": "2025-01-01", "direction": "sale", "treatment": "exempt", "net": {"minor": 1000, "currency": "GBP"}, "vat": {"minor": 200, "currency": "GBP"}}], "2026-04-01", "2026-06-30"], "expectError": "transaction 1: exempt sales must have zero VAT"},
{"name": "an impossible tax point is refused", "args": [[{"date": "2026-02-30", "direction": "sale", "treatment": "taxable", "net": {"minor": 1000, "currency": "GBP"}, "vat": {"minor": 200, "currency": "GBP"}}], "2026-04-01", "2026-06-30"], "expectError": "not a real calendar date"}
]