!1465 提交一版本 测试

Merge pull request !1465 from ljm/dev_ljm_20241129
This commit is contained in:
ljm
2025-01-25 03:27:16 +00:00
committed by Gitee
2 changed files with 247 additions and 46 deletions
@@ -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="上班打卡地点")
@@ -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