Skip to Content
Odoo Menu
  • Sign in
  • Try it free
  • Apps
    Finance
    • Accounting
    • Invoicing
    • Expenses
    • Spreadsheet (BI)
    • Documents
    • Sign
    Sales
    • CRM
    • Sales
    • POS Shop
    • POS Restaurant
    • Subscriptions
    • Rental
    Websites
    • Website Builder
    • eCommerce
    • Blog
    • Forum
    • Live Chat
    • eLearning
    Supply Chain
    • Inventory
    • Manufacturing
    • PLM
    • Purchase
    • Maintenance
    • Quality
    Human Resources
    • Employees
    • Recruitment
    • Time Off
    • Appraisals
    • Referrals
    • Fleet
    Marketing
    • Social Marketing
    • Email Marketing
    • SMS Marketing
    • Events
    • Marketing Automation
    • Surveys
    Services
    • Project
    • Timesheets
    • Field Service
    • Helpdesk
    • Planning
    • Appointments
    Productivity
    • Discuss
    • Approvals
    • IoT
    • VoIP
    • Knowledge
    • WhatsApp
    Third party apps Odoo Studio Odoo Cloud Platform
  • Industries
    Retail
    • Book Store
    • Clothing Store
    • Furniture Store
    • Grocery Store
    • Hardware Store
    • Toy Store
    Food & Hospitality
    • Bar and Pub
    • Restaurant
    • Fast Food
    • Guest House
    • Beverage Distributor
    • Hotel
    Real Estate
    • Real Estate Agency
    • Architecture Firm
    • Construction
    • Property Management
    • Gardening
    • Property Owner Association
    Consulting
    • Accounting Firm
    • Odoo Partner
    • Marketing Agency
    • Law firm
    • Talent Acquisition
    • Audit & Certification
    Manufacturing
    • Textile
    • Metal
    • Furnitures
    • Food
    • Brewery
    • Corporate Gifts
    Health & Fitness
    • Sports Club
    • Eyewear Store
    • Fitness Center
    • Wellness Practitioners
    • Pharmacy
    • Hair Salon
    Trades
    • Handyman
    • IT Hardware & Support
    • Solar Energy Systems
    • Shoe Maker
    • Cleaning Services
    • HVAC Services
    Others
    • Nonprofit Organization
    • Environmental Agency
    • Billboard Rental
    • Photography
    • Bike Leasing
    • Software Reseller
    Browse all Industries
  • Community
    Learn
    • Tutorials
    • Documentation
    • Certifications
    • Training
    • Blog
    • Podcast
    Empower Education
    • Education Program
    • Scale Up! Business Game
    • Visit Odoo
    Get the Software
    • Download
    • Compare Editions
    • Releases
    Collaborate
    • Github
    • Forum
    • Events
    • Translations
    • Become a Partner
    • Services for Partners
    • Register your Accounting Firm
    Get Services
    • Find a Partner
    • Find an Accountant
      • Get a Tailored Demo
    • Implementation Services
    • Customer References
    • Support
    • Upgrades
    Github Youtube Twitter Linkedin Instagram Facebook Spotify
    +32 2 290 34 90
    • Get a Tailored Demo
  • Pricing
  • Help
  1. APPS
  2. Employees
  3. EH HR Payroll v 16.0
  4. Sales Conditions FAQ

EH HR Payroll

by ERP Heritage https://www.erpheritage.com.au/
Odoo
v 16.0 Third Party 26
Download for v 16.0 Deploy on Odoo.sh
Apps purchases are linked to your Odoo account, please sign in or sign up first.
Versions 16.0 17.0 18.0 19.0
You bought this module and need support? Click here!
Availability
Odoo Online
Odoo.sh
On Premise
Odoo Apps Dependencies • Employees (hr)
• Discuss (mail)
Community Apps Dependencies Show
• EH HR Compatibility
• EH HR Platform Core
• EH HR Workflow Engine
Lines of code 2226
Technical Name eh_hr_payroll
LicenseLGPL-3
Websitehttps://www.erpheritage.com.au/
Versions 16.0 17.0 18.0 19.0
ERP Heritage · HR Platform
ERP Heritage . HR Platform

EH HR Payroll

