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:
@@ -58,6 +58,20 @@ class FusionClockSchedule(models.Model):
|
||||
store=True,
|
||||
)
|
||||
note = fields.Char(string='Note')
|
||||
role_id = fields.Many2one(
|
||||
'fusion.clock.role',
|
||||
string='Role',
|
||||
help="Shift role — drives the colour/label shown on the employee's "
|
||||
"portal schedule. Defaults from the shift template or the "
|
||||
"employee's Default Shift Role.",
|
||||
)
|
||||
recurrence_id = fields.Many2one(
|
||||
'fusion.clock.schedule.recurrence',
|
||||
string='Recurrence',
|
||||
ondelete='set null',
|
||||
index=True,
|
||||
help="Set when this entry was generated by a recurring rule.",
|
||||
)
|
||||
company_id = fields.Many2one(
|
||||
'res.company',
|
||||
string='Company',
|
||||
@@ -292,10 +306,21 @@ class FusionClockSchedule(models.Model):
|
||||
new_schedule = self.browse()
|
||||
new_value = ''
|
||||
else:
|
||||
# Resolve the role: explicit payload role wins, then the shift
|
||||
# template's role, then the employee's default role.
|
||||
role_id = payload.get('role_id')
|
||||
if not role_id:
|
||||
shift_id = parsed.get('shift_id')
|
||||
shift = self.env['fusion.clock.shift'].browse(shift_id) if shift_id else None
|
||||
if shift and shift.role_id:
|
||||
role_id = shift.role_id.id
|
||||
elif employee.x_fclk_default_role_id:
|
||||
role_id = employee.x_fclk_default_role_id.id
|
||||
vals = {
|
||||
'employee_id': employee.id,
|
||||
'schedule_date': date_obj,
|
||||
'shift_id': parsed.get('shift_id') or False,
|
||||
'role_id': int(role_id) if role_id else False,
|
||||
'is_off': bool(parsed.get('is_off')),
|
||||
'start_time': parsed.get('start_time') or 0.0,
|
||||
'end_time': parsed.get('end_time') or 0.0,
|
||||
@@ -349,6 +374,9 @@ class FusionClockSchedule(models.Model):
|
||||
'hours': schedule.planned_hours,
|
||||
'hours_display': Schedule.fclk_hours_display(schedule.planned_hours),
|
||||
'note': schedule.note or '',
|
||||
'role_id': schedule.role_id.id or False,
|
||||
'role_name': schedule.role_id.name or '',
|
||||
'role_color': schedule.role_id._get_color_from_code() if schedule.role_id else '',
|
||||
}
|
||||
|
||||
plan = employee._get_fclk_day_plan(date_obj)
|
||||
@@ -366,6 +394,9 @@ class FusionClockSchedule(models.Model):
|
||||
'hours': plan.get('hours') or 0.0,
|
||||
'hours_display': Schedule.fclk_hours_display(plan.get('hours') or 0.0),
|
||||
'note': '',
|
||||
'role_id': False,
|
||||
'role_name': '',
|
||||
'role_color': '',
|
||||
}
|
||||
|
||||
@api.model
|
||||
|
||||
Reference in New Issue
Block a user