!8479 添加功能

Merge pull request !8479 from 李鹏宇/dev_zhou
This commit is contained in:
李鹏宇
2026-01-30 10:35:51 +00:00
committed by Gitee
2 changed files with 53 additions and 72 deletions
+48 -71
View File
@@ -518,17 +518,10 @@ class HolidaysRequestBatch(models.Model):
return date_ranges
def _create_overtime_leave_line(self, period_start, leave_data, hours, period, leave_type_name):
"""为补休类型创建加班明细行(vacation.over.line),类型为减少,值赋给workday(增加重复校验)"""
# 1. 计算报表月份的起始和结束日期,简化代码结构
report_month = date(period_start.year, period_start.month, 1)
month_end = date(period_start.year, period_start.month,
calendar.monthrange(period_start.year, period_start.month)[1])
# 2. 查询对应的假期报表记录
first_day = fields.Date.today().replace(day=1)
vacation_report = self.env['yuthon.vacation.reports'].search([
('employee_id', '=', self.users_id.employee_ids.id),
('vacation_date', '>=', fields.Date.to_string(report_month)),
('vacation_date', '<=', fields.Date.to_string(month_end))
('vacation_date', '=', first_day),
], limit=1)
existing_overtime_line = self.env['vacation.over.line'].search([
('employee_id', '=', self.users_id.employee_ids.id),
@@ -583,13 +576,10 @@ class HolidaysRequestBatch(models.Model):
def _create_annual_leave_line(self, period_start, leave_data, hours, period):
"""更新年假记录,使用小时作为单位(增加重复校验,避免重复创建)"""
report_month = date(period_start.year, period_start.month, 1)
month_end = date(period_start.year, period_start.month,
calendar.monthrange(period_start.year, period_start.month)[1])
first_day = fields.Date.today().replace(day=1)
vacation_report = self.env['yuthon.vacation.reports'].search([
('employee_id', '=', self.users_id.employee_ids.id),
('vacation_date', '>=', fields.Date.to_string(report_month)),
('vacation_date', '<=', fields.Date.to_string(month_end))
('vacation_date', '=', first_day),
], limit=1)
existing_annual_leave_line = self.env['vacation.leave.line'].search([
('employee_id', '=', self.users_id.employee_ids.id),
@@ -850,69 +840,56 @@ class HolidaysRequestBatch(models.Model):
@api.depends('users_id')
def _compute_holiday_allowance(self):
current_date = fields.Date.today()
vacation_date = current_date
current_year = current_date.year
year_start = fields.Date.from_string(f"{current_year}-01-01")
year_end = fields.Date.from_string(f"{current_year}-12-31")
for record in self:
result_parts = []
reports_id = self.env['yuthon.vacation.reports'].search([
('employee_id', '=', record.users_id.employee_ids.id),
('vacation_date', '=', vacation_date.replace(day=1))
], limit=1)
if not reports_id:
record.holiday_allowance = ""
record.holiday_allowance = "年假0.000天, 补休0.000天, 育儿假0.000天"
if not record.users_id or not record.users_id.employee_ids:
continue
holiday_configs = [
("年假", "previous_year", "year_distribution"),
("补休", "previous_year1", "this_year1"),
("育儿假", None, "remaining_parental_leave")
]
employee = record.users_id.employee_ids[0]
for name, prev_field, curr_field in holiday_configs:
parts = []
# ========== 核心修改:年假专属扣减逻辑 ==========
if name == "年假" and prev_field and curr_field:
used_this_year = getattr(reports_id, 'used_this_year', 0.0) # 本年已用
prev_value = getattr(reports_id, prev_field, 0.0) # 上年结余(previous_year)
curr_value = getattr(reports_id, curr_field, 0.0) # 本年额度(year_distribution)
valid_date = getattr(reports_id, 'valid_date', None) # previous_year的有效期
vacation_date = current_date.replace(day=1) # 当月1号
reports_id = self.env['yuthon.vacation.reports'].search([
('employee_id', '=', employee.id),
('vacation_date', '=', vacation_date)
], limit=1)
is_prev_valid = True
if valid_date:
is_prev_valid = date.today() <= valid_date
# 3. 基础字段取值(年假、补休)
leave_days = reports_id.leave or 0.0 if reports_id else 0.0
overtime_days = reports_id.working_overtime or 0.0 if reports_id else 0.0
remaining_parental_leave = 0.0
parental_leave_type = self.env['hr.leave.type'].search([
('name', 'ilike', '育儿假'),
], limit=1)
remain_used = used_this_year
final_prev = prev_value
final_curr = curr_value
if parental_leave_type:
allocation_records = self.env['hr.leave.allocation'].search([
('employee_id', '=', employee.id),
('holiday_status_id', '=', parental_leave_type.id),
('state', 'in', ['validate', 'done']),
('date_from', '<=', current_date),
'|',
('date_to', '=', False),
('date_to', '>=', current_date)
])
used_days = 0.0
used_parental_leave_list = self.env['hr.leave'].search([
('employee_id', '=', employee.id),
('holiday_status_id', '=', parental_leave_type.id),
('date_from', '>=', allocation_records.date_from),
('date_to', '<=', allocation_records.date_to)
])
for leave in used_parental_leave_list:
need_deduct = True
if need_deduct:
used_days += leave.number_of_days_display
remaining_parental_leave = max(0.0, allocation_records.number_of_days_display - used_days)
if is_prev_valid and final_prev > 0 and remain_used > 0:
# 扣减previous_year:取剩余已用和previous_year的较小值
deduct_prev = min(remain_used, final_prev)
final_prev -= deduct_prev
remain_used -= deduct_prev
# 4. 剩余已用扣减year_distribution
if remain_used > 0 and final_curr > 0:
deduct_curr = min(remain_used, final_curr)
final_curr -= deduct_curr
remain_used -= deduct_curr
# 5. 根据扣减后的值判断是否显示
if final_prev > 0:
parts.append(f"上年结余{final_prev:.3f}天")
if final_curr > 0:
parts.append(f"本年剩余{final_curr:.3f}天")
else:
if prev_field:
prev_value = getattr(reports_id, prev_field, 0.0)
if prev_value > 0:
parts.append(f"上年结余{prev_value:.3f}天")
curr_value = getattr(reports_id, curr_field, 0.0)
if curr_value > 0:
parts.append(f"本年剩余{curr_value:.3f}天")
if parts:
result_parts.append(f"{name}:{','.join(parts)}")
record.holiday_allowance = "\n".join(result_parts)
record.holiday_allowance = (
f"年假{leave_days:.3f}天, 补休{overtime_days:.3f}天, 育儿假{remaining_parental_leave:.3f}天"
)
def action_print_leave_batch(self):
"""按钮触发打印请假单"""
@@ -24,6 +24,8 @@ class YuthonVacationReports(models.Model):
open_start_time = fields.Date(related='employee_id.open_start_time',string="参加工作时间")
company_old = fields.Char(related='employee_id.company_old', string="工作年限")
previous_year = fields.Float(string="上年剩余", digits=(16, 3)) # 固定值
dynamic_previous_year = fields.Float(string="上年剩余", digits=(16, 3)) # 动态值
dynamic_remainder_year = fields.Float(string="本年剩余", digits=(16, 3)) # 动态值
valid_date = fields.Date(string="有效期至")
year_distribution = fields.Float(string="本年发放", digits=(16, 3))
used_this_year = fields.Float(string="本年已用", digits=(16, 3))
@@ -34,7 +36,8 @@ class YuthonVacationReports(models.Model):
year_holiday = fields.Float(string="本年公休日", digits=(16, 3))
year_workday = fields.Float(string="本年工作日", digits=(16, 3))
year_sum = fields.Float(string="本年调休合计", digits=(16, 3), compute="_compute_year_sum")
previous_year1 = fields.Float(string="上年剩余(补休)", digits=(16, 3))
previous_year1 = fields.Float(string="上年剩余(补休)", digits=(16, 3)) # 固定值
dynamic_previous_year1 = fields.Float(string="上年剩余(补休)", digits=(16, 3)) # 动态值
this_year1 = fields.Float(string="本年剩余(补休)", digits=(16, 3), compute="_compute_year_sum")
used_this_year1 = fields.Float(string="本年已休", digits=(16, 3))
remainder_year1 = fields.Float(string="剩余(补休)", digits=(16, 3), compute="_compute_year_sum")
@@ -106,6 +109,7 @@ class YuthonVacationReports(models.Model):
tracking=3,
default='not_sent')
def update_overtime(self):
today = date.today()
over_line_domain = [