feat(fusion_clock): native recurring shifts engine [A4-A5]

fusion.clock.schedule.recurrence (repeat every N day/week/month/year;
forever/until/N-times) re-fit from planning.recurrency onto per-day rows;
daily generation cron; _fclk_on_leave skip; planner Repeat…/Stop-repeat
UI + endpoints; recurrence + role indicators on cells.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
gsinghpal
2026-06-04 20:49:26 -04:00
parent b4ca85e291
commit 734b3b94fd
12 changed files with 591 additions and 0 deletions

View File

@@ -0,0 +1,72 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<record id="view_fusion_clock_recurrence_list" model="ir.ui.view">
<field name="name">fusion.clock.schedule.recurrence.list</field>
<field name="model">fusion.clock.schedule.recurrence</field>
<field name="arch" type="xml">
<list>
<field name="display_name"/>
<field name="repeat_interval"/>
<field name="repeat_unit"/>
<field name="repeat_type"/>
<field name="repeat_until"/>
<field name="repeat_number"/>
<field name="last_generated_date"/>
<field name="company_id" groups="base.group_multi_company"/>
</list>
</field>
</record>
<record id="view_fusion_clock_recurrence_form" model="ir.ui.view">
<field name="name">fusion.clock.schedule.recurrence.form</field>
<field name="model">fusion.clock.schedule.recurrence</field>
<field name="arch" type="xml">
<form>
<sheet>
<group>
<group>
<label for="repeat_interval" string="Repeat Every"/>
<div class="o_row">
<field name="repeat_interval" class="oe_inline"/>
<field name="repeat_unit" class="oe_inline"/>
</div>
<field name="repeat_type"/>
<field name="repeat_until"
invisible="repeat_type != 'until'"
required="repeat_type == 'until'"/>
<field name="repeat_number" invisible="repeat_type != 'x_times'"/>
</group>
<group>
<field name="last_generated_date" readonly="1"/>
<field name="company_id" groups="base.group_multi_company"/>
</group>
</group>
<group string="Generated Shifts">
<field name="schedule_ids" nolabel="1" colspan="2">
<list>
<field name="schedule_date"/>
<field name="employee_id"/>
<field name="start_time" widget="float_time"/>
<field name="end_time" widget="float_time"/>
<field name="state"/>
</list>
</field>
</group>
</sheet>
</form>
</field>
</record>
<record id="action_fusion_clock_recurrence" model="ir.actions.act_window">
<field name="name">Recurring Shifts</field>
<field name="res_model">fusion.clock.schedule.recurrence</field>
<field name="view_mode">list,form</field>
<field name="help" type="html">
<p class="o_view_nocontent_smiling_face">No recurring shifts yet</p>
<p>Recurring shifts are created from the Shift Planner — click a cell,
then <b>Repeat…</b>. They appear here so you can review or stop them.</p>
</field>
</record>
</odoo>