| Availability |
Odoo Online
Odoo.sh
On Premise
|
| Odoo Apps Dependencies |
•
Attendances (hr_attendance)
• Discuss (mail) • Employees (hr) |
| Community Apps Dependencies | Show |
| Lines of code | 2415 |
| Technical Name |
eh_hr_attendance_award_au |
| License | LGPL-3 |
| Website | https://www.erpheritage.com.au/ |
| Versions | 16.0 17.0 18.0 19.0 |
AU Award Engine for Attendance
Splits every attendance shift into ordinary, penalty, and overtime hours under your configured Australian Modern Award, then writes the weighted pay hours straight back onto the attendance row.
Why this module
AU Award Engine for Attendance
An interval engine, not a flat rate
Each shift is split at every midnight and penalty-band edge, and every segment is classified by its own date and clock time. A Friday 22:00 to Saturday 02:00 shift is paid as two Friday ordinary hours plus two Saturday penalty hours, not four flat hours. Daily and weekly overtime and casual loading layer on top, all in the shipped code.
Your award, your numbers
Caps, overtime tiers and multipliers, Saturday, Sunday and public holiday rates, casual loading, minimum engagement, time-of-day penalty bands, and allowances are all data on the award record. A General Retail Industry Award MA000004 baseline seeds on install as a cited, working starting point to copy and edit.
Stored where payroll reads it
Results are stored computes on hr.attendance with the right dependencies, so they recompute when a shift closes, an employee's award changes, or a public holiday is added. Adding a shift re-flushes its siblings in the same week so weekly overtime and broken-shift detection stay consistent and order-independent.
Day in the life
A retail roster manager closes a casual's week.
A casual works five shifts: a short Tuesday afternoon, a split Wednesday with a four-hour gap, a Friday evening that runs past 6pm and over midnight into Saturday, and two weekend days. The engine splits each shift at midnight and at the 6pm evening band, pays the Friday tail at ordinary and the Saturday hours at the weekend rate, adds 25 percent casual loading to every hour, tops the short Tuesday up to the three-hour minimum engagement, marks Wednesday as a broken shift and pays its allowance once on the later period, and tips the hours past the 38-hour weekly cap into tier-1 overtime on the last shift. Every number lands on the attendance rows, ready for the payroll exporter, with nothing keyed by hand.
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.
The interval engine splits a shift at every midnight, so an overnight shift is classified by each segment's own date. Friday 22:00 to Saturday 02:00 is two Friday ordinary hours plus two Saturday penalty hours, not four flat Friday hours.
Beyond the daily cap, the engine sums an employee's prior ordinary hours earlier in the same Monday-to-Sunday week and tips this shift's excess over the 38-hour weekly cap into the overtime tiers. The excess deterministically lands on the later shift, ordered by check-in then id, so appending a shift never retroactively moves overtime onto already-stored rows.
Weekly overtime and broken-shift detection are cross-record. Creating or re-timing one attendance recomputes the buckets of the employee's other attendances in the same week, so siblings never keep stale values and the result is order-independent.
When an employee works two or more periods split by an unpaid gap of at least an hour on one day, every period is flagged a broken shift and the flat broken-shift allowance is paid exactly once, on the day's latest period, so it is never double-counted.
Rate selection is ordered: public holiday beats Sunday beats Saturday beats an explicit time-of-day penalty band beats ordinary. A public holiday on a Saturday is paid at the public holiday rate, not the Saturday rate.
Awards and public holidays are scoped by a global record rule, with company_id left empty meaning the row applies to every company. The compute resolves the holiday calendar against the employee's own company so a regional or company holiday only affects the right workforce.
When the wider leave suite is installed, the award reads the canonical public holiday calendar unioned with its own award-local rows, so a holiday entered once is honoured by both leave and award interpretation instead of two calendars drifting apart.
A re-flush cron, off by default, re-triggers the compute on attendances closed in the last seven days. It is there for the case where a mass import or manual SQL update slipped past the ORM's automatic recompute, and the operator turns it on only if needed.
A zero-duration, inverted, or still-open shift, or an employee with no award, returns all-zero buckets rather than a wrong number. Award caps and multipliers are constrained to be positive so a misconfigured rate cannot silently zero out pay.
What is inside
Built to do the job, end to end.
- Configurable Modern Award record. A per-company eh.hr.award model holding daily and weekly ordinary caps, two overtime tiers with their multipliers, Saturday, Sunday and public holiday rates, casual loading percent, minimum engagement, and a broken-shift allowance. All rates are positive-constrained and tracked on the chatter.
- Penalty bands and allowances. Time-of-day penalty bands (for example a weekday evening loading after 6pm) on eh.hr.award.penalty, classified per segment by day type and clock time. Allowances on eh.hr.award.allowance priced per shift, per hour, or per day, with an auto-apply flag for the ones that attach to every shift.
- Stored buckets on the attendance. hr.attendance gains stored ordinary, penalty, overtime tier 1 and tier 2, effective pay hours, the award applied, a minimum-engagement top-up, a broken-shift flag, and an allowance amount, surfaced on the attendance list and form views.
- Per-region public holiday calendar. An eh.hr.award.public.holiday model with company scope and Australian state and territory regions, unique per date and company, that the engine reads per segment so a regional holiday only affects that region.
- Seeded MA000004 baseline. A General Retail Industry Award MA000004 baseline seeds on install with a 25 percent casual loading, a three-hour minimum engagement, and a weekday evening penalty band, as a cited, working record to copy and adapt, not a substitute for the current determination.
- Security, scoping, and tests. Read, manager, admin, and auditor access on every model, global per-company record rules, an off-by-default re-flush cron, and a unit and integration test suite covering the interval engine, weekly overtime, casual loading, bands, broken shifts, allowances, and the stored attendance computes.
Honest about the edges
What this does not do, so nothing surprises you.
- The seeded General Retail Industry Award MA000004 rates are a cited baseline as at FY2024-25, not legal advice. Award rates change with each annual Fair Work determination and vary by employment type, so verify every rate against the current determination before running payroll.
- The engine assumes an hourly rate. Annualised-salary employees should be left without an award assigned rather than awarded here.
- The default award on the company is a configuration setting only. It is not automatically copied onto new employee records, so set each employee's award explicitly.
- Classification works from the attendance check-in and check-out times only. It does not infer rostered breaks or reconcile against a separate roster or timesheet.
- This is an award interpretation and pay-hours layer. It computes weighted hours and allowance amounts for a payroll exporter to consume; it does not itself produce payslips, tax, or superannuation.
Odoo 17 Australian award, Modern Award Odoo, Fair Work penalty rates Odoo, hr_attendance overtime calculation, casual loading Odoo, public holiday loading payroll, weekly overtime 38 hours, broken shift allowance, minimum engagement award, AU payroll attendance Odoo 17, ordinary penalty overtime hours, General Retail Industry Award MA000004
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