Files
Odoo-Modules/fusion_clock/views/clock_menus.xml
gsinghpal a5ec79013a feat(fusion_clock): PIN kiosk — polished photo-tile + PIN clock (opt-in)
A proper shared-device PIN kiosk for clients who don't want NFC: photo-tile grid
(+search) -> tap -> PIN (or first-use create) -> optional master-gated selfie ->
clock, in the NFC kiosk's dark glass + brand-gradient style. Built as an Odoo 19
Interaction; new pin_kiosk.scss (scoped); reworked clock_kiosk.py
(search +avatar/has_pin, verify_pin needs_setup, set_pin, clock via kiosk location).
Drops the redundant kiosk_pin_required (PIN always required); relabels the company
kiosk location; adds a PIN-kiosk app icon. Opt-in via enable_kiosk (off by default).
HttpCase tests added. Bump 19.0.4.0.0.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-05-31 21:25:32 -04:00

207 lines
8.3 KiB
XML

<?xml version="1.0" encoding="utf-8"?>
<odoo>
<!-- Top-Level Menu -->
<menuitem id="menu_fusion_clock_root"
name="Fusion Clock"
web_icon="fusion_clock,static/description/icon.png"
sequence="45"
groups="group_fusion_clock_user"/>
<!-- Dedicated kiosk app: a separate top-level icon (same artwork) that opens
the NFC kiosk. Gated to Kiosk Operator so shared tablet accounts see ONLY
this app, not the full Fusion Clock backend. -->
<record id="action_fusion_clock_kiosk_nfc" model="ir.actions.act_url">
<field name="name">Fusion Clock Kiosk</field>
<field name="url">/fusion_clock/kiosk/nfc</field>
<field name="target">self</field>
</record>
<menuitem id="menu_fusion_clock_kiosk_app_root"
name="Fusion Clock Kiosk"
web_icon="fusion_clock,static/description/icon.png"
action="action_fusion_clock_kiosk_nfc"
sequence="46"
groups="group_fusion_clock_kiosk_app"/>
<!-- PIN kiosk app icon (opt-in alternative to NFC: tap photo + PIN). -->
<record id="action_fusion_clock_kiosk_pin" model="ir.actions.act_url">
<field name="name">Fusion Clock PIN Kiosk</field>
<field name="url">/fusion_clock/kiosk</field>
<field name="target">self</field>
</record>
<menuitem id="menu_fusion_clock_kiosk_pin_app_root"
name="Fusion Clock PIN Kiosk"
web_icon="fusion_clock,static/description/icon.png"
action="action_fusion_clock_kiosk_pin"
sequence="47"
groups="group_fusion_clock_kiosk_app"/>
<!-- Dashboard — layered & role-aware: personal band for everyone,
team band for leads (direct reports), org band for managers.
Gated to the base clock-user group (lead/manager imply it). -->
<menuitem id="menu_fusion_clock_dashboard"
name="Dashboard"
parent="menu_fusion_clock_root"
action="action_fusion_clock_dashboard"
sequence="5"
groups="group_fusion_clock_user"/>
<!-- ============================================================
Attendance — day-to-day operational records
============================================================ -->
<menuitem id="menu_fusion_clock_attendance"
name="Attendance"
parent="menu_fusion_clock_root"
sequence="10"/>
<menuitem id="menu_fusion_clock_attendance_list"
name="All Attendances"
parent="menu_fusion_clock_attendance"
action="hr_attendance.hr_attendance_action"
sequence="10"
groups="group_fusion_clock_manager,group_fusion_clock_team_lead"/>
<menuitem id="menu_fusion_clock_biweekly_period"
name="Bi-Weekly Period"
parent="menu_fusion_clock_attendance"
action="action_fusion_clock_period_picker"
sequence="15"
groups="group_fusion_clock_manager,group_fusion_clock_team_lead"/>
<menuitem id="menu_fusion_clock_leaves"
name="Leave Requests"
parent="menu_fusion_clock_attendance"
action="action_fusion_clock_leave_request"
sequence="20"
groups="group_fusion_clock_manager"/>
<menuitem id="menu_fusion_clock_corrections"
name="Correction Requests"
parent="menu_fusion_clock_attendance"
action="action_fusion_clock_correction"
sequence="30"
groups="group_fusion_clock_manager"/>
<menuitem id="menu_fusion_clock_penalties"
name="Penalties"
parent="menu_fusion_clock_attendance"
action="action_fusion_clock_penalty"
sequence="40"
groups="group_fusion_clock_manager,group_fusion_clock_team_lead"/>
<!-- ============================================================
Scheduling — building and posting schedules
============================================================ -->
<menuitem id="menu_fusion_clock_scheduling"
name="Scheduling"
parent="menu_fusion_clock_root"
sequence="20"
groups="group_fusion_clock_manager"/>
<menuitem id="menu_fusion_clock_shift_planner"
name="Shift Planner"
parent="menu_fusion_clock_scheduling"
action="action_fusion_clock_shift_planner"
sequence="5"
groups="group_fusion_clock_manager"/>
<menuitem id="menu_fusion_clock_scheduled_shifts"
name="Scheduled Shifts"
parent="menu_fusion_clock_scheduling"
action="action_fusion_clock_schedule"
sequence="10"
groups="group_fusion_clock_manager"/>
<menuitem id="menu_fusion_clock_shifts"
name="Shifts"
parent="menu_fusion_clock_scheduling"
action="action_fusion_clock_shift"
sequence="15"
groups="group_fusion_clock_manager"/>
<menuitem id="menu_fusion_clock_schedule_audit"
name="Schedule Audit"
parent="menu_fusion_clock_scheduling"
action="action_fusion_clock_schedule_audit"
sequence="20"
groups="group_fusion_clock_manager"/>
<!-- Activity Logs — cross-cutting audit trail -->
<menuitem id="menu_fusion_clock_activity_logs"
name="Activity Logs"
parent="menu_fusion_clock_root"
action="action_fusion_clock_activity_log"
sequence="30"
groups="group_fusion_clock_manager,group_fusion_clock_team_lead"/>
<!-- Reports Sub-Menu -->
<menuitem id="menu_fusion_clock_reports_parent"
name="Reports"
parent="menu_fusion_clock_root"
sequence="40"
groups="group_fusion_clock_manager"/>
<menuitem id="menu_fusion_clock_reports"
name="All Reports"
parent="menu_fusion_clock_reports_parent"
action="action_fusion_clock_report"
sequence="10"
groups="group_fusion_clock_manager"/>
<menuitem id="menu_fusion_clock_generate_historical"
name="Generate Historical Reports"
parent="menu_fusion_clock_reports_parent"
action="action_server_generate_historical"
sequence="20"
groups="group_fusion_clock_manager"/>
<!-- Employees -->
<menuitem id="menu_fusion_clock_employees"
name="Employees"
parent="menu_fusion_clock_root"
action="hr.open_view_employee_list_my"
sequence="50"
groups="group_fusion_clock_manager,group_fusion_clock_team_lead"/>
<!-- ============================================================
Configuration — setup
============================================================ -->
<menuitem id="menu_fusion_clock_config"
name="Configuration"
parent="menu_fusion_clock_root"
sequence="90"
groups="group_fusion_clock_manager"/>
<record id="action_fusion_clock_config_settings" model="ir.actions.act_window">
<field name="name">Fusion Clock Settings</field>
<field name="res_model">res.config.settings</field>
<field name="view_mode">form</field>
<field name="target">current</field>
<field name="context">{'module': 'fusion_clock', 'bin_size': False}</field>
</record>
<menuitem id="menu_fusion_clock_settings"
name="Settings"
parent="menu_fusion_clock_config"
action="action_fusion_clock_config_settings"
sequence="10"
groups="group_fusion_clock_manager"/>
<menuitem id="menu_fusion_clock_locations_config"
name="Locations"
parent="menu_fusion_clock_config"
action="action_fusion_clock_location"
sequence="20"
groups="group_fusion_clock_manager"/>
<menuitem id="menu_fusion_clock_nfc_enrollment"
name="Enroll NFC Card"
parent="menu_fusion_clock_config"
action="action_fusion_clock_nfc_enrollment_wizard"
sequence="30"
groups="group_fusion_clock_manager"/>
</odoo>