From 94fc865bcfbfb7cc908481698e8907be8f844adc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=B9=8F=E5=AE=87?= Date: Sun, 3 Aug 2025 11:07:13 +0800 Subject: [PATCH] 1 --- yuthon_holiday/models/inherit_hr_leave.py | 27 +++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/yuthon_holiday/models/inherit_hr_leave.py b/yuthon_holiday/models/inherit_hr_leave.py index 26f215014..b0d00afd8 100644 --- a/yuthon_holiday/models/inherit_hr_leave.py +++ b/yuthon_holiday/models/inherit_hr_leave.py @@ -6,12 +6,39 @@ from odoo import models, fields, api, _ from odoo.exceptions import UserError, ValidationError import re from odoo.tools.misc import format_date +from collections import namedtuple, defaultdict class HrLeave(models.Model): _inherit = 'hr.leave' number_of_days = fields.Float(string='天数', digits=(16, 3)) + def _check_validity(self): + sorted_leaves = defaultdict(lambda: self.env['hr.leave']) + for leave in self: + sorted_leaves[(leave.holiday_status_id, leave.date_from.date())] |= leave + for (leave_type, date_from), leaves in sorted_leaves.items(): + if leave_type.requires_allocation == 'no': + continue + employees = self.env['hr.employee'] + for leave in leaves: + employees |= leave._get_employees_from_holiday_type() + leave_data = leave_type.get_allocation_data(employees, date_from) + if leave_type.allows_negative: + max_excess = leave_type.max_allowed_negative + for employee in employees: + if leave_data[employee] and leave_data[employee][0][1]['virtual_remaining_leaves'] < -max_excess: + raise ValidationError(_("There is no valid allocation to cover that request.")) + continue + previous_leave_data = leave_type.with_context(ignored_leave_ids=leaves.ids).get_allocation_data(employees, date_from) + for employee in employees: + previous_emp_data = previous_leave_data[employee] and previous_leave_data[employee][0][1]['virtual_excess_data'] + emp_data = leave_data[employee] and leave_data[employee][0][1]['virtual_excess_data'] + if not previous_emp_data and not emp_data: + continue + if previous_emp_data != emp_data and len(emp_data) >= len(previous_emp_data): + raise ValidationError("您的假期额度不足,无法申请该假期") + def action_leave_wizard(self): return {