From b5382bcad0bce83eb3311ac6de52eb55681193ae Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=B9=8F=E5=AE=87?= <9664676+pengyuthon@user.noreply.gitee.com> Date: Sun, 12 Oct 2025 16:12:01 +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 --- yuthon_hr_attendance/models/hr_attendance.py | 40 ++++++++----- .../models/hr_attendance_detail_wechat.py | 2 +- .../views/hr_attendance_views.xml | 4 ++ yuthon_official/views/official_menus.xml | 5 ++ .../models/property_meter_archives.py | 2 +- .../models/property_meter_water.py | 2 +- yuthon_property/wizard/meter_price_wizard.py | 2 +- yuthon_trade/__manifest__.py | 1 + yuthon_trade/data/sale_renting_code_data.xml | 7 +++ yuthon_trade/models/__init__.py | 1 + .../models/yuthon_business_approval.py | 1 + .../models/yuthon_contract_addition.py | 46 ++++++++++++++ yuthon_trade/security/ir.model.access.csv | 2 +- .../views/yuthon_contract_addition_views.xml | 60 +++++++++++++++++++ 14 files changed, 155 insertions(+), 20 deletions(-) create mode 100644 yuthon_trade/models/yuthon_contract_addition.py create mode 100644 yuthon_trade/views/yuthon_contract_addition_views.xml diff --git a/yuthon_hr_attendance/models/hr_attendance.py b/yuthon_hr_attendance/models/hr_attendance.py index e7dfd8cd7..ab33e285f 100644 --- a/yuthon_hr_attendance/models/hr_attendance.py +++ b/yuthon_hr_attendance/models/hr_attendance.py @@ -45,6 +45,8 @@ class HrAttendance(models.Model): abnormal = fields.Integer(string="异常计算") shift_id = fields.Many2one('planning.slot', string="班次", store=True) shift_name = fields.Char(string="班次", store=True) + is_week = fields.Boolean(string="是否为周末") + is_holiday = fields.Boolean(string="是否为节假日") noon_duty = fields.Datetime(string="中值") night_duty = fields.Datetime(string="晚值") is_approval = fields.Boolean(string="是否审批修正", default=False) @@ -58,7 +60,6 @@ class HrAttendance(models.Model): workflow_id = fields.Many2one('soong.workflow.record', string="流程") is_month = fields.Boolean(string="是否为本月数据", compute='_compute_month_status', store=True) is_last_month = fields.Boolean(string="是否为上月数据", compute='_compute_month_status', store=True) - is_holiday = fields.Boolean(string="是否是假期") correct_result = fields.Text(string="修正原因") def create_attendance_data_holiday(self): @@ -122,8 +123,8 @@ class HrAttendance(models.Model): for att in self.env["hr.attendance"].browse(self._context.get('active_ids', self._context.get('active_id'))): current_data = fields.Datetime.to_datetime(att.current_data) + timedelta(hours=8) self.env["hr.attendance.detail"].compute_attendance_detail(att.employee_id, current_data.date(), is_manual=True) - if att.employee_id.company_id.name in ['集团本部', '天河粮储']: - att.shift_name = '行政班次' + # if att.employee_id.company_id.name in ['集团本部', '天河粮储']: + # att.shift_name = '行政班次' # planning_slots = self.env['planning.slot'].search([ # ('employee_id', '=', att.employee_id.id), # ('start_datetime', '=', att.current_data), @@ -1156,26 +1157,35 @@ class HrAttendance(models.Model): shift_days_list = [] is_shift_replacement = False - is_leave_day = False + is_holiday = False is_weekend = False + # 判断排班员工 + planning_ids = self.env['planning.role'].search([('name', 'in', ['保安部', '工程部', '联安粮储'])]) + related_resources = set() + for role in planning_ids: + if role.resource_ids: + related_resources.update(role.resource_ids.ids) + related_resources_set = self.env['resource.resource'].browse(related_resources) + if record.employee_id.resource_id in related_resources_set: + record.shift_name = '休息' + record.is_week = True + continue if record.current_data: - # 查询休假记录(假设"行政考勤工作日"是calendar_id的name) leave_records = self.env['resource.calendar.leaves'].search([ ("calendar_id.name", "=", "行政考勤工作日") ]) - - # 检查是否为休假日期 + # 检查是否为节假日 for leave in leave_records: if leave.date_from and leave.date_to: from_date = fields.Date.to_date(leave.date_from) + timedelta(days=1) to_date = fields.Date.to_date(leave.date_to) + timedelta(days=1) if from_date <= record.current_data <= to_date: - is_leave_day = True + is_holiday = True # 标记为节假日 + # 收集调班补班日期 if leave.shift_replacement_day: shift_days_list.extend(leave.shift_replacement_day.split(',')) - # 检查是否为调班补班日 target_day_str = f"{record.current_data.month}月{record.current_data.day}日" if target_day_str in shift_days_list: @@ -1186,16 +1196,16 @@ class HrAttendance(models.Model): if weekday in [6, 7]: # 6=周六,7=周日 is_weekend = True - # 设置班次名称 - if is_leave_day: - record.shift_name = '' - elif is_shift_replacement: + if is_shift_replacement: record.shift_name = '行政班次' - elif is_weekend: - record.shift_name = '' + elif is_weekend or is_holiday: + record.shift_name = '休息' else: record.shift_name = '行政班次' + record.is_week = is_weekend + record.is_holiday = is_holiday + @api.model def create(self, vals): record = super(HrAttendance, self).create(vals) diff --git a/yuthon_hr_attendance/models/hr_attendance_detail_wechat.py b/yuthon_hr_attendance/models/hr_attendance_detail_wechat.py index aa72f8079..94bee2ecb 100644 --- a/yuthon_hr_attendance/models/hr_attendance_detail_wechat.py +++ b/yuthon_hr_attendance/models/hr_attendance_detail_wechat.py @@ -172,7 +172,7 @@ class HrAttendanceDetail(models.Model): ('employee_id', '=', employee.id), ('start_datetime', '>=', slot_start), ('start_datetime', '<', slot_end), - ]) + ], limit=1) planning_name = planning_slots.planning_name if planning_slots else None template_domain = [] if planning_name: diff --git a/yuthon_hr_attendance/views/hr_attendance_views.xml b/yuthon_hr_attendance/views/hr_attendance_views.xml index 21e87dc3a..3a2bee653 100644 --- a/yuthon_hr_attendance/views/hr_attendance_views.xml +++ b/yuthon_hr_attendance/views/hr_attendance_views.xml @@ -7,6 +7,8 @@
@@ -27,6 +29,8 @@ + + diff --git a/yuthon_official/views/official_menus.xml b/yuthon_official/views/official_menus.xml index f9315f94c..501c77eee 100644 --- a/yuthon_official/views/official_menus.xml +++ b/yuthon_official/views/official_menus.xml @@ -75,6 +75,11 @@ parent="administrative_offices_root_board" action="yuthon_trade.view_business_approval_action" sequence="70"/> + 3 + + 合同补充协议 + yuthon_contract_addition_code + BC%(y)s%(month)s%(day)s + 3 + + 节日慰问编号 property_work_condolences_code diff --git a/yuthon_trade/models/__init__.py b/yuthon_trade/models/__init__.py index 9ed543759..4b7a3b1c2 100644 --- a/yuthon_trade/models/__init__.py +++ b/yuthon_trade/models/__init__.py @@ -26,3 +26,4 @@ from . import inherit_workflow_record from . import trade_project_approval from . import parking_fee_approval from . import yuthon_social_transfer +from . import yuthon_contract_addition diff --git a/yuthon_trade/models/yuthon_business_approval.py b/yuthon_trade/models/yuthon_business_approval.py index 4c543dc03..cf06d5a76 100644 --- a/yuthon_trade/models/yuthon_business_approval.py +++ b/yuthon_trade/models/yuthon_business_approval.py @@ -3,6 +3,7 @@ from odoo import models, fields, api, exceptions, _ + class YuthonBusinessApproval(models.Model): _name = 'yuthon.business.approval' _description = '业务审批' diff --git a/yuthon_trade/models/yuthon_contract_addition.py b/yuthon_trade/models/yuthon_contract_addition.py new file mode 100644 index 000000000..5754676f2 --- /dev/null +++ b/yuthon_trade/models/yuthon_contract_addition.py @@ -0,0 +1,46 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +from odoo import models, fields, api, exceptions, _ + + +class YuthonContractAddition(models.Model): + _name = 'yuthon.contract.addition' + _description = '合同补充协议' + _inherit = ['soong.workflow.mixin', 'mail.thread.main.attachment', 'mail.activity.mixin'] + + name = fields.Char(string='标题') + code = fields.Char(string="流水号", + default=lambda self: self.env['ir.sequence'].next_by_code('yuthon_contract_addition_code')) + users_id = fields.Many2one('res.users', string="申请人", default=lambda self: self.env.user.id) + urgency_level = fields.Selection([('normal', '普件'), ('urgent', '急件'), ('emergency', '特急件')], string='紧急度', + default='normal') + department_id = fields.Many2one(related='users_id.employee_id.department_id', string="部门") + is_issues = fields.Boolean(string='是否上会') + issues_result = fields.Html(string="会议结果") + related_issues_id = fields.Many2one('issue.library', string="关联议题") + reason = fields.Text(string="正文") + document_ids = fields.Many2many('ir.attachment', string="附件") + active = fields.Boolean('Active', default=True, tracking=True) + work_end = fields.Boolean(string="结束") + + def _get_default_name_title(self): + return self._description if self._description else self._name + + name_title = fields.Char(default=_get_default_name_title) + self_users_ids = fields.Many2many('res.users', string="当前经办人", default=lambda self: [(6, 0, [self.env.user.id])]) + + @api.onchange('is_issues') + def _onchange_is_issues(self): + if self.is_issues: + issue_id = self.env['issue.library'].create({'name': self.name, 'is_invisible_workflow': True}) + self.related_issues_id = issue_id.id + self.env['issue.library.approval.line'].create({ + 'issue_library_id': issue_id.id, + 'workflow_name': self.name, + 'approval_type': self.workflow_id.name, + 'res_model': self._name, + 'res_id': self.id, + 'code': self.code, + 'approval_date': fields.Datetime.now(), + }) \ No newline at end of file diff --git a/yuthon_trade/security/ir.model.access.csv b/yuthon_trade/security/ir.model.access.csv index c0179d160..85114e8ec 100644 --- a/yuthon_trade/security/ir.model.access.csv +++ b/yuthon_trade/security/ir.model.access.csv @@ -37,6 +37,6 @@ access_parking_fee_approval,parking_fee_approval,model_parking_fee_approval,base access_project_classify_setting,project_classify_setting,model_project_classify_setting,base.group_user,1,1,1,1 access_yuthon_social_transfer,yuthon_social_transfer,model_yuthon_social_transfer,base.group_user,1,1,1,1 - +access_yuthon_contract_addition,yuthon_contract_addition,model_yuthon_contract_addition,base.group_user,1,1,1,1 diff --git a/yuthon_trade/views/yuthon_contract_addition_views.xml b/yuthon_trade/views/yuthon_contract_addition_views.xml new file mode 100644 index 000000000..3351629c5 --- /dev/null +++ b/yuthon_trade/views/yuthon_contract_addition_views.xml @@ -0,0 +1,60 @@ + + + + yuthon.contract.addition.tree + yuthon.contract.addition + + + + + + + + yuthon.contract.addition.form + yuthon.contract.addition + +
+ + + + + + + + + + + + + + + + + + +
+

+ +

+
+ + + + + + + + +
+
+
+
+ + 合同补充协议 + yuthon.contract.addition + tree,form + +