| Availability |
Odoo Online
Odoo.sh
On Premise
|
| Odoo Apps Dependencies |
•
Employees (hr)
• Discuss (mail) |
| Community Apps Dependencies | Show |
| Lines of code | 1280 |
| 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
Expiry tracked for you
Set an issued date and a validity period and the module computes the expiry date and a live status. A standing Needs attention filter surfaces every certificate that is expiring or expired the moment you open the list.
A daily watch that does not spam
A daily cron recomputes today-dependent status and posts a chatter alert plus an HR to-do activity on each lapsing certificate. A reminder flag means each lapse is raised once, not every single day until someone acts.
Audited and company-scoped
Courses and certifications write to the platform append-only, hash-chained audit log you can verify on demand. Certifications carry a required company and reject cross-company writes unless an audited override is set.
Day in the life
A forklift licence comes due
An operator's forklift licence was issued eleven months ago against a course with a twelve-month validity and a thirty-day alert window. The certification's status sits at valid until today crosses into the window. The next nightly run flips it to expiring soon, posts a chatter note on the record, and drops a Certification renewal to-do on the manager. The certificate shows up under Expiring and expired and in the manager's activity list. It is actioned, renewed, and the reminder does not fire again for that same lapse.
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 cron only alerts certificates that are expiring or expired AND not yet flagged, then sets a reminder flag. A second run in the same day posts nothing new, so the audited test asserts no duplicate alert.
Status and days-to-expiry depend on today, so the cron force-recomputes the stored status and flushes it before filtering. A certificate that lapsed overnight is caught on the next run, not left stale until someone edits it.
Scheduling the HR activity is wrapped in a try/except, so a missing or misconfigured activity type can never abort the nightly run for the rest of the workforce.
A validity of zero months yields a blank expiry and a no-expiry status, so perpetual qualifications like an orientation sit quietly and are never dragged into the alert queue.
Every create, write and delete on a course or certification is recorded in a sha256 hash-chained log. Appends are serialised by a Postgres transaction advisory lock, and verify_chain walks the chain to catch any after-the-fact edit.
Each certification carries a required company defaulting to the active company; a write that moves it to a company the user is not a member of is refused, and any permitted cross-company move is itself written to the audit log.
What is inside
Built to do the job, end to end.
- eh.hr.training.course. The catalog. Name, internal code, category (safety, compliance, technical, soft skills, onboarding, other), provider, default validity in months, default alert days, a mandatory flag, archiving, and a live count of how many certifications reference it with a click-through to them.
- eh.hr.certification. A per-employee certificate or completed training. Employee, course, issued date, validity months (defaulting from the course), computed expiry date, computed status and days to expiry, a per-record alert window, certificate or licence reference number, optional score, attached certificate files, and HR notes. References are auto-numbered CERT/year/00000.
- Daily expiry watch cron. A scheduled job that runs once a day, refreshes today-dependent statuses, and raises a chatter message and an HR to-do activity on certificates entering the alert window or already expired, addressed to the employee's manager or the record's creator, exactly once per lapse.
- Views and filters. A colour-coded certification list with a status badge, a form with Expired and Expiring soon ribbons, and a search view with one-click Expired, Expiring soon, Valid and Needs attention filters plus grouping by status, category or employee. The default certifications action opens straight on Needs attention.
- Roles and audit. Self-service employees read; HR officers create and edit. Both models post to the platform hash-chained audit log, and certifications inherit strict per-company scoping from the platform's company-aware mixin.
Honest about the edges
What this does not do, so nothing surprises you.
- This module tracks and alerts on certifications. It does not run an automated compliance gap report; the mandatory flag on a course marks a requirement for your own reporting rather than auto-detecting which employees are missing it.
- Renewal is a manual action. The cron flags the lapse and schedules a to-do, but it does not auto-extend the expiry or auto-create a replacement certificate.
- Alerts are delivered as Odoo chatter and HR activities. Outbound email or other channels depend on your standard Odoo notification setup and are not configured by this module.
- The daily watch runs only when Odoo's scheduled actions (cron) are enabled and running on your deployment.
- It targets Odoo 16 Community and depends on eh_hr_core, eh_hr_compat and the standard hr module.
- Per-company scoping applies to certifications. The training course catalog is shared rather than company-restricted.
odoo certification tracking, employee training management odoo, certification expiry alerts, licence renewal reminder odoo, training course catalog, mandatory training compliance, odoo 16 hr training, certificate management odoo, compliance tracking hr, expiry date tracking odoo, hr audit trail, self hosted odoo hr
Please log in to comment on this module