diff --git a/yuthon_hr_attendance/models/overtime_approval.py b/yuthon_hr_attendance/models/overtime_approval.py index 7464b5d73..c6f4a5c30 100644 --- a/yuthon_hr_attendance/models/overtime_approval.py +++ b/yuthon_hr_attendance/models/overtime_approval.py @@ -42,7 +42,7 @@ class OvertimeApprovals(models.Model): rest_start_time = fields.Datetime(string="休息开始时间") rest_end_time = fields.Datetime(string="休息结束时间") end_week = fields.Char(string="星期", compute='_compute_weekday') - type_overtime = fields.Selection([('work', '工作日加班'), ('weekend', '周末加班'), ('holiday', '节假日加班')], + type_overtime = fields.Selection([('work', '工作日加班'), ('weekend', '公休日加班'), ('holiday', '法定日加班')], string="加班类型", compute="_compute_overtime_type", store=True) urgency_level = fields.Selection([('normal', '普件'), ('urgent', '急件'), ('emergency', '特急件')], string='紧急度', default='normal') @@ -422,31 +422,47 @@ class OvertimeApprovals(models.Model): @api.depends('start_time', 'end_time') def _compute_overtime_type(self): for record in self: + current_date = datetime.today() if record.start_time and record.end_time: if record.start_time > record.end_time: raise UserError("开始时间不能晚于结束时间") - start_date = fields.Datetime.from_string(record.start_time) - end_date = fields.Datetime.from_string(record.end_time) - current_year = (fields.Date.today() + timedelta(hours=8)).year - query_start = datetime(current_year, 1, 1, 0, 0, 0) - timedelta(hours=8) - query_end = datetime(current_year, 12, 31, 23, 59, 59) - timedelta(hours=8) - public_holidays = self.env['resource.calendar.leaves'].search([("calendar_id.name", "=", "行政考勤工作日"), - ("date_from", ">=", query_start), - ("date_from", "<=", query_end)]) - for holiday in public_holidays: - holiday_start = fields.Datetime.from_string(holiday.date_from) - holiday_end = fields.Datetime.from_string(holiday.date_to) - if start_date <= holiday_end and end_date >= holiday_start: - record.type_overtime = 'holiday' - break + start_date = record.start_time.date() + current_year = current_date.year + original_year_start = datetime(current_year, 1, 1, 0, 0, 0) + original_year_end = datetime(current_year, 12, 31, 23, 59, 59) + query_start = original_year_start - timedelta(hours=8) + query_end = original_year_end - timedelta(hours=8) + calendar_leaves = self.env['resource.calendar.leaves'].sudo().search([ + ("calendar_id.name", "=", "行政考勤工作日"), + ("date_from", ">=", query_start), + ("date_from", "<=", query_end) + ]) + holidays_set = set() + shift_days_set = set() + statutory_set = set() + for leave in calendar_leaves: + if leave.holidays: + statutory_set.update(leave.holidays.split(',')) + if leave.alternate_rest_day: + holidays_set.update(leave.alternate_rest_day.split(',')) + if leave.shift_replacement_day: + shift_days_set.update(leave.shift_replacement_day.split(',')) + date_str = start_date.strftime('%m月%d日') + date_str = self.remove_leading_zero(date_str) + is_weekend = start_date.weekday() in [5, 6] + if date_str in statutory_set: + record.type_overtime = 'holiday' + elif date_str in holidays_set or is_weekend: + record.type_overtime = 'weekend' else: - if start_date.weekday() < 5 and end_date.weekday() < 5: # Not Saturday or Sunday - record.type_overtime = 'work' - elif start_date.weekday() >= 5 or end_date.weekday() >= 5: # Saturday or Sunday - record.type_overtime = 'weekend' - else: - record.type_overtime = False + record.type_overtime = 'work' + def remove_leading_zero(self, date_str): + month, day = date_str.split('月') + month = month.lstrip('0') + day = day.rstrip('日') + day = day.lstrip('0') + return f'{month}月{day}日' class OvertimeUserLine(models.Model): _name = 'overtime.user.line'