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
bracket1Ceiling
498122
bracket2Ceiling
1398450
rateBracket1
0.3149
rateBracket2
0.3799
rateBracket3
0.4629
personalCreditMonthly
72492
pensionRate
0.04
supplementaryPensionCap
0.04
Test vectors (5)
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 — I1 700,000 kr a month: two brackets, then the credit
given grossMonthly
700000
given supplementaryPensionPct
0
expect pensionPremium
28000
expect taxBase
672000
expect taxBeforeCredit
222914.87
expect withholdingTax
150423
expect netMonthly
521577
Case 2 — I2 300,000 kr: first bracket only
given grossMonthly
300000
given supplementaryPensionPct
0
expect taxBase
288000
expect withholdingTax
18199
expect netMonthly
269801
Case 3 — I3 200,000 kr: the personal credit wipes out the tax
given grossMonthly
200000
given supplementaryPensionPct
0
expect withholdingTax
0
expect netMonthly
192000
Case 4 — I4 2,000,000 kr reaches the 46.29% bracket
given grossMonthly
2000000
given supplementaryPensionPct
0
expect taxBase
1920000
expect withholdingTax
667827
expect netMonthly
1252173
Case 5 — I5 4% séreign at 700,000 kr lowers the tax base
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.