EH HR Payroll Accounting
Post payslips to the ledger as balanced entries, with reversal on cancel.
Why this module
EH HR Payroll Accounting
Every entry ties out
Each posted move is balanced by construction: per rule that maps both accounts you get a matched debit and credit, and the fallback path posts a single net expense and payable pair. Total debits always equal total credits.
One bad slip cannot stop the run
Each slip posts inside its own savepoint. A locked period or a move validation error rolls that one slip back and clears its link, so the rest of the pay run still posts and the failed slip can be retried cleanly later.
Confirm posts, cancel reverses
Confirming a configured payslip creates and posts the move at once, not a draft left to forget. Cancelling reverses the posted entry so the ledger reflects the reversal, or cancels a still-draft move if posting had been deferred.
Day in the life
A pay run reaches the books on its own
You map the salary rules to debit and credit accounts once, or set a fallback expense and payable account on the slip, and pick a general journal. When the run is confirmed, each configured payslip posts its own balanced entry. A slip in a locked period rolls itself back without aborting the others, and you post it from the slip later with the Post to journal button. If a slip is cancelled, its entry is reversed so the ledger stays honest. Slips with no accounting set up are skipped silently, so confirming never fails just because the bridge is not configured.
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 slip posts inside cr.savepoint(). A locked period or a move validation error rolls back only that slip and clears its move link, leaving it retryable, so a batch of confirmations is never aborted by one failure.
The move_id link is the double-post guard. The confirm path, the pay path and the manual button all skip a slip that already has a move, so no slip can ever produce a second entry.
The automatic path skips unconfigured slips silently because the bridge is optional, while the manual Post to journal button raises a clear error when the journal or accounts are missing, since the user asked for it explicitly.
If salary rules carry both a debit and credit account the entry is built per line; if they do not, it falls back to a single net expense and payable pair, so the bridge posts a balanced entry either way.
Cancelling a slip reverses a posted move through a true reversal entry that points back at the original, or simply cancels the move if it was still in draft, so cancellation always reaches the ledger correctly.
A slip confirmed before accounting was set up still posts its move at payment time once configured, again guarded by move_id so paying never creates a duplicate.
What is inside
Built to do the job, end to end.
- Salary rule account mapping. Adds debit and credit account fields to eh.hr.salary.rule so each rule can drive its own pair of ledger lines when the payslip posts.
- Payslip accounting fields. Adds a general journal, fallback expense and payable accounts, and read-only links to the posted move and any reversal move on eh.hr.payslip.
- Balanced entry builder. Builds one debit and one credit line per mapped rule line, each internally balanced, or a single net expense and payable pair when no rule accounts are set.
- Post, reverse and retry logic. Posts on confirm and on pay, reverses on cancel, isolates each slip in a savepoint, and guards against double posting through the move link.
- Form additions. A Post to journal button in the payslip header and an Accounting page on the salary rule form for the debit and credit accounts.
Honest about the edges
What this does not do, so nothing surprises you.
- Posts to Odoo accounting only; it requires the standard account module and is meant to be installed only if you run Odoo accounting.
- Journals are restricted to general (miscellaneous) journals; it does not register bank or cash payments and does not reconcile against the payable.
- Posting is per individual payslip; there is no consolidated single-entry posting for a whole payslip run in this module.
- No scheduled job, advisory locks, multi-company account filtering, proration, or approval workflow live in this bridge; account selection and period control are left to standard Odoo.
- The platform-wide claims about hash-chained audit logs and projection architecture describe the broader EH HR Platform, not this accounting bridge specifically.
odoo payroll accounting, payslip journal entry odoo, payroll to general ledger, salary expense payable posting, odoo 18 payroll bridge, hr payroll account move, per rule debit credit accounts, payslip reversal on cancel, balanced payroll journal entry, odoo community payroll accounting
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