diff --git a/yuthon_holiday/models/inherit_hr_leave.py b/yuthon_holiday/models/inherit_hr_leave.py index d4d285109..c2d2a8303 100644 --- a/yuthon_holiday/models/inherit_hr_leave.py +++ b/yuthon_holiday/models/inherit_hr_leave.py @@ -1070,15 +1070,16 @@ class HolidaysRequestBatch(models.Model): ) # ==================================================== - - total_annual_leave_days = 0.0 # 年假总天数 total_compensatory_leave_days = 0.0 # 补休总天数 + total_parental_leave_days = 0.0 # 育儿假总天数 for leave_line in record.leave_ids: if leave_line.holiday_status_id.name == '年假': total_annual_leave_days += float(leave_line.number_of_days_display or 0) elif leave_line.holiday_status_id.name == '补休': 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: leave_hours = float(hour_leave_line.leave_hours or 0) @@ -1087,6 +1088,8 @@ class HolidaysRequestBatch(models.Model): total_annual_leave_days += leave_days elif hour_leave_line.holiday_status_id.name == '补休': 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 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: 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') def _onchange_leave_dates(self): diff --git a/yuthon_hr_attendance/models/go_approval.py b/yuthon_hr_attendance/models/go_approval.py index cf8649f8a..e4c547984 100644 --- a/yuthon_hr_attendance/models/go_approval.py +++ b/yuthon_hr_attendance/models/go_approval.py @@ -308,7 +308,14 @@ class GoApprovals(models.Model): ], limit=1) # 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. 遍历每个月的日期区间处理 for date_range in date_ranges: diff --git a/yuthon_hr_attendance/models/yuthon_vacation_reports.py b/yuthon_hr_attendance/models/yuthon_vacation_reports.py index c6edac516..6e17fbadb 100644 --- a/yuthon_hr_attendance/models/yuthon_vacation_reports.py +++ b/yuthon_hr_attendance/models/yuthon_vacation_reports.py @@ -334,6 +334,8 @@ class YuthonVacationReports(models.Model): def update_line(self): if self.vacation_date == fields.Date.from_string('2026-01-01'): return + # 更新育儿假 + self.employee_id.update_parental_leave() self.manage_reject() # ========== 第一步:处理年假逻辑 ========== for rec in self: diff --git a/yuthon_hr_employee/models/hr_employee_page.py b/yuthon_hr_employee/models/hr_employee_page.py index 36913813c..53e3a00b0 100644 --- a/yuthon_hr_employee/models/hr_employee_page.py +++ b/yuthon_hr_employee/models/hr_employee_page.py @@ -18,6 +18,28 @@ class YuthonEmergencyContactLine(models.Model): home_address = fields.Char(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): _name = 'yuthon.work.experience.line' diff --git a/yuthon_hr_employee/models/yuthon_hr_employee.py b/yuthon_hr_employee/models/yuthon_hr_employee.py index 81ee464ab..3b72386ee 100644 --- a/yuthon_hr_employee/models/yuthon_hr_employee.py +++ b/yuthon_hr_employee/models/yuthon_hr_employee.py @@ -1156,11 +1156,19 @@ class YuthonHrEmployee(models.Model): def update_parental_leave(self): today = datetime.now().date() - active_contracts = self.env['hr.contract'].search([ - ('state', '=', 'open'), - ('contract_type_id.name', 'ilike', '正式合同'), - ('employee_id', '!=', False) - ]) + # 如果 self 有具体员工(个人调用),只查该员工的合同;否则(定时任务)查全部 + if self: + active_contracts = self.env['hr.contract'].search([ + ('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) valid_limit = allocate_config.valid_limit # 截至年龄(如3) cycle_years = allocate_config.cycle_years # 周期年数(如1) @@ -1219,10 +1227,8 @@ class YuthonHrEmployee(models.Model): continue holiday_status_id = self.env['hr.leave.type'].search([('name', '=', '育儿假')], limit=1) - # 更新报表 - parenting_line_ids = [] - # 6. 检查是否已存在相同分配记录,避免重复 + # 检查是否已存在相同分配记录,避免重复 existing_allocation = self.env['hr.leave.allocation'].search([ ('employee_id', '=', employee.id), ('name', '=', '育儿假分配'), @@ -1230,22 +1236,30 @@ class YuthonHrEmployee(models.Model): ('date_from', '=', date_from), ('date_to', '=', date_to), ], limit=1) - if existing_allocation: - continue + if not existing_allocation: + 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([ ('employee_id', '=', employee.id), ('vacation_date', '=', fields.Date.today().replace(day=1)) ], limit=1) # if reports_id: - reports_id.parenting_line_ids.search([ + existing_report_line = reports_id.parenting_line_ids.search([ ('vacation_id', '=', reports_id.id), ('employee_id', '=', employee.id), ('update_date', '=', date_from), ('end_date', '=', date_to), ('text','=', '育儿假分配') ], limit=1) - if not parenting_line_ids: + if not existing_report_line: reports_id.parenting_line_ids.sudo().create({ 'vacation_id': reports_id.id, 'employee_id': employee.id, @@ -1255,15 +1269,6 @@ class YuthonHrEmployee(models.Model): '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): today = fields.Date.today()