!6809 添加功能

Merge pull request !6809 from 李鹏宇/dev_zhou
This commit is contained in:
李鹏宇
2025-12-03 06:45:24 +00:00
committed by Gitee
10 changed files with 159 additions and 132 deletions
@@ -14,5 +14,18 @@
<field name="numbercall">-1</field>
<field eval="False" name="doall"/>
</record>
<record forcecreate="True" id="yuthon_regularization_time_data" model="ir.cron">
<field name="name">定时任务:自动生成转正审批</field>
<field name="model_id" ref="model_hr_employee"/>
<field name="state">code</field>
<field name="code">model.regularization_task()</field>
<field eval="False" name="active"/>
<field name="user_id" ref="base.user_root"/>
<field name="interval_number">1</field>
<field name="interval_type">days</field>
<field name="nextcall" eval="(DateTime.now()).strftime('%Y-%m-%d 00:00:00')"/>
<field name="numbercall">-1</field>
<field eval="False" name="doall"/>
</record>
</data>
</odoo>
@@ -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})
@@ -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,39 @@ 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.users_id.employee_ids.contract_id
original_contract.write({
'state': 'cancel',
})
new_contract_vals = {
'structure_type_id': rec.structure_type_id1.id,
'version': new_version,
'state': 'open',
}
new_contract = original_contract.with_context(skip_contract_code_check=True).copy(new_contract_vals)
rec.users_id.employee_ids.write({
'contract_id': new_contract.id,
})
@api.onchange('is_issues')
def _onchange_is_issues(self):
@@ -5,16 +5,10 @@
<field name="model">yuthon.regularization.approval</field>
<field name="arch" type="xml">
<tree>
<field name="users_id" string="姓名" widget="ztree_select"/>
<field name="phone"/>
<field name="onboarding_time"/>
<field name="department_id"/>
<field name="job_id"/>
<field name="job_coach" string="导师"/>
<field name="regularization_rules"/>
<field name="approval_regularization"/>
<field name="regularization"/>
<field name="trial_end_date" string="预计转正日期"/>
<field name="users_id"/>
<field name="end_date"/>
<field name="structure_type_id"/>
<field name="structure_type_id1"/>
</tree>
</field>
</record>
@@ -52,87 +46,30 @@
<group>
<field name="issues_result" invisible="is_issues == False"/>
</group>
<group string="员工信息" col="3">
<group>
<field name="users_id" required="1" widget="ztree_select"/>
<field name="department_id"/>
<field name="onboarding_time"/>
<field name="work_end" invisible="1"/>
<field name="business_leader"/>
</group>
<group>
<field name="employee_id" widget="ztree_select"/>
<field name="trial_end_date"/>
<field name="phone"/>
</group>
<group>
<field name="job_id"/>
<field name="parent_id"/>
</group>
<group string="审批详情">
<field name="users_id"/>
<field name="department_id" invisible="1"/>
<field name="end_date"/>
<field name="work_end" invisible="1"/>
<field name="documents_id" widget="preview_many2one"/>
</group>
<group string="转正考核" col="4">
<group>
<field name="job_coach"/>
<field name="trial_scores"/>
</group>
<group>
<field name="job_coach2"/>
<field name="assessment_date"/>
</group>
<group>
<field name="scoring_system"/>
<field name="documents_ids" widget="preview_many2many"/>
</group>
<group>
<field name="appraisal_total"/>
</group>
</group>
<notebook>
<page string="工作详情">
<field name="trial_assessment_ids">
<tree editable="bottom">
<field name="job_responsibilities" required="1"/>
<field name="regularization_login_id" column_invisible="1"/>
<field name="mission_objectives"/>
<field name="completion_flag"/>
<field name="weight"/>
<field name="completion_score"/>
<field name="assessment_scoring"/>
</tree>
</field>
</page>
</notebook>
<group>
<field name="self_evaluation"/>
<field name="employee_pros"/>
<field name="improvements"/>
</group>
<group col="3" string="转正结果">
<group>
<field name="positive_results"/>
<field name="regularization_rules"/>
<field name="related_notes"/>
</group>
<group>
<field name="positive_date"/>
<field name="approval_regularization"/>
</group>
<group>
<field name="is_salary_adjustments"/>
<field name="regularization"/>
</group>
<group string="考核详情">
<field name="documents_id1" widget="preview_many2one"/>
<field name="structure_type_id"/>
<field name="assessment_rating"/>
<field name="structure_type_id1"/>
<field name="is_adjust"/>
<field name="adjust_reason" invisible="is_adjust == False"/>
<field name="remake"/>
</group>
</sheet>
</form>
</field>
</record>
<record id="yuthon_regularization_approval_action" model="ir.actions.act_window">
<field name="name">转正申请表</field>
<field name="res_model">yuthon.regularization.approval</field>
<field name="view_mode">tree,form</field>
</record>
</odoo>
@@ -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'
@@ -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([
@@ -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([
@@ -9,6 +9,7 @@
<button name="pull_accounts" type="object" string="生成应收" class="oe_highlight"/>
</header>
<field name="name"/>
<field name="applicant_id"/>
<field name="users_id"/>
<field name="processing_results"/>
<field name="create_time"/>
@@ -10,7 +10,6 @@
<field name="software_processing_id"/>
<field name="report_state"/>
<field name="create_time"/>
<button name="pull_order" type="object" string="处理" class="btn-primary" invisible="report_state != 'to'"/>
</tree>
</field>
</record>
@@ -12,7 +12,6 @@
<field name="leader_id"/>
<field name="report_state"/>
<field name="create_time"/>
<button name="pull_order" type="object" string="处理" class="btn-primary" invisible="report_state != 'to'"/>
</tree>
</field>
</record>