supplyType = 'goods' ? (annualTurnover > $const.registrationThresholdGoodsMajore ? 'immediately' : annualTurnover > $const.registrationThresholdGoods ? '1 January next year' : 'not required') : (annualTurnover > $const.registrationThresholdServicesMajore ? 'immediately' : annualTurnover > $const.registrationThresholdServices ? '1 January next year' : 'not required')
Rates and thresholds
The expressions above read these as $const. They are the figures the annual refresh replaces, so they live as data rather than being written into the formulas — which is what makes a year-on-year change a one-line diff instead of an edit to arithmetic.
Constant
Value
standardRate
0.2
superReducedRate
0.021
reducedRate1
0.055
reducedRate2
0.1
registrationThresholdGoods
85000
registrationThresholdGoodsMajore
93500
registrationThresholdServices
37500
registrationThresholdServicesMajore
41250
Test vectors (11)
Every case is executed against this model on each build, by the Java engine and independently by a JavaScript one. A mismatch of a single cent fails the build, so the page cannot ship advertising a figure the model no longer produces.
Case 1 — S1 100.00 EUR net at the taux normal
given amount
100
given direction
add
given category
standard
given reverseCharge
no
given annualTurnover
0
given supplyType
goods
expect vatAmount
20
expect grossAmount
120
expect netAmount
100
Case 2 — S2 120.00 EUR gross back to net at 20%
given amount
120
given direction
remove
given category
standard
given reverseCharge
no
given annualTurnover
0
given supplyType
goods
expect netAmount
100
expect vatAmount
20
Case 3 — S3 100.00 EUR net at the 10% taux intermediaire
given amount
100
given direction
add
given category
reduced2
given reverseCharge
no
given annualTurnover
0
given supplyType
goods
expect vatAmount
10
expect grossAmount
110
Case 4 — S4 200.00 EUR net at the 5,5% taux reduit
given amount
200
given direction
add
given category
reduced1
given reverseCharge
no
given annualTurnover
0
given supplyType
goods
expect vatAmount
11
expect grossAmount
211
Case 5 — S5 1000.00 EUR net of press at 2,1%
given amount
1000
given direction
add
given category
superReduced
given reverseCharge
no
given annualTurnover
0
given supplyType
goods
expect vatAmount
21
expect grossAmount
1021
Case 6 — S6 goods under the base limit: franchise stands
given amount
100
given direction
add
given category
standard
given reverseCharge
no
given annualTurnover
80000
given supplyType
goods
expect mustRegister
false
expect payerFrom
not required
Case 7 — S7 goods between base and majore: TVA from next January
given amount
100
given direction
add
given category
standard
given reverseCharge
no
given annualTurnover
90000
given supplyType
goods
expect mustRegister
true
expect payerFrom
1 January next year
Case 8 — S8 goods over the majore limit: TVA immediately
given amount
100
given direction
add
given category
standard
given reverseCharge
no
given annualTurnover
95000
given supplyType
goods
expect mustRegister
true
expect payerFrom
immediately
Case 9 — S9 services between base and majore: the lower pair applies
given amount
100
given direction
add
given category
standard
given reverseCharge
no
given annualTurnover
40000
given supplyType
services
expect mustRegister
true
expect payerFrom
1 January next year
Case 10 — S10 services over the majore limit
given amount
100
given direction
add
given category
standard
given reverseCharge
no
given annualTurnover
42000
given supplyType
services
expect mustRegister
true
expect payerFrom
immediately
Case 11 — S11 services turnover that would be safe for goods
The whole model as JSON — inputs, outputs, formulas, vectors and sources in one re-runnable document.
This model is published under CC BY 4.0: use it, adapt it, build on it, with attribution. The licence covers the model — the expression of each rule and the arrangement of the catalog. The rates and thresholds are law, and nobody licenses those; the sources above are where they come from.