| Availability |
Odoo Online
Odoo.sh
On Premise
|
| Odoo Apps Dependencies |
•
Attendances (hr_attendance)
• Discuss (mail) • Employees (hr) |
| Community Apps Dependencies | Show |
| Lines of code | 1842 |
| Technical Name |
eh_hr_attendance_reports |
| License | LGPL-3 |
| Website | https://www.erpheritage.com.au/ |
| Versions | 16.0 17.0 18.0 19.0 |
Attendance Reports
An hourly cron that turns raw check-ins into late and missed-checkout exceptions, plus a today dashboard for managers, on Odoo 17 Community.
Why this module
Attendance Reports
Two passes, every hour
The cron runs hourly and walks each company in turn. Pass one flags any check-in today that lands after the company default time plus grace, at warning severity. Pass two flags any attendance still open past the company threshold, at critical severity. The open row is left untouched for HR to close by hand.
Re-runs never duplicate
Before creating, each pass loads the attendances it already tagged for that exception type and skips them. Running the cron twice in a row produces exactly one exception per event, which the test suite asserts directly. No advisory lock is needed because the idempotency check is the guard.
Today, at a glance
Managers and auditors get a Today attendance kanban grouped by open or closed state, so open rows read as people still on site. Filters cover today, open, and closed. The menu is gated to the suite manager and auditor groups, not handed to every employee.
Day in the life
09:40, the morning after
Overnight the cron raised a critical missed check-out for a warehouse worker whose badge-in from 4pm yesterday was never closed, and a warning late exception for a 09:32 arrival against the 09:00 plus 5 minute window. Both carry severity, the related attendance, and a plain-language description of which cutoff was crossed. The manager opens the Today kanban, sees the still-open row in the open column, and closes it. The cron does not touch the open attendance itself, so nothing is silently mutated under HR.
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 late pass localizes today and the cutoff into the company partner timezone, then converts back to UTC for the search. An unknown timezone name falls back to UTC rather than crashing the run.
Each pass collects attendances it has already tagged for that exception type and skips them, so a double cron fire, a manual re-trigger, or an overlapping schedule yields one exception per event, not duplicates.
Both passes loop res.company and filter attendances by employee_id.company_id, reading that company's own default time, grace, and threshold. Each exception is stamped with its company_id.
Missed check-out raises a critical exception but deliberately leaves the attendance open, so HR closes it manually and the cron never fabricates a check-out time.
The default check-in float is split into hour and minute, so 8.5 means 08:30 and 9.0 means 09:00 when the cutoff is built.
Detection runs as the root scheduler user and creates exceptions via sudo, so it is not blocked by the record-level access of whoever last logged in.
What is inside
Built to do the job, end to end.
- Hourly exception cron. An ir.cron firing every hour as the root user, calling a single entrypoint that runs the late and missed-checkout passes in sequence over every company.
- Late check-in pass. Per company, builds a timezone-aware cutoff from the default check-in time plus grace minutes and raises a warning exception for each of today's check-ins past it, skipping any already tagged.
- Missed check-out pass. Per company, finds attendances with no check-out whose check-in predates the missed-checkout threshold and raises a critical exception, leaving the row open.
- Today attendance dashboard. A hr.attendance kanban grouped by a computed open or closed state with today, open, and closed filters, defaulting to today, reachable from a manager-gated Reports submenu.
- Per-company settings. Default check-in time, late grace minutes, and missed-checkout hours surface in an Exceptions block on the Attendance Suite settings page, stored on res.company.
- Exception lifecycle. Exceptions live on the shared suite model with severity, occurred-on, a related attendance, and resolve or reopen actions tracked through the chatter.
Honest about the edges
What this does not do, so nothing surprises you.
- Two detection passes only: late check-in and missed check-out. No-show, early-in, geofence, and liveness exception types exist on the shared model but are not produced by this module.
- Detection compares against the company-wide default check-in time, not per-employee work schedules or planned shifts. Roster-aware comparison is deferred to a later wave and is not present on this branch.
- The reachable dashboard in this module is the Today attendance kanban. The exception kanban view ships but is not wired to its own menu or action here, and there is no audit-log summary dashboard in this module.
- There is no PDF or spreadsheet export of exceptions or attendance from this module. Inspection is through the Odoo views.
- The cron interval is fixed at one hour in shipped data. Detection is point-in-time at each run, not real-time on check-in.
- Requires the eh_hr_attendance_base module and the standard hr_attendance module; it does not function standalone.
Odoo 17 attendance reporting, attendance exception detection, late check in detection Odoo, missed checkout alert, hr_attendance dashboard, attendance cron Odoo, employee attendance monitoring, Odoo Community attendance, attendance exceptions by severity, today attendance kanban, multi company attendance, ERP Heritage attendance suite
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