From 6093b565da159438a86873655e181b7ae7ee6200 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, 19 Mar 2026 20:43:47 +0800 Subject: [PATCH] =?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/extended_vacation_approval.py | 8 +- .../models/yuthon_vacation_reports.py | 158 +++++++++--------- 2 files changed, 86 insertions(+), 80 deletions(-) diff --git a/yuthon_holiday/models/extended_vacation_approval.py b/yuthon_holiday/models/extended_vacation_approval.py index d54c87bba..11225a864 100644 --- a/yuthon_holiday/models/extended_vacation_approval.py +++ b/yuthon_holiday/models/extended_vacation_approval.py @@ -69,16 +69,16 @@ class ExtendedVacationApproval(models.Model): ('vacation_date', '<=', end_date) ]) if report_records: + latest_record = report_records.sorted(key='vacation_date', reverse=True)[0] + write_vals = {} if has_annual_leave: write_vals['valid_date'] = self.date_postponed if has_overtime_leave: write_vals['valid_date1'] = self.date_postponed - if write_vals: - report_records.write(write_vals) - for record in report_records: - record.update_line() + latest_record.write(write_vals) + latest_record.update_line() class ExtendedVacationLine(models.Model): _name = 'extended.vacation.line' diff --git a/yuthon_hr_attendance/models/yuthon_vacation_reports.py b/yuthon_hr_attendance/models/yuthon_vacation_reports.py index 2a041e9d9..5012908fc 100644 --- a/yuthon_hr_attendance/models/yuthon_vacation_reports.py +++ b/yuthon_hr_attendance/models/yuthon_vacation_reports.py @@ -304,9 +304,8 @@ class YuthonVacationReports(models.Model): over_ids = self.env["yuthon.vacation.reports"].browse( self._context.get('active_ids', self._context.get('active_id'))) for rec in over_ids: - inherit_lines = rec.overtime_ids.filtered(lambda l: l.text == '上月额度继承') - if inherit_lines: - inherit_lines.is_initial_number = True + rec.previous_year = 0 + rec.previous_year1 = 0 def all_update_line(self): records = self.env["yuthon.vacation.reports"].browse( @@ -321,6 +320,39 @@ class YuthonVacationReports(models.Model): self.manage_reject() # ========== 第一步:处理年假逻辑 ========== for rec in self: + current_date = rec.vacation_date + current_year_first = fields.Date.to_date(f"{current_date.year}-01-01") + # 找当前员工当年1月1日的报表主记录 + target_main_record = rec.env["yuthon.vacation.reports"].search([ + ('employee_id', '=', rec.employee_id.id), + ('vacation_date', '=', current_year_first), + ], limit=1) + # 提取需减额度 + leave_deduct = 0.0 + overtime_deduct = 0.0 + if target_main_record: + # 年假需减值 + leave_lines = target_main_record.leave_ids.filtered( + lambda o: not o.workflow_record_id and o.text == '上月额度继承') + leave_deduct = leave_lines.update_lines / 8 if (leave_lines and leave_lines.update_lines) else 0.0 + # 补休需减值 + overtime_lines = target_main_record.overtime_ids.filtered( + lambda o: not o.workflow_record_id and o.text == '上月额度继承') + overtime_deduct = (overtime_lines.workday + overtime_lines.public_holidays) / 8 if (overtime_lines and overtime_lines.workday and overtime_lines.public_holidays) else 0.0 + + # 补休明细减值(仅过期时) + if rec.valid_date1 and rec.valid_date1 < current_date and overtime_deduct > 0: + self_overtime = rec.overtime_ids.filtered( + lambda o: not o.workflow_record_id and o.text == '上月额度继承') + if self_overtime: + self_overtime.workday = max(0.0, self_overtime.workday - overtime_deduct * 8) + + # 年假明细减值(仅过期时) + if rec.valid_date and rec.valid_date < current_date and leave_deduct > 0: + self_leave = rec.leave_ids.filtered(lambda o: not o.workflow_record_id and o.text == '上月额度继承') + if self_leave: + self_leave.update_lines = max(0.0, self_leave.update_lines - leave_deduct * 8) + valid_leave_lines = rec.leave_ids.filtered( lambda l: l.workflow_record_id and l.update_type == 'reduce' and l.is_void != True ) @@ -377,34 +409,6 @@ class YuthonVacationReports(models.Model): rec.year_workday += workday_overtime_add rec.year_holiday += holidays_overtime_add - current_month_first = rec.vacation_date.replace(day=1) - last_month_last = current_month_first - timedelta(days=1) - last_month_first = last_month_last.replace(day=1) - last_month_record = self.env['yuthon.vacation.reports'].search([ - ('employee_id', '=', rec.employee_id.id), - ('vacation_date', '=', last_month_first), - ], limit=1) - if last_month_record: - total_overtime = last_month_record.dynamic_previous_year1 + last_month_record.this_year1 - else: - total_overtime = 0.0 - - if total_overtime > 0: - working_overtime_lines = rec.overtime_ids.filtered( - lambda o: not o.workflow_record_id and o.text == '上月额度继承' - ) - working_overtime_lines.workday = total_overtime * 8 - if last_month_record: - total_leave = last_month_record.dynamic_previous_year + last_month_record.dynamic_remainder_year - else: - total_leave = 0.0 - - if total_leave > 0: - leave_lines = rec.leave_ids.filtered( - lambda o: not o.workflow_record_id and o.text == '上月额度继承' - ) - leave_lines.update_lines = total_leave * 8 - rec._compute_leave() rec._compute_working_overtime() @@ -1381,16 +1385,12 @@ class YuthonVacationReports(models.Model): } rec.write(inherit_vals) - current_date = fields.Date.today() + current_date = rec.vacation_date if last_month_record: - if last_month_record.valid_date and last_month_record.valid_date < current_date: - dynamic_previous_year_val = 0.0 - else: - dynamic_previous_year_val = last_month_record.dynamic_previous_year - if last_month_record.valid_date1 and last_month_record.valid_date1 < current_date: - dynamic_previous_year1_val = 0.0 - else: - dynamic_previous_year1_val = last_month_record.dynamic_previous_year1 + dynamic_previous_year_val = 0.0 if ( + rec.valid_date and rec.valid_date < current_date) else last_month_record.dynamic_previous_year + dynamic_previous_year1_val = 0.0 if ( + rec.valid_date1 and rec.valid_date1 < current_date) else last_month_record.dynamic_previous_year1 inherit_vals = { 'leave': last_month_record.leave, 'dynamic_previous_year': dynamic_previous_year_val, @@ -1400,19 +1400,22 @@ class YuthonVacationReports(models.Model): 'working_overtime': last_month_record.working_overtime, 'medical_fee': last_month_record.medical_fee, 'previous_year': last_month_record.previous_year, - 'valid_date': last_month_record.valid_date, 'remaining_parental_leave': last_month_record.remaining_parental_leave, 'year_distribution': last_month_record.year_distribution, 'used_this_year': last_month_record.used_this_year, 'last_holiday': last_month_record.last_holiday, 'last_workday': last_month_record.last_workday, - 'valid_date1': last_month_record.valid_date1, 'year_holiday': last_month_record.year_holiday, 'year_workday': last_month_record.year_workday, 'previous_year1': last_month_record.previous_year1, 'used_this_year1': last_month_record.used_this_year1, } + if not rec.valid_date: + inherit_vals['valid_date'] = last_month_record.valid_date + if not rec.valid_date1: + inherit_vals['valid_date1'] = last_month_record.valid_date1 rec.write(inherit_vals) + if rec.remain_missed_meals: self._update_meal_lines(rec, [rec], rec.remain_missed_meals) if rec.leave: @@ -1724,60 +1727,63 @@ class YuthonVacationReports(models.Model): for alloc in allocations: existing_line = self.env['vacation.leave.line'].search([ ('vacation_id', '=', report.id), - ('employee_id', '=', report.employee_id.id), '|', ('text', '=', '上月额度继承'), ('text', '=', '年假分配') ], limit=1) if existing_line: - continue - self.env['vacation.leave.line'].create({ - 'vacation_id': report.id, - 'valid_date': report.valid_date1 + relativedelta(years=1) if report.valid_date1 else None, - 'employee_id': report.employee_id.id, - 'update_type': 'add', - 'update_date': fields.Date.today(), - 'update_lines': number_of_hours_display, - 'is_void': False, - 'allocation_type': 'allocation', - 'text': f"上月额度继承" - }) + existing_line.write({ + 'update_lines': number_of_hours_display, + }) + else: + self.env['vacation.leave.line'].create({ + 'vacation_id': report.id, + 'valid_date': report.valid_date1 + relativedelta(years=1) if report.valid_date1 else None, + 'employee_id': report.employee_id.id, + 'update_type': 'add', + 'update_date': fields.Date.today(), + 'update_lines': number_of_hours_display, + 'is_void': False, + 'allocation_type': 'allocation', + 'text': f"上月额度继承" + }) def _update_over_lines(self, report, allocations, number_of_hours_display): """更新补休明细行""" for alloc in allocations: existing_line = self.env['vacation.over.line'].search([ ('vacation_id', '=', report.id), - ('employee_id', '=', report.employee_id.id), ('text', '=', '上月额度继承'), ], limit=1) if existing_line: - continue - if report.valid_date1 and report.dynamic_previous_year1 and not report.this_year1: - valid_date = report.valid_date1 - elif report.valid_date1 and report.dynamic_previous_year1 and report.this_year1: - valid_date = report.valid_date1 + relativedelta(years=1) + existing_line.write({ + 'workday': number_of_hours_display, + }) else: - valid_date = False - self.env['vacation.over.line'].create({ - 'vacation_id': report.id, - 'employee_id': report.employee_id.id, - 'valid_date': valid_date, - 'update_type': 'add', - 'update_date': fields.Date.today(), - 'workday': number_of_hours_display, - 'legal_day': 0, - 'public_holidays': 0, - 'meal_number': 0, - 'text': f"上月额度继承", - 'logging_data': '333', - }) + if report.valid_date1 and report.dynamic_previous_year1 and not report.this_year1: + valid_date = report.valid_date1 + elif report.valid_date1 and report.dynamic_previous_year1 and report.this_year1: + valid_date = report.valid_date1 + relativedelta(years=1) + else: + valid_date = False + self.env['vacation.over.line'].create({ + 'vacation_id': report.id, + 'employee_id': report.employee_id.id, + 'valid_date': valid_date, + 'update_type': 'add', + 'update_date': fields.Date.today(), + 'workday': number_of_hours_display, + 'legal_day': 0, + 'public_holidays': 0, + 'meal_number': 0, + 'text': f"上月额度继承", + 'logging_data': '333', + }) def _update_parental_leave_lines(self, report, allocations, number_of_hours_display, update_date, end_date): for alloc in allocations: existing_line = self.env['vacation.parenting.line'].search([ ('vacation_id', '=', report.id), - ('employee_id', '=', report.employee_id.id), ('text', '=', '上月额度继承'), ], limit=1) if existing_line: