EH HR Reminder
Date-based HR reminders that fire themselves on a daily cron.
Why this module
EH HR Reminder
Due items surface on their own
A daily cron finds every reminder that is due and not yet done and posts a note to its chatter, so the item lands in the message thread and notifies followers. No one has to remember to go look.
Audited the moment it changes
Create, edit and delete are recorded to an append-only, hash-chained audit log with before and after snapshots. Appends are serialised by a Postgres advisory lock, so the chain holds under concurrency and any later tampering is detectable.
Strict company scoping
Every reminder belongs to a required company that defaults to the active one. Cross-company writes are refused even under sudo unless an explicit, audited override is used, so one company never quietly edits another's records.
Day in the life
A quiet register that does the chasing for you
An HR officer logs a reminder for a contract renewal due in ninety days, tags the employee and picks the Contract category. Months pass. On the morning the date arrives, the daily cron picks it up, posts Reminder due to the record's chatter and the followers see it. The officer opens the reminder, acts on it and clicks Mark done, which clears the due flag and writes an audited change. The list view dims completed rows and highlights anything still due, so the open work is obvious at a glance.
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 serialises every append with a transaction-scoped Postgres advisory lock, so two simultaneous writes cannot fork the hash chain. The lock releases automatically on commit or rollback.
Each audit row hashes the previous row's hash plus its own canonical fields with sha256. A built-in verify_chain walks the chain with keyset pagination and returns the first broken row, so the integrity check stays bounded no matter how large the log grows.
Reassigning a reminder to a company the user is not a member of is rejected with an AccessError, even under sudo, unless an explicit allow_cross_company override is set, and that elevation itself writes a dedicated audit row capturing every affected record id.
The due-scan only ever touches reminders where done is False and the date has passed, so a reminder marked done is never re-fired and never re-notifies, no matter how many times the cron runs.
Audit payloads are built from raw field reads, so recordsets and dates are coerced to a JSON-safe form using the same routine on both the stored column and the hash material, keeping the append and verify representations identical.
The write path captures before and after only for audited fields actually present in the change and skips the audit row entirely when the captured values did not move, so no-op writes do not pollute the trail.
What is inside
Built to do the job, end to end.
- Reminder model. A dated eh.hr.reminder record with title, optional linked employee, category (contract, document, probation, review, other), due date, notes, a done flag and a computed is_due flag. List and form views with a one-click Mark done button and chatter.
- Daily fire cron. A scheduled action that runs once per day, searches for reminders that are due and not yet done and posts a chatter note on each, returning the count it processed.
- Audit and company foundation. Inherits the EH HR Platform audited mixin and strict company-aware mixin, so every reminder is hash-chain audited on create, write and unlink and carries a required owning company.
- Roles and menu. Access control for HR admin and officer (full create, read, write, delete) and employee self (read only), surfaced under the platform's Records menu for the officer group.
Honest about the edges
What this does not do, so nothing surprises you.
- The cron posts a chatter note on due reminders. It does not send email, create calendar activities, escalate, or auto-mark anything done. Notification reaches followers through the standard chatter thread.
- is_due is a live computed display flag, not a stored or searchable field, so it drives the list highlighting but cannot be used as a search filter or group-by on its own.
- Reminders are created manually. The module does not scan contracts, documents or probation dates to generate reminders automatically, and there is no recurrence or repeat option. The Contract category is a label, not a contract-watching engine.
- There is no approval, escalation ladder, proration or self-approval flow. A reminder has two states only: open and done.
- Per-company isolation rests on the required company_id and Odoo's standard company rules. This module ships no custom record rule of its own beyond the platform mixins.
- Requires the EH HR Platform base (eh_hr_core and eh_hr_compat) and the standard hr app. It is a platform component, not a standalone app.
odoo 17 hr reminder, hr reminders odoo, contract renewal reminder odoo, probation review tracker, employee follow up reminder, hr compliance reminder, date based reminder cron, odoo hr audit log, multi company hr odoo, hr platform odoo community, document expiry reminder hr, erp heritage 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.
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