EH HR Employee History
A clean, audited employee timeline that lives inside Odoo, not in a spreadsheet.
Why this module
EH HR Employee History
Every entry is audited
Each create, edit and delete on a history record is written to the platform append-only, hash-chained audit log, which you can verify on demand to show nothing was altered after the fact. The module owns no audit code of its own; it inherits the same engine the rest of the HR suite uses.
Scoped to one company
Every entry carries a required company. Cross-company writes are refused by default, even under elevated rights, unless an explicit audited override is used. There is no global null-company leak across companies.
A log, not a workflow
This is a flat, manual history record with no hidden state machine. You add entries with the value before and the value after a change, and the platform keeps them ordered, searchable and audited. What it installs is exactly what the source shows.
Day in the life
From scattered notes to one audited timeline
An HR officer opens an employee, adds a history entry for a promotion, types the old role in Old value and the new role in New value, and saves. The entry lands on a company-scoped, date-ordered timeline, and the change is written to the hash-chained audit log automatically. Months later, during a review, the team filters the list by event type or groups by employee to reconstruct exactly who moved, when, and from what to what, with an audit row behind every line.
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.
Each history change appends a sha256 row chained to the previous one. Any later edit that does not recompute the whole downstream chain is caught by the verify_chain check, so the trail is tamper-evident rather than just logged.
Audit appends are serialized by a transaction-scoped Postgres advisory lock, so two history records written at the same moment cannot fork the hash chain. The lock releases on commit or rollback.
company_id is required and defaults to the active company. Moving a record into a company the user does not belong to is refused, even under sudo, unless an explicit allow_cross_company override is set, and that elevation is itself audited with every affected record id.
Entries are linked to the employee with ondelete cascade, so removing an employee removes their history rows cleanly rather than leaving orphans, while the prior changes remain reconstructable from the audit log.
The employee self group has read access only. Officers and admins can create and edit; ordinary employees cannot quietly add or rewrite their own milestones.
Entries sort by event date descending, then by id, so back-dated milestones slot into the correct place on the timeline instead of appearing at the bottom in entry order.
What is inside
Built to do the job, end to end.
- One model, fully audited. Adds the eh.hr.employee.history model, inheriting the platform audited and company-aware mixins plus mail.thread for the chatter. It extends no standard Odoo model directly; it stands on the platform engines in eh_hr_core.
- Six milestone types. A fixed event type list covering joined, promoted, transferred, salary change, role change and left, each with an event date, a short title, an optional description, and Old value and New value fields to record what the change was from and to.
- List, form and search. A date-ordered list, a clean form with a description block and chatter, and a search view with quick filters for Joined and Left plus group-by on employee and event type. The menu sits in the platform Records section, gated to the HR officer group.
- Layered access. Security grants HR admin and HR officer full create, read, write and delete, while the employee self group gets read-only access, all defined in the shipped ir.model.access rules.
Honest about the edges
What this does not do, so nothing surprises you.
- This is a manual log. It does not automatically generate history entries when an employee record, contract or salary changes elsewhere in Odoo; an officer creates each entry.
- It records a single Old value and New value as free text per entry, not a structured multi-field diff of the employee record.
- It contains no approval flow, no notifications and no scheduled jobs of its own. The hash-chained audit log, advisory-lock serialization and retention live in the eh_hr_core platform engine, not in this module.
- It requires the EH HR Platform foundation: it depends on eh_hr_core and eh_hr_compat alongside standard hr.
- It targets Odoo 16 Community.
odoo employee history, odoo 16 hr audit trail, employee change log odoo, employee milestone tracking, promotion transfer history odoo, salary change record, hr employee timeline, company scoped hr odoo, hash chained audit log, tamper evident hr records, odoo community hr platform, before and after value tracking, erp heritage hr, self hosted odoo hr, lgpl hr module
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.
Languages
Available in 19 languages
The interface ships translated out of the box. Switch language in Odoo and the fields, menus, and messages follow.
Please log in to comment on this module