| 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
Split every attendance row into ordinary, penalty and overtime hours, by the award your workforce actually sits under.
Why this module
AU Award Engine
Interval engine, not one rate per shift
Each shift is split at every midnight and penalty-band edge, and every segment is rated by its own date and clock time. A Friday 22:00 to Saturday 02:00 shift is two ordinary Friday hours plus two Saturday penalty hours, not four flat Friday hours.
Daily and weekly overtime together
Daily hours past the ordinary cap fall into two overtime tiers, and the 38 hour weekly cap tips the excess of the week into overtime on the later shift. Sibling shifts in the same week recompute automatically so the result is order-independent.
Your award, on the record
Caps, tier multipliers, weekend and public holiday rates, casual loading, penalty bands and allowances all live on a per-company award you edit in the UI. A cited General Retail baseline ships ready to copy.
Day in the life
From clock-out to pay-ready hours
A casual closes an evening shift that runs past 6pm on a Wednesday and into a Saturday morning. The engine splits the interval at 6pm, at midnight and at the Saturday edge, applies the weekday evening band to the post-6pm segment, the Saturday penalty to the early-morning segment, and adds casual loading to every hour. It checks the rest of the week, finds the employee is already near the 38 hour cap, and tips the excess into overtime tier 1. Ordinary, penalty, both overtime tiers and the effective pay hours land on the attendance row, with any auto allowance and a broken-shift flag, ready for the pay run to read. No one recomputes anything 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.
A shift that spans midnight is split at the boundary and each side is classified by its own date, so the Saturday or public holiday portion of an overnight Friday shift is rated correctly rather than as Friday throughout.
Prior ordinary hours in the same Monday-to-Monday week are summed by check-in then id, so the weekly-cap excess always lands on the later shift and appending a new shift never retroactively moves overtime onto already-stored rows.
Adding or re-timing one attendance recomputes the employee's other rows in that same work week, because weekly overtime and broken-shift detection are cross-record. The recompute is scoped to the week, not all of history.
When an employee works two or more periods split by a gap of at least an hour, the day is flagged a broken shift and the broken-shift allowance is paid exactly once, on the day's last period, never duplicated across the periods.
Awards and public holidays carry a company, and global record rules limit each company to its own rows plus company-agnostic ones. A holiday with no company set applies database-wide; a regional holiday only affects its own state or territory.
An attendance with no check-out, or an employee with no award assigned, computes to zero buckets and no applied award, so in-progress and annualised-salary staff never carry phantom awarded hours.
The buckets are a stored compute that recomputes on its own dependencies, so the re-flush cron ships disabled and runs as root only when an operator turns it on to repair rows changed by mass import or raw SQL.
What is inside
Built to do the job, end to end.
- Award record. Per-company eh.hr.award with daily and weekly ordinary caps, two overtime tiers and multipliers, Saturday, Sunday and public holiday rates, casual loading percent, minimum engagement, broken-shift allowance, plus child penalty bands and allowances. Positive-value constraints guard the core rate fields, and changes are tracked on the chatter.
- Interval interpreter. A pure engine splits the worked interval at every midnight and penalty-band edge, picks the winning multiplier per segment (public holiday over Sunday over Saturday over an explicit band over ordinary), fills the daily ordinary cap then overtime tiers, and layers casual loading on every hour.
- Attendance buckets. hr.attendance gains stored, read-only ordinary, penalty, overtime tier 1, overtime tier 2 and effective pay hour fields, plus the applied award, minimum-engagement top-up, broken-shift flag and allowance amount, all surfaced on the attendance list and form.
- Public holiday calendar. eh.hr.award.public.holiday with date, company and Australian state or territory region. When the leave suite is installed it unions with the canonical eh.hr.public.holiday so a holiday entered once is honoured by both leave and award interpretation.
- Penalty bands and allowances. Per day-type time-of-day penalty bands edited inline with float-time pickers, and award allowances priced per shift, per hour or per day with an auto-apply flag for the ones the engine should add to every attendance under the award.
- Seed, security and cron. A cited General Retail baseline with an evening penalty band, a four-role access matrix over user, manager, admin and auditor, per-company record rules, and a disabled root-owned re-flush cron for repairing bulk-imported rows.
Honest about the edges
What this does not do, so nothing surprises you.
- This is an interpretation layer, not a pay run. It outputs rate-weighted hours and allowance amounts as the input to an hourly-rate calculation; it does not compute dollar gross pay, tax or superannuation.
- The shipped General Retail baseline is a cited FY2024-25 starting point, 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 rather than awarded here.
- Each segment takes one winning multiplier (the highest applicable), so penalties and weekend or holiday rates are not stacked on top of each other within the same segment.
- Public holidays must be entered as data, by region, in the award calendar or the canonical leave calendar; no national holiday set is auto-generated.
- Broken-shift detection keys on attendance periods recorded against the same calendar day, so unpaid breaks must be reflected as separate check-out and check-in pairs.
Australian Modern Award Odoo, Fair Work attendance Odoo 16, penalty rates Odoo attendance, overtime calculation Odoo, casual loading Odoo payroll, weekly overtime 38 hours, public holiday penalty Odoo, broken shift allowance, minimum engagement award, hr_attendance award engine, AU payroll loading Odoo, ordinary penalty overtime split
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