146 lines
9.1 KiB
XML
146 lines
9.1 KiB
XML
<?xml version="1.0" encoding="utf-8"?>
|
|
<odoo>
|
|
|
|
<!-- Employee Report Action -->
|
|
<record id="action_report_clock_employee" model="ir.actions.report">
|
|
<field name="name">Employee Attendance Report</field>
|
|
<field name="model">fusion.clock.report</field>
|
|
<field name="report_type">qweb-pdf</field>
|
|
<field name="report_name">fusion_clock.report_clock_employee</field>
|
|
<field name="report_file">fusion_clock.report_clock_employee</field>
|
|
<field name="binding_model_id" ref="model_fusion_clock_report"/>
|
|
<field name="binding_type">report</field>
|
|
</record>
|
|
|
|
<!-- Employee Report Template -->
|
|
<template id="report_clock_employee">
|
|
<t t-call="web.html_container">
|
|
<t t-foreach="docs" t-as="doc">
|
|
<t t-call="web.external_layout">
|
|
<div class="page" style="font-family: Arial, sans-serif;">
|
|
<!-- Header -->
|
|
<div style="text-align:center; margin-bottom:24px;">
|
|
<h2 style="color:#1a1d23; margin:0;">Attendance Report</h2>
|
|
<p style="color:#6b7280; margin:4px 0 0;">
|
|
<t t-esc="doc.date_start"/> to <t t-esc="doc.date_end"/>
|
|
</p>
|
|
</div>
|
|
|
|
<!-- Employee Info -->
|
|
<table style="width:100%; margin-bottom:16px;">
|
|
<tr>
|
|
<td style="width:50%;">
|
|
<strong>Employee:</strong> <t t-esc="doc.employee_id.name"/>
|
|
</td>
|
|
<td style="width:50%; text-align:right;">
|
|
<strong>Company:</strong> <t t-esc="doc.company_id.name"/>
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td>
|
|
<strong>Department:</strong> <t t-esc="doc.employee_id.department_id.name or 'N/A'"/>
|
|
</td>
|
|
<td style="text-align:right;">
|
|
<strong>Schedule:</strong> <t t-esc="dict(doc._fields['schedule_type'].selection).get(doc.schedule_type, '')"/>
|
|
</td>
|
|
</tr>
|
|
</table>
|
|
|
|
<!-- Summary Box -->
|
|
<table style="width:100%; border-collapse:collapse; margin-bottom:24px; background:#f8f9fa; border-radius:8px;">
|
|
<tr>
|
|
<td style="padding:12px; text-align:center; border:1px solid #e0e0e0;">
|
|
<div style="font-size:20px; font-weight:bold; color:#1a1d23;">
|
|
<t t-esc="doc.days_worked"/>
|
|
</div>
|
|
<div style="font-size:11px; color:#6b7280;">Days Worked</div>
|
|
</td>
|
|
<td style="padding:12px; text-align:center; border:1px solid #e0e0e0;">
|
|
<div style="font-size:20px; font-weight:bold; color:#1a1d23;">
|
|
<t t-esc="'%.1f' % doc.total_hours"/>h
|
|
</div>
|
|
<div style="font-size:11px; color:#6b7280;">Total Hours</div>
|
|
</td>
|
|
<td style="padding:12px; text-align:center; border:1px solid #e0e0e0;">
|
|
<div style="font-size:20px; font-weight:bold; color:#10B981;">
|
|
<t t-esc="'%.1f' % doc.net_hours"/>h
|
|
</div>
|
|
<div style="font-size:11px; color:#6b7280;">Net Hours</div>
|
|
</td>
|
|
<td style="padding:12px; text-align:center; border:1px solid #e0e0e0;">
|
|
<div style="font-size:20px; font-weight:bold; color:#1a1d23;">
|
|
<t t-esc="'%.0f' % doc.total_breaks"/> min
|
|
</div>
|
|
<div style="font-size:11px; color:#6b7280;">Total Breaks</div>
|
|
</td>
|
|
<td style="padding:12px; text-align:center; border:1px solid #e0e0e0;">
|
|
<div style="font-size:20px; font-weight:bold;"
|
|
t-attf-style="color: {{ '#ef4444' if doc.total_penalties > 0 else '#1a1d23' }};">
|
|
<t t-esc="doc.total_penalties"/>
|
|
</div>
|
|
<div style="font-size:11px; color:#6b7280;">Penalties</div>
|
|
</td>
|
|
</tr>
|
|
</table>
|
|
|
|
<!-- Daily Breakdown -->
|
|
<h4 style="color:#1a1d23; margin-bottom:8px;">Daily Breakdown</h4>
|
|
<table style="width:100%; border-collapse:collapse; font-size:11px;">
|
|
<thead>
|
|
<tr style="background:#1a1d23; color:white;">
|
|
<th style="padding:8px; text-align:left;">Date</th>
|
|
<th style="padding:8px; text-align:center;">Clock In</th>
|
|
<th style="padding:8px; text-align:center;">Clock Out</th>
|
|
<th style="padding:8px; text-align:center;">Worked</th>
|
|
<th style="padding:8px; text-align:center;">Break</th>
|
|
<th style="padding:8px; text-align:center;">Net Hours</th>
|
|
<th style="padding:8px; text-align:left;">Location</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
<t t-foreach="doc.attendance_ids.sorted(key=lambda a: a.check_in)" t-as="att">
|
|
<tr t-attf-style="background: {{ '#f8f9fa' if att_index % 2 == 0 else '#ffffff' }};">
|
|
<td style="padding:6px 8px; border-bottom:1px solid #e0e0e0;">
|
|
<t t-esc="att.check_in" t-options="{'widget': 'date'}"/>
|
|
</td>
|
|
<td style="padding:6px 8px; border-bottom:1px solid #e0e0e0; text-align:center;">
|
|
<t t-esc="att.check_in" t-options="{'widget': 'datetime', 'format': 'HH:mm'}"/>
|
|
</td>
|
|
<td style="padding:6px 8px; border-bottom:1px solid #e0e0e0; text-align:center;">
|
|
<t t-if="att.check_out">
|
|
<t t-esc="att.check_out" t-options="{'widget': 'datetime', 'format': 'HH:mm'}"/>
|
|
</t>
|
|
<t t-else="">--</t>
|
|
</td>
|
|
<td style="padding:6px 8px; border-bottom:1px solid #e0e0e0; text-align:center;">
|
|
<t t-esc="'%.1f' % (att.worked_hours or 0)"/>h
|
|
</td>
|
|
<td style="padding:6px 8px; border-bottom:1px solid #e0e0e0; text-align:center;">
|
|
<t t-esc="'%.0f' % (att.x_fclk_break_minutes or 0)"/> min
|
|
</td>
|
|
<td style="padding:6px 8px; border-bottom:1px solid #e0e0e0; text-align:center; font-weight:bold;">
|
|
<t t-esc="'%.1f' % (att.x_fclk_net_hours or 0)"/>h
|
|
</td>
|
|
<td style="padding:6px 8px; border-bottom:1px solid #e0e0e0;">
|
|
<t t-esc="att.x_fclk_location_id.name or ''"/>
|
|
</td>
|
|
</tr>
|
|
</t>
|
|
</tbody>
|
|
</table>
|
|
|
|
<!-- Footer -->
|
|
<div style="margin-top:24px; padding-top:12px; border-top:1px solid #e0e0e0; text-align:center;">
|
|
<p style="color:#9ca3af; font-size:10px;">
|
|
Generated by Fusion Clock |
|
|
<t t-esc="context_timestamp(datetime.datetime.now()).strftime('%Y-%m-%d %H:%M')"/>
|
|
</p>
|
|
</div>
|
|
</div>
|
|
</t>
|
|
</t>
|
|
</t>
|
|
</template>
|
|
|
|
</odoo>
|