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>
119 lines
5.2 KiB
Python
119 lines
5.2 KiB
Python
# -*- coding: utf-8 -*-
|
|
# Copyright 2026 Nexa Systems Inc.
|
|
# License OPL-1 (Odoo Proprietary License v1.0)
|
|
# Part of the Fusion Clock product family.
|
|
|
|
{
|
|
'name': 'Fusion Clock',
|
|
'version': '19.0.4.2.0',
|
|
'category': 'Human Resources/Attendances',
|
|
'summary': 'Complete Employee T&A with Geofencing, Shifts, Penalties, Overtime, Kiosk, Dashboard & Payroll Export',
|
|
'description': """
|
|
Fusion Clock - Complete Employee Time & Attendance
|
|
====================================================
|
|
|
|
A modern, mobile-first attendance module that provides:
|
|
|
|
* **Geofenced Clock-In/Out** - GPS and IP whitelist verification
|
|
* **Shift Scheduling** - Per-employee shift assignment with break management
|
|
* **Auto Clock-Out** - Automatic clock-out after shift + grace period
|
|
* **Penalty Tracking** - Auto-deduction for late clock-in and early clock-out
|
|
* **Overtime Tracking** - Daily and weekly overtime with configurable thresholds
|
|
* **Activity Logging** - Comprehensive audit trail of every attendance event
|
|
* **Absence Tracking** - Automatic detection with monthly/yearly counters
|
|
* **Leave Requests** - Portal-based leave requests with auto-approval
|
|
* **Timesheet Corrections** - Employee correction requests with approval workflow
|
|
* **Manager Dashboard** - Live status, alerts, and team overview
|
|
* **Kiosk Mode** - Shared-device clock-in/out with PIN verification
|
|
* **Photo Verification** - Optional selfie capture at clock-in
|
|
* **On-Time Streak** - Gamification with milestone tracking
|
|
* **CSV Export** - Configurable payroll-compatible export
|
|
* **Team Lead Views** - Filtered read-only access for direct reports
|
|
* **Pay Period Reports** - PDF reports with email automation
|
|
* **Employee Notifications** - Clock-in/out reminders and weekly summaries
|
|
* **Portal UI** - Dark-themed mobile-first portal with FAB and modals
|
|
* **Systray Widget** - Backend users can clock in/out from any Odoo page
|
|
|
|
Integrates natively with Odoo's hr.attendance module for full payroll compatibility.
|
|
""",
|
|
'author': 'Nexa Systems Inc.',
|
|
'website': 'https://nexasystems.io',
|
|
'license': 'OPL-1',
|
|
'depends': [
|
|
'hr_attendance',
|
|
'hr',
|
|
'portal',
|
|
'mail',
|
|
'resource',
|
|
],
|
|
'data': [
|
|
# Security
|
|
'security/security.xml',
|
|
'security/ir.model.access.csv',
|
|
# Data
|
|
'data/ir_config_parameter_data.xml',
|
|
'data/clock_break_rule_data.xml',
|
|
'data/ir_cron_data.xml',
|
|
# Reports (must load before mail templates that reference them)
|
|
'report/clock_report_template.xml',
|
|
'report/clock_employee_report.xml',
|
|
# Mail templates
|
|
'data/mail_template_data.xml',
|
|
# Views - Backend
|
|
'views/clock_location_views.xml',
|
|
'views/hr_attendance_views.xml',
|
|
'views/clock_report_views.xml',
|
|
'views/clock_penalty_views.xml',
|
|
'views/res_config_settings_views.xml',
|
|
'views/clock_activity_log_views.xml',
|
|
'views/clock_leave_request_views.xml',
|
|
'views/clock_shift_views.xml',
|
|
'views/clock_correction_views.xml',
|
|
'views/clock_dashboard_views.xml',
|
|
'views/hr_employee_views.xml',
|
|
'views/clock_schedule_views.xml',
|
|
'views/clock_break_rule_views.xml',
|
|
# Wizards (must load before clock_menus.xml since menu references wizard action)
|
|
'wizard/clock_nfc_enrollment_views.xml',
|
|
'wizard/clock_period_picker_views.xml',
|
|
'views/clock_menus.xml',
|
|
# Views - Portal
|
|
'views/portal_clock_templates.xml',
|
|
'views/portal_timesheet_templates.xml',
|
|
'views/portal_report_templates.xml',
|
|
'views/portal_payslip_templates.xml',
|
|
'views/kiosk_templates.xml',
|
|
'views/kiosk_nfc_templates.xml',
|
|
],
|
|
'assets': {
|
|
'web.assets_frontend': [
|
|
'fusion_clock/static/src/css/portal_clock.css',
|
|
'fusion_clock/static/src/scss/nfc_kiosk.scss',
|
|
'fusion_clock/static/src/scss/pin_kiosk.scss',
|
|
'fusion_clock/static/src/js/fusion_clock_portal.js',
|
|
'fusion_clock/static/src/js/fusion_clock_kiosk.js',
|
|
'fusion_clock/static/src/js/fusion_clock_nfc_kiosk.js',
|
|
],
|
|
'web.assets_backend': [
|
|
'fusion_clock/static/src/scss/_fusion_clock_shift_planner_tokens.scss',
|
|
'fusion_clock/static/src/scss/fusion_clock_shift_planner.scss',
|
|
'fusion_clock/static/src/scss/fusion_clock.scss',
|
|
'fusion_clock/static/src/js/fusion_clock_systray.js',
|
|
'fusion_clock/static/src/xml/systray_clock.xml',
|
|
'fusion_clock/static/src/js/fusion_clock_dashboard.js',
|
|
'fusion_clock/static/src/xml/fusion_clock_dashboard.xml',
|
|
'fusion_clock/static/src/js/fusion_clock_shift_planner.js',
|
|
'fusion_clock/static/src/xml/fusion_clock_shift_planner.xml',
|
|
'fusion_clock/static/src/js/fusion_clock_location_map.js',
|
|
'fusion_clock/static/src/js/fusion_clock_location_places.js',
|
|
'fusion_clock/static/src/xml/fusion_clock_location.xml',
|
|
],
|
|
'web.assets_web_dark': [
|
|
'fusion_clock/static/src/scss/fusion_clock_shift_planner.dark.scss',
|
|
],
|
|
},
|
|
'installable': True,
|
|
'auto_install': False,
|
|
'application': True,
|
|
}
|