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