diff --git a/yuthon_hr_attendance/wizard/export_date_wizard.py b/yuthon_hr_attendance/wizard/export_date_wizard.py index 3a68ba8ce..dbdd0b0e6 100644 --- a/yuthon_hr_attendance/wizard/export_date_wizard.py +++ b/yuthon_hr_attendance/wizard/export_date_wizard.py @@ -210,36 +210,75 @@ class ExportDateWizard(models.TransientModel): } def _export_overtime_active(self, start_date, end_date): - """导出加班归档明细""" - domain = [ - ('carry_forward_date', '>=', start_date.date()), - ('carry_forward_date', '<', end_date.date()), - ('is_void', '=', False), - ('carryover_type', '=', 'fee') - ] - filtered_records = self.env['overtime.carryover'].search(domain) + """导出加班归档明细 - 导出每条归档记录对应详情(overtime.carryover.tree1)中的数据""" + import datetime as dt + import math - if not filtered_records: + # 获取选中的 vacation.overtime.active 记录 + active_ids = json.loads(self.active_ids) if self.active_ids else [] + if active_ids: + active_records = self.env['vacation.overtime.active'].browse(active_ids) + else: + active_records = self.env['vacation.overtime.active'].search([ + ('carry_forward_date', '>=', start_date.date()), + ('carry_forward_date', '<', end_date.date()), + ]) + + if not active_records: raise UserError(f'在 {self.year} 年 {self.month} 月没有找到符合条件的加班归档记录') + export_data = [] - for record in filtered_records: - over_line = record.over_line_id - carry_forward_state_value = '' - if over_line and over_line.carry_forward_state: - selection_dict = dict(over_line._fields.get('carry_forward_state').selection) - carry_forward_state_value = selection_dict.get(over_line.carry_forward_state, '') - row_data = { - 'employee_id': over_line.employee_id.name if over_line and over_line.employee_id else '', - 'department_id': over_line.department_id.name if over_line and over_line.department_id else '', - 'start_time': (over_line.start_time + timedelta(hours=8)).strftime('%Y-%m-%d %H:%M:%S') if over_line and over_line.start_time else '', - 'end_time': (over_line.end_time + timedelta(hours=8)).strftime('%Y-%m-%d %H:%M:%S') if over_line and over_line.end_time else '', - 'carry_forward_date': record.carry_forward_date, - 'carry_forward_quantity': record.carry_forward_quantity, - 'carry_forward_state': carry_forward_state_value - } - export_data.append(row_data) + carry_result_dict = dict(self.env['overtime.carryover']._fields['carry_result'].selection) + + for active in active_records: + year = int(active.select_year) if active.select_year else start_date.year + month = int(active.select_month) if active.select_month else start_date.month + if month == 12: + last_day_date = dt.date(year, 12, 31) + else: + next_month_first = dt.date(year, month + 1, 1) + last_day_date = next_month_first - dt.timedelta(days=1) + last_day = last_day_date.strftime("%Y-%m-%d") + + original_domain = [ + ('over_line_id.vacation_id.employee_id', '=', active.employee_id.id), + ('is_void', '=', False), + '|', + '&', + ('carryover_type', '=', 'fee'), + ('carry_forward_date', '=', active.carry_forward_date), + '&', + ('carryover_type', '=', 'leave'), + ('leave_id.start_date', '>', last_day), + ] + records = self.env['overtime.carryover'].search(original_domain) + total = sum(r.carry_forward_quantity for r in records) + if not math.isclose(total, active.carry_forward_quantity, abs_tol=0.1): + records = self.env['overtime.carryover'].search([ + ('over_line_id.vacation_id.employee_id', '=', active.employee_id.id), + ('is_void', '=', False), + ('carryover_type', '=', 'fee'), + ('carry_forward_date', '=', active.carry_forward_date), + ]) + + for record in records: + over_line = record.over_line_id + row_data = { + 'employee_id': over_line.employee_id.name if over_line and over_line.employee_id else '', + 'department_id': over_line.department_id.name if over_line and over_line.department_id else '', + 'start_time': (over_line.start_time + timedelta(hours=8)).strftime('%Y-%m-%d %H:%M:%S') if over_line and over_line.start_time else '', + 'end_time': (over_line.end_time + timedelta(hours=8)).strftime('%Y-%m-%d %H:%M:%S') if over_line and over_line.end_time else '', + 'carry_forward_date': record.carry_forward_date, + 'carry_forward_quantity': record.carry_forward_quantity, + 'carry_result': carry_result_dict.get(record.carry_result, '') if record.carry_result else '', + } + export_data.append(row_data) + + if not export_data: + raise UserError(f'在 {self.year} 年 {self.month} 月没有找到符合条件的加班归档记录') + fields_name = ['employee_id', 'department_id', 'start_time', 'end_time', - 'carry_forward_date', 'carry_forward_quantity', 'carry_forward_state'] + 'carry_forward_date', 'carry_forward_quantity', 'carry_result'] field_label = ['姓名', '部门', '加班开始时间', '加班结束时间', '结转日期', '结转时长', '结转结果'] @@ -262,6 +301,7 @@ class ExportDateWizard(models.TransientModel): 'report_type': 'xlsx', } + def _export_meal(self, start_date, end_date): """导出误餐明细""" active_ids = json.loads(self.active_ids) if self.active_ids else []