!9147 添加功能

Merge pull request !9147 from 李鹏宇/dev_zhou
This commit is contained in:
李鹏宇
2026-03-03 03:02:00 +00:00
committed by Gitee
3 changed files with 116 additions and 5 deletions
@@ -219,7 +219,7 @@ class YuthonVacationReports(models.Model):
rec.update_line()
def update_line(self):
if self.vacation_date == fields.Date.from_string('2026-01-01') or (self.vacation_date == fields.Date.from_string('2026-03-01') and self.employee_id.name == '天河物管'):
if self.vacation_date == fields.Date.from_string('2026-01-01') or (self.vacation_date == fields.Date.from_string('2026-03-01') and self.employee_id.company_id.name == '天河物管'):
return
self.manage_reject()
# ========== 第一步:处理年假逻辑 ==========
@@ -931,6 +931,107 @@ class YuthonVacationReports(models.Model):
"target": "new",
}
def update_holiday(self):
# 获取当前激活的记录
vacation_ids = self.env["yuthon.vacation.reports"].browse(
self._context.get('active_ids', self._context.get('active_id')))
current_year = datetime.now().year
for vacation in vacation_ids:
# 1. 处理上年年假剩余 (年假, 时间:上上年3月1日 到 上年2月28/29日)
if vacation.dynamic_previous_year > 0:
start_date = datetime(current_year - 2, 3, 1)
end_date = datetime(current_year - 1, 2, 28)
# 检查是否是闰年,
if (current_year - 1) % 4 == 0 and (current_year - 1) % 100 != 0 or (current_year - 1) % 400 == 0:
end_date = datetime(current_year - 1, 2, 29)
self._create_leave_allocation(
vacation=vacation,
leave_days=vacation.dynamic_previous_year,
allocation_type='accrual',
leave_name='年假',
start_date=start_date,
end_date=end_date
)
# 2. 处理本年年假剩余 (本年3月1日 到 明年2月28/29日)
if vacation.dynamic_remainder_year > 0:
start_date = datetime(current_year, 3, 1)
end_date = datetime(current_year + 1, 2, 28)
# 检查闰年
if (current_year + 1) % 4 == 0 and (current_year + 1) % 100 != 0 or (current_year + 1) % 400 == 0:
end_date = datetime(current_year + 1, 2, 29)
self._create_leave_allocation(
vacation=vacation,
leave_days=vacation.dynamic_remainder_year,
allocation_type='accrual',
leave_name='年假',
start_date=start_date,
end_date=end_date
)
# 3. 处理上年补休剩余 (休假, 时间:上年3月1日 到 上年2月28/29日)
if vacation.dynamic_previous_year1 > 0:
start_date = datetime(current_year - 2, 3, 1)
end_date = datetime(current_year - 1, 2, 28)
# 检查闰年
if (current_year - 1) % 4 == 0 and (current_year - 1) % 100 != 0 or (current_year - 1) % 400 == 0:
end_date = datetime(current_year - 1, 2, 29)
self._create_leave_allocation(
vacation=vacation,
leave_days=vacation.dynamic_previous_year1,
allocation_type='regular',
leave_name='休假',
start_date=start_date,
end_date=end_date
)
# 4. 处理本年补休剩余 ( 休假, 时间:本年3月1日 到 明年2月28/29日)
if vacation.this_year1 > 0:
start_date = datetime(current_year, 3, 1)
end_date = datetime(current_year + 1, 2, 28)
if (current_year + 1) % 4 == 0 and (current_year + 1) % 100 != 0 or (current_year + 1) % 400 == 0:
end_date = datetime(current_year + 1, 2, 29)
self._create_leave_allocation(
vacation=vacation,
leave_days=vacation.this_year1,
allocation_type='regular',
leave_name='休假',
start_date=start_date,
end_date=end_date
)
def _create_leave_allocation(self, vacation, leave_days, allocation_type, leave_name, start_date, end_date):
"""
封装创建hr.leave.allocation的逻辑
:param vacation: 当前yuthon.vacation.reports记录
:param leave_days: 假期天数
:param allocation_type: 分配类型 (accrual/regular)
:param leave_name: 假期名称 (年假/休假)
:param start_date: 开始日期
:param end_date: 结束日期
"""
accrual_plan_id = self.env['hr.leave.accrual.plan'].search(
[('name', 'ilike', '天河物管')], limit=1
)
leave_type = self.env['hr.leave.type'].search([('display_name', 'ilike', leave_name), ('company_id.name', '=', '天河物管')], limit=1)
vals = {
'name': leave_name,
'number_of_days': leave_days,
'holiday_status_id': leave_type.id,
'allocation_type': allocation_type,
'date_from': fields.Date.to_string(start_date),
'date_to': fields.Date.to_string(end_date),
'notes': leave_name,
}
if allocation_type == 'accrual' and accrual_plan_id:
vals['accrual_plan_id'] = accrual_plan_id.id
vals['employee_id'] = vacation.employee_id.id
self.env['hr.leave.allocation'].create(vals)
@api.depends('other_fee_ids', 'other_fee_ids.holiday_type', 'other_fee_ids.lines',
'other_fee_ids.is_void', 'other_fee_ids.update_type')
def _compute_other_leave(self):
@@ -808,6 +808,13 @@
<field name="state">code</field>
<field name="code">action = model.update_data()</field>
</record>
<record id="all_update_holiday" model="ir.actions.server">
<field name="name">更新休假</field>
<field name="model_id" ref="yuthon_hr_attendance.model_yuthon_vacation_reports"/>
<field name="binding_model_id" ref="yuthon_hr_attendance.model_yuthon_vacation_reports"/>
<field name="state">code</field>
<field name="code">action = model.update_holiday()</field>
</record>
<record id="details_tree_view" model="ir.ui.view">
<field name="name">details.tree.tree</field>
<field name="model">details.tree</field>
@@ -102,7 +102,7 @@ class YuthonVacationImportWizard(models.TransientModel):
leave.write({
'update_lines': update_value,
})
vacation_id.dynamic_previous_year = update_value / 8
vacation_id.dynamic_remainder_year = update_value / 8
else:
if update_value != 0:
self.env[vacation_id.leave_ids._name].create({
@@ -113,7 +113,7 @@ class YuthonVacationImportWizard(models.TransientModel):
'update_lines': update_value,
'vacation_id': vacation_id.id,
})
vacation_id.dynamic_previous_year = update_value / 8
vacation_id.dynamic_remainder_year = update_value / 8
target_overtimes = vacation_id.overtime_ids.filtered(lambda o: o.text == '上月额度继承')
workday_value = float(row[2].value) * 8
@@ -123,7 +123,7 @@ class YuthonVacationImportWizard(models.TransientModel):
overtime.unlink()
else:
overtime.write({'workday': workday_value})
vacation_id.dynamic_previous_year1 = workday_value / 8
vacation_id.this_year1 = workday_value / 8
else:
if workday_value != 0:
self.env[vacation_id.overtime_ids._name].create({
@@ -135,6 +135,9 @@ class YuthonVacationImportWizard(models.TransientModel):
'workday': workday_value,
'vacation_id': vacation_id.id,
})
vacation_id.dynamic_previous_year1 = workday_value / 8
vacation_id.this_year1 = workday_value / 8
vacation_id.dynamic_previous_year = 0
vacation_id.dynamic_previous_year1 = 0
vacation_id._compute_leave()
vacation_id._compute_working_overtime()