EH HR Announcement
Company announcements, governed and audited.
Why this module
EH HR Announcement
A real workflow, not a status field
Each announcement moves through draft, published, archived and cancelled states defined as data in the platform workflow engine. Publish, archive and cancel are restricted to the HR officer group, final states block any further transition, and every move is tracked on the chatter.
Tamper-evident audit on every change
State, title, category, dates, audience and pin changes are written to an append-only, sha256 hash-chained audit log shared across the platform. Appends are serialized with a Postgres advisory lock and the chain can be verified on demand, so an edited record shows up.
Right notice, right audience
Aim an announcement at the whole company, selected departments or named employees. The reached audience and a head count are resolved automatically from that choice, and the whole-company option is scoped to the announcement's own company.
Day in the life
From draft notice to audited record
An HR officer opens a new announcement, which auto-numbers itself ANN/2026/00001 and lands in draft. They write the headline and body, set the category to policy, pick selected departments as the audience and watch the reached head count fill in. Publish moves it to published, the publish date governs when it counts as live, and an optional expiry date stops it counting as live afterwards. A pin keeps the most important notice at the top of the list. When the message is no longer current, Archive closes it. Every step, the state change, the date, the audience, lands in the hash-chained audit log, so months later anyone can show exactly who published what and when, and prove the record was never quietly edited.
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.
Audit rows are append-only and sha256 hash-chained: each row hashes the previous row's hash plus its own fields, so any after-the-fact edit breaks the chain and is caught by verify_chain.
Chain appends are serialized with a transaction-scoped Postgres advisory lock, so two simultaneous writes cannot read the same tail and fork the audit chain.
company_id is required and defaults to the current company; writing a record into a company the user does not belong to is rejected, and any audited cross-company override is itself logged.
Archived and cancelled are marked final, so the engine refuses any further transition out of them even if a misconfigured definition declared one.
The ANN reference is assigned once from the sequence on create and is read-only and non-copyable, so duplicating an announcement never reuses or collides a reference.
is_live is computed from state plus the publish and expiry dates, so a published announcement before its publish date or past its expiry date correctly reports as not live.
What is inside
Built to do the job, end to end.
- Model it adds. One model, eh.hr.announcement, with title, body, category, publish and expiry dates, pin flag, audience selector, department and employee targets, and computed audience and live fields. It adds no parallel tables to standard HR.
- Workflow as data. A workflow definition with draft, published, archived and cancelled states and publish, archive and cancel transitions, all loaded as data and gated to the HR officer group. Buttons on the form call the matching transition.
- Shared platform engines. Inherits the workflow, audited and company-aware mixins plus mail.thread, so the state machine, the hash-chained audit trail and strict company scoping come from the platform, not from code duplicated here.
- Security and numbering. Four access tiers (admin, officer, manager, self-service read) and a company-independent ANN/year sequence with five-digit padding. Tests cover defaults, the publish and archive path, cancel, audience resolution and the live window.
Honest about the edges
What this does not do, so nothing surprises you.
- This module records and governs announcements inside Odoo. It does not send email, push notifications or chat messages to the targeted audience; the audience and head count are resolved for visibility and reporting, not for delivery.
- There is no scheduled job. The expiry date drives the computed live flag in real time but does not auto-archive the record; archiving is a manual workflow action.
- The announcement workflow ships without approval gating, so publish, archive and cancel are direct transitions restricted to the HR officer group rather than multi-step approval chains.
- It depends on eh_hr_core, eh_hr_compat and eh_hr_engine_workflow, which install automatically with it, plus standard Odoo hr.
- Targeting uses standard hr.department and hr.employee records; there is no portal or website front end for employees to browse announcements.
odoo hr announcement, company announcement odoo, employee communication odoo, hr notice board, policy announcement workflow, department targeted announcement, pinned announcements odoo, hash chained audit log, multi company hr odoo, odoo 16 community hr, self hosted hr platform, tamper evident audit trail
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