| Availability |
Odoo Online
Odoo.sh
On Premise
|
| Odoo Apps Dependencies |
•
Employees (hr)
• Discuss (mail) |
| Community Apps Dependencies | Show |
| Lines of code | 2506 |
| Technical Name |
eh_hr_payroll_uk |
| License | LGPL-3 |
| Website | https://www.erpheritage.com.au/ |
| Versions | 16.0 17.0 18.0 19.0 |
UK Payroll: PAYE and NI
A ready UK salary structure that runs PAYE on a personal allowance and progressive tax bands, plus per-period employee and employer National Insurance by category letter, on the EH payroll engine.
Why this module
UK Payroll: PAYE and NI
Stay current without code
The PAYE and NI calculation is fixed in code, but the bands, NI category rates, personal allowance, and annual thresholds are data and company settings. When HMRC revises a figure for the new tax year, you edit a row or a setting, not the engine.
The category letter does the work
Each worker carries an NI category letter, and that letter selects the employee main rate, the above-UEL rate, and the employer rate. Category C zeroes employee NI, categories H and M zero the employer rate, exactly as HMRC publishes.
Clean salary-structure wiring
PAYE and both NI sides are exposed to the salary rules as safe helpers through the engine seam, with a seeded United Kingdom Standard structure of basic, gross, PAYE, employee NI, employer NI, and net. No raw recordset reaches a rule.
Day in the life
Run a monthly UK payslip
Set each worker NI category letter, then compute. On a monthly salary of GBP 5,000, PAYE annualises to GBP 60,000, applies the GBP 12,570 allowance, taxes the remainder at 20 and 40 percent, and divides back to GBP 952.67. Category A employee NI lands at GBP 267.55 and employer NI at GBP 687.50, both from per-period thresholds. Net is gross less PAYE and employee NI; employer NI sits on the employer side and does not reduce take-home. Switch the letter to C or M and the slip reflects the zero rates immediately.
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 under the personal allowance, taxable income floors at zero and PAYE returns 0.00 with no negative tax.
NI thresholds are the annual figures divided by periods per year, computed per period with no intermediate rounding; only the final contribution is rounded to two decimals, matching the HMRC table method.
Employee NI applies the main rate between the primary threshold and the upper earnings limit, then the lower above-UEL rate on earnings beyond it, in two slices.
The resolver falls back to category A (standard rate) when a worker has no letter or an unrecognised one, so a slip never fails for a missing category.
If the NI category data is absent entirely, the engine falls back to the company-level NI rate fields rather than erroring, as a last resort.
The personal allowance and the annual NI thresholds are read from the payslip company, so companies on different settings compute on their own figures.
Periods per year are inferred from the slip date span (weekly, fortnightly, monthly, annual), so PAYE annualises and NI thresholds scale to the actual period.
What is inside
Built to do the job, end to end.
- Models and data. eh.hr.uk.tax.band holds the PAYE bands with the compute method; eh.hr.ni.category holds the category letters and their three rates with a resolver; res.company carries the personal allowance and the annual NI thresholds plus fallback rates; hr.employee carries the NI category letter.
- Salary structure and rules. A seeded United Kingdom Standard structure with rules for basic, gross, PAYE, employee NI, employer NI, and net pay, calling the helpers paye_uk, ni_employee, and ni_employer that this module injects into the rule sandbox.
- Admin views and access. Editable list views and payroll menu items for the UK tax bands and the NI categories, restricted to HR admins, with read and write access control rows for admin, officer, and employee-self groups on both data models.
- Tests. A post-install test suite asserting real 2025/26 statutory outcomes: the allowance and bands on annual gross, monthly PAYE, employee and employer NI for categories A, C, and M, and that net equals gross less PAYE and employee NI.
Honest about the edges
What this does not do, so nothing surprises you.
- This is a calculation and salary-structure module, not an HMRC filing tool. It does not submit RTI, FPS, or EPS returns and does not e-file to HMRC.
- PAYE uses a flat personal allowance, not a parsed tax code. There is no tax-code engine, no Week 1 / Month 1 emergency-code handling, and no cumulative year-to-date PAYE; each period is annualised and divided back.
- It covers the England, Wales and Northern Ireland income tax bands. Scottish and Welsh band variants are not seeded.
- National Insurance is the per-period table method for Class 1. The directors' annual or alternative NI method is not implemented.
- Out of scope: student loan and postgraduate loan deductions, pension auto-enrolment, statutory pay (SSP, SMP, SPP), the employment allowance, salary sacrifice, and P45/P60/P11D documents.
- The seeded rates are the 2025/26 figures. HMRC revises them each tax year, so confirm every band, rate, threshold, and the allowance against current HMRC guidance before each new year. The module ships the method; keeping the tables current is your responsibility.
- Requires the eh_hr_payroll engine; it is a localization layer, not a standalone payroll.
UK payroll Odoo 17, PAYE Odoo, National Insurance Odoo, NI category letter, personal allowance payroll, UK income tax bands, employee employer NI, UK salary structure Odoo, per period National Insurance, HMRC rates payroll, Class 1 NI Odoo, UK PAYE calculation, Odoo 17 Community payroll, tax bands 20 40 45, ERP Heritage payroll
Please log in to comment on this module