[ { "name": "a claim's life: reserve, part payment, strengthening, an overpayment of the reserve, a recovery, closure", "args": [ [ { "date": "2026-01-10", "kind": "reserve", "amount": { "minor": 500000, "currency": "GBP" } }, { "date": "2026-02-01", "kind": "payment", "amount": { "minor": 150000, "currency": "GBP" } }, { "date": "2026-03-01", "kind": "reserve", "amount": { "minor": 450000, "currency": "GBP" } }, { "date": "2026-04-01", "kind": "payment", "amount": { "minor": 500000, "currency": "GBP" } }, { "date": "2026-05-01", "kind": "recovery", "amount": { "minor": 80000, "currency": "GBP" } }, { "date": "2026-05-01", "kind": "reserve", "amount": { "minor": 0, "currency": "GBP" } } ], "GBP" ], "expect": [ { "date": "2026-01-10", "kind": "reserve", "paid": { "minor": 0, "currency": "GBP" }, "recovered": { "minor": 0, "currency": "GBP" }, "outstanding": { "minor": 500000, "currency": "GBP" }, "incurred": { "minor": 500000, "currency": "GBP" }, "movement": { "minor": 500000, "currency": "GBP" } }, { "date": "2026-02-01", "kind": "payment", "paid": { "minor": 150000, "currency": "GBP" }, "recovered": { "minor": 0, "currency": "GBP" }, "outstanding": { "minor": 350000, "currency": "GBP" }, "incurred": { "minor": 500000, "currency": "GBP" }, "movement": { "minor": 0, "currency": "GBP" } }, { "date": "2026-03-01", "kind": "reserve", "paid": { "minor": 150000, "currency": "GBP" }, "recovered": { "minor": 0, "currency": "GBP" }, "outstanding": { "minor": 450000, "currency": "GBP" }, "incurred": { "minor": 600000, "currency": "GBP" }, "movement": { "minor": 100000, "currency": "GBP" } }, { "date": "2026-04-01", "kind": "payment", "paid": { "minor": 650000, "currency": "GBP" }, "recovered": { "minor": 0, "currency": "GBP" }, "outstanding": { "minor": 0, "currency": "GBP" }, "incurred": { "minor": 650000, "currency": "GBP" }, "movement": { "minor": 50000, "currency": "GBP" } }, { "date": "2026-05-01", "kind": "recovery", "paid": { "minor": 650000, "currency": "GBP" }, "recovered": { "minor": 80000, "currency": "GBP" }, "outstanding": { "minor": 0, "currency": "GBP" }, "incurred": { "minor": 570000, "currency": "GBP" }, "movement": { "minor": -80000, "currency": "GBP" } }, { "date": "2026-05-01", "kind": "reserve", "paid": { "minor": 650000, "currency": "GBP" }, "recovered": { "minor": 80000, "currency": "GBP" }, "outstanding": { "minor": 0, "currency": "GBP" }, "incurred": { "minor": 570000, "currency": "GBP" }, "movement": { "minor": 0, "currency": "GBP" } } ] }, { "name": "no transactions, no positions", "args": [ [], "GBP" ], "expect": [] }, { "name": "a claim withdrawn: the reserve released to nil is a negative movement", "args": [ [ { "date": "2026-01-10", "kind": "reserve", "amount": { "minor": 200000, "currency": "GBP" } }, { "date": "2026-06-30", "kind": "reserve", "amount": { "minor": 0, "currency": "GBP" } } ], "GBP" ], "expect": [ { "date": "2026-01-10", "kind": "reserve", "paid": { "minor": 0, "currency": "GBP" }, "recovered": { "minor": 0, "currency": "GBP" }, "outstanding": { "minor": 200000, "currency": "GBP" }, "incurred": { "minor": 200000, "currency": "GBP" }, "movement": { "minor": 200000, "currency": "GBP" } }, { "date": "2026-06-30", "kind": "reserve", "paid": { "minor": 0, "currency": "GBP" }, "recovered": { "minor": 0, "currency": "GBP" }, "outstanding": { "minor": 0, "currency": "GBP" }, "incurred": { "minor": 0, "currency": "GBP" }, "movement": { "minor": -200000, "currency": "GBP" } } ] }, { "name": "a payment with no reserve set raises incurred by the whole payment", "args": [ [ { "date": "2026-01-10", "kind": "payment", "amount": { "minor": 12345, "currency": "GBP" } } ], "GBP" ], "expect": [ { "date": "2026-01-10", "kind": "payment", "paid": { "minor": 12345, "currency": "GBP" }, "recovered": { "minor": 0, "currency": "GBP" }, "outstanding": { "minor": 0, "currency": "GBP" }, "incurred": { "minor": 12345, "currency": "GBP" }, "movement": { "minor": 12345, "currency": "GBP" } } ] }, { "name": "a payment within the reserve moves nothing", "args": [ [ { "date": "2026-01-10", "kind": "reserve", "amount": { "minor": 100000, "currency": "GBP" } }, { "date": "2026-01-11", "kind": "payment", "amount": { "minor": 100000, "currency": "GBP" } } ], "GBP" ], "expect": [ { "date": "2026-01-10", "kind": "reserve", "paid": { "minor": 0, "currency": "GBP" }, "recovered": { "minor": 0, "currency": "GBP" }, "outstanding": { "minor": 100000, "currency": "GBP" }, "incurred": { "minor": 100000, "currency": "GBP" }, "movement": { "minor": 100000, "currency": "GBP" } }, { "date": "2026-01-11", "kind": "payment", "paid": { "minor": 100000, "currency": "GBP" }, "recovered": { "minor": 0, "currency": "GBP" }, "outstanding": { "minor": 0, "currency": "GBP" }, "incurred": { "minor": 100000, "currency": "GBP" }, "movement": { "minor": 0, "currency": "GBP" } } ] }, { "name": "a reserve cut after a payment", "args": [ [ { "date": "2026-01-10", "kind": "reserve", "amount": { "minor": 100000, "currency": "GBP" } }, { "date": "2026-01-20", "kind": "payment", "amount": { "minor": 30000, "currency": "GBP" } }, { "date": "2026-02-01", "kind": "reserve", "amount": { "minor": 20000, "currency": "GBP" } } ], "GBP" ], "expect": [ { "date": "2026-01-10", "kind": "reserve", "paid": { "minor": 0, "currency": "GBP" }, "recovered": { "minor": 0, "currency": "GBP" }, "outstanding": { "minor": 100000, "currency": "GBP" }, "incurred": { "minor": 100000, "currency": "GBP" }, "movement": { "minor": 100000, "currency": "GBP" } }, { "date": "2026-01-20", "kind": "payment", "paid": { "minor": 30000, "currency": "GBP" }, "recovered": { "minor": 0, "currency": "GBP" }, "outstanding": { "minor": 70000, "currency": "GBP" }, "incurred": { "minor": 100000, "currency": "GBP" }, "movement": { "minor": 0, "currency": "GBP" } }, { "date": "2026-02-01", "kind": "reserve", "paid": { "minor": 30000, "currency": "GBP" }, "recovered": { "minor": 0, "currency": "GBP" }, "outstanding": { "minor": 20000, "currency": "GBP" }, "incurred": { "minor": 50000, "currency": "GBP" }, "movement": { "minor": -50000, "currency": "GBP" } } ] }, { "name": "recoveries can take incurred below zero on a claim recovered in full with costs", "args": [ [ { "date": "2026-01-10", "kind": "payment", "amount": { "minor": 1000, "currency": "GBP" } }, { "date": "2026-03-10", "kind": "recovery", "amount": { "minor": 1500, "currency": "GBP" } } ], "GBP" ], "expect": [ { "date": "2026-01-10", "kind": "payment", "paid": { "minor": 1000, "currency": "GBP" }, "recovered": { "minor": 0, "currency": "GBP" }, "outstanding": { "minor": 0, "currency": "GBP" }, "incurred": { "minor": 1000, "currency": "GBP" }, "movement": { "minor": 1000, "currency": "GBP" } }, { "date": "2026-03-10", "kind": "recovery", "paid": { "minor": 1000, "currency": "GBP" }, "recovered": { "minor": 1500, "currency": "GBP" }, "outstanding": { "minor": 0, "currency": "GBP" }, "incurred": { "minor": -500, "currency": "GBP" }, "movement": { "minor": -1500, "currency": "GBP" } } ] }, { "name": "transactions out of date order are refused", "args": [ [ { "date": "2026-02-01", "kind": "reserve", "amount": { "minor": 100, "currency": "GBP" } }, { "date": "2026-01-01", "kind": "payment", "amount": { "minor": 50, "currency": "GBP" } } ], "GBP" ], "expectError": "transactions must be in date order: 2026-01-01 comes after 2026-02-01" }, { "name": "a negative reserve is refused", "args": [ [ { "date": "2026-02-01", "kind": "reserve", "amount": { "minor": -100, "currency": "GBP" } } ], "GBP" ], "expectError": "a reserve must not be negative" }, { "name": "a zero payment is refused", "args": [ [ { "date": "2026-02-01", "kind": "payment", "amount": { "minor": 0, "currency": "GBP" } } ], "GBP" ], "expectError": "a payment must be more than zero" }, { "name": "a negative recovery is refused", "args": [ [ { "date": "2026-02-01", "kind": "recovery", "amount": { "minor": -5, "currency": "GBP" } } ], "GBP" ], "expectError": "a recovery must be more than zero" }, { "name": "an unknown kind is refused", "args": [ [ { "date": "2026-02-01", "kind": "expense", "amount": { "minor": 5, "currency": "GBP" } } ], "GBP" ], "expectError": "unknown transaction kind" }, { "name": "a transaction in another currency is refused", "args": [ [ { "date": "2026-02-01", "kind": "reserve", "amount": { "minor": 5, "currency": "EUR" } } ], "GBP" ], "expectError": "currency mismatch" }, { "name": "a malformed date is refused", "args": [ [ { "date": "2026-02-30", "kind": "reserve", "amount": { "minor": 5, "currency": "GBP" } } ], "GBP" ], "expectError": "is not a real calendar date" } ]