270 lines
15 KiB
XML
270 lines
15 KiB
XML
<?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>
|