From 1bf572947b860d69511ecfb4e4d82e406c32ba2c Mon Sep 17 00:00:00 2001 From: Bakry Date: Sun, 28 Dec 2025 17:09:47 +0300 Subject: [PATCH] field attendance_duration --- odex25_hr/attendances/i18n/ar_001.po | 8 +++- odex25_hr/attendances/models/hr_attendance.py | 42 +++++++++++++++++++ .../attendances/views/hr_attendance_view.xml | 2 + 3 files changed, 51 insertions(+), 1 deletion(-) diff --git a/odex25_hr/attendances/i18n/ar_001.po b/odex25_hr/attendances/i18n/ar_001.po index 031cfcf33..94a557391 100644 --- a/odex25_hr/attendances/i18n/ar_001.po +++ b/odex25_hr/attendances/i18n/ar_001.po @@ -2861,4 +2861,10 @@ msgstr "تم التبرير " #: model:ir.model.fields,field_description:attendances.field_hr_attendance_report_line__actual_absent_days #: model_terms:ir.ui.view,arch_db:attendances.employee_lateness_absense_overtime_form_view msgid "Actual Absent Days" -msgstr "أيام الغياب" \ No newline at end of file +msgstr "أيام الغياب" + +#. module: attendances +#: model:ir.model.fields,field_description:attendances.field_attendance_attendance__attendance_duration +#: model:ir.model.fields,field_description:attendances.field_attendance_attendance__attendance_duration_hhmmss +msgid "Attendance Duration" +msgstr "زمن الحضور" diff --git a/odex25_hr/attendances/models/hr_attendance.py b/odex25_hr/attendances/models/hr_attendance.py index e560aaeaa..b5ad2cdbc 100644 --- a/odex25_hr/attendances/models/hr_attendance.py +++ b/odex25_hr/attendances/models/hr_attendance.py @@ -446,6 +446,11 @@ class Attendance(models.Model): is_today = fields.Boolean(string='Is Today', compute='_compute_is_today', store=True) + attendance_duration = fields.Float(string="Attendance Duration", compute='_compute_attendance_duration', + store=True) + attendance_duration_hhmmss = fields.Char(string="Attendance Duration", + compute='_compute_attendance_duration', store=True) + @api.depends('action_date') def _compute_is_today(self): today = datetime.now().date() @@ -468,6 +473,43 @@ class Attendance(models.Model): item.action_date = False + @api.depends('employee_id', 'action_date', 'action', 'name') + def _compute_attendance_duration(self): + for record in self: + record.attendance_duration = 0.0 + record.attendance_duration_hhmmss = "00:00:00" + + if not record.employee_id or not record.action_date: + continue + + attendances = self.search([ + ('employee_id', '=', record.employee_id.id), + ('action_date', '=', record.action_date) + ], order='name ASC') + + total_seconds = 0 + last_sign_in = None + + for att in attendances: + if att.action == 'sign_in': + if not last_sign_in: + last_sign_in = att.name + + elif att.action == 'sign_out' and last_sign_in: + diff_seconds = (att.name - last_sign_in).total_seconds() + total_seconds += diff_seconds + + if att.id == record.id: + hours = int(total_seconds // 3600) + minutes = int((total_seconds % 3600) // 60) + seconds = int(total_seconds % 60) + + record.attendance_duration = round(total_seconds / 3600.0, 2) + record.attendance_duration_hhmmss = f"{hours:02d}:{minutes:02d}:{seconds:02d}" + + last_sign_in = None + + class HrEmployee(models.Model): _inherit = 'hr.employee' diff --git a/odex25_hr/attendances/views/hr_attendance_view.xml b/odex25_hr/attendances/views/hr_attendance_view.xml index e5462e474..b9094fb4c 100644 --- a/odex25_hr/attendances/views/hr_attendance_view.xml +++ b/odex25_hr/attendances/views/hr_attendance_view.xml @@ -362,6 +362,7 @@ + @@ -379,6 +380,7 @@ +