| Availability |
Odoo Online
Odoo.sh
On Premise
|
| Odoo Apps Dependencies |
•
Attendances (hr_attendance)
• Discuss (mail) • Employees (hr) |
| Community Apps Dependencies | Show |
| Lines of code | 1947 |
| Technical Name |
eh_hr_attendance_award_au |
| License | LGPL-3 |
| Website | https://www.erpheritage.com.au/ |
| Availability |
Odoo Online
Odoo.sh
On Premise
|
| Odoo Apps Dependencies |
•
Attendances (hr_attendance)
• Discuss (mail) • Employees (hr) |
| Community Apps Dependencies | Show |
| Lines of code | 1947 |
| Technical Name |
eh_hr_attendance_award_au |
| License | LGPL-3 |
| Website | https://www.erpheritage.com.au/ |
AU Award Engine
A Modern Award computation layer for the ERP Heritage attendance suite. Each closed attendance is split into ordinary, penalty, and overtime tier buckets per the employee's award. Multipliers and effective pay hours land back on the row so the payroll exporter, dashboards, and reports all see the awarded values without further work.
Day in the life
Worker clocks out. The award engine has already done the maths.
A retail hand finishes their Saturday shift at 5pm. Odoo closes the attendance row, the stored compute fires, and the engine looks at the worker's award. Saturday at 1.25, eight hours of ordinary, no public holiday today. The row stores ordinary 8.0h, penalty 8.0h, OT tier 1 0.0h, OT tier 2 0.0h, effective pay hours 10.0h. By the time the bookkeeper opens payroll on Monday morning, the values are already there; the export wizard generates the file with the awarded numbers, no spreadsheet, no re entry.
Overview
What this module does, in one read.
eh_hr_attendance_award_au splits each closed attendance row into ordinary, penalty, and two overtime tier buckets and writes the result back so downstream modules see the awarded numbers.
Awards live on eh.hr.award, configurable per company and assigned per employee. A General Retail Industry Award (MA000004) baseline is seeded on install; copy it to a new record and edit the multipliers for the award the workforce is on. The compute is a stored Odoo field that recomputes on the right dependencies; a manual re flush cron is provided but off by default.
Capabilities
Eight things this module gives you, with no padding.
Three bucket split
Each closed attendance is split into ordinary hours up to the daily cap, first tier overtime up to a configured cap, and second tier overtime indefinitely. Multipliers apply per bucket; effective pay hours sum the lot.
Saturday, Sunday, public holiday
Each award carries a Saturday rate (default 1.25), a Sunday rate (default 2.0), and a public holiday rate (default 2.5). Holidays come from a configurable eh.hr.public.holiday model per company.
Seeded MA000004 baseline
A General Retail Industry Award baseline is seeded on install (7.6h ordinary cap, 3.0h tier 1 cap, 1.5x and 2.0x overtime, 1.25 sat, 2.0 sun, 2.5 holiday). Copy and edit for the award the workforce sits under; verify against the current Fair Work Determination before payroll runs.
Stored compute, recomputes on change
The bucket fields on hr.attendance are stored computes with the right dependencies. Closing an attendance, changing the employee's award, or adding a public holiday that affects an existing row triggers a fresh compute automatically.
Pure Python compute, unit testable
The compute itself is a static method that takes plain values, not a recordset. Unit tests hit it without spinning up the ORM. The model method is a thin wrapper that pulls values off the record and forwards them.
Validation in api.constrains
All multipliers and caps must be positive; the constraint refuses negative values at write time. Bad config is rejected before a payroll run, not after.
Optional re flush cron
A daily cron is shipped (off by default) that re flushes computed buckets on the last seven days of attendances. Switch it on after a bulk SQL update or a mass import that bypassed the compute trigger.
Flows into payroll export
The bucket fields land on the same hr.attendance row the payroll export reads. No separate sync; the awarded values flow through to the chosen vendor format the moment they are computed.
Honest about
What the engine does not yet model.
Allowances.Per shift fixed amounts (on call, meal, dirt) are not modelled. Add them in a follow up if customers ask.
Late night and early morning windows.Time of day specific penalties are not modelled in the current shape; they need a richer rate table.
Annualised salary employees.The engine assumes hourly rates. Annualised salary holders should not be assigned an award in this engine.
Cross midnight shifts.Weekday determination uses the check in date. A shift starting Friday 23:00 and ending Saturday 07:00 is treated as Friday end to end. Document and configure shifts to avoid spanning midnight if this matters.
Frequently asked questions
Honest answers to the questions a buyer asks.
Is the seeded MA000004 award production ready?
No. Treat it as a starting template, not a source of truth. Awards change every year; verify the current numbers against the Fair Work Determination before payroll runs. The seed lets the team configure quickly; correctness is the operator's responsibility.
When does the compute run?
On every change to check_in, check_out, employee_id, or the award assignment. Closing an attendance is the most common trigger. The values land on the attendance row immediately, no batch wait.
What if I bulk import attendances and the compute is missed?
Switch on the daily re flush cron under Technical > Scheduled Actions. It re flushes attendances closed in the last seven days. Off by default to avoid background work for installs that do not need it.
Can different employees be on different awards?
Yes. Each employee carries an award assignment. Different teams under different awards live on the same database without crossover.
How are public holidays handled?
A configurable eh.hr.public.holiday model per company holds dates. The engine looks up the date of the check in; if it is a public holiday, the public holiday rate applies for the day, overriding Saturday or Sunday rates. Adding a holiday after the fact triggers a recompute on affected rows.
Please log in to comment on this module