EH HR Payroll Malaysia
EPF, SOCSO, EIS and PCB computed on the EH salary-rule engine, with editable statutory tables you keep current.
Why this module
EH HR Payroll Malaysia
EPF is banded, SOCSO and EIS are not percentages
EPF is a percentage of wages with the employer rate stepping at RM5,000 (13% at or below, 12% above; employee 11%). SOCSO and EIS are fixed-amount band tables, not percentages, capped at the RM6,000 ceiling. This module models each one the way it is actually published instead of flattening all four into a single rate.
Statutory tables are editable data, not buried constants
The SOCSO and EIS Jadual Caruman bands, the LHDN tax brackets, and the EPF rates and threshold all live in editable records and company settings. When PERKESO or LHDN revise a figure, an HR admin updates the table in the UI; no code change, no redeploy. The lookup and tax methods stay fixed while the seeded numbers stay yours.
Computes inside an audited, sandboxed payroll core
Payslips inherit the EH engine: salary rules run in a closed safe_eval sandbox that cannot reach the ORM, every create, write and unlink is written to a sha256 hash-chained audit log, and company scoping is enforced by the platform mixins. The Malaysia layer adds the statutory math through a documented hook rather than forking the engine.
Day in the life
Run a clean Malaysian monthly payslip
Assign the Malaysia Standard structure to an employee and compute a monthly slip. EPF applies the banded employer rate for the wage, SOCSO and EIS read their fixed band amounts from the Jadual Caruman tables, and PCB annualises the wage, deducts the standard individual relief and the capped EPF relief, taxes it across the LHDN brackets, and divides back to the month. Employer EPF posts as a company contribution and does not reduce net; the employee EPF, SOCSO, EIS and PCB do. Every figure traces to a seeded, cited table you can open and verify.
Edge cases
The cases most modules quietly ignore.
In the shipped code today, each one a place where a cheaper module silently does the wrong thing.
A wage over RM6,000 does not scale: the SOCSO and EIS lookups return the top band's fixed amount, never a percentage of the higher wage. Tested at RM10,000 and RM25,000, both yielding the ceiling amounts.
The employer EPF rate steps down at the threshold: 13% at or below RM5,000 and 12% above it, so a RM5,000 slip and a RM6,000 slip carry different employer percentages. Both points are pinned by tests.
A wage of zero or below returns no contribution, and a wage that falls below the first seeded band still resolves through the band lookup rather than erroring.
When annualised wage minus the RM9,000 individual relief and the capped RM4,000 EPF relief lands at or below zero chargeable income, PCB is zero rather than negative.
Each statutory amount is produced by a safe callable injected into the rule context; a salary rule can call epf_employer or mtd but cannot read the cursor, the recordset, or the internal stores behind them.
Computing or recomputing a payslip appends to the sha256 hash-chained audit log whose writes are serialized by a Postgres advisory lock, so a later edit to a slip's history is detectable by verify_chain.
PCB annualises using the engine's pay-period count inferred from the period span, so a fortnightly or weekly period is annualised correctly rather than assuming twelve months.
What is inside
Built to do the job, end to end.
- Malaysia Standard salary structure. A seeded structure with ordered rules for Basic, Gross, EPF employee and employer, SOCSO employee and employer, EIS employee and employer, PCB, and Net, wired to the engine's salary-rule categories so deductions and employer contributions land on the right side of the slip.
- SOCSO and EIS band tables (Jadual Caruman). Sixty-three-row Category 1 contribution tables each for SOCSO and EIS, modelled as fixed RM amounts per wage band with employer and employee columns, capped at the RM6,000 ceiling, editable in admin-gated list views.
- LHDN income tax brackets. The resident individual progressive schedule as editable bracket records, summed band by band over chargeable income, driving the simplified MTD / PCB monthly-deduction formula with the standard individual relief and capped EPF relief.
- EPF company settings. Company fields for the EPF employee rate, the two employer rates, and the wage threshold, defaulted to the statutory figures so the banded employer logic is configurable per company.
- Statutory helpers on the rule seam. epf_employee, epf_employer, socso_employee, socso_employer, eis_employee, eis_employer and mtd are exposed to salary rules through the engine's documented _get_rule_helpers hook, keeping the Malaysia math out of the core engine.
- Access control and tests. Admin, officer and self ACLs on every statutory table, admin-gated menus, and a test suite that pins real published EPF, SOCSO, EIS and PCB figures against the seeded data and a full computed payslip.
Honest about the edges
What this does not do, so nothing surprises you.
- This is the contribution and tax calculation layer only. It does not generate statutory forms or submission files (no Form E, EA, CP39, Borang, or EPF/SOCSO/EIS contribution files).
- PCB uses the simplified computerised formula (annualise, deduct the standard RM9,000 individual relief and the capped RM4,000 EPF relief, tax progressively, divide by pay periods). It is not the full official MTD schedule and does not model spouse, child, lifestyle, zakat, or other reliefs.
- The seeded SOCSO and EIS amounts are generated from the Category 1 statutory rates applied to each band's upper wage and rounded to the nearest 5 sen, reflecting the RM6,000 ceiling effective 1 October 2024. You must confirm them against the current PERKESO Jadual Caruman before live use.
- SOCSO is modelled for Category 1 (employees below age 60). Other PERKESO categories are not seeded.
- Tax brackets and rates are seeded from a published LHDN schedule and must be verified against the current assessment year before use; the figures are yours to maintain.
- Requires the EH HR payroll engine (eh_hr_payroll) and Odoo 17 Community HR. It does not bundle banking, EPF i-Akaun, or LHDN e-filing integrations.
Malaysia payroll Odoo 17, EPF Odoo payroll, KWSP contribution Odoo, SOCSO PERKESO Odoo, EIS SIP Odoo payroll, PCB MTD Odoo, Potongan Cukai Bulanan, Jadual Caruman, LHDN income tax brackets, Malaysia salary structure Odoo, RM6000 wage ceiling, Employees Provident Fund Act payroll, statutory deductions Malaysia, Odoo 17 Community payroll, Malaysia statutory contributions
Need this fitted to the way you work?
ERP Heritage delivers end to end Odoo work: Odoo Implementation, Customization and Development, Integration, Migration, Consultation, Support and Training. We help teams put this module into production, shape it to their process, and keep it running.
We work with businesses across Australia (Melbourne, Sydney, Brisbane, Perth, Adelaide, Canberra) and the Middle East (Dubai, Abu Dhabi, Riyadh, Jeddah, Doha, Kuwait City, Muscat). Start a conversation at erpheritage.com.au or email info@erpheritage.com.au.
Languages
Available in 19 languages
The interface ships translated out of the box. Switch language in Odoo and the fields, menus, and messages follow.
Modules teams pair with this one.
Premium ERP Heritage modules that extend the same stack, each built to the same engineering bar.
A reusable two way synchronisation engine that keeps Odoo in step with the people and payroll platform, idempoten...
The Australia country pack for the ERP Heritage Employment Hero integration
Sync certifications, qualifications and employee document metadata from the Employment Hero people platform into...
| Availability |
Odoo Online
Odoo.sh
On Premise
|
| Odoo Apps Dependencies |
•
Employees (hr)
• Discuss (mail) |
| Community Apps Dependencies | Show |
| Lines of code | 3521 |
| Technical Name |
eh_hr_payroll_my |
| License | LGPL-3 |
| Website | https://www.erpheritage.com.au/ |
Please log in to comment on this module