Salary structures, sequenced rules, and audited payslips on the EH HR Platform workflow engine, for Odoo 16 Community.

Free · LGPL-3v 1.0.0LGPL-3v1.0.0
Salary structures
Sequenced rules
Sandboxed formulas
Draft to paid
Hash-chained audit

Why this module

EH HR Payroll

01 / DEPTH

A real rule engine, not a flat table

Rules run in sequence and accumulate per category, so a later rule reads categories.GROSS or rules.BASIC.total like a proper payroll engine. Fixed, percentage-of-base, or a short Python expression. Gross, total deductions and net are derived from each category kind, not hand-keyed.

02 / SAFETY

Sandboxed formulas that cannot escape

Rule expressions run in a closed namespace with no imports, no ORM, no builtins. Read-only proxies mediate every access, so a rule cannot reach payslip.env, the raw recordset, or the internal stores. Tests prove each of these escape attempts fails the run rather than leaking.

03 / TRUST

Every payslip is audited end to end

Each payslip rides the platform workflow with group-gated transitions and writes before/after snapshots to an append-only, hash-chained log you can verify on demand. Multi-company writes are scoped and refused across companies. The audit and workflow code is shared, not reinvented here.

Day in the life

A payroll officer runs a monthly pay batch.

A pay run is opened for the period and a payslip is created for each employee on a salary structure. Compute-all runs every draft slip in one pass: each structure's rules fire in sequence, basic reads the period wage as contract.wage, a housing allowance takes twenty percent of basic, tax takes ten percent of the running gross, and an employer contribution is computed but kept out of net. Recomputing is safe because the lines are rebuilt each time, never duplicated, and auto inputs fed in by loan or overtime modules are refreshed while manual inputs are left alone. An admin confirms and then pays the slips; each transition is group-gated and snapshotted to the hash-chained audit log. A payment file is exported from the confirmed slips, and each slip prints as a PDF payslip. Accounting posting, if the team runs it, is a separate optional bridge.

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.

SANDBOX

A salary rule formula runs in a closed namespace with no imports, ORM or builtins. Read-only proxies refuse payslip.env, the wrapped recordset (payslip._record), and the name-mangled backing stores. Each escape attempt raises and fails the run instead of leaking, and is covered by a dedicated test.

VALIDATION

A rule whose condition, amount, base or quantity expression does not even compile is rejected at save time with a clear error, so a broken formula is caught before a payroll run, not mid-compute.

IDEMPOTENT COMPUTE

Recomputing a payslip unlinks and rebuilds its lines rather than appending, so a double compute never duplicates lines. Auto inputs from feeder modules are rebuilt each compute while hand-entered inputs are preserved, so the slip always reflects the current loan balance or approved overtime.

WORKFLOW GUARDS

Transitions are gated by group: officers compute and cancel from draft, admins confirm and pay. A final state (paid or cancelled) refuses any further transition, and a confirmed slip can be cancelled by an admin while a paid slip is terminal and must be reversed downstream, not cancelled.

MULTI-COMPANY

Payslips and pay runs carry a required company and refuse cross-company writes unless an explicit audited override is set, so records never leak across companies through a null-company rule.

AUDIT IMMUTABILITY

Every state change snapshots audited fields to an append-only, hash-chained log. A Postgres advisory lock serializes appends so concurrent runs cannot fork the chain, and verify_chain walks it to prove no row was edited after the fact.

MISSING CODES

A formula that references a category, rule, worked-days or input code that has not contributed reads a neutral zero rather than raising, so a partially configured structure still computes predictably.

What is inside

