gsinghpal 78fa8f07ee fix(fusion_clock): stop stale missed-clock-in nag; add Owner role + attendance exemption
The "explain your missed clock-out" dialog (driven by hr.employee.
x_fclk_pending_reason) was set by the absence + auto-clock-out crons but only
cleared by the systray reason dialog -- never by the kiosk/NFC clock paths that
staff actually use. During the kiosk rollout the absence cron flagged the whole
company (hundreds of "absent" logs); those stale flags then nagged everyone
forever, even while currently clocked in.

Fixes:
- Clear x_fclk_pending_reason on every successful clock-in (portal, systray,
  PIN kiosk, NFC kiosk). Back on the clock => no nag.
- get_status / dashboard never report pending while checked-in or exempt; the
  systray also guards the dialog client-side.
- Absence detection no longer sets x_fclk_pending_reason (an absence has no
  "departure time" to explain). It still logs 'absent' + notifies the office.
- One-time migration (19.0.4.2.0) clears existing stale flags.

Owner / attendance exemption:
- New "Owner" role (top of the Fusion Clock access dropdown, implies Manager)
  plus a per-employee "Exempt from Attendance" checkbox.
- hr.employee._fclk_is_attendance_exempt(); the absence, auto-clock-out,
  reminder and weekly-summary crons all skip exempt employees, and the dialog
  is suppressed for them.

Tests: tests/test_pending_reason_exempt.py (13 cases). Full fusion_clock suite
green except pre-existing env-sensitive failures.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-02 17:54:00 -04:00
2026-04-24 21:04:38 -04:00
2026-04-24 21:04:38 -04:00
2026-04-24 21:04:38 -04:00
2026-04-24 21:04:38 -04:00
2026-05-16 13:18:52 -04:00
2026-04-24 21:04:38 -04:00
2026-04-24 21:04:38 -04:00
2026-05-21 03:37:25 -04:00
2026-04-24 21:04:38 -04:00
2026-04-24 21:04:38 -04:00
2026-04-29 03:35:33 -04:00
2026-04-24 21:04:38 -04:00
2026-05-22 18:01:31 -04:00
2026-05-30 20:59:59 -04:00
2026-04-28 19:39:37 -04:00
2026-04-24 21:04:38 -04:00
2026-04-24 21:04:38 -04:00
2026-05-30 20:59:59 -04:00
2026-04-24 21:04:38 -04:00
2026-04-24 21:04:38 -04:00
2026-04-24 21:04:38 -04:00
2026-04-24 21:04:38 -04:00
2026-05-21 03:37:25 -04:00
2026-04-24 21:04:38 -04:00
2026-04-29 03:35:33 -04:00
2026-04-30 18:08:36 -04:00
2026-05-11 03:20:31 -04:00
2026-04-24 21:04:38 -04:00
2026-05-21 03:37:25 -04:00
2026-04-24 21:04:38 -04:00
2026-05-30 20:59:59 -04:00
2026-04-24 21:04:38 -04:00
2026-05-12 09:08:34 -04:00
2026-04-24 21:04:38 -04:00
2026-05-13 08:17:35 -04:00
2026-05-23 07:53:41 -04:00
2026-04-24 21:04:38 -04:00
2026-04-24 21:04:38 -04:00
2026-04-24 21:04:38 -04:00
2026-04-24 21:04:38 -04:00
2026-04-24 21:04:38 -04:00
2026-05-16 13:07:50 -04:00
2026-05-30 20:59:59 -04:00
2026-02-22 01:22:18 -05:00
2026-05-31 21:33:44 -04:00
2026-05-27 16:12:22 -04:00
2026-04-12 09:11:35 -04:00
2026-04-03 15:45:18 -04:00
2026-04-03 15:45:18 -04:00
2026-04-03 15:45:18 -04:00
2026-04-03 15:45:18 -04:00
2026-04-03 15:45:18 -04:00
2026-04-03 15:45:18 -04:00
2026-04-03 15:45:18 -04:00
2026-04-03 15:45:18 -04:00
2026-04-03 15:45:18 -04:00
2026-04-03 15:45:18 -04:00
2026-04-03 15:45:18 -04:00
2026-04-03 15:45:18 -04:00
2026-04-03 15:45:18 -04:00
2026-04-03 15:45:18 -04:00
2026-04-03 15:45:18 -04:00
2026-04-03 15:45:18 -04:00
2026-04-03 15:45:18 -04:00
2026-04-03 15:45:18 -04:00
2026-04-03 15:45:18 -04:00
2026-04-03 15:45:18 -04:00
2026-04-03 15:45:18 -04:00
2026-04-03 15:45:18 -04:00
2026-04-12 09:11:35 -04:00
2026-04-03 15:45:18 -04:00
2026-04-03 15:45:18 -04:00
2026-04-03 15:45:18 -04:00
2026-04-03 15:45:18 -04:00
2026-04-03 15:45:18 -04:00
2026-04-03 15:45:18 -04:00
2026-04-03 15:45:18 -04:00
2026-04-03 15:45:18 -04:00
Description
Odoo 19 custom modules
224 MiB
Languages
Python 57.7%
HTML 23.9%
JavaScript 14.8%
SCSS 2.3%
CSS 0.8%
Other 0.4%