This commit is contained in:
李鹏宇
2026-03-19 20:49:49 +08:00
2 changed files with 86 additions and 80 deletions
@@ -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'
@@ -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: