HR Disciplinary Actions and Warnings
Track verbal, written, suspension and final warnings through a configurable workflow, with a warning-count escalation ladder, employee acknowledgement, and a tamper-evident hash-chained audit trail.
Why this module
HR Disciplinary Actions and Warnings
Escalation reads real history
Each warning carries a validity window and lapses when it expires. The record counts the same employee's other still-active warnings as of the issue date and recommends the next step up the ladder, verbal then written then final. One click applies the recommendation to the action type.
Audit you can verify
Create, write and cancel are written to an append-only, sha256 hash-chained log that captures before and after snapshots of state, employee, action type, severity and reason. Any silent edit breaks the chain, and a verify routine walks it to find the first broken row.
Right people, right step
Transitions are gated by group. Issue, close and cancel are reserved for HR managers; the employee performs the acknowledge step. Closed and cancelled are final states that refuse any further transition, so a settled case cannot be quietly reopened.
Day in the life
A repeat lateness case, end to end
A manager opens a new disciplinary record for the employee. The form already shows two prior active warnings and recommends a final warning, so they apply the recommendation, write the reason, and issue. The employee opens the record, records their response in the acknowledgement field, and moves it to acknowledged. The manager closes it. Every step is captured in the chatter and written to the hash-chained audit log, and the warning will lapse automatically twelve months 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 escalation count excludes the current record and any cancelled warning, so a case never counts itself and a withdrawn warning never inflates the ladder.
A warning is active only while today is on or before its expiry date and it is not cancelled. Old warnings past their validity months drop out of the active count automatically.
Audit appends take a transaction-scoped Postgres advisory lock so two simultaneous writes cannot fork the hash chain; the lock releases on commit or rollback.
Actorless and system events are normalised consistently on both append and verify, and the company column is deliberately kept out of the hash material so adding it never breaks an existing chain.
Closed and cancelled are marked final; the workflow engine refuses any further transition from them even if a misconfigured definition declares one.
Records are company-required on create, and a write that moves a record into a company the user does not belong to is refused unless an explicit, separately audited override is set.
A write whose audited fields are unchanged emits no audit row, so noise transitions and no-op saves do not pollute the trail.
What is inside
Built to do the job, end to end.
- Four action types. Verbal warning, written warning, suspension and final warning, each with a low, medium or high severity for triage and reporting.
- Configurable workflow. Draft, issued, acknowledged, closed and cancelled are defined as data in the platform workflow engine, so the steps and the order between them can be changed without code.
- Validity and expiry. Validity months default to twelve and drive a stored expiry date and an active flag, so each warning lapses on schedule and stops counting toward escalation.
- Escalation ladder. Prior active count and a recommended action are computed from the employee's history, with an Apply Recommended button that sets the action type to the suggestion.
- Acknowledgement step. A dedicated acknowledgement text field plus an employee-performed acknowledge transition record that the worker was informed and how they responded.
- Audit and chatter. mail.thread tracking on key fields plus the platform hash-chained audit log give both a human-readable history and a tamper-evident record.
- Automatic numbering. Each record gets a DISC reference by year from a company-independent sequence, generated on save and locked from manual edits.
Honest about the edges
What this does not do, so nothing surprises you.
- The escalation recommendation is advisory; it suggests the next action type from the warning count but does not block or force a transition.
- The recommendation ladder covers verbal, written and final only; suspension is a selectable action type but is not a step the recommendation will suggest.
- Acknowledgement is a workflow step plus a free-text field, not a portal e-signature or external sign-off.
- This module does not gate transitions through an approval chain; transitions are controlled by group membership, not multi-level approval requests.
- Warnings lapse by comparison against the validity window on read; there is no scheduled job in this module that flips a status when a warning expires.
- Requires the EH HR Platform base modules (eh_hr_core, eh_hr_compat, eh_hr_engine_workflow) and Odoo hr; it owns no workflow or audit code of its own and relies on the platform for both.
odoo 17 hr disciplinary, employee disciplinary action odoo, employee warning tracking, progressive discipline software, verbal written final warning, disciplinary workflow odoo, hr audit trail odoo, warning expiry tracking, employee acknowledgement odoo, multi company hr odoo, tamper evident audit log, odoo community hr platform
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