@@ -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()
|
||||
|
||||
Reference in New Issue
Block a user