EH HR Custody
Company assets handed to employees, assigned and returned on an audited workflow.
Why this module
EH HR Custody
A real handover lifecycle
Every record moves through Draft, Assigned, Returned, or Cancelled on the shared workflow engine. The buttons enforce the path: you cannot return what was never assigned, and a returned or cancelled record is final and refuses any further transition. The states and the order between them are configuration, not hard-coded Python.
A history you can prove
Assignment, return, condition, dates, employee, and value are written to an append-only, hash-chained audit log. Each row links to the one before it by sha256, so an edit after the fact is detectable on a chain walk. You can show who handed out which asset, and when it came back, without bolting on extra tooling.
Yours, and self-hosted
LGPL-3 source on your own server. No per-user fee, no usage cap, no phone-home. Install only this module and it pulls just its platform dependencies, or add it to the full EH HR Platform you already run. Either way the custody data lives in your database beside the rest of HR.
Day in the life
An IT coordinator issues a laptop, then chases it back.
A new starter is handed a laptop worth 1,500. The coordinator opens a custody record, picks the employee, names the asset, sets an expected return date, and clicks Assign. The record stamps an automatic reference like CUST/2026/00042 and moves to Assigned, with the move written to the audit chain. Weeks later the expected date passes and the asset is not back, so the record flags itself overdue on the list view. When the laptop is finally returned, one click stamps the actual return date for that day, opens the condition field (Good, Fair, Damaged, or Lost) and the return notes, and closes the record as Returned. The whole handover, including who did each step, is reconstructable from the hash-chained log, and none of it touched a side spreadsheet.
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 audit row stores the sha256 of the previous row plus its own fields, so any edit that does not recompute the entire downstream chain is caught by a verify walk. Recordsets and dates in the payload are coerced identically on both the stored column and the hash material, so the chain never forks on a serialization quirk.
Audit appends take a transaction-scoped Postgres advisory lock before reading the chain tail, so two custody actions committing at once cannot read the same tail and fork the log. The lock releases automatically on commit or rollback.
Returned and Cancelled are marked final. The engine refuses any further transition out of a final state, even one a misconfigured definition might declare, so a closed custody record cannot be silently reopened or re-returned.
Every custody record carries a required company and defaults to the active company. A write that tries to move a record into a company the user does not belong to is refused, even under sudo, unless an explicit audited override is set, and the elevation is written to the audit log with the full list of affected ids.
The return action stamps the actual return date to today only when it is still blank, so a back-dated return entered by hand is preserved rather than overwritten on the closing click.
Assign, return, and cancel are each gated to the HR Officer group at the engine level, not just hidden in the view. A user without the group is blocked from firing the transition even by calling the method directly.
What is inside
Built to do the job, end to end.
- One model, eh.hr.custody. A single record per asset handout, holding the employee, asset name, free-text description, expected and actual return dates, return condition, return notes, an estimated value, and a live overdue flag. References are auto-numbered from a yearly sequence (CUST/2026/00001) the first time you save.
- Workflow as data, not code. Draft, Assigned, Returned, and Cancelled, with the Assign, Return, and Cancel transitions, ship as workflow definition records on the eh_hr_engine_workflow engine. The status bar and header buttons are driven from that definition, so an administrator can re-shape the lifecycle without a developer.
- Audit, company-scope, and chatter mixins. The model rides three platform mixins: the audited mixin for hash-chained change capture, the company-aware mixin for strict multi-company isolation, and mail.thread for the standard chatter and follower trail on every record.
- Security and menu. HR Admin has full control, HR Manager can read, write, and create but not delete, and self-service employees get read-only visibility. The Custody menu sits under HR requests, scoped to the HR Officer group. Four automated tests cover defaults, the assign-return flow, the return date stamp, and the overdue flag.
Honest about the edges
What this does not do, so nothing surprises you.
- This is a custody register, not an asset depreciation system. The value field is a plain estimate with no depreciation, book value, or accounting posting; pair it with an asset accounting module if you need those.
- Assets are described by free text (name, description) rather than drawn from a serial-numbered asset catalogue. There is no product registry or barcode scan in this module.
- Custody transitions are not gated by an approval chain in this module. The underlying engine supports approval-gated transitions, but custody assign, return, and cancel proceed directly once the user is in the HR Officer group.
- The overdue flag is a live calculation shown on the record and list view. There is no built-in cron or notification that emails an alert when an asset becomes overdue.
- Self-service employees can view custody records but cannot create or edit them. Handouts and returns are recorded by HR or IT staff, not by the employee from a portal.
HR asset custody, employee asset tracking Odoo, company asset assignment, equipment handover and return, laptop custody management, asset return condition, overdue asset tracking, company property management HR, Odoo 19 community HR, hash-chained audit trail, multi-company asset custody, self-hosted HR module, LGPL-3 Odoo app, EH 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