Functional Weave
Code in TypeScript

charity.reclaim-batch@1.0.1

vectors.json

15,098 bytes · view raw

[
  {"name": "a mixed batch: donor lines, £20-or-less gifts aggregated, every exclusion named", "args": [[{"id": "d1", "donorId": "A", "date": "2026-05-01", "amount": {"minor": 5000, "currency": "GBP"}, "hasDeclaration": true}, {"id": "d2", "donorId": "A", "date": "2026-06-01", "amount": {"minor": 5000, "currency": "GBP"}, "hasDeclaration": true}, {"id": "d3", "donorId": "B", "date": "2026-05-10", "amount": {"minor": 1000, "currency": "GBP"}, "hasDeclaration": true}, {"id": "d4", "donorId": "C", "date": "2026-05-09", "amount": {"minor": 2000, "currency": "GBP"}, "hasDeclaration": true}, {"id": "d5", "donorId": "C", "date": "2026-07-01", "amount": {"minor": 2001, "currency": "GBP"}, "hasDeclaration": true}, {"id": "d6", "donorId": "D", "date": "2026-05-01", "amount": {"minor": 10000, "currency": "GBP"}, "hasDeclaration": false}, {"id": "d7", "donorId": null, "date": "2026-06-01", "amount": {"minor": 500, "currency": "GBP"}, "hasDeclaration": true}, {"id": "d8", "donorId": "E", "date": "2025-12-01", "amount": {"minor": 3000, "currency": "GBP"}, "hasDeclaration": true}, {"id": "d9", "donorId": "B", "date": "2026-08-01", "amount": {"minor": 0, "currency": "GBP"}, "hasDeclaration": true}], "2026-04-06", "2027-04-05", true], "expect": {"lines": [{"kind": "donor", "donorId": "A", "lastDate": "2026-06-01", "count": 2, "total": {"minor": 10000, "currency": "GBP"}}, {"kind": "donor", "donorId": "C", "lastDate": "2026-07-01", "count": 1, "total": {"minor": 2001, "currency": "GBP"}}, {"kind": "aggregated", "donorId": null, "lastDate": "2026-05-10", "count": 2, "total": {"minor": 3000, "currency": "GBP"}}], "eligibleCount": 5, "eligibleTotal": {"minor": 15001, "currency": "GBP"}, "claimable": {"minor": 3750, "currency": "GBP"}, "excluded": [{"id": "d6", "reason": "no-declaration"}, {"id": "d7", "reason": "no-donor"}, {"id": "d8", "reason": "outside-period"}, {"id": "d9", "reason": "not-positive"}]}},
  {"name": "the same batch without aggregation: every eligible gift on its donor's line", "args": [[{"id": "d1", "donorId": "A", "date": "2026-05-01", "amount": {"minor": 5000, "currency": "GBP"}, "hasDeclaration": true}, {"id": "d2", "donorId": "A", "date": "2026-06-01", "amount": {"minor": 5000, "currency": "GBP"}, "hasDeclaration": true}, {"id": "d3", "donorId": "B", "date": "2026-05-10", "amount": {"minor": 1000, "currency": "GBP"}, "hasDeclaration": true}, {"id": "d4", "donorId": "C", "date": "2026-05-09", "amount": {"minor": 2000, "currency": "GBP"}, "hasDeclaration": true}, {"id": "d5", "donorId": "C", "date": "2026-07-01", "amount": {"minor": 2001, "currency": "GBP"}, "hasDeclaration": true}, {"id": "d6", "donorId": "D", "date": "2026-05-01", "amount": {"minor": 10000, "currency": "GBP"}, "hasDeclaration": false}, {"id": "d7", "donorId": null, "date": "2026-06-01", "amount": {"minor": 500, "currency": "GBP"}, "hasDeclaration": true}, {"id": "d8", "donorId": "E", "date": "2025-12-01", "amount": {"minor": 3000, "currency": "GBP"}, "hasDeclaration": true}, {"id": "d9", "donorId": "B", "date": "2026-08-01", "amount": {"minor": 0, "currency": "GBP"}, "hasDeclaration": true}], "2026-04-06", "2027-04-05", false], "expect": {"lines": [{"kind": "donor", "donorId": "A", "lastDate": "2026-06-01", "count": 2, "total": {"minor": 10000, "currency": "GBP"}}, {"kind": "donor", "donorId": "B", "lastDate": "2026-05-10", "count": 1, "total": {"minor": 1000, "currency": "GBP"}}, {"kind": "donor", "donorId": "C", "lastDate": "2026-07-01", "count": 2, "total": {"minor": 4001, "currency": "GBP"}}], "eligibleCount": 5, "eligibleTotal": {"minor": 15001, "currency": "GBP"}, "claimable": {"minor": 3750, "currency": "GBP"}, "excluded": [{"id": "d6", "reason": "no-declaration"}, {"id": "d7", "reason": "no-donor"}, {"id": "d8", "reason": "outside-period"}, {"id": "d9", "reason": "not-positive"}]}},
  {"name": "an aggregated line stops at £1,000: 51 gifts of £20 make a full line of 50 and a line of 1", "args": [[{"id": "s00", "donorId": "P00", "date": "2026-06-01", "amount": {"minor": 2000, "currency": "GBP"}, "hasDeclaration": true}, {"id": "s01", "donorId": "P01", "date": "2026-06-02", "amount": {"minor": 2000, "currency": "GBP"}, "hasDeclaration": true}, {"id": "s02", "donorId": "P02", "date": "2026-06-03", "amount": {"minor": 2000, "currency": "GBP"}, "hasDeclaration": true}, {"id": "s03", "donorId": "P03", "date": "2026-06-04", "amount": {"minor": 2000, "currency": "GBP"}, "hasDeclaration": true}, {"id": "s04", "donorId": "P04", "date": "2026-06-05", "amount": {"minor": 2000, "currency": "GBP"}, "hasDeclaration": true}, {"id": "s05", "donorId": "P05", "date": "2026-06-06", "amount": {"minor": 2000, "currency": "GBP"}, "hasDeclaration": true}, {"id": "s06", "donorId": "P06", "date": "2026-06-07", "amount": {"minor": 2000, "currency": "GBP"}, "hasDeclaration": true}, {"id": "s07", "donorId": "P07", "date": "2026-06-08", "amount": {"minor": 2000, "currency": "GBP"}, "hasDeclaration": true}, {"id": "s08", "donorId": "P08", "date": "2026-06-09", "amount": {"minor": 2000, "currency": "GBP"}, "hasDeclaration": true}, {"id": "s09", "donorId": "P09", "date": "2026-06-10", "amount": {"minor": 2000, "currency": "GBP"}, "hasDeclaration": true}, {"id": "s10", "donorId": "P10", "date": "2026-06-11", "amount": {"minor": 2000, "currency": "GBP"}, "hasDeclaration": true}, {"id": "s11", "donorId": "P11", "date": "2026-06-12", "amount": {"minor": 2000, "currency": "GBP"}, "hasDeclaration": true}, {"id": "s12", "donorId": "P12", "date": "2026-06-13", "amount": {"minor": 2000, "currency": "GBP"}, "hasDeclaration": true}, {"id": "s13", "donorId": "P13", "date": "2026-06-14", "amount": {"minor": 2000, "currency": "GBP"}, "hasDeclaration": true}, {"id": "s14", "donorId": "P14", "date": "2026-06-15", "amount": {"minor": 2000, "currency": "GBP"}, "hasDeclaration": true}, {"id": "s15", "donorId": "P15", "date": "2026-06-16", "amount": {"minor": 2000, "currency": "GBP"}, "hasDeclaration": true}, {"id": "s16", "donorId": "P16", "date": "2026-06-17", "amount": {"minor": 2000, "currency": "GBP"}, "hasDeclaration": true}, {"id": "s17", "donorId": "P17", "date": "2026-06-18", "amount": {"minor": 2000, "currency": "GBP"}, "hasDeclaration": true}, {"id": "s18", "donorId": "P18", "date": "2026-06-19", "amount": {"minor": 2000, "currency": "GBP"}, "hasDeclaration": true}, {"id": "s19", "donorId": "P19", "date": "2026-06-20", "amount": {"minor": 2000, "currency": "GBP"}, "hasDeclaration": true}, {"id": "s20", "donorId": "P20", "date": "2026-06-21", "amount": {"minor": 2000, "currency": "GBP"}, "hasDeclaration": true}, {"id": "s21", "donorId": "P21", "date": "2026-06-22", "amount": {"minor": 2000, "currency": "GBP"}, "hasDeclaration": true}, {"id": "s22", "donorId": "P22", "date": "2026-06-23", "amount": {"minor": 2000, "currency": "GBP"}, "hasDeclaration": true}, {"id": "s23", "donorId": "P23", "date": "2026-06-24", "amount": {"minor": 2000, "currency": "GBP"}, "hasDeclaration": true}, {"id": "s24", "donorId": "P24", "date": "2026-06-25", "amount": {"minor": 2000, "currency": "GBP"}, "hasDeclaration": true}, {"id": "s25", "donorId": "P25", "date": "2026-06-26", "amount": {"minor": 2000, "currency": "GBP"}, "hasDeclaration": true}, {"id": "s26", "donorId": "P26", "date": "2026-06-27", "amount": {"minor": 2000, "currency": "GBP"}, "hasDeclaration": true}, {"id": "s27", "donorId": "P27", "date": "2026-06-28", "amount": {"minor": 2000, "currency": "GBP"}, "hasDeclaration": true}, {"id": "s28", "donorId": "P28", "date": "2026-06-01", "amount": {"minor": 2000, "currency": "GBP"}, "hasDeclaration": true}, {"id": "s29", "donorId": "P29", "date": "2026-06-02", "amount": {"minor": 2000, "currency": "GBP"}, "hasDeclaration": true}, {"id": "s30", "donorId": "P30", "date": "2026-06-03", "amount": {"minor": 2000, "currency": "GBP"}, "hasDeclaration": true}, {"id": "s31", "donorId": "P31", "date": "2026-06-04", "amount": {"minor": 2000, "currency": "GBP"}, "hasDeclaration": true}, {"id": "s32", "donorId": "P32", "date": "2026-06-05", "amount": {"minor": 2000, "currency": "GBP"}, "hasDeclaration": true}, {"id": "s33", "donorId": "P33", "date": "2026-06-06", "amount": {"minor": 2000, "currency": "GBP"}, "hasDeclaration": true}, {"id": "s34", "donorId": "P34", "date": "2026-06-07", "amount": {"minor": 2000, "currency": "GBP"}, "hasDeclaration": true}, {"id": "s35", "donorId": "P35", "date": "2026-06-08", "amount": {"minor": 2000, "currency": "GBP"}, "hasDeclaration": true}, {"id": "s36", "donorId": "P36", "date": "2026-06-09", "amount": {"minor": 2000, "currency": "GBP"}, "hasDeclaration": true}, {"id": "s37", "donorId": "P37", "date": "2026-06-10", "amount": {"minor": 2000, "currency": "GBP"}, "hasDeclaration": true}, {"id": "s38", "donorId": "P38", "date": "2026-06-11", "amount": {"minor": 2000, "currency": "GBP"}, "hasDeclaration": true}, {"id": "s39", "donorId": "P39", "date": "2026-06-12", "amount": {"minor": 2000, "currency": "GBP"}, "hasDeclaration": true}, {"id": "s40", "donorId": "P40", "date": "2026-06-13", "amount": {"minor": 2000, "currency": "GBP"}, "hasDeclaration": true}, {"id": "s41", "donorId": "P41", "date": "2026-06-14", "amount": {"minor": 2000, "currency": "GBP"}, "hasDeclaration": true}, {"id": "s42", "donorId": "P42", "date": "2026-06-15", "amount": {"minor": 2000, "currency": "GBP"}, "hasDeclaration": true}, {"id": "s43", "donorId": "P43", "date": "2026-06-16", "amount": {"minor": 2000, "currency": "GBP"}, "hasDeclaration": true}, {"id": "s44", "donorId": "P44", "date": "2026-06-17", "amount": {"minor": 2000, "currency": "GBP"}, "hasDeclaration": true}, {"id": "s45", "donorId": "P45", "date": "2026-06-18", "amount": {"minor": 2000, "currency": "GBP"}, "hasDeclaration": true}, {"id": "s46", "donorId": "P46", "date": "2026-06-19", "amount": {"minor": 2000, "currency": "GBP"}, "hasDeclaration": true}, {"id": "s47", "donorId": "P47", "date": "2026-06-20", "amount": {"minor": 2000, "currency": "GBP"}, "hasDeclaration": true}, {"id": "s48", "donorId": "P48", "date": "2026-06-21", "amount": {"minor": 2000, "currency": "GBP"}, "hasDeclaration": true}, {"id": "s49", "donorId": "P49", "date": "2026-06-22", "amount": {"minor": 2000, "currency": "GBP"}, "hasDeclaration": true}, {"id": "s50", "donorId": "P50", "date": "2026-06-23", "amount": {"minor": 2000, "currency": "GBP"}, "hasDeclaration": true}], "2026-04-06", "2027-04-05", true], "expect": {"lines": [{"kind": "aggregated", "donorId": null, "lastDate": "2026-06-27", "count": 50, "total": {"minor": 100000, "currency": "GBP"}}, {"kind": "aggregated", "donorId": null, "lastDate": "2026-06-28", "count": 1, "total": {"minor": 2000, "currency": "GBP"}}], "eligibleCount": 51, "eligibleTotal": {"minor": 102000, "currency": "GBP"}, "claimable": {"minor": 25500, "currency": "GBP"}, "excluded": []}},
  {"name": "a claim across 5 April 2008 uses 22% before it and 20% after", "args": [[{"id": "a", "donorId": "A", "date": "2008-03-01", "amount": {"minor": 7800, "currency": "GBP"}, "hasDeclaration": true}, {"id": "b", "donorId": "A", "date": "2008-05-01", "amount": {"minor": 10000, "currency": "GBP"}, "hasDeclaration": true}], "2008-01-01", "2008-12-31", false], "expect": {"lines": [{"kind": "donor", "donorId": "A", "lastDate": "2008-05-01", "count": 2, "total": {"minor": 17800, "currency": "GBP"}}], "eligibleCount": 2, "eligibleTotal": {"minor": 17800, "currency": "GBP"}, "claimable": {"minor": 4700, "currency": "GBP"}, "excluded": []}},
  {"name": "the tax is worked out on the year's total: £10.01 and £10.03 give 501p, not 250p + 250p", "args": [[{"id": "a", "donorId": "X", "date": "2026-05-01", "amount": {"minor": 1001, "currency": "GBP"}, "hasDeclaration": true}, {"id": "b", "donorId": "Y", "date": "2026-05-02", "amount": {"minor": 1003, "currency": "GBP"}, "hasDeclaration": true}], "2026-04-06", "2027-04-05", false], "expect": {"lines": [{"kind": "donor", "donorId": "X", "lastDate": "2026-05-01", "count": 1, "total": {"minor": 1001, "currency": "GBP"}}, {"kind": "donor", "donorId": "Y", "lastDate": "2026-05-02", "count": 1, "total": {"minor": 1003, "currency": "GBP"}}], "eligibleCount": 2, "eligibleTotal": {"minor": 2004, "currency": "GBP"}, "claimable": {"minor": 501, "currency": "GBP"}, "excluded": []}},
  {"name": "donor lines are ordered by donor id, not by input order", "args": [[{"id": "a", "donorId": "Zed", "date": "2026-05-01", "amount": {"minor": 5000, "currency": "GBP"}, "hasDeclaration": true}, {"id": "b", "donorId": "Amy", "date": "2026-05-02", "amount": {"minor": 5000, "currency": "GBP"}, "hasDeclaration": true}], "2026-04-06", "2027-04-05", true], "expect": {"lines": [{"kind": "donor", "donorId": "Amy", "lastDate": "2026-05-02", "count": 1, "total": {"minor": 5000, "currency": "GBP"}}, {"kind": "donor", "donorId": "Zed", "lastDate": "2026-05-01", "count": 1, "total": {"minor": 5000, "currency": "GBP"}}], "eligibleCount": 2, "eligibleTotal": {"minor": 10000, "currency": "GBP"}, "claimable": {"minor": 2500, "currency": "GBP"}, "excluded": []}},
  {"name": "the period bounds are inclusive", "args": [[{"id": "a", "donorId": "A", "date": "2026-04-06", "amount": {"minor": 5000, "currency": "GBP"}, "hasDeclaration": true}, {"id": "b", "donorId": "A", "date": "2027-04-05", "amount": {"minor": 5000, "currency": "GBP"}, "hasDeclaration": true}, {"id": "c", "donorId": "A", "date": "2027-04-06", "amount": {"minor": 5000, "currency": "GBP"}, "hasDeclaration": true}], "2026-04-06", "2027-04-05", false], "expect": {"lines": [{"kind": "donor", "donorId": "A", "lastDate": "2027-04-05", "count": 2, "total": {"minor": 10000, "currency": "GBP"}}], "eligibleCount": 2, "eligibleTotal": {"minor": 10000, "currency": "GBP"}, "claimable": {"minor": 2500, "currency": "GBP"}, "excluded": [{"id": "c", "reason": "outside-period"}]}},
  {"name": "an empty batch claims nothing", "args": [[], "2026-04-06", "2027-04-05", true], "expect": {"lines": [], "eligibleCount": 0, "eligibleTotal": {"minor": 0, "currency": "GBP"}, "claimable": {"minor": 0, "currency": "GBP"}, "excluded": []}},
  {"name": "a duplicate donation id is an error", "args": [[{"id": "a", "donorId": "A", "date": "2026-05-01", "amount": {"minor": 100, "currency": "GBP"}, "hasDeclaration": true}, {"id": "a", "donorId": "B", "date": "2026-05-02", "amount": {"minor": 100, "currency": "GBP"}, "hasDeclaration": true}], "2026-04-06", "2027-04-05", true], "expectError": "duplicate donation id \"a\""},
  {"name": "a period that ends before it starts is an error", "args": [[], "2027-04-05", "2026-04-06", true], "expectError": "periodEnd 2026-04-06 is before periodStart 2027-04-05"},
  {"name": "a euro donation is an error", "args": [[{"id": "a", "donorId": "A", "date": "2026-05-01", "amount": {"minor": 100, "currency": "EUR"}, "hasDeclaration": true}], "2026-04-06", "2027-04-05", true], "expectError": "donation \"a\" must be in GBP, received EUR"},
  {"name": "a malformed donation date is an error", "args": [[{"id": "a", "donorId": "A", "date": "2026-5-1", "amount": {"minor": 100, "currency": "GBP"}, "hasDeclaration": true}], "2026-04-06", "2027-04-05", true], "expectError": "is not an ISO date"}
]