ZyncDocs · MY-Payroll · Modules · PCB / MTD (detailed)
Must Should Could
Detailed Functional Requirements

PCB / MTD Income Tax — Detailed Requirements

The deep specification for Potongan Cukai Bulanan (Monthly Tax Deduction) — the LHDN-prescribed income tax withheld from each pay run. Residents are taxed by the official MTD Computerised Calculation with a year-to-date true-up so the running withholding converges on the correct annual liability; non-residents pay a flat rate. Bonuses use the LHDN differential method, and zakat offsets the tax ringgit-for-ringgit.

3
Computation paths
13
Requirements
10
Default tax bands

Monthly MTD

Annualised chargeable income with reliefs, band lookup, rebate, YTD true-up, ÷ months remaining.

Reliefs

EPF (capped), SOCSO+EIS (capped), personal / spouse / child, plus configurable item reliefs.

Bonus taxation

Additional remuneration taxed by the LHDN differential method — never smoothed or prorated.

Zakat

A salary-deducted zakat item reduces PCB ringgit-for-ringgit, not just net pay.

PCB / MTD · Detailed

Method selection TAX-D

Three computation paths, selected by residency and calculation context.

FR-TAX-D01Must
The system SHALL tax a non-resident employee at a flat 30% of gross plus additional remuneration, with no reliefs, rebate, or year-to-date accumulation.
Acceptance criteria
  • tax = round((gross + additionalGross) × 30%).
  • Residency comes from the employee's tax profile.
FR-TAX-D02Must
A resident employee in a real pay run SHALL be taxed by the official MTD Computerised Calculation (the pay month is always known in production).
Acceptance criteria
  • Every calculate pass supplies the pay month, so posted runs always use the MTD method.
FR-TAX-D03Should
Outside a pay-run context (draft-screen estimates, ad-hoc previews) the system SHALL fall back to a simplified annualised estimate: annualise chargeable income ×12, look up the annual tax, apply the rebate, and divide by 12.
Acceptance criteria
  • Uncalculated (DRAFT) run lines display live estimated figures from this path.
  • Estimates may differ from the final MTD figures — they carry no YTD true-up.

PCB / MTD · Detailed

Monthly MTD formula TAX-M

The normal-remuneration computation. With n+1 = 13 − payMonth (months remaining in the year including the current one):

StepComputation
Annual chargeable income PytdGross + currentGross × (n+1) − EPF relief min(ytdEpf + currentEpf × (n+1), cap RM4,000) − annual personal relief − non-EPF statutory relief (SOCSO+EIS, cap RM350) − item reliefs ×12; floored at 0.
Annual taxBand lookup on P (see TAX-B), then the s.6A rebate, floored at 0.
Gross MTD(annualTax − accumulated zakat − ytdMtdPaid) / (n+1), floored at 0, rounded up to the next 5 sen.
Net MTDIf gross MTD < RM10 → RM0; else max(0, grossMTD − currentMonthZakat).
FR-TAX-M01Must
The system SHALL compute the monthly MTD per the table above, projecting the current month's figures over the months remaining in the tax year and truing-up against the tax already deducted this year.
Acceptance criteria
  • YTD figures (gross, employee EPF, tax deducted) accumulate only from this year's prior finalised runs (approved or paid) with an earlier pay date.
  • The EPF relief inside P is derived from the unprorated full-month EPF amount ×12, capped at the configured (default RM4,000) annual limit.
  • A monthly MTD below RM10 before the current-month zakat offset is not remitted (RM0).
  • LHDN rounding applies: truncate beyond two decimals, then round up to the next 5 sen.
FR-TAX-M02Must
The pay date's calendar month and year SHALL anchor the computation — the month determines the months-remaining divisor, the year selects the tax bracket configuration and scopes the YTD accumulation.
Acceptance criteria
  • A December run divides the outstanding annual tax by 1 — absorbing all remaining liability.
  • Runs approved out of chronological order distort the true-up (see Known gaps).

PCB / MTD · Detailed

Reliefs TAX-R

Reliefs reduce annual chargeable income before the band lookup. They come from four places: statutory contributions, the year's configured personal reliefs, the employee's family profile, and tax-relief payroll items.

FR-TAX-R01Must
Annual personal relief SHALL be individualRelief + spouseRelief (only when the tax category is married-spouse-not-working) + numberOfChildren × perChildRelief + the employee's ad-hoc annual relief top-up.
Acceptance criteria
  • Relief figures come from the tax bracket configured for the pay year; family data (category, children) from the employee record.
  • Tax categories: SINGLE / MARRIED_SPOUSE_WORKING / MARRIED_SPOUSE_NOT_WORKING — only the last earns spouse relief.
FR-TAX-R02Must
Statutory reliefs SHALL be annualised from the full-month contribution amounts (×12) and capped per scheme — EPF at RM4,000 and SOCSO+EIS combined at RM350 by default, overridable per tax year.
Acceptance criteria
  • The caps are configurable on the year's tax bracket (per statutory type annual limits).
  • EPF relief is applied inside the MTD formula itself; SOCSO/EIS and other statutory reliefs enter as the non-EPF statutory relief term.
