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 19.0
  4. Sales Conditions FAQ

EH HR Payroll

by ERP Heritage https://www.erpheritage.com.au/
Odoo
v 19.0 Third Party 26
Download for v 19.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 2237
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, a sandboxed rule engine, and payslips that ride a configurable workflow.

Free · LGPL-3Odoo 19 CommunityLGPL-3v1.0.0
Sequenced salary rules
Fixed, percentage, or Python amounts
Conditional rules: always, range, expression
Category kinds derive gross and net
Idempotent recompute

Why this module

EH HR Payroll

ENGINE

Rules are data, not patched code

A salary structure is an ordered list of rules. Each rule is a fixed amount, a percentage of a base, or a short Python expression evaluated against a closed payslip namespace. Later rules read earlier results and running category totals, so gross-based tax and net subtotals fall out naturally.

SAFE

Formulas that cannot reach the database

Rule expressions run through safe_eval with no imports, no builtins, and no ORM. The payslip and employee are exposed as read-only proxies that refuse underscore-prefixed names and name-mangle their backing stores, so a rule cannot read the cursor or the raw recordset. Negative tests prove the escape attempts fail the run.

TRUST

Every slip change is on an immutable chain

Payslips are audited: create, write, and unlink emit before and after snapshots into an append-only log where each row carries the sha256 of the previous row. A serialized advisory lock orders appends, and verify_chain walks the whole log to flag the first tampered row.

Day in the life

A monthly pay run, start to finish

A payroll officer opens a pay run for the period, drops in the employees, and hits compute all. Each draft slip runs its structure rules in sequence: basic reads the period wage, allowances take a percentage of basic, a gross subtotal accumulates, tax computes off gross, and net falls out from the category kinds. Auto inputs (an approved loan instalment, recorded overtime) are pulled in fresh on every compute, so the slip always reflects the current balance. The officer reviews, an admin confirms then pays (the confirm and pay buttons are gated to admin), and the run exports a payment file listing each confirmed slip's net. Every transition and figure lands on the audit chain.

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.

Idempotent recompute

Computing a slip twice does not double its lines. Compute unlinks the existing lines and rebuilds from scratch, so a re-run after editing a rule or changing the wage produces exactly one line per rule, proven by test.

Sandbox escape blocked

A rule that writes payslip.env, payslip._record, or categories._d to reach the cursor or the internal store fails the run with a clear error instead of leaking the ORM. The proxies refuse every underscore-prefixed name and mangle their backing dicts so even single-underscore backdoors are closed.

Broken formula caught early

A rule whose condition, amount, or quantity expression does not even compile is rejected at save time with a validation error, so a typo surfaces when you edit the rule, not halfway through a live pay run.

Self-approval guard

When a gated transition opens an approval chain, the real submitter is captured before the engine elevates to sudo, so the user who fired the transition cannot later approve their own request even if they hold an approver group.

Audit chain integrity

Concurrent writes cannot fork the hash chain: a transaction-scoped Postgres advisory lock serializes appends so each row hashes against the true tail, and it releases automatically on commit or rollback. Adding the company column never rehashes existing rows, so the chain survives upgrades.

Final state is terminal

A paid slip is final. The workflow refuses any further transition out of it even if a misconfigured definition declares one, so a paid slip is reversed through an accounting credit note, never silently cancelled back.

Auto inputs stay current

Feeder inputs (loan, overtime, advance) are rebuilt on every compute while hand-entered inputs are left untouched, so the slip never deducts a stale instalment and never wipes a manual adjustment.

What is inside

Built to do the job, end to end.

  • Salary structures and rules. eh.hr.salary.structure holds an ordered set of eh.hr.salary.rule records. Each rule has a category, a condition (always, numeric range, or Python expression), and an amount (fixed, percentage of a base, or expression). Categories carry a kind (basic, allowance, gross, deduction, net, employer contribution) that drives the derived totals.
  • Payslip and the rule engine. eh.hr.payslip computes lines by running the structure's active rules in sequence against a closed namespace of contract wage, worked days, inputs, running category totals, and prior rule results. Worked-days and input lines feed formulas as worked_days.CODE and inputs.CODE. Gross, total deductions, and net are stored computes off the category kinds.
  • Workflow, audit, and pay runs. The payslip rides the platform workflow engine (draft, computed, confirmed, paid, cancelled) with group-gated transitions and full audit emission. eh.hr.payslip.run batches slips for a period, computes them together, and exports a CSV payment file. A PDF payslip report is included.
  • Built to be extended by a localization. The base ships no tax tables. _get_rule_helpers, _collect_auto_inputs, _contract_wage, and _render_bank_file are clean extension points a country or feeder module overrides to add PAYG-style helpers, loan and overtime feeders, real contract reads, and a country bank-file format.

Honest about the edges

What this does not do, so nothing surprises you.

  • No country tax, social security, or superannuation tables ship in this module. The engine computes whatever rules you define; statutory tables and helper functions are added by a separate localization layer that overrides the documented extension points.
  • The bank file export is a generic CSV of employee, reference, and net amount. A country-specific payment format (for example a fixed-width national file) is produced by overriding the render method in a localization module.
  • Auto inputs from loans, overtime, advances, and gratuity are wired as extension points only. The base returns nothing; the actual feeders live in their own modules and append inputs on each compute.
  • The period wage is entered per payslip as basic_wage and read by formulas as contract.wage. This module does not read a real employment contract; a localization can override the wage source.
  • Salary rules are single expressions, not multi-statement scripts. Conditional logic uses inline expressions (a if cond else b). This keeps the sandbox portable across Odoo 16 to 19 and keeps formulas auditable.
  • This module owns no workflow, approval, or audit code of its own. It composes the platform engines from eh_hr_core and eh_hr_engine_workflow, which are required dependencies.
Search

Odoo 19 payroll, Odoo Community payroll, salary structure, salary rules, payslip computation, payroll engine, pay run batch, payslip batch, bank file export payroll, sandboxed salary formula, payroll audit trail, HR payroll Odoo, payslip workflow, gross net deduction payroll, configurable payroll rules

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 19 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