| Availability |
Odoo Online
Odoo.sh
On Premise
|
| Odoo Apps Dependencies |
•
Attendances (hr_attendance)
• Discuss (mail) • Employees (hr) |
| Community Apps Dependencies | Show |
| Lines of code | 1815 |
| Technical Name |
eh_hr_attendance_reports |
| License | LGPL-3 |
| Website | https://www.erpheritage.com.au/ |
| Versions | 16.0 17.0 18.0 19.0 |
| Availability |
Odoo Online
Odoo.sh
On Premise
|
| Odoo Apps Dependencies |
•
Attendances (hr_attendance)
• Discuss (mail) • Employees (hr) |
| Community Apps Dependencies | Show |
| Lines of code | 1815 |
| 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-in events into late and missed-checkout exceptions a supervisor can act on the same morning.
Why this module
Attendance Reports
Late check-ins surface within the hour
Every check-in past the company default time plus grace minutes is raised as a warning exception the same day, not at the end of the fortnight. The supervisor sees who came in late before standup.
Open attendances get chased before payroll
Any attendance still open past the threshold (default 12 hours) is flagged critical and left open for HR to close. No silent overnight rows quietly inflating worked time.
Detection is idempotent per attendance
Each pass checks whether a row already raised its exception before creating another, so over-running the cron or running it manually never produces duplicate warnings.
Day in the life
9:30 standup. The supervisor opens Today and already sees who came in late.
The hourly cron has run twice since 8am. Two late check-ins sit on the kanban as warnings; yesterday's open attendances that never got a check-out are flagged critical because the threshold lapsed overnight. The supervisor walks the floor, finds one had a flat tyre, marks that exception resolved with a note, and leaves the rest for HR to chase. The Today kanban resets cleanly the next morning. No spreadsheet, no fortnightly review.
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.
Both the late and missed-checkout passes query existing exceptions by attendance_id before creating, so a re-run, an overlapping cron, or a manual trigger never duplicates a flag for the same attendance.
Late cutoffs are computed in the company partner timezone, then converted to UTC for the search. A default of 9.0 means 09:00 local, not server time. An unknown timezone string falls back to UTC instead of raising.
The cron iterates every company and reads that company's own default check-in time, grace minutes, and missed-checkout threshold. Attendances are matched by employee company, so each tenant detects against its own rules in one run.
A missed check-out raises a critical exception but deliberately leaves the hr.attendance row open. The detection layer never edits or closes attendance data; HR closes it manually, keeping the source record intact.
Exceptions from the suite base carry resolved, resolved_by, resolved_on, and resolution notes with mail.thread tracking. Marking resolved stamps the user and time; reopen clears them, and the kanban moves the card between columns.
The default check-in field is a float, so 8.5 resolves to 08:30. The cutoff builder splits the integer hour and the fractional minutes correctly rather than truncating.
What is inside
Built to do the job, end to end.
- Hourly detection cron. A scheduled action (state code, run as root) calls _cron_detect_exceptions hourly. Two passes per call: late check-in for the current day and missed check-out older than the threshold. Cadence is editable under Technical, Scheduled Actions.
- Late check-in pass. For each company, any check-in today after the default check-in time plus grace minutes raises a late exception at warning severity, with a description recording the actual check-in and the computed cutoff.
- Missed check-out pass. For each company, any open attendance (no check-out) whose check-in is older than the threshold hours raises a missed check-out exception at critical severity, leaving the attendance row open.
- Today dashboard. A manager kanban on hr.attendance grouped by open or closed state, defaulting to today, with Today, Open, and Closed filters and group-by on state or employee. Lives under the suite Reports menu for managers and auditors.
- Open or closed state. A computed eh_state on hr.attendance reads open when check-out is empty and closed otherwise, backed by a real search method so it is filterable and groupable across views.
- Per-company settings. Default check-in time, late grace minutes, and missed check-out hours sit on res.company and surface in the suite settings page, so different companies can run different tolerances.
Honest about the edges
What this does not do, so nothing surprises you.
- This module detects and reports. It never edits, closes, or deletes attendance records; a missed check-out is flagged and left open for a human to resolve.
- Late detection compares against the company default check-in time. Per-employee roster or planned-shift comparison is not part of this module; it would require a separate rostering module not included here.
- The shipped manager menu opens the Today attendance dashboard. An exceptions-by-severity kanban view is defined but is browsed through the exception model rather than as a separate dashboard tile, and there is no built-in seven-day or audit-log summary screen.
- Detection runs on the cron cadence (hourly by default), so exceptions appear within the hour rather than the instant a check-in or threshold is crossed.
- The exception model, settings fields, security groups, and kiosk audit log it relies on are provided by eh_hr_attendance_base, which is a hard dependency.
- Severities are fixed by pass: late is always warning, missed check-out is always critical. They are not user-configurable per rule.
Odoo 19 attendance reports, attendance exception detection, late check-in detection Odoo, missed checkout alert, hr_attendance dashboard, attendance reporting Community, timezone aware attendance cron, per company attendance rules, open attendance detection, attendance grace period Odoo, scheduled attendance scan, HR attendance exceptions
Please log in to comment on this module