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
finalRate
0.005
finalExemptTurnover
500000000
finalTurnoverCeiling
4800000000
ptkpSelf
54000000
ptkpMarried
4500000
ptkpPerDependant
4500000
maxDependants
3
pitBand1
60000000
pitBand2
250000000
pitBand3
500000000
pitBand4
5000000000
pitRate1
0.05
pitRate2
0.15
pitRate3
0.25
pitRate4
0.3
pitRate5
0.35
Test vectors (7)
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 Rp1.2 billion turnover on the 0.5% final tax: 0.5% of the Rp700 million above Rp500 million = Rp3,500,000
given annualTurnover
1200000000
given annualExpenses
900000000
given regime
final
given freeProfession
no
given maritalStatus
single
given dependants
0
given overCeilingBefore
no
expect finalApplies
true
expect finalTax
3500000
expect incomeTax
3500000
expect netIncome
296500000
Case 2 — S2 the same business on the normal rates: Rp300 million profit less Rp54 million PTKP — Rp30,900,000
given annualTurnover
1200000000
given annualExpenses
900000000
given regime
normal
given freeProfession
no
given maritalStatus
single
given dependants
0
given overCeilingBefore
no
expect finalApplies
false
expect taxableIncome
246000000
expect progressiveTax
30900000
expect incomeTax
30900000
expect netIncome
269100000
Case 3 — S3 turnover of exactly Rp500 million: no final tax
given annualTurnover
500000000
given annualExpenses
300000000
given regime
final
given freeProfession
no
given maritalStatus
single
given dependants
0
given overCeilingBefore
no
expect finalTax
0
expect incomeTax
0
Case 4 — S4 a free profession cannot use the final tax and is taxed at the normal rates
given annualTurnover
600000000
given annualExpenses
200000000
given regime
final
given freeProfession
yes
given maritalStatus
married
given dependants
2
given overCeilingBefore
no
expect finalApplies
false
expect ptkp
67500000
expect taxableIncome
332500000
expect progressiveTax
52125000
Case 5 — S5 Rp5 billion this year, at most Rp4.8 billion last year: still 0.5% to the year's end (art. 61(1)) — Rp22,500,000
given annualTurnover
5000000000
given annualExpenses
4500000000
given regime
final
given freeProfession
no
given maritalStatus
single
given dependants
0
given overCeilingBefore
no
expect finalApplies
true
expect overCeilingThisYear
true
expect finalTax
22500000
expect incomeTax
22500000
expect netIncome
477500000
Case 6 — S6 exactly Rp4.8 billion is still in the scheme (“tidak melebihi”): Rp21,500,000
given annualTurnover
4800000000
given annualExpenses
4000000000
given regime
final
given freeProfession
no
given maritalStatus
single
given dependants
0
given overCeilingBefore
no
expect finalApplies
true
expect finalTax
21500000
Case 7 — S7 turnover went above Rp4.8 billion in an earlier year: art. 17 rates on profit — Rp80,500,000
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.