diff --git a/yuthon_hr_attendance/models/hr_attendance.py b/yuthon_hr_attendance/models/hr_attendance.py index 0a7281980..c8db45156 100644 --- a/yuthon_hr_attendance/models/hr_attendance.py +++ b/yuthon_hr_attendance/models/hr_attendance.py @@ -450,6 +450,71 @@ class HrAttendance(models.Model): } } + def ensure_september_records(self): + """ + 确保9月1日至9月23日期间每位员工至少有一条记录 + 若没有则创建一条默认记录 + """ + # 定义日期范围:9月1日至9月23日 + start_date = fields.Date.from_string('2025-09-01') # 可根据需要修改年份 + end_date = fields.Date.from_string('2025-09-23') + + # 获取所有员工 + existing_employees = self.env['hr.employee'].search([ + ('id', 'in', self.search([]).mapped('employee_id.id')) # 仅包含有过记录的员工 + ]) + if not existing_employees: + return + + # 计算日期范围内的所有日期 + current_date = start_date + date_list = [] + while current_date <= end_date: + date_list.append(current_date) + current_date += timedelta(days=1) + + # 批量获取已有记录,减少数据库查询 + existing_records = self.search([ + ('employee_id', 'in', existing_employees.ids), + ('check_in', '>=', fields.Date.to_string(start_date)), + ('check_in', '<=', fields.Date.to_string(end_date + timedelta(days=1))) + ]) + + # 按员工ID和日期分组存储已有记录 + existing_map = {} + for record in existing_records: + record_date = fields.Date.from_string(record.check_in) if record.check_in else fields.Date.from_string( + record.check_out) + if not record_date: + continue + key = (record.employee_id.id, fields.Date.to_string(record_date)) + existing_map[key] = True + + # 需要创建的记录列表 + records_to_create = [] + + # 检查每个员工在每个日期是否有记录 + for employee in existing_employees: + for date in date_list: + date_str = fields.Date.to_string(date) + key = (employee.id, date_str) + + # 如果没有记录,则添加到创建列表 + if key not in existing_map: + records_to_create.append({ + 'employee_id': employee.id, + 'check_in': date_str, # 设置为当天 + 'check_out': False, + 'is_no_card': False, + 'is_abnormal': False + }) + + # 批量创建记录(效率更高) + if records_to_create: + self.create(records_to_create) + self.env.cr.commit() # 可选:立即提交事务 + + def button_source(self): employee_id = self.employee_id.id current_date = self.current_data