diff --git a/yuthon_hr_attendance/models/hr_attendance.py b/yuthon_hr_attendance/models/hr_attendance.py index 012fcb19b..06943ee01 100644 --- a/yuthon_hr_attendance/models/hr_attendance.py +++ b/yuthon_hr_attendance/models/hr_attendance.py @@ -1236,22 +1236,45 @@ class HrAttendance(models.Model): else: record.shift_name = '行政班次' - def labor_update(self): - start_date = fields.Date.to_date('2025-09-01') - end_date = fields.Date.to_date('2025-09-23') + # 定时任务主方法 + def action_update_attendance(self): + pass #todo 待过 + + + def update_attendance(self, employee, current_date): + current_date_str = fields.Date.to_string(current_date) + leave_domain = [ + ('employee_id', '=', employee.id), + ('date_from', '<=', fields.Datetime.to_string(datetime.combine(current_date, datetime.max.time()))), + ('date_to', '>=', fields.Datetime.to_string(datetime.combine(current_date, datetime.min.time()))), + ('state', '=', 'validate') + ] + leave_records = self.env['hr.leave'].search(leave_domain) + if leave_records: + attendance_domain = [ + ('employee_id', '=', employee.id), + ('current_data', '=', current_date_str), + ] + attendance_recs = self.env['hr.attendance'].search(attendance_domain) + for leave in leave_records: + if leave.batch_id: + main_leave_record = leave.batch_id + elif leave.hour_batch_id: + main_leave_record = leave.hour_batch_id + + workflow = self.env['soong.workflow.record'].search([ + ('code', '=', main_leave_record.code) + ], limit=1) + attendance_recs.write({ + 'workflow_id': workflow.id, + 'is_workflow': True, + 'is_no_card': False, + 'is_early_card': False, + 'is_late_card': False, + 'is_abnormal': False, + 'absenteeism_card': False + }) - attendance_records = self.env['hr.attendance'].search( - [('current_data', '>=', start_date), - ('current_data', '<=', end_date)], - order='current_data, employee_id, id' # 按日期、员工、ID排序,确保顺序稳定 - ) - processed = set() - for record in attendance_records: - key = (record.employee_id.id, record.current_data) - if key not in processed: - processed.add(key) # 第一次出现,保留 - else: - record.unlink() class card_remind_form(models.Model): _name = 'card.remind.form' diff --git a/yuthon_hr_attendance/models/hr_attendance_detail_wechat.py b/yuthon_hr_attendance/models/hr_attendance_detail_wechat.py index 921f28cae..a2671e17b 100644 --- a/yuthon_hr_attendance/models/hr_attendance_detail_wechat.py +++ b/yuthon_hr_attendance/models/hr_attendance_detail_wechat.py @@ -344,7 +344,7 @@ class HrAttendanceDetail(models.Model): is_early_card, is_late_card, is_abnormal, is_warning, absenteeism_card, is_no_card = self.state_judgment(employee, check_in_time, check_out_time, sch_check_in_time, sch_check_out_time, current_data, is_manual) is_expatriation = self.env['expatriation.approval'].search([('work_end', '=', True),('expatriates_ids', 'in', [employee.id]), ('is_effect', '=', False)]) - if attendance and not attendance.workflow_id: + if attendance: attendance.write({ 'check_in': check_in_time, 'check_out': check_out_time, @@ -363,6 +363,7 @@ class HrAttendanceDetail(models.Model): 'absenteeism_card': absenteeism_card, 'is_expatriation': is_expatriation, }) + attendance.update_attendance(employee, current_data) else: self.env['hr.attendance'].create({ 'employee_id': employee.id,