EH HR Employee Update
Employee self-service change requests, submitted, approved, and audited inside Odoo.
Why this module
EH HR Employee Update
Nothing changes without a sign-off
A request stays a request until a manager approves it and an HR officer applies it. Each step is gated to a specific HR group, so the path from draft to applied is the same for everyone and cannot be skipped.
Every step on a verifiable chain
State changes and the request fields are written to an append-only, hash-chained log. Appends are serialized by a Postgres advisory lock and the chain can be verified on demand, so you can show who moved a request and when without bolting on extra tooling.
No side spreadsheet, no second tool
Employees raise and track their own change requests from the standard Apps menu, on the same audited platform as the rest of their HR. There is nothing extra to buy, build, or keep integrated.
Day in the life
A phone number that actually gets updated properly
An employee opens a request, names the field as Mobile phone, types the old number as the current value and the new one as the requested value, adds a short reason, and submits. The request lands with a manager, who approves it; an HR officer then applies it to close the request out. Each move is stamped into the audit chain and shown on the request's chatter, so months later anyone can see the number changed, who asked, who approved, and who applied it.
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.
Once a request reaches Applied or Rejected it is marked final by the workflow definition; the engine refuses any further transition from it, even one a misconfigured definition might declare, so closed requests cannot be quietly reopened.
Submit is limited to the self-service group, approve and reject to HR managers, and apply to HR officers. A user outside a transition's allowed groups is blocked with a clear error rather than silently advancing the request.
The audit log is hash-chained, where each row carries the hash of the one before it. A transaction-scoped Postgres advisory lock serializes appends so two concurrent requests cannot fork the chain, and verify_chain walks the log to find the first row that no longer matches.
Every request is owned by a company and defaults to the active one. Writing a request into a company the user is not a member of is refused, and any permitted cross-company elevation is itself recorded as an audit event.
References are drawn from a company-independent sequence as UPD/<year>/<counter> only when the name is still New, so a request keeps its number on later edits and never silently renumbers.
If the sequence is missing the create still succeeds with a UPD/AUTO fallback rather than failing, so a request can always be raised.
What is inside
Built to do the job, end to end.
- One model, on shared engines. Adds the eh.hr.employee.update model carrying the employee, field label, current value, requested value, and reason. It owns no workflow or audit code of its own; the lifecycle and the audit trail come from the platform engines it inherits.
- Workflow as data. Ships a workflow definition with draft, submitted, approved, applied, and rejected states and the submit, approve, apply, and reject transitions between them. The states and their order live as records, so an administrator can read and reason about the path without touching Python.
- List, form, and menu. Includes a list and a form view with a status bar and the submit, approve, apply, and reject buttons that appear only on the matching state, an Update Requests action, and a menu entry. The form carries the standard chatter for tracked changes and messages.
- Security and audit wiring. Ships access rules for HR admin, officer, manager, and self-service groups, a company-independent reference sequence, and the audited and company-aware mixins that record changes and enforce company scope. A small post-install test suite covers the defaults, the full submit-to-applied path, and rejection.
Honest about the edges
What this does not do, so nothing surprises you.
- Applying a request advances its workflow to the applied state and audits it; the module does not write the requested value back onto the hr.employee record automatically, so an HR officer makes the actual edit and applies the request to close it out.
- There is no employee portal or website form; requests are raised and managed from the standard Odoo backend by users with the relevant HR group.
- Approval is enforced by group-gated transitions, not by a multi-step approval chain or escalation ladder; the request moves manager then officer, and that path is fixed by the shipped workflow definition.
- The module adds no scheduled jobs, reminders, or notifications of its own; those belong to other platform modules.
- There are no per-field validation rules on the requested value; the field label and requested value are free text describing the change.
- Targets Odoo 18 Community and depends on eh_hr_core, eh_hr_compat, eh_hr_engine_workflow, and the standard hr module.
employee self service Odoo, employee data change request, HR update request workflow, employee information update Odoo 18, HR approval workflow Odoo, manager approval employee changes, tamper-evident HR audit log, hash-chained audit trail Odoo, multi-company HR Odoo Community, employee record correction request, HR self-service Odoo 18, Odoo HR platform module, employee phone address update approval, HR change governance Odoo
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