[
{
"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"
}
]