Built to do the job, end to end.

  • Salary structures and sequenced rules. eh.hr.salary.structure groups eh.hr.salary.rule records applied in sequence. Each rule has a category, a condition (always, numeric range, or Python), and an amount that is a fixed value, a percentage of a base expression, or a Python expression. An appears_on_payslip flag lets a rule compute and feed later rules without showing a line.
  • Categories that drive gross and net. eh.hr.salary.rule.category carries a kind (basic, allowance, gross, deduction, net, employer contribution, other). The payslip derives gross, total deductions and net from those kinds, so employer contributions are computed but excluded from take-home. Seeded categories BASIC, ALW, GROSS, DED, NET and EECON ship in the box.
  • Payslips on the workflow engine. eh.hr.payslip computes its lines from the structure, accumulating per-category totals so later rules read earlier results. It rides the shared workflow mixin (draft, computed, confirmed, paid, cancelled), the audited mixin, and the strict company-aware mixin. Worked-days and input lines feed the formulas as worked_days.CODE and inputs.CODE.
  • Pay-run batches and bank file export. eh.hr.payslip.run groups slips for a period, computes them all in one action, totals net, and exports a payment file from confirmed or paid slips. The default export is a generic CSV; a country localization overrides one method to emit its own bank format.
  • Extension points for localizations and feeders. Documented hooks let other modules plug in without forking: _get_rule_helpers adds safe callables to the sandbox, _collect_auto_inputs feeds loan, overtime, advance or gratuity inputs, _on_payslip_paid marks sources processed on payment, and _contract_wage can read a real contract. Pay periods per year are inferred for annualisation.
  • PDF payslip and security. A QWeb PDF payslip report prints the lines, categories and totals. Access rights are defined for HR admin, officer and employee self-service groups across every model, with the heavier write and delete rights reserved for admins.

Honest about the edges

What this does not do, so nothing surprises you.

  • This is a salary-rule and payslip engine, not a country payroll pack. It ships no statutory tax tables, social-security brackets or local payslip layouts. Those are expected from a localization module that overrides the rule-helper and bank-file hooks.
  • It does not post to accounting on its own. Journal posting and reversal are handled by a separate optional bridge module installed only if you run Odoo accounting.
  • The bank file export is a generic CSV. A specific bank format (for example an ABA or SEPA file) requires a localization that overrides the render method.
  • Rule formulas are single expressions, not multi-line statements, evaluated by safe_eval in eval mode for portability. Conditional logic uses inline a if cond else b.
  • It computes from a per-period basic wage on the payslip by default. Reading a live employment contract requires a localization to override the contract-wage hook.
  • It depends on the EH HR Platform engines (eh_hr_core, eh_hr_compat, eh_hr_engine_workflow) and standard Odoo hr; it is not a standalone payroll app.
Search

Odoo 16 payroll, Odoo Community payroll, salary structure, salary rules, payslip, payslip computation engine, sandboxed salary rule, pay run batch, bank file export payroll, gross net deductions, employer contribution, multi-company payroll, hash-chained audit payroll, PDF payslip, ERP Heritage HR Platform

Work with ERP Heritage

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.

Build and tailor
Odoo Implementation, Customization and Development, scoped to your workflow.
Connect and move
Odoo Integration and Migration across systems and Odoo versions.
Run and support
Odoo Support and Training so your team stays productive after go live.
Plan and advise
Odoo Consultation and ERP Consulting, from discovery to roadmap.

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.

ArabicChinese (Simplified)Chinese (Traditional)DutchFrenchGermanHindiIndonesianItalianJapaneseKoreanPolishPortuguese (Brazil)RussianSpanishSwedishThaiTurkishVietnamese
ERP Heritage

Production-grade Odoo HR, built to an engineering bar and documented honestly. Support: info@erpheritage.com.au
Developed by ERP Heritage - Top Odoo Partner • LinkedIn

v1.0.0 · LGPL-3 · Odoo 16 Community

Please log in to comment on this module

  • The author can leave a single reply to each comment.
  • This section is meant to ask simple questions or leave a rating. Every report of a problem experienced while using the module should be addressed to the author directly (refer to the following point).
  • If you want to start a discussion with the author, please use the developer contact information. They can usually be found in the description.
Community
  • Tutorials
  • Documentation
  • Forum
Open Source
  • Download
  • Github
  • Runbot
  • Translations
Services
  • Odoo.sh Hosting
  • Support
  • Upgrade
  • Custom Developments
  • Education
  • Find an Accountant
  • Find a Partner
  • Become a Partner
About us
  • Our company
  • Brand Assets
  • Contact us
  • Jobs
  • Events
  • Podcast
  • Blog
  • Customers
  • Legal • Privacy
  • Security

Odoo is a suite of open source business apps that cover all your company needs: CRM, eCommerce, accounting, inventory, point of sale, project management, etc.

Odoo's unique value proposition is to be at the same time very easy to use and fully integrated.

Website made with