diff --git a/yuthon_holiday/models/inherit_hr_leave_allocation.py b/yuthon_holiday/models/inherit_hr_leave_allocation.py
index 9f86c829a..ccff80585 100644
--- a/yuthon_holiday/models/inherit_hr_leave_allocation.py
+++ b/yuthon_holiday/models/inherit_hr_leave_allocation.py
@@ -228,10 +228,98 @@ class HrLeaveAllocation(models.Model):
return super(HrLeaveAllocation, self).unlink()
+ def action_refuse(self):
+ """拒绝假期分配时,删除之前验证时添加的明细行并重新计算"""
+ import logging
+ logger = logging.getLogger(__name__)
+
+ result = super(HrLeaveAllocation, self).action_refuse()
+
+ for leave in self:
+ logger.info("===== 拒绝假期分配处理开始 =====")
+ logger.info(f"假期分配ID: {leave.id}")
+ logger.info(f"假期类型: {leave.holiday_status_id.name}")
+ logger.info(f"员工ID: {leave.employee_id.id}, 员工姓名: {leave.employee_id.name}")
+ logger.info(f"date_from: {leave.date_from}")
+ logger.info(f"分配类型: {leave.allocation_type}")
+
+ # 使用date_from或date_to计算月份
+ if leave.date_from:
+ vacation_date = leave.date_from.replace(day=1)
+ elif leave.date_to:
+ vacation_date = leave.date_to.replace(day=1)
+ else:
+ vacation_date = fields.Date.today().replace(day=1)
+ logger.info(f"vacation_date: {vacation_date}")
+
+ reports_id = self.env['yuthon.vacation.reports'].search([
+ ('employee_id', '=', leave.employee_id.id),
+ ('vacation_date', '=', vacation_date)
+ ], limit=1)
+
+ logger.info(f"找到的reports_id: {reports_id}")
+
+ if not reports_id:
+ logger.info("未找到对应的考勤报告记录")
+ continue
+
+ if leave.holiday_status_id.name == '年假':
+ # 精确查找并删除当前表单添加的年假明细行
+ lines_to_delete = reports_id.leave_ids.filtered(
+ lambda l: l.update_type == 'add' and l.allocation_id.id == leave.id
+ )
+ logger.info(f"找到需要删除的年假明细行数量: {len(lines_to_delete)}")
+ if lines_to_delete:
+ lines_to_delete.unlink()
+ reports_id.update_line()
+ logger.info("年假明细行已删除并重新计算")
+ else:
+ # 尝试按旧方式查找(没有allocation_id的记录)
+ old_lines = reports_id.leave_ids.filtered(
+ lambda l: l.update_type == 'add' and f'({leave.id})' in (l.text or '')
+ )
+ logger.info(f"按旧方式找到的明细行数量: {len(old_lines)}")
+ if old_lines:
+ old_lines.unlink()
+ reports_id.update_line()
+ logger.info("按旧方式删除年假明细行并重新计算")
+
+ elif leave.holiday_status_id.name == '补休':
+ # 精确查找并删除当前表单添加的补休明细行
+ lines_to_delete = reports_id.overtime_ids.filtered(
+ lambda o: o.update_type == 'add' and o.allocation_id.id == leave.id
+ )
+ logger.info(f"找到需要删除的补休明细行数量: {len(lines_to_delete)}")
+ if lines_to_delete:
+ lines_to_delete.unlink()
+ reports_id.update_line()
+ logger.info("补休明细行已删除并重新计算")
+ else:
+ # 尝试按旧方式查找
+ old_lines = reports_id.overtime_ids.filtered(
+ lambda o: o.update_type == 'add' and f'({leave.id})' in (o.text or '')
+ )
+ logger.info(f"按旧方式找到的明细行数量: {len(old_lines)}")
+ if old_lines:
+ old_lines.unlink()
+ reports_id.update_line()
+ logger.info("按旧方式删除补休明细行并重新计算")
+
+ logger.info("===== 拒绝假期分配处理结束 =====")
+
+ return result
+
def action_validate(self):
+ import logging
+ logger = logging.getLogger(__name__)
+
result = super(HrLeaveAllocation, self).action_validate()
for leave in self:
+ logger.info("===== 验证假期分配处理开始 =====")
+ logger.info(f"假期分配ID: {leave.id}")
+ logger.info(f"假期类型: {leave.holiday_status_id.name}")
+ logger.info(f"number_of_days_display: {leave.number_of_days_display}")
if leave.holiday_status_id.name == '年假':
vacation_date = leave.date_from.replace(day=1) if leave.date_from else fields.Date.today().replace(day=1)
@@ -242,17 +330,22 @@ class HrLeaveAllocation(models.Model):
if reports_id:
leave_hours = leave.number_of_days_display * 8
+ logger.info(f"准备写入年假明细行: allocation_id={leave.id}, update_lines={leave_hours}, text={leave.name}")
reports_id.write({
'valid_date': leave.date_to,
'leave_ids': [(0, 0, {
'vacation_id': reports_id.id,
+ 'allocation_id': leave.id,
'update_type': 'add',
'update_date': fields.Datetime.now(),
'valid_date': leave.date_from,
'update_lines': leave_hours,
- 'text': '年假分配'
+ 'text': leave.name
})]
})
+ # 验证是否写入成功
+ new_line = reports_id.leave_ids.filtered(lambda l: l.allocation_id.id == leave.id)
+ logger.info(f"写入后的年假明细行: {new_line}")
reports_id.update_line()
elif leave.holiday_status_id.name == '补休':
@@ -269,6 +362,7 @@ class HrLeaveAllocation(models.Model):
'valid_date1': leave.date_to,
'overtime_ids': [(0, 0, {
'vacation_id': reports_id.id,
+ 'allocation_id': leave.id,
'update_type': 'add',
'update_date': fields.Datetime.now(),
'valid_date': leave.date_to,
diff --git a/yuthon_issue/views/issue_library_views.xml b/yuthon_issue/views/issue_library_views.xml
index d5507f318..5f19b06f6 100644
--- a/yuthon_issue/views/issue_library_views.xml
+++ b/yuthon_issue/views/issue_library_views.xml
@@ -248,7 +248,7 @@
+ context="{'search_default_group_scope': 1}" options="{'no_create': True}"/>
+ context="{'search_default_group_scope': 1}" options="{'no_create': True}"/>
@@ -773,7 +773,7 @@
+ context="{'search_default_group_scope': 1}" options="{'no_create': True}"/>
@@ -970,7 +970,7 @@
+ context="{'search_default_group_scope': 1}" options="{'no_create': True}"/>