添加功能

This commit is contained in:
李鹏宇
2026-07-16 10:44:45 +08:00
parent 45df21922a
commit 6685056cee
5 changed files with 91 additions and 24 deletions
+33 -2
View File
@@ -1070,15 +1070,16 @@ class HolidaysRequestBatch(models.Model):
) )
# ==================================================== # ====================================================
total_annual_leave_days = 0.0 # 年假总天数 total_annual_leave_days = 0.0 # 年假总天数
total_compensatory_leave_days = 0.0 # 补休总天数 total_compensatory_leave_days = 0.0 # 补休总天数
total_parental_leave_days = 0.0 # 育儿假总天数
for leave_line in record.leave_ids: for leave_line in record.leave_ids:
if leave_line.holiday_status_id.name == '年假': if leave_line.holiday_status_id.name == '年假':
total_annual_leave_days += float(leave_line.number_of_days_display or 0) total_annual_leave_days += float(leave_line.number_of_days_display or 0)
elif leave_line.holiday_status_id.name == '补休': elif leave_line.holiday_status_id.name == '补休':
total_compensatory_leave_days += float(leave_line.number_of_days_display or 0) total_compensatory_leave_days += float(leave_line.number_of_days_display or 0)
elif leave_line.holiday_status_id.name == '育儿假':
total_parental_leave_days += float(leave_line.number_of_days_display or 0)
for hour_leave_line in record.hour_leave_ids: for hour_leave_line in record.hour_leave_ids:
leave_hours = float(hour_leave_line.leave_hours or 0) leave_hours = float(hour_leave_line.leave_hours or 0)
@@ -1087,6 +1088,8 @@ class HolidaysRequestBatch(models.Model):
total_annual_leave_days += leave_days total_annual_leave_days += leave_days
elif hour_leave_line.holiday_status_id.name == '补休': elif hour_leave_line.holiday_status_id.name == '补休':
total_compensatory_leave_days += leave_days total_compensatory_leave_days += leave_days
elif hour_leave_line.holiday_status_id.name == '育儿假':
total_parental_leave_days += leave_days
record.holiday_allowance2 = record.holiday_allowance record.holiday_allowance2 = record.holiday_allowance
if total_annual_leave_days > self.remaining_annual_leave: if total_annual_leave_days > self.remaining_annual_leave:
@@ -1095,6 +1098,34 @@ class HolidaysRequestBatch(models.Model):
if total_compensatory_leave_days > self.remaining_compensatory_leave / 8: if total_compensatory_leave_days > self.remaining_compensatory_leave / 8:
raise UserError('补休天数额度不足,无法请假') raise UserError('补休天数额度不足,无法请假')
# 育儿假额度校验:直接从考勤确认单取剩余育儿假
if total_parental_leave_days > 0:
employee = record.users_id.employee_ids[0] if record.users_id and record.users_id.employee_ids else None
if not employee:
raise UserError('未找到关联的员工档案,无法校验育儿假额度,请检查员工信息')
today = fields.Date.today()
vacation_date = today.replace(day=1)
reports_id = self.env['yuthon.vacation.reports'].search([
('employee_id', '=', employee.id),
('vacation_date', '=', vacation_date)
], limit=1)
if not reports_id:
raise UserError(
'该员工暂无育儿假额度,请在员工档案的紧急联系人中配置子女信息(含身份证号)后重新计算')
remaining_parental = round(reports_id.remaining_parental_leave or 0.0, 1)
if total_parental_leave_days > remaining_parental:
# 判断是没有分配还是用完了
valid_parenting_lines = reports_id.parenting_line_ids.filtered(
lambda l: l.update_date <= today
and (l.end_date >= today if l.end_date else True)
)
if not valid_parenting_lines:
raise UserError(
'该员工暂无育儿假额度,请在员工档案的紧急联系人中配置子女信息(含身份证号)后重新计算')
else:
raise UserError(
f'育儿假额度不足,无法请假')
@api.onchange('leave_ids', 'hour_leave_ids', 'employee_id') @api.onchange('leave_ids', 'hour_leave_ids', 'employee_id')
def _onchange_leave_dates(self): def _onchange_leave_dates(self):
+8 -1
View File
@@ -308,7 +308,14 @@ class GoApprovals(models.Model):
], limit=1) ], limit=1)
# 2. 拆分跨月日期区间 # 2. 拆分跨月日期区间
date_ranges = self._split_date_by_month(self.start_date, self.end_date) if self.is_day == True:
start_date = self.start_date
end_date = self.end_date
else:
start_date = self.date_start
end_date = self.date_end
date_ranges = self._split_date_by_month(start_date, end_date)
# 3. 遍历每个月的日期区间处理 # 3. 遍历每个月的日期区间处理
for date_range in date_ranges: for date_range in date_ranges:
@@ -334,6 +334,8 @@ class YuthonVacationReports(models.Model):
def update_line(self): def update_line(self):
if self.vacation_date == fields.Date.from_string('2026-01-01'): if self.vacation_date == fields.Date.from_string('2026-01-01'):
return return
# 更新育儿假
self.employee_id.update_parental_leave()
self.manage_reject() self.manage_reject()
# ========== 第一步:处理年假逻辑 ========== # ========== 第一步:处理年假逻辑 ==========
for rec in self: for rec in self:
@@ -18,6 +18,28 @@ class YuthonEmergencyContactLine(models.Model):
home_address = fields.Char(string="家庭住址") home_address = fields.Char(string="家庭住址")
documents_ids = fields.Many2many('ir.attachment', string="附件") documents_ids = fields.Many2many('ir.attachment', string="附件")
@api.model
def create(self, vals):
record = super().create(vals)
if record.employee_id:
record.employee_id.update_parental_leave()
return record
def write(self, vals):
res = super().write(vals)
for record in self:
if record.employee_id:
record.employee_id.update_parental_leave()
return res
def unlink(self):
employees = self.mapped('employee_id')
res = super().unlink()
for employee in employees:
if employee:
employee.update_parental_leave()
return res
class YuthonWorkExperienceLine(models.Model): class YuthonWorkExperienceLine(models.Model):
_name = 'yuthon.work.experience.line' _name = 'yuthon.work.experience.line'
+26 -21
View File
@@ -1156,11 +1156,19 @@ class YuthonHrEmployee(models.Model):
def update_parental_leave(self): def update_parental_leave(self):
today = datetime.now().date() today = datetime.now().date()
active_contracts = self.env['hr.contract'].search([ # 如果 self 有具体员工(个人调用),只查该员工的合同;否则(定时任务)查全部
('state', '=', 'open'), if self:
('contract_type_id.name', 'ilike', '正式合同'), active_contracts = self.env['hr.contract'].search([
('employee_id', '!=', False) ('state', '=', 'open'),
]) ('contract_type_id.name', 'ilike', '正式合同'),
('employee_id', 'in', self.ids)
])
else:
active_contracts = self.env['hr.contract'].search([
('state', '=', 'open'),
('contract_type_id.name', 'ilike', '正式合同'),
('employee_id', '!=', False)
])
allocate_config = self.env['yuthon.parenting.allocate'].search([], limit=1) allocate_config = self.env['yuthon.parenting.allocate'].search([], limit=1)
valid_limit = allocate_config.valid_limit # 截至年龄(如3) valid_limit = allocate_config.valid_limit # 截至年龄(如3)
cycle_years = allocate_config.cycle_years # 周期年数(如1) cycle_years = allocate_config.cycle_years # 周期年数(如1)
@@ -1219,10 +1227,8 @@ class YuthonHrEmployee(models.Model):
continue continue
holiday_status_id = self.env['hr.leave.type'].search([('name', '=', '育儿假')], limit=1) holiday_status_id = self.env['hr.leave.type'].search([('name', '=', '育儿假')], limit=1)
# 更新报表
parenting_line_ids = []
# 6. 检查是否已存在相同分配记录,避免重复 # 检查是否已存在相同分配记录,避免重复
existing_allocation = self.env['hr.leave.allocation'].search([ existing_allocation = self.env['hr.leave.allocation'].search([
('employee_id', '=', employee.id), ('employee_id', '=', employee.id),
('name', '=', '育儿假分配'), ('name', '=', '育儿假分配'),
@@ -1230,22 +1236,30 @@ class YuthonHrEmployee(models.Model):
('date_from', '=', date_from), ('date_from', '=', date_from),
('date_to', '=', date_to), ('date_to', '=', date_to),
], limit=1) ], limit=1)
if existing_allocation: if not existing_allocation:
continue self.env['hr.leave.allocation'].create({
'name': '育儿假分配',
'allocation_type': 'regular',
'employee_id': employee.id,
'date_from': date_from,
'date_to': date_to,
'holiday_status_id': holiday_status_id.id,
'number_of_days': total_days,
})
reports_id = self.env['yuthon.vacation.reports'].search([ reports_id = self.env['yuthon.vacation.reports'].search([
('employee_id', '=', employee.id), ('employee_id', '=', employee.id),
('vacation_date', '=', fields.Date.today().replace(day=1)) ('vacation_date', '=', fields.Date.today().replace(day=1))
], limit=1) # ], limit=1) #
if reports_id: if reports_id:
reports_id.parenting_line_ids.search([ existing_report_line = reports_id.parenting_line_ids.search([
('vacation_id', '=', reports_id.id), ('vacation_id', '=', reports_id.id),
('employee_id', '=', employee.id), ('employee_id', '=', employee.id),
('update_date', '=', date_from), ('update_date', '=', date_from),
('end_date', '=', date_to), ('end_date', '=', date_to),
('text','=', '育儿假分配') ('text','=', '育儿假分配')
], limit=1) ], limit=1)
if not parenting_line_ids: if not existing_report_line:
reports_id.parenting_line_ids.sudo().create({ reports_id.parenting_line_ids.sudo().create({
'vacation_id': reports_id.id, 'vacation_id': reports_id.id,
'employee_id': employee.id, 'employee_id': employee.id,
@@ -1255,15 +1269,6 @@ class YuthonHrEmployee(models.Model):
'text': '育儿假分配' 'text': '育儿假分配'
}) })
self.env['hr.leave.allocation'].create({
'name': '育儿假分配',
'allocation_type': 'regular',
'employee_id': employee.id,
'date_from': date_from,
'date_to': date_to,
'holiday_status_id':holiday_status_id.id,
'number_of_days': total_days,
})
def regularization_task(self): def regularization_task(self):
today = fields.Date.today() today = fields.Date.today()