MY-Payroll — Process Flows
The operating lifecycle of the Malaysian payroll, phase by phase: one-time configuration, enrolling employees, the monthly pay cycle from draft to paid, the exception paths, monthly statutory remittance, and the year-end compliance season. Every flow cites the functional requirements that back it on the Modules tab.
Phase A · One-time Setup
Configure payroll foundations setup
HR and Finance stand up everything a run depends on. Statutory types and tax brackets self-seed; the item catalogue, contribution groups, registration numbers and GL accounts are operator work.
Flow
- 1SystemSeeds foundations at boot.Statutory type masters (epf, socso, eis, pcb) and a tax bracket per current + next year (Malaysia PCB {year}: LHDN band scale, reliefs RM9,000 / RM4,000 / RM2,000 per child, caps EPF RM4,000 and SOCSO+EIS RM350). Idempotent — existing data untouched.
- 2HR AdminBuilds the item catalogue — Basic Salary, allowances, deductions, overtime, tax reliefs (create or spreadsheet import).Each item carries taxability, statutory bases, EA category, GL account, frequency, and flags. Only one item may be basic salary. Nothing is pre-seeded.
- 3HR AdminDefines contribution groups (e.g. "EPF+SOCSO+EIS, paid by both").Each scheme entry sets who pays and its GL payable account. Configured rates for EPF/SOCSO/EIS are ignored — the legal schedule always applies.
- 4HR AdminRecords the employer's statutory registration numbers — EPF, SOCSO, EIS, LHDN E-number.One number per scheme; the LHDN entry feeds the Borang E header.
- 5Finance AdminSets the payroll GL accounts and HRDF toggle/rate in company configuration.Salary expense, PCB payable, and net-salary liability accounts; HRDF at 1% (or 0.5%) when registered with HRD Corp.
Rules & gotchas
- A year with no tax bracket silently computes zero PCB — the auto-seed exists to prevent this; verify brackets each new year.
- Deduction items without GL accounts will later block journal posting — map accounts up front.
- The configured employer-expense account is currently unused (employer costs are not journalled).
End state
Catalogue, groups, brackets, registrations and accounts in place — employees can be enrolled.
Phase B · Onboarding
Enrol an employee into payroll enrol
A hired employee becomes payable: tax profile completed, statutory numbers recorded, contribution group linked, and standing items assigned.
Flow
- 1HR AdminCompletes the payroll profile on the employee master — residency, tax category, children, nationality, date of birth, join date, attendance group.These parameterise every statutory rule: age at pay date, foreign-worker EPF, spouse/child reliefs, proration. Blank nationality defaults to Malaysian; missing birth date to under-60.
- 2HR AdminLinks the employee to a contribution group.No group → no statutory contributions at all.
- 3HR StaffRecords the employee's statutory numbers (EPF / SOCSO / income tax).Identity only — eligibility never depends on a number being present; blanks render empty on forms.
- 4HR StaffAssigns standing items — Basic Salary with the monthly amount, recurring allowances/deductions, dated from the join date (create or bulk import).Active window = status active and pay date within [start, end]. No overlapping assignments of the same item. Annual amounts smooth ÷12 (except bonuses).
Rules & gotchas
- The basic-salary assignment is what the run pays; the employee's basic-salary field is only a fallback.
- Salary revisions are modelled by end-dating the old assignment and starting a new one — history stays intact.
- No bank details exist anywhere — disbursement happens outside the system.
End state
The employee is fully payable: profile, group, numbers and standing items in place.
Phase C · Monthly Cycle
Monthly pay run — draft to paid run
The core cycle. A run is created for the month, employees join it with their period inputs snapshotted, the engine calculates statutory and tax, approval locks the figures, the journal posts the accrual, and the run is marked paid.
Flow
- 1HR AdminCreates the run — name, pay date, optional period window.Status DRAFT. The pay date's month anchors proration and the MTD month; its year selects the tax bracket. The period defaults to the pay date's calendar month.
- 2HR AdminAdds employees to the run.Per employee, in one transaction: snapshot basic salary; unpaid leave (approved unpaid days × salary ÷ working days); overtime (approved timesheet hours × hourly rate); absence (working days − present days × daily rate); and one contribution row per statutory scheme — EPF / SOCSO / EIS by the legal schedule, prorated and full-month amounts both stored.
- 3HR AdminReviews the draft — live estimated figures per line; adjusts items, overrides line inputs, or resyncs after changes.Estimates use the simplified annualised tax and skip proration — advisory only. Changing assignments requires a resync or contributions stay stale.
- 4HR AdminRuns the calculation.Per employee: prorate → gross → statutory sums → PCB/MTD with year-to-date true-up (bonus by differential method, zakat offset) → net (floored at 0) → HRDF → employer cost. All lines + run totals written in one transaction; status → PENDING_APPROVAL; any journal link cleared.
- 5HR AdminApproves the run.Status → APPROVED; figures locked; in-app notification to creator and managers. (Reject instead → back to DRAFT with calculated figures zeroed.)
- 6Finance AdminPreviews the journal, picks the net-salary liability account, posts.Preview surfaces unmapped items — posting refuses until every deduction/statutory line has a GL account. The entry is dated on the pay date and linked to the run.
- 7Finance AdminPays salaries through the bank (outside the system) and marks the run as paid.Mark-as-paid requires the posted journal. Status → PAID (terminal); notification fired. Settling the salary-payable liability is a separate manual finance entry.
- 8HR StaffShares payslips.Payslips render on-screen per line (earnings, deductions, statutory shares, PCB). No PDF/e-mail/self-service distribution exists — a known gap.
The journal (one balanced entry per run)
| Leg | Side | Account | Amount |
|---|---|---|---|
| Salary Expense | DR | Payroll expense (config) | Σ gross salary |
| Item deductions | CR | Each item's account | Per employee per item |
| Employee EPF / SOCSO / EIS | CR | Group's per-scheme account | Employee shares |
| PCB | CR | Payroll tax (config) | Tax per employee |
| Net salary | CR | Salary liability (chosen) | Net per employee |
Employer statutory shares and the HRDF levy are deliberately excluded — they are tracked on the run but settled and accounted for outside the salary journal.
Rules & gotchas
- Approval is procedural, not enforced — the same user can calculate and approve (no maker/checker).
- Approve runs in chronological order: the MTD true-up counts only earlier finalised runs, so out-of-order approval skews later months' PCB.
- Loan instalments, advances and claim reimbursements must be entered as item assignments — nothing flows in automatically.
End state
A PAID run with locked figures, a balanced GL accrual, and per-line payslip data feeding the annual forms.
Phase D · Exceptions & Variations
Reject, re-run & special cases exceptions
The paths off the happy road: sending a run back for correction, re-running after approval, mid-month joiners and leavers, and bonus months.
Reject loop
- 1HR AdminRejects a pending run.Status → DRAFT; every line's calculated figures zeroed so stale numbers never display as final.
- 2HR AdminFixes items/inputs, resyncs, recalculates, re-approves.The cycle repeats from calculate; audit captures every transition.
Special cases
| Case | Behaviour |
|---|---|
| Mid-month joiner / leaver | Base, allowances, deductions, statutory base and HRDF base prorate by workedDays ÷ daysInMonth (join on the 16th of a 30-day month → ×0.5). OT/leave/absence stay per actual day; bonus never prorates. |
| Bonus month | Assign an additional-remuneration item — paid in full, folded into paid gross, taxed by the LHDN differential method on top of normal MTD. |
| Re-run after approval | Allowed (only PAID/CANCELLED block). Status returns to PENDING_APPROVAL and the journal link clears — but a posted journal entry is not deleted: remove it manually before re-posting or the GL doubles up. |
| Cancel | Any non-PAID run can be cancelled (terminal). Nothing is cleaned up — no journal reversal, no line reset. |
| Zero/negative net | Net pay floors at 0; the shortfall stays in total deductions. |
End state
Corrected figures re-approved, or the run cancelled with a clear audit trail.
Phase E · Statutory Remittance
Monthly agency payments remit
Paying the withheld and employer amounts to the agencies. The system supplies authoritative figures; submission and payment happen on the agency portals — no e-files are generated.
Flow
- 1Finance AdminReads the run's contribution summaries — employee + employer per scheme, PCB total, HRDF total.Grouped per statutory type on the run; per-employee rows available for reconciliation.
- 2Finance AdminSubmits and pays on each portal — EPF (i-Akaun), SOCSO/EIS (ASSIST), PCB (e-PCB/e-Data PCB), HRD Corp levy, zakat body.Figures are re-keyed manually — the system produces no CP39, EPF Form A, SOCSO 8A or bank files (explicit deferral).
- 3Finance AdminClears the payable accounts with manual journals as each payment lands.The salary journal only accrued the employee-side liabilities; employer statutory and HRDF were never journalled and need their own entries.
End state
All agency liabilities for the month settled; payable accounts cleared.
Phase F · Year-end
Annual compliance — EA Forms & Borang E yearend
After the December run is finalised: EA Forms to every employee by end of February, Borang E (with CP8D) to LHDN by 31 March, and the new year's tax bracket verified.
Flow
- 1HR AdminConfirms every run of the year is finalised.Annual forms aggregate approved/paid runs only, by the pay date's calendar year — a draft December run simply drops out of the totals.
- 2HR AdminGenerates each employee's EA Form (CP8A) — preview, then PDF — and distributes it.Sections A–F mapped from payroll data and item EA categories; distribution is manual (no e-mail/self-service).
- 3HR AdminGenerates Borang E with the CP8D listing, overriding headcounts if join/resign data is unreliable, and files on LHDN e-Filing.Header pulls the LHDN E-number from statutory identity; figures are re-keyed into e-Filing (no e-CP8D file).
- 4HR AdminVerifies the new year's tax bracket against the Budget.The seed created it from last-known defaults — Budget changes to bands or reliefs must be edited in before the January run.
End state
Employees hold their EA Forms, Borang E is filed, and the new year's parameters are confirmed — the January run can proceed.