From 33facc52e64c5409eddb948d32fc7a84ebef6239 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=B9=8F=E5=AE=87?= <9664676+pengyuthon@user.noreply.gitee.com> Date: Thu, 5 Mar 2026 11:26:23 +0800 Subject: [PATCH 1/2] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../models/yuthon_vacation_reports.py | 89 ------------------- .../wizard/yuthon_vacation_import_wizard.py | 30 +++++-- 2 files changed, 23 insertions(+), 96 deletions(-) diff --git a/yuthon_hr_attendance/models/yuthon_vacation_reports.py b/yuthon_hr_attendance/models/yuthon_vacation_reports.py index 9f9f5dfe3..e3ae3fd36 100644 --- a/yuthon_hr_attendance/models/yuthon_vacation_reports.py +++ b/yuthon_hr_attendance/models/yuthon_vacation_reports.py @@ -523,95 +523,6 @@ class YuthonVacationReports(models.Model): # 扣减本年剩余 rec.this_year1 = max(0.0, rec.this_year1 - remaining_over_decrease) - def update_overtime(self): - today = date.today() - over_line_domain = [ - ('vacation_id', '!=', False), - ('update_type', '=', 'add'), - ('is_void', '=', False) - ] - over_lines = self.env['vacation.over.line'].search(over_line_domain) - - void_lines = self.env['vacation.over.line'] - for line in over_lines: - # 确定判断超期的基准日期:有adjust_date则用adjust_date,否则用valid_date - check_date = line.adjust_date if line.adjust_date else line.valid_date - if check_date and today > check_date: - void_lines |= line - - # 批量标记作废 - if void_lines: - void_lines.write({'is_void': True}) - - for void_line in void_lines: - # 跳过vacation_id为空的情况 - if not void_line.vacation_id: - continue - - main_vacation = void_line.vacation_id - vacation_date = main_vacation.vacation_date - - # 查找vacation_date之后的加班记录中,text='上月额度继承'的行 - inherit_domain = [ - ('vacation_id', '=', main_vacation.id), - ('create_date', '>=', fields.Datetime.to_datetime(vacation_date)), - ('text', '=', '上月额度继承'), - ] - inherit_lines = self.env['vacation.over.line'].search(inherit_domain) - if not inherit_lines: - continue - - deduct_value = void_line.update_lines or 0.0 - for inherit_line in inherit_lines: - new_lines = inherit_line.update_lines - deduct_value - inherit_line.write({'update_lines': new_lines}) - - def update_leave(self): - today = date.today() - leave_line_domain = [ - ('vacation_id', '!=', False), - ('update_type', '=', 'add'), - ('is_void', '=', False) - ] - leave_lines = self.env['vacation.leave.line'].search(leave_line_domain) - - void_lines = self.env['vacation.leave.line'] - for line in leave_lines: - check_date = line.adjust_date if line.adjust_date else line.valid_date - if check_date and today > check_date: - void_lines |= line - - if void_lines: - void_lines.write({'is_void': True}) - - # 3. 扣减update_lines中「上月额度继承」的workday - for void_line in void_lines: - if not void_line.vacation_id: - continue - - main_vacation = void_line.vacation_id - vacation_date = main_vacation.vacation_date - if not vacation_date: - continue - - # 查找vacation_date之后的年假继承记录(关联update_lines) - inherit_domain = [ - ('vacation_id', '=', main_vacation.id), - ('create_date', '>=', fields.Datetime.to_datetime(vacation_date)), - ('text', '=', '上月额度继承'), - ('is_void', '=', False) - ] - inherit_lines = self.env['vacation.leave.line'].search(inherit_domain) - - if not inherit_lines: - continue - - # 扣减年假workday - deduct_value = void_line.workday or 0.0 - for inherit_line in inherit_lines: - new_workday = inherit_line.workday - deduct_value - inherit_line.write({'workday': new_workday}) - @api.depends('other_fee_ids', 'other_fee_ids.holiday_type', 'other_fee_ids.lines', 'other_fee_ids.is_void', 'other_fee_ids.update_type', 'parenting_line_ids', 'parenting_line_ids.update_date', 'parenting_line_ids.end_date', 'parenting_line_ids.lines') diff --git a/yuthon_hr_attendance/wizard/yuthon_vacation_import_wizard.py b/yuthon_hr_attendance/wizard/yuthon_vacation_import_wizard.py index 41f1438b5..2fe0d5053 100644 --- a/yuthon_hr_attendance/wizard/yuthon_vacation_import_wizard.py +++ b/yuthon_hr_attendance/wizard/yuthon_vacation_import_wizard.py @@ -55,8 +55,8 @@ class YuthonVacationImportWizard(models.TransientModel): else: leave.write({'update_lines': update_value}) target_leaves1 = vacation_id.leave_ids.filtered(lambda l: l.text == '上月额度继承') + update_value = float(row[2].value) * 8 for leave in target_leaves1: - update_value = float(row[2].value) * 8 if update_value == 0: leave.unlink() else: @@ -64,18 +64,34 @@ class YuthonVacationImportWizard(models.TransientModel): target_overtimes = vacation_id.overtime_ids.filtered(lambda o: o.text == '上月额度继承') + if employee_id.company_id.name == '集团本部': + workday_value = float(row[3].value) + public_holidays = float(row[4].value) + else: + workday_value = float(row[3].value) * 8 + public_holidays = 0 + if employee_id.company_id.name == '天河粮储': + valid_date = datetime(2027, 6, 30) + else: + valid_date = None + if not target_overtimes: + self.env['vacation.over.line'].create({ + 'text': '上月额度继承', + 'update_type': 'add', + 'update_date': date, + 'valid_date': valid_date, + 'workday': workday_value, + 'public_holidays': public_holidays, + 'vacation_id': vacation_id.id, + }) + for overtime in target_overtimes: - if employee_id.company_id.name == '集团本部': - workday_value = float(row[3].value) - public_holidays = float(row[4].value) - else: - workday_value = float(row[3].value) * 8 - public_holidays = 0 if workday_value == 0 and public_holidays == 0: overtime.unlink() else: overtime.write({'workday': workday_value, 'public_holidays': public_holidays}) + vacation_id.update_vacation1() vacation_id._compute_leave() vacation_id._compute_working_overtime() From 1536abe7425e0c0bc77392b4452edfe1b35b9c21 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=B9=8F=E5=AE=87?= <9664676+pengyuthon@user.noreply.gitee.com> Date: Thu, 5 Mar 2026 11:35:29 +0800 Subject: [PATCH 2/2] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../models/overtime_active_line.py | 1 - .../models/vacation_overtime_active.py | 16 ++++++++++++++++ .../views/vacation_overtime_active_views.xml | 7 +++++++ 3 files changed, 23 insertions(+), 1 deletion(-) diff --git a/yuthon_hr_attendance/models/overtime_active_line.py b/yuthon_hr_attendance/models/overtime_active_line.py index b5f50c4f9..65fa6843f 100644 --- a/yuthon_hr_attendance/models/overtime_active_line.py +++ b/yuthon_hr_attendance/models/overtime_active_line.py @@ -30,7 +30,6 @@ class OvertimeActiveLine(models.Model): validity = fields.Char(string="有效期") is_void = fields.Boolean(string="作废", default=False) - def all_unlink(self): active_ids = self.env["overtime.active.line"].browse( self._context.get('active_ids', self._context.get('active_id'))) diff --git a/yuthon_hr_attendance/models/vacation_overtime_active.py b/yuthon_hr_attendance/models/vacation_overtime_active.py index 33d207c67..826ff32da 100644 --- a/yuthon_hr_attendance/models/vacation_overtime_active.py +++ b/yuthon_hr_attendance/models/vacation_overtime_active.py @@ -31,6 +31,22 @@ class VacationOvertimeActive(models.Model): remaining_quantity = fields.Float(string="剩余数") select_revoke = fields.Selection([('to_do', '待撤销'), ('done', '已撤销')], string='状态') + + def update_vacation(self): + active_ids = self.env["vacation.overtime.active"].browse( + self._context.get('active_ids', self._context.get('active_id', [])) + ) + for record in active_ids: + overtime_lines = self.env['vacation.over.line'].search([ + ('employee_id', '=', record.employee_id.id), + ('overtime_methods', '=', 'fee') + ]) + overtime_lines.write({ + 'workday': record.carry_forward_quantity, + 'update_date': record.carry_forward_date + }) + + def all_unlink(self): active_ids = self.env["vacation.overtime.active"].browse( self._context.get('active_ids', self._context.get('active_id'))) diff --git a/yuthon_hr_attendance/views/vacation_overtime_active_views.xml b/yuthon_hr_attendance/views/vacation_overtime_active_views.xml index 308c591ba..09e55e760 100644 --- a/yuthon_hr_attendance/views/vacation_overtime_active_views.xml +++ b/yuthon_hr_attendance/views/vacation_overtime_active_views.xml @@ -41,4 +41,11 @@ tree,search + + 一次性 + + + code + action = model.update_vacation() + \ No newline at end of file