diff --git a/yuthon_wechat/models/hr_attendance_detail.py b/yuthon_wechat/models/hr_attendance_detail.py index 39d7768bc..32f4992a7 100644 --- a/yuthon_wechat/models/hr_attendance_detail.py +++ b/yuthon_wechat/models/hr_attendance_detail.py @@ -244,53 +244,132 @@ class HrAttendanceDetail(models.Model): if not attendance_obj: res_user_obj = self.env['res.users'].search([("oauth_uid", "=", userid)], limit=1) hr_employee_obj = self.env['hr.employee'].sudo().search([("user_id", "=", res_user_obj.id)], limit=1) - attendance_obj = self.env['hr.attendance'].sudo().create({ - 'employee_id': hr_employee_obj.id, - "userid": userid, - "current_data": current_data, - "attendance_type": "wx_work" - }) - if attendance_obj.is_approval: - # 已经审批修复无需再次进行更新数据 - return True - # 赋值企业微信打卡数据 - attendance_obj.attendance_type = "wx_work" + if hr_employee_obj.resource_id.calendar_id.attendance_ids: + attendance_obj = self.env['hr.attendance'].sudo().create({ + 'employee_id': hr_employee_obj.id, + "userid": userid, + "current_data": current_data, + "attendance_type": "wx_work" + }) + min_hour_from = attendance_obj.employee_id.resource_id.calendar_id.attendance_ids[0].hour_from + min_hour = int(min_hour_from) + min_minute = int(min_hour_from * 10 % min_hour_from) + max_hour_to = checkin_time.employee_id.resource_id.calendar_id.attendance_ids[-1].hour_to + max_hour = int(max_hour_to) + max_minute = int(max_hour_to * 10 % max_hour_to) + if attendance_obj.is_approval: + # 已经审批修复无需再次进行更新数据 + return True + # 赋值企业微信打卡数据 + attendance_obj.attendance_type = "wx_work" - checkin_type = data.get("checkin_type", "") - exception_type = data.get("exception_type", "") - if exception_type != "未打卡": - if checkin_time and checkin_type == "上班打卡" and exception_type != "未打卡" and not attendance_obj.check_in: - attendance_obj.sudo().write({ - "sch_check_in_time": sch_checkin_time, - "check_in": checkin_time - }) - elif checkin_time and checkin_type == "下班打卡" and exception_type != "未打卡" and not attendance_obj.check_out: - attendance_obj.sudo().write({ - "sch_check_out_time": sch_checkin_time, - "check_out": checkin_time - }) + checkin_type = data.get("checkin_type", "") + exception_type = data.get("exception_type", "") + if exception_type != "未打卡": + will_datetime_start = checkin_time.replace(hour=min_hour, minute=min_minute) + will_datetime_end = checkin_time.replace(hour=max_hour, minute=max_minute) + if checkin_time and checkin_type == "上班打卡" and exception_type != "未打卡" and not attendance_obj.check_in: + attendance_obj.sudo().write({ + "sch_check_in_time": sch_checkin_time, + "check_in": checkin_time, + "is_late_card": checkin_time > will_datetime_start + }) + elif checkin_time and checkin_type == "下班打卡" and exception_type != "未打卡" and not attendance_obj.check_out: + attendance_obj.sudo().write({ + "sch_check_out_time": sch_checkin_time, + "check_out": checkin_time, + "is_early_card": will_datetime_end > checkin_time + }) - elif attendance_obj.check_in and checkin_time and checkin_type == "上班打卡" and exception_type != "未打卡" and checkin_time < attendance_obj.check_in: - attendance_obj.sudo().write({ - "sch_check_in_time": sch_checkin_time, - "check_in": checkin_time - }) - elif attendance_obj.check_out and checkin_time and checkin_type == "下班打卡" and exception_type != "未打卡" and checkin_time > attendance_obj.check_out: - attendance_obj.sudo().write({ - "sch_check_out_time": sch_checkin_time, - "check_out": checkin_time - }) + elif attendance_obj.check_in and checkin_time and checkin_type == "上班打卡" and exception_type != "未打卡" and checkin_time < attendance_obj.check_in: + attendance_obj.sudo().write({ + "sch_check_in_time": sch_checkin_time, + "check_in": checkin_time, + "is_late_card": checkin_time > will_datetime_start + }) + elif attendance_obj.check_out and checkin_time and checkin_type == "下班打卡" and exception_type != "未打卡" and checkin_time > attendance_obj.check_out: + attendance_obj.sudo().write({ + "sch_check_out_time": sch_checkin_time, + "check_out": checkin_time, + "is_early_card": will_datetime_end > checkin_time + }) - elif checkin_time and exception_type != "未打卡" and not attendance_obj.check_in and not attendance_obj.check_out: - attendance_obj.sudo().write({ - "sch_check_in_time": sch_checkin_time, - "check_in": checkin_time - }) - elif checkin_time and exception_type != "未打卡" and attendance_obj.check_in and not attendance_obj.check_out: - attendance_obj.sudo().write({ - "sch_check_out_time": sch_checkin_time, - "check_out": checkin_time + elif checkin_time and exception_type != "未打卡" and not attendance_obj.check_in and not attendance_obj.check_out: + attendance_obj.sudo().write({ + "sch_check_in_time": sch_checkin_time, + "check_in": checkin_time, + "is_late_card": checkin_time > will_datetime_start + }) + elif checkin_time and exception_type != "未打卡" and attendance_obj.check_in and not attendance_obj.check_out: + attendance_obj.sudo().write({ + "sch_check_out_time": sch_checkin_time, + "check_out": checkin_time, + "is_early_card": will_datetime_end > checkin_time + }) + else: + attendance_obj.sudo().write({ + "is_no_card": True}) + if not hr_employee_obj.resource_id.calendar_id.attendance_ids: + current_datetime_start = datetime.datetime.combine(current_data, datetime.time.min) + current_datetime_end = datetime.datetime.combine(current_data, datetime.time.max) + planning_slot_id = self.env['planning.slot'].search([('resource_id', '=', hr_employee_obj.resource_id.id), + ('start_datetime', '>=', current_datetime_start), # 大于等于起始日期 + ('start_datetime', '<=', current_datetime_end)]) + attendance_obj = self.env['hr.attendance'].sudo().create({ + 'employee_id': hr_employee_obj.id, + "userid": userid, + "current_data": current_data, + "shift_id": planning_slot_id.id, + "attendance_type": "wx_work" }) + if attendance_obj.is_approval: + # 已经审批修复无需再次进行更新数据 + return True + # 赋值企业微信打卡数据 + attendance_obj.attendance_type = "wx_work" + checkin_type = data.get("checkin_type", "") + exception_type = data.get("exception_type", "") + if exception_type != "未打卡": + if checkin_time and checkin_type == "上班打卡" and exception_type != "未打卡" and not attendance_obj.check_in: + attendance_obj.sudo().write({ + "sch_check_in_time": sch_checkin_time, + "check_in": checkin_time, + "is_late_card": checkin_time > planning_slot_id.start_datetime + }) + elif checkin_time and checkin_type == "下班打卡" and exception_type != "未打卡" and not attendance_obj.check_out: + attendance_obj.sudo().write({ + "sch_check_out_time": sch_checkin_time, + "check_out": checkin_time, + "is_early_card": planning_slot_id.end_datetime > checkin_time + }) + elif attendance_obj.check_in and checkin_time and checkin_type == "上班打卡" and exception_type != "未打卡" and checkin_time < attendance_obj.check_in: + attendance_obj.sudo().write({ + "sch_check_in_time": sch_checkin_time, + "check_in": checkin_time, + "is_late_card": checkin_time > planning_slot_id.start_datetime + }) + elif attendance_obj.check_out and checkin_time and checkin_type == "下班打卡" and exception_type != "未打卡" and checkin_time > attendance_obj.check_out: + attendance_obj.sudo().write({ + "sch_check_out_time": sch_checkin_time, + "check_out": checkin_time, + "is_early_card":planning_slot_id.end_datetime > checkin_time + }) + elif checkin_time and exception_type != "未打卡" and not attendance_obj.check_in and not attendance_obj.check_out: + attendance_obj.sudo().write({ + "sch_check_in_time": sch_checkin_time, + "check_in": checkin_time, + "is_late_card": checkin_time > planning_slot_id.start_datetime + }) + elif checkin_time and exception_type != "未打卡" and attendance_obj.check_in and not attendance_obj.check_out: + attendance_obj.sudo().write({ + "sch_check_out_time": sch_checkin_time, + "check_out": checkin_time, + "is_early_card": planning_slot_id.end_datetime > checkin_time + }) + else: + attendance_obj.sudo().write({ + "is_no_card": True}) + # if sch_checkin_time_now and str(sch_checkin_time_now.strftime("%H")) == "13" and checkin_type == "上班打卡" and exception_type != "未打卡": # attendance_obj.sudo().write({ # "sch_check_noon_time": sch_checkin_time,