| Availability |
Odoo Online
Odoo.sh
On Premise
|
| Odoo Apps Dependencies |
•
Attendances (hr_attendance)
• Discuss (mail) • Employees (hr) |
| Community Apps Dependencies | Show |
| Lines of code | 2641 |
| Technical Name |
eh_hr_attendance_roster |
| License | LGPL-3 |
| Website | https://www.erpheritage.com.au/ |
| Versions | 16.0 17.0 18.0 19.0 |
Attendance Roster for Odoo 16
Plan shifts from weekly templates, fill open shifts, approve swaps, and let the roster drive late detection and overtime, all on Community.
Why this module
Attendance Roster for Odoo 16
Templates become real shifts
Build a template as a row per active day of week with start, end, and break, set it as an employee's default, and the daily cron materialises concrete shifts up to your horizon. Re-running never duplicates a shift for the same employee and start.
Open shifts and swaps
Leave a shift unassigned and it shows as an open shift staff can claim, blocked if they already have a shift at that moment. Swap requests route to a manager, and approval reassigns the shift while guarding against clashes and self-swaps.
The roster drives the numbers
A planned shift sharpens late detection: the cutoff becomes the shift start plus company grace instead of one company-wide time. The same windows drive overtime, daily hours beyond the shift plus ordinary hours over the weekly or fortnightly cap.
Day in the life
From weekly pattern to a costed week
A planner builds a shift template with Monday to Friday rows, nine to five, thirty minute break, and sets it as the default for the floor team. Overnight the generation cron creates four weeks of shifts per employee, skipping any that already exist. One person is away, so their shift is left open and a colleague claims it from the calendar; another asks to hand off Thursday, the team lead approves the swap and the shift moves across. When the week is worked, check-ins past each shift start plus grace are flagged late against the planned start, not a blanket time, and hours past the rostered window plus anything over the 38 hour weekly cap land as overtime on the right day.
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.
Generation is guarded twice: a SQL UNIQUE on (employee, start) and a pre-create search, so re-running the cron or widening the horizon never duplicates an existing shift.
Generation and late detection both localise to the company timezone, build the day window in local time, and store UTC, so shifts and cutoffs land on the correct calendar day across zones.
Claiming an open shift, or approving a swap, is blocked when the target already has a shift starting at that moment, surfacing a clear message instead of a raw constraint error.
A swap whose target is the same employee already on the shift is rejected at validation, so the request cannot resolve to a no-op reassignment.
When the roster is installed it owns the whole late-detection pass and does not call super, avoiding double-flagging staff who arrived early for their shift but late versus the company default. Already-tagged check-ins are skipped, so re-runs do not duplicate exceptions.
Adding or editing an attendance recomputes its weekly or fortnightly siblings, so a later shift added to the period correctly pushes the overtime onto the last shift rather than an earlier one.
Global record rules scope shift templates and shifts to the user's allowed companies, and a shift inherits its company from the assigned employee, falling back to the active company when open.
A template with no day rows is refused both by the constraint and by an explicit check in create, covering the case where create vals omit the lines entirely.
What is inside
Built to do the job, end to end.
- Models. eh.hr.shift.template and its day-pattern lines, eh.hr.roster.shift with planned, completed, missed, and cancelled states, and eh.hr.roster.swap for handover requests. hr.employee gains a default template and a scheduled-shifts list.
- Generation and cron. A daily ir.cron calls the generation routine, which walks each company's active employees with a default template and creates shifts per matching day of week up to the horizon, in batches, idempotent on employee and start.
- Roster-driven computes. hr.attendance gains a rostered-shift link and a roster overtime field computed from the covering shift: daily hours beyond the net rostered window plus the ordinary hours that tip the employee over the weekly or fortnightly cap.
- Views and config. Calendar (week mode) and list views of shifts with status decorations, swap views, an employee default-template field, and settings for horizon and overtime basis on the company and config settings.
- Security. Access rights for user, manager, admin, and auditor groups from the attendance base, plus global per-company record rules on templates and shifts.
- Tests. Suites cover shift generation, templates, open-shift claim, swap approval and clash blocking, roster-driven daily and weekly overtime, and late detection with a roster present.
Honest about the edges
What this does not do, so nothing surprises you.
- Generation creates shifts only for employees who have a default shift template set; employees without one are skipped.
- Shift templates carry weekly day-of-week patterns; there is no calendar of public holidays, leave-aware suppression, or rotating multi-week cycles.
- Late detection and overtime build on this suite's attendance base and reports modules and their company settings, not on Odoo's native working-schedule or Enterprise planning models.
- Overtime uses a single weekly or fortnightly ordinary cap per company; it is not a full award interpreter with penalty rates, allowances, or per-classification rules.
- The generation routine processes up to a batch limit per run; very large workforces with long horizons may need several cron passes to catch up.
- Swap approval is a single manager step; there is no multi-level escalation ladder or delegation chain.
Odoo 16 roster, shift planning Odoo Community, attendance roster, weekly shift template, open shift claim, shift swap approval, roster overtime, planned versus actual attendance, hr_attendance rostering, Community Edition planning alternative, work schedule Odoo, late detection roster
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