update
This commit is contained in:
@@ -69,13 +69,34 @@
|
||||
groups="group_fusion_clock_manager"/>
|
||||
|
||||
<!-- Reports Sub-Menu -->
|
||||
<menuitem id="menu_fusion_clock_reports"
|
||||
<menuitem id="menu_fusion_clock_reports_parent"
|
||||
name="Reports"
|
||||
parent="menu_fusion_clock_root"
|
||||
action="action_fusion_clock_report"
|
||||
sequence="40"
|
||||
groups="group_fusion_clock_manager"/>
|
||||
|
||||
<menuitem id="menu_fusion_clock_reports"
|
||||
name="All Reports"
|
||||
parent="menu_fusion_clock_reports_parent"
|
||||
action="action_fusion_clock_report"
|
||||
sequence="10"
|
||||
groups="group_fusion_clock_manager"/>
|
||||
|
||||
<menuitem id="menu_fusion_clock_generate_historical"
|
||||
name="Generate Historical Reports"
|
||||
parent="menu_fusion_clock_reports_parent"
|
||||
action="action_server_generate_historical"
|
||||
sequence="20"
|
||||
groups="group_fusion_clock_manager"/>
|
||||
|
||||
<!-- Employees -->
|
||||
<menuitem id="menu_fusion_clock_employees"
|
||||
name="Employees"
|
||||
parent="menu_fusion_clock_root"
|
||||
action="hr.open_view_employee_list_my"
|
||||
sequence="50"
|
||||
groups="group_fusion_clock_manager,group_fusion_clock_team_lead"/>
|
||||
|
||||
<!-- Configuration Sub-Menu -->
|
||||
<menuitem id="menu_fusion_clock_config"
|
||||
name="Configuration"
|
||||
|
||||
@@ -1,12 +1,27 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<odoo>
|
||||
|
||||
<!-- Server Action: Generate Historical Reports -->
|
||||
<record id="action_server_generate_historical" model="ir.actions.server">
|
||||
<field name="name">Generate Historical Reports</field>
|
||||
<field name="model_id" ref="model_fusion_clock_report"/>
|
||||
<field name="state">code</field>
|
||||
<field name="code">action = model.action_generate_historical_reports()</field>
|
||||
</record>
|
||||
|
||||
<!-- Report List View -->
|
||||
<record id="view_fusion_clock_report_list" model="ir.ui.view">
|
||||
<field name="name">fusion.clock.report.list</field>
|
||||
<field name="model">fusion.clock.report</field>
|
||||
<field name="arch" type="xml">
|
||||
<list string="Clock Reports" default_order="date_end desc">
|
||||
<header>
|
||||
<button name="%(action_server_generate_historical)d"
|
||||
type="action"
|
||||
string="Generate Historical Reports"
|
||||
class="btn-secondary"
|
||||
icon="fa-history"/>
|
||||
</header>
|
||||
<field name="name"/>
|
||||
<field name="date_start"/>
|
||||
<field name="date_end"/>
|
||||
@@ -44,6 +59,11 @@
|
||||
string="Export CSV" class="btn-secondary"
|
||||
invisible="state == 'draft'"
|
||||
icon="fa-download"/>
|
||||
<button name="action_reset_draft" type="object"
|
||||
string="Reset to Draft" class="btn-secondary"
|
||||
invisible="state == 'draft'"
|
||||
icon="fa-undo"
|
||||
confirm="This will reset the report to draft. Continue?"/>
|
||||
<field name="state" widget="statusbar" statusbar_visible="draft,generated,sent"/>
|
||||
</header>
|
||||
<sheet>
|
||||
|
||||
@@ -7,6 +7,9 @@
|
||||
<field name="model">hr.attendance</field>
|
||||
<field name="inherit_id" ref="hr_attendance.view_attendance_tree"/>
|
||||
<field name="arch" type="xml">
|
||||
<xpath expr="//list" position="attributes">
|
||||
<attribute name="default_order">check_in desc</attribute>
|
||||
</xpath>
|
||||
<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"/>
|
||||
|
||||
@@ -11,7 +11,7 @@
|
||||
<page string="Fusion Clock" name="fusion_clock_tab"
|
||||
groups="fusion_clock.group_fusion_clock_manager,fusion_clock.group_fusion_clock_team_lead">
|
||||
|
||||
<!-- Summary Stats -->
|
||||
<!-- Configuration & Status -->
|
||||
<group>
|
||||
<group string="Configuration">
|
||||
<field name="x_fclk_enable_clock"/>
|
||||
@@ -31,133 +31,124 @@
|
||||
</group>
|
||||
</group>
|
||||
|
||||
<separator string="Activity Logs"/>
|
||||
<!-- Activity Log Sub-Tabs -->
|
||||
<notebook>
|
||||
<page string="Clock Events" name="fclk_sub_clock_events">
|
||||
<field name="x_fclk_activity_log_ids" nolabel="1" colspan="2"
|
||||
domain="[('log_type', 'in', ['clock_in', 'clock_out'])]">
|
||||
<list create="false" delete="false" limit="20" default_order="log_date desc">
|
||||
<field name="log_date"/>
|
||||
<field name="log_type"/>
|
||||
<field name="description"/>
|
||||
<field name="location_id"/>
|
||||
<field name="source"/>
|
||||
</list>
|
||||
</field>
|
||||
</page>
|
||||
|
||||
<!-- Clock Events -->
|
||||
<group string="Clock Events" name="fclk_clock_events">
|
||||
<field name="x_fclk_activity_log_ids" nolabel="1" colspan="2"
|
||||
domain="[('log_type', 'in', ['clock_in', 'clock_out'])]">
|
||||
<list create="false" delete="false" limit="20">
|
||||
<field name="log_date"/>
|
||||
<field name="log_type"/>
|
||||
<field name="description"/>
|
||||
<field name="location_id"/>
|
||||
<field name="source"/>
|
||||
</list>
|
||||
</field>
|
||||
</group>
|
||||
<page string="Penalties" name="fclk_sub_penalties">
|
||||
<field name="x_fclk_activity_log_ids" nolabel="1" colspan="2"
|
||||
domain="[('log_type', 'in', ['late_clock_in', 'early_clock_out'])]">
|
||||
<list create="false" delete="false" limit="20" default_order="log_date desc">
|
||||
<field name="log_date"/>
|
||||
<field name="log_type"/>
|
||||
<field name="description"/>
|
||||
</list>
|
||||
</field>
|
||||
</page>
|
||||
|
||||
<!-- Penalties -->
|
||||
<group string="Penalties" name="fclk_penalties">
|
||||
<field name="x_fclk_activity_log_ids" nolabel="1" colspan="2"
|
||||
domain="[('log_type', 'in', ['late_clock_in', 'early_clock_out'])]">
|
||||
<list create="false" delete="false" limit="20">
|
||||
<field name="log_date"/>
|
||||
<field name="log_type"/>
|
||||
<field name="description"/>
|
||||
</list>
|
||||
</field>
|
||||
</group>
|
||||
<page string="Geofence" name="fclk_sub_geofence">
|
||||
<field name="x_fclk_activity_log_ids" nolabel="1" colspan="2"
|
||||
domain="[('log_type', 'in', ['outside_geofence', 'ip_fallback'])]">
|
||||
<list create="false" delete="false" limit="20" default_order="log_date desc">
|
||||
<field name="log_date"/>
|
||||
<field name="log_type"/>
|
||||
<field name="description"/>
|
||||
<field name="latitude"/>
|
||||
<field name="longitude"/>
|
||||
<field name="distance"/>
|
||||
</list>
|
||||
</field>
|
||||
</page>
|
||||
|
||||
<!-- Geofence Violations -->
|
||||
<group string="Geofence Violations" name="fclk_geofence">
|
||||
<field name="x_fclk_activity_log_ids" nolabel="1" colspan="2"
|
||||
domain="[('log_type', 'in', ['outside_geofence', 'ip_fallback'])]">
|
||||
<list create="false" delete="false" limit="20">
|
||||
<field name="log_date"/>
|
||||
<field name="log_type"/>
|
||||
<field name="description"/>
|
||||
<field name="latitude"/>
|
||||
<field name="longitude"/>
|
||||
<field name="distance"/>
|
||||
</list>
|
||||
</field>
|
||||
</group>
|
||||
<page string="System" name="fclk_sub_system">
|
||||
<field name="x_fclk_activity_log_ids" nolabel="1" colspan="2"
|
||||
domain="[('log_type', 'in', ['auto_clock_out', 'missed_clock_out'])]">
|
||||
<list create="false" delete="false" limit="20" default_order="log_date desc">
|
||||
<field name="log_date"/>
|
||||
<field name="log_type"/>
|
||||
<field name="description"/>
|
||||
<field name="attendance_id"/>
|
||||
</list>
|
||||
</field>
|
||||
</page>
|
||||
|
||||
<!-- System Actions -->
|
||||
<group string="System Actions" name="fclk_system_actions">
|
||||
<field name="x_fclk_activity_log_ids" nolabel="1" colspan="2"
|
||||
domain="[('log_type', 'in', ['auto_clock_out', 'missed_clock_out'])]">
|
||||
<list create="false" delete="false" limit="20">
|
||||
<field name="log_date"/>
|
||||
<field name="log_type"/>
|
||||
<field name="description"/>
|
||||
<field name="attendance_id"/>
|
||||
</list>
|
||||
</field>
|
||||
</group>
|
||||
<page string="Absences" name="fclk_sub_absences">
|
||||
<field name="x_fclk_activity_log_ids" nolabel="1" colspan="2"
|
||||
domain="[('log_type', '=', 'absent')]">
|
||||
<list create="false" delete="false" limit="20" default_order="log_date desc">
|
||||
<field name="log_date"/>
|
||||
<field name="description"/>
|
||||
</list>
|
||||
</field>
|
||||
</page>
|
||||
|
||||
<!-- Absences -->
|
||||
<group string="Absences" name="fclk_absences">
|
||||
<field name="x_fclk_activity_log_ids" nolabel="1" colspan="2"
|
||||
domain="[('log_type', '=', 'absent')]">
|
||||
<list create="false" delete="false" limit="20">
|
||||
<field name="log_date"/>
|
||||
<field name="description"/>
|
||||
</list>
|
||||
</field>
|
||||
</group>
|
||||
<page string="Leave Requests" name="fclk_sub_leaves">
|
||||
<field name="x_fclk_leave_request_ids" nolabel="1" colspan="2">
|
||||
<list create="false" delete="false" limit="20" default_order="leave_date desc">
|
||||
<field name="leave_date"/>
|
||||
<field name="reason"/>
|
||||
<field name="state"/>
|
||||
<field name="created_from"/>
|
||||
</list>
|
||||
</field>
|
||||
</page>
|
||||
|
||||
<!-- Leave Requests -->
|
||||
<group string="Leave Requests" name="fclk_leaves">
|
||||
<field name="x_fclk_leave_request_ids" nolabel="1" colspan="2">
|
||||
<list create="false" delete="false" limit="20">
|
||||
<field name="leave_date"/>
|
||||
<field name="reason"/>
|
||||
<field name="state"/>
|
||||
<field name="created_from"/>
|
||||
</list>
|
||||
</field>
|
||||
</group>
|
||||
<page string="Reasons" name="fclk_sub_reasons">
|
||||
<field name="x_fclk_activity_log_ids" nolabel="1" colspan="2"
|
||||
domain="[('log_type', '=', 'reason_provided')]">
|
||||
<list create="false" delete="false" limit="20" default_order="log_date desc">
|
||||
<field name="log_date"/>
|
||||
<field name="description"/>
|
||||
</list>
|
||||
</field>
|
||||
</page>
|
||||
|
||||
<!-- Reason Submissions -->
|
||||
<group string="Reason Submissions" name="fclk_reasons">
|
||||
<field name="x_fclk_activity_log_ids" nolabel="1" colspan="2"
|
||||
domain="[('log_type', '=', 'reason_provided')]">
|
||||
<list create="false" delete="false" limit="20">
|
||||
<field name="log_date"/>
|
||||
<field name="description"/>
|
||||
</list>
|
||||
</field>
|
||||
</group>
|
||||
<page string="Overtime" name="fclk_sub_overtime">
|
||||
<field name="x_fclk_activity_log_ids" nolabel="1" colspan="2"
|
||||
domain="[('log_type', '=', 'overtime')]">
|
||||
<list create="false" delete="false" limit="20" default_order="log_date desc">
|
||||
<field name="log_date"/>
|
||||
<field name="description"/>
|
||||
<field name="attendance_id"/>
|
||||
</list>
|
||||
</field>
|
||||
</page>
|
||||
|
||||
<!-- Overtime -->
|
||||
<group string="Overtime" name="fclk_overtime">
|
||||
<field name="x_fclk_activity_log_ids" nolabel="1" colspan="2"
|
||||
domain="[('log_type', '=', 'overtime')]">
|
||||
<list create="false" delete="false" limit="20">
|
||||
<field name="log_date"/>
|
||||
<field name="description"/>
|
||||
<field name="attendance_id"/>
|
||||
</list>
|
||||
</field>
|
||||
</group>
|
||||
<page string="Corrections" name="fclk_sub_corrections">
|
||||
<field name="x_fclk_correction_ids" nolabel="1" colspan="2">
|
||||
<list create="false" delete="false" limit="20">
|
||||
<field name="attendance_id"/>
|
||||
<field name="requested_check_in"/>
|
||||
<field name="requested_check_out"/>
|
||||
<field name="reason"/>
|
||||
<field name="state" decoration-success="state == 'approved'"
|
||||
decoration-danger="state == 'rejected'"
|
||||
decoration-warning="state == 'pending'"/>
|
||||
</list>
|
||||
</field>
|
||||
</page>
|
||||
|
||||
<!-- Correction Requests -->
|
||||
<group string="Correction Requests" name="fclk_corrections">
|
||||
<field name="x_fclk_correction_ids" nolabel="1" colspan="2">
|
||||
<list create="false" delete="false" limit="20">
|
||||
<field name="attendance_id"/>
|
||||
<field name="requested_check_in"/>
|
||||
<field name="requested_check_out"/>
|
||||
<field name="reason"/>
|
||||
<field name="state" decoration-success="state == 'approved'"
|
||||
decoration-danger="state == 'rejected'"
|
||||
decoration-warning="state == 'pending'"/>
|
||||
</list>
|
||||
</field>
|
||||
</group>
|
||||
|
||||
<!-- Streak Milestones -->
|
||||
<group string="Streak Milestones" name="fclk_streaks">
|
||||
<field name="x_fclk_activity_log_ids" nolabel="1" colspan="2"
|
||||
domain="[('log_type', '=', 'streak_milestone')]">
|
||||
<list create="false" delete="false" limit="20">
|
||||
<field name="log_date"/>
|
||||
<field name="description"/>
|
||||
</list>
|
||||
</field>
|
||||
</group>
|
||||
<page string="Streaks" name="fclk_sub_streaks">
|
||||
<field name="x_fclk_activity_log_ids" nolabel="1" colspan="2"
|
||||
domain="[('log_type', '=', 'streak_milestone')]">
|
||||
<list create="false" delete="false" limit="20" default_order="log_date desc">
|
||||
<field name="log_date"/>
|
||||
<field name="description"/>
|
||||
</list>
|
||||
</field>
|
||||
</page>
|
||||
</notebook>
|
||||
|
||||
</page>
|
||||
</xpath>
|
||||
|
||||
@@ -226,10 +226,10 @@
|
||||
<div class="fclk-recent-item">
|
||||
<div class="fclk-recent-date">
|
||||
<div class="fclk-recent-day-name">
|
||||
<t t-esc="att.check_in.strftime('%a')"/>
|
||||
<t t-esc="context_timestamp(att.check_in).strftime('%a')"/>
|
||||
</div>
|
||||
<div class="fclk-recent-day-num">
|
||||
<t t-esc="att.check_in.strftime('%d')"/>
|
||||
<t t-esc="context_timestamp(att.check_in).strftime('%d')"/>
|
||||
</div>
|
||||
</div>
|
||||
<div class="fclk-recent-info">
|
||||
@@ -237,8 +237,8 @@
|
||||
<t t-esc="att.x_fclk_location_id.name or 'Unknown'"/>
|
||||
</div>
|
||||
<div class="fclk-recent-times">
|
||||
<t t-esc="att.check_in.strftime('%I:%M %p')"/>
|
||||
- <t t-esc="att.check_out.strftime('%I:%M %p') if att.check_out else '--'"/>
|
||||
<t t-esc="context_timestamp(att.check_in).strftime('%I:%M %p')"/>
|
||||
- <t t-esc="context_timestamp(att.check_out).strftime('%I:%M %p') if att.check_out else '--'"/>
|
||||
</div>
|
||||
</div>
|
||||
<div class="fclk-recent-hours">
|
||||
|
||||
@@ -69,15 +69,15 @@
|
||||
<t t-foreach="attendances" t-as="att">
|
||||
<tr>
|
||||
<td>
|
||||
<strong><t t-esc="att.check_in.strftime('%a')"/></strong>
|
||||
<strong><t t-esc="context_timestamp(att.check_in).strftime('%a')"/></strong>
|
||||
<span style="color:#9ca3af; margin-left:4px;">
|
||||
<t t-esc="att.check_in.strftime('%b %d')"/>
|
||||
<t t-esc="context_timestamp(att.check_in).strftime('%b %d')"/>
|
||||
</span>
|
||||
</td>
|
||||
<td><t t-esc="att.check_in.strftime('%I:%M %p')"/></td>
|
||||
<td><t t-esc="context_timestamp(att.check_in).strftime('%I:%M %p')"/></td>
|
||||
<td>
|
||||
<t t-if="att.check_out">
|
||||
<t t-esc="att.check_out.strftime('%I:%M %p')"/>
|
||||
<t t-esc="context_timestamp(att.check_out).strftime('%I:%M %p')"/>
|
||||
<t t-if="att.x_fclk_auto_clocked_out">
|
||||
<span class="fclk-ts-badge-auto">AUTO</span>
|
||||
</t>
|
||||
|
||||
@@ -10,155 +10,166 @@
|
||||
<xpath expr="//form" position="inside">
|
||||
<app data-string="Fusion Clock" string="Fusion Clock" name="fusion_clock" groups="fusion_clock.group_fusion_clock_manager">
|
||||
|
||||
<!-- ============================================================ -->
|
||||
<!-- Work Schedule -->
|
||||
<!-- ============================================================ -->
|
||||
<block title="Work Schedule" name="fclk_work_schedule">
|
||||
<setting string="Default Clock-In Time" help="The scheduled start time for employees (used when no shift is assigned).">
|
||||
<setting id="fclk_default_schedule" string="Default Schedule"
|
||||
help="Scheduled start and end times used when no shift is assigned to an employee.">
|
||||
<div class="content-group">
|
||||
<div class="row mt16">
|
||||
<label for="fclk_default_clock_in_time" class="col-lg-3"/>
|
||||
<label for="fclk_default_clock_in_time" string="Clock-In" class="col-lg-5 o_light_label"/>
|
||||
<field name="fclk_default_clock_in_time" widget="float_time"/>
|
||||
</div>
|
||||
</div>
|
||||
</setting>
|
||||
<setting string="Default Clock-Out Time" help="The scheduled end time for employees.">
|
||||
<div class="content-group">
|
||||
<div class="row mt16">
|
||||
<label for="fclk_default_clock_out_time" class="col-lg-3"/>
|
||||
<div class="row mt8">
|
||||
<label for="fclk_default_clock_out_time" string="Clock-Out" class="col-lg-5 o_light_label"/>
|
||||
<field name="fclk_default_clock_out_time" widget="float_time"/>
|
||||
</div>
|
||||
</div>
|
||||
</setting>
|
||||
</block>
|
||||
|
||||
<!-- Break Settings -->
|
||||
<block title="Break Settings" name="fclk_break_settings">
|
||||
<setting string="Auto-Deduct Break" help="Automatically deduct unpaid break from worked hours.">
|
||||
<setting id="fclk_auto_break" string="Auto-Deduct Break"
|
||||
help="Automatically deduct unpaid break from worked hours on clock-out.">
|
||||
<field name="fclk_auto_deduct_break"/>
|
||||
<div class="content-group" invisible="not fclk_auto_deduct_break">
|
||||
<div class="row mt16">
|
||||
<label for="fclk_default_break_minutes" class="col-lg-3"/>
|
||||
<label for="fclk_default_break_minutes" string="Duration (min)" class="col-lg-5 o_light_label"/>
|
||||
<field name="fclk_default_break_minutes"/>
|
||||
<span class="ms-1">minutes</span>
|
||||
</div>
|
||||
<div class="row mt8">
|
||||
<label for="fclk_break_threshold_hours" class="col-lg-3"/>
|
||||
<label for="fclk_break_threshold_hours" string="Min. Shift" class="col-lg-5 o_light_label"/>
|
||||
<field name="fclk_break_threshold_hours" widget="float_time"/>
|
||||
<span class="ms-1">(only deduct if shift exceeds this)</span>
|
||||
</div>
|
||||
</div>
|
||||
</setting>
|
||||
</block>
|
||||
|
||||
<!-- Auto Clock-Out & Grace Period -->
|
||||
<block title="Auto Clock-Out" name="fclk_auto_clockout">
|
||||
<setting string="Enable Auto Clock-Out" help="Automatically clock out employees after shift + grace period.">
|
||||
<!-- ============================================================ -->
|
||||
<!-- Attendance Rules -->
|
||||
<!-- ============================================================ -->
|
||||
<block title="Attendance Rules" name="fclk_attendance_rules">
|
||||
<setting id="fclk_auto_clockout" string="Auto Clock-Out"
|
||||
help="Automatically clock out employees after their shift end time plus a grace period.">
|
||||
<field name="fclk_enable_auto_clockout"/>
|
||||
<div class="content-group" invisible="not fclk_enable_auto_clockout">
|
||||
<div class="row mt16">
|
||||
<label for="fclk_grace_period_minutes" class="col-lg-3"/>
|
||||
<label for="fclk_grace_period_minutes" string="Grace (min)" class="col-lg-5 o_light_label"/>
|
||||
<field name="fclk_grace_period_minutes"/>
|
||||
<span class="ms-1">minutes grace after scheduled end</span>
|
||||
</div>
|
||||
<div class="row mt8">
|
||||
<label for="fclk_max_shift_hours" class="col-lg-3"/>
|
||||
<label for="fclk_max_shift_hours" string="Max Shift" class="col-lg-5 o_light_label"/>
|
||||
<field name="fclk_max_shift_hours" widget="float_time"/>
|
||||
<span class="ms-1">max shift safety net</span>
|
||||
</div>
|
||||
</div>
|
||||
</setting>
|
||||
</block>
|
||||
|
||||
<!-- Penalties -->
|
||||
<block title="Penalty Tracking" name="fclk_penalties">
|
||||
<setting string="Enable Penalties" help="Track late clock-in and early clock-out with automatic deductions.">
|
||||
<setting id="fclk_penalties" string="Penalty Tracking"
|
||||
help="Deduct minutes from worked hours when employees clock in late or clock out early.">
|
||||
<field name="fclk_enable_penalties"/>
|
||||
<div class="content-group" invisible="not fclk_enable_penalties">
|
||||
<div class="row mt16">
|
||||
<label for="fclk_penalty_grace_minutes" class="col-lg-3"/>
|
||||
<label for="fclk_penalty_grace_minutes" string="Grace (min)" class="col-lg-5 o_light_label"/>
|
||||
<field name="fclk_penalty_grace_minutes"/>
|
||||
<span class="ms-1">minutes grace before penalty</span>
|
||||
</div>
|
||||
<div class="row mt8">
|
||||
<label for="fclk_penalty_deduction_minutes" class="col-lg-3"/>
|
||||
<label for="fclk_penalty_deduction_minutes" string="Deduction (min)" class="col-lg-5 o_light_label"/>
|
||||
<field name="fclk_penalty_deduction_minutes"/>
|
||||
<span class="ms-1">minutes deducted per penalty</span>
|
||||
</div>
|
||||
</div>
|
||||
</setting>
|
||||
<setting id="fclk_overtime" string="Overtime Tracking"
|
||||
help="Calculate and track overtime when net hours exceed the daily or weekly threshold.">
|
||||
<field name="fclk_enable_overtime"/>
|
||||
<div class="content-group" invisible="not fclk_enable_overtime">
|
||||
<div class="row mt16">
|
||||
<label for="fclk_daily_overtime_threshold" string="Daily Limit" class="col-lg-5 o_light_label"/>
|
||||
<field name="fclk_daily_overtime_threshold" widget="float_time"/>
|
||||
</div>
|
||||
<div class="row mt8">
|
||||
<label for="fclk_weekly_overtime_threshold" string="Weekly Limit" class="col-lg-5 o_light_label"/>
|
||||
<field name="fclk_weekly_overtime_threshold" widget="float_time"/>
|
||||
</div>
|
||||
</div>
|
||||
</setting>
|
||||
</block>
|
||||
|
||||
<!-- Office User & Notifications -->
|
||||
<block title="Office User & Notifications" name="fclk_notifications">
|
||||
<setting string="Office User" help="User who receives all attendance-related activity notifications.">
|
||||
<!-- ============================================================ -->
|
||||
<!-- Notifications -->
|
||||
<!-- ============================================================ -->
|
||||
<block title="Notifications" name="fclk_notifications">
|
||||
<setting id="fclk_office_user" string="Office User"
|
||||
help="User who receives activity notifications for attendance issues (late arrivals, excessive absences).">
|
||||
<div class="content-group">
|
||||
<div class="row mt16">
|
||||
<label for="fclk_office_user_id" class="col-lg-3"/>
|
||||
<label for="fclk_office_user_id" string="User" class="col-lg-5 o_light_label"/>
|
||||
<field name="fclk_office_user_id"/>
|
||||
</div>
|
||||
<div class="row mt8">
|
||||
<label for="fclk_very_late_threshold_minutes" class="col-lg-3"/>
|
||||
<label for="fclk_very_late_threshold_minutes" string="Late Alert (min)" class="col-lg-5 o_light_label"/>
|
||||
<field name="fclk_very_late_threshold_minutes"/>
|
||||
<span class="ms-1">minutes late before office user is notified</span>
|
||||
</div>
|
||||
<div class="row mt8">
|
||||
<label for="fclk_max_monthly_absences" class="col-lg-3"/>
|
||||
<label for="fclk_max_monthly_absences" string="Max Absences" class="col-lg-5 o_light_label"/>
|
||||
<field name="fclk_max_monthly_absences"/>
|
||||
<span class="ms-1">absences before office user is alerted</span>
|
||||
</div>
|
||||
</div>
|
||||
</setting>
|
||||
<setting string="Employee Notifications" help="Send clock-in/out reminders to employees.">
|
||||
<setting id="fclk_employee_notifications" string="Employee Reminders"
|
||||
help="Send clock-in and clock-out reminders to employees based on their shift schedule.">
|
||||
<field name="fclk_enable_employee_notifications"/>
|
||||
<div class="content-group" invisible="not fclk_enable_employee_notifications">
|
||||
<div class="row mt16">
|
||||
<label for="fclk_reminder_before_shift_minutes" class="col-lg-3"/>
|
||||
<label for="fclk_reminder_before_shift_minutes" string="Late Reminder (min)" class="col-lg-5 o_light_label"/>
|
||||
<field name="fclk_reminder_before_shift_minutes"/>
|
||||
<span class="ms-1">minutes after shift start to remind</span>
|
||||
</div>
|
||||
<div class="row mt8">
|
||||
<label for="fclk_reminder_before_end_minutes" class="col-lg-3"/>
|
||||
<label for="fclk_reminder_before_end_minutes" string="End Reminder (min)" class="col-lg-5 o_light_label"/>
|
||||
<field name="fclk_reminder_before_end_minutes"/>
|
||||
<span class="ms-1">minutes before shift end to remind</span>
|
||||
</div>
|
||||
</div>
|
||||
</setting>
|
||||
<setting string="Weekly Summary" help="Send weekly attendance summary to employees on Monday.">
|
||||
<setting id="fclk_weekly_summary" string="Weekly Summary"
|
||||
help="Send a weekly attendance summary email to each employee on Monday.">
|
||||
<field name="fclk_send_weekly_summary"/>
|
||||
</setting>
|
||||
</block>
|
||||
|
||||
<!-- Overtime -->
|
||||
<block title="Overtime" name="fclk_overtime">
|
||||
<setting string="Enable Overtime Tracking" help="Track hours beyond scheduled shift.">
|
||||
<field name="fclk_enable_overtime"/>
|
||||
<div class="content-group" invisible="not fclk_enable_overtime">
|
||||
<!-- ============================================================ -->
|
||||
<!-- Location & Verification -->
|
||||
<!-- ============================================================ -->
|
||||
<block title="Location & Verification" name="fclk_location_settings">
|
||||
<setting id="fclk_ip_fallback" string="IP Fallback"
|
||||
help="Allow IP-based location verification when GPS is unavailable.">
|
||||
<field name="fclk_enable_ip_fallback"/>
|
||||
</setting>
|
||||
<setting id="fclk_photo_verification" string="Photo Verification"
|
||||
help="Require selfie on clock-in. Per-location control is available in each location's settings.">
|
||||
<field name="fclk_enable_photo_verification"/>
|
||||
</setting>
|
||||
<setting id="fclk_google_maps" string="Google Maps API Key"
|
||||
help="Required for location geocoding and map previews in clock location setup.">
|
||||
<div class="content-group">
|
||||
<div class="row mt16">
|
||||
<label for="fclk_daily_overtime_threshold" class="col-lg-3"/>
|
||||
<field name="fclk_daily_overtime_threshold" widget="float_time"/>
|
||||
<span class="ms-1">daily net hours threshold</span>
|
||||
<label for="fclk_google_maps_api_key" string="API Key" class="col-lg-5 o_light_label"/>
|
||||
<field name="fclk_google_maps_api_key" class="o_input" placeholder="AIza..." password="True"/>
|
||||
</div>
|
||||
<div class="row mt8">
|
||||
<label for="fclk_weekly_overtime_threshold" class="col-lg-3"/>
|
||||
<field name="fclk_weekly_overtime_threshold" widget="float_time"/>
|
||||
<span class="ms-1">weekly net hours threshold</span>
|
||||
</div>
|
||||
</setting>
|
||||
<setting id="fclk_manage_locations" string="Clock Locations"
|
||||
help="Configure geofenced clock-in/out locations with GPS radius, IP ranges, and verification rules.">
|
||||
<div class="content-group">
|
||||
<div class="mt16">
|
||||
<button name="%(fusion_clock.action_fusion_clock_location)d" type="action"
|
||||
string="Manage Locations" icon="oi-arrow-right" class="btn-link"/>
|
||||
</div>
|
||||
</div>
|
||||
</setting>
|
||||
</block>
|
||||
|
||||
<!-- Location & Verification -->
|
||||
<block title="Location & Verification" name="fclk_location_verification">
|
||||
<setting string="IP Fallback" help="Allow IP-based verification when GPS is unavailable.">
|
||||
<field name="fclk_enable_ip_fallback"/>
|
||||
</setting>
|
||||
<setting string="Photo Verification" help="Require selfie on clock-in (controlled per location).">
|
||||
<field name="fclk_enable_photo_verification"/>
|
||||
</setting>
|
||||
</block>
|
||||
|
||||
<!-- Kiosk -->
|
||||
<block title="Kiosk Mode" name="fclk_kiosk">
|
||||
<setting string="Enable Kiosk" help="Allow shared-device clock-in/out.">
|
||||
<!-- ============================================================ -->
|
||||
<!-- Kiosk & Portal -->
|
||||
<!-- ============================================================ -->
|
||||
<block title="Kiosk & Portal" name="fclk_kiosk_portal">
|
||||
<setting id="fclk_kiosk" string="Kiosk Mode"
|
||||
help="Allow employees to clock in/out from a shared device (tablet or computer).">
|
||||
<field name="fclk_enable_kiosk"/>
|
||||
<div class="content-group" invisible="not fclk_enable_kiosk">
|
||||
<div class="row mt16">
|
||||
@@ -167,88 +178,70 @@
|
||||
</div>
|
||||
</div>
|
||||
</setting>
|
||||
</block>
|
||||
|
||||
<!-- Corrections -->
|
||||
<block title="Corrections" name="fclk_corrections">
|
||||
<setting string="Enable Correction Requests" help="Allow employees to request timesheet corrections.">
|
||||
<setting id="fclk_corrections" string="Correction Requests"
|
||||
help="Allow employees to request timesheet corrections from the portal.">
|
||||
<field name="fclk_enable_correction_requests"/>
|
||||
</setting>
|
||||
<setting id="fclk_sounds" string="Clock Sounds"
|
||||
help="Play audio confirmation sounds when employees clock in or out.">
|
||||
<field name="fclk_enable_sounds"/>
|
||||
</setting>
|
||||
</block>
|
||||
|
||||
<!-- Pay Period -->
|
||||
<block title="Pay Period" name="fclk_pay_period">
|
||||
<setting string="Pay Period Schedule" help="Defines how often reports are generated.">
|
||||
<!-- ============================================================ -->
|
||||
<!-- Pay Period & Reports -->
|
||||
<!-- ============================================================ -->
|
||||
<block title="Pay Period & Reports" name="fclk_pay_period_reports">
|
||||
<setting id="fclk_pay_period" string="Pay Period Schedule"
|
||||
help="Defines how often attendance reports are generated and the start/end dates of each reporting period.">
|
||||
<div class="content-group">
|
||||
<div class="row mt16">
|
||||
<label for="fclk_pay_period_type" class="col-lg-3"/>
|
||||
<label for="fclk_pay_period_type" string="Frequency" class="col-lg-5 o_light_label"/>
|
||||
<field name="fclk_pay_period_type"/>
|
||||
</div>
|
||||
<div class="row mt8">
|
||||
<label for="fclk_pay_period_start" class="col-lg-3"/>
|
||||
<label for="fclk_pay_period_start" string="Anchor Date" class="col-lg-5 o_light_label"/>
|
||||
<field name="fclk_pay_period_start"/>
|
||||
</div>
|
||||
</div>
|
||||
</setting>
|
||||
</block>
|
||||
|
||||
<!-- Reports -->
|
||||
<block title="Reports & Email" name="fclk_reports">
|
||||
<setting string="Auto-Generate Reports" help="Automatically generate reports at the end of each pay period.">
|
||||
<setting id="fclk_auto_reports" string="Auto-Generate Reports"
|
||||
help="Automatically create attendance reports at the end of each pay period.">
|
||||
<field name="fclk_auto_generate_reports"/>
|
||||
</setting>
|
||||
<setting string="Send Employee Copies" help="Email individual reports to each employee.">
|
||||
<setting id="fclk_employee_copies" string="Send Employee Copies"
|
||||
help="Email individual attendance reports to each employee at the end of each pay period.">
|
||||
<field name="fclk_send_employee_reports"/>
|
||||
</setting>
|
||||
<setting string="Manager Report Recipients" help="Comma-separated emails for batch report delivery.">
|
||||
<setting id="fclk_internal_recipients" string="Internal Recipients"
|
||||
help="Select internal users who should receive batch attendance reports.">
|
||||
<div class="content-group">
|
||||
<div class="row mt16">
|
||||
<label for="fclk_report_recipient_emails" class="col-lg-3"/>
|
||||
<field name="fclk_report_recipient_emails" class="o_input" placeholder="manager@company.com"/>
|
||||
<label for="fclk_report_recipient_user_ids" string="Users" class="col-lg-5 o_light_label"/>
|
||||
<field name="fclk_report_recipient_user_ids" widget="many2many_tags"/>
|
||||
</div>
|
||||
</div>
|
||||
</setting>
|
||||
<setting string="CSV Column Mapping" help="Custom column names for CSV export (JSON format).">
|
||||
<setting id="fclk_external_recipients" string="External Recipients"
|
||||
help="Additional email addresses for batch report delivery (e.g., external payroll agency).">
|
||||
<div class="content-group">
|
||||
<div class="row mt16">
|
||||
<label for="fclk_csv_column_mapping" class="col-lg-3"/>
|
||||
<label for="fclk_report_recipient_emails" string="Emails" class="col-lg-5 o_light_label"/>
|
||||
<field name="fclk_report_recipient_emails" class="o_input" placeholder="payroll@agency.com, manager@company.com"/>
|
||||
</div>
|
||||
</div>
|
||||
</setting>
|
||||
<setting id="fclk_csv_mapping" string="CSV Column Mapping"
|
||||
help="Custom column names for CSV export (JSON format). Leave blank for defaults.">
|
||||
<div class="content-group">
|
||||
<div class="row mt16">
|
||||
<label for="fclk_csv_column_mapping" string="Mapping" class="col-lg-5 o_light_label"/>
|
||||
<field name="fclk_csv_column_mapping" class="o_input"/>
|
||||
</div>
|
||||
</div>
|
||||
</setting>
|
||||
</block>
|
||||
|
||||
<!-- Clock Locations -->
|
||||
<block title="Clock Locations" name="fclk_locations">
|
||||
<setting string="Manage Locations" help="Configure geofenced clock-in/out locations.">
|
||||
<div class="content-group">
|
||||
<div class="mt16">
|
||||
<button name="%(fusion_clock.action_fusion_clock_location)d" type="action"
|
||||
string="Manage Locations" class="btn btn-primary" icon="fa-map-marker"/>
|
||||
</div>
|
||||
</div>
|
||||
</setting>
|
||||
</block>
|
||||
|
||||
<!-- Google Maps -->
|
||||
<block title="Google Maps" name="fclk_google_maps">
|
||||
<setting string="Google Maps API Key" help="Required for location geocoding and map previews.">
|
||||
<div class="content-group">
|
||||
<div class="row mt16">
|
||||
<label for="fclk_google_maps_api_key" class="col-lg-3"/>
|
||||
<field name="fclk_google_maps_api_key" class="o_input" placeholder="AIza..." password="True"/>
|
||||
</div>
|
||||
</div>
|
||||
</setting>
|
||||
</block>
|
||||
|
||||
<!-- Sounds -->
|
||||
<block title="Sounds" name="fclk_sounds">
|
||||
<setting string="Clock Sounds" help="Play audio feedback on clock-in and clock-out.">
|
||||
<field name="fclk_enable_sounds"/>
|
||||
</setting>
|
||||
</block>
|
||||
|
||||
</app>
|
||||
</xpath>
|
||||
</field>
|
||||
|
||||
Reference in New Issue
Block a user