[ { "name": "2,000 on account pays the first bill and part of the second", "args": [ { "minor": 200000, "currency": "GBP" }, [ { "reference": "INV-1", "amount": { "minor": 120000, "currency": "GBP" } }, { "reference": "INV-2", "amount": { "minor": 150000, "currency": "GBP" } } ] ], "expect": { "bills": [ { "reference": "INV-1", "billed": { "minor": 120000, "currency": "GBP" }, "applied": { "minor": 120000, "currency": "GBP" }, "outstanding": { "minor": 0, "currency": "GBP" } }, { "reference": "INV-2", "billed": { "minor": 150000, "currency": "GBP" }, "applied": { "minor": 80000, "currency": "GBP" }, "outstanding": { "minor": 70000, "currency": "GBP" } } ], "applied": { "minor": 200000, "currency": "GBP" }, "outstanding": { "minor": 70000, "currency": "GBP" }, "balance": { "minor": 0, "currency": "GBP" } } }, { "name": "more on account than billed leaves a balance", "args": [ { "minor": 500000, "currency": "GBP" }, [ { "reference": "INV-1", "amount": { "minor": 120000, "currency": "GBP" } }, { "reference": "INV-2", "amount": { "minor": 150000, "currency": "GBP" } } ] ], "expect": { "bills": [ { "reference": "INV-1", "billed": { "minor": 120000, "currency": "GBP" }, "applied": { "minor": 120000, "currency": "GBP" }, "outstanding": { "minor": 0, "currency": "GBP" } }, { "reference": "INV-2", "billed": { "minor": 150000, "currency": "GBP" }, "applied": { "minor": 150000, "currency": "GBP" }, "outstanding": { "minor": 0, "currency": "GBP" } } ], "applied": { "minor": 270000, "currency": "GBP" }, "outstanding": { "minor": 0, "currency": "GBP" }, "balance": { "minor": 230000, "currency": "GBP" } } }, { "name": "exactly enough leaves nothing either way", "args": [ { "minor": 270000, "currency": "GBP" }, [ { "reference": "INV-1", "amount": { "minor": 120000, "currency": "GBP" } }, { "reference": "INV-2", "amount": { "minor": 150000, "currency": "GBP" } } ] ], "expect": { "bills": [ { "reference": "INV-1", "billed": { "minor": 120000, "currency": "GBP" }, "applied": { "minor": 120000, "currency": "GBP" }, "outstanding": { "minor": 0, "currency": "GBP" } }, { "reference": "INV-2", "billed": { "minor": 150000, "currency": "GBP" }, "applied": { "minor": 150000, "currency": "GBP" }, "outstanding": { "minor": 0, "currency": "GBP" } } ], "applied": { "minor": 270000, "currency": "GBP" }, "outstanding": { "minor": 0, "currency": "GBP" }, "balance": { "minor": 0, "currency": "GBP" } } }, { "name": "the order decides which bill is paid: newest first here", "args": [ { "minor": 200000, "currency": "GBP" }, [ { "reference": "INV-2", "amount": { "minor": 150000, "currency": "GBP" } }, { "reference": "INV-1", "amount": { "minor": 120000, "currency": "GBP" } } ] ], "expect": { "bills": [ { "reference": "INV-2", "billed": { "minor": 150000, "currency": "GBP" }, "applied": { "minor": 150000, "currency": "GBP" }, "outstanding": { "minor": 0, "currency": "GBP" } }, { "reference": "INV-1", "billed": { "minor": 120000, "currency": "GBP" }, "applied": { "minor": 50000, "currency": "GBP" }, "outstanding": { "minor": 70000, "currency": "GBP" } } ], "applied": { "minor": 200000, "currency": "GBP" }, "outstanding": { "minor": 70000, "currency": "GBP" }, "balance": { "minor": 0, "currency": "GBP" } } }, { "name": "nothing on account pays nothing", "args": [ { "minor": 0, "currency": "GBP" }, [ { "reference": "INV-1", "amount": { "minor": 9999, "currency": "GBP" } } ] ], "expect": { "bills": [ { "reference": "INV-1", "billed": { "minor": 9999, "currency": "GBP" }, "applied": { "minor": 0, "currency": "GBP" }, "outstanding": { "minor": 9999, "currency": "GBP" } } ], "applied": { "minor": 0, "currency": "GBP" }, "outstanding": { "minor": 9999, "currency": "GBP" }, "balance": { "minor": 0, "currency": "GBP" } } }, { "name": "no bills keep all the money on account", "args": [ { "minor": 75000, "currency": "EUR" }, [] ], "expect": { "bills": [], "applied": { "minor": 0, "currency": "EUR" }, "outstanding": { "minor": 0, "currency": "EUR" }, "balance": { "minor": 75000, "currency": "EUR" } } }, { "name": "a zero bill takes nothing and does not stop later bills being paid", "args": [ { "minor": 100, "currency": "GBP" }, [ { "reference": "NIL", "amount": { "minor": 0, "currency": "GBP" } }, { "reference": "INV-1", "amount": { "minor": 60, "currency": "GBP" } }, { "reference": "INV-2", "amount": { "minor": 60, "currency": "GBP" } } ] ], "expect": { "bills": [ { "reference": "NIL", "billed": { "minor": 0, "currency": "GBP" }, "applied": { "minor": 0, "currency": "GBP" }, "outstanding": { "minor": 0, "currency": "GBP" } }, { "reference": "INV-1", "billed": { "minor": 60, "currency": "GBP" }, "applied": { "minor": 60, "currency": "GBP" }, "outstanding": { "minor": 0, "currency": "GBP" } }, { "reference": "INV-2", "billed": { "minor": 60, "currency": "GBP" }, "applied": { "minor": 40, "currency": "GBP" }, "outstanding": { "minor": 20, "currency": "GBP" } } ], "applied": { "minor": 100, "currency": "GBP" }, "outstanding": { "minor": 20, "currency": "GBP" }, "balance": { "minor": 0, "currency": "GBP" } } }, { "name": "a single penny short", "args": [ { "minor": 99999, "currency": "GBP" }, [ { "reference": "INV-1", "amount": { "minor": 100000, "currency": "GBP" } } ] ], "expect": { "bills": [ { "reference": "INV-1", "billed": { "minor": 100000, "currency": "GBP" }, "applied": { "minor": 99999, "currency": "GBP" }, "outstanding": { "minor": 1, "currency": "GBP" } } ], "applied": { "minor": 99999, "currency": "GBP" }, "outstanding": { "minor": 1, "currency": "GBP" }, "balance": { "minor": 0, "currency": "GBP" } } }, { "name": "a negative amount on account is an error", "args": [ { "minor": -1, "currency": "GBP" }, [] ], "expectError": "onAccount must not be negative" }, { "name": "a credit note passed as a bill is an error", "args": [ { "minor": 1000, "currency": "GBP" }, [ { "reference": "CN-1", "amount": { "minor": -500, "currency": "GBP" } } ] ], "expectError": "bill \"CN-1\" must not be negative" }, { "name": "a bill in another currency is an error", "args": [ { "minor": 1000, "currency": "GBP" }, [ { "reference": "INV-1", "amount": { "minor": 500, "currency": "EUR" } } ] ], "expectError": "currency mismatch" } ]