| Versions | 16.0 17.0 18.0 19.0 |
EH HR Platform
Install the whole HR platform in one click.
Why this module
EH HR Platform
Built on standard Odoo HR
Source-of-record modules project back into native hr.attendance and the standard HR records, so payroll and reporting keep reading the data they already know. No parallel tables to reconcile, no second copy of an employee to maintain.
An audit trail you can verify
Changes append to a sha256 hash-chained log, serialized by a Postgres advisory lock so concurrent writes cannot fork the chain. A verify pass walks the chain and reports the first row that was edited after the fact, giving you a cheap integrity proof at audit time.
Rules as data, not Python
Workflows are state machines stored as records, approval chains are N-step definitions, and HR rules run through a restricted policy evaluator that never calls Python eval or touches the ORM. An administrator changes how the business runs without a developer and without a deploy.
Day in the life
From install to running HR in an afternoon
You install one module from Apps. The bundle pulls in the core, the four engines, the attendance and leave flagships and every feature module in the right order, and grants the HR admin, attendance and leave groups to your administrator. A clock-in writes an immutable attendance event that projects into a native hr.attendance row. A leave request runs an approval chain where the requester cannot approve their own time off, and an overdue step escalates itself to the approvers and HR admins once. Every consequential change lands in the hash-chained audit log. Nothing phones home, and there is no per-user fee keeping the lights on.
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 audit log takes a transaction-scoped Postgres advisory lock before appending, so two concurrent writes cannot read the same chain tail and fork it. The lock releases automatically on commit or rollback.
An approval decision can only be recorded by an authorized approver for the current step, and the subject employee, that employee's user, and the user who submitted the request are blocked from approving even if they hold an approver group. A constraint on the decision row re-enforces this on every create path, including direct ORM and sudo writes.
Attendance projection upserts hr.attendance rows keyed by employee and event timestamp, and re-running the projection produces the same result. Rows created directly through standard Odoo are flagged unmanaged and never touched by the projector.
The attendance event log and the leave balance ledger are both append-only: write and unlink raise on any attempt to mutate or delete a recorded row, so corrections are made by reversing entries, not by editing history.
Company-aware records default company_id to the active company and require it on create, and an attempt to write a company the user is not a member of is refused. Audit rows and approval requests store the owning company so per-company record rules scope reads.
The escalation cron notifies an overdue approval step's approvers and the HR admins exactly once per step, flags the request so later runs do not re-notify, and resets the flag when the request advances to a new step.
The policy evaluator accepts only a small whitelist of literals, context reads, comparisons, boolean logic, arithmetic and a conditional. It never imports user code, never calls Python builtins, and rejects anything outside the grammar, so a bad rule cannot run arbitrary code.
What is inside
Built to do the job, end to end.
- Core and engines. eh_hr_core supplies the audited mixin, the hash-chained audit log, the company-aware mixin, feature flags, rate limiting and platform settings. Four engines sit on top: workflow (state machines as data), approval (reusable N-step chains with dynamic approvers and escalation), policy (a safe no-code rule DSL with scoped fallback) and notification (channel-abstract dispatch over in-app, email, and optional sms, push and webhook adapters).
- Attendance and leave flagships. eh_hr_attendance_pro keeps an immutable event log as the source of record and projects paired events into native hr.attendance, with shifts, geofence, kiosk and correction support. eh_hr_leave_pro adds policy-driven accrual, carryover and expiry on top of standard Time Off, backed by an append-only balance ledger for full audit replay.
- Every feature module included. Overtime, appraisal, disciplinary, resignation, transfer, custody, insurance, gratuity, document expiry, reminders, loans, salary advance, payroll and payroll link, dashboard, referral, announcement, background checks, policy acknowledgement, employee self-service updates, reward, lawsuit, service requests, employee history, recruitment, skills and training. Each one also installs on its own and pulls only its own dependencies.
- Tested across four Odoo series. One authored source targets Odoo 16, 17, 18 and 19 Community; the 16 and 17 view layers are derived from it by a build step. The platform ships a large automated unit-test suite that is run green on every series before release.
Honest about the edges
What this does not do, so nothing surprises you.
- This module is a convenience bundle only. It contains no models, views or data of its own, just the dependency list of 35 modules, so all behaviour comes from the modules it installs.
- Installing the bundle installs everything. If you want only part of the platform, install the individual modules you need instead, each pulls only its own dependencies.
- The sms, push and webhook notification channels are delegated to optional adapter modules and are skipped silently when those adapters are not installed; in-app and email work out of the box.
- Audit log retention is a configurable window (default 730 days) trimmed by the platform; the audit trail is an integrity record inside your database, not an external archive service.
- Community payroll here is the platform's own salary structures, rules and payslips with optional accounting posting; country-specific statutory payroll rules are separate localization modules, not part of this bundle.
- Self-hosted on your own Odoo server. There is no hosted service, no data leaves your database, and no support for Odoo Enterprise-only dependencies.
odoo 19 hr suite, odoo human resources community, odoo hr platform bundle, odoo attendance management, odoo leave management, odoo overtime approval, odoo employee appraisal, odoo disciplinary action, odoo resignation offboarding, odoo employee transfer, odoo asset custody, odoo employee insurance, odoo end of service gratuity, odoo employee documents expiry, odoo hr reminders, odoo employee loan, odoo salary advance, odoo payroll community, odoo recruitment, odoo skills and training, odoo hr approval workflow, odoo hr audit trail, multi company hr odoo, self hosted odoo hr, odoo 16 17 18 19 hr
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.
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.
Please log in to comment on this module