From 9831a1aa9fc6f8d24b08cc54534f961229653e24 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=B9=8F=E5=AE=87?= Date: Sat, 18 Apr 2026 21:23:37 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AF=BC=E5=87=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controllers/excel_report_designer.py | 4 + excel_report_designer/models/report_excel.py | 147 ++++++++++++++++++ yuthon_hr_attendance/__manifest__.py | 2 + .../models/overtime_carryover.py | 4 +- .../js/button_overtime_carryover_export.js | 39 +++++ .../static/src/js/button_overtime_export.js | 10 +- .../views/overtime_carryover_views.xml | 2 +- .../wizard/export_date_wizard.py | 117 +++++++++++--- .../views/inherit_hr_applicant_views.xml | 4 +- .../views/inherit_res_groups_views.xml | 2 +- .../wizard/hr_employee_time_wizard_views.xml | 2 +- .../views/contract_review_approval_views.xml | 2 +- .../property_reimbursement_form_views.xml | 2 +- .../views/yuthon_department_change_viwes.xml | 2 +- .../views/yuthon_employee_add_views.xml | 2 +- .../views/yuthon_leaving_approval_views.xml | 2 +- .../views/yuthon_pre_examination_views.xml | 2 +- .../views/yuthon_prepare_approval_views.xml | 4 +- .../yuthon_recruitment_approval_views.xml | 4 +- .../views/yuthon_retired_approval_views.xml | 2 +- .../views/yuthon_reward_approval_views.xml | 4 +- .../views/yuthon_service_approval_views.xml | 2 +- .../yuthon_social_files_approval_view.xml | 2 +- .../views/yuthon_transfer_approval_views.xml | 2 +- .../views/issue_approval_decision_views.xml | 2 +- yuthon_issue/views/issue_library_views.xml | 6 +- .../yuthon_official_incoming_normal_views.xml | 2 +- .../views/yuthon_sub_enterprises_view.xml | 2 +- 28 files changed, 327 insertions(+), 50 deletions(-) create mode 100644 yuthon_hr_attendance/static/src/js/button_overtime_carryover_export.js diff --git a/excel_report_designer/controllers/excel_report_designer.py b/excel_report_designer/controllers/excel_report_designer.py index a902a9bcb..a82b3eb4f 100644 --- a/excel_report_designer/controllers/excel_report_designer.py +++ b/excel_report_designer/controllers/excel_report_designer.py @@ -62,6 +62,10 @@ class XLSXReportController(http.Controller): report_obj.get_xlsx_meal_report(options, response) elif report_name == '误餐归档明细报表': report_obj.get_xlsx_meal_active_report(options, response) + elif report_name == '加班详情报表': + report_obj.get_xlsx_overtime_detail_report(options, response) + elif report_name == '加班结转明细报表': + report_obj.get_xlsx_overtime_carryover_report(options, response) else: report_obj.get_xlsx_report(options, response) response.set_cookie('fileToken', token) diff --git a/excel_report_designer/models/report_excel.py b/excel_report_designer/models/report_excel.py index b15ccbef6..1f6530eb2 100644 --- a/excel_report_designer/models/report_excel.py +++ b/excel_report_designer/models/report_excel.py @@ -1326,6 +1326,153 @@ class ReportExcel(models.Model): response.stream.write(output.read()) output.close() + def get_xlsx_overtime_detail_report(self, data, response): + """加班详情报表的自定义 Excel 样式 - 对应 vacation.over.line.overtime.tree 视图""" + import io + import xlsxwriter + from datetime import datetime, date + + output = io.BytesIO() + workbook = xlsxwriter.Workbook(output, {'in_memory': True}) + sheet = workbook.add_worksheet('加班详情') + + header_format = workbook.add_format({ + 'font_size': 11, 'bold': True, 'border': 1, + 'align': 'center', 'valign': 'vcenter', 'bg_color': '#D3D3D3' + }) + data_format = workbook.add_format({ + 'font_size': 10, 'border': 1, 'align': 'center', 'valign': 'vcenter' + }) + datetime_format = workbook.add_format({ + 'font_size': 10, 'border': 1, 'align': 'center', + 'valign': 'vcenter', 'num_format': 'yyyy-mm-dd hh:mm' + }) + date_format = workbook.add_format({ + 'font_size': 10, 'border': 1, 'align': 'center', + 'valign': 'vcenter', 'num_format': 'yyyy-mm-dd' + }) + + col_widths = [40, 12, 18, 20, 20, 8, 10, 12, 12, 10, 15] + col = 0 + for label in data['field_label']: + sheet.write(0, col, label, header_format) + width = col_widths[col] if col < len(col_widths) else 15 + sheet.set_column(col, col, width) + col += 1 + + records_data = data.get('export_data', []) + row = 1 + for rec_data in records_data: + col = 0 + for field_name in data['fields_name']: + value = rec_data.get(field_name, '') + if isinstance(value, datetime): + sheet.write_datetime(row, col, value, datetime_format) + elif isinstance(value, date): + sheet.write_datetime(row, col, value, date_format) + elif isinstance(value, float): + sheet.write(row, col, value, data_format) + else: + sheet.write(row, col, value or '', data_format) + col += 1 + row += 1 + + if row > 1: + sheet.autofilter(0, 0, row - 1, len(data['field_label']) - 1) + sheet.freeze_panes(1, 0) + + workbook.close() + output.seek(0) + response.stream.write(output.read()) + output.close() + + def get_xlsx_overtime_carryover_report(self, data, response): + """加班结转明细报表的自定义 Excel 样式""" + import io + import xlsxwriter + from datetime import datetime, date + + output = io.BytesIO() + workbook = xlsxwriter.Workbook(output, {'in_memory': True}) + sheet = workbook.add_worksheet('加班结转明细') + + # 表头格式 + header_format = workbook.add_format({ + 'font_size': 11, + 'bold': True, + 'border': 1, + 'align': 'center', + 'valign': 'vcenter', + 'bg_color': '#D3D3D3' + }) + # 数据格式 + data_format = workbook.add_format({ + 'font_size': 10, + 'border': 1, + 'align': 'center', + 'valign': 'vcenter' + }) + # 日期时间格式 + datetime_format = workbook.add_format({ + 'font_size': 10, + 'border': 1, + 'align': 'center', + 'valign': 'vcenter', + 'num_format': 'yyyy-mm-dd hh:mm' + }) + # 日期格式 + date_format = workbook.add_format({ + 'font_size': 10, + 'border': 1, + 'align': 'center', + 'valign': 'vcenter', + 'num_format': 'yyyy-mm-dd' + }) + + # 写表头 + col = 0 + for label in data['field_label']: + sheet.write(0, col, label, header_format) + if col == 0: # 姓名 + sheet.set_column(col, col, 15) + elif col == 1: # 部门 + sheet.set_column(col, col, 18) + elif col in [2, 3]: # 开始/结束时间 + sheet.set_column(col, col, 20) + else: + sheet.set_column(col, col, 15) + col += 1 + + # 写数据行(使用预处理的 export_data) + records_data = data.get('export_data', []) + row = 1 + for rec_data in records_data: + col = 0 + for field_name in data['fields_name']: + value = rec_data.get(field_name, '') + if isinstance(value, datetime): + sheet.write_datetime(row, col, value, datetime_format) + elif isinstance(value, date): + sheet.write_datetime(row, col, value, date_format) + elif isinstance(value, float): + sheet.write(row, col, value, data_format) + else: + sheet.write(row, col, value or '', data_format) + col += 1 + row += 1 + + # 加筛选 + if row > 1: + sheet.autofilter(0, 0, row - 1, len(data['field_label']) - 1) + + # 冻结首行 + sheet.freeze_panes(1, 0) + + workbook.close() + output.seek(0) + response.stream.write(output.read()) + output.close() + def get_xlsx_meal_report(self, data, response): """误餐明细报表的自定义 Excel 样式""" output = io.BytesIO() diff --git a/yuthon_hr_attendance/__manifest__.py b/yuthon_hr_attendance/__manifest__.py index 5f566c4dd..67f7d648a 100644 --- a/yuthon_hr_attendance/__manifest__.py +++ b/yuthon_hr_attendance/__manifest__.py @@ -126,6 +126,8 @@ 'yuthon_hr_attendance/static/src/xml/button_meal_active_export.xml', 'yuthon_hr_attendance/static/src/js/button_vacation_put.js', 'yuthon_hr_attendance/static/src/xml/button_vacation_put.xml', + 'yuthon_hr_attendance/static/src/js/button_overtime_carryover_export.js', + 'yuthon_hr_attendance/static/src/xml/button_overtime_carryover_export.xml', 'yuthon_hr_attendance/static/src/planning_gantt/planning_gantt_controller.xml', diff --git a/yuthon_hr_attendance/models/overtime_carryover.py b/yuthon_hr_attendance/models/overtime_carryover.py index 0cc96db9c..0d465e694 100644 --- a/yuthon_hr_attendance/models/overtime_carryover.py +++ b/yuthon_hr_attendance/models/overtime_carryover.py @@ -25,8 +25,8 @@ class OvertimeCarryover(models.Model): store=False, ) duration1 = fields.Float(string='动态时长') - last_month = fields.Float(string="上月剩余") - this_month = fields.Float(string="本月结余") + last_month = fields.Float(string="上期剩余") + this_month = fields.Float(string="本期结余") is_void = fields.Boolean(string='作废') carryover_type = fields.Selection([('fee', '加班费结算'), ('leave', '假单结算'), ('cancel', '销假')], string='加班补偿方式', default='leave') diff --git a/yuthon_hr_attendance/static/src/js/button_overtime_carryover_export.js b/yuthon_hr_attendance/static/src/js/button_overtime_carryover_export.js new file mode 100644 index 000000000..5bbd90a02 --- /dev/null +++ b/yuthon_hr_attendance/static/src/js/button_overtime_carryover_export.js @@ -0,0 +1,39 @@ +/** @odoo-module */ +import { ListController } from "@web/views/list/list_controller"; +import { registry } from '@web/core/registry'; +import { listView } from '@web/views/list/list_view'; + +export class CustomOvertimeCarryoverExportController extends ListController { + setup() { + super.setup(); + } + + async exportOvertimeCarryoverExcel() { + const selectedIds = await this.getSelectedResIds(); + // 没有勾选时,取当前视图所有记录的 ID + let exportIds = selectedIds; + if (!exportIds || exportIds.length === 0) { + exportIds = this.model.root.records.map(r => r.resId); + } + return this.actionService.doAction({ + type: 'ir.actions.act_window', + res_model: 'export.date.wizard', + name: '打印明细', + view_mode: 'form', + view_type: 'form', + views: [[false, 'form']], + target: 'new', + context: { + default_export_type: 'overtime_carryover', + default_model_name: 'overtime.carryover', + default_active_ids: JSON.stringify(exportIds), + }, + }); + } +} + +registry.category("views").add("custom_overtime_carryover_export_button", { + ...listView, + Controller: CustomOvertimeCarryoverExportController, + buttonTemplate: "overtime_carryover_export_module.ListView.Buttons", +}); diff --git a/yuthon_hr_attendance/static/src/js/button_overtime_export.js b/yuthon_hr_attendance/static/src/js/button_overtime_export.js index fb92e936d..c53afe55d 100644 --- a/yuthon_hr_attendance/static/src/js/button_overtime_export.js +++ b/yuthon_hr_attendance/static/src/js/button_overtime_export.js @@ -29,9 +29,13 @@ export class CustomOvertimeExportController extends ListController { } async exportOvertimeDetailExcel() { - // 导出加班详情(包含审批类型、开始结束时间、事由、餐费等) + // 导出加班详情(包含加班明细视图字段) const selectedIds = await this.getSelectedResIds(); - + // 没有勾选时,取当前视图所有记录的 ID + let exportIds = selectedIds; + if (!exportIds || exportIds.length === 0) { + exportIds = this.model.root.records.map(r => r.resId); + } return this.actionService.doAction({ type: 'ir.actions.act_window', res_model: 'export.date.wizard', @@ -43,7 +47,7 @@ export class CustomOvertimeExportController extends ListController { context: { default_export_type: 'overtime_detail', default_model_name: 'vacation.over.line', - default_active_ids: JSON.stringify(selectedIds), + default_active_ids: JSON.stringify(exportIds), }, }); } diff --git a/yuthon_hr_attendance/views/overtime_carryover_views.xml b/yuthon_hr_attendance/views/overtime_carryover_views.xml index 64f40fc31..f010b4c37 100644 --- a/yuthon_hr_attendance/views/overtime_carryover_views.xml +++ b/yuthon_hr_attendance/views/overtime_carryover_views.xml @@ -26,7 +26,7 @@ overtime.carryover.tree1 overtime.carryover - + diff --git a/yuthon_hr_attendance/wizard/export_date_wizard.py b/yuthon_hr_attendance/wizard/export_date_wizard.py index a6c09ec22..79a952252 100644 --- a/yuthon_hr_attendance/wizard/export_date_wizard.py +++ b/yuthon_hr_attendance/wizard/export_date_wizard.py @@ -45,6 +45,9 @@ class ExportDateWizard(models.TransientModel): return self._export_meal(start_date, end_date) elif self.export_type == 'meal_active': return self._export_meal_active(start_date, end_date) + elif self.export_type == 'overtime_carryover': + return self._export_overtime_carryover(start_date, end_date) + else: raise UserError('未知的导出类型') @@ -171,33 +174,56 @@ class ExportDateWizard(models.TransientModel): } def _export_overtime_detail(self, start_date, end_date): - """导出加班详情""" + """导出加班详情 - 对应 vacation.over.line.overtime.tree 视图字段""" active_ids = json.loads(self.active_ids) if self.active_ids else [] - - domain = [('carry_forward_date', '>=', start_date), ('carry_forward_date', '<', end_date)] + + carry_forward_state_map = { + 'pending': '待结转', + 'completed': '已结转', + 'partial': '部分结转', + } + if active_ids: - domain = [('id', 'in', active_ids)] + domain - - filtered_records = self.env['vacation.over.line'].search(domain) - - if not filtered_records: + records = self.env['vacation.over.line'].browse(active_ids) + else: + domain = [('start_time', '>=', start_date), ('start_time', '<', end_date)] + records = self.env['vacation.over.line'].search(domain) + + if not records: raise UserError(f'在 {self.year} 年 {self.month} 月没有找到符合条件的加班记录') - - filtered_ids = filtered_records.ids - - fields_name = ['employee_id', 'department_id', 'workflow_id', 'start_time', - 'end_time', 'duration', 'reason_application', 'meal'] - field_label = ['员工', '部门', '审批类型', '加班开始时间', '加班结束时间', - '加班时长', '事由', '加班餐费'] - + + export_data = [] + for rec in records: + export_data.append({ + 'overtime_name': rec.overtime_name or '', + 'employee_id': rec.employee_id.name if rec.employee_id else '', + 'department_id': rec.department_id.name if rec.department_id else '', + 'start_time': (rec.start_time + timedelta(hours=8)).strftime('%Y-%m-%d %H:%M:%S') if rec.start_time else '', + 'end_time': (rec.end_time + timedelta(hours=8)).strftime('%Y-%m-%d %H:%M:%S') if rec.end_time else '', + 'duration': rec.duration, + 'carry_forward_quantity': rec.carry_forward_quantity, + 'carry_forward_date': rec.carry_forward_date, + 'carry_forward_state': carry_forward_state_map.get(rec.carry_forward_state, rec.carry_forward_state or ''), + 'remaining_quantity': rec.remaining_quantity, + 'validity': rec.validity or '', + }) + + fields_name = ['overtime_name', 'employee_id', 'department_id', 'start_time', 'end_time', + 'duration', 'carry_forward_quantity', 'carry_forward_date', + 'carry_forward_state', 'remaining_quantity', 'validity'] + field_label = ['标题', '员工', '部门', '开始时间', '结束时间', + '时长', '结转时长', '结转日期', + '结转状态', '剩余数', '有效期'] + data = { 'report_name': '加班详情报表', 'model_name': 'vacation.over.line', 'fields_name': fields_name, 'field_label': field_label, - 'active_ids': filtered_ids, + 'export_data': export_data, + 'date_field': None, } - + return { 'type': 'ir.actions.report', 'data': { @@ -300,6 +326,61 @@ class ExportDateWizard(models.TransientModel): } + def _export_overtime_carryover(self, start_date, end_date): + """导出加班结转明细(overtime.carryover.tree1 视图数据)""" + active_ids = json.loads(self.active_ids) if self.active_ids else [] + + if active_ids: + records = self.env['overtime.carryover'].browse(active_ids) + else: + records = self.env['overtime.carryover'].search([ + ('carry_forward_date', '>=', start_date.date()), + ('carry_forward_date', '<', end_date.date()), + ]) + + if not records: + raise UserError(f'在 {self.year} 年 {self.month} 月没有找到符合条件的加班结转记录') + + export_data = [] + for record in records: + over_line = record.over_line_id + export_data.append({ + 'employee_id': record.employee_id.name if record.employee_id else '', + 'department_id': record.department_id.name if record.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, + 'last_month': record.last_month, + 'carry_forward_quantity1': record.carry_forward_quantity1, + 'this_month': record.this_month, + 'carry_result': '成功', + }) + + fields_name = ['employee_id', 'department_id', 'start_time', 'end_time', + 'carry_forward_date', 'last_month', 'carry_forward_quantity1', 'this_month', 'carry_result'] + field_label = ['姓名', '部门', '加班开始时间', '加班结束时间', + '结转日期', '上期剩余', '结转时长', '本期结余', '结转结果'] + + data = { + 'report_name': '加班结转明细报表', + 'model_name': 'overtime.carryover', + 'fields_name': fields_name, + 'field_label': field_label, + 'export_data': export_data, + 'date_field': None, + } + + return { + 'type': 'ir.actions.report', + 'data': { + 'model': 'report.excel', + 'options': json.dumps(data, default=date_utils.json_default), + 'output_format': 'xlsx', + 'report_name': '加班结转明细报表', + }, + 'report_type': 'xlsx', + } + def _export_meal(self, start_date, end_date): """导出误餐明细""" active_ids = json.loads(self.active_ids) if self.active_ids else [] diff --git a/yuthon_hr_employee/views/inherit_hr_applicant_views.xml b/yuthon_hr_employee/views/inherit_hr_applicant_views.xml index d0354911e..6f3bd94bd 100644 --- a/yuthon_hr_employee/views/inherit_hr_applicant_views.xml +++ b/yuthon_hr_employee/views/inherit_hr_applicant_views.xml @@ -26,7 +26,7 @@ - + @@ -85,7 +85,7 @@ 岗位 - + diff --git a/yuthon_hr_employee/views/inherit_res_groups_views.xml b/yuthon_hr_employee/views/inherit_res_groups_views.xml index ee7e52a3a..6003be5f8 100644 --- a/yuthon_hr_employee/views/inherit_res_groups_views.xml +++ b/yuthon_hr_employee/views/inherit_res_groups_views.xml @@ -18,7 +18,7 @@ - + diff --git a/yuthon_hr_employee/wizard/hr_employee_time_wizard_views.xml b/yuthon_hr_employee/wizard/hr_employee_time_wizard_views.xml index ff3735ca6..93cbe6b2c 100644 --- a/yuthon_hr_employee/wizard/hr_employee_time_wizard_views.xml +++ b/yuthon_hr_employee/wizard/hr_employee_time_wizard_views.xml @@ -7,7 +7,7 @@
- + diff --git a/yuthon_hr_employee_approval/views/contract_review_approval_views.xml b/yuthon_hr_employee_approval/views/contract_review_approval_views.xml index 99dbd5db9..7c8318bfa 100644 --- a/yuthon_hr_employee_approval/views/contract_review_approval_views.xml +++ b/yuthon_hr_employee_approval/views/contract_review_approval_views.xml @@ -58,7 +58,7 @@ - + diff --git a/yuthon_hr_employee_approval/views/property_reimbursement_form_views.xml b/yuthon_hr_employee_approval/views/property_reimbursement_form_views.xml index 46b829f5b..0edcb6fc8 100644 --- a/yuthon_hr_employee_approval/views/property_reimbursement_form_views.xml +++ b/yuthon_hr_employee_approval/views/property_reimbursement_form_views.xml @@ -73,7 +73,7 @@ - + diff --git a/yuthon_hr_employee_approval/views/yuthon_department_change_viwes.xml b/yuthon_hr_employee_approval/views/yuthon_department_change_viwes.xml index c24886b8a..3728a14fe 100644 --- a/yuthon_hr_employee_approval/views/yuthon_department_change_viwes.xml +++ b/yuthon_hr_employee_approval/views/yuthon_department_change_viwes.xml @@ -64,7 +64,7 @@ - + diff --git a/yuthon_hr_employee_approval/views/yuthon_employee_add_views.xml b/yuthon_hr_employee_approval/views/yuthon_employee_add_views.xml index 6e7eb6780..1a4beb4c1 100644 --- a/yuthon_hr_employee_approval/views/yuthon_employee_add_views.xml +++ b/yuthon_hr_employee_approval/views/yuthon_employee_add_views.xml @@ -82,7 +82,7 @@ - + diff --git a/yuthon_hr_employee_approval/views/yuthon_leaving_approval_views.xml b/yuthon_hr_employee_approval/views/yuthon_leaving_approval_views.xml index aac025857..37028227e 100644 --- a/yuthon_hr_employee_approval/views/yuthon_leaving_approval_views.xml +++ b/yuthon_hr_employee_approval/views/yuthon_leaving_approval_views.xml @@ -62,7 +62,7 @@ - + diff --git a/yuthon_hr_employee_approval/views/yuthon_pre_examination_views.xml b/yuthon_hr_employee_approval/views/yuthon_pre_examination_views.xml index fc9a5d220..96e7fd459 100644 --- a/yuthon_hr_employee_approval/views/yuthon_pre_examination_views.xml +++ b/yuthon_hr_employee_approval/views/yuthon_pre_examination_views.xml @@ -49,7 +49,7 @@ - + diff --git a/yuthon_hr_employee_approval/views/yuthon_prepare_approval_views.xml b/yuthon_hr_employee_approval/views/yuthon_prepare_approval_views.xml index c696a433b..59e7aa9b6 100644 --- a/yuthon_hr_employee_approval/views/yuthon_prepare_approval_views.xml +++ b/yuthon_hr_employee_approval/views/yuthon_prepare_approval_views.xml @@ -65,7 +65,7 @@ - + @@ -82,7 +82,7 @@ - + diff --git a/yuthon_hr_employee_approval/views/yuthon_recruitment_approval_views.xml b/yuthon_hr_employee_approval/views/yuthon_recruitment_approval_views.xml index efb5b0174..da0486788 100644 --- a/yuthon_hr_employee_approval/views/yuthon_recruitment_approval_views.xml +++ b/yuthon_hr_employee_approval/views/yuthon_recruitment_approval_views.xml @@ -53,7 +53,7 @@ - + @@ -66,7 +66,7 @@ - + diff --git a/yuthon_hr_employee_approval/views/yuthon_retired_approval_views.xml b/yuthon_hr_employee_approval/views/yuthon_retired_approval_views.xml index e6cbca9c2..c0d3d4ddb 100644 --- a/yuthon_hr_employee_approval/views/yuthon_retired_approval_views.xml +++ b/yuthon_hr_employee_approval/views/yuthon_retired_approval_views.xml @@ -57,7 +57,7 @@ - + diff --git a/yuthon_hr_employee_approval/views/yuthon_reward_approval_views.xml b/yuthon_hr_employee_approval/views/yuthon_reward_approval_views.xml index 2ddef9b0d..d67535cd9 100644 --- a/yuthon_hr_employee_approval/views/yuthon_reward_approval_views.xml +++ b/yuthon_hr_employee_approval/views/yuthon_reward_approval_views.xml @@ -54,7 +54,7 @@ - + @@ -69,7 +69,7 @@ - + diff --git a/yuthon_hr_employee_approval/views/yuthon_service_approval_views.xml b/yuthon_hr_employee_approval/views/yuthon_service_approval_views.xml index b7233dc0b..a415040d6 100644 --- a/yuthon_hr_employee_approval/views/yuthon_service_approval_views.xml +++ b/yuthon_hr_employee_approval/views/yuthon_service_approval_views.xml @@ -57,7 +57,7 @@ - + diff --git a/yuthon_hr_employee_approval/views/yuthon_social_files_approval_view.xml b/yuthon_hr_employee_approval/views/yuthon_social_files_approval_view.xml index d5dfe1c55..7e03b461b 100644 --- a/yuthon_hr_employee_approval/views/yuthon_social_files_approval_view.xml +++ b/yuthon_hr_employee_approval/views/yuthon_social_files_approval_view.xml @@ -60,7 +60,7 @@ - + diff --git a/yuthon_hr_employee_approval/views/yuthon_transfer_approval_views.xml b/yuthon_hr_employee_approval/views/yuthon_transfer_approval_views.xml index 0a125f3cc..bf9adea08 100644 --- a/yuthon_hr_employee_approval/views/yuthon_transfer_approval_views.xml +++ b/yuthon_hr_employee_approval/views/yuthon_transfer_approval_views.xml @@ -61,7 +61,7 @@ - + diff --git a/yuthon_issue/views/issue_approval_decision_views.xml b/yuthon_issue/views/issue_approval_decision_views.xml index b0fc16a66..548a27520 100644 --- a/yuthon_issue/views/issue_approval_decision_views.xml +++ b/yuthon_issue/views/issue_approval_decision_views.xml @@ -53,7 +53,7 @@ - + diff --git a/yuthon_issue/views/issue_library_views.xml b/yuthon_issue/views/issue_library_views.xml index 6f57641a8..f7febdf8d 100644 --- a/yuthon_issue/views/issue_library_views.xml +++ b/yuthon_issue/views/issue_library_views.xml @@ -264,7 +264,7 @@ - + @@ -292,7 +292,7 @@ - + @@ -537,7 +537,7 @@ - + diff --git a/yuthon_official/views/yuthon_official_incoming_normal_views.xml b/yuthon_official/views/yuthon_official_incoming_normal_views.xml index 2e1450adc..8f1a41d95 100644 --- a/yuthon_official/views/yuthon_official_incoming_normal_views.xml +++ b/yuthon_official/views/yuthon_official_incoming_normal_views.xml @@ -76,7 +76,7 @@ - + diff --git a/yuthon_official/views/yuthon_sub_enterprises_view.xml b/yuthon_official/views/yuthon_sub_enterprises_view.xml index 59aae21ae..4f71b41e9 100644 --- a/yuthon_official/views/yuthon_sub_enterprises_view.xml +++ b/yuthon_official/views/yuthon_sub_enterprises_view.xml @@ -56,7 +56,7 @@ - +