How the Pakistan car tax calculator is verified

Inputs

InputFieldType
Invoice value of the car (PKR)vehicleValuenumber
Engine capacity (cc)engineCcnumber
On the FBR active taxpayers’ listactiveTaxpayerboolean
New car — first registration in Islamabad this yearnewCarboolean

The formula

Each derived value below is computed by the Valem engine from the expression shown, in this order. Nothing else runs — there is no hidden code path.

Derived valueFieldFormula (JSONata)
s.231B rate on registrationregistrationRate($c := $n(engineCc); $c <= $const.cc850 ? $const.regRate850 : ($c <= $const.cc1000 ? $const.regRate1000 : ($c <= $const.cc1300 ? $const.regRate1300 : ($c <= $const.cc1600 ? $const.regRate1600 : ($c <= $const.cc1800 ? $const.regRate1800 : ($c <= $const.cc2000 ? $const.regRate2000 : ($c <= $const.cc2500 ? $const.regRate2500 : ($c <= $const.cc3000 ? $const.regRate3000 : $const.regRateAbove3000))))))))
Advance income tax on registration (s.231B)registrationAdvanceTaxnewCar ? $round($n(vehicleValue) * registrationRate * (activeTaxpayer ? 1 : 1 + $const.nonActiveRegIncrease), 2) : 0
Up to 1000cc: lifetime tax Rs20,000 + s.234 lump sumlifetimeTax(newCar and $n(engineCc) <= $const.cc1000) ? $const.ictLifetimeUpto1000 + $const.adv234LumpSumUpto1000 * (activeTaxpayer ? 1 : 1 + $const.nonActiveAdvanceIncrease) : 0
ICT motor vehicle tax / yearmotorVehicleTaxAnnual($c := $n(engineCc); $c <= $const.cc1000 ? 0 : $round($n(vehicleValue) * ($c <= $const.cc2000 ? $const.ictRateUpto2000 : $const.ictRateAbove2000), 2))
Advance income tax with it / year (s.234)advanceTaxAnnual($c := $n(engineCc); $c <= $const.cc1000 ? 0 : ($c <= $const.cc1199 ? $const.adv234Upto1199 : ($c <= $const.cc1299 ? $const.adv234Upto1299 : ($c <= $const.cc1499 ? $const.adv234Upto1499 : ($c <= $const.cc1599 ? $const.adv234Upto1599 : ($c <= $const.cc1999 ? $const.adv234Upto1999 : $const.adv234From2000))))) * (activeTaxpayer ? 1 : 1 + $const.nonActiveAdvanceIncrease))
Every yearannualTotal$round(motorVehicleTaxAnnual + advanceTaxAnnual, 2)
First yearfirstYearTotal$round(registrationAdvanceTax + lifetimeTax + annualTotal, 2)

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.

ConstantValue
cc850850
cc10001000
cc11991199
cc12991299
cc13001300
cc14991499
cc15991599
cc16001600
cc18001800
cc19991999
cc20002000
cc25002500
cc30003000
regRate8500.005
regRate10000.01
regRate13000.015
regRate16000.02
regRate18000.03
regRate20000.05
regRate25000.07
regRate30000.09
regRateAbove30000.12
nonActiveRegIncrease2
nonActiveAdvanceIncrease1
adv234Upto11991500
adv234Upto12991750
adv234Upto14992500
adv234Upto15993750
adv234Upto19994500
adv234From200010000
adv234LumpSumUpto100010000
ictLifetimeUpto100020000
ictRateUpto20000.0025
ictRateAbove20000.0035

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 — K1 a new 1500cc car with a Rs6,000,000 invoice: s.231B 2% Rs120,000, ICT tax 0.25% Rs15,000, s.234 Rs3,750

given vehicleValue6000000
given engineCc1500
given activeTaxpayeryes
given newCaryes
expect registrationAdvanceTax120000
expect motorVehicleTaxAnnual15000
expect advanceTaxAnnual3750
expect annualTotal18750
expect firstYearTotal138750

Case 2 — K2 the same car, owner not on the active taxpayers’ list: s.231B tripled, s.234 doubled

given vehicleValue6000000
given engineCc1500
given activeTaxpayerno
given newCaryes
expect registrationAdvanceTax360000
expect advanceTaxAnnual7500
expect firstYearTotal382500

Case 3 — K3 a new 1000cc car for Rs3,000,000: 1% on registration and Rs20,000 + Rs10,000 for life

given vehicleValue3000000
given engineCc1000
given activeTaxpayeryes
given newCaryes
expect registrationRate0.01
expect registrationAdvanceTax30000
expect lifetimeTax30000
expect annualTotal0
expect firstYearTotal60000

Case 4 — K4 a 2400cc car already registered, Rs20,000,000 invoice: 0.35% Rs70,000 + Rs10,000 a year

given vehicleValue20000000
given engineCc2400
given activeTaxpayeryes
given newCarno
expect registrationAdvanceTax0
expect motorVehicleTaxAnnual70000
expect advanceTaxAnnual10000
expect annualTotal80000

Case 5 — K5 a new 3000cc car for Rs30,000,000: 9% on registration

given vehicleValue30000000
given engineCc3000
given activeTaxpayeryes
given newCaryes
expect registrationRate0.09
expect registrationAdvanceTax2700000

Case 6 — K6 a new 660cc car for Rs2,500,000: 0.5% on registration

given vehicleValue2500000
given engineCc660
given activeTaxpayeryes
given newCaryes
expect registrationAdvanceTax12500
expect lifetimeTax30000

Case 7 — K7 a 1300cc car: 1.5% on registration, Rs2,500 under s.234

given vehicleValue4000000
given engineCc1300
given activeTaxpayeryes
given newCaryes
expect registrationRate0.015
expect registrationAdvanceTax60000
expect advanceTaxAnnual2500
expect motorVehicleTaxAnnual10000

Sources

Check it yourself — and reuse it

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.

← Back to the Pakistan car tax calculator

Built with Valem — a live, verifiable calculator you can fork and embed.