Merge pull request #1939 from expsa/samir-aladawi-fix-attendances-records

[FIX] attendances: mission date & in holidays or day mission calculat…
This commit is contained in:
SamirLADOUI-sa 2024-12-19 12:39:03 +01:00 committed by GitHub
commit be2ca601dc
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
1 changed files with 28 additions and 21 deletions

View File

@ -38,6 +38,9 @@ class HrAttendanceTransactions(models.Model):
department_id = fields.Many2one(related='employee_id.department_id', string='Department Name', store=True)
is_branch = fields.Many2one(related='department_id.branch_name', store=True, readonly=True)
sign_in_id = fields.Many2one('attendance.attendance', readonly=True)
sign_out_id = fields.Many2one('attendance.attendance', readonly=True)
def get_additional_hours(self):
for rec in self:
@ -62,6 +65,17 @@ class HrAttendanceTransactions(models.Model):
continue
calendar = item.calendar_id
# Determine working hours based on shift or full day
if not calendar.is_full_day:
if item.sequence == 1:
working_hours = calendar.shift_one_working_hours
else:
working_hours = calendar.shift_two_working_hours
else:
working_hours = calendar.working_hours
item.plan_hours = working_hours
if item.attending_type == 'out_cal' \
or holidays_module and (item.public_holiday or item.normal_leave) \
or official_mission_module and item.is_official and item.official_id.mission_type.duration_type == 'days':
@ -69,7 +83,8 @@ class HrAttendanceTransactions(models.Model):
'temp_lateness': 0.0,
'temp_exit': 0.0,
'break_duration': 0.0,
'is_absent': False
'is_absent': False,
'office_hours': working_hours
})
if holidays_module and (item.public_holiday or item.normal_leave):
item.write({
@ -91,20 +106,10 @@ class HrAttendanceTransactions(models.Model):
})
continue
# Determine working hours based on shift or full day
if not calendar.is_full_day:
if item.sequence == 1:
working_hours = calendar.shift_one_working_hours
else:
working_hours = calendar.shift_two_working_hours
else:
working_hours = calendar.working_hours
item.plan_hours = working_hours
# Adjust sign_in and sign_out
adjusted_sign_in = adjusted_sign_out = full_sign_in = full_sign_out = 0.0
if item.sign_in:
if item.sign_in_id:
if not calendar.is_full_day:
if item.sequence == 1: # First shift
full_max_sign_in = calendar.shift_one_max_sign_in
@ -131,18 +136,18 @@ class HrAttendanceTransactions(models.Model):
adjusted_sign_out = min(item.sign_out, full_sign_out)
# Calculate official hours
if adjusted_sign_in and adjusted_sign_out:
if adjusted_sign_in and item.sign_out_id:
item.official_hours = adjusted_sign_out - adjusted_sign_in
# Check absence due to missing sign_out
if adjusted_sign_in and not adjusted_sign_out:
if adjusted_sign_in and not item.sign_out_id:
current_time = fields.Datetime.now().hour
if calendar.end_sign_in > 0 and (current_time - adjusted_sign_in < calendar.end_sign_in):
item.is_absent = True
item.total_absent_hours = working_hours - (current_time - adjusted_sign_in)
# Handle absence due to insufficient working hours
if adjusted_sign_out and adjusted_sign_out - adjusted_sign_in < working_hours:
if item.sign_out_id and adjusted_sign_out - adjusted_sign_in < working_hours:
if calendar.end_sign_in > 0 and working_hours < calendar.end_sign_in:
item.is_absent = True
item.total_absent_hours = working_hours - (adjusted_sign_out - adjusted_sign_in)
@ -164,7 +169,7 @@ class HrAttendanceTransactions(models.Model):
start_permission_time_float = 0.0
# Lateness
if adjusted_sign_in > full_sign_in:
if adjusted_sign_in > full_sign_in and item.sign_in_id:
lateness_time = adjusted_sign_in - full_sign_in
lateness_covered_time = 0.0
@ -191,7 +196,7 @@ class HrAttendanceTransactions(models.Model):
item.lateness = 0.0
# Early Exit
if adjusted_sign_out < full_sign_out:
if item.sign_out_id and adjusted_sign_out < full_sign_out:
remaining_work_time = full_sign_out - adjusted_sign_out
early_exit_covered_time = 0.0
@ -218,7 +223,7 @@ class HrAttendanceTransactions(models.Model):
item.early_exit = 0.0
# Final absence check
if not adjusted_sign_out or (adjusted_sign_out - adjusted_sign_in < calendar.end_sign_in):
if not item.sign_in_id or (not item.sign_out_id and calendar.end_sign_in > 0) or (item.sign_out_id and adjusted_sign_out - adjusted_sign_in < calendar.end_sign_in):
item.is_absent = True
item.total_absent_hours = max(0.0, working_hours - item.office_hours)
else:
@ -430,7 +435,9 @@ class HrAttendanceTransactions(models.Model):
# sign_in, sign_out = attending_periods[0]['in'], attending_periods[-1]['out']
shift_dict['sign_in'] = sign_in and self.get_sign_time(fields.Datetime.to_string(sign_in))[0] or 0.0
shift_dict['sign_in_id'] = signs_in
shift_dict['sign_out'] = sign_out and self.get_sign_time(fields.Datetime.to_string(sign_out))[0] or 0.0
shift_dict['sign_out_id'] = signs_out
shift_dict['sign_in_dt'] = sign_in and sign_in or 0.0
shift_dict['sign_out_dt'] = sign_out and sign_out or 0.0
'''shift_dict['temp_lateness'] = sign_in and sign_out and (
@ -619,9 +626,9 @@ class HrAttendanceTransactions(models.Model):
for mission in missions:
emp_mission = mission.employee_ids.filtered(lambda m: m.employee_id.id == trans.employee_id.id)[0]
miss_time = 0
mission_date = datetime.combine(fields.Datetime.from_string(mission.date), datetime.min.time())
mission_df = self.convert_float_2time(emp_mission.hour_from, mission_date)
mission_dt = self.convert_float_2time(emp_mission.hour_to, mission_date)
# mission_date = datetime.combine(fields.Datetime.from_string(mission.date), datetime.min.time())
mission_df = self.convert_float_2time(emp_mission.hour_from, emp_mission.date_from)
mission_dt = self.convert_float_2time(emp_mission.hour_to, emp_mission.date_from)
if trans.sign_in == 0.0 or trans.sign_out == 0.0:
miss_dic = {'is_official': True,
'official_id': mission.id,