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:
commit
be2ca601dc
|
|
@ -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,
|
||||
|
|
|
|||
Loading…
Reference in New Issue