| 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 |
EH HR Payroll United Kingdom
A ready UK salary structure that computes PAYE on a personal allowance and progressive tax bands, plus per-period employee and employer National Insurance by category letter, all from editable rate tables you keep current with HMRC.
Why this module
EH HR Payroll United Kingdom
The hard part is the calculation, not the numbers
The PAYE band loop and the per-period NI math are the fixed engineering. The tax bands, NI category rates, personal allowance, and annual NI thresholds are plain data on records and company settings, so when HMRC revises the tax year you edit rows, not code.
NI computed per period, the way HMRC tables work
National Insurance is per period and non-cumulative: the annual primary, upper earnings, and secondary thresholds are divided by the periods per year, and only the final contribution is rounded. This matches the HMRC table method where each pay period stands on its own.
Workflow, audit, and scoping come from the engine
This module is a calculation layer. It adds three safe helpers to the rule sandbox and a seven-rule structure; the payslip workflow, the append-only audit log, and strict multi-company scoping are inherited from the shared EH HR platform, not reinvented here.
Day in the life
Run a UK monthly payroll
Assign the United Kingdom Standard structure to an employee, set their NI category letter (A by default), and compute the payslip. PAYE annualises the month, taxes it across the bands above the personal allowance, and divides back. 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 above the per-period secondary threshold. Net is gross less PAYE and employee NI; employer NI is shown employer-side and does not reduce take-home. Before each new tax year, open Tax Bands (UK) and NI Categories (UK) under Payroll and reconcile every figure against the current HMRC rates and thresholds.
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 category resolver falls back to the standard rate letter A when an employee's NI letter is empty or unrecognised, so a payslip never computes against a missing rate set.
If the NI category table is empty, the payslip drops back to per-company fallback NI rate fields rather than zeroing the contribution, keeping the calculation defined.
When annual gross is at or below the personal allowance, taxable income floors at zero and PAYE returns exactly zero rather than a negative tax.
Employee NI is zero below the per-period primary threshold and the upper-rate slice only applies once earnings pass the upper earnings limit; employer NI is zero below the per-period secondary threshold.
Over State Pension age (C) zeroes employee NI while the employer still pays at 15 percent; under 21 (M) charges the employee the standard rate while the employer pays nothing. Both are seeded and tested.
Periods per year are inferred from the slip date span (weekly, fortnightly, monthly, annual), so the same annual thresholds and bands scale correctly to whatever cadence the period represents.
NI thresholds are scaled with no intermediate rounding and only the final contribution is rounded to two decimals, so per-period figures match the statutory worked examples.
The tax band and NI category lists are editable but gated to the HR admin group, with officers read and create and self-service read only, so rate changes stay with authorised staff.
What is inside
Built to do the job, end to end.
- PAYE on allowance and bands. eh.hr.uk.tax.band holds the taxable-income ceilings and rates. compute_annual_paye taxes annual gross less the personal allowance slice by slice; compute_period_paye annualises the period, taxes it, and divides back rounded to two decimals. Seeded with basic 20 percent to GBP 37,700 taxable, higher 40 percent, additional 45 percent.
- National Insurance by category letter. eh.hr.ni.category carries the three published percentages per letter: employee main rate, employee rate above the upper earnings limit, and employer rate. Letters A, B, C, H, and M are seeded with the 2025/26 values and resolved per payslip from the employee's NI category field.
- Company-level thresholds and allowance. res.company carries the annual personal allowance and the annual NI primary, upper earnings, and secondary thresholds, plus fallback NI rate fields. Per-period thresholds are these annual figures divided by the periods per year.
- Three rule helpers on the engine seam. The payslip overrides _get_rule_helpers to expose paye_uk, ni_employee, and ni_employer to UK salary rules. Each is a safe callable that reads the resolved category and company settings and returns a per-period amount.
- UK_STANDARD salary structure. A seven-rule structure wires basic, gross, PAYE, employee NI, employer NI, and net through the engine's category totals, so net is gross minus deductions and employer NI is shown employer-side.
- Verified against statutory examples. The test suite asserts real 2025/26 figures: PAYE on GBP 60,000, monthly NI for categories A, C, and M, and a full payslip where net equals gross less PAYE and employee NI. The numbers are derived from the seeded HMRC data, not set by the tests.
Honest about the edges
What this does not do, so nothing surprises you.
- This is a calculation layer for Odoo 18 Community and requires the EH HR payroll engine and Odoo hr. It is not a standalone payroll application.
- The seeded figures are the published 2025/26 rates and thresholds. HMRC revises them each tax year, so you must verify every band, NI rate, allowance, and threshold against the current HMRC tables before each new year. The method is fixed; the numbers are yours to keep current.
- National Insurance is per-period and non-cumulative (the HMRC table method). It does not run a cumulative year-to-date NI calculation or director's annual-earnings-period method.
- PAYE here is the band calculation on a personal allowance. It does not apply individual tax codes, cumulative month-by-month tax-code mechanics, emergency codes, or the GBP 100,000 personal-allowance taper.
- It does not file with HMRC. There is no Real Time Information, no Full Payment Submission or Employer Payment Summary, and no P45, P60, or P11D output.
- It does not cover pension auto-enrolment, student loan deductions, statutory sick or maternity pay, the employment allowance, or salary-sacrifice handling.
- Bands and NI rates apply England, Wales, and Northern Ireland figures by default and do not model separate Scottish or Welsh income tax bands.
- It computes and records payslips but does not post them to accounting; journal posting is a separate concern.
- The wage fed to rules defaults to the payslip's own basic wage for the period; reading a dated contract is an engine override point, not behaviour added here.
UK payroll Odoo 18, PAYE Odoo, National Insurance Odoo payroll, NI category letters, UK income tax bands payroll, personal allowance PAYE, employer National Insurance, employee Class 1 NIC, HMRC rates and thresholds 2025 2026, UK salary structure Odoo, progressive tax bands payroll, per period National Insurance, Odoo 18 community payroll localization, ERP Heritage payroll
Please log in to comment on this module