| Availability |
Odoo Online
Odoo.sh
On Premise
|
| Odoo Apps Dependencies |
•
Employees (hr)
• Discuss (mail) |
| Community Apps Dependencies | Show |
| Lines of code | 1282 |
| Technical Name |
eh_hr_training |
| License | LGPL-3 |
| Website | https://erpheritage.com.au |
| Versions | 16.0 17.0 18.0 19.0 |
EH HR Training and Certifications
Certifications that never lapse unnoticed.
Why this module
EH HR Training and Certifications
One answer to who is about to lapse
A needs-attention filter and status grouping turn an entire workforce of licences and mandatory trainings into a single, sortable register. Expired and expiring certifications surface first, by default, the moment you open the view.
A daily cron that flags lapses for you
Status is stored and recomputed each day against the current date, so a certificate moves itself from valid to expiring to expired. When it crosses the line the cron posts to chatter and schedules an HR activity for the manager, exactly once per lapse.
Audited and company-scoped by design
Certification changes are captured in the platform append-only, hash-chained audit log, and each certification belongs to one company. Cross-company writes are refused unless an explicit, audited override is set. No silent data crossing between companies.
Day in the life
A renewal that flags itself before it bites
An HR officer records a forklift licence against an operator, picking the course; validity months and the alert window default straight from the course, and the expiry date computes itself. Months later the licence enters its 30-day window, so the daily cron flips its status to Expiring soon, posts a note on the record and drops a renewal to-do on the operator's manager. The certification list, opened on its default needs-attention filter, already shows it in amber at the top. The renewal happens before the licence expires, and every step is on the audited record.
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 certificate carries a reminder_sent flag set the first time the cron alerts on a lapse, so re-running the daily watch never posts a duplicate chatter message or schedules a second activity for the same expiry. Verified by an automated test.
Scheduling the renewal activity is wrapped in best-effort handling: a missing or misconfigured activity type cannot break the run, so the cron still refreshes statuses and alerts on every other certificate.
A course with validity set to zero produces a certification with no expiry date and a dedicated No expiry status, kept out of the alerting set entirely rather than treated as overdue.
Certifications inherit a strict company-scope mixin: company_id is required and defaults to the active company, and a write that moves a record into a company the user is not a member of is refused even under sudo unless an explicit, audited cross-company override is present.
Create, write and unlink on certifications and courses emit rows into a hash-chained audit log whose appends are serialized by a Postgres transaction-scoped advisory lock, so concurrent writes cannot fork the chain, and verify_chain detects any after-the-fact edit.
Because status and days-to-expiry are stored and date-dependent, the cron force-recomputes and flushes them before deciding who to alert, so yesterday's cached Valid never hides today's Expired.
What is inside
Built to do the job, end to end.
- Models this module adds. eh.hr.training.course (the catalog: category, provider, default validity months, default alert days, mandatory flag, code, description) and eh.hr.certification (the per-employee record with computed expiry, live status, days to expiry, reference number, score and certificate file attachments).
- Automation and data. A daily ir.cron certification expiry watch that recomputes statuses and raises alerts, an auto-numbering sequence (CERT/year/ with padding) for certification references, and an onchange that pulls validity months and alert days from the chosen course.
- Views, security and reporting. List, form and search views with colour-coded status, a default needs-attention filter, status, category and employee grouping, and a per-course certifications stat button. Access is split: employees read their own records, HR officers get full create, edit and delete.
- Built on the platform. Certifications carry the audited and strict company-scope mixins; courses carry the audited and base platform mixins. Both write into the shared hash-chained audit log. Depends on eh_hr_core, eh_hr_compat and standard hr.
Honest about the edges
What this does not do, so nothing surprises you.
- This module tracks and alerts on certifications; it does not deliver e-learning content, host course material, run quizzes or score assessments. The score field is a single number you record by hand.
- Expiry alerts run on a daily cron and a 30-day default window, so timing is granular to the day, not the hour, and depends on the cron being active in your instance.
- Renewal activities are scheduled to the employee's manager (or the record creator) as a to-do; there is no built-in multi-step approval chain or escalation ladder for renewals.
- Certifications are strictly single-company. Training courses themselves are not company-scoped, so a course catalog is shared across companies in the same database.
- Certification status drives reporting and alerts; it does not automatically block payroll, rostering or any other process when a certificate expires.
Odoo employee certification tracking, Odoo training and certification management, certification expiry alerts Odoo, HR compliance certification register, employee licence renewal reminders, mandatory training tracking Odoo, training course catalog Odoo 18, certification validity tracking, regulated industry HR compliance Odoo, employee training records management, Odoo HR certification module, certification audit trail, expiring certificate notifications, multi-company HR certifications, Odoo 18 Community HR
Please log in to comment on this module