From 4cbb422f42d762d27f4034b7c8711d3d629b1a2a 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: Wed, 3 Dec 2025 11:56:57 +0800
Subject: [PATCH 1/2] =?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
---
.../models/yuthon_regularization_approval.py | 74 ++++++++------
.../yuthon_regularization_approval_views.xml | 99 ++++---------------
.../models/processing_order_approval.py | 53 ++++++----
.../models/property_device_repair.py | 6 +-
.../models/property_report_repair.py | 6 +-
.../views/processing_order_approval_views.xml | 1 +
.../views/property_device_repair_views.xml | 1 -
.../views/property_report_repair.xml | 1 -
8 files changed, 109 insertions(+), 132 deletions(-)
diff --git a/yuthon_hr_employee_approval/models/yuthon_regularization_approval.py b/yuthon_hr_employee_approval/models/yuthon_regularization_approval.py
index 87e8a7024..ac91b1c06 100644
--- a/yuthon_hr_employee_approval/models/yuthon_regularization_approval.py
+++ b/yuthon_hr_employee_approval/models/yuthon_regularization_approval.py
@@ -1,5 +1,6 @@
from odoo import models, fields, api
from odoo.exceptions import UserError
+from dateutil.relativedelta import relativedelta
class YuthonRegularizationPrepareApproval(models.Model):
@@ -8,40 +9,25 @@ class YuthonRegularizationPrepareApproval(models.Model):
_inherit = ['soong.workflow.mixin', 'mail.thread.main.attachment', 'mail.activity.mixin']
name = fields.Char(string="名称")
- department_id = fields.Many2one(related='employee_id.department_id', string="部门")
+ department_id = fields.Many2one(related='users_id.employee_id.department_id', string="部门")
users_id = fields.Many2one('res.users', string="申请人", default=lambda self: self.env.user.id)
- employee_id = fields.Many2one('hr.employee', string="员工姓名")
code = fields.Char(string="编号",
default=lambda self: self.env['ir.sequence'].next_by_code('yuthon_regularization_approval_code'))
- job_id = fields.Many2one(related='employee_id.job_id', string="主岗")
- phone = fields.Char(related='employee_id.mobile_phone', string='手机号')
- onboarding_time = fields.Date(related='employee_id.entry_date', string="入职日期")
- trial_end_date = fields.Date(related='employee_id.open_start_time', string="试用期结束日期")
- parent_id = fields.Many2one(related='employee_id.parent_id',string="直线上级")
- business_leader = fields.Char(string="业务线上级")
+ structure_type_id = fields.Many2one('hr.payroll.structure.type', string="转正前职级")
+ end_date = fields.Date(string="转正日期", compute="_compute_end_date")
+
+ documents_id = fields.Many2one('ir.attachment', string="转正申请书")
+ documents_id1 = fields.Many2one('ir.attachment', string="转正考核表")
+ assessment_rating = fields.Char(string="考核评级")
+ structure_type_id1 = fields.Many2one('hr.payroll.structure.type', string="转正后职级")
+ is_adjust = fields.Boolean(string='是否调整')
+ adjust_reason = fields.Text(string="调整原因")
+ remake = fields.Text(string="备注")
+
is_issues = fields.Boolean(string='是否上会')
issues_result = fields.Html(string="会议结果")
related_issues_id = fields.Many2one('issue.library', string="关联议题")
work_end = fields.Boolean(string="结束")
- # 转正考核
- job_coach = fields.Char(string="工作指导人一")
- job_coach2 = fields.Char(string="工作指导人二")
- scoring_system = fields.Char(string="评分分制")
- appraisal_total = fields.Char(string="考核权重合计")
- trial_scores = fields.Char(string="试用考核得分")
- assessment_date = fields.Date(string="自评日期")
- self_evaluation = fields.Text(string="自我评价")
- employee_pros = fields.Text(string="员工优点")
- improvements = fields.Text(string="需改进事项")
- documents_ids = fields.Many2many('ir.attachment', string="考核文档")
- #转正结果
- positive_results = fields.Char(string="转正结果")
- positive_date = fields.Date(string="转正日期")
- is_salary_adjustments = fields.Boolean(string="是否调整薪资")
- related_notes = fields.Text(string="转正相关说明")
- approval_regularization = fields.Selection([('none', '未发起'), ('done', '已发起')], string='转正审批状态', default='none')
- regularization = fields.Selection([('none', '未发起'), ('done', '已发起')], string='试用期考核状态', default='none')
- regularization_rules = fields.Char(string="转正规则")
urgency_level = fields.Selection([('normal', '普件'), ('urgent', '急件'), ('emergency', '特急件')], string='紧急度',
default='normal')
active = fields.Boolean('Active', default=True, tracking=True)
@@ -52,8 +38,38 @@ class YuthonRegularizationPrepareApproval(models.Model):
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])])
- #试用信息明细行
- trial_assessment_ids = fields.One2many('yuthon.trial.scenario.detail.line', 'regularization_login_id', string="试用期考核方案",help='请选择适用本人主岗的试用考核方案,或直接在下方填写')
+ @api.onchange('structure_type_id1')
+ def _onchange_is_adjust(self):
+ if self.structure_type_id1 and self.structure_type_id1 != self.structure_type_id:
+ self.is_adjust = True
+ else:
+ self.is_adjust = False
+
+ @api.depends('users_id')
+ def _compute_end_date(self):
+ for rec in self:
+ if rec.users_id:
+ rec.end_date = rec.users_id.employee_ids.contract_id.end_date + relativedelta(days=1)
+
+ def end_approval(self):
+ for rec in self:
+ version_str = rec.users_id.employee_ids.contract_id.version.lstrip('V')
+ main_version = version_str.split('.')[0]
+ new_main_version = int(main_version) + 1
+ new_version = f"V{new_main_version}.0"
+ original_contract = rec.employee_ids.contract_id
+ original_contract.write({
+ 'state': 'close',
+ })
+ new_contract_vals = {
+ 'structure_type_id': rec.structure_type_id1.id,
+ 'new_version': new_version,
+ }
+ new_contract = original_contract.with_context(skip_contract_code_check=True).copy(new_contract_vals)
+ rec.employee_id.write({
+ 'contract_id': new_contract.id,
+ })
+
@api.onchange('is_issues')
def _onchange_is_issues(self):
diff --git a/yuthon_hr_employee_approval/views/yuthon_regularization_approval_views.xml b/yuthon_hr_employee_approval/views/yuthon_regularization_approval_views.xml
index 569e5c74c..798d1ec6a 100644
--- a/yuthon_hr_employee_approval/views/yuthon_regularization_approval_views.xml
+++ b/yuthon_hr_employee_approval/views/yuthon_regularization_approval_views.xml
@@ -5,16 +5,10 @@
yuthon.regularization.approval
-
-
-
-
-
-
-
-
-
-
+
+
+
+
@@ -52,87 +46,30 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
-
-
转正申请表
yuthon.regularization.approval
tree,form
-
diff --git a/yuthon_maintain/models/processing_order_approval.py b/yuthon_maintain/models/processing_order_approval.py
index da7ba2e26..cfaa0c67b 100644
--- a/yuthon_maintain/models/processing_order_approval.py
+++ b/yuthon_maintain/models/processing_order_approval.py
@@ -9,12 +9,15 @@ from odoo.exceptions import UserError, ValidationError
class ProcessingOrderApproval(models.Model):
_name = 'processing.order.approval'
_description = '处理单审批'
+ _rec_name = 'display_name'
_inherit = ['soong.workflow.mixin', 'mail.thread.main.attachment', 'mail.activity.mixin']
- name = fields.Char(string='标题', compute='_compute_name', store=True)
+ name = fields.Char(string='标题', store=True)
+ display_name = fields.Char(string='名称', compute='_compute_name',)
code = fields.Char(string="编号",
default=lambda self: self.env['ir.sequence'].next_by_code('processing_order_approval_code'))
- users_id = fields.Many2one('res.users', string="申请人", default=lambda self: self.env.user.id)
+ applicant_id = fields.Many2one('res.users', string="申请人")
+ users_id = fields.Many2one('res.users', string="处理人", default=lambda self: self.env.user.id)
department_id = fields.Many2one(related='users_id.employee_id.department_id', string="部门")
company_id = fields.Many2one(related='users_id.employee_id.company_id', string="公司")
documents_ids = fields.Many2many('ir.attachment', string="维修图片")
@@ -51,7 +54,7 @@ class ProcessingOrderApproval(models.Model):
],
string='故障原因',
)
- processing_results = fields.Selection([('done', '已解决 '), ('undone', '未解决'), ('part', '部分解决')], string="处理结果", default='done')
+ processing_results = fields.Selection([('done', '已解决 '), ('undone', '未解决'), ('part', '部分解决')], string="处理结果", default='undone')
is_fee = fields.Boolean(string="是否产生费用")
labor_costs = fields.Float(string="人工费")
@@ -67,18 +70,6 @@ class ProcessingOrderApproval(models.Model):
name_title = fields.Char(default=_get_default_name_title)
- @api.depends('property_id')
- def _compute_contract_id(self):
- for record in self:
- if record.property_id:
- contract_id = self.env["property.lease.contract.line"].search(
- [('address_id', '=', record.property_id.id)],
- limit=1
- )
- else:
- contract_id = False
- record.contract_id = contract_id.lease_id.id if contract_id else False
-
@api.depends("company_id")
def _compute_name(self):
self.name = False
@@ -87,6 +78,22 @@ class ProcessingOrderApproval(models.Model):
if self.device_id:
self.name = self.device_id.name + '-处理单'
+ @api.depends('property_id')
+ def _compute_contract_id(self):
+ for record in self:
+ contract_id = self.env["property.lease.contract.line"].browse()
+ if record.property_id:
+ contract_id = self.env["property.lease.contract.line"].search(
+ [
+ ('address_id', '=', record.property_id.id),
+ ],
+ limit=1
+ )
+ if contract_id and contract_id.lease_id:
+ record.contract_id = contract_id.lease_id.id
+ else:
+ record.contract_id = None
+
@api.onchange('repair_id')
def _onchange_repair_id(self):
if self.repair_id:
@@ -132,8 +139,18 @@ class ProcessingOrderApproval(models.Model):
'remark': remark
})
-
-
-
+ def end_approval(self):
+ for rec in self:
+ menu_id = self.env['ir.ui.menu'].search([('name', '=', '处理单')])
+ url = f'https://oa.thtzjt.com/web#id={self.id}&cids=2&action={menu_id.action.id}&model=processing.order.approval&view_type=list&menu_id={menu_id.id}'
+ self.sudo().env["wecom.apps"].sync_send_message_textcard(category='oa',
+ user_id=rec.applicant_id.employee_id.wecom_userid,
+ title="处理单",
+ description="你有一份已处理的报时报修",
+ url=url, btntxt="详细信息")
+ if rec.device_id:
+ rec.device_id.report_state = 'done'
+ else:
+ rec.repair_id.report_state = 'done'
diff --git a/yuthon_maintain/models/property_device_repair.py b/yuthon_maintain/models/property_device_repair.py
index 19f9521e8..8e15aaf7a 100644
--- a/yuthon_maintain/models/property_device_repair.py
+++ b/yuthon_maintain/models/property_device_repair.py
@@ -2,6 +2,7 @@
# Part of Odoo. See LICENSE file for full copyright and licensing details.
from odoo import models, fields, api, exceptions, _
+from odoo.exceptions import UserError, ValidationError
class PropertyDeviceRelief(models.Model):
@@ -42,9 +43,12 @@ class PropertyDeviceRelief(models.Model):
def pull_order(self):
soong_workflow_line_list = []
- self.report_state = 'done'
+ if self.env['processing.order.approval'].search([('device_id', '=', self.id)]):
+ raise UserError('该设备已生成处理单')
order_id = self.env['processing.order.approval'].create({
'device_id': self.id,
+ 'applicant_id': self.users_id.id,
+ 'name': self.problem_description,
'code': self.env['ir.sequence'].next_by_code('property_device_repair_code'),
})
workflow_record_id = self.env['soong.workflow.record'].search([
diff --git a/yuthon_maintain/models/property_report_repair.py b/yuthon_maintain/models/property_report_repair.py
index fc6e3c8bf..f229bc25c 100644
--- a/yuthon_maintain/models/property_report_repair.py
+++ b/yuthon_maintain/models/property_report_repair.py
@@ -2,6 +2,7 @@
# Part of Odoo. See LICENSE file for full copyright and licensing details.
from odoo import models, fields, api, exceptions, _
+from odoo.exceptions import UserError
class PropertyRentRelief(models.Model):
@@ -65,10 +66,13 @@ class PropertyRentRelief(models.Model):
self.phone = False
def pull_order(self):
- self.report_state = 'done'
soong_workflow_line_list = []
+ if self.env['processing.order.approval'].search([('repair_id', '=', self.id)]):
+ raise UserError('该设备已生成处理单')
order_id = self.env['processing.order.approval'].create({
'repair_id': self.id,
+ 'applicant_id': self.users_id.id,
+ 'name': self.problem_description,
'code': self.env['ir.sequence'].next_by_code('property_report_repair_code'),
})
workflow_record_id = self.env['soong.workflow.record'].search([
diff --git a/yuthon_maintain/views/processing_order_approval_views.xml b/yuthon_maintain/views/processing_order_approval_views.xml
index 1d298162d..ac5c066f9 100644
--- a/yuthon_maintain/views/processing_order_approval_views.xml
+++ b/yuthon_maintain/views/processing_order_approval_views.xml
@@ -9,6 +9,7 @@
+
diff --git a/yuthon_maintain/views/property_device_repair_views.xml b/yuthon_maintain/views/property_device_repair_views.xml
index 90a8a4615..f4b7e1ae8 100644
--- a/yuthon_maintain/views/property_device_repair_views.xml
+++ b/yuthon_maintain/views/property_device_repair_views.xml
@@ -10,7 +10,6 @@
-
diff --git a/yuthon_maintain/views/property_report_repair.xml b/yuthon_maintain/views/property_report_repair.xml
index f7acc37c2..d8a85f9ca 100644
--- a/yuthon_maintain/views/property_report_repair.xml
+++ b/yuthon_maintain/views/property_report_repair.xml
@@ -12,7 +12,6 @@
-
From 4960f50df0c74a9397cd3939c6494954de15e112 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: Wed, 3 Dec 2025 14:43:26 +0800
Subject: [PATCH 2/2] =?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
---
.../data/employee_recruitment_time_data.xml | 13 +++++++
.../models/yuthon_hr_employee.py | 36 +++++++++++++++++++
.../models/yuthon_regularization_approval.py | 9 ++---
3 files changed, 54 insertions(+), 4 deletions(-)
diff --git a/yuthon_hr_employee/data/employee_recruitment_time_data.xml b/yuthon_hr_employee/data/employee_recruitment_time_data.xml
index 049f68a72..16bf99538 100644
--- a/yuthon_hr_employee/data/employee_recruitment_time_data.xml
+++ b/yuthon_hr_employee/data/employee_recruitment_time_data.xml
@@ -14,5 +14,18 @@
-1
+
+ 定时任务:自动生成转正审批
+
+ code
+ model.regularization_task()
+
+
+ 1
+ days
+
+ -1
+
+
diff --git a/yuthon_hr_employee/models/yuthon_hr_employee.py b/yuthon_hr_employee/models/yuthon_hr_employee.py
index 98a702654..0e7ae35dd 100644
--- a/yuthon_hr_employee/models/yuthon_hr_employee.py
+++ b/yuthon_hr_employee/models/yuthon_hr_employee.py
@@ -189,6 +189,7 @@ class YuthonHrEmployee(models.Model):
string='薪资计算年金人员'
)
salary_year = fields.Integer(compute='_compute_salary_year', store=True)
+ is_create = fields.Boolean(string='是否已创建转正流程审批')
last_year_salary = fields.Float(string="年金基数")
converted = fields.Float(string="折算实际系数")
conversion_factor = fields.Float(string="上年有效计算")
@@ -911,3 +912,38 @@ class YuthonHrEmployee(models.Model):
'number_of_days': total_days,
})
+ def regularization_task(self):
+ today = fields.Date.today()
+ target_date = today + timedelta(days=15)
+ eligible_employees = self.search([
+ ('is_create', '=', False),
+ ('contract_id.is_probation', '=', True),
+ ('contract_id.end_date', '=', target_date),
+ ('contract_id', '!=', False)
+ ])
+ if not eligible_employees:
+ return
+
+ for employee in eligible_employees:
+ contract_structure_type = employee.contract_id.structure_type_id
+ approval_name = f"转正申请表-{employee.name}"
+ self.env['yuthon.regularization.approval'].create({
+ 'name': approval_name,
+ 'users_id': employee.user_id.id,
+ 'create_uid': employee.user_id.id,
+ 'structure_type_id': contract_structure_type.id,
+ 'structure_type_id1': contract_structure_type.id,
+ 'is_adjust': False,
+ })
+ menu_id = self.env['ir.ui.menu'].search([('name', '=', '转正申请表')])
+ url = f'https://oa.thtzjt.com/web#id={self.id}&cids=2&action={menu_id.action.id}&model=yuthon.regularization.approval&view_type=list&menu_id={menu_id.id}'
+ self.sudo().env["wecom.apps"].sync_send_message_textcard(category='oa',
+ user_id=employee.wecom_userid,
+ title="转正申请",
+ description=f"""您好!近期即将开展您的转正流程,现就转正申请事宜温馨提醒如下,确保流程顺利推进:
+ 待办工作流:已为您生成「转正申请审批单」待办任务,可登录 OA 查看处理;
+ 提交时限:请于试用期截止前 1 周(即{employee.contract_id.end_date.year}年{employee.contract_id.end_date.month}月{employee.contract_id.end_date.day}日)完成审批单提交,逾期可能影响转正进度;
+ 材料准备:需同步上传《转正申请书》(可向人事部门索取,企业微信联系人事对接人)。""",
+ url=url, btntxt="详细信息")
+
+ employee.write({'is_create': True})
diff --git a/yuthon_hr_employee_approval/models/yuthon_regularization_approval.py b/yuthon_hr_employee_approval/models/yuthon_regularization_approval.py
index ac91b1c06..ce9a710b8 100644
--- a/yuthon_hr_employee_approval/models/yuthon_regularization_approval.py
+++ b/yuthon_hr_employee_approval/models/yuthon_regularization_approval.py
@@ -57,16 +57,17 @@ class YuthonRegularizationPrepareApproval(models.Model):
main_version = version_str.split('.')[0]
new_main_version = int(main_version) + 1
new_version = f"V{new_main_version}.0"
- original_contract = rec.employee_ids.contract_id
+ original_contract = rec.users_id.employee_ids.contract_id
original_contract.write({
- 'state': 'close',
+ 'state': 'cancel',
})
new_contract_vals = {
'structure_type_id': rec.structure_type_id1.id,
- 'new_version': new_version,
+ 'version': new_version,
+ 'state': 'open',
}
new_contract = original_contract.with_context(skip_contract_code_check=True).copy(new_contract_vals)
- rec.employee_id.write({
+ rec.users_id.employee_ids.write({
'contract_id': new_contract.id,
})