[
{
"name": "a typical quarter: 75% utilised, 90% billed, 95% collected, 85.5% overall",
"args": [
6000,
8000,
{
"minor": 1000000,
"currency": "GBP"
},
{
"minor": 900000,
"currency": "GBP"
},
{
"minor": 855000,
"currency": "GBP"
}
],
"expect": {
"utilisationBasisPoints": 7500,
"billingRealisationBasisPoints": 9000,
"collectionRealisationBasisPoints": 9500,
"overallRealisationBasisPoints": 8550
}
},
{
"name": "a third rounds down to 3333 basis points",
"args": [
1,
3,
{
"minor": 300,
"currency": "GBP"
},
{
"minor": 100,
"currency": "GBP"
},
{
"minor": 100,
"currency": "GBP"
}
],
"expect": {
"utilisationBasisPoints": 3333,
"billingRealisationBasisPoints": 3333,
"collectionRealisationBasisPoints": 10000,
"overallRealisationBasisPoints": 3333
}
},
{
"name": "two thirds rounds up to 6667 basis points",
"args": [
2,
3,
{
"minor": 3,
"currency": "GBP"
},
{
"minor": 2,
"currency": "GBP"
},
{
"minor": 2,
"currency": "GBP"
}
],
"expect": {
"utilisationBasisPoints": 6667,
"billingRealisationBasisPoints": 6667,
"collectionRealisationBasisPoints": 10000,
"overallRealisationBasisPoints": 6667
}
},
{
"name": "exactly half a basis point rounds up, where truncating gives 0",
"args": [
1,
20000,
{
"minor": 20000,
"currency": "GBP"
},
{
"minor": 1,
"currency": "GBP"
},
{
"minor": 1,
"currency": "GBP"
}
],
"expect": {
"utilisationBasisPoints": 1,
"billingRealisationBasisPoints": 1,
"collectionRealisationBasisPoints": 10000,
"overallRealisationBasisPoints": 1
}
},
{
"name": "time beyond contracted hours and premium billing both exceed 100%",
"args": [
9000,
8000,
{
"minor": 1000000,
"currency": "GBP"
},
{
"minor": 1100000,
"currency": "GBP"
},
{
"minor": 1100000,
"currency": "GBP"
}
],
"expect": {
"utilisationBasisPoints": 11250,
"billingRealisationBasisPoints": 11000,
"collectionRealisationBasisPoints": 10000,
"overallRealisationBasisPoints": 11000
}
},
{
"name": "no billable time is 0% utilisation",
"args": [
0,
7500,
{
"minor": 0,
"currency": "GBP"
},
{
"minor": 0,
"currency": "GBP"
},
{
"minor": 0,
"currency": "GBP"
}
],
"expect": {
"utilisationBasisPoints": 0,
"billingRealisationBasisPoints": null,
"collectionRealisationBasisPoints": null,
"overallRealisationBasisPoints": null
}
},
{
"name": "nothing billed: collection realisation is null, not 0%",
"args": [
600,
1000,
{
"minor": 50000,
"currency": "GBP"
},
{
"minor": 0,
"currency": "GBP"
},
{
"minor": 0,
"currency": "GBP"
}
],
"expect": {
"utilisationBasisPoints": 6000,
"billingRealisationBasisPoints": 0,
"collectionRealisationBasisPoints": null,
"overallRealisationBasisPoints": 0
}
},
{
"name": "no standard value: billing and overall realisation are null",
"args": [
600,
1000,
{
"minor": 0,
"currency": "GBP"
},
{
"minor": 5000,
"currency": "GBP"
},
{
"minor": 5000,
"currency": "GBP"
}
],
"expect": {
"utilisationBasisPoints": 6000,
"billingRealisationBasisPoints": null,
"collectionRealisationBasisPoints": 10000,
"overallRealisationBasisPoints": null
}
},
{
"name": "in euros, part collected",
"args": [
4200,
6000,
{
"minor": 250000,
"currency": "EUR"
},
{
"minor": 200000,
"currency": "EUR"
},
{
"minor": 150000,
"currency": "EUR"
}
],
"expect": {
"utilisationBasisPoints": 7000,
"billingRealisationBasisPoints": 8000,
"collectionRealisationBasisPoints": 7500,
"overallRealisationBasisPoints": 6000
}
},
{
"name": "no available time is an error",
"args": [
0,
0,
{
"minor": 0,
"currency": "GBP"
},
{
"minor": 0,
"currency": "GBP"
},
{
"minor": 0,
"currency": "GBP"
}
],
"expectError": "availableMinutes must be greater than zero"
},
{
"name": "negative billable time is an error",
"args": [
-60,
1000,
{
"minor": 0,
"currency": "GBP"
},
{
"minor": 0,
"currency": "GBP"
},
{
"minor": 0,
"currency": "GBP"
}
],
"expectError": "billableMinutes must be a non-negative integer"
},
{
"name": "mixed currencies are an error",
"args": [
60,
1000,
{
"minor": 100,
"currency": "GBP"
},
{
"minor": 100,
"currency": "EUR"
},
{
"minor": 100,
"currency": "GBP"
}
],
"expectError": "currency mismatch"
},
{
"name": "a negative collected amount is an error",
"args": [
60,
1000,
{
"minor": 100,
"currency": "GBP"
},
{
"minor": 100,
"currency": "GBP"
},
{
"minor": -1,
"currency": "GBP"
}
],
"expectError": "collectedValue must not be negative"
}
]