Initial commit

This commit is contained in:
gsinghpal
2026-02-22 01:22:18 -05:00
commit 5200d5baf0
2394 changed files with 386834 additions and 0 deletions

View File

@@ -0,0 +1,269 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<!-- ================================================================
Extend Attendance List View - add Fusion Clock columns
================================================================ -->
<record id="view_hr_attendance_list_fusion_clock" model="ir.ui.view">
<field name="name">hr.attendance.list.fusion.clock</field>
<field name="model">hr.attendance</field>
<field name="inherit_id" ref="hr_attendance.view_attendance_tree"/>
<field name="arch" type="xml">
<xpath expr="//field[@name='worked_hours']" position="after">
<field name="x_fclk_net_hours" string="Net Hours" widget="float_time" optional="show"/>
<field name="x_fclk_break_minutes" string="Break (min)" optional="show"/>
<field name="x_fclk_location_id" string="In Location" optional="show"/>
<field name="x_fclk_out_location_id" string="Out Location" optional="hide"/>
<field name="x_fclk_pay_period" string="Pay Period" optional="hide"/>
<field name="x_fclk_clock_source" string="Source" optional="hide"/>
<field name="x_fclk_auto_clocked_out" string="Auto Out" optional="hide"/>
</xpath>
</field>
</record>
<!-- ================================================================
Dedicated list view for pay-period views
Shows the columns needed for attendance detail
================================================================ -->
<record id="view_hr_attendance_list_by_period" model="ir.ui.view">
<field name="name">hr.attendance.list.by.period</field>
<field name="model">hr.attendance</field>
<field name="arch" type="xml">
<list default_order="check_in desc">
<field name="employee_id" optional="show"/>
<field name="check_in" string="Clock In"/>
<field name="check_out" string="Clock Out"/>
<field name="x_fclk_location_id" string="In Location" optional="show"/>
<field name="x_fclk_out_location_id" string="Out Location" optional="show"/>
<field name="worked_hours" string="Total Hours" widget="float_time"/>
<field name="x_fclk_break_minutes" string="Break (min)"/>
<field name="x_fclk_net_hours" string="Net Hours" widget="float_time"/>
<field name="overtime_hours" string="Extra Hours" widget="float_time" optional="show"/>
<field name="x_fclk_pay_period" string="Pay Period" optional="show"/>
<field name="x_fclk_clock_source" string="Source" optional="hide"/>
</list>
</field>
</record>
<!-- ================================================================
Dedicated search view for pay-period actions
Group-by filters in correct order: Pay Period first, Employee second
================================================================ -->
<record id="view_hr_attendance_search_by_period" model="ir.ui.view">
<field name="name">hr.attendance.search.by.period</field>
<field name="model">hr.attendance</field>
<field name="arch" type="xml">
<search string="Search Attendance">
<field name="employee_id"/>
<field name="department_id" operator="child_of"/>
<field name="x_fclk_location_id" string="Location"/>
<field name="x_fclk_pay_period" string="Pay Period"/>
<separator/>
<filter string="My Attendances" name="myattendances"
domain="[('employee_id.user_id', '=', uid)]"/>
<filter string="At Work" name="nocheckout"
domain="[('check_out', '=', False)]"/>
<separator/>
<filter string="Date" name="check_in_filter" date="check_in"/>
<separator/>
<filter string="Pay Period" name="group_pay_period"
context="{'group_by': 'x_fclk_pay_period'}"/>
<filter string="Employee" name="group_employee"
context="{'group_by': 'employee_id'}"/>
<filter string="Month" name="group_month"
context="{'group_by': 'check_in:month'}"/>
<filter string="Location" name="group_location"
context="{'group_by': 'x_fclk_location_id'}"/>
</search>
</field>
</record>
<!-- ================================================================
Extend base Attendance Search View - add our extra filters
================================================================ -->
<record id="view_hr_attendance_search_fusion_clock" model="ir.ui.view">
<field name="name">hr.attendance.search.fusion.clock</field>
<field name="model">hr.attendance</field>
<field name="inherit_id" ref="hr_attendance.hr_attendance_view_filter"/>
<field name="arch" type="xml">
<xpath expr="//search" position="inside">
<field name="x_fclk_location_id"/>
<field name="x_fclk_pay_period" string="Pay Period"/>
<separator/>
<filter name="fclk_portal" string="Portal" domain="[('x_fclk_clock_source', '=', 'portal')]"/>
<filter name="fclk_systray" string="Systray" domain="[('x_fclk_clock_source', '=', 'systray')]"/>
<filter name="fclk_auto" string="Auto Clock-Out" domain="[('x_fclk_auto_clocked_out', '=', True)]"/>
<separator/>
<filter name="fclk_has_penalty" string="Has Penalty" domain="[('x_fclk_penalty_ids', '!=', False)]"/>
<separator/>
<filter name="group_pay_period" string="Pay Period" context="{'group_by': 'x_fclk_pay_period'}"/>
<filter name="group_location" string="Location" context="{'group_by': 'x_fclk_location_id'}"/>
<filter name="group_source" string="Source" context="{'group_by': 'x_fclk_clock_source'}"/>
</xpath>
</field>
</record>
<!-- ================================================================
Extend Attendance Form View - add Fusion Clock details
================================================================ -->
<record id="view_hr_attendance_form_fusion_clock" model="ir.ui.view">
<field name="name">hr.attendance.form.fusion.clock</field>
<field name="model">hr.attendance</field>
<field name="inherit_id" ref="hr_attendance.hr_attendance_view_form"/>
<field name="arch" type="xml">
<xpath expr="//sheet" position="inside">
<group string="Fusion Clock Details" name="fusion_clock_details">
<group>
<field name="x_fclk_location_id"/>
<field name="x_fclk_out_location_id"/>
<field name="x_fclk_clock_source"/>
<field name="x_fclk_break_minutes"/>
<field name="x_fclk_net_hours" widget="float_time"/>
<field name="x_fclk_pay_period"/>
</group>
<group>
<field name="x_fclk_in_distance"/>
<field name="x_fclk_out_distance"/>
<field name="x_fclk_auto_clocked_out"/>
<field name="x_fclk_grace_used"/>
</group>
</group>
<group string="Penalties" name="fusion_clock_penalties"
invisible="not x_fclk_penalty_ids">
<field name="x_fclk_penalty_ids" nolabel="1" colspan="2">
<list>
<field name="penalty_type"/>
<field name="scheduled_time"/>
<field name="actual_time"/>
<field name="difference_minutes"/>
</list>
</field>
</group>
</xpath>
</field>
</record>
<!-- ================================================================
Employee Kanban View - card per employee showing clock stats
================================================================ -->
<record id="view_hr_employee_kanban_fusion_clock" model="ir.ui.view">
<field name="name">hr.employee.kanban.fusion.clock</field>
<field name="model">hr.employee</field>
<field name="arch" type="xml">
<kanban class="o_hr_employee_kanban" sample="1">
<field name="id"/>
<field name="name"/>
<field name="job_title"/>
<field name="department_id"/>
<field name="attendance_state"/>
<field name="x_fclk_period_hours"/>
<field name="x_fclk_period_label"/>
<field name="avatar_128"/>
<templates>
<t t-name="card">
<div class="d-flex flex-column h-100">
<div class="d-flex align-items-center gap-3 mb-3">
<field name="avatar_128" widget="image"
options="{'size': [48, 48]}"
class="rounded-circle flex-shrink-0"/>
<div class="flex-grow-1 min-w-0">
<div class="d-flex align-items-center gap-2">
<field name="name" class="fw-bold text-truncate"/>
<span t-if="record.attendance_state.raw_value == 'checked_in'"
class="badge rounded-pill text-bg-success flex-shrink-0">IN</span>
<span t-if="record.attendance_state.raw_value == 'checked_out'"
class="badge rounded-pill text-bg-secondary flex-shrink-0">OUT</span>
</div>
<div class="text-muted small text-truncate">
<field name="job_title"/>
</div>
</div>
</div>
<div class="mb-2 px-1">
<div class="d-flex justify-content-between align-items-baseline">
<span class="text-muted small">Period Hours</span>
<span class="fw-bold">
<field name="x_fclk_period_hours" widget="float_time"/>
</span>
</div>
<div class="text-muted mt-1" style="font-size: 0.75rem;">
<field name="x_fclk_period_label"/>
</div>
</div>
<div class="flex-grow-1"/>
<button name="action_fclk_open_attendance" type="object"
class="btn btn-sm btn-outline-primary w-100 mt-2">
<i class="fa fa-list-ul me-1"/>View Attendance
</button>
</div>
</t>
</templates>
</kanban>
</field>
</record>
<!-- ================================================================
Employee Kanban Search View
================================================================ -->
<record id="view_hr_employee_search_fusion_clock" model="ir.ui.view">
<field name="name">hr.employee.search.fusion.clock</field>
<field name="model">hr.employee</field>
<field name="arch" type="xml">
<search string="Search Employees">
<field name="name"/>
<field name="department_id"/>
<field name="job_title"/>
<separator/>
<filter name="group_department" string="Department"
context="{'group_by': 'department_id'}"/>
</search>
</field>
</record>
<!-- ================================================================
Action: Employee Overview (Kanban cards)
================================================================ -->
<record id="action_fusion_clock_employee_overview" model="ir.actions.act_window">
<field name="name">Employee Overview</field>
<field name="res_model">hr.employee</field>
<field name="view_mode">kanban</field>
<field name="domain">[('x_fclk_enable_clock', '=', True)]</field>
<field name="search_view_id" ref="view_hr_employee_search_fusion_clock"/>
<field name="help" type="html">
<p class="o_view_nocontent_smiling_face">No clock-enabled employees found.</p>
<p>Enable Fusion Clock on employee records to see them here.</p>
</field>
</record>
<record id="action_fusion_clock_employee_overview_kanban" model="ir.actions.act_window.view">
<field name="sequence">1</field>
<field name="view_mode">kanban</field>
<field name="view_id" ref="view_hr_employee_kanban_fusion_clock"/>
<field name="act_window_id" ref="action_fusion_clock_employee_overview"/>
</record>
<!-- ================================================================
Action: Attendance By Pay Period (list grouped by period then employee)
================================================================ -->
<record id="action_fusion_clock_attendance_by_period" model="ir.actions.act_window">
<field name="name">Attendance by Pay Period</field>
<field name="res_model">hr.attendance</field>
<field name="view_mode">list,form</field>
<field name="search_view_id" ref="view_hr_attendance_search_by_period"/>
<field name="context">{
'search_default_group_pay_period': 1,
'search_default_group_employee': 1,
}</field>
<field name="help" type="html">
<p class="o_view_nocontent_smiling_face">No attendance records found.</p>
</field>
</record>
<record id="action_fusion_clock_attendance_by_period_list" model="ir.actions.act_window.view">
<field name="sequence">1</field>
<field name="view_mode">list</field>
<field name="view_id" ref="view_hr_attendance_list_by_period"/>
<field name="act_window_id" ref="action_fusion_clock_attendance_by_period"/>
</record>
</odoo>