From c905c490ad436ba7a2657ac2de4ccbaa77f3da7a Mon Sep 17 00:00:00 2001 From: ljmwkx <1340053001@qq.com> Date: Sat, 25 Jan 2025 11:25:41 +0800 Subject: [PATCH] =?UTF-8?q?=E6=8F=90=E4=BA=A4=E4=B8=80=E7=89=88=E6=9C=AC?= =?UTF-8?q?=20=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- yuthon_hr_attendance/models/hr_attendance.py | 1 + .../models/hr_attendance_detail_wechat.py | 292 +++++++++++++++--- 2 files changed, 247 insertions(+), 46 deletions(-) diff --git a/yuthon_hr_attendance/models/hr_attendance.py b/yuthon_hr_attendance/models/hr_attendance.py index 9f9353090..93a0725d3 100644 --- a/yuthon_hr_attendance/models/hr_attendance.py +++ b/yuthon_hr_attendance/models/hr_attendance.py @@ -19,6 +19,7 @@ class HrAttendance(models.Model): is_early_card = fields.Boolean(string="早退", group_operator='count_true') is_late_card = fields.Boolean(string="迟到", group_operator='count_true') is_abnormal = fields.Boolean(string="异常", group_operator='count_true') + absenteeism_card = fields.Boolean(string="旷工", group_operator='count_true') work_time_type = fields.Selection([('close_day', '休息日'), ('work_day', '工作日')], string="工作时间类型") company_id = fields.Many2one('res.company', string='公司', index=True, default=lambda self: self.env.company) on_card_location = fields.Char(string="上班打卡地点") diff --git a/yuthon_hr_attendance/models/hr_attendance_detail_wechat.py b/yuthon_hr_attendance/models/hr_attendance_detail_wechat.py index 94ca4d210..8347c86e6 100644 --- a/yuthon_hr_attendance/models/hr_attendance_detail_wechat.py +++ b/yuthon_hr_attendance/models/hr_attendance_detail_wechat.py @@ -444,13 +444,43 @@ class HrAttendanceDetail(models.Model): # 最早 时间 min_time = min(checkin_time_list) # 查询最早时间上班时间 查询最晚下班时间 - attendance_obj.sudo().write({ - "sch_check_in_time": will_datetime_start, - "check_in": min_time, - "is_late_card": min_time > will_datetime_start, - "is_no_card": False, - "is_abnormal": False, - }) + # 判断时间 在10分钟内说明是 异常 + if will_datetime_start + timedelta(minutes=10) > min_time > will_datetime_start: + attendance_obj.sudo().write({ + "sch_check_in_time": will_datetime_start, + "check_in": min_time, + "is_late_card": False, + "is_no_card": False, + "is_abnormal": True, + "absenteeism_card": False, + }) + elif will_datetime_start + timedelta(hours=1) > min_time > will_datetime_start: + attendance_obj.sudo().write({ + "sch_check_in_time": will_datetime_start, + "check_in": min_time, + "is_late_card": True, + "is_no_card": False, + "is_abnormal": False, + "absenteeism_card": False, + }) + elif min_time > will_datetime_start + timedelta(hours=1) and min_time > will_datetime_start: + attendance_obj.sudo().write({ + "sch_check_in_time": will_datetime_start, + "check_in": min_time, + "is_late_card": False, + "is_no_card": False, + "is_abnormal": False, + "absenteeism_card": True, + }) + else: + attendance_obj.sudo().write({ + "sch_check_in_time": will_datetime_start, + "check_in": min_time, + "is_late_card": min_time > will_datetime_start, + "is_no_card": False, + "is_abnormal": False, + "absenteeism_card": False, + }) # 下班 attendance_detail_obj_out = self.env['hr.attendance.detail'].sudo().search( [("exception_type", "!=", "未打卡"), @@ -462,7 +492,7 @@ class HrAttendanceDetail(models.Model): attendance_detail_obj_out.hr_attendance_id = attendance_obj.id if len(attendance_detail_obj_out) <= 0: - attendance_obj.sudo().write({"is_no_card": True, "is_abnormal": True}) + attendance_obj.sudo().write({"is_no_card": True, "is_abnormal": True, "absenteeism_card": True}) # 打了一次卡记录说明缺卡 else: # 多次打卡时间的集合 @@ -471,24 +501,83 @@ class HrAttendanceDetail(models.Model): max_time = max(checkin_time_list) # 如果上班没有打卡 if not attendance_obj.check_in: - attendance_obj.sudo().write({ - "sch_check_in_time": will_datetime_start, - "check_in": max_time, - "is_late_card": max_time > will_datetime_start, - "is_no_card": True, - "is_abnormal": True, - }) + if will_datetime_start + timedelta(minutes=10) > max_time > will_datetime_start: + attendance_obj.sudo().write({ + "sch_check_in_time": will_datetime_start, + "check_in": max_time, + "is_late_card": False, + "is_no_card": True, + "is_abnormal": True, + "absenteeism_card": True, + }) + elif will_datetime_start + timedelta(hours=1) > max_time > will_datetime_start: + attendance_obj.sudo().write({ + "sch_check_in_time": will_datetime_start, + "check_in": max_time, + "is_late_card": True, + "is_no_card": True, + "is_abnormal": True, + "absenteeism_card": True, + }) + elif max_time > will_datetime_start + timedelta(hours=1) and max_time > will_datetime_start: + attendance_obj.sudo().write({ + "sch_check_in_time": will_datetime_start, + "check_in": max_time, + "is_late_card": False, + "is_no_card": True, + "is_abnormal": True, + "absenteeism_card": True, + }) + else: + attendance_obj.sudo().write({ + "sch_check_in_time": will_datetime_start, + "check_in": max_time, + "is_late_card": max_time > will_datetime_start, + "is_no_card": True, + "is_abnormal": True, + "absenteeism_card": True, + }) + # 如果上班时间早于下班时间说明下班的卡没打 elif attendance_obj.check_in >= max_time: - attendance_obj.sudo().write({"is_no_card": True, "is_abnormal": True}) + attendance_obj.sudo().write({"is_no_card": True, "is_abnormal": True, "absenteeism_card": True}) else: - attendance_obj.sudo().write({ - "sch_check_out_time": will_datetime_end, - "check_out": max_time, - "is_early_card": max_time < will_datetime_end, - "is_no_card": False, - "is_abnormal": False, - }) + if will_datetime_end - timedelta(minutes=10) < max_time < will_datetime_end: + attendance_obj.sudo().write({ + "sch_check_out_time": will_datetime_end, + "check_out": max_time, + "is_early_card": False, + "is_no_card": False, + "is_abnormal": True, + # "absenteeism_card": False, + }) + elif will_datetime_end - timedelta(hours=1) < max_time < will_datetime_end: + attendance_obj.sudo().write({ + "sch_check_out_time": will_datetime_end, + "check_out": max_time, + "is_early_card": True, + "is_no_card": False, + # "is_abnormal": False, + # "absenteeism_card": False, + }) + elif max_time < will_datetime_end - timedelta(hours=1): + attendance_obj.sudo().write({ + "sch_check_out_time": will_datetime_end, + "check_out": max_time, + "is_early_card": False, + "is_no_card": False, + # "is_abnormal": False, + "absenteeism_card": True, + }) + else: + attendance_obj.sudo().write({ + "sch_check_out_time": will_datetime_end, + "check_out": max_time, + "is_early_card": max_time < will_datetime_end, + "is_no_card": False, + # "is_abnormal": False, + # "absenteeism_card": False, + }) return True def _do_planning_role(self, user, current_date, attendance_obj, planning_id): @@ -556,21 +645,60 @@ class HrAttendanceDetail(models.Model): # 关联 打卡详情 attendance_detail_obj_in.hr_attendance_id = attendance_obj.id + will_datetime_start = planning_id.start_datetime + will_datetime_end = planning_id.end_datetime + if len(attendance_detail_obj_in) <= 0: - attendance_obj.sudo().write({"is_no_card": True, "is_abnormal": True}) + attendance_obj.sudo().write({"is_no_card": True, "is_abnormal": True, "absenteeism_card": True}) # 打了一次卡记录说明缺卡 else: # 多次打卡时间的集合 checkin_time_list = [obj.checkin_time for obj in attendance_detail_obj_in] # 最早 时间 min_time = min(checkin_time_list) - attendance_obj.sudo().write({ - "sch_check_in_time": planning_id.start_datetime, - "check_in": min_time, - "is_late_card": min_time > planning_id.start_datetime, - "is_no_card": False, - "is_abnormal": False, - }) + # attendance_obj.sudo().write({ + # "sch_check_in_time": planning_id.start_datetime, + # "check_in": min_time, + # "is_late_card": min_time > planning_id.start_datetime, + # "is_no_card": False, + # "is_abnormal": False, + # }) + if will_datetime_start + timedelta(minutes=10) > min_time > will_datetime_start: + attendance_obj.sudo().write({ + "sch_check_in_time": will_datetime_start, + "check_in": min_time, + "is_late_card": False, + "is_no_card": False, + "is_abnormal": True, + "absenteeism_card": False, + }) + elif will_datetime_start + timedelta(hours=1) > min_time > will_datetime_start: + attendance_obj.sudo().write({ + "sch_check_in_time": will_datetime_start, + "check_in": min_time, + "is_late_card": True, + "is_no_card": False, + "is_abnormal": False, + "absenteeism_card": False, + }) + elif min_time > will_datetime_start + timedelta(hours=1) and min_time > will_datetime_start: + attendance_obj.sudo().write({ + "sch_check_in_time": will_datetime_start, + "check_in": min_time, + "is_late_card": False, + "is_no_card": False, + "is_abnormal": False, + "absenteeism_card": True, + }) + else: + attendance_obj.sudo().write({ + "sch_check_in_time": will_datetime_start, + "check_in": min_time, + "is_late_card": min_time > will_datetime_start, + "is_no_card": False, + "is_abnormal": False, + "absenteeism_card": False, + }) # 下班 attendance_detail_obj_out = self.env['hr.attendance.detail'].sudo().search( @@ -592,25 +720,97 @@ class HrAttendanceDetail(models.Model): max_time = max(checkin_time_list) # 如果上班没有打卡 if not attendance_obj.check_in: - attendance_obj.sudo().write({ - "sch_check_in_time": planning_id.start_datetime, - "check_in": max_time, - "is_late_card": max_time > planning_id.start_datetime, - "is_no_card": True, - "is_abnormal": True, - }) + # attendance_obj.sudo().write({ + # "sch_check_in_time": planning_id.start_datetime, + # "check_in": max_time, + # "is_late_card": max_time > planning_id.start_datetime, + # "is_no_card": True, + # "is_abnormal": True, + # }) + + if will_datetime_start + timedelta(minutes=10) > max_time > will_datetime_start: + attendance_obj.sudo().write({ + "sch_check_in_time": will_datetime_start, + "check_in": max_time, + "is_late_card": False, + "is_no_card": True, + "is_abnormal": True, + "absenteeism_card": True, + }) + elif will_datetime_start + timedelta(hours=1) > max_time > will_datetime_start: + attendance_obj.sudo().write({ + "sch_check_in_time": will_datetime_start, + "check_in": max_time, + "is_late_card": True, + "is_no_card": True, + "is_abnormal": True, + "absenteeism_card": True, + }) + elif max_time > will_datetime_start + timedelta(hours=1) and max_time > will_datetime_start: + attendance_obj.sudo().write({ + "sch_check_in_time": will_datetime_start, + "check_in": max_time, + "is_late_card": False, + "is_no_card": True, + "is_abnormal": True, + "absenteeism_card": True, + }) + else: + attendance_obj.sudo().write({ + "sch_check_in_time": will_datetime_start, + "check_in": max_time, + "is_late_card": max_time > will_datetime_start, + "is_no_card": True, + "is_abnormal": True, + "absenteeism_card": True, + }) # 如果上班时间早于下班时间说明下班的卡没打 elif attendance_obj.check_in >= max_time: attendance_obj.sudo().write({"is_no_card": True, "is_abnormal": True}) else: - attendance_obj.sudo().write({ - "sch_check_out_time": planning_id.end_datetime, - "check_out": max_time, - "is_early_card": max_time < planning_id.end_datetime, - "is_no_card": False, - "is_abnormal": False, - }) - + # attendance_obj.sudo().write({ + # "sch_check_out_time": planning_id.end_datetime, + # "check_out": max_time, + # "is_early_card": max_time < planning_id.end_datetime, + # "is_no_card": False, + # "is_abnormal": False, + # }) + if will_datetime_end - timedelta(minutes=10) < max_time < will_datetime_end: + attendance_obj.sudo().write({ + "sch_check_out_time": will_datetime_end, + "check_out": max_time, + "is_early_card": False, + "is_no_card": False, + "is_abnormal": True, + # "absenteeism_card": False, + }) + elif will_datetime_end - timedelta(hours=1) < max_time < will_datetime_end: + attendance_obj.sudo().write({ + "sch_check_out_time": will_datetime_end, + "check_out": max_time, + "is_early_card": True, + "is_no_card": False, + # "is_abnormal": False, + # "absenteeism_card": False, + }) + elif max_time < will_datetime_end - timedelta(hours=1): + attendance_obj.sudo().write({ + "sch_check_out_time": will_datetime_end, + "check_out": max_time, + "is_early_card": False, + "is_no_card": False, + # "is_abnormal": False, + "absenteeism_card": True, + }) + else: + attendance_obj.sudo().write({ + "sch_check_out_time": will_datetime_end, + "check_out": max_time, + "is_early_card": max_time < will_datetime_end, + "is_no_card": False, + # "is_abnormal": False, + # "absenteeism_card": False, + }) return True @staticmethod