EH HR Custody
Company asset custody, assigned and returned on the audited HR Platform engine.
Why this module
EH HR Custody
Assign, return, cancel without code
The draft to assigned to returned path is a workflow definition, not hard-coded Python. States, order and who may move a record between them are configuration on the shared workflow engine, so an administrator can adjust the flow without a developer.
Every custody change is on the audit chain
Holder, asset, dates, condition, value and state changes are written to an append-only, hash-chained audit log. Each row links to the one before it, so an after-the-fact edit is detectable by verifying the chain. The log table is not self-audited and appends are serialized by a Postgres advisory lock.
Company isolation that does not leak
Custody records are required to carry a company and default to the active one. Moving a record to a company the user does not belong to is refused, even under sudo, unless an explicit override is set and itself audited, so one company cannot see or rewrite another's custody.
Day in the life
From handover to return, on the record
An HR officer raises a custody record for a new laptop, picks the employee, sets an expected return date and an estimated value, and clicks Assign. The record gets an auto-numbered reference and moves to assigned, with the change tracked in the chatter and the audit log. Weeks later the laptop comes back. The officer clicks Return, the system stamps today as the actual return date, and they record the condition as good and add a note. If the return date had passed first, the record would have shown as overdue in the list until it came back. The whole history, who assigned it, who returned it, in what condition, sits on a verifiable audit trail.
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.
Once a record reaches Returned or Cancelled it is marked final by the engine, and any further transition is refused even if a misconfigured definition declared one from it. Terminal means terminal.
The Return action only stamps the actual return date when it is not already set, so re-firing the return path never silently overwrites the real handback date that was recorded the first time.
Audit appends take a transaction-scoped Postgres advisory lock so two concurrent writes cannot read the same chain tail and fork it. The lock releases automatically on commit or rollback.
A write that moves a custody record into another company is rejected unless an explicit override context is set, and when it is allowed every affected record id is captured in the audit log, so the elevation is fully reconstructable.
Overdue is a computed flag derived from the expected and actual return dates at read time, not a nightly batch, so it is always current and there is no scheduled job to fail.
Assign, return and cancel are restricted to the HR officer group on the transition itself. A user outside the allowed groups is refused at the engine, independently of view-level button visibility.
What is inside
Built to do the job, end to end.
- Models this module adds. One model, eh.hr.custody, holding the employee, asset name and description, assigned and expected return dates, actual return date, condition on return, return notes, estimated value, a live overdue flag and an auto-generated reference.
- Workflow it ships. A Custody workflow definition with four states, draft, assigned, returned and cancelled, and three transitions, assign, return and cancel, all loaded as data and all gated to the HR officer group. Returned and cancelled are marked final.
- Engines it stands on. It owns no workflow or audit code of its own. State movement comes from eh_hr_engine_workflow, the hash-chained audit trail and strict multi-company scoping come from eh_hr_core mixins, and cross-version support comes from eh_hr_compat.
- What it does not add. No wizard, no scheduled job, and no link to Odoo's equipment or maintenance models. Return is a header button, not a pop-up, and there is no approval chain wired onto custody transitions in this module.
Honest about the edges
What this does not do, so nothing surprises you.
- Custody is a standalone model. It does not read from or write to Odoo's standard equipment, maintenance or asset registers, so it is a record of who holds what, not an inventory or depreciation system.
- Custody transitions are not routed through the approval engine in this module. Assign, return and cancel complete immediately for an authorized HR officer rather than waiting on a multi-step sign-off chain.
- There is no scheduled reminder or escalation job. The overdue flag is computed live for reporting and filtering, but the module does not email holders or managers when an item runs late on its own.
- Condition on return and return notes are captured for the record. The module does not branch the workflow on a damaged or lost outcome or post any charge or accounting entry from it.
- Asset value is a single estimated figure for reference. There is no depreciation, revaluation or currency handling on the custody record itself.
odoo 17 employee custody, company asset custody odoo, asset assignment and return, employee asset tracking odoo, hr custody management, overdue asset report odoo, asset value tracking hr, audited custody trail, multi company asset custody, odoo community hr platform, laptop custody tracking odoo, asset handover workflow
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.
Modules teams pair with this one.
Premium ERP Heritage modules that extend the same stack, each built to the same engineering bar.
Bring Employment Hero onboarding workflows, employee goals and contractor flags into Odoo Community as real recor...
End to end French B2B and B2G electronic invoicing for the DGFiP reform, generating Factur-X PDF/A-3 with embedde...
Accept ZainCash wallet payments in Iraq at your Odoo checkout, on the ZainCash Payment Gateway v2 with OAuth2, re...
Sync Employment Hero ATS recruitment job openings into the standard Odoo Recruitment app, mapping each opening on...
The New Zealand country pack for the ERP Heritage Employment Hero integration
| Availability |
Odoo Online
Odoo.sh
On Premise
|
| Odoo Apps Dependencies |
•
Employees (hr)
• Discuss (mail) |
| Community Apps Dependencies | Show |
| Lines of code | 1352 |
| Technical Name |
eh_hr_custody |
| License | LGPL-3 |
| Website | https://erpheritage.com.au |
Please log in to comment on this module