diff --git a/yuthon_hr_attendance/models/hr_attendance.py b/yuthon_hr_attendance/models/hr_attendance.py index ecab501bf..109ac6a60 100644 --- a/yuthon_hr_attendance/models/hr_attendance.py +++ b/yuthon_hr_attendance/models/hr_attendance.py @@ -64,30 +64,41 @@ class HrAttendance(models.Model): def create_attendance_data_holiday(self): """ - 定时任务create_attendance_data_holiday + 定时任务create_attendance_data_holiday(处理2025-10-01至2025-10-25的考勤数据) :return: """ att_ids = self.sudo().env['hr.attendance'] - # 补充假期橙色逻辑,班次逻辑 - for emp in self.sudo().env['hr.employee'].search([('user_state', '!=', 'withdraw')]): - test1 = att_ids.search([('current_data', '=', fields.Date.today()), ('employee_id', '=', emp.id)]) - resource_user_ids = emp.resource_calendar_id.resource_user_ids.ids - is_resource_user = True if emp.id in resource_user_ids else False - if not is_resource_user and not test1: - slot_start = datetime.combine(fields.Date.today(), datetime.min.time()) - slot_end = datetime.combine(fields.Date.today() + timedelta(days=1), datetime.min.time()) - # 查找员工对应的班次 - planning_slots = self.env['planning.slot'].search([ - ('employee_id', '=', emp.id), - ('start_datetime', '>=', slot_start), - ('start_datetime', '<', slot_end), - ], limit=1) - att_ids.create({ - 'employee_id': emp.id, - 'shift_id': planning_slots.id, - 'shift_name': planning_slots.display_name, - 'current_data': fields.Date.today(), - }) + start_date = fields.Date.from_string('2025-10-01') # 起始日期 + end_date = fields.Date.from_string('2025-10-25') # 结束日期 + current_date = start_date + while current_date <= end_date: + for emp in self.sudo().env['hr.employee'].search([('user_state', '!=', 'withdraw')]): + # 检查该员工在当前日期是否已有考勤记录 + existing_attendance = att_ids.search([ + ('current_data', '=', current_date), + ('employee_id', '=', emp.id) + ]) + # 检查员工是否在资源日历的用户列表中 + resource_user_ids = emp.resource_calendar_id.resource_user_ids.ids + is_resource_user = emp.id in resource_user_ids # 简化判断 + # 如果不是资源用户且无考勤记录,则创建考勤 + if not is_resource_user and not existing_attendance: + slot_start = datetime.combine(current_date, datetime.min.time()) + slot_end = datetime.combine(current_date + timedelta(days=1), datetime.min.time()) + + # 查找该员工当天的班次 + planning_slot = self.env['planning.slot'].search([ + ('employee_id', '=', emp.id), + ('start_datetime', '>=', slot_start), + ('start_datetime', '<', slot_end), + ], limit=1) + att_ids.create({ + 'employee_id': emp.id, + 'shift_id': planning_slot.id, + 'shift_name': planning_slot.display_name, + 'current_data': current_date, + }) + current_date += timedelta(days=1) def state_fix(self): for att in self.env["hr.attendance"].browse(self._context.get('active_ids', self._context.get('active_id'))):