feat(fusion_clock): native shift roles (fusion.clock.role) [A1-A3]

Replaces Odoo Planning's planning.role: name+colour model with the same
1-11 palette, employee default/allowed role fields, Employee Roles editor,
role_id on shift template + schedule with default resolution, ACLs, menus.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
gsinghpal
2026-06-04 20:42:04 -04:00
parent 023fc95acd
commit b4ca85e291
13 changed files with 286 additions and 1 deletions

View File

@@ -121,6 +121,20 @@
sequence="15"
groups="group_fusion_clock_manager"/>
<menuitem id="menu_fusion_clock_employee_roles"
name="Employee Roles"
parent="menu_fusion_clock_scheduling"
action="action_fclk_employee_role_editor"
sequence="17"
groups="group_fusion_clock_manager"/>
<menuitem id="menu_fusion_clock_recurrences"
name="Recurring Shifts"
parent="menu_fusion_clock_scheduling"
action="action_fusion_clock_recurrence"
sequence="18"
groups="group_fusion_clock_manager"/>
<menuitem id="menu_fusion_clock_schedule_audit"
name="Schedule Audit"
parent="menu_fusion_clock_scheduling"
@@ -196,6 +210,13 @@
sequence="20"
groups="group_fusion_clock_manager"/>
<menuitem id="menu_fusion_clock_roles_config"
name="Shift Roles"
parent="menu_fusion_clock_config"
action="action_fusion_clock_role"
sequence="22"
groups="group_fusion_clock_manager"/>
<menuitem id="menu_fusion_clock_break_rules"
name="Break Rules"
parent="menu_fusion_clock_config"

View File

@@ -0,0 +1,94 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<!-- ============================================================
Shift Roles (native replacement for planning.role)
============================================================ -->
<record id="view_fusion_clock_role_list" model="ir.ui.view">
<field name="name">fusion.clock.role.list</field>
<field name="model">fusion.clock.role</field>
<field name="arch" type="xml">
<list editable="bottom">
<field name="sequence" widget="handle"/>
<field name="name"/>
<field name="color" widget="integer"/>
<field name="company_id" groups="base.group_multi_company"/>
<field name="active" column_invisible="1"/>
</list>
</field>
</record>
<record id="view_fusion_clock_role_form" model="ir.ui.view">
<field name="name">fusion.clock.role.form</field>
<field name="model">fusion.clock.role</field>
<field name="arch" type="xml">
<form>
<sheet>
<group>
<group>
<field name="name"/>
<field name="color" widget="integer"/>
</group>
<group>
<field name="sequence"/>
<field name="active"/>
<field name="company_id" groups="base.group_multi_company"/>
</group>
</group>
</sheet>
</form>
</field>
</record>
<record id="action_fusion_clock_role" model="ir.actions.act_window">
<field name="name">Shift Roles</field>
<field name="res_model">fusion.clock.role</field>
<field name="view_mode">list,form</field>
<field name="help" type="html">
<p class="o_view_nocontent_smiling_face">Create your first shift role</p>
<p>Roles colour and label shifts on each employee's portal schedule
(e.g. "Cashier", "Stockroom", "Shift Lead").</p>
</field>
</record>
<!-- ============================================================
Employee Roles editor — fast bulk assignment of default/allowed
roles per employee (ported from fusion_planning, native fields).
============================================================ -->
<record id="view_fclk_employee_role_editor_list" model="ir.ui.view">
<field name="name">hr.employee.list.fclk.role.editor</field>
<field name="model">hr.employee</field>
<field name="arch" type="xml">
<list string="Employee Roles" editable="bottom" multi_edit="1"
default_order="department_id, name">
<field name="name" readonly="1"/>
<field name="job_title" readonly="1" optional="show"/>
<field name="department_id" readonly="1" optional="show"/>
<field name="x_fclk_default_role_id" string="Default Role"
options="{'no_quick_create': True}" widget="many2one"/>
<field name="x_fclk_role_ids" string="All Allowed Roles"
widget="many2many_tags"
options="{'no_quick_create': True, 'color_field': 'color'}"
optional="show"/>
<field name="active" column_invisible="1"/>
</list>
</field>
</record>
<record id="action_fclk_employee_role_editor" model="ir.actions.act_window">
<field name="name">Employee Roles</field>
<field name="res_model">hr.employee</field>
<field name="view_mode">list</field>
<field name="view_id" ref="view_fclk_employee_role_editor_list"/>
<field name="domain">[('active', '=', True)]</field>
<field name="help" type="html">
<p class="o_view_nocontent_smiling_face">
Set the Default Role and allowed Roles for each employee
</p>
<p>Click any cell under <b>Default Role</b> or <b>All Allowed Roles</b>
and start typing. The Default Role pre-fills every new shift you
create for that employee.</p>
</field>
</record>
</odoo>

View File

@@ -16,10 +16,12 @@
<field name="department_id"/>
<field name="is_off"/>
<field name="shift_id"/>
<field name="role_id" optional="show"/>
<field name="start_time" widget="float_time"/>
<field name="end_time" widget="float_time"/>
<field name="break_minutes"/>
<field name="planned_hours"/>
<field name="recurrence_id" optional="hide"/>
<field name="state" widget="badge" decoration-success="state == 'posted'" decoration-warning="state == 'draft'"/>
<field name="company_id" groups="base.group_multi_company"/>
</list>
@@ -38,6 +40,8 @@
<field name="schedule_date"/>
<field name="is_off"/>
<field name="shift_id"/>
<field name="role_id" options="{'no_quick_create': True}"/>
<field name="recurrence_id" readonly="1"/>
</group>
<group>
<field name="start_time" widget="float_time"/>

View File

@@ -36,6 +36,7 @@
<field name="sequence"/>
<field name="active"/>
<field name="color" widget="color"/>
<field name="role_id" options="{'no_quick_create': True}"/>
<field name="company_id" groups="base.group_multi_company"/>
</group>
</group>