FR-TAX-R03Should
A payroll item of type tax relief (or a non-taxable item) assigned to an employee SHALL reduce chargeable income — as a fixed amount or a percentage, subject to the item's configured cap — annualised ×12 in the MTD formula.
Acceptance criteria
  • Relief type AMOUNT uses the item value; PERCENTAGE applies against the base with a maximum cap.
  • This models TP1-style approved deductions granted through payroll.

PCB / MTD · Detailed

Tax bands & rebate TAX-B

Annual tax is a progressive band walk: tax = baseTax + (P − bandMin) × rate% in the band containing P. Bands and relief values are configurable per tax year; the system auto-seeds a bracket for the current and next year from the built-in LHDN defaults at boot.

Default resident bands

Annual chargeable income (RM)RateBase tax at lower bound (RM)
0 – 5,0000%0
5,000 – 20,0001%0
20,000 – 35,0003%150
35,000 – 50,0006%600
50,000 – 70,00011%1,500
70,000 – 100,00019%3,700
100,000 – 400,00025%9,400
400,000 – 600,00026%84,400
600,000 – 2,000,00028%136,400
2,000,000 +30%528,400
FR-TAX-B01Must
The system SHALL resolve annual tax by walking the tax bands configured for the pay year and SHALL apply the section 6A rebate — RM400 off the tax when annual chargeable income is at most RM35,000 — floored at zero.
Acceptance criteria
  • Administrators can configure per-year bands (min, max, base tax, rate) and relief values; the year is matched on the run's pay date.
  • P = RM34,000 → rebate applies; RM35,001 → no rebate.
FR-TAX-B02Must
On startup the system SHALL seed a tax bracket named Malaysia PCB {year} for the current and next year when none exists — carrying the default band scale and the default personal reliefs (individual RM9,000, spouse RM4,000, per child RM2,000).
Acceptance criteria
  • Seeding is idempotent — existing brackets are never overwritten.
  • Reliefs must be seeded alongside bands: the run reads reliefs from the bracket only, so a bracket left at 0 over-deducts PCB.

PCB / MTD · Detailed

Bonus / additional remuneration TAX-A

Items flagged as additional remuneration (bonus, commission, arrears) are taxed by the LHDN differential method: the tax on the bonus is the difference between the full-year tax with the bonus and the projected full-year normal MTD without it.

FR-TAX-A01Must
The system SHALL tax additional remuneration by the differential method: compute the normal monthly MTD without the bonus; project the total-year normal MTD; recompute the annual tax with the bonus (and its EPF) added once; the bonus MTD is the excess, rounded up to the next 5 sen.
Acceptance criteria
  • mtdOnAdditional = max(0, annualTaxWithBonus − (ytdMtdPaid + grossNormalMtd × (n+1))).
  • The month's tax deduction = normal MTD + bonus MTD − current-month zakat, floored at 0.
  • The bonus and its EPF are added to the annual totals once — never projected over remaining months.
FR-TAX-A02Must
Additional remuneration SHALL be paid in full — never prorated for partial months and never ÷12-smoothed — and folded into paid gross for net pay and the journal.
Acceptance criteria
  • An annual-frequency bonus item flagged additional-remuneration pays the full lump sum in the run where it is active.
  • A mid-month joiner's bonus is not reduced by the proration factor.

PCB / MTD · Detailed

Zakat offset TAX-Z

Zakat paid through salary deduction plays a double role: a normal payslip deduction and a ringgit-for-ringgit offset against PCB.

FR-TAX-Z01Must
A deduction item mapped to the zakat EA category SHALL reduce the month's MTD ringgit-for-ringgit after rounding, while prior months' zakat accumulates inside the annualised computation.
Acceptance criteria
  • Current-month zakat is subtracted once from the rounded gross MTD (floored at 0).
  • Accumulated zakat from earlier finalised runs reduces the outstanding annual tax before the ÷(n+1) division.
  • The zakat amount itself still appears as a payslip deduction (it reduces both tax and net pay accordingly).

PCB / MTD · Detailed

Business rules

  • Rounding is LHDN-prescribed: truncate beyond 2 decimal places, then round up to the next 5 sen. Applied to the gross MTD and the bonus MTD.
  • The RM10 floor zeroes small withholdings before the zakat offset is applied.
  • True-up depends on run finality. Only approved/paid earlier runs count toward YTD gross, EPF, and tax paid.
  • Estimates ≠ final MTD. Draft-screen figures use the annualised shortcut; the calculate step is authoritative.
  • Tax year = pay date's calendar year; each run line records the tax year it was computed under.

PCB / MTD · Detailed

Known gaps

Out-of-order runs distort the true-up. YTD accumulation counts only finalised earlier runs; entering or approving runs out of chronological order skews the MTD convergence for later months.
No CP38 instruction handling. CP38 exists only as an EA-category mapping for deduction items; there is no dedicated LHDN instalment-instruction workflow.
No e-PCB / e-Data PCB export. PCB amounts are computed and journalled, but no LHDN submission file is generated.
A missing year bracket silently computes PCB = 0. At run time only the seeded bracket's bands are consulted (the engine's built-in scale is not a runtime fallback); if the pay year has no bracket, chargeable income finds no band and no tax is withheld. The boot-time seed mitigates this for the current and next year.