EH HR Loan
Employee loans and advances with an auto-built repayment schedule, on the workflow engine.
Why this module
EH HR Loan
Approval steps you configure, not code
The submit, approve, disburse and close steps come from a workflow definition stored as data, with each transition gated to a group: employees submit, managers approve or refuse, officers disburse and close. Change who can do what without touching Python.
Every change on a hash-chained log
Loan edits and state changes are written to an append-only, sha256 hash-chained audit log on the platform core. Each row links to the one before it, so a verify pass proves nothing was altered after the fact.
No accounting module required
Loans run entirely inside HR with no hard dependency on the accounting application. You track principal, interest, installments and the outstanding balance without wiring up journals first.
Day in the life
From request to a tracked balance
An employee raises a loan for the principal they need, picks how many installments to spread it over, and submits it. A manager reviews the reason and approves or refuses. An HR officer disburses, and at that moment the repayment schedule is generated automatically, one dated installment per period across the full repayable amount. As each installment is marked paid, the total paid rises and the outstanding balance falls in real time on the loan. When the balance is settled, the officer closes the loan, and the whole path stays on the 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.
Generating the schedule first unlinks any existing installment lines, so a re-disbursement rebuilds cleanly rather than doubling up rows.
Closed and refused are marked final in the workflow definition. The engine refuses any further transition out of a final state, even one a misconfigured definition might declare.
Each transition checks the user's groups before advancing. A user outside a transition's allowed groups is refused, so an employee cannot self-approve their own loan by separation of duties.
Loans carry a required company_id and inherit the strict company-aware mixin: a cross-company write is rejected unless explicitly overridden, and any override is itself written to the audit log.
The audit log takes a transaction-scoped Postgres advisory lock before appending, so two concurrent writes cannot fork the hash chain.
A check constraint enforces a non-negative loan amount and a positive installment count at the database, not only in the form.
What is inside
Built to do the job, end to end.
- Models this module adds. Two models: eh.hr.loan (the loan or advance, with principal, flat interest, installment count, start date, reason and computed totals) and eh.hr.loan.line (one dated repayment installment with an amount and a paid flag).
- Computed totals. Total repayable is principal plus flat interest; total paid sums the installments marked paid; the outstanding balance is the difference. All three are stored computes that update as installments are paid.
- Workflow and security. A workflow definition with draft, submitted, approved, disbursed, closed and refused states, transitions gated to employee, manager and officer groups, a dedicated loan number sequence, and per-group access rights from the platform core.
Honest about the edges
What this does not do, so nothing surprises you.
- Interest is a single flat rate applied to the principal (amount times one plus rate). There is no reducing-balance or amortized interest calculation.
- Installments are an equal split of the total repayable across the chosen count. Custom or irregular per-installment amounts and penny-level rounding adjustment on the final line are not provided.
- Marking an installment paid is a manual action on the line. There is no automatic payroll deduction and no posting of loan or repayment entries to accounting on this version; journal posting is left as a future seam.
- Approval is enforced by separating the submit, approve and disburse groups, not by a configurable multi-step approval chain on the loan itself.
- There is no automatic overdue detection, dunning or scheduled reminder for missed installments on this version.
Odoo 17 employee loan, HR loan management Odoo, employee salary advance Odoo, loan repayment schedule Odoo, installment loan tracking, employee advance Odoo Community, HR loan approval workflow, loan balance tracking Odoo, staff loan module Odoo 17, company loan management 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