pengyuthon
This commit is contained in:
@@ -11,7 +11,7 @@
|
|||||||
'license': 'LGPL-3',
|
'license': 'LGPL-3',
|
||||||
'author': 'pengyuthon',
|
'author': 'pengyuthon',
|
||||||
'website': 'https://www.pengyuthon.com',
|
'website': 'https://www.pengyuthon.com',
|
||||||
'depends': ['base', 'hr', 'hr_recruitment','soong_workflow'],
|
'depends': ['base', 'hr', 'hr_recruitment', 'soong_workflow'],
|
||||||
'data': [
|
'data': [
|
||||||
'data/yuthon.job.lv.csv',
|
'data/yuthon.job.lv.csv',
|
||||||
'data/job_lv_groups_data.xml',
|
'data/job_lv_groups_data.xml',
|
||||||
@@ -32,7 +32,6 @@
|
|||||||
'views/inherit_hr_applicant_views.xml',
|
'views/inherit_hr_applicant_views.xml',
|
||||||
'views/publish_applicant_setting_views.xml',
|
'views/publish_applicant_setting_views.xml',
|
||||||
'views/yuthon_job_postings_views.xml',
|
'views/yuthon_job_postings_views.xml',
|
||||||
'views/website_employee_views.xml'
|
|
||||||
],
|
],
|
||||||
'installable': True,
|
'installable': True,
|
||||||
'application': False,
|
'application': False,
|
||||||
|
|||||||
@@ -1,6 +1,4 @@
|
|||||||
from odoo.http import Controller, request, route
|
from odoo.http import Controller, request, route
|
||||||
from datetime import datetime
|
|
||||||
from odoo import models, fields, api, http, SUPERUSER_ID, _
|
|
||||||
|
|
||||||
|
|
||||||
class EmployeeBannerRoute(Controller):
|
class EmployeeBannerRoute(Controller):
|
||||||
@@ -29,24 +27,3 @@ class EmployeeBannerRoute(Controller):
|
|||||||
</div>
|
</div>
|
||||||
"""
|
"""
|
||||||
}
|
}
|
||||||
|
|
||||||
@http.route('/hr/employee/create', type='http', auth="none")
|
|
||||||
def hr_employee_create(self, employee_id=None, **kw):
|
|
||||||
values = {k: v for k, v in request.params.items()}
|
|
||||||
if not employee_id:
|
|
||||||
values['error'] = "缺少员工号"
|
|
||||||
response = request.render('yuthon_hr_employee.website_form_employee', values)
|
|
||||||
response.headers['X-Frame-Options'] = 'SAMEORIGIN'
|
|
||||||
response.headers['Content-Security-Policy'] = "frame-ancestors 'self'"
|
|
||||||
return response
|
|
||||||
|
|
||||||
values['employee_id'] = int(employee_id)
|
|
||||||
if request.httprequest.method == 'POST':
|
|
||||||
record = request.env['hr.employee'].sudo().browse(values['employee_id'])
|
|
||||||
if "name" in values and values.get("name", ""):
|
|
||||||
record.name = values.get("name", "")
|
|
||||||
values["message"] = "员工信息创建成功"
|
|
||||||
response = request.render('yuthon_hr_employee.website_form_employee', values)
|
|
||||||
response.headers['X-Frame-Options'] = 'SAMEORIGIN'
|
|
||||||
response.headers['Content-Security-Policy'] = "frame-ancestors 'self'"
|
|
||||||
return response
|
|
||||||
|
|||||||
@@ -19,6 +19,7 @@ class HrApplicant(models.Model):
|
|||||||
tage_ids = fields.Many2many('applicant.tage.setting', string="应聘标签")
|
tage_ids = fields.Many2many('applicant.tage.setting', string="应聘标签")
|
||||||
is_interview_status = fields.Boolean(string="面试状态")
|
is_interview_status = fields.Boolean(string="面试状态")
|
||||||
|
|
||||||
|
|
||||||
class HrJobType(models.Model):
|
class HrJobType(models.Model):
|
||||||
_name = "hr.job.type"
|
_name = "hr.job.type"
|
||||||
|
|
||||||
|
|||||||
@@ -7,6 +7,12 @@
|
|||||||
<field name="arch" type="xml">
|
<field name="arch" type="xml">
|
||||||
<xpath expr="//form[@class='o_applicant_form']" position="replace">
|
<xpath expr="//form[@class='o_applicant_form']" position="replace">
|
||||||
<form class="o_applicant_form">
|
<form class="o_applicant_form">
|
||||||
|
<div class="oe_title">
|
||||||
|
<label for="name" string="标题"/>
|
||||||
|
<h1>
|
||||||
|
<field name="name"/>
|
||||||
|
</h1>
|
||||||
|
</div>
|
||||||
<group col="4" string="基本信息">
|
<group col="4" string="基本信息">
|
||||||
<group>
|
<group>
|
||||||
<field name="partner_name" required="1" string="姓名"/>
|
<field name="partner_name" required="1" string="姓名"/>
|
||||||
|
|||||||
@@ -1 +1,4 @@
|
|||||||
from . import models
|
from . import models
|
||||||
|
from . import controllers
|
||||||
|
from . import wizard
|
||||||
|
|
||||||
|
|||||||
@@ -38,7 +38,9 @@
|
|||||||
'views/yuthon_appointment_approval_views.xml',
|
'views/yuthon_appointment_approval_views.xml',
|
||||||
'views/yuthon_transfer_approval_views.xml',
|
'views/yuthon_transfer_approval_views.xml',
|
||||||
'views/yuthon_social_files_approval_view.xml',
|
'views/yuthon_social_files_approval_view.xml',
|
||||||
|
'views/website_employee_views.xml',
|
||||||
'views/menuitem.xml',
|
'views/menuitem.xml',
|
||||||
|
'wizard/yuthon_website_employee_wizard.xml'
|
||||||
],
|
],
|
||||||
'installable': True,
|
'installable': True,
|
||||||
'application': False,
|
'application': False,
|
||||||
|
|||||||
@@ -0,0 +1 @@
|
|||||||
|
from . import employee_login
|
||||||
@@ -0,0 +1,32 @@
|
|||||||
|
from odoo.http import Controller, request, route
|
||||||
|
from odoo import models, fields, api, http, SUPERUSER_ID, _
|
||||||
|
|
||||||
|
|
||||||
|
class EmployeeLogin(Controller):
|
||||||
|
|
||||||
|
@http.route('/hr/employee/create', type='http', auth="none")
|
||||||
|
def hr_employee_create(self, employee_id=None, **kw):
|
||||||
|
values = {k: v for k, v in request.params.items()}
|
||||||
|
if not employee_id:
|
||||||
|
values['error'] = "缺少员工号"
|
||||||
|
response = request.render('yuthon_hr_employee_approval.website_form_employee', values)
|
||||||
|
response.headers['X-Frame-Options'] = 'SAMEORIGIN'
|
||||||
|
response.headers['Content-Security-Policy'] = "frame-ancestors 'self'"
|
||||||
|
return response
|
||||||
|
|
||||||
|
values['employee_id'] = int(employee_id)
|
||||||
|
record = request.env['hr.employee'].sudo().browse(values['employee_id'])
|
||||||
|
values['name'] = record.name
|
||||||
|
# 展示字段
|
||||||
|
# values['name'] = record.name
|
||||||
|
if request.httprequest.method == 'POST':
|
||||||
|
if "name" in values and values.get("name", ""):
|
||||||
|
record.name = values.get("name", "")
|
||||||
|
# 记录字段
|
||||||
|
# if "name" in values and values.get("name", ""):
|
||||||
|
# record.name = values.get("name", "")
|
||||||
|
values["message"] = "员工信息创建成功"
|
||||||
|
response = request.render('yuthon_hr_employee_approval.website_form_employee', values)
|
||||||
|
response.headers['X-Frame-Options'] = 'SAMEORIGIN'
|
||||||
|
response.headers['Content-Security-Policy'] = "frame-ancestors 'self'"
|
||||||
|
return response
|
||||||
@@ -45,6 +45,7 @@ class YuthonEducationExperienceLine(models.Model):
|
|||||||
full_time_degree = fields.Char(string="全日制学历学位")
|
full_time_degree = fields.Char(string="全日制学历学位")
|
||||||
major_courses = fields.Char(string="主修课程")
|
major_courses = fields.Char(string="主修课程")
|
||||||
|
|
||||||
|
|
||||||
class YuthonPersonalSkillsSchedule(models.Model):
|
class YuthonPersonalSkillsSchedule(models.Model):
|
||||||
_name = 'yuthon.personal.skills.schedule'
|
_name = 'yuthon.personal.skills.schedule'
|
||||||
_description = "个人技能明细行"
|
_description = "个人技能明细行"
|
||||||
@@ -127,3 +128,7 @@ class HrJobType(models.Model):
|
|||||||
|
|
||||||
name = fields.Char(string="类别名称")
|
name = fields.Char(string="类别名称")
|
||||||
|
|
||||||
|
|
||||||
|
class YuthonPrepareApprovalLine(models.Model):
|
||||||
|
_name = 'yuthon.prepare.approval.line'
|
||||||
|
|
||||||
|
|||||||
@@ -115,9 +115,28 @@ class YuthonMessageLogin(models.Model):
|
|||||||
degree_id_ids = fields.One2many('education.details.line2', 'degree_id', string="学位证")
|
degree_id_ids = fields.One2many('education.details.line2', 'degree_id', string="学位证")
|
||||||
|
|
||||||
certificate_ids = fields.One2many('certificates.detail.line', 'certificate_id', string="专业证书")
|
certificate_ids = fields.One2many('certificates.detail.line', 'certificate_id', string="专业证书")
|
||||||
#
|
|
||||||
#
|
def pub_name_button(self):
|
||||||
#
|
code_url = self.get_base_url() + "/hr/employee/create?employee_id=" + str(self.id)
|
||||||
|
action = {
|
||||||
|
'type': 'ir.actions.act_window',
|
||||||
|
'name': "访问地址",
|
||||||
|
'res_model': 'yuthon.website.employee.wizard',
|
||||||
|
'views': [(False, 'form')],
|
||||||
|
'target': 'new',
|
||||||
|
'context': {
|
||||||
|
'default_employee_url': code_url,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return action
|
||||||
|
# return {
|
||||||
|
# 'warning': {
|
||||||
|
# 'title': '邀请链接',
|
||||||
|
# 'message': code_url
|
||||||
|
# }
|
||||||
|
# }
|
||||||
|
|
||||||
|
|
||||||
class EducationalDetailsLine(models.Model):
|
class EducationalDetailsLine(models.Model):
|
||||||
_name = 'education.details.line'
|
_name = 'education.details.line'
|
||||||
_description = '学历证(全日制)'
|
_description = '学历证(全日制)'
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ class YuthonRecruitmentApproval(models.Model):
|
|||||||
_inherit = 'soong.workflow.mixin'
|
_inherit = 'soong.workflow.mixin'
|
||||||
|
|
||||||
name = fields.Char(string='标题')
|
name = fields.Char(string='标题')
|
||||||
employee_id = fields.Many2one('hr.employee',string='申请人', default=lambda self: self.env.user.employee_id)
|
employee_id = fields.Many2one('hr.employee', string='申请人', default=lambda self: self.env.user.employee_id)
|
||||||
code = fields.Char(string="编号", default=lambda self: self.env['ir.sequence'].next_by_code('yuthon_recruitment_approval_code'))
|
code = fields.Char(string="编号", default=lambda self: self.env['ir.sequence'].next_by_code('yuthon_recruitment_approval_code'))
|
||||||
reason = fields.Html(string="正文")
|
reason = fields.Html(string="正文")
|
||||||
recruitment_ids = fields.One2many('hr.job', 'recruitment_approval_id', string="招聘申请")
|
recruitment_ids = fields.One2many('hr.job', 'recruitment_approval_id', string="招聘申请")
|
||||||
@@ -19,7 +19,6 @@ class YuthonRecruitmentApproval(models.Model):
|
|||||||
('thlc', '天河粮储'), ('tctj', '天投城建')], string="所属公司")
|
('thlc', '天河粮储'), ('tctj', '天投城建')], string="所属公司")
|
||||||
department_id = fields.Many2one("hr.department", string="部门")
|
department_id = fields.Many2one("hr.department", string="部门")
|
||||||
|
|
||||||
|
|
||||||
def put_time_failure(self):
|
def put_time_failure(self):
|
||||||
for record in self:
|
for record in self:
|
||||||
for recruitment in record.recruitment_ids:
|
for recruitment in record.recruitment_ids:
|
||||||
|
|||||||
@@ -31,4 +31,6 @@ access_yuthon_transfer_infor_detail_lines,yuthon_transfer_infor_detail_lines,mod
|
|||||||
access_yuthon_social_files_approval,yuthon_social_files_approval,model_yuthon_social_files_approval,base.group_user,1,1,1,1
|
access_yuthon_social_files_approval,yuthon_social_files_approval,model_yuthon_social_files_approval,base.group_user,1,1,1,1
|
||||||
access_new_prepare_approval_line,new_prepare_approval_line,model_new_prepare_approval_line,base.group_user,1,1,1,1
|
access_new_prepare_approval_line,new_prepare_approval_line,model_new_prepare_approval_line,base.group_user,1,1,1,1
|
||||||
access_interview_approval_line,interview_approval_line,model_interview_approval_line,base.group_user,1,1,1,1
|
access_interview_approval_line,interview_approval_line,model_interview_approval_line,base.group_user,1,1,1,1
|
||||||
access_prepare_approval_line,prepare_approval_line,model_prepare_approval_line,base.group_user,1,1,1,1
|
access_prepare_approval_line,prepare_approval_line,model_prepare_approval_line,base.group_user,1,1,1,1
|
||||||
|
access_yuthon_prepare_approval_line,yuthon_prepare_approval_line,model_yuthon_prepare_approval_line,base.group_user,1,1,1,1
|
||||||
|
access_yuthon_website_employee_wizard,yuthon_website_employee_wizard,model_yuthon_website_employee_wizard,base.group_user,1,1,1,1
|
||||||
|
|||||||
|
+15
-19
@@ -1,6 +1,6 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<odoo>
|
<odoo>
|
||||||
<template id="yuthon_hr_employee.frontend_layout" name="Frontend Layout" inherit_id="web.layout" primary="True">
|
<template id="yuthon_hr_employee_approval.frontend_layout" name="Frontend Layout" inherit_id="web.layout" primary="True">
|
||||||
<xpath expr="//head/meta[last()]" position="after">
|
<xpath expr="//head/meta[last()]" position="after">
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1"/>
|
<meta name="viewport" content="width=device-width, initial-scale=1"/>
|
||||||
</xpath>
|
</xpath>
|
||||||
@@ -37,30 +37,26 @@
|
|||||||
</xpath>
|
</xpath>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<template id="yuthon_hr_employee.website_form_employee" name="website_form_employee">
|
<template id="yuthon_hr_employee_approval.website_form_employee" name="website_form_employee">
|
||||||
<t t-call="yuthon_hr_employee.frontend_layout">
|
<t t-call="yuthon_hr_employee_approval.frontend_layout">
|
||||||
<div class="container py-5">
|
<div class="container py-5">
|
||||||
<form class="oe_website_form_room" role="form" t-attf-action="/hr/employee/create" method="post" onsubmit="this.action = '/hr/employee/create' + location.hash">
|
<form class="oe_website_form_room" role="form" t-attf-action="/hr/employee/create" method="post" onsubmit="this.action = '/hr/employee/create' + location.hash">
|
||||||
<input type="hidden" name="csrf_token" t-att-value="request.csrf_token()"/>
|
<input type="hidden" name="csrf_token" t-att-value="request.csrf_token()"/>
|
||||||
|
|
||||||
<ul class="nav nav-tabs nav-fill" role="tablist">
|
<div class="mb-3 field-room_id">
|
||||||
<li class="nav-item" role="presentation">
|
<label for="employee_id" class="form-label">员工号</label>
|
||||||
<a aria-controls="panel_1" href="#panel_1" t-attf-class="nav-link active" data-bs-toggle="tab" role="tab">第一页</a></li>
|
<input type="text" placeholder="员工号" name="employee_id" t-att-value="employee_id" id="employee_id" t-attf-class="form-control" readonly="readonly"/>
|
||||||
<li class="nav-item" role="presentation">
|
</div>
|
||||||
<a aria-controls="panel_2" href="#panel_2" t-attf-class="nav-link" data-bs-toggle="tab" role="tab">第二页</a></li>
|
|
||||||
</ul>
|
|
||||||
|
|
||||||
<div class="tab-content">
|
<div class="mb-3 field-room_id">
|
||||||
<div role="tabpanel" id="panel_1" t-attf-class="tab-pane active bg-100">
|
<label for="name" class="form-label">姓名</label>
|
||||||
<div class="mb-3 field-room_id">
|
<input type="text" placeholder="姓名" name="name" t-att-value="name" id="name" t-attf-class="form-control"/>
|
||||||
<label for="employee_id" class="form-label">员工号</label>
|
|
||||||
<input type="text" placeholder="员工号" name="employee_id" t-att-value="employee_id" id="employee_id" t-attf-class="form-control" readonly="readonly"/>
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
<div role="tabpanel" id="panel_2" t-attf-class="tab-pane bg-100">
|
<!-- 添加其他字段-->
|
||||||
222
|
<!-- <div class="mb-3 field-room_id">-->
|
||||||
</div>
|
<!-- <label for="name" class="form-label">姓名</label>-->
|
||||||
</div>
|
<!-- <input type="text" placeholder="姓名" name="name" t-att-value="name" id="name" t-attf-class="form-control"/>-->
|
||||||
|
<!-- </div>-->
|
||||||
|
|
||||||
<p class="alert alert-danger" t-if="error" role="alert">
|
<p class="alert alert-danger" t-if="error" role="alert">
|
||||||
<t t-esc="error"/>
|
<t t-esc="error"/>
|
||||||
@@ -16,6 +16,9 @@
|
|||||||
<field name="arch" type="xml">
|
<field name="arch" type="xml">
|
||||||
<form>
|
<form>
|
||||||
<sheet>
|
<sheet>
|
||||||
|
<header>
|
||||||
|
<button name="pub_name_button" string="发送邀请链接" type="object" class='btn btn-primary'/>
|
||||||
|
</header>
|
||||||
<field name="image_1920" widget="image" class="oe_avatar" options="{'preview_image': 'image_128'}"/>
|
<field name="image_1920" widget="image" class="oe_avatar" options="{'preview_image': 'image_128'}"/>
|
||||||
<div class="oe_title">
|
<div class="oe_title">
|
||||||
<label for="name" string="名称"/>
|
<label for="name" string="名称"/>
|
||||||
|
|||||||
@@ -0,0 +1,7 @@
|
|||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
|
from . import yuthon_website_employee_wizard
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -0,0 +1,9 @@
|
|||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
from odoo import models, api, fields, _
|
||||||
|
from odoo.exceptions import UserError
|
||||||
|
|
||||||
|
|
||||||
|
class WebsiteEmployeeWizard(models.Model):
|
||||||
|
_name = "yuthon.website.employee.wizard"
|
||||||
|
|
||||||
|
employee_url = fields.Char(string='访问地址')
|
||||||
@@ -0,0 +1,14 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<odoo>
|
||||||
|
<record id="view_yuthon_website_employee_wizard" model="ir.ui.view">
|
||||||
|
<field name="name">访问地址</field>
|
||||||
|
<field name="model">yuthon.website.employee.wizard</field>
|
||||||
|
<field name="arch" type="xml">
|
||||||
|
<form create="false" edit="false" delete="false">
|
||||||
|
<div class="col-12 text-center">
|
||||||
|
<field name="employee_url" readonly="1"/>
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
</field>
|
||||||
|
</record>
|
||||||
|
</odoo>
|
||||||
@@ -6,9 +6,9 @@
|
|||||||
<field name="active">False</field>
|
<field name="active">False</field>
|
||||||
</record>
|
</record>
|
||||||
<!-- 人事 -->
|
<!-- 人事 -->
|
||||||
<!-- <record id="hr.menu_hr_root" model="ir.ui.menu">-->
|
<!-- <record id="hr.menu_hr_root" model="ir.ui.menu">-->
|
||||||
<!-- <field name="active">False</field>-->
|
<!-- <field name="active">False</field>-->
|
||||||
<!-- </record>-->
|
<!-- </record>-->
|
||||||
<!-- 出勤 -->
|
<!-- 出勤 -->
|
||||||
<record id="hr_attendance.menu_hr_attendance_root" model="ir.ui.menu">
|
<record id="hr_attendance.menu_hr_attendance_root" model="ir.ui.menu">
|
||||||
<field name="active">False</field>
|
<field name="active">False</field>
|
||||||
@@ -77,9 +77,7 @@
|
|||||||
name="招聘列表"
|
name="招聘列表"
|
||||||
parent="hr_recruitment_menu_root_board"
|
parent="hr_recruitment_menu_root_board"
|
||||||
action="hr_recruitment.crm_case_categ0_act_job"
|
action="hr_recruitment.crm_case_categ0_act_job"
|
||||||
sequence="3"/>
|
sequence="2"/>
|
||||||
|
|
||||||
|
|
||||||
<menuitem id="hr_menu_recruitment_process"
|
<menuitem id="hr_menu_recruitment_process"
|
||||||
name="流程"
|
name="流程"
|
||||||
parent="hr_recruitment_menu_root_board"
|
parent="hr_recruitment_menu_root_board"
|
||||||
@@ -104,11 +102,7 @@
|
|||||||
parent="hr_menu_recruitment_process"
|
parent="hr_menu_recruitment_process"
|
||||||
action="yuthon_hr_employee_approval.yuthon_message_login_action"
|
action="yuthon_hr_employee_approval.yuthon_message_login_action"
|
||||||
sequence="9"/>
|
sequence="9"/>
|
||||||
<menuitem id="hr_menu_prepare_approval"
|
|
||||||
name="编制调整申请表"
|
|
||||||
parent="hr_menu_recruitment_process"
|
|
||||||
action="yuthon_hr_employee_approval.yuthon_prepare_approval_action"
|
|
||||||
sequence="11"/>
|
|
||||||
<menuitem id="hr_recruitment_setting_menu_board"
|
<menuitem id="hr_recruitment_setting_menu_board"
|
||||||
name="配置"
|
name="配置"
|
||||||
parent="hr_recruitment_menu_root_board"
|
parent="hr_recruitment_menu_root_board"
|
||||||
@@ -195,7 +189,7 @@
|
|||||||
parent="hr_employee_menu_root_board"
|
parent="hr_employee_menu_root_board"
|
||||||
action="hr.action_hr_job"
|
action="hr.action_hr_job"
|
||||||
sequence="5"/>
|
sequence="5"/>
|
||||||
<menuitem id="hr_set_role_menu_root_board"
|
<menuitem id="hr_set_role_menu_root_board"
|
||||||
name="角色管理"
|
name="角色管理"
|
||||||
parent="hr_employee_menu_root_board"
|
parent="hr_employee_menu_root_board"
|
||||||
action="soong_workflow.view_soong_user_role_action"
|
action="soong_workflow.view_soong_user_role_action"
|
||||||
@@ -219,8 +213,13 @@
|
|||||||
parent="hr_set_process_menu_root_board"
|
parent="hr_set_process_menu_root_board"
|
||||||
action="yuthon_hr_employee_approval.yuthon_regularization_approval_action"
|
action="yuthon_hr_employee_approval.yuthon_regularization_approval_action"
|
||||||
sequence="1"/>
|
sequence="1"/>
|
||||||
|
<menuitem id="hr_menu_prepare_approval_board"
|
||||||
|
name="编制调整申请表"
|
||||||
|
parent="hr_set_process_menu_root_board"
|
||||||
|
action="yuthon_hr_employee_approval.yuthon_prepare_approval_action"
|
||||||
|
sequence="2"/>
|
||||||
<menuitem id="hr_menu_reassignment_approval_root_board"
|
<menuitem id="hr_menu_reassignment_approval_root_board"
|
||||||
name="调岗申请"
|
name="调岗申请表"
|
||||||
parent="hr_set_process_menu_root_board"
|
parent="hr_set_process_menu_root_board"
|
||||||
action="yuthon_hr_employee_approval.yuthon_reassignment_approval_action"
|
action="yuthon_hr_employee_approval.yuthon_reassignment_approval_action"
|
||||||
sequence="3"/>
|
sequence="3"/>
|
||||||
|
|||||||
Reference in New Issue
Block a user