| Availability |
Odoo Online
Odoo.sh
On Premise
|
| Odoo Apps Dependencies |
•
Employees (hr)
• Discuss (mail) |
| Community Apps Dependencies | Show |
| Lines of code | 2495 |
| Technical Name |
eh_hr_payroll_uk |
| License | LGPL-3 |
| Website | https://www.erpheritage.com.au/ |
| Versions | 16.0 17.0 18.0 19.0 |
EH HR Payroll United Kingdom
A ready UK salary structure that computes PAYE on a personal allowance and progressive bands, plus per-period employee and employer National Insurance by category letter, all from editable rate tables.
Why this module
EH HR Payroll United Kingdom
The calculation is fixed, the rates are yours
PAYE annualises period earnings, taxes them band by band above the personal allowance, then divides back to the period. NI is computed per period and non-cumulative. The method is shipped and tested; the seeded 2025/26 figures are a template you verify against current HMRC tables before each new tax year.
National Insurance that follows the employee
Each employee carries an NI category letter (A, B, C, H, M). The payslip resolves that letter to its three published percentages, the employee main rate, the employee rate above the upper earnings limit, and the employer rate, then applies them to the period earnings above the scaled thresholds.
Update rates without touching code
Tax bands live on a UK tax band model, NI letters on a category model, and the personal allowance and annual NI thresholds are company settings. Admin screens let you edit every figure in place, so a new tax year is a data change, not a code release.
Day in the life
Running a monthly UK payslip
You assign the United Kingdom Standard structure to a contract and set the employee NI category letter. On compute, the engine runs the rules in sequence: basic and gross, then PAYE, which annualises the period gross, taxes the amount above the personal allowance across the 20, 40 and 45 percent bands, and divides back to the month. Employee NI applies the category main rate between the per-period primary threshold and the upper earnings limit, then the upper rate above it. Employer NI applies the employer rate above the per-period secondary threshold. Net is gross less PAYE less employee NI; employer NI sits employer-side and does not reduce take-home.
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.
When annual gross is at or below the personal allowance, taxable income floors at zero and PAYE returns 0.00 rather than going negative.
An empty or unrecognised category letter resolves to category A, the standard rate, so a missing letter never crashes a slip; if no NI category is seeded at all, the company rate fields act as a last-resort fallback.
Category C zeroes both employee NI rates, so the employee pays nothing, but the employer rate still applies and employer NI is charged as normal.
Categories M and H charge the employee the standard rates but set the employer rate to 0 percent, so employer NI is nil while the employee deduction is unchanged.
Per-period NI thresholds are the annual figures divided by pay periods per year (52 weekly, 26 fortnightly, 12 monthly) with no intermediate rounding; only the final contribution is rounded to two decimals, so weekly and monthly runs stay internally consistent.
NI is charged in slices: nothing below the primary threshold, the main rate between primary and upper limit, the upper rate above the upper earnings limit, computed cleanly even when period gross lands exactly on a threshold.
The personal allowance and annual NI thresholds are res.company fields, so each company in a multi-company database can carry its own values and the payslip reads its own company's settings.
PAYE and NI run as named helpers inside the engine's closed rule namespace, which exposes read-only proxies of the payslip and employee rather than raw recordsets, so a salary rule cannot reach across into other records.
What is inside
Built to do the job, end to end.
- PAYE band engine. compute_annual_paye taxes income above the personal allowance slice by slice across the seeded bands (20 percent to 37,700 taxable, 40 percent to 112,570, 45 percent above). compute_period_paye annualises the period gross, taxes it, and divides back, rounding the period result to two decimals.
- National Insurance helpers. ni_employee and ni_employer compute per-period, non-cumulative Class 1 NI. Period thresholds are the annual primary, upper and secondary figures divided by periods per year; the resolved category letter supplies the main, upper and employer rates.
- Data you can edit. Three tax bands on eh.hr.uk.tax.band, five NI letters on eh.hr.ni.category, and company settings for the personal allowance and the three annual NI thresholds, each with an admin list view under the payroll menus.
- Salary structure. United Kingdom Standard wires BASIC, GROSS, PAYE, NI_EE, NI_ER and NET rules in sequence, with employer NI placed in the employer category so it is reported without reducing net pay.
- Tested against statutory figures. A test suite asserts real 2025/26 amounts derived from the seeded HMRC data: GBP 11,432 annual PAYE on GBP 60,000, GBP 952.67 monthly PAYE, and category A, C and M NI outcomes at GBP 5,000 a month.
Honest about the edges
What this does not do, so nothing surprises you.
- No RTI submission. The module computes PAYE and NI for the payslip but does not file FPS or EPS returns or talk to HMRC; reporting and submission stay outside the module.
- PAYE here is non-cumulative and code-free. It annualises each period and taxes it independently; it does not apply individual tax codes, cumulative year-to-date PAYE, or week 1 / month 1 markers.
- Income tax bands are the England, Wales and Northern Ireland set. Separate Scottish or Welsh rate bands are not seeded; you would add them as data.
- No statutory pay, pensions or student loans. Statutory sick or parental pay, workplace pension auto-enrolment, and student loan deductions are not included.
- Directors cumulative NI method is not modelled. NI is per-period for every employee.
- Seeded rates are a 2025/26 template, not a maintained feed. HMRC revises figures each tax year; you confirm and update the bands, letters and thresholds before each new year.
- No automatic rate updates and no cron. Rate maintenance is a manual data edit on the shipped admin screens.
UK payroll Odoo 16, PAYE Odoo, National Insurance Odoo, NI category letters, personal allowance payroll, UK income tax bands, employer National Insurance, Class 1 NI Odoo, gross to net payslip UK, UK salary structure Odoo, HMRC rates payroll, Odoo 16 Community payroll UK
Please log in to comment on this module