Singapore Payroll CPF for Odoo 17
A ready Singapore salary structure that computes CPF employee and employer contributions with real age-band rates and the Ordinary and Additional Wage ceilings.
Why this module
Singapore Payroll CPF for Odoo 17
CPF that steps down with age
Five seeded age bands from 55 and below to above 70 set the employee and employer percentages. The payslip reads the employee birthday at the period end and picks the matching band, so a 62 year old is computed at 12.5 percent and 12.5 percent, not a single flat rate.
Ordinary and Additional Wage caps applied
Monthly Ordinary Wage is capped at the company ceiling. A bonus as Additional Wage is capped at the annual ceiling remaining, which is the annual cap less the year Ordinary Wages already subject to CPF. The split is computed, not approximated.
Numbers you can check against the source
Age-band rates and wage ceilings are seeded as cited CPF Board data, and the test suite asserts the real published figures rather than rates a test invents. You can read the source line and confirm the contribution before you run a single payslip.
Day in the life
A January payroll with a bonus and a senior on the team
You run the Singapore structure for the month. A 36 year old on 10,000 has Ordinary Wage capped to the 8,000 ceiling, so CPF lands at 1,600 employee and 1,360 employer. A 62 year old on 5,000 is computed at the above-60-to-65 band, 625 and 625. When a 20,000 bonus is paid as Additional Wage, only the ceiling remaining for the year is contributable, so CPF applies to the capped Ordinary Wage plus the remaining Additional Wage, not the full bonus. Employer CPF shows on the slip without reducing take-home, and net is gross minus the employee deduction.
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.
The employee age is computed at the end of the pay period from the birthday, read with sudo because it is a group-restricted field, and the value is used only to pick the CPF band, never exposed to a salary rule.
When no birthday is set the slip falls back to the 55-and-below band rather than failing, so a payslip always computes a defensible figure.
The Additional Wage ceiling remaining is the annual cap less the year Ordinary Wages already subject to CPF. With no override supplied, the year Ordinary Wage is projected as twelve months of the capped monthly Ordinary Wage.
If no age-band table is configured, the helper falls back to a company-level flat employee and employer rate against the capped Ordinary Wage, so the structure never silently returns zero.
Ordinary and Additional Wage inputs are floored at zero before the ceilings are applied, so a blank or negative input cannot produce a negative contribution.
Employer CPF is carried as an employer-contribution category, so it appears on the payslip but never reduces take-home pay, and net stays gross minus employee deductions.
Salary rules run in the inherited restricted safe_eval sandbox with read-only payslip and employee proxies, so the CPF helpers see wages but no raw recordset reaches a formula.
What is inside
Built to do the job, end to end.
- Models. eh.hr.cpf.rate holds the age bands with employee and employer percentages and resolves the band for an age. The eh.hr.payslip extension injects cpf_employee and cpf_employer into the rule sandbox and computes the age at period end. res.company carries the Ordinary and Additional Wage ceilings plus the fallback rates.
- Seeded data. Five CPF age bands as cited CPF Board data, and a ready Singapore - Standard salary structure with BASIC, GROSS, CPF employee, CPF employer and NET rules wired to the engine categories.
- Security. Three-tier access on the CPF rate table: HR admin full control, HR officer read and edit, employee self read only.
- Tests. A transaction test suite asserting the published CPF Board figures: the 20 and 17 percent band below the ceiling, the Ordinary Wage cap, the senior age band, and the Additional Wage ceiling remaining on a bonus.
Honest about the edges
What this does not do, so nothing surprises you.
- Covers CPF only. Singapore does not operate monthly PAYE withholding for resident employees, so there is no monthly income tax in this structure.
- No annual income tax filing, IR8A, IR21 or Auto-Inclusion Scheme output.
- No Skills Development Levy, Foreign Worker Levy, or CDAC, MBMF, SINDA and ECF community fund deductions.
- No CPF electronic submission or CPF e-Submit file generation.
- Rates are seeded for Singapore Citizens and Permanent Residents from the third year onward; the first and second-year graduated SPR rates are not seeded.
- Wage ceilings and age-band rates are revised by the CPF Board and must be verified against the current figures each year.
- Employer CPF is computed and shown on the slip but is not posted to accounting by this module.
- Depends on the eh_hr_payroll engine and the standard hr module; it is a localization layer, not a standalone payroll.
Singapore payroll Odoo 17, CPF Odoo, CPF employee employer contribution, Central Provident Fund payroll, Ordinary Wage ceiling CPF, Additional Wage ceiling CPF, CPF age band rates, Singapore salary structure Odoo, SG payslip Odoo, Odoo 17 Community payroll, hr payroll Singapore, CPF contribution calculation
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.
Post Irish payslips to the general ledger on the Irish chart of accounts
Interactive drag and drop Gantt planner for Odoo 17 Community project tasks with a deterministic server side sche...
Employment Hero Connector is the integration core of the ERP Heritage Employment Hero suite, providing per compan...
The United Kingdom country pack for the ERP Heritage Employment Hero integration
Sync Employment Hero employees, departments and payroll bank details into standard Odoo Community HR over the pla...
Inbound webhook receiver for the Employment Hero people and payroll platform on Odoo 17 Community
| Availability |
Odoo Online
Odoo.sh
On Premise
|
| Odoo Apps Dependencies |
•
Employees (hr)
• Discuss (mail) |
| Community Apps Dependencies | Show |
| Lines of code | 2438 |
| Technical Name |
eh_hr_payroll_sg |
| License | LGPL-3 |
| Website | https://www.erpheritage.com.au/ |
Please log in to comment on this module