From a2c97d62d94d560571585afe2e9608029f0d7089 Mon Sep 17 00:00:00 2001 From: zhou <123@> Date: Sat, 28 Jun 2025 21:14:56 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../wizard/soong_workflow_comment_wizard.py | 1 + .../soong_workflow_record_revoke_wizard.py | 44 +++++++ yuthon_holiday/models/inherit_hr_leave.py | 2 +- .../models/yuthon_vacation_reports.py | 113 +++++++++++++++++- .../views/yuthon_vacation_reports_views.xml | 14 ++- .../models/overtime_approval.py | 45 +++++-- .../views/overtime_approval.xml | 1 + yuthon_notice/views/yuthon_notice_views.xml | 10 +- .../models/yuthon_offficial_incoming_party.py | 2 +- yuthon_official/models/yuthon_official.py | 2 +- .../models/yuthon_official_incoming_labor.py | 2 +- .../models/yuthon_official_incoming_normal.py | 2 +- .../models/yuthon_official_labor.py | 2 +- .../models/yuthon_official_party.py | 2 +- .../models/property_evaluation_plan.py | 31 ++++- yuthon_property/models/yuthon_property.py | 48 +++++--- .../property_accounts_receivable_views.xml | 2 +- .../views/property_evaluation_plan_view.xml | 26 ++++ .../views/yuthon_property_views.xml | 5 +- .../wizard/click_reconciliation_wizard.py | 22 ++-- .../wizard/property_rental_wizard.py | 1 + 21 files changed, 315 insertions(+), 62 deletions(-) diff --git a/soong_workflow/wizard/soong_workflow_comment_wizard.py b/soong_workflow/wizard/soong_workflow_comment_wizard.py index 047b00e71..52d44be6f 100644 --- a/soong_workflow/wizard/soong_workflow_comment_wizard.py +++ b/soong_workflow/wizard/soong_workflow_comment_wizard.py @@ -355,6 +355,7 @@ class SoongWorkflowCommentWizard(models.TransientModel): if self.employee_ids: workflow_record_id.users_ids = [(4, employee.user_id.id) for employee in self.employee_ids if employee.user_id] workflow_record_id.employee_ids = self.employee_ids + workflow_record_id.approve_state = "pending" # 待审批 record_id.write({'state': self.trans_link_id.name}) for employee in self.employee_ids: diff --git a/soong_workflow/wizard/soong_workflow_record_revoke_wizard.py b/soong_workflow/wizard/soong_workflow_record_revoke_wizard.py index 3a074c31d..758008e30 100644 --- a/soong_workflow/wizard/soong_workflow_record_revoke_wizard.py +++ b/soong_workflow/wizard/soong_workflow_record_revoke_wizard.py @@ -21,6 +21,50 @@ class SoongWorkflowRecordRevokeWizard(models.TransientModel): model = self.env[model_name] record_to_update = model.browse(record_id_dx) if record_to_update.exists(): + if model_name == 'hr.leave.batch': + # 请假审批 -> 删除年假明细 + self.env['vacation.leave.line'].search([ + ('workflow_record_id', '=', self.record_id.id) + + ]).unlink() + + elif model_name == 'overtime.approval': + # 加班审批 -> 删除加班明细 + over_line = self.env['vacation.over.line'].search([ + ('workflow_record_id', '=', self.record_id.id), + ('update_type', '=', 'add') + ]) + employee = over_line.vacation_id.employee_id + if employee: + if over_line.workday > 0: + employee.write({'normal_overtime_hours': employee.normal_overtime_hours - over_line.workday}) + if over_line.legal_day > 0: + employee.write( + {'holiday_overtime_hours': employee.holiday_overtime_hours - over_line.legal_day}) + if over_line.public_holidays > 0: + employee.write( + {'weekend_overtime_hours': employee.weekend_overtime_hours - over_line.public_holidays}) + over_line.unlink() + # 从加班审批模型获取误餐数据 + if record_to_update.meal == 'yes': + employee = record_to_update.users_id.employee_id + if employee: + employee.write({'meal_number': employee.meal_number - 1}) + + elif model_name == 'go.approval': + # 外出审批 -> 删除误餐明细并恢复误餐次数 + meal_line = self.env['vacation.meal.line'].search([ + ('workflow_record_id', '=', self.id), + ('update_type', '=', 'add') # 只处理增加类型的记录 + ]) + + employee_id = meal_line.vacation_id.employee_id.id + if employee_id: + # 恢复误餐次数 + meal_count = employee_id.update_lines + employee_id.write({'meal_fee': employee_id.meal_fee - meal_count}) + meal_line.unlink() + record_to_update.write({'log_ids': [(5, 0, 0)]}) record_to_update.state = '申请人' self.record_id.approve_state = 'start' \ No newline at end of file diff --git a/yuthon_holiday/models/inherit_hr_leave.py b/yuthon_holiday/models/inherit_hr_leave.py index d6fda29e5..c5ba9c586 100644 --- a/yuthon_holiday/models/inherit_hr_leave.py +++ b/yuthon_holiday/models/inherit_hr_leave.py @@ -395,7 +395,7 @@ class HolidaysRequestBatch(models.Model): 'update_type': 'reduce', 'workflow_record_id':workflow_record_id.id, 'update_date': fields.Datetime.now(), - 'update_lines': days, + 'update_lines': days, 'text': '审批' })) reports_id.write({'leave_ids': leave_list}) diff --git a/yuthon_holiday/models/yuthon_vacation_reports.py b/yuthon_holiday/models/yuthon_vacation_reports.py index 014519669..81c5fd0ea 100644 --- a/yuthon_holiday/models/yuthon_vacation_reports.py +++ b/yuthon_holiday/models/yuthon_vacation_reports.py @@ -10,12 +10,53 @@ class YuthonVacationReports(models.Model): employee_id = fields.Many2one('hr.employee', string='员工') company_id = fields.Many2one(related="employee_id.company_id", string="公司") - leave = fields.Float(string='年假') - working_overtime = fields.Float(string='加班时') - meal_fee = fields.Integer(string="误餐次数") leave_ids = fields.One2many('vacation.leave.line', 'vacation_id', string='年假明细') overtime_ids = fields.One2many('vacation.over.line', 'vacation_id', string='加班明细') meal_fee_ids = fields.One2many('vacation.meal.line', 'vacation_id', string='误餐明细') + allocate_credits = fields.Float(string='分配额度') + + leave = fields.Float(string='年假', compute='_compute_leave', store=True) + working_overtime = fields.Float(string='加班时', compute='_compute_working_overtime', store=True) + meal_fee = fields.Integer(string="误餐次数", compute='_compute_meal_fee', store=True) + + @api.depends('vacation_leave_line_ids.update_lines', 'vacation_leave_line_ids.update_type') + def _compute_leave(self): + for record in self: + leave_total = 0.0 + for line in record.vacation_leave_line_ids: + if line.update_type == 'add': + leave_total += line.update_lines or 0 + elif line.update_type == 'reduce': + leave_total -= line.update_lines or 0 + record.leave = leave_total + + @api.depends( + 'vacation_over_line_ids.workday', + 'vacation_over_line_ids.legal_day', + 'vacation_over_line_ids.public_holidays', + 'vacation_over_line_ids.update_type' + ) + def _compute_working_overtime(self): + for record in self: + overtime_total = 0.0 + for line in record.vacation_over_line_ids: + line_total = (line.workday or 0) + (line.legal_day or 0) + (line.public_holidays or 0) + if line.update_type == 'add': + overtime_total += line_total + elif line.update_type == 'reduce': + overtime_total -= line_total + record.working_overtime = overtime_total + + @api.depends('vacation_meal_line_ids.update_lines', 'vacation_meal_line_ids.update_type') + def _compute_meal_fee(self): + for record in self: + meal_total = 0 + for line in record.vacation_meal_line_ids: + if line.update_type == 'add': + meal_total += int(line.update_lines or 0) + elif line.update_type == 'reduce': + meal_total -= int(line.update_lines or 0) + record.meal_fee = meal_total def button_fixes_approval(self): form_id = self.env.ref('yuthon_holiday.view_yuthon_fixes_approval_form').id @@ -69,6 +110,13 @@ class YuthonVacationReports(models.Model): 'meal_fee': employee.meal_number, }) + def update_log(self): + vacation_ids = self.env["yuthon.vacation.reports"].browse( + self._context.get('active_ids', self._context.get('active_id'))) + for vacation_id in vacation_ids: + vacation_id.leave_ids.unlink() + vacation_id.overtime_ids.unlink() + vacation_id.meal_fee_ids.unlink() def log(self): return { @@ -88,9 +136,17 @@ class VacationLeaveLine(models.Model): workflow_record_id = fields.Many2one('soong.workflow.record', string='流程') update_type= fields.Selection([('add', '增加'), ('reduce', '减少')], string='更新类型') update_date = fields.Date(string='更新时间') + allocate_credits = fields.Float(string='分配额度') + is_soon = fields.Boolean(string="流程修改") + is_manual = fields.Boolean(string="手动修改") update_lines = fields.Text(string='更新额度') text = fields.Text(string='备注') + @api.model + def create(self, vals): + vals['is_manual'] = True + return super(VacationLeaveLine, self).create(vals) + class VacationOverline(models.Model): _name = 'vacation.over.line' @@ -99,10 +155,41 @@ class VacationOverline(models.Model): vacation_id = fields.Many2one('yuthon.vacation.reports', string='关联假期报表') workflow_record_id = fields.Many2one('soong.workflow.record', string='流程') update_type= fields.Selection([('add', '增加'), ('reduce', '减少')], string='更新类型') + workday = fields.Float(string='工作日') + legal_day = fields.Float(string='法定节假日') + public_holidays = fields.Float(string='公休日') update_date = fields.Date(string='更新时间') - update_lines = fields.Text(string='更新额度') + is_soon = fields.Boolean(string="流程修改") + is_manual = fields.Boolean(string="手动修改") text = fields.Text(string='备注') + @api.model + def create(self, vals): + vals['is_manual'] = True + return super(VacationOverline, self).create(vals) + + def _sync_to_employee(self): + """将数据同步到关联员工""" + employee = self.vacation_id.employee_id + if self.update_type == 'add': + employee.write({ + 'normal_overtime_hours': employee.normal_overtime_hours + self.workday, + 'holiday_overtime_hours': employee.holiday_overtime_hours + self.legal_day, + 'weekend_overtime_hours': employee.weekend_overtime_hours + self.public_holidays + }) + elif self.update_type == 'reduce': + employee.write({ + 'normal_overtime_hours': employee.normal_overtime_hours - self.workday, + 'holiday_overtime_hours': employee.holiday_overtime_hours - self.legal_day, + 'weekend_overtime_hours': employee.weekend_overtime_hours - self.public_holidays + }) + + @api.model + def create(self, vals): + record = super(VacationOverline, self).create(vals) + record._sync_to_employee() + return record + class VacationMealLine(models.Model): _name = 'vacation.meal.line' @@ -112,9 +199,25 @@ class VacationMealLine(models.Model): workflow_record_id = fields.Many2one('soong.workflow.record', string='流程') update_type= fields.Selection([('add', '增加'), ('reduce', '减少')], string='更新类型') update_date = fields.Date(string='更新时间') - update_lines = fields.Text(string='更新额度') + update_lines = fields.Float(string='更新额度') + is_soon = fields.Boolean(string="流程修改") + is_manual = fields.Boolean(string="手动修改") text = fields.Text(string='备注') + @api.model + def create(self, vals): + vals['is_manual'] = True + record = super(VacationMealLine, self).create(vals) + record._sync_to_employee() + return record + + def _sync_to_employee(self): + """将数据同步到关联员工""" + employee = self.vacation_id.employee_id + if self.update_type == 'add': + employee.write({'meal_count': employee.meal_count + int(self.update_lines)}) + elif self.update_type == 'reduce': + employee.write({'meal_count': employee.meal_count - int(self.update_lines)}) class DetailsTree(models.Model): _name = 'details.tree' diff --git a/yuthon_holiday/views/yuthon_vacation_reports_views.xml b/yuthon_holiday/views/yuthon_vacation_reports_views.xml index 6488b5fd1..c49d7a0e4 100644 --- a/yuthon_holiday/views/yuthon_vacation_reports_views.xml +++ b/yuthon_holiday/views/yuthon_vacation_reports_views.xml @@ -30,6 +30,7 @@ + @@ -40,8 +41,12 @@ + + - + + + @@ -75,6 +80,13 @@ code action = model.update_vacation() + + 初始化日志 + + + code + action = model.update_log() + diff --git a/yuthon_hr_attendance/models/overtime_approval.py b/yuthon_hr_attendance/models/overtime_approval.py index 88616dd48..78ba45e44 100644 --- a/yuthon_hr_attendance/models/overtime_approval.py +++ b/yuthon_hr_attendance/models/overtime_approval.py @@ -27,7 +27,8 @@ class OvertimeApprovals(models.Model): employee_ids = fields.Many2many('hr.employee', string="加班人", default=lambda self: self.env['hr.employee'].search([('user_id', '=', self.env.uid)])) related_issues_id = fields.Many2one('issue.library', string="关联议题") documents_ids = fields.Many2many('ir.attachment', string="附件") - duration = fields.Float(string="时长", compute='_compute_duration', store=True) + duration = fields.Float(string="时长", compute='_compute_duration', store=True, help="如果时长大于8则按8小时算") + real_duration = fields.Float(string="实际时长", compute='_compute_duration', store=True, help="如果时长大于8则按实际时长算") overtime_hours = fields.Float(string="本月加班时长") start_time = fields.Datetime(string="开始时间") start_week = fields.Char(string="星期", compute='_compute_weekday') @@ -68,8 +69,13 @@ class OvertimeApprovals(models.Model): for rec in self: if rec.start_time and rec.end_time: rec.duration = round((rec.end_time - rec.start_time).total_seconds() / 3600, 1) + rec.real_duration = rec.duration else: rec.duration = 0.0 + rec.real_duration = 0.0 + + if rec.duration > 8 : + rec.real_duration = 8 @api.depends('start_time', 'end_time') def _compute_weekday(self): @@ -159,11 +165,11 @@ class OvertimeApprovals(models.Model): employee_id = self.env['hr.employee'].search([('id', '=', record.users_id.employee_id.id)]) meal_number = employee_id.meal_number if record.type_overtime == 'work': - employee_id.write({'normal_overtime_hours': employee_id.normal_overtime_hours + record.duration}) + employee_id.write({'normal_overtime_hours': employee_id.normal_overtime_hours + record.real_duration}) elif record.type_overtime == 'weekend': - employee_id.write({'weekend_overtime_hours': employee_id.weekend_overtime_hours + record.duration}) + employee_id.write({'weekend_overtime_hours': employee_id.weekend_overtime_hours + record.real_duration}) else: - employee_id.write({'holiday_overtime_hours': employee_id.holiday_overtime_hours + record.duration}) + employee_id.write({'holiday_overtime_hours': employee_id.holiday_overtime_hours + record.real_duration}) record.overtime_hours = employee_id.holiday_overtime_hours + employee_id.weekend_overtime_hours + employee_id.normal_overtime_hours if self.meal == 'yes': meal_number +=1 @@ -172,30 +178,43 @@ class OvertimeApprovals(models.Model): allocation = self.env['hr.leave.allocation'].create({ 'employee_id': employee_id.id, 'name': '补休', - 'number_of_days': self.duration/7, + 'number_of_days': self.real_duration/7, 'holiday_status_id': holiday_status_id.id, 'allocation_type': 'regular', - "number_of_days_display": self.duration/7, + "number_of_days_display": self.real_duration/7, }) if allocation: allocation.sudo().action_validate() # 创建日志 - overtime_list = [] reports_id = self.env['yuthon.vacation.reports'].search([ ('employee_id', '=', self.users_id.employee_id.id), ]) workflow_record_id = self.env['soong.workflow.record'].search([ ('code', '=', self.code) ]) - overtime_list.append((0, 0, { + workday = 0.0 + legal_day = 0.0 + public_holidays = 0.0 + + if record.type_overtime == 'work': + workday = record.real_duration + elif record.type_overtime == 'weekend': + public_holidays = record.real_duration + elif record.type_overtime == 'holiday': + legal_day = record.real_duration + + overtime_data = { 'vacation_id': reports_id.id, - 'update_type': 'reduce', - 'workflow_record_id': workflow_record_id.id, + 'update_type': 'add', + 'workflow_record_id': workflow_record_id.id if workflow_record_id else False, + 'workday': workday, + 'legal_day': legal_day, + 'public_holidays': public_holidays, 'update_date': fields.Datetime.now(), - 'update_lines': self.duration, + 'is_soon': True, 'text': '审批' - })) - reports_id.write({'overtime_ids': overtime_list}) + } + reports_id.write({'overtime_ids': overtime_data}) @api.depends('users_id', 'duration') def _compute_name(self): diff --git a/yuthon_hr_attendance/views/overtime_approval.xml b/yuthon_hr_attendance/views/overtime_approval.xml index 04136e154..71e0db9ec 100644 --- a/yuthon_hr_attendance/views/overtime_approval.xml +++ b/yuthon_hr_attendance/views/overtime_approval.xml @@ -55,6 +55,7 @@ + diff --git a/yuthon_notice/views/yuthon_notice_views.xml b/yuthon_notice/views/yuthon_notice_views.xml index 9d803fcce..9aba7bd8b 100644 --- a/yuthon_notice/views/yuthon_notice_views.xml +++ b/yuthon_notice/views/yuthon_notice_views.xml @@ -17,7 +17,7 @@