pengyuthon
This commit is contained in:
@@ -8,6 +8,7 @@
|
||||
"depends": ["base", "crnd_web_diagram_plus", "hr"],
|
||||
"data": [
|
||||
"data/soong_workflow_note_data.xml",
|
||||
"data/soong_workflow_inspector_code.xml",
|
||||
"security/soong_workflow_security.xml",
|
||||
"security/ir.model.access.csv",
|
||||
"views/kklw_workflow_approval_views.xml",
|
||||
@@ -22,10 +23,13 @@
|
||||
"views/soong_approval_group.xml",
|
||||
"views/trans_link_views.xml",
|
||||
"views/soong_workflow_entrust_views.xml",
|
||||
"views/menuitem.xml",
|
||||
"views/soong_workflow_inspector_views.xml",
|
||||
'wizard/approval_notice_wizard_views.xml',
|
||||
"wizard/soong_workflow_comment_wizard_view.xml",
|
||||
"templates/soong_workflow_templates.xml",
|
||||
|
||||
|
||||
"views/menuitem.xml",
|
||||
],
|
||||
"installable": True,
|
||||
"auto_install": False,
|
||||
|
||||
@@ -1,2 +0,0 @@
|
||||
1. 预置审批分组
|
||||
2. 我的请求要开发
|
||||
@@ -0,0 +1,9 @@
|
||||
<?xml version="1.0" encoding="UTF-8" ?>
|
||||
<odoo>
|
||||
<record id="inspector_code_data" model="ir.sequence">
|
||||
<field name="name">督办编号</field>
|
||||
<field name="code">inspector_code</field>
|
||||
<field name="prefix">IC%(y)s%(month)s%(day)s</field>
|
||||
<field name="padding">3</field>
|
||||
</record>
|
||||
</odoo>
|
||||
@@ -14,3 +14,4 @@ from . import soong_workflow_log
|
||||
from . import soong_approval_group
|
||||
from . import trans_link
|
||||
from . import soong_workflow_entrust
|
||||
from . import soong_workflow_inspector
|
||||
|
||||
@@ -0,0 +1,62 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
import logging
|
||||
import datetime
|
||||
from odoo import models, fields, api, _, modules
|
||||
from odoo.exceptions import ValidationError, UserError
|
||||
|
||||
|
||||
class SoongWorkflowInspector(models.Model):
|
||||
_name = "soong.workflow.inspector"
|
||||
_description = "督查督办"
|
||||
|
||||
name = fields.Char(string="督办主题")
|
||||
start_data = fields.Date(string="开始日期")
|
||||
end_data = fields.Date(string="结束日期")
|
||||
code = fields.Char(string="督办编号", default=lambda self: self.env['ir.sequence'].next_by_code('inspector_code'))
|
||||
department_id = fields.Many2one('hr.department', string="部门")
|
||||
inspector_importance = fields.Selection([('normal', '正常'), ('urgent', '紧急')], string="重要程度")
|
||||
inspector_html = fields.Html(string="督办内容")
|
||||
inspector_text = fields.Text(string="督办要求")
|
||||
document_id = fields.Binary(string="附件")
|
||||
inspector_line_ids = fields.One2many('soong.workflow.inspector.line', 'workflow_inspector_id', string='任务进度')
|
||||
inspector_line2_ids = fields.One2many('soong.workflow.inspector.line2', 'workflow_inspector_id', string='督办明细')
|
||||
attachment_ids = fields.Many2many('ir.attachment', string='Attachments')
|
||||
|
||||
|
||||
class SoongWorkflowInspectorLine(models.Model):
|
||||
_name = "soong.workflow.inspector.line"
|
||||
_description = "任务进度"
|
||||
|
||||
workflow_inspector_id = fields.Many2one('soong.workflow.inspector', string="督办标题")
|
||||
department_id = fields.Many2one('hr.department', string="部门")
|
||||
task_text = fields.Text(string="内容")
|
||||
end_data = fields.Date(string="截止日期")
|
||||
task_state = fields.Selection([('no', '未办结'), ('ing', '进行中'), ('ed', '已超时'), ('done', '已办结')], string="状态")
|
||||
employee_id = fields.Many2one('hr.employee', string="上级负责人")
|
||||
|
||||
|
||||
# 办结
|
||||
def inspector_task_done(self):
|
||||
pass
|
||||
|
||||
# 任务下发
|
||||
def inspector_task_issued(self):
|
||||
pass
|
||||
|
||||
# 延期
|
||||
def long_end_data(self):
|
||||
pass
|
||||
|
||||
|
||||
class SoongWorkflowInspectorLine2(models.Model):
|
||||
_name = "soong.workflow.inspector.line2"
|
||||
_description = "督办事项明细"
|
||||
|
||||
workflow_inspector_id = fields.Many2one('soong.workflow.inspector', string="督办事项")
|
||||
department_id = fields.Many2one('hr.department', string="部门")
|
||||
employee_id = fields.Many2one('hr.employee', string="部门负责人")
|
||||
end_data = fields.Date(string="截止日期")
|
||||
inspector_line_text = fields.Text(string="工作内容")
|
||||
|
||||
|
||||
|
||||
@@ -66,6 +66,7 @@ class SoongWorkflowMixin(models.AbstractModel):
|
||||
approval_users_ids = fields.One2many("soong.approval.users", "res_id",
|
||||
domain=lambda self: [('res_model', '=', self._name)], auto_join=True,
|
||||
string="审批明细")
|
||||
approval_sign_ids = fields.Many2many('res.users', string="加签人员")
|
||||
|
||||
@api.depends("state")
|
||||
def _compute_workflow_id(self):
|
||||
@@ -152,9 +153,11 @@ class SoongWorkflowMixin(models.AbstractModel):
|
||||
def _add_comment(self, logs, btn_rec):
|
||||
wizard = self.env.ref("soong_workflow.view_soong_workflow_comment_wizard")
|
||||
# 状态列表
|
||||
state_list = ['拟办' if i.node_name == 'start' else i.node_name for i in btn_rec.node_id.workflow_id.node_ids]
|
||||
state_list = ['拟办' if i.node_name == 'start' else i.node_name for i in btn_rec.workflow_id.node_ids]
|
||||
# 当前节点状态
|
||||
self_state = state_list.index('拟办' if self.state == 'start' else self.state)
|
||||
# 下一个节点
|
||||
next_state = btn_rec.workflow_id.node_ids[self_state + 1].button_ids[0]
|
||||
self.env['trans.link'].search([]).unlink()
|
||||
if btn_rec.name == '转交' and len(btn_rec.node_id.out_link_ids) > 1:
|
||||
for state in btn_rec.node_id.out_link_ids:
|
||||
@@ -172,6 +175,13 @@ class SoongWorkflowMixin(models.AbstractModel):
|
||||
'link_type': 'return',
|
||||
'record_id': self.id,
|
||||
})
|
||||
|
||||
# 不自动匹配
|
||||
employee_user_role_ids = self.env['hr.employee'].search([('user_role_id', '=', next_state.users_role_id.id)])
|
||||
# 自动匹配
|
||||
employee_user_role_id = self.env['hr.employee'].search([('user_role_id', '=', next_state.users_role_id.id),
|
||||
('department_id', '=', self.department_id.id)])
|
||||
|
||||
return {
|
||||
"name": _("评论"),
|
||||
"type": "ir.actions.act_window",
|
||||
@@ -184,6 +194,8 @@ class SoongWorkflowMixin(models.AbstractModel):
|
||||
"default_res_id": self.id,
|
||||
"default_res_model": self._name,
|
||||
"default_log_ids": logs.ids,
|
||||
"default_is_automatic": next_state.is_automatic,
|
||||
"default_employee_ids": employee_user_role_ids.ids if not next_state.is_automatic else employee_user_role_id.ids,
|
||||
"default_node_btn_id": btn_rec.id,
|
||||
"default_node_link_len": '转交2' if len(btn_rec.node_id.out_link_ids) > 1 and btn_rec.name == '转交' else '',
|
||||
},
|
||||
@@ -262,6 +274,7 @@ class SoongWorkflowMixin(models.AbstractModel):
|
||||
res = self._update_fields_view(view_type, res)
|
||||
# res = self._add_state_tree_view(view_type, res)
|
||||
res = self._add_soong_workflow_log(view_type, res, params)
|
||||
res = self._load_sign_view(view_type, res)
|
||||
return res
|
||||
|
||||
# 收回
|
||||
@@ -564,10 +577,31 @@ class SoongWorkflowMixin(models.AbstractModel):
|
||||
res["arch"] = etree.tostring(arch, encoding="unicode").replace("\t", "")
|
||||
return res
|
||||
|
||||
def create_field_element(self, field_name):
|
||||
field_el = etree.Element("field")
|
||||
field_el.set("name", field_name)
|
||||
return field_el
|
||||
def _load_sign_view(self, view_type, res):
|
||||
arch = etree.fromstring(res["arch"])
|
||||
if view_type == "form":
|
||||
sheet_el = arch.xpath("//sheet")
|
||||
if sheet_el:
|
||||
sheet_el = sheet_el[0]
|
||||
else:
|
||||
sheet_el = etree.Element("sheet")
|
||||
arch.insert(0, sheet_el)
|
||||
notebook_el = sheet_el.xpath(".//notebook")
|
||||
if notebook_el:
|
||||
notebook_el = notebook_el[0]
|
||||
else:
|
||||
notebook_el = etree.Element("notebook")
|
||||
sheet_el.append(notebook_el)
|
||||
page_el = etree.Element("page")
|
||||
page_el.set("string", "加签人员") # 设置页面标签
|
||||
# page_el.set("invisible", "1") # todo domain
|
||||
field_m2m_el = etree.Element("field")
|
||||
field_m2m_el.set("name", "approval_sign_ids")
|
||||
field_m2m_el.set("widget", "many2many_tags")
|
||||
page_el.append(field_m2m_el)
|
||||
notebook_el.append(page_el)
|
||||
res["arch"] = etree.tostring(arch, encoding="unicode").replace("\t", "")
|
||||
return res
|
||||
|
||||
def _update_fields_view(self, view_type, res):
|
||||
"""
|
||||
|
||||
@@ -127,6 +127,23 @@ class SoongWorkflowNode(models.Model):
|
||||
"action_type": "code",
|
||||
"code": "obj.action_withdraw()",
|
||||
},),
|
||||
(0, 0, {
|
||||
"name": _("加签"),
|
||||
"workflow_id": val['workflow_id'],
|
||||
"sequence": 3,
|
||||
"action_type": "code",
|
||||
"has_comment": True,
|
||||
},),
|
||||
(0, 0, {
|
||||
"name": _("加签确认"),
|
||||
"workflow_id": val['workflow_id'],
|
||||
"sequence": 3,
|
||||
"action_type": "code",
|
||||
"btn_hide": True,
|
||||
"review_type": 'expression',
|
||||
# "reviewer_expression": "obj.action_withdraw()", # todo domain
|
||||
"has_comment": True,
|
||||
},),
|
||||
(0, 0, {
|
||||
"name": _("退回"),
|
||||
"workflow_id": val['workflow_id'],
|
||||
@@ -205,18 +222,13 @@ class SoongWorkflowNodeButton(models.Model):
|
||||
sequence = fields.Integer(
|
||||
string="Sequence", default=10, help="Arrange buttons by defining sequence."
|
||||
)
|
||||
is_highlight = fields.Boolean(
|
||||
string="Is Highlighted",
|
||||
default=True,
|
||||
help="Control highlighting of the button if needs user attention..",
|
||||
)
|
||||
is_highlight = fields.Boolean(string="Is Highlighted", default=True,
|
||||
help="Control highlighting of the button if needs user attention..", )
|
||||
has_icon = fields.Boolean(
|
||||
string="Has Icon", help="Enable it to add icon to the button."
|
||||
)
|
||||
icon = fields.Char(
|
||||
string="Icon",
|
||||
help="Enter icon name like: fa-print, it's recommended to use FontAwesome Icons.",
|
||||
)
|
||||
icon = fields.Char(string="Icon",
|
||||
help="Enter icon name like: fa-print, it's recommended to use FontAwesome Icons.", )
|
||||
has_comment = fields.Boolean(string="评论", default=False)
|
||||
btn_key = fields.Char(string="Button Key", default=_generate_key)
|
||||
btn_hide = fields.Boolean(
|
||||
@@ -279,6 +291,7 @@ class SoongWorkflowNodeButton(models.Model):
|
||||
required=True,
|
||||
ondelete="cascade",
|
||||
)
|
||||
is_automatic = fields.Boolean('是否自动匹配', default=True)
|
||||
|
||||
@api.onchange("node_id")
|
||||
def change_workflow(self):
|
||||
@@ -382,8 +395,7 @@ class SoongWorkflowNodeButton(models.Model):
|
||||
user_ids += user_role_id.ids
|
||||
# 发送信息提醒
|
||||
partner_ids = self.sudo().env['res.users'].search([('id', 'in', user_ids)]).mapped('partner_id').ids
|
||||
self.sudo().with_context(lang=self.env.lang)._message_auto_subscribe_notify(partner_ids,
|
||||
'soong_workflow.message_yuthon_workflow_btn_approval_data')
|
||||
self.sudo().with_context(lang=self.env.lang)._message_auto_subscribe_notify(partner_ids, 'soong_workflow.message_yuthon_workflow_btn_approval_data')
|
||||
except Exception as e:
|
||||
pass
|
||||
return func_result
|
||||
|
||||
@@ -26,4 +26,8 @@ access_soong_workflow_log_user,soong_workflow_log_user,model_soong_workflow_log,
|
||||
access_soong_workflow_comment_wizard_user,soong_workflow_comment_wizard_user,model_soong_workflow_comment_wizard,soong_workflow.group_soong_workflow_user,1,1,1,1
|
||||
access_trans_link,trans_link,model_trans_link,soong_workflow.group_soong_workflow_user,1,1,1,1
|
||||
access_soong_workflow_entrust,soong_workflow_entrust,model_soong_workflow_entrust,soong_workflow.group_soong_workflow_user,1,1,1,1
|
||||
access_entrust_all,entrust_all,model_entrust_all,soong_workflow.group_soong_workflow_user,1,1,1,1
|
||||
access_entrust_all,entrust_all,model_entrust_all,soong_workflow.group_soong_workflow_user,1,1,1,1
|
||||
|
||||
access_soong_workflow_inspector,soong_workflow_inspector,model_soong_workflow_inspector,soong_workflow.group_soong_workflow_user,1,1,1,1
|
||||
access_soong_workflow_inspector_line,soong_workflow_inspector_line,model_soong_workflow_inspector_line,soong_workflow.group_soong_workflow_user,1,1,1,1
|
||||
access_soong_workflow_inspector_line2,soong_workflow_inspector_line2,model_soong_workflow_inspector_line2,soong_workflow.group_soong_workflow_user,1,1,1,1
|
||||
|
@@ -34,6 +34,34 @@
|
||||
action="soong_workflow_entrust_action"
|
||||
parent="menu_soong_workflow_root"/>
|
||||
|
||||
<menuitem id="menu_soong_workflow_inspector"
|
||||
sequence="4"
|
||||
name="督查督办"
|
||||
parent="menu_soong_workflow_root"/>
|
||||
|
||||
<menuitem id="menu_soong_workflow_inspector_approval"
|
||||
sequence="1"
|
||||
name="督察审批"
|
||||
action="soong_workflow_inspector_action"
|
||||
parent="menu_soong_workflow_inspector"/>
|
||||
|
||||
<menuitem id="menu_soong_workflow_inspector_transact"
|
||||
sequence="3"
|
||||
name="督察办理"
|
||||
parent="menu_soong_workflow_inspector"/>
|
||||
<!-- 督办事项的表单 -->
|
||||
<menuitem id="menu_soong_workflow_inspector_transact_sth"
|
||||
sequence="1"
|
||||
name="督察事项"
|
||||
action="soong_workflow_inspector_line_action"
|
||||
parent="menu_soong_workflow_inspector_transact"/>
|
||||
|
||||
<menuitem id="menu_soong_workflow_inspector_transact_my"
|
||||
sequence="3"
|
||||
name="我的任务"
|
||||
action="soong_workflow_inspector_line_action"
|
||||
parent="menu_soong_workflow_inspector_transact"/>
|
||||
|
||||
<menuitem id="menu_soong_other_setting"
|
||||
sequence="3"
|
||||
name="其他配置"
|
||||
|
||||
@@ -0,0 +1,107 @@
|
||||
<?xml version="1.0" encoding="UTF-8" ?>
|
||||
<odoo>
|
||||
<record id="soong_workflow_inspector_tree" model="ir.ui.view">
|
||||
<field name="name">soong.workflow.inspector.tree</field>
|
||||
<field name="model">soong.workflow.inspector</field>
|
||||
<field name="arch" type="xml">
|
||||
<tree>
|
||||
<field name="name"/>
|
||||
<field name="code"/>
|
||||
<field name="department_id"/>
|
||||
<field name="inspector_importance"/>
|
||||
<field name="start_data"/>
|
||||
<field name="end_data"/>
|
||||
</tree>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record id="soong_workflow_inspector_form" model="ir.ui.view">
|
||||
<field name="name">soong.workflow.inspector.form</field>
|
||||
<field name="model">soong.workflow.inspector</field>
|
||||
<field name="arch" type="xml">
|
||||
<form>
|
||||
<sheet>
|
||||
<group>
|
||||
<group>
|
||||
<field name="name" required="1"/>
|
||||
<field name="department_id"/>
|
||||
</group>
|
||||
<group>
|
||||
<field name="code"/>
|
||||
<field name="inspector_importance"/>
|
||||
<label for="start_data"/>
|
||||
<div>
|
||||
<field name="start_data" class="oe_inline"/>至
|
||||
<field name="end_data" class="oe_inline"/>
|
||||
</div>
|
||||
</group>
|
||||
</group>
|
||||
<group>
|
||||
<group>
|
||||
<field name="inspector_html"/>
|
||||
<field name="inspector_text"/>
|
||||
<field name="document_id"/>
|
||||
</group>
|
||||
<group strin="文档可视化测试">
|
||||
<field name="attachment_ids" widget="preview_many2many"/>
|
||||
</group>
|
||||
</group>
|
||||
<group>
|
||||
<field name="inspector_line2_ids">
|
||||
<tree>
|
||||
<field name="workflow_inspector_id" column_invisible="1"/>
|
||||
<field name="department_id"/>
|
||||
<field name="employee_id"/>
|
||||
<field name="end_data"/>
|
||||
<field name="inspector_line_text"/>
|
||||
</tree>
|
||||
</field>
|
||||
</group>
|
||||
<notebook>
|
||||
<page string="任务进度">
|
||||
<field name="inspector_line_ids">
|
||||
<tree>
|
||||
<field name="workflow_inspector_id" column_invisible="1"/>
|
||||
<field name="task_text"/>
|
||||
<field name="end_data"/>
|
||||
<field name="task_state"/>
|
||||
</tree>
|
||||
</field>
|
||||
</page>
|
||||
</notebook>
|
||||
</sheet>
|
||||
</form>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record id="soong_workflow_inspector_action" model="ir.actions.act_window">
|
||||
<field name="name">督查督办</field>
|
||||
<field name="res_model">soong.workflow.inspector</field>
|
||||
<field name="view_mode">tree,form</field>
|
||||
</record>
|
||||
|
||||
<!-- 督办事项的表单 -->
|
||||
<record id="soong_workflow_inspector_line_tree" model="ir.ui.view">
|
||||
<field name="name">soong.workflow.inspector.line.tree</field>
|
||||
<field name="model">soong.workflow.inspector.line</field>
|
||||
<field name="arch" type="xml">
|
||||
<tree>
|
||||
<field name="department_id"/>
|
||||
<field name="employee_id"/>
|
||||
<field name="end_data"/>
|
||||
<field name="task_state"/>
|
||||
<field name="task_text"/>
|
||||
<field name="workflow_inspector_id"/>
|
||||
<button name="long_end_data" string="延期" type="object" class="btn-primary"/>
|
||||
<button name="inspector_task_done" string="办结" type="object" class="btn-primary"/>
|
||||
<button name="inspector_task_issued" string="任务下发" type="object" class="btn-primary"/>
|
||||
</tree>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record id="soong_workflow_inspector_line_action" model="ir.actions.act_window">
|
||||
<field name="name">督察事项</field>
|
||||
<field name="res_model">soong.workflow.inspector.line</field>
|
||||
<field name="view_mode">tree</field>
|
||||
</record>
|
||||
</odoo>
|
||||
@@ -1,8 +1,5 @@
|
||||
<?xml version="1.0" encoding="UTF-8" ?>
|
||||
<odoo>
|
||||
<!--
|
||||
Workflow Links
|
||||
-->
|
||||
<record id="view_form_soong_workflow_link" model="ir.ui.view">
|
||||
<field name="name">soong.workflow.link.form</field>
|
||||
<field name="model">soong.workflow.link</field>
|
||||
|
||||
@@ -144,6 +144,7 @@
|
||||
<field name="name" required="1"/>
|
||||
<field name="is_highlight"/>
|
||||
<field name="has_comment"/>
|
||||
<field name="is_automatic"/>
|
||||
</group>
|
||||
<group>
|
||||
<field name="node_id" options="{'no_open': True, 'no_create': True}"
|
||||
|
||||
@@ -15,7 +15,7 @@ class SoongWorkflowCommentWizard(models.TransientModel):
|
||||
node_btn_name = fields.Char(string="动作名称", related='node_btn_id.name')
|
||||
node_link_len = fields.Char(string="转交2")
|
||||
|
||||
comment_note_id = fields.Many2one('soong.note', required=True, string="意见")
|
||||
comment_note_id = fields.Many2one('soong.note', string="意见")
|
||||
comment_type = fields.Selection(related="comment_note_id.type", string="意见类型")
|
||||
comment_return_type = fields.Char(related="comment_note_id.return_type", string="退回类型")
|
||||
state_list = fields.Char(string="状态列表")
|
||||
@@ -35,6 +35,8 @@ class SoongWorkflowCommentWizard(models.TransientModel):
|
||||
users_role_ids = fields.Many2many('soong.user.role', string='角色范围')
|
||||
approval_users_ids = fields.Many2many('res.users', string="传阅/督办人员", compute="compute_approval_users_ids", store=True)
|
||||
|
||||
is_automatic = fields.Boolean('是否自动识别')
|
||||
|
||||
@api.depends('department_ids', 'employee_ids', 'users_role_ids')
|
||||
def compute_approval_users_ids(self):
|
||||
department_users_list = users_role_list = []
|
||||
@@ -70,5 +72,9 @@ class SoongWorkflowCommentWizard(models.TransientModel):
|
||||
if self.node_btn_name == '退回':
|
||||
record_id.write({'state': 'start' if self.return_link_id.name == '拟办' else self.return_link_id.name})
|
||||
# 填写审批记录
|
||||
self.log_ids.write({"comment": self.comment_note_id.name})
|
||||
if self.node_btn_name != '加签':
|
||||
self.log_ids.write({"comment": self.comment_note_id.name})
|
||||
# 加签人员写入
|
||||
if self.node_btn_name == '加签':
|
||||
record_id.approval_sign_ids = self.approval_users_ids
|
||||
return self.node_btn_id.with_context(cx).run()
|
||||
|
||||
@@ -13,10 +13,11 @@
|
||||
<field name="node_btn_name" invisible="1"/>
|
||||
<field name="node_link_len" invisible="1"/>
|
||||
<field name="record_id" invisible="1"/>
|
||||
<field name="is_automatic" invisible="1"/>
|
||||
<!-- 退回意见退回类型 -->
|
||||
<field name="return_link_id" invisible="node_btn_name != '退回'" string="退回节点"/>
|
||||
<field name="comment_note_id" invisible="node_btn_name != '退回'" string="退回意见" domain="[('type','=','return')]"/>
|
||||
<field name="comment_return_type" invisible="node_btn_name != '退回'" required="node_btn_name != '退回'"/>
|
||||
<field name="comment_return_type" invisible="node_btn_name != '退回'"/>
|
||||
<!-- 转交人员 -->
|
||||
<field name="trans_link_id" invisible="not node_link_len" string="转交节点"/>
|
||||
<field name="comment_note_id" invisible="node_btn_name != '转交'" string="转交意见" domain="[('type','=','agree')]"/>
|
||||
@@ -26,10 +27,12 @@
|
||||
<field name="start_date" invisible="send_type != 'super'"/>
|
||||
<field name="end_date" invisible="send_type != 'super'"/>
|
||||
<field name="comment_note_id" invisible="node_btn_name != '分发'" string="督办意见" domain="[('type','=','super')]"/>
|
||||
<field name="department_ids" invisible="node_btn_name != '分发'" widget="many2many_tags"/>
|
||||
<field name="employee_ids" invisible="node_btn_name != '分发'" widget="many2many_tags"/>
|
||||
<field name="users_role_ids" invisible="node_btn_name != '分发'" widget="many2many_tags"/>
|
||||
<field name="department_ids" invisible="node_btn_name not in ['加签', '分发']" widget="many2many_tags"/>
|
||||
<field name="comment_note_id" invisible="node_btn_name != '加签确认'" string="加签意见"/>
|
||||
<field name="employee_ids" widget="many2many_tags" invisible="node_btn_name == '加签确认'"/>
|
||||
<field name="users_role_ids" invisible="node_btn_name not in ['加签', '分发']" widget="many2many_tags"/>
|
||||
<field name="approval_users_ids" invisible="node_btn_name != '分发'" widget="many2many_tags"/>
|
||||
<field name="approval_users_ids" string='加签人员' invisible="node_btn_name != '加签'" widget="many2many_tags"/>
|
||||
</group>
|
||||
<footer>
|
||||
<button name="add_comment" string="确认" type="object" class="oe_highlight"/>
|
||||
|
||||
@@ -12,7 +12,8 @@
|
||||
'category': 'Human Resources/Attendances',
|
||||
'sequence': 240,
|
||||
'website': 'https://www.pengyuthon.com',
|
||||
'depends': ['hr_attendance', 'resource', 'base', 'hr', 'mail', 'soong_workflow'],
|
||||
# 'depends': ['hr_attendance', 'resource', 'base', 'hr', 'mail', 'soong_workflow'],
|
||||
'depends': ['hr_attendance', 'resource', 'base', 'hr', 'mail'],
|
||||
'data': [
|
||||
'security/ir.model.access.csv',
|
||||
# 'security/approval_attendance.xml',
|
||||
@@ -32,6 +33,8 @@
|
||||
'views/card_approval.xml',
|
||||
'views/holiday_manage.xml',
|
||||
'views/holiday_manage_balance.xml',
|
||||
'views/attendance_iot_datas.xml',
|
||||
'views/yuthon_mqtt_service.xml',
|
||||
'views/all_attendance_menu.xml',
|
||||
],
|
||||
'installable': True,
|
||||
|
||||
@@ -14,4 +14,5 @@ from . import holiday_manage
|
||||
from . import holiday_manage_balance
|
||||
from . import attendance_iot_manager
|
||||
from . import attendance_iot_datas
|
||||
from . import yuthon_mqtt_service
|
||||
|
||||
|
||||
@@ -6,7 +6,8 @@ from datetime import datetime, time, timedelta
|
||||
class CardApprovals(models.Model):
|
||||
_name = 'card.approval'
|
||||
_description = "补卡审批"
|
||||
_inherit = ['mail.thread.main.attachment', 'mail.activity.mixin', 'soong.workflow.mixin']
|
||||
# _inherit = ['mail.thread.main.attachment', 'mail.activity.mixin', 'soong.workflow.mixin']
|
||||
_inherit = ['mail.thread.main.attachment', 'mail.activity.mixin']
|
||||
_rec_name = 'name'
|
||||
|
||||
name = fields.Char(string="名称", default=lambda self: self.env['ir.sequence'].next_by_code('card_approval'))
|
||||
|
||||
@@ -6,7 +6,8 @@ from datetime import datetime, time, timedelta
|
||||
class DutyApprovals(models.Model):
|
||||
_name = 'duty.approval'
|
||||
_description = "值班审批"
|
||||
_inherit = ['mail.thread.main.attachment', 'mail.activity.mixin', 'soong.workflow.mixin']
|
||||
# _inherit = ['mail.thread.main.attachment', 'mail.activity.mixin', 'soong.workflow.mixin']
|
||||
_inherit = ['mail.thread.main.attachment', 'mail.activity.mixin']
|
||||
_rec_name = 'name'
|
||||
|
||||
name = fields.Char(string="名称", default=lambda self: self.env['ir.sequence'].next_by_code('duty_approval'))
|
||||
|
||||
@@ -6,7 +6,8 @@ from datetime import datetime, time, timedelta
|
||||
class GoApprovals(models.Model):
|
||||
_name = 'go.approval'
|
||||
_description = "外出审批"
|
||||
_inherit = ['mail.thread.main.attachment', 'mail.activity.mixin', 'soong.workflow.mixin']
|
||||
# _inherit = ['mail.thread.main.attachment', 'mail.activity.mixin', 'soong.workflow.mixin']
|
||||
_inherit = ['mail.thread.main.attachment', 'mail.activity.mixin']
|
||||
_rec_name = 'name'
|
||||
|
||||
name = fields.Char(string="名称", default=lambda self: self.env['ir.sequence'].next_by_code('go_approval'))
|
||||
|
||||
@@ -6,7 +6,8 @@ from datetime import datetime, time, timedelta
|
||||
class HolidaysApprovals(models.Model):
|
||||
_name = 'holidays.approval'
|
||||
_description = "请假审批"
|
||||
_inherit = ['mail.thread.main.attachment', 'mail.activity.mixin', 'soong.workflow.mixin']
|
||||
# _inherit = ['mail.thread.main.attachment', 'mail.activity.mixin', 'soong.workflow.mixin']
|
||||
_inherit = ['mail.thread.main.attachment', 'mail.activity.mixin']
|
||||
_rec_name = 'name'
|
||||
|
||||
name = fields.Char(string="名称", default=lambda self: self.env['ir.sequence'].next_by_code('holidays_approval'))
|
||||
|
||||
@@ -6,7 +6,8 @@ from datetime import datetime, time, timedelta
|
||||
class LeaveApprovals(models.Model):
|
||||
_name = 'leave.approval'
|
||||
_description = "调休审批"
|
||||
_inherit = ['mail.thread.main.attachment', 'mail.activity.mixin', 'soong.workflow.mixin']
|
||||
# _inherit = ['mail.thread.main.attachment', 'mail.activity.mixin', 'soong.workflow.mixin']
|
||||
_inherit = ['mail.thread.main.attachment', 'mail.activity.mixin']
|
||||
_rec_name = 'name'
|
||||
|
||||
name = fields.Char(string="名称", default=lambda self: self.env['ir.sequence'].next_by_code('leave_approval'))
|
||||
|
||||
@@ -6,7 +6,8 @@ from datetime import datetime, time, timedelta
|
||||
class OvertimeApprovals(models.Model):
|
||||
_name = 'overtime.approval'
|
||||
_description = "加班审批"
|
||||
_inherit = ['mail.thread.main.attachment', 'mail.activity.mixin', 'soong.workflow.mixin']
|
||||
# _inherit = ['mail.thread.main.attachment', 'mail.activity.mixin', 'soong.workflow.mixin']
|
||||
_inherit = ['mail.thread.main.attachment', 'mail.activity.mixin']
|
||||
_rec_name = 'name'
|
||||
|
||||
name = fields.Char(string="名称", default=lambda self: self.env['ir.sequence'].next_by_code('overtime_approval'))
|
||||
|
||||
@@ -6,7 +6,8 @@ from datetime import datetime, time, timedelta
|
||||
class RemoveHolidayApprovals(models.Model):
|
||||
_name = 'remove.holiday.approval'
|
||||
_description = "销假审批"
|
||||
_inherit = ['mail.thread.main.attachment', 'mail.activity.mixin', 'soong.workflow.mixin']
|
||||
# _inherit = ['mail.thread.main.attachment', 'mail.activity.mixin', 'soong.workflow.mixin']
|
||||
_inherit = ['mail.thread.main.attachment', 'mail.activity.mixin']
|
||||
_rec_name = 'name'
|
||||
|
||||
name = fields.Char(string="名称", default=lambda self: self.env['ir.sequence'].next_by_code('remove_holidays_approval'))
|
||||
|
||||
@@ -12,5 +12,6 @@ access_holiday_manage,holiday_manage,model_holiday_manage,base.group_user,1,1,1,
|
||||
access_attendance_iot_manager,attendance_iot_manager,model_attendance_iot_manager,base.group_user,1,1,1,1
|
||||
access_holiday_manage_balance,holiday_manage_balance,model_holiday_manage_balance,base.group_user,1,1,1,1
|
||||
access_attendance_iot_datas,attendance_iot_datas,model_attendance_iot_datas,base.group_user,1,1,1,1
|
||||
access_yuthon_mqtt_service,yuthon_mqtt_service,model_yuthon_mqtt_service,base.group_user,1,1,1,1
|
||||
|
||||
|
||||
|
||||
|
@@ -32,4 +32,6 @@
|
||||
sequence="18" action="resource.action_resource_calendar_form"/>
|
||||
<menuitem id="menu_hr_attendance_lot_datas" name="上传识别记录" parent="hr_attendance.menu_hr_attendance_root"
|
||||
sequence="21" action="attendance_iot_datas_action"/>
|
||||
<menuitem id="menu_yuthon_mqtt_service_config" name="mqtt服务配置" parent="hr_attendance.menu_hr_attendance_root"
|
||||
sequence="22" action="act_yuthon_mqtt_service_config"/>
|
||||
</odoo>
|
||||
|
||||
@@ -7,13 +7,15 @@
|
||||
<tree string="上传记录">
|
||||
<!-- <field name="name"/>-->
|
||||
<field name="attendance_date"/>
|
||||
<field name="attendance_number"/>
|
||||
<field name="employee_id"/>
|
||||
</tree>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record id="attendance_iot_datas_action" model="ir.actions.act_window">
|
||||
<field name="name">上传记录</field>
|
||||
<field name="res_model">attendance.iot.datas</field>
|
||||
<field name="view_mode">tree,form</field>
|
||||
<field name="view_mode">tree</field>
|
||||
</record>
|
||||
</odoo>
|
||||
@@ -1,2 +1,3 @@
|
||||
from . import controllers
|
||||
from . import models
|
||||
from . import wizard
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
from . import employee_banner_route
|
||||
@@ -0,0 +1,31 @@
|
||||
from odoo.http import Controller, request, route
|
||||
from datetime import datetime
|
||||
from odoo import models, fields, api, http, SUPERUSER_ID, _
|
||||
|
||||
|
||||
class EmployeeBannerRoute(Controller):
|
||||
|
||||
@route('/employee/banner/route', type='json', auth='user')
|
||||
def employee_banner_route(self):
|
||||
employees = request.env['hr.employee'].sudo()
|
||||
hired_count = employees.search_count([('use_user_type', '=', 'formal')]) # 正式
|
||||
in_hired_count = employees.search_count([]) # 在职
|
||||
all_hired_count = employees.search_count([]) # 全职
|
||||
return {
|
||||
'html': f"""
|
||||
<div style="display: flex; justify-content: space-around; align-items: center; text-align: center; padding: 20px; width: 100%;">
|
||||
<div style="flex: 1; padding: 20px;">
|
||||
<h2>正式/h2>
|
||||
<p style="font-size: 24px; color: #4CAF50;">{hired_count}</p>
|
||||
</div>
|
||||
<div style="flex: 1; padding: 20px;">
|
||||
<h2>在职</h2>
|
||||
<p style="font-size: 24px; color: #2196F3;">{in_hired_count}</p>
|
||||
</div>
|
||||
<div style="flex: 1; padding: 20px;">
|
||||
<h2>全职</h2>
|
||||
<p style="font-size: 24px; color: #FF5722;">{all_hired_count}</p>
|
||||
</div>
|
||||
</div>
|
||||
"""
|
||||
}
|
||||
@@ -194,6 +194,9 @@
|
||||
<field name="model">hr.employee</field>
|
||||
<field name="inherit_id" ref="hr.view_employee_tree"/>
|
||||
<field name="arch" type="xml">
|
||||
<xpath expr="//tree" position="attributes">
|
||||
<attribute name="banner_route">/employee/banner/route</attribute>
|
||||
</xpath>
|
||||
<xpath expr="//field[@name='activity_ids']" position="attributes">
|
||||
<attribute name="column_invisible">1</attribute>
|
||||
</xpath>
|
||||
@@ -205,7 +208,6 @@
|
||||
</xpath>
|
||||
<xpath expr="//field[@name='name']" position="after">
|
||||
<field name="company_old"/>
|
||||
|
||||
</xpath>
|
||||
<xpath expr="//field[@name='job_id']" position="after">
|
||||
<field name="number" optional="hide"/>
|
||||
|
||||
@@ -11,7 +11,7 @@
|
||||
'license': 'LGPL-3',
|
||||
'author': 'pengyuthon',
|
||||
'website': 'https://www.pengyuthon.com',
|
||||
'depends':['base', 'hr', 'yuthon_hr_employee', 'soong_workflow', 'documents','hr_recruitment','room'],
|
||||
'depends':['base', 'hr', 'yuthon_hr_employee', 'soong_workflow', 'documents', 'hr_recruitment', 'room'],
|
||||
'data': [
|
||||
'security/ir.model.access.csv',
|
||||
'data/process_code_data.xml',
|
||||
|
||||
@@ -154,7 +154,7 @@
|
||||
parent="hr_set_process_menu_root_board"
|
||||
action="yuthon_hr_employee_approval.yuthon_leaving_approval_action"
|
||||
sequence="5"/>
|
||||
<menuitem id="hr_menu_title_approval_root_board"
|
||||
<menuitem id="hr_menu_appointment_approval_root_board"
|
||||
name="职称聘任申请表"
|
||||
parent="hr_set_process_menu_root_board"
|
||||
action="yuthon_hr_employee_approval.yuthon_appointment_approval_action"
|
||||
|
||||
@@ -66,6 +66,29 @@
|
||||
name="工作委托"
|
||||
action="soong_workflow.soong_workflow_entrust_action"
|
||||
parent="menu_soong_workflow_root_board"/>
|
||||
<menuitem id="menu_soong_workflow_inspector_board"
|
||||
sequence="4"
|
||||
name="督查督办"
|
||||
parent="menu_soong_workflow_root_board"/>
|
||||
<menuitem id="menu_soong_workflow_inspector_approval_board"
|
||||
sequence="1"
|
||||
name="督察审批"
|
||||
action="soong_workflow.soong_workflow_inspector_action"
|
||||
parent="menu_soong_workflow_inspector_board"/>
|
||||
<menuitem id="menu_soong_workflow_inspector_transact_board"
|
||||
sequence="3"
|
||||
name="督察办理"
|
||||
parent="menu_soong_workflow_inspector_board"/>
|
||||
<menuitem id="menu_soong_workflow_inspector_transact_sth_board"
|
||||
sequence="1"
|
||||
name="督察事项"
|
||||
action="soong_workflow.soong_workflow_inspector_line_action"
|
||||
parent="menu_soong_workflow_inspector_transact_board"/>
|
||||
<menuitem id="menu_soong_workflow_inspector_transact_my_board"
|
||||
sequence="3"
|
||||
name="我的任务"
|
||||
action="soong_workflow.soong_workflow_inspector_line_action"
|
||||
parent="menu_soong_workflow_inspector_transact_board"/>
|
||||
<menuitem id="menu_soong_other_setting_board"
|
||||
sequence="5"
|
||||
name="其他配置"
|
||||
@@ -85,11 +108,11 @@
|
||||
parent="menu_soong_other_setting_board"
|
||||
action="soong_workflow.soong_approval_group_action"
|
||||
sequence="5"/>
|
||||
<!-- <menuitem id="soong_workflow_record_menu_board"-->
|
||||
<!-- name="工作流记录"-->
|
||||
<!-- parent="menu_soong_workflow_root_board"-->
|
||||
<!-- action="soong_workflow.soong_workflow_record_action"-->
|
||||
<!-- sequence="5"/>-->
|
||||
<!-- <menuitem id="soong_workflow_record_menu_board"-->
|
||||
<!-- name="工作流记录"-->
|
||||
<!-- parent="menu_soong_workflow_root_board"-->
|
||||
<!-- action="soong_workflow.soong_workflow_record_action"-->
|
||||
<!-- sequence="5"/>-->
|
||||
<!-- 议题库 -->
|
||||
<menuitem id="tianhe_issue_library_menu_root_board"
|
||||
name="议题管理"
|
||||
|
||||
Reference in New Issue
Block a user