添加功能
This commit is contained in:
@@ -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):
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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'
|
||||
|
||||
@@ -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()
|
||||
|
||||
Reference in New Issue
Block a user