添加功能

This commit is contained in:
李鹏宇
2026-01-30 16:45:12 +08:00
parent 38bb92ad5e
commit fe5bd1cee0
@@ -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'