@@ -22,7 +22,6 @@ class Room(models.Model):
|
||||
name = fields.Char(string="会议室", required=True, tracking=2)
|
||||
description = fields.Html(string="Amenities", translate=html_translate, sanitize=False)
|
||||
office_id = fields.Many2one("room.office", string="Office", tracking=3)
|
||||
company_id = fields.Many2one(related="office_id.company_id", string="Company", store=True)
|
||||
room_booking_ids = fields.One2many("room.booking", "room_id", string="Bookings")
|
||||
short_code = fields.Char("Short Code", default=lambda self: str(uuid4())[:8], copy=False, required=True, tracking=1)
|
||||
# Technical/Statistics
|
||||
@@ -42,7 +41,7 @@ class Room(models.Model):
|
||||
meet_equipment = fields.Char(string="会议室设备")
|
||||
|
||||
office_address = fields.Char(string="会议室地址", required=True)
|
||||
department_id = fields.Many2one("hr.department", string="公司", required=True)
|
||||
company_id = fields.Many2one("hr.department", string="公司", required=True)
|
||||
meeting_type_template = fields.Selection([('template1', '默认模板')], string='会议室模板')
|
||||
meet_document_id = fields.Many2one('documents.document', string="布局图片")
|
||||
meet_capacity = fields.Integer(string="容纳人数", required=True)
|
||||
|
||||
@@ -14,7 +14,7 @@
|
||||
<filter name="meet_capacity" string="二十人以上" domain="[('meet_capacity', '>', 20)]"/>
|
||||
<filter name="meet_capacity" string="二十人以下" domain="[('meet_capacity', '<', 20)]"/>
|
||||
<group expand="0" string="Group By">
|
||||
<filter string="公司" name="group_department_id" context="{'group_by': 'department_id'}"/>
|
||||
<filter string="公司" name="group_company_id" context="{'group_by': 'company_id'}"/>
|
||||
</group>
|
||||
</search>
|
||||
</field>
|
||||
@@ -55,7 +55,7 @@
|
||||
</div>
|
||||
</div>
|
||||
<div>
|
||||
<span><field name="department_id"/></span>
|
||||
<span><field name="company_id"/></span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -72,7 +72,7 @@
|
||||
<tree>
|
||||
<field name="name"/>
|
||||
<field name="office_address"/>
|
||||
<field name="department_id" widget="ztree_select"/>
|
||||
<field name="company_id" widget="ztree_select"/>
|
||||
<field name="is_available" string="Is Currently Available"/>
|
||||
<field name="next_booking_start"/>
|
||||
</tree>
|
||||
@@ -119,7 +119,7 @@
|
||||
<field name="meeting_type_template"/>
|
||||
<field name="meet_document_id"/>
|
||||
<field name="office_address"/>
|
||||
<field name="department_id" widget="ztree_select"/>
|
||||
<field name="company_id" widget="ztree_select"/>
|
||||
<field name="short_code" invisible="1"/>
|
||||
</group>
|
||||
<!-- <group>-->
|
||||
@@ -169,7 +169,7 @@
|
||||
<field name="name">会议室</field>
|
||||
<field name="res_model">room.room</field>
|
||||
<field name="view_mode">kanban,list,form</field>
|
||||
<field name="context">{'search_default_group_department_id': True,}</field>
|
||||
<field name="context">{'search_default_group_company_id': True,}</field>
|
||||
<field name="help" type="html">
|
||||
<p class="o_view_nocontent_smiling_face">
|
||||
Create Rooms
|
||||
|
||||
@@ -12,7 +12,7 @@ class SoongWorkflowInspector(models.Model):
|
||||
name = fields.Char(string="标题")
|
||||
start_data = fields.Date(string="督办日期")
|
||||
end_data = fields.Date(string="完成日期")
|
||||
reason = fields.Html(string="正文")
|
||||
reason = fields.Text(string="正文")
|
||||
user_id = fields.Many2one('res.users', string="申请人", default=lambda self: self.env.user)
|
||||
department_id = fields.Many2one(related='user_id.department_id', string="部门")
|
||||
code = fields.Char(string="督办编号", default=lambda self: self.env['ir.sequence'].next_by_code('inspector_code'))
|
||||
|
||||
@@ -28,13 +28,14 @@
|
||||
</page>
|
||||
<page string="关联流程">
|
||||
<field name="soong_record_ids" style="width:100%%; margin-top: 10px;">
|
||||
<tree edit="true" delete="true" editable="bottom">
|
||||
<tree edit="true" delete="true" editable="bottom" action="open_record" type="object">
|
||||
<field name="code"/>
|
||||
<field name="workflow_record_id" domain="[('users_ids', 'in', uid)]"/>
|
||||
<field name="workflow_record_id" domain="[('users_ids', 'in', uid)]" options="{'no_open': True}"/>
|
||||
<field name="approvals_group_id"/>
|
||||
<field name="create_uid"/>
|
||||
<field name="write_date2"/>
|
||||
<button name="open_record" type="object" string="详情" class="btn-primary"/>
|
||||
<button name="unlink" type="object" string="删除" class="btn-primary"/>
|
||||
</tree>
|
||||
</field>
|
||||
</page>
|
||||
@@ -78,7 +79,7 @@
|
||||
<page string="关联流程">
|
||||
<field name="soong_record_ids" style="width:100%%; margin-top: 10px;">
|
||||
<tree editable="bottom">
|
||||
<field name="workflow_record_id" domain="[('users_ids', 'in', uid)]"/>
|
||||
<field name="workflow_record_id" domain="[('users_ids', 'in', uid)]" options="{'no_open': True}"/>
|
||||
<field name="approvals_group_id"/>
|
||||
<field name="create_uid"/>
|
||||
<field name="write_date2"/>
|
||||
|
||||
@@ -21,20 +21,20 @@
|
||||
parent="menu_soong_workflow_root"
|
||||
action="soong_workflow_other_record_action"
|
||||
sequence="4"/>
|
||||
<menuitem id="menu_workflow_approval_request_copy"
|
||||
name="抄送/传阅流程"
|
||||
parent="menu_soong_workflow_root"
|
||||
action="soong_workflow_record_action_copy"
|
||||
sequence="5"/>
|
||||
<menuitem id="menu_workflow_approval_request_admin"
|
||||
name="流程监控"
|
||||
parent="menu_soong_workflow_root"
|
||||
action="soong_workflow_record_action_admin"
|
||||
sequence="11"/>
|
||||
<menuitem id="menu_soong_workflow_hr_employee"
|
||||
name="人力资源流程"
|
||||
parent="menu_soong_workflow_root"
|
||||
action="soong_workflow_hr_employee_action"
|
||||
sequence="5"/>
|
||||
<menuitem id="menu_workflow_approval_request_copy"
|
||||
name="抄送/传阅流程"
|
||||
parent="menu_soong_workflow_root"
|
||||
action="soong_workflow_record_action_copy"
|
||||
sequence="8"/>
|
||||
<menuitem id="menu_workflow_approval_request_admin"
|
||||
name="流程监控"
|
||||
parent="menu_soong_workflow_root"
|
||||
action="soong_workflow_record_action_admin"
|
||||
sequence="11"/>
|
||||
<menuitem id="menu_soong_workflow_entrust"
|
||||
sequence="13"
|
||||
|
||||
@@ -120,7 +120,7 @@
|
||||
<field name="type">ir.actions.act_window</field>
|
||||
<field name="res_model">soong.workflow.record</field>
|
||||
<field name="view_mode">tree,kanban,search</field>
|
||||
<field name="domain">[('reclaim_state', '=', False), ('approvals_group_id.name', '=', '人力资源')]</field>
|
||||
<field name="domain">[('reclaim_state', '=', False), '|', ('approvals_group_id.name', '=', '人力资源'), ('approvals_group_id.name', '=', '考勤')]</field>
|
||||
<field name="search_view_id" ref="soong_workflow_record_search"/>
|
||||
</record>
|
||||
<record id="soong_workflow_other_record_action" model="ir.actions.act_window">
|
||||
@@ -128,7 +128,8 @@
|
||||
<field name="type">ir.actions.act_window</field>
|
||||
<field name="res_model">soong.workflow.record</field>
|
||||
<field name="view_mode">tree,kanban,search</field>
|
||||
<field name="domain">[('reclaim_state', '=', False), ('approvals_group_id.name', '!=', '人力资源')]</field>
|
||||
<field name="domain">[('reclaim_state', '=', False), ('approvals_group_id.name', '!=', '人力资源'), ('approvals_group_id.name', '!=', '考勤')]</field>
|
||||
<field name="context">{'search_default_my_department_shifts': True,}</field>
|
||||
<field name="search_view_id" ref="soong_workflow_record_search"/>
|
||||
</record>
|
||||
<record id="soong_workflow_record_action_admin" model="ir.actions.act_window">
|
||||
|
||||
@@ -45,6 +45,25 @@ class SoongWorkflowCommentWizard(models.TransientModel):
|
||||
string="督办人员", store=True)
|
||||
is_automatic = fields.Boolean('是否自动匹配')
|
||||
|
||||
employee_ids1 = fields.Many2many(
|
||||
'hr.employee',
|
||||
'employee_ids1_rel',
|
||||
'custom_id1',
|
||||
'employee_id1',
|
||||
string="转交人员",
|
||||
store=True
|
||||
)
|
||||
|
||||
@api.onchange('employee_ids')
|
||||
def _onchange_employee_ids(self):
|
||||
if len(self.employee_ids) == 1:
|
||||
self.employee_ids1 = self.employee_ids
|
||||
|
||||
@api.constrains('employee_ids1')
|
||||
def _check_employee_ids1(self):
|
||||
if not self.employee_ids1:
|
||||
raise ValidationError("必须有转交人员")
|
||||
|
||||
@api.depends('comment_note_id', 'comment_note')
|
||||
def _compute_comment(self):
|
||||
for record in self:
|
||||
@@ -85,15 +104,15 @@ class SoongWorkflowCommentWizard(models.TransientModel):
|
||||
if '转交' not in next_list:
|
||||
raise UserError('配置错误,请配置当前{}的转交按钮'.format(btn.name))
|
||||
else:
|
||||
if btn.is_automatic:
|
||||
employee_user_role_id = self.env['hr.employee'].search(
|
||||
[('user_role_id', '=', btn.users_role_id.id),
|
||||
('department_id', '=', record_id.department_id.id)])
|
||||
employee_user_role_id = self.env['hr.employee'].search(
|
||||
[('user_role_id', '=', btn.users_role_id.id),
|
||||
('department_id', '=', record_id.department_id.id)])
|
||||
if employee_user_role_id:
|
||||
self.employee_ids = employee_user_role_id
|
||||
else:
|
||||
employee_user_role_ids = self.env['hr.employee'].search(
|
||||
[('user_role_id', '=', btn.users_role_id.id)])
|
||||
self.employee_ids = employee_user_role_ids
|
||||
raise UserError('下一个流程节点没有匹配的人员,请联系管理员配置')
|
||||
if btn.is_automatic:
|
||||
self.employee_ids1 = employee_user_role_id
|
||||
|
||||
@api.onchange('trans_link_id')
|
||||
def onchange_trans_employee_ids(self):
|
||||
|
||||
@@ -48,7 +48,8 @@
|
||||
<!-- 转交人员 -->
|
||||
<field name="trans_link_id" string="转交节点" invisible="node_btn_name == '退回'"/>
|
||||
<field name="employee_trans_domain_ids" invisible="1"/>
|
||||
<field name="employee_ids" widget="many2many_tags" string="人员范围"/>
|
||||
<field name="employee_ids" widget="many2many_tags" string="人员范围" invisible="1"/>
|
||||
<field name="employee_ids1" widget="many2many_tags" string="人员范围" domain="[('id', 'in', employee_ids)]"/>
|
||||
</group>
|
||||
<div invisible="node_btn_name != '结束'">
|
||||
<h2>当前流程是否结束,请确认</h2>
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
<field name="type">form</field>
|
||||
<field name="arch" type="xml">
|
||||
<form string="撤销确认">
|
||||
<p>确认要撤销当前所选的工作吗?</p>
|
||||
<p>确认要撤销当前所选的工作流吗?</p>
|
||||
<field name="record_id" invisible="1" />
|
||||
<footer>
|
||||
<button name="add_comment_revoke" string="确认" type="object" class="oe_highlight"/>
|
||||
|
||||
@@ -0,0 +1,2 @@
|
||||
|
||||
from . import models
|
||||
@@ -0,0 +1,18 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
{
|
||||
'name': "yuthon base",
|
||||
'summary': "base",
|
||||
'description': """""",
|
||||
'author': 'zhou',
|
||||
'version': '0.1',
|
||||
'license': 'LGPL-3',
|
||||
'data': [
|
||||
'security/ir.model.access.csv',
|
||||
],
|
||||
'demo': [],
|
||||
'depends': ['hr', 'mail', 'base', 'survey'],
|
||||
'installable': True,
|
||||
'application': True,
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
from . import inherit_ir_attachment
|
||||
@@ -0,0 +1,16 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
from datetime import datetime, timedelta, time
|
||||
from email.policy import default
|
||||
|
||||
from odoo import models, fields, api, _
|
||||
from odoo.exceptions import UserError, ValidationError
|
||||
import re
|
||||
from odoo.tools.misc import format_date
|
||||
|
||||
|
||||
class InheritIrAttachment(models.Model):
|
||||
_inherit = 'ir.attachment'
|
||||
|
||||
public = fields.Boolean(string='公共文档', default=True)
|
||||
|
||||
|
||||
@@ -0,0 +1,2 @@
|
||||
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
|
||||
|
||||
|
@@ -25,8 +25,8 @@ class HrContract(models.Model):
|
||||
('attendance', 'Attendances'),
|
||||
('planning', '特殊排版')])
|
||||
is_probation = fields.Boolean(string="试用期")
|
||||
start_date = fields.Date(string="开始日期", required=True, default=fields.Date.today)
|
||||
end_date = fields.Date(string="结束日期", required=True,
|
||||
start_date = fields.Date(string="试用开始日期", required=True, default=fields.Date.today)
|
||||
end_date = fields.Date(string="试用结束日期", required=True,
|
||||
default=lambda self: fields.Date.today() + relativedelta(months=+3))
|
||||
salary_day = fields.Float(string="日薪")
|
||||
party_id = fields.Many2one('yuthon.party.setting', string='甲方(用人单位)')
|
||||
|
||||
@@ -33,8 +33,8 @@
|
||||
<field name="salary_day" invisible="not is_internship"/>
|
||||
<field name="salary_group_id" options="{'no_create': True}"/>
|
||||
<field name="is_internship" invisible="1"/>
|
||||
<field name="start_date" invisible="not is_probation" string="试用开始日期"/>
|
||||
<field name="end_date" invisible="not is_probation" string="试用开始日期"/>
|
||||
<field name="start_date" invisible="not is_probation"/>
|
||||
<field name="end_date" invisible="not is_probation"/>
|
||||
</xpath>
|
||||
<xpath expr="//field[@name='resource_calendar_id']" position="attributes">
|
||||
<attribute name="string">工作日历</attribute>
|
||||
|
||||
@@ -20,7 +20,7 @@ class YuthonFixesApproval(models.Model):
|
||||
is_issues = fields.Boolean(string='是否上会')
|
||||
issues_result = fields.Html(string="会议结果")
|
||||
related_issues_id = fields.Many2one('issue.library', string="关联议题")
|
||||
reason_application = fields.Html(string="申请事由")
|
||||
reason_application = fields.Text(string="申请事由")
|
||||
documents_ids = fields.Many2many('ir.attachment', string="附件")
|
||||
leave_id = fields.Many2one('hr.leave.allocation')
|
||||
active = fields.Boolean('Active', default=True, tracking=True)
|
||||
|
||||
@@ -22,7 +22,7 @@ class CardApprovals(models.Model):
|
||||
is_issues = fields.Boolean(string='是否上会')
|
||||
issues_result = fields.Html(string="会议结果")
|
||||
related_issues_id = fields.Many2one('issue.library', string="关联议题")
|
||||
reason_application = fields.Html(string="申请事由")
|
||||
reason_application = fields.Text(string="申请事由")
|
||||
documents_ids = fields.Many2many('ir.attachment', string="附件")
|
||||
attendance_id = fields.Many2one('hr.attendance', string="补卡日期")
|
||||
attendance = fields.Char(string="补卡日期")
|
||||
|
||||
@@ -27,7 +27,7 @@ class GoApprovals(models.Model):
|
||||
details = fields.Text(string="外出说明", default="1.可通过填写天数和小时,直接获得结束时间\n 2.一份外出单,可同时选择多人一次审批")
|
||||
related_issues_id = fields.Many2one('issue.library', string="关联议题")
|
||||
date_start = fields.Datetime(string="开始时间", default=fields.Datetime.now)
|
||||
date_end = fields.Datetime(string="结束时间")
|
||||
date_end = fields.Datetime(string="结束时间", default=fields.Datetime.now)
|
||||
meal = fields.Selection([('yes', '是'), ('no', '否')], string="误餐费", default=None)
|
||||
days = fields.Integer(string="天数")
|
||||
hours = fields.Integer(string="小时")
|
||||
@@ -39,8 +39,8 @@ class GoApprovals(models.Model):
|
||||
is_hour = fields.Boolean(string="按小时")
|
||||
start_day_selection = fields.Selection([('half', '上半天'),('afternoon', '下半天')], string="天")
|
||||
end_day_selection = fields.Selection([('half', '上半天'), ('afternoon', '下半天')], string="天")
|
||||
statr_date = fields.Date(string="开始日期")
|
||||
end_date = fields.Date(string="结束日期")
|
||||
statr_date = fields.Date(string="开始日期", default=fields.Date.today)
|
||||
end_date = fields.Date(string="结束日期", default=fields.Date.today)
|
||||
|
||||
def _get_default_name_title(self):
|
||||
return self._description if self._description else self._name
|
||||
@@ -67,7 +67,7 @@ class GoApprovals(models.Model):
|
||||
if self.date_start and self.date_end:
|
||||
start = fields.Datetime.from_string(self.date_start)
|
||||
end = fields.Datetime.from_string(self.date_end)
|
||||
if start >= end:
|
||||
if start > end:
|
||||
raise ValidationError("开始时间必须小于结束时间,请重新设置。")
|
||||
delta = end - start
|
||||
self.days = delta.days
|
||||
|
||||
@@ -18,7 +18,7 @@ class RemoveHolidayApprovals(models.Model):
|
||||
statu = fields.Selection([('drft', '草稿'), ('going', '执行中'), ('cancel', '已取消'), ('done', '已完成')], string="状态",
|
||||
default='drft')
|
||||
role_id = fields.Many2one('yuthon.user.role', string="岗位")
|
||||
reason_application = fields.Html(string="申请事由")
|
||||
reason_application = fields.Text(string="申请事由")
|
||||
is_issues = fields.Boolean(string='是否上会')
|
||||
issues_result = fields.Html(string="会议结果")
|
||||
related_issues_id = fields.Many2one('issue.library', string="关联议题")
|
||||
|
||||
@@ -16,7 +16,7 @@ class YuthonAbnormalApproval(models.Model):
|
||||
is_issues = fields.Boolean(string='是否上会')
|
||||
issues_result = fields.Html(string="会议结果")
|
||||
related_issues_id = fields.Many2one('issue.library', string="关联议题")
|
||||
reason_application = fields.Html(string="申请事由")
|
||||
reason_application = fields.Text(string="申请事由")
|
||||
documents_ids = fields.Many2many('ir.attachment', string="附件")
|
||||
active = fields.Boolean('Active', default=True, tracking=True)
|
||||
urgency_level = fields.Selection([('normal', '普件'), ('urgent', '急件'), ('emergency', '特急件')], string='紧急度',
|
||||
|
||||
@@ -16,7 +16,7 @@ class YuthonAdjustmentsApproval(models.Model):
|
||||
is_issues = fields.Boolean(string='是否上会')
|
||||
issues_result = fields.Html(string="会议结果")
|
||||
related_issues_id = fields.Many2one('issue.library', string="关联议题")
|
||||
reason_application = fields.Html(string="申请事由")
|
||||
reason_application = fields.Text(string="申请事由")
|
||||
replacement_data = fields.Date(string="值班时间")
|
||||
documents_ids = fields.Many2many('ir.attachment', string="附件")
|
||||
active = fields.Boolean('Active', default=True, tracking=True)
|
||||
|
||||
@@ -17,7 +17,7 @@ class YuthonCustomerApproval(models.Model):
|
||||
is_issues = fields.Boolean(string='是否上会')
|
||||
issues_result = fields.Html(string="会议结果")
|
||||
related_issues_id = fields.Many2one('issue.library', string="关联议题")
|
||||
reason_application = fields.Html(string="申请事由")
|
||||
reason_application = fields.Text(string="申请事由")
|
||||
documents_ids = fields.Many2many('ir.attachment', string="附件")
|
||||
active = fields.Boolean('Active', default=True, tracking=True)
|
||||
urgency_level = fields.Selection([('normal', '普件'), ('urgent', '急件'), ('emergency', '特急件')], string='紧急度',
|
||||
|
||||
@@ -25,7 +25,7 @@ class YuthonShiftApproval(models.Model):
|
||||
is_issues = fields.Boolean(string='是否上会')
|
||||
issues_result = fields.Html(string="会议结果")
|
||||
related_issues_id = fields.Many2one('issue.library', string="关联议题")
|
||||
reason_application = fields.Html(string="申请事由")
|
||||
reason_application = fields.Text(string="申请事由")
|
||||
documents_ids = fields.Many2many('ir.attachment', string="附件")
|
||||
active = fields.Boolean('Active', default=True, tracking=True)
|
||||
urgency_level = fields.Selection([('normal', '普件'), ('urgent', '急件'), ('emergency', '特急件')], string='紧急度',
|
||||
|
||||
@@ -10,7 +10,7 @@ class YuthonSpecialApproval(models.Model):
|
||||
|
||||
users_id = fields.Many2one('res.users', string="申请人", default=lambda self: self.env.user.id)
|
||||
name = fields.Char(string="标题", readonly=False, default=lambda self: self.env.user.employee_id.resource_id.name)
|
||||
reason_application = fields.Html(string="申请事由")
|
||||
reason_application = fields.Text(string="申请事由")
|
||||
company_id = fields.Many2one('res.company', string="公司", default=lambda self: self.env.user.company_id.id)
|
||||
code = fields.Char(string="编号", default=lambda self: self.env['ir.sequence'].next_by_code('special_approval'))
|
||||
resource_id = fields.Many2one('resource.resource', string="发起人",
|
||||
|
||||
@@ -19,15 +19,23 @@ class ResGroups(models.Model):
|
||||
self.write({'users': [(3, user.id) for user in users_to_unlink2]})
|
||||
self.write({'users_ids': [(5, 0, 0)]})
|
||||
self.write({'employee_ids': [(5, 0, 0)]})
|
||||
self.write({'department_ids': [(5, 0, 0)]})
|
||||
self.write({'user_role_ids': [(5, 0, 0)]})
|
||||
self.write({'users_role_group_ids': [(5, 0, 0)]})
|
||||
|
||||
def rule_unlink(self):
|
||||
self.rule_groups.unlink()
|
||||
self.model_access.unlink()
|
||||
|
||||
def users_add(self):
|
||||
for user in self.employee_ids:
|
||||
if user.user_id:
|
||||
self.write({'users': [(4, user.user_id.id)]})
|
||||
@api.onchange('employee_ids', 'department_ids', 'user_role_ids', 'users_role_group_ids')
|
||||
def _onchange_update_users(self):
|
||||
"""动态更新 users 字段,基于员工、部门和角色的选择"""
|
||||
all_user_ids = set()
|
||||
# 1. 添加选中员工对应的用户
|
||||
for employee in self.employee_ids:
|
||||
if employee.user_id:
|
||||
all_user_ids.add(employee.user_id.id)
|
||||
# 2. 添加选中部门及其子部门的所有员工对应的用户
|
||||
def get_department_employees(department_id):
|
||||
valid_user_ids = set()
|
||||
employee_ids = self.env['hr.employee'].search([('department_id', '=', department_id.id)])
|
||||
@@ -37,16 +45,22 @@ class ResGroups(models.Model):
|
||||
valid_user_ids.update(get_department_employees(child))
|
||||
return valid_user_ids
|
||||
for department_id in self.department_ids:
|
||||
valid_user_ids = get_department_employees(department_id)
|
||||
if valid_user_ids:
|
||||
self.write({'users': [(4, user_id) for user_id in valid_user_ids]})
|
||||
all_user_ids.update(get_department_employees(department_id))
|
||||
# 3. 添加选中角色对应的用户
|
||||
for user_role in self.user_role_ids:
|
||||
user_employee_ids = self.env['hr.employee'].search(['|', ('user_role_id', '=', user_role.id), ('user_role_ids', 'in', [user_role.id])])
|
||||
self.write({'users': [(4, user.user_id.id) for user in user_employee_ids]})
|
||||
|
||||
user_employee_ids = self.env['hr.employee'].search(
|
||||
['|', ('user_role_id', '=', user_role.id.origin), ('user_role_ids', 'in', [user_role.id.origin])]
|
||||
)
|
||||
all_user_ids.update([user.user_id.id for user in user_employee_ids if user.user_id])
|
||||
# 4. 添加角色组对应的用户
|
||||
for record in self:
|
||||
group_role_ids = record.users_role_group_ids.user_role_ids
|
||||
for user_role in group_role_ids:
|
||||
user_employee_ids = self.env['hr.employee'].search(['|', ('user_role_id', '=', user_role.id), ('user_role_ids', 'in', [user_role.id])])
|
||||
self.write({'users': [(4, user.user_id.id) for user in user_employee_ids]})
|
||||
user_employee_ids = self.env['hr.employee'].search(
|
||||
['|', ('user_role_id', '=', user_role.id.origin), ('user_role_ids', 'in', [user_role.id.origin])]
|
||||
)
|
||||
all_user_ids.update([user.user_id.id for user in user_employee_ids if user.user_id])
|
||||
|
||||
# 更新 users 字段(使用 replace 操作)
|
||||
self.users = [(6, 0, list(all_user_ids))]
|
||||
|
||||
|
||||
@@ -10,7 +10,6 @@
|
||||
</xpath>
|
||||
<xpath expr="//group" position="before">
|
||||
<header>
|
||||
<button class="oe_highlight" name="users_add" string="更新用户" type="object"/>
|
||||
<button class="oe_highlight" name="users_unlink" string="清除用户" type="object"/>
|
||||
<button class="oe_highlight" name="rule_unlink" string="清除规则权限" type="object"/>
|
||||
</header>
|
||||
|
||||
@@ -20,7 +20,7 @@
|
||||
<attribute name="invisible">1</attribute>
|
||||
</xpath>
|
||||
<xpath expr="//field[@name='work_email']" position="after">
|
||||
<field name="user_state"/>
|
||||
<field name="user_state" readonly="1"/>
|
||||
</xpath>
|
||||
<xpath expr="//field[@name='department_id']" position="attributes">
|
||||
<attribute name="widget">ztree_select</attribute>
|
||||
@@ -101,7 +101,13 @@
|
||||
<xpath expr="//field[@name='job_id']" position="after">
|
||||
<field name="number"/>
|
||||
<field name="user_number"/>
|
||||
<field name="use_user_type"/>
|
||||
<field name="use_user_type" readonly="1"/>
|
||||
</xpath>
|
||||
<xpath expr="//field[@name='department_id']" position="attributes">
|
||||
<attribute name="readonly">1</attribute>
|
||||
</xpath>
|
||||
<xpath expr="//field[@name='job_id']" position="attributes">
|
||||
<attribute name="readonly">1</attribute>
|
||||
</xpath>
|
||||
<xpath expr="//field[@name='identification_id']" position="after">
|
||||
<field name="is_identification" invisible="1"/>
|
||||
|
||||
@@ -27,7 +27,7 @@ class YuthonOnboardApproval(models.Model):
|
||||
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="部门")
|
||||
account = fields.Char(string='账号')
|
||||
reason = fields.Html(string="正文")
|
||||
reason = fields.Text(string="正文")
|
||||
work_end = fields.Boolean(string="结束")
|
||||
employee_id = fields.Many2one('hr.employee', string="员工姓名")
|
||||
bank = fields.Char(string='开户行')
|
||||
|
||||
@@ -11,7 +11,7 @@ class YuthonPrepareApproval(models.Model):
|
||||
department_id = fields.Many2one(related='users_id.employee_id.department_id', string="部门")
|
||||
code = fields.Char(string="编号", default=lambda self: self.env['ir.sequence'].next_by_code('yuthon_prepare_approval_code'))
|
||||
name = fields.Char(string='标题')
|
||||
reason = fields.Html(string="正文")
|
||||
reason = fields.Text(string="正文")
|
||||
is_issues = fields.Boolean(string='是否上会')
|
||||
issues_result = fields.Html(string="会议结果")
|
||||
related_issues_id = fields.Many2one('issue.library', string="关联议题")
|
||||
|
||||
@@ -12,7 +12,7 @@ class YuthonRecruitmentApproval(models.Model):
|
||||
name = fields.Char(string='标题')
|
||||
users_id = fields.Many2one('res.users', string="申请人", default=lambda self: self.env.user.id)
|
||||
code = fields.Char(string="编号", default=lambda self: self.env['ir.sequence'].next_by_code('yuthon_recruitment_approval_code'))
|
||||
reason = fields.Html(string="正文")
|
||||
reason = fields.Text(string="正文")
|
||||
recruitment_ids = fields.One2many('hr.job', 'recruitment_approval_id', string="招聘申请")
|
||||
is_issues = fields.Boolean(string='是否上会')
|
||||
issues_result = fields.Html(string="会议结果")
|
||||
|
||||
@@ -27,7 +27,7 @@ class YutransferApproval(models.Model):
|
||||
notification_change_id = fields.Many2one("hr.employee", string="告知人员")
|
||||
handover_reason = fields.Text(string="移交原因")
|
||||
notice_documents_id = fields.Many2one('ir.attachment', string="附件")
|
||||
reason = fields.Html(string="正文")
|
||||
reason = fields.Text(string="正文")
|
||||
is_issues = fields.Boolean(string='是否上会')
|
||||
issues_result = fields.Html(string="会议结果")
|
||||
related_issues_id = fields.Many2one('issue.library', string="关联议题")
|
||||
|
||||
@@ -13,7 +13,7 @@ class YuthonEmployeeApproval(models.Model):
|
||||
dimension = fields.Char('评价维度', required=True)
|
||||
creation_time = fields.Datetime(string='申请日期', default=lambda self: fields.Datetime.now())
|
||||
job_id = fields.Many2one('hr.job', string="岗位")
|
||||
reason_text = fields.Html(string='申请事由')
|
||||
reason_text = fields.Text(string='申请事由')
|
||||
code = fields.Char(string="编号", default=lambda self: self.env['ir.sequence'].next_by_code('library_changes_personal_code'))
|
||||
|
||||
change_employee_library_ids = fields.One2many("yuthon.index.employee",'change_employee_library_id',string="员工指标库库变更明细")
|
||||
|
||||
@@ -10,7 +10,7 @@ class YuthonIndexApproval(models.Model):
|
||||
name = fields.Char('标题')
|
||||
creation_time = fields.Datetime(string='申请日期', default=lambda self: fields.Datetime.now())
|
||||
job_id = fields.Many2one('hr.job', string="岗位")
|
||||
reason_text = fields.Html(string='申请事由')
|
||||
reason_text = fields.Text(string='申请事由')
|
||||
code = fields.Char(string="编号",
|
||||
default=lambda self: self.env['ir.sequence'].next_by_code('library_changes_organize_code'))
|
||||
change_index_library_ids = fields.One2many("yuthon.index.management",'change_index_library_id',string="组织指标库变更明细")
|
||||
|
||||
@@ -7,6 +7,6 @@ class YuthonPlanApproval(models.Model):
|
||||
name = fields.Char('标题')
|
||||
creation_time = fields.Datetime(string='申请日期', default=lambda self: fields.Datetime.now())
|
||||
job_id = fields.Many2one('hr.job', string="岗位")
|
||||
reason_text = fields.Html(string='申请事由')
|
||||
reason_text = fields.Text(string='申请事由')
|
||||
|
||||
# change_plan_ids = fields.One2many("yuthon.plan.management.line",'change_plan_id',string="个人计划变更明细")
|
||||
|
||||
@@ -13,7 +13,7 @@ class YuthonTissueDutyApproval(models.Model):
|
||||
creation_time = fields.Datetime(string='申请日期', default=lambda self: fields.Datetime.now())
|
||||
code = fields.Char(string="编号", default=lambda self: self.env['ir.sequence'].next_by_code('duty_approval_code'))
|
||||
job_id = fields.Many2one('hr.job', string="岗位")
|
||||
reason_text = fields.Html(string='申请事由')
|
||||
reason_text = fields.Text(string='申请事由')
|
||||
|
||||
# 指标变更
|
||||
change_duty_kpi_ids = fields.One2many('yuthon.kpi.line', 'change_duty_kpi_id', string="原KPI明细")
|
||||
|
||||
@@ -230,8 +230,59 @@ class YuthonProperty(models.Model):
|
||||
self._context.get('active_ids', self._context.get('active_id')))
|
||||
form_id = self.env.ref('yuthon_property_approval.view_property_management_form').id
|
||||
property_list = []
|
||||
today = fields.Date.today()
|
||||
first_record = property_ids[0]
|
||||
# 获取第一条记录的有效purpose_id
|
||||
valid_manage = first_record.manage_information_ids.filtered(
|
||||
lambda m: m.start_time and m.start_time <= today and
|
||||
(not m.end_date or m.end_date >= today)
|
||||
)
|
||||
|
||||
if not valid_manage:
|
||||
raise UserError(f"{first_record.name}该物业没有找到有效的管理信息!")
|
||||
reference_purpose_id = valid_manage[0].purpose_id.id
|
||||
# 参考值集合(tenure_type, company_id, admin_id, precinct_id, purpose_id)
|
||||
reference_values = (
|
||||
first_record.tenure_type,
|
||||
first_record.company_id.id,
|
||||
first_record.admin_id.id,
|
||||
first_record.precinct_id.id,
|
||||
reference_purpose_id
|
||||
)
|
||||
# 检查所有记录的属性是否与第一条记录一致
|
||||
for record in property_ids[1:]:
|
||||
# 获取当前记录的有效purpose_id
|
||||
current_valid_manage = record.manage_information_ids.filtered(
|
||||
lambda m: m.start_time and m.start_time <= today and
|
||||
(not m.end_date or m.end_date >= today)
|
||||
)
|
||||
|
||||
if not current_valid_manage:
|
||||
raise UserError(f"{first_record.name}该物业没有找到有效的管理信息!")
|
||||
current_purpose_id = current_valid_manage[0].purpose_id.id
|
||||
# 当前记录的值集合
|
||||
current_values = (
|
||||
record.tenure_type,
|
||||
record.company_id.id,
|
||||
record.admin_id.id,
|
||||
record.precinct_id.id,
|
||||
current_purpose_id
|
||||
)
|
||||
# 如果有任何属性不一致,抛出统一错误
|
||||
if current_values != reference_values:
|
||||
raise UserError("所选记录的公司、管理类型、权属类型、管理员和所属片区必须完全一样!")
|
||||
for record in property_ids:
|
||||
property_list.append([0, 0, {'property_id': record.id}])
|
||||
for manage in record.manage_information_ids:
|
||||
# 判断记录是否有效:start_time ≤ today ≤ end_date(或end_date为空)
|
||||
if manage.start_time and manage.start_time <= today:
|
||||
if not manage.end_date or manage.end_date >= today:
|
||||
manage_id = manage
|
||||
else:
|
||||
manage_id = False
|
||||
else:
|
||||
manage_id = False
|
||||
property_list.append([0, 0, {'property_id': record.id,
|
||||
'information_line_id': manage_id.id}])
|
||||
return {
|
||||
'name': '提交物业变更',
|
||||
'view_mode': 'form',
|
||||
@@ -239,6 +290,11 @@ class YuthonProperty(models.Model):
|
||||
'type': 'ir.actions.act_window',
|
||||
'views': [(form_id, 'form')],
|
||||
"context": {
|
||||
'default_company_id': first_record.company_id.id,
|
||||
'default_purpose_id': reference_purpose_id,
|
||||
'default_admin_id_all': first_record.admin_id.id,
|
||||
'default_precinct_id': first_record.precinct_id.id,
|
||||
'default_tenure_type': first_record.tenure_type,
|
||||
'default_management_line2_ids': property_list
|
||||
}
|
||||
}
|
||||
|
||||
@@ -14,7 +14,7 @@ class PropertyClaimApproval(models.Model):
|
||||
department_id = fields.Many2one('hr.department', string="部门")
|
||||
urgency_level = fields.Selection([('normal', '普件'), ('urgent', '急件'), ('emergency', '特急件')], string='紧急度',
|
||||
default='normal')
|
||||
reason = fields.Html(string="事由")
|
||||
reason = fields.Text(string="事由")
|
||||
total_received = fields.Float(string='总额')
|
||||
work_fee = fields.Float(string='办公费')
|
||||
manage_fee = fields.Float(string='管理费')
|
||||
|
||||
@@ -13,7 +13,7 @@ class PropertyBorrowingApproval(models.Model):
|
||||
users_id = fields.Many2one('res.users', string="申请人", default=lambda self: self.env.user.id)
|
||||
department_id = fields.Many2one('hr.department', string="部门")
|
||||
urgency_level = fields.Selection([('normal', '普件'), ('urgent', '急件'), ('emergency', '特急件')], string='紧急度', default='normal')
|
||||
reason = fields.Html(string="事由")
|
||||
reason = fields.Text(string="事由")
|
||||
pay_tissue = fields.Char(string="付款组织")
|
||||
collection_account = fields.Char(string="收款账号")
|
||||
total_received = fields.Float(string='总额')
|
||||
|
||||
@@ -19,7 +19,7 @@ class PropertyConstructionApproval(models.Model):
|
||||
project_content = fields.Char(string="工程内容")
|
||||
company_b_id = fields.Many2one('property.construction.unit', string="乙方")
|
||||
property_id = fields.Many2one('yuthon.property', string='物业')
|
||||
reason = fields.Html(string="正文")
|
||||
reason = fields.Text(string="正文")
|
||||
image = fields.Binary(string="开工前图片")
|
||||
contract_id = fields.Many2one('ir.attachment', string="合同")
|
||||
start_date = fields.Date(string="开始日期")
|
||||
|
||||
@@ -21,7 +21,7 @@ class PropertyEligibility(models.Model):
|
||||
is_issues = fields.Boolean(string='是否上会')
|
||||
issues_result = fields.Html(string="会议结果")
|
||||
related_issues_id = fields.Many2one('issue.library', string="关联议题")
|
||||
reason = fields.Html(string="事由")
|
||||
reason = fields.Text(string="事由")
|
||||
notice_documents_ids = fields.Many2many('ir.attachment', string="附件")
|
||||
active = fields.Boolean('Active', default=True, tracking=True)
|
||||
urgency_level = fields.Selection([('normal', '普件'), ('urgent', '急件'), ('emergency', '特急件')], string='紧急度',
|
||||
|
||||
@@ -16,7 +16,7 @@ class PropertyIntentionApproval(models.Model):
|
||||
is_issues = fields.Boolean(string='是否上会')
|
||||
issues_result = fields.Html(string="会议结果")
|
||||
related_issues_id = fields.Many2one('issue.library', string="关联议题")
|
||||
reason = fields.Html(string="事由")
|
||||
reason = fields.Text(string="事由")
|
||||
notice_documents_ids = fields.Many2many('ir.attachment', string="附件")
|
||||
active = fields.Boolean('Active', default=True, tracking=True)
|
||||
intention_customer_ids = fields.One2many('property.intention.customer.line', 'property_intention_id', string="关联意向客户明细行")
|
||||
|
||||
@@ -12,7 +12,7 @@ class PropertyLeaseExtension(models.Model):
|
||||
_rec_name = 'name'
|
||||
|
||||
name = fields.Char(string='标题')
|
||||
reason = fields.Html(string="正文")
|
||||
reason = fields.Text(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="部门")
|
||||
code = fields.Char(string="编号",
|
||||
|
||||
@@ -18,7 +18,6 @@ class PropertyManagement(models.Model):
|
||||
department_id = fields.Many2one('hr.department', related='user_id.employee_id.department_id',string="申请人部门")
|
||||
handling_opinions = fields.Text(string="经办意见")
|
||||
management_line2_ids = fields.One2many('property.management.line2', 'property_management_id', string="原物业信息")
|
||||
new_property_ids = fields.One2many('property.information.detail.lines', 'new_property_id', string="新物业信息")
|
||||
management_line_ids = fields.One2many('property.management.line', 'property_management_id', string="物业信息")
|
||||
urgency_level = fields.Selection([('normal', '普件'), ('urgent', '急件'), ('emergency', '特急件')], string='紧急度',
|
||||
default='normal')
|
||||
@@ -29,6 +28,12 @@ class PropertyManagement(models.Model):
|
||||
active = fields.Boolean('Active', default=True, tracking=True)
|
||||
work_end = fields.Boolean(string="结束")
|
||||
|
||||
company_id = fields.Many2one('yuthon.property.company', string="公司")
|
||||
purpose_id = fields.Many2one('yuthon.resource.purpose', string="管理类型")
|
||||
admin_id_all = fields.Many2one('res.users', string="管理员")
|
||||
precinct_id = fields.Many2one('yuthon.precinct.message', string="所属片区")
|
||||
tenure_type = fields.Selection([('self', '自有'), ('agency', '代管')], string='权属类型')
|
||||
|
||||
def _get_default_name_title(self):
|
||||
return self._description if self._description else self._name
|
||||
|
||||
@@ -53,7 +58,6 @@ class PropertyManagement(models.Model):
|
||||
@api.onchange('management_line2_ids')
|
||||
def _onchange_management_line2_ids(self):
|
||||
self.management_line_ids = [(5, 0, 0)]
|
||||
self.new_property_ids = [(5, 0, 0)]
|
||||
for line in self.management_line2_ids:
|
||||
if line.property_id:
|
||||
self.management_line_ids = [(0, 0, {
|
||||
@@ -64,33 +68,29 @@ class PropertyManagement(models.Model):
|
||||
'admin_id_all': line.admin_id_all.id,
|
||||
'tenure_type': line.tenure_type
|
||||
})]
|
||||
self.new_property_ids = [(0, 0, {
|
||||
'property_id': line.property_id.id,
|
||||
})]
|
||||
|
||||
def approval_end(self):
|
||||
for record in self:
|
||||
for line in record.new_property_ids:
|
||||
for line in record.management_line2_ids:
|
||||
line.property_id.write({
|
||||
'company_id': line.company_id.id,
|
||||
'purpose_id': line.purpose_id.id,
|
||||
'precinct_id': line.precincts_id.id,
|
||||
'admin_id': line.admin_id_all.id,
|
||||
'tenure_type': line.tenure_type
|
||||
'company_id': record.company_id.id,
|
||||
'precinct_id': record.precinct_id.id,
|
||||
'admin_id': record.admin_id_all.id,
|
||||
'tenure_type': record.tenure_type
|
||||
})
|
||||
record.write({'is_line': True})
|
||||
|
||||
class PropertyInformationDetailLines(models.Model):
|
||||
_name = 'property.information.detail.lines'
|
||||
_description = '新物业信息'
|
||||
|
||||
new_property_id = fields.Many2one('property.management', string="关联物业分配申请表")
|
||||
property_id = fields.Many2one('yuthon.property', string="物业名称")
|
||||
company_id = fields.Many2one('yuthon.property.company', string="公司")
|
||||
purpose_id = fields.Many2one('yuthon.resource.purpose', string="管理类型")
|
||||
admin_id_all = fields.Many2one('res.users', string="管理员")
|
||||
precincts_id = fields.Many2one('yuthon.precinct.message', string="新片区")
|
||||
tenure_type = fields.Selection([('self', '自有'), ('agency', '代管')], string='权属类型')
|
||||
line.information_line_id.write({'end_date': fields.Date.today()})
|
||||
self.env['manage.information.line'].create({
|
||||
'yuthon_property_id': line.property_id.id,
|
||||
'purpose_id' : record.purpose_id.id,
|
||||
'precinct_id': record.precinct_id.id,
|
||||
'tenure_type': record.tenure_type,
|
||||
'management_area': line.information_line_id.management_area,
|
||||
'rent_area': line.information_line_id.rent_area,
|
||||
'admin_id' : record.admin_id_all.id,
|
||||
'company_id': record.company_id.id,
|
||||
'start_time': fields.Date.today(),
|
||||
})
|
||||
record.write({'is_line': True})
|
||||
|
||||
# 结果保留明细行
|
||||
class PropertyManagementLine(models.Model):
|
||||
@@ -99,6 +99,7 @@ class PropertyManagementLine(models.Model):
|
||||
|
||||
property_id = fields.Many2one('yuthon.property', string="物业名称")
|
||||
property_management_id = fields.Many2one('property.management', string="关联物业分配申请表")
|
||||
information_line_id = fields.Many2one('manage.information.line')
|
||||
company_id = fields.Many2one('yuthon.property.company', string="公司")
|
||||
purpose_id = fields.Many2one('yuthon.resource.purpose', string="管理类型")
|
||||
admin_id_all = fields.Many2one('res.users', string="管理员")
|
||||
@@ -113,9 +114,12 @@ class PropertyManagementLine2(models.Model):
|
||||
property_management_id = fields.Many2one('property.management', string="关联物业分配申请表")
|
||||
property_id = fields.Many2one('yuthon.property', string="物业名称")
|
||||
purpose_id = fields.Many2one('yuthon.resource.purpose', string="管理类型")
|
||||
information_line_id = fields.Many2one('manage.information.line')
|
||||
tenure_type = fields.Selection(related='property_id.tenure_type', string='权属类型')
|
||||
company_id = fields.Many2one(related='property_id.company_id', string="公司")
|
||||
admin_id_all = fields.Many2one(related='property_id.admin_id', string="管理员")
|
||||
precinct_id = fields.Many2one(related='property_id.precinct_id', string="所属片区")
|
||||
|
||||
|
||||
class PropertyInformationDetailLines(models.Model):
|
||||
_name = 'property.information.detail.lines'
|
||||
@@ -8,7 +8,7 @@ class PropertyMergeApproval(models.Model):
|
||||
_description = '物业合并审批'
|
||||
|
||||
name = fields.Char(string='标题')
|
||||
reason = fields.Html(string="正文")
|
||||
reason = fields.Text(string="正文")
|
||||
notice_documents_ids = fields.Many2many('ir.attachment', 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="部门")
|
||||
|
||||
@@ -12,7 +12,7 @@ class PropertyPenaltyRelief(models.Model):
|
||||
_rec_name = 'name'
|
||||
|
||||
name = fields.Char(string='标题')
|
||||
reason = fields.Html(string="正文")
|
||||
reason = fields.Text(string="正文")
|
||||
users_id = fields.Many2one('res.users', string="申请人", default=lambda self: self.env.user.id)
|
||||
department_id = fields.Many2one('hr.department', string="部门", related='users_id.employee_id.department_id')
|
||||
code = fields.Char(string="编号",
|
||||
|
||||
@@ -11,7 +11,7 @@ class PropertyRentRelief(models.Model):
|
||||
_rec_name = 'name'
|
||||
|
||||
name = fields.Char(string='标题')
|
||||
reason = fields.Html(string="正文")
|
||||
reason = fields.Text(string="正文")
|
||||
code = fields.Char(string="编号",
|
||||
default=lambda self: self.env['ir.sequence'].next_by_code('property_penalty_relief_code'))
|
||||
users_id = fields.Many2one('res.users', string="申请人", default=lambda self: self.env.user.id)
|
||||
|
||||
@@ -8,7 +8,7 @@ class PropertyRentalForm(models.Model):
|
||||
_inherit = ['mail.thread.main.attachment', 'mail.activity.mixin', 'soong.workflow.mixin']
|
||||
|
||||
name = fields.Char(string="名称", required=True)
|
||||
reason = fields.Html(string="正文")
|
||||
reason = fields.Text(string="正文")
|
||||
documents_ids = fields.Many2many('ir.attachment', string="附件")
|
||||
listing_method = fields.Selection([('enterprise', '企业自挂牌'), ('makeup', '广交所挂牌')], string="挂牌方式")
|
||||
users_id = fields.Many2one('res.users', string="申请人", default=lambda self: self.env.user.id)
|
||||
|
||||
@@ -21,7 +21,7 @@ class PropertySplitApproval(models.Model):
|
||||
issues_result = fields.Html(string="会议结果")
|
||||
related_issues_id = fields.Many2one('issue.library', string="关联议题")
|
||||
name = fields.Char(string='标题')
|
||||
reason = fields.Html(string="正文")
|
||||
reason = fields.Text(string="正文")
|
||||
notice_documents_ids = fields.Many2many('ir.attachment', string="附件")
|
||||
property_split_approval_line_ids = fields.One2many('property.split.approval.line', 'property_split_approval_id', string='关联物业拆分明细行')
|
||||
split_quantity = fields.Integer(string='拆分数量', default=2)
|
||||
|
||||
@@ -15,7 +15,7 @@ class PropertyTransactionConfirmed(models.Model):
|
||||
lessee_id = fields.Many2one('property.tenant.information', string='承租方')
|
||||
entity_type = fields.Selection([('person', '个人'), ('enterprise', '企业')], string='实体类型')
|
||||
details = fields.Text(string='详情') #这里可以完善承租方信息,为租赁合同服务
|
||||
reason = fields.Html(string="正文")
|
||||
reason = fields.Text(string="正文")
|
||||
documents_ids = fields.Many2many('ir.attachment', 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="部门")
|
||||
|
||||
@@ -17,7 +17,7 @@ class PropertyTransferApproval(models.Model):
|
||||
is_issues = fields.Boolean(string='是否上会')
|
||||
issues_result = fields.Html(string="会议结果")
|
||||
related_issues_id = fields.Many2one('issue.library', string="关联议题")
|
||||
reason = fields.Html(string="事由")
|
||||
reason = fields.Text(string="事由")
|
||||
notice_documents_ids = fields.Many2many('ir.attachment', string="附件")
|
||||
active = fields.Boolean('Active', default=True, tracking=True)
|
||||
rental_address = fields.Char(string="租赁地址")
|
||||
|
||||
@@ -24,7 +24,6 @@ access_property_confirm,property_confirm,model_property_confirm,base.group_user,
|
||||
access_property_move,property_move,model_property_move,base.group_user,1,1,1,1
|
||||
access_property_record,property_record,model_property_record,base.group_user,1,1,1,1
|
||||
access_property_equity,property_equity,model_property_equity,base.group_user,1,1,1,1
|
||||
access_property_information_detail_lines,property_information_detail_lines,model_property_information_detail_lines,base.group_user,1,1,1,1
|
||||
access_property_lease_contract_line,property_lease_contract_line,model_property_lease_contract_line,base.group_user,1,1,1,1
|
||||
access_property_rent_breakdown_line,property_rent_breakdown_line,model_property_rent_breakdown_line,base.group_user,1,1,1,1
|
||||
access_property_water_fee_line,property_water_fee_line,model_property_water_fee_line,base.group_user,1,1,1,1
|
||||
|
||||
|
@@ -71,6 +71,7 @@
|
||||
<field name="admin_id_all"/>
|
||||
<field name="precinct_id"/>
|
||||
<field name="purpose_id"/>
|
||||
<field name="information_line_id"/>
|
||||
</tree>
|
||||
</field>
|
||||
</group>
|
||||
@@ -84,21 +85,26 @@
|
||||
<field name="admin_id_all"/>
|
||||
<field name="precinct_id"/>
|
||||
<field name="purpose_id"/>
|
||||
<field name="information_line_id"/>
|
||||
</tree>
|
||||
</field>
|
||||
</group>
|
||||
<group string="新管理信息">
|
||||
<field name="new_property_ids" string=" ">
|
||||
<tree editable="bottom">
|
||||
<field name="new_property_id" column_invisible="1"/>
|
||||
<field name="property_id"/>
|
||||
<field name="company_id" required="1"/>
|
||||
<field name="tenure_type"/>
|
||||
<field name="admin_id_all"/>
|
||||
<field name="precincts_id"/>
|
||||
<field name="purpose_id"/>
|
||||
</tree>
|
||||
</field>
|
||||
<group col="5">
|
||||
<group>
|
||||
<field name="company_id"/>
|
||||
</group>
|
||||
<group>
|
||||
<field name="tenure_type"/>
|
||||
</group>
|
||||
<group>
|
||||
<field name="admin_id_all"/>
|
||||
</group>
|
||||
<group>
|
||||
<field name="precinct_id"/>
|
||||
</group>
|
||||
<group>
|
||||
<field name="purpose_id"/>
|
||||
</group>
|
||||
</group>
|
||||
</sheet>
|
||||
</form>
|
||||
|
||||
@@ -1,15 +1,19 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
{
|
||||
'name': "Yuthon PurchaseOrder",
|
||||
'name': "Yuthon Purchase Order",
|
||||
'summary': "",
|
||||
'description': """采购单 """,
|
||||
'category': 'zhou',
|
||||
'version': '0.1',
|
||||
'license': 'LGPL-3',
|
||||
'depends': ['base', 'soong_workflow', 'hr', 'product', 'documents', 'purchase'],
|
||||
'depends': ['base', 'soong_workflow', 'hr', 'product', 'documents', 'purchase', ],
|
||||
'data': [
|
||||
'security/ir.model.access.csv',
|
||||
'data/purchase_data.xml',
|
||||
'views/inherit_purchase_order_views.xml',
|
||||
'views/purchase_low_orders_views.xml',
|
||||
'views/purchase_service_orders_views.xml',
|
||||
'views/menu.xml',
|
||||
],
|
||||
'installable': True,
|
||||
'application': True,
|
||||
|
||||
@@ -0,0 +1,27 @@
|
||||
<?xml version="1.0" encoding="UTF-8" ?>
|
||||
<odoo>
|
||||
<record id="purchase_low_orders_sequence" model="ir.sequence">
|
||||
<field name="name">低值易耗采购单编号</field>
|
||||
<field name="code">purchase_low_orders_code</field>
|
||||
<field name="prefix">DZ%(y)s%(month)s%(day)s</field>
|
||||
<field name="padding">3</field>
|
||||
<field name="company_id" eval="False"/>
|
||||
</record>
|
||||
|
||||
<record id="purchase_service_orders_sequence" model="ir.sequence">
|
||||
<field name="name">服务采购单编号</field>
|
||||
<field name="code">purchase_service_orders_code</field>
|
||||
<field name="prefix">FW%(y)s%(month)s%(day)s</field>
|
||||
<field name="padding">3</field>
|
||||
<field name="company_id" eval="False"/>
|
||||
</record>
|
||||
|
||||
<record id="issue_meeting_code_num_sequence" model="ir.sequence">
|
||||
<field name="name">会议纪要编号</field>
|
||||
<field name="code">issue_meeting_minutes_code</field>
|
||||
<field name="prefix">HY%(y)s%(month)s%(day)s</field>
|
||||
<field name="padding">3</field>
|
||||
<field name="company_id" eval="False"/>
|
||||
</record>
|
||||
|
||||
</odoo>
|
||||
@@ -1,2 +1,4 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
from . import inherit_purchase_order
|
||||
from . import purchase_low_orders
|
||||
from . import purchase_service_orders
|
||||
@@ -11,12 +11,8 @@ class PurchaseOrder(models.Model):
|
||||
department_id = fields.Many2one(related='user_id.employee_id.department_id', string="部门")
|
||||
start_date = fields.Date(string="申请日期", default=fields.Date.today)
|
||||
code = fields.Char(string="合同编号")
|
||||
reason_text = fields.Html(string='申请事由')
|
||||
reason_text = fields.Text(string='申请事由')
|
||||
document_ids = fields.Many2many('ir.attachment', string="附件")
|
||||
service_content = fields.Text(string="服务内容")
|
||||
service_start_date = fields.Date(string="服务开始时间")
|
||||
service_end_date = fields.Date(string="服务结束时间")
|
||||
type_of_procurement = fields.Selection([('service', '服务'), ('product', '低值易耗'), ('fixed', '固定资产')], string="采购类型")
|
||||
purchase_order_models_ids = fields.One2many('purchase.order.pay.line', 'purchase_id', string="付款详情")
|
||||
|
||||
|
||||
@@ -25,7 +21,9 @@ class PurchaseOrderPayLine(models.Model):
|
||||
_description = "付款详情"
|
||||
|
||||
purchase_id = fields.Many2one('purchase.order', string="关联采购单")
|
||||
low_id = fields.Many2one('purchase.low.orders', string="关联低值易耗采购单")
|
||||
service_id = fields.Many2one('purchase.service.orders', string="关联服务采购单")
|
||||
payment_stage = fields.Char(string="付款阶段")
|
||||
amount = fields.Char(string="比例/金额")
|
||||
amount = fields.Char(string="比例/金额")
|
||||
payment_date = fields.Date(string="付款日期")
|
||||
remake = fields.Char(string="条件")
|
||||
@@ -0,0 +1,47 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
from odoo import api, fields, models
|
||||
|
||||
|
||||
class PurchaseLowOrders(models.Model):
|
||||
_name = 'purchase.low.orders'
|
||||
_description = '低值易耗采购单'
|
||||
_inherit = ['soong.workflow.mixin']
|
||||
|
||||
name = fields.Char(string="标题")
|
||||
code = fields.Char(string="合同编号", default=lambda self: self.env['ir.sequence'].next_by_code('purchase_low_orders_code'))
|
||||
user_id = fields.Many2one('res.users', string="申请人", default=lambda self: self.env.user.id)
|
||||
date_application = fields.Date(string="申请日期", default=fields.Date.today())
|
||||
company_id = fields.Many2one('res.company', string='公司', index=True, default=lambda self: self.env.company)
|
||||
reason_application = fields.Text(string="申请事由")
|
||||
department_id = fields.Many2one(related='user_id.employee_id.department_id', string="申请部门")
|
||||
partyB = fields.Many2one('res.partner', string="乙方")
|
||||
document_ids = fields.Many2many('ir.attachment', string="附件")
|
||||
pay_way = fields.Selection([('staging', '分期'), ('full', '一次性')], string='付款方式', default='full')
|
||||
total = fields.Float(string="合计")
|
||||
urgency_level = fields.Selection([('normal', '普件'), ('urgent', '急件'), ('emergency', '特急件')], string='紧急度',
|
||||
default='normal')
|
||||
work_end = fields.Boolean(string="结束")
|
||||
active = fields.Boolean('Active', default=True, tracking=True)
|
||||
low_line_ids = fields.One2many('purchase.low.line', 'purchase_id', string="采购明细")
|
||||
purchase_ids = fields.One2many('purchase.order.pay.line', 'low_id', 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)
|
||||
|
||||
|
||||
class PurchaseLowLine(models.Model):
|
||||
_name = 'purchase.low.line'
|
||||
_description = '低值易耗采购单明细'
|
||||
|
||||
purchase_id = fields.Many2one('purchase.low.orders', string="关联采购单")
|
||||
name = fields.Char(string="物品名称")
|
||||
brand = fields.Char(string="品牌")
|
||||
specs = fields.Char(string="规格")
|
||||
number = fields.Integer(string="数量")
|
||||
unit = fields.Char(string="单位")
|
||||
price = fields.Float(string="单价")
|
||||
|
||||
|
||||
|
||||
@@ -0,0 +1,51 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
from odoo import api, fields, models
|
||||
|
||||
|
||||
class PurchaseServiceOrders(models.Model):
|
||||
_name = 'purchase.service.orders'
|
||||
_description = '服务采购单'
|
||||
_inherit = ['soong.workflow.mixin']
|
||||
|
||||
name = fields.Char(string="标题")
|
||||
code = fields.Char(string="合同编号", default=lambda self: self.env['ir.sequence'].next_by_code('purchase_service_orders_code'))
|
||||
user_id = fields.Many2one('res.users', string="申请人", default=lambda self: self.env.user.id)
|
||||
date_application = fields.Date(string="申请日期", default=fields.Date.today())
|
||||
company_id = fields.Many2one('res.company', string='公司', index=True, default=lambda self: self.env.company)
|
||||
reason_application = fields.Text(string="申请事由")
|
||||
service_content = fields.Text(string="服务内容")
|
||||
service_start_date = fields.Date(string="服务开始日期")
|
||||
service_end_date = fields.Date(string="服务结束日期")
|
||||
department_id = fields.Many2one(related='user_id.employee_id.department_id', string="申请部门")
|
||||
partyB = fields.Many2one('res.partner', string="乙方")
|
||||
document_ids = fields.Many2many('ir.attachment', string="附件")
|
||||
pay_way = fields.Selection([('staging', '分期'), ('full', '一次性')], string='付款方式', default='full')
|
||||
total = fields.Float(string="合计")
|
||||
urgency_level = fields.Selection([('normal', '普件'), ('urgent', '急件'), ('emergency', '特急件')], string='紧急度',
|
||||
default='normal')
|
||||
work_end = fields.Boolean(string="结束")
|
||||
active = fields.Boolean('Active', default=True, tracking=True)
|
||||
service_line_ids = fields.One2many('purchase.service.line', 'service_id', string="采购明细")
|
||||
purchase_ids = fields.One2many('purchase.order.pay.line', 'service_id', 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)
|
||||
|
||||
|
||||
class PurchaseServiceLine(models.Model):
|
||||
_name = 'purchase.service.line'
|
||||
_description = '服务采购单明细'
|
||||
|
||||
service_id = fields.Many2one('purchase.service.orders', string="关联采购单")
|
||||
name = fields.Char(string="服务项目")
|
||||
frequency = fields.Char(string='频次')
|
||||
fee = fields.Float(string="费用")
|
||||
unit = fields.Char(string="单位")
|
||||
partyB = fields.Many2one('res.partner', string="供应商")
|
||||
price = fields.Float(string="单价")
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -1,2 +1,6 @@
|
||||
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
|
||||
access_purchase_order_pay_line, purchase_order_pay_line,model_purchase_order_pay_line,,1,1,1,1
|
||||
access_purchase_order_pay_line, purchase_order_pay_line,model_purchase_order_pay_line,,1,1,1,1
|
||||
access_purchase_low_orders, purchase_low_orders,model_purchase_low_orders,,1,1,1,1
|
||||
access_purchase_service_orders, purchase_service_orders,model_purchase_service_orders,,1,1,1,1
|
||||
access_purchase_low_line, purchase_low_line,model_purchase_low_line,,1,1,1,1
|
||||
access_purchase_service_line, purchase_service_line,model_purchase_service_line,,1,1,1,1
|
||||
|
@@ -9,11 +9,7 @@
|
||||
<field name="company_id"/>
|
||||
<field name="user_id"/>
|
||||
<field name="department_id"/>
|
||||
<field name="type_of_procurement"/>
|
||||
<field name="service_content" invisible="type_of_procurement != 'service'"/>
|
||||
<field name="service_start_date" invisible="type_of_procurement != 'service'"/>
|
||||
<field name="service_end_date" invisible="type_of_procurement != 'service'"/>
|
||||
<field name="start_date" invisible="type_of_procurement != 'product' or type_of_procurement != 'fixed'"/>
|
||||
<field name="start_date"/>
|
||||
<field name="code"/>
|
||||
<field name="reason_text"/>
|
||||
<field name="document_ids" widget="preview_many2many"/>
|
||||
|
||||
@@ -0,0 +1,11 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<odoo>
|
||||
<menuitem id="purchase_low_orders_menu"
|
||||
parent="purchase.menu_procurement_management"
|
||||
action="view_purchase_low_orders_action"
|
||||
sequence="10"/>
|
||||
<menuitem id="purchase_service_orders_menu"
|
||||
parent="purchase.menu_procurement_management"
|
||||
action="view_purchase_service_orders_action"
|
||||
sequence="11"/>
|
||||
</odoo>
|
||||
@@ -0,0 +1,102 @@
|
||||
<?xml version="1.0" encoding="UTF-8" ?>
|
||||
<odoo>
|
||||
<record id="view_purchase_low_orders_tree" model="ir.ui.view">
|
||||
<field name="name">purchase.low.orders.tree</field>
|
||||
<field name="model">purchase.low.orders</field>
|
||||
<field name="arch" type="xml">
|
||||
<tree string="低值易耗采购单">
|
||||
<field name="name"/>
|
||||
<field name="user_id"/>
|
||||
</tree>
|
||||
</field>
|
||||
</record>
|
||||
<record id="view_purchase_low_orders_form" model="ir.ui.view">
|
||||
<field name="name">purchase.low.orders.form</field>
|
||||
<field name="model">purchase.low.orders</field>
|
||||
<field name="arch" type="xml">
|
||||
<form string="低值易耗采购单">
|
||||
<sheet>
|
||||
<widget name="web_ribbon" title="普件" bg_color="text-bg-success"
|
||||
invisible="urgency_level != 'normal'"/>
|
||||
<widget name="web_ribbon" title="急件" bg_color="text-bg-warning"
|
||||
invisible="urgency_level != 'urgent'"/>
|
||||
<widget name="web_ribbon" title="特级" bg_color="text-bg-danger"
|
||||
invisible="urgency_level != 'emergency'"/>
|
||||
<group col="4">
|
||||
<group>
|
||||
<field name="code" string="流水号" readonly="1"/>
|
||||
</group>
|
||||
<group>
|
||||
<field name="urgency_level" readonly="1"/>
|
||||
</group>
|
||||
<group/>
|
||||
</group>
|
||||
<div class="col-12 text-center">
|
||||
<h1>
|
||||
<field name="name_title" readonly="1"/>
|
||||
</h1>
|
||||
</div>
|
||||
<group col="4">
|
||||
<group>
|
||||
<field name="company_id"/>
|
||||
</group>
|
||||
<group>
|
||||
<field name="department_id"/>
|
||||
</group>
|
||||
<group>
|
||||
<field name="user_id"/>
|
||||
</group>
|
||||
<group>
|
||||
<field name="date_application"/>
|
||||
</group>
|
||||
</group>
|
||||
<group string="申请事项">
|
||||
<field name="name"/>
|
||||
<field name="partyB"/>
|
||||
<field name="reason_application"/>
|
||||
<field name="document_ids" widget="preview_many2many"/>
|
||||
</group>
|
||||
<group string="采购明细">
|
||||
<field name="low_line_ids">
|
||||
<tree editable="bottom">
|
||||
<field name="purchase_id" column_invisible="1"/>
|
||||
<field name="name"/>
|
||||
<field name="brand"/>
|
||||
<field name="specs"/>
|
||||
<field name="number"/>
|
||||
<field name="unit"/>
|
||||
<field name="price"/>
|
||||
</tree>
|
||||
</field>
|
||||
</group>
|
||||
<group col="2">
|
||||
<group>
|
||||
<field name="pay_way"/>
|
||||
</group>
|
||||
<group>
|
||||
<field name="total"/>
|
||||
</group>
|
||||
</group>
|
||||
<notebook>
|
||||
<page string="付款明细">
|
||||
<field name="purchase_ids">
|
||||
<tree editable="bottom">
|
||||
<field name="low_id" column_invisible="1"/>
|
||||
<field name="payment_stage"/>
|
||||
<field name="amount"/>
|
||||
<field name="payment_date"/>
|
||||
<field name="remake"/>
|
||||
</tree>
|
||||
</field>
|
||||
</page>
|
||||
</notebook>
|
||||
</sheet>
|
||||
</form>
|
||||
</field>
|
||||
</record>
|
||||
<record id="view_purchase_low_orders_action" model="ir.actions.act_window">
|
||||
<field name="name">低值易耗品采购单</field>
|
||||
<field name="res_model">purchase.low.orders</field>
|
||||
<field name="view_mode">tree,form</field>
|
||||
</record>
|
||||
</odoo>
|
||||
@@ -0,0 +1,109 @@
|
||||
<?xml version="1.0" encoding="UTF-8" ?>
|
||||
<odoo>
|
||||
<record id="view_purchase_service_orders_tree" model="ir.ui.view">
|
||||
<field name="name">purchase.service.orders.tree</field>
|
||||
<field name="model">purchase.service.orders</field>
|
||||
<field name="arch" type="xml">
|
||||
<tree string="服务采购单">
|
||||
<field name="name"/>
|
||||
<field name="user_id"/>
|
||||
</tree>
|
||||
</field>
|
||||
</record>
|
||||
<record id="view_purchase_service_orders_form" model="ir.ui.view">
|
||||
<field name="name">purchase.service.orders.form</field>
|
||||
<field name="model">purchase.service.orders</field>
|
||||
<field name="arch" type="xml">
|
||||
<form string="服务采购单">
|
||||
<sheet>
|
||||
<widget name="web_ribbon" title="普件" bg_color="text-bg-success"
|
||||
invisible="urgency_level != 'normal'"/>
|
||||
<widget name="web_ribbon" title="急件" bg_color="text-bg-warning"
|
||||
invisible="urgency_level != 'urgent'"/>
|
||||
<widget name="web_ribbon" title="特级" bg_color="text-bg-danger"
|
||||
invisible="urgency_level != 'emergency'"/>
|
||||
<group col="4">
|
||||
<group>
|
||||
<field name="code" string="流水号" readonly="1"/>
|
||||
</group>
|
||||
<group>
|
||||
<field name="urgency_level" readonly="1"/>
|
||||
</group>
|
||||
<group/>
|
||||
</group>
|
||||
<div class="col-12 text-center">
|
||||
<h1>
|
||||
<field name="name_title" readonly="1"/>
|
||||
</h1>
|
||||
</div>
|
||||
<group col="4">
|
||||
<group>
|
||||
<field name="company_id"/>
|
||||
</group>
|
||||
<group>
|
||||
<field name="department_id"/>
|
||||
</group>
|
||||
<group>
|
||||
<field name="user_id"/>
|
||||
</group>
|
||||
<group>
|
||||
<field name="date_application"/>
|
||||
</group>
|
||||
</group>
|
||||
<group string="申请事项">
|
||||
<field name="name"/>
|
||||
<field name="service_content"/>
|
||||
<field name="partyB"/>
|
||||
<field name="service_start_date"/>
|
||||
<field name="service_end_date"/>
|
||||
<field name="reason_application"/>
|
||||
<field name="document_ids" widget="preview_many2many"/>
|
||||
</group>
|
||||
<group string="服务项目">
|
||||
<field name="service_line_ids">
|
||||
<tree editable="bottom">
|
||||
<field name="service_id" column_invisible="1"/>
|
||||
<field name="name"/>
|
||||
<field name="frequency"/>
|
||||
<field name="fee"/>
|
||||
<field name="unit"/>
|
||||
<field name="partyB"/>
|
||||
<field name="price"/>
|
||||
</tree>
|
||||
</field>
|
||||
</group>
|
||||
<group col="2">
|
||||
<group>
|
||||
<field name="pay_way"/>
|
||||
</group>
|
||||
<group>
|
||||
<field name="total"/>
|
||||
</group>
|
||||
</group>
|
||||
<notebook>
|
||||
<page string="付款明细">
|
||||
<field name="purchase_ids">
|
||||
<tree editable="bottom">
|
||||
<field name="service_id" column_invisible="1"/>
|
||||
<field name="payment_stage"/>
|
||||
<field name="amount"/>
|
||||
<field name="payment_date"/>
|
||||
<field name="remake"/>
|
||||
</tree>
|
||||
</field>
|
||||
</page>
|
||||
</notebook>
|
||||
</sheet>
|
||||
</form>
|
||||
</field>
|
||||
</record>
|
||||
<record id="view_purchase_service_orders_action" model="ir.actions.act_window">
|
||||
<field name="name">服务采购单</field>
|
||||
<field name="res_model">purchase.service.orders</field>
|
||||
<field name="view_mode">tree,form</field>
|
||||
</record>
|
||||
</odoo>
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -13,7 +13,7 @@ class YuthonOfficeSupplies(models.Model):
|
||||
issues_result = fields.Html(string="会议结果")
|
||||
users_id = fields.Many2one('res.users', string="申请人", default=lambda self: self.env.user.id)
|
||||
department_id = fields.Many2one('hr.department', string="部门", related='users_id.employee_id.department_id')
|
||||
reason_application = fields.Html(string="事由")
|
||||
reason_application = fields.Text(string="事由")
|
||||
date = fields.Date(string="申请日期", default=fields.Date.today())
|
||||
related_issues_id = fields.Many2one('issue.library', string="关联议题")
|
||||
office_supplies_ids = fields.One2many('yuthon.office.supplies.line', 'supplies_id', string="关联办公用品申请明细")
|
||||
|
||||
@@ -28,6 +28,7 @@
|
||||
'views/yuthon_none_views.xml',
|
||||
'views/yuthon_mutual_approval_views.xml',
|
||||
'views/yuthon_care_condolences_views.xml',
|
||||
'views/trade_project_approval_views.xml',
|
||||
'views/yuthon_trade_setting_views.xml',
|
||||
'views/yuthon_work_condolences_views.xml',
|
||||
'views/yuthon_task_approval_views.xml',
|
||||
@@ -36,7 +37,7 @@
|
||||
'views/yuthon_trade_menu.xml',
|
||||
],
|
||||
'demo': [],
|
||||
'depends': ['mail', 'documents', 'soong_workflow', 'yuthon_work_brand', 'hr', 'yuthon_hr_employee', 'yuthon_issue'],
|
||||
'depends': ['mail', 'documents', 'soong_workflow', 'yuthon_work_brand', 'hr', 'yuthon_hr_employee', 'yuthon_issue', 'project'],
|
||||
'installable': True,
|
||||
'application': True,
|
||||
}
|
||||
|
||||
@@ -1,5 +1,12 @@
|
||||
<?xml version="1.0" encoding="UTF-8" ?>
|
||||
<odoo>
|
||||
<record id="trade_project_approval_code_sequence" model="ir.sequence">
|
||||
<field name="name">立项申请编号</field>
|
||||
<field name="code">trade_project_approval_code</field>
|
||||
<field name="prefix">LX%(y)s%(month)s%(day)s</field>
|
||||
<field name="padding">3</field>
|
||||
<field name="company_id" eval="False"/>
|
||||
</record>
|
||||
<record id="property_work_condolences_code_sequence" model="ir.sequence">
|
||||
<field name="name">节日慰问编号</field>
|
||||
<field name="code">property_work_condolences_code</field>
|
||||
|
||||
@@ -23,3 +23,4 @@ from . import trade_reward_approval
|
||||
from . import yuthon_seals_approval
|
||||
from . import yuthon_business_approval
|
||||
from . import inherit_workflow_record
|
||||
from . import trade_project_approval
|
||||
|
||||
@@ -0,0 +1,52 @@
|
||||
# Part of Odoo. See LICENSE file for full copyright and licensing details.
|
||||
from odoo import models, fields, api, exceptions, _
|
||||
|
||||
|
||||
class TradeProjectApproval(models.Model):
|
||||
_name = 'trade.project.approval'
|
||||
_description = '立项申请'
|
||||
_inherit = ['soong.workflow.mixin', 'mail.thread.main.attachment', 'mail.activity.mixin']
|
||||
|
||||
code = fields.Char(string="流水号",
|
||||
default=lambda self: self.env['ir.sequence'].next_by_code('trade_project_approval_code'))
|
||||
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="申请部门")
|
||||
|
||||
urgency_level = fields.Selection([('normal', '普件'), ('urgent', '急件'), ('emergency', '特急件')], string='紧急度',
|
||||
default='normal')
|
||||
date_application = fields.Date(string="申请日期")
|
||||
text = fields.Text(string='正文')
|
||||
name = fields.Char(string="项目名称")
|
||||
project_classify_id = fields.Many2one('project.classify.setting', string="项目分类")
|
||||
start_date = fields.Date(string="计划开始")
|
||||
end_date = fields.Date(string="计划完成")
|
||||
plan_duration = fields.Integer(string="计划工期")
|
||||
funding_id = fields.Many2one('project.funding.setting', string="资金来源")
|
||||
employee_id = fields.Many2one('hr.employee', string="分管领导")
|
||||
project_invest = fields.Float(string="项目总投资")
|
||||
projected_earnings = fields.Float(string="预计投资收益")
|
||||
project_content = fields.Text(string="项目概括")
|
||||
project_goal = fields.Text(string="项目目标")
|
||||
expected_results = fields.Text(string="预期成果")
|
||||
document_ids = fields.Many2many('ir.attachment', string="立项文件")
|
||||
work_end = fields.Boolean(string="结束")
|
||||
active = fields.Boolean('Active', default=True, tracking=True)
|
||||
|
||||
def _get_default_name_title(self):
|
||||
return self._description if self._description else self._name
|
||||
|
||||
name_title = fields.Char(default=_get_default_name_title)
|
||||
|
||||
# 项目归属
|
||||
project_belong_id = fields.Many2one('res.users', string="项目负责人")
|
||||
project_department_id = fields.Many2one('hr.department', string="项目部门")
|
||||
|
||||
def approval_end(self):
|
||||
for rec in self:
|
||||
self.env['project.project'].create({
|
||||
'name' : rec.name,
|
||||
'user_id' : rec.project_belong_id.id,
|
||||
'company_id': rec.user_id.employee_id.company_id.id,
|
||||
})
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
# Part of Odoo. See LICENSE file for full copyright and licensing details.
|
||||
|
||||
from odoo import models, fields, api, exceptions, _
|
||||
|
||||
|
||||
class TradeRewardApproval(models.Model):
|
||||
_name = 'trade.reward.approval'
|
||||
_description = '奖励申报呈批表'
|
||||
|
||||
@@ -18,7 +18,7 @@ class YuthonBusinessApproval(models.Model):
|
||||
is_issues = fields.Boolean(string='是否上会')
|
||||
issues_result = fields.Html(string="会议结果")
|
||||
related_issues_id = fields.Many2one('issue.library', string="关联议题")
|
||||
reason = fields.Html(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="结束")
|
||||
|
||||
@@ -14,7 +14,7 @@ class YuthonCareCondolences(models.Model):
|
||||
default=lambda self: self.env['ir.sequence'].next_by_code('property_care_reward_code_sequence'))
|
||||
date = fields.Date(string='日期')
|
||||
fees = fields.Float(string='费用')
|
||||
reason = fields.Html(string="正文")
|
||||
reason = fields.Text(string="正文")
|
||||
marriage_cate_id = fields.Many2one('ir.attachment', string="结婚证明")
|
||||
marriage_date = fields.Date(string="结婚时间")
|
||||
born_cate_id = fields.Many2one('ir.attachment', string="出生证明")
|
||||
|
||||
@@ -14,20 +14,37 @@ class YuthonWorkSetting(models.Model):
|
||||
|
||||
name = fields.Char(string='名称')
|
||||
|
||||
|
||||
class SealsTypeSetting(models.Model):
|
||||
_name = 'seals.type.setting'
|
||||
_description = '用章类型'
|
||||
|
||||
name = fields.Char(string='名称')
|
||||
|
||||
|
||||
class SealsScopeSetting(models.Model):
|
||||
_name = 'seals.scope.setting'
|
||||
_description = '用章范围'
|
||||
|
||||
name = fields.Char(string='名称')
|
||||
|
||||
|
||||
class SendingUnitSetting(models.Model):
|
||||
_name = 'sending.unit.setting'
|
||||
_description = '发送单位'
|
||||
|
||||
name = fields.Char(string='名称')
|
||||
|
||||
|
||||
class ProjectClassifySetting(models.Model):
|
||||
_name = 'project.classify.setting'
|
||||
_description = '项目分类'
|
||||
|
||||
name = fields.Char(string='名称')
|
||||
|
||||
|
||||
class ProjectFundingSetting(models.Model):
|
||||
_name = 'project.funding.setting'
|
||||
_description = '资金来源'
|
||||
|
||||
name = fields.Char(string='名称')
|
||||
|
||||
@@ -14,7 +14,7 @@ class YuthonWorkCondolences(models.Model):
|
||||
default=lambda self: self.env['ir.sequence'].next_by_code('property_work_condolences_code_sequence'))
|
||||
date = fields.Date(string='日期')
|
||||
fees = fields.Float(string='费用')
|
||||
reason = fields.Html(string="正文")
|
||||
reason = fields.Text(string="正文")
|
||||
scheme_id = fields.Many2one('ir.attachment', string="方案")
|
||||
meeting_id = fields.Many2one('ir.attachment', string="会议纪要")
|
||||
work_end = fields.Boolean(string="结束")
|
||||
|
||||
@@ -31,6 +31,9 @@ access_yuthon_reward_line,yuthon_reward_line,model_yuthon_reward_line,base.group
|
||||
access_seals_type_setting,seals_type_setting,model_seals_type_setting,base.group_user,1,1,1,1
|
||||
access_seals_scope_setting,seals_scope_setting,model_seals_scope_setting,base.group_user,1,1,1,1
|
||||
access_sending_unit_setting,sending_unit_setting,model_sending_unit_setting,base.group_user,1,1,1,1
|
||||
access_trade_project_approval,trade_project_approval,model_trade_project_approval,base.group_user,1,1,1,1
|
||||
access_project_funding_setting,project_funding_setting,model_project_funding_setting,base.group_user,1,1,1,1
|
||||
access_project_classify_setting,project_classify_setting,model_project_classify_setting,base.group_user,1,1,1,1
|
||||
|
||||
|
||||
|
||||
|
||||
|
@@ -0,0 +1,103 @@
|
||||
<?xml version="1.0" encoding="UTF-8" ?>
|
||||
<odoo>
|
||||
<record id="view_trade_project_approval_tree" model="ir.ui.view">
|
||||
<field name="name">trade.project.approval.tree</field>
|
||||
<field name="model">trade.project.approval</field>
|
||||
<field name="arch" type="xml">
|
||||
<tree string="立项申请">
|
||||
<field name="name"/>
|
||||
<field name="users_id"/>
|
||||
<field name="project_classify_id"/>
|
||||
<field name="date_application"/>
|
||||
</tree>
|
||||
</field>
|
||||
</record>
|
||||
<record id="view_trade_project_approval_form" model="ir.ui.view">
|
||||
<field name="name">trade.project.approval.form</field>
|
||||
<field name="model">trade.project.approval</field>
|
||||
<field name="arch" type="xml">
|
||||
<form string="立项申请">
|
||||
<sheet>
|
||||
<widget name="web_ribbon" title="普件" bg_color="text-bg-success"
|
||||
invisible="urgency_level != 'normal'"/>
|
||||
<widget name="web_ribbon" title="急件" bg_color="text-bg-warning"
|
||||
invisible="urgency_level != 'urgent'"/>
|
||||
<widget name="web_ribbon" title="特级" bg_color="text-bg-danger"
|
||||
invisible="urgency_level != 'emergency'"/>
|
||||
<group col="2">
|
||||
<group>
|
||||
<field name="code" string="流水号" readonly="1"/>
|
||||
</group>
|
||||
<group>
|
||||
<field name="urgency_level" readonly="1"/>
|
||||
</group>
|
||||
<group/>
|
||||
</group>
|
||||
<div class="col-12 text-center">
|
||||
<h1>
|
||||
<field name="name_title" readonly="1"/>
|
||||
</h1>
|
||||
</div>
|
||||
<group col="3" string="经办信息">
|
||||
<group>
|
||||
<field name="users_id" string="申请人"/>
|
||||
</group>
|
||||
<group>
|
||||
<field name="department_id"/>
|
||||
</group>
|
||||
<group>
|
||||
<field name="date_application"/>
|
||||
</group>
|
||||
</group>
|
||||
<group string="项目信息">
|
||||
<field name="name"/>
|
||||
</group>
|
||||
<group col="4">
|
||||
<group>
|
||||
<field name="project_classify_id"/>
|
||||
</group>
|
||||
<group>
|
||||
<field name="start_date"/>
|
||||
</group>
|
||||
<group>
|
||||
<field name="end_date"/>
|
||||
</group>
|
||||
<group>
|
||||
<field name="plan_duration"/>
|
||||
</group>
|
||||
</group>
|
||||
<group col="3">
|
||||
<group>
|
||||
<field name="funding_id"/>
|
||||
</group>
|
||||
<group>
|
||||
<field name="project_invest"/>
|
||||
</group>
|
||||
<group>
|
||||
<field name="projected_earnings"/>
|
||||
</group>
|
||||
</group>
|
||||
<group>
|
||||
<field name="employee_id"/>
|
||||
<field name="project_content"/>
|
||||
<field name="project_goal"/>
|
||||
<field name="expected_results"/>
|
||||
</group>
|
||||
<group string="项目归属">
|
||||
<field name="project_belong_id"/>
|
||||
<field name="project_department_id"/>
|
||||
</group>
|
||||
</sheet>
|
||||
</form>
|
||||
</field>
|
||||
</record>
|
||||
<record id="trade_project_approval_action" model="ir.actions.act_window">
|
||||
<field name="name">立项申请</field>
|
||||
<field name="res_model">trade.project.approval</field>
|
||||
<field name="view_mode">tree,form</field>
|
||||
</record>
|
||||
</odoo>
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -45,7 +45,7 @@
|
||||
<field name="name"/>
|
||||
<field name="users_id"/>
|
||||
<field name="reason"/>
|
||||
<field name="document_ids" widget="preview_many2many"/>
|
||||
<field name="document_ids" widget="preview_many2many"/>d
|
||||
<field name="department_id" invisible="1"/>
|
||||
</group>
|
||||
</sheet>
|
||||
|
||||
@@ -38,10 +38,10 @@
|
||||
<group string="审批事项">
|
||||
<field name="work_end" invisible="1"/>
|
||||
<field name="name"/>
|
||||
<field name="users_id"/>
|
||||
<field name="type_stamp_ids" widget="many2many_tags"/>
|
||||
<field name="scope_chapter_id"/>
|
||||
<field name="approval_id"/>
|
||||
<field name="users_id" options="{'no_create': True}"/>
|
||||
<field name="type_stamp_ids" widget="many2many_tags" options="{'no_create': True}"/>
|
||||
<field name="scope_chapter_id" options="{'no_create': True}"/>
|
||||
<field name="approval_id" options="{'no_create': True}"/>
|
||||
<field name="remake"/>
|
||||
<field name="document_ids" widget="preview_many2many"/>
|
||||
<field name="department_id" invisible="1"/>
|
||||
|
||||
@@ -23,11 +23,6 @@
|
||||
parent="executive_manage_approval"
|
||||
action="action_yuthon_trade_pay"
|
||||
sequence="19"/>
|
||||
<menuitem id="executive_trade_policy"
|
||||
name="保单列表"
|
||||
parent="executive_manage_approval"
|
||||
action="view_yuthon_insurance_policy_action"
|
||||
sequence="21"/>
|
||||
<menuitem id="executive_trade_purchase"
|
||||
name="采购"
|
||||
parent="executive_manage_approval"
|
||||
@@ -108,6 +103,12 @@
|
||||
parent="executive_trade_process_ment"
|
||||
action="view_business_approval_action"
|
||||
sequence="80"/>
|
||||
<menuitem id="trade_project_approval_board"
|
||||
name="立项申请"
|
||||
parent="executive_trade_process_ment"
|
||||
action="trade_project_approval_action"
|
||||
sequence="90"/>
|
||||
|
||||
<menuitem id="executive_trade_setting"
|
||||
name="配置"
|
||||
parent="executive_manage_approval"
|
||||
@@ -152,4 +153,19 @@
|
||||
parent="executive_trade_setting"
|
||||
action="view_sending_unit_setting_action"
|
||||
sequence="70"/>
|
||||
<menuitem id="project_classify_setting_board"
|
||||
name="项目分类"
|
||||
parent="executive_trade_setting"
|
||||
action="view_project_classify_setting_action"
|
||||
sequence="80"/>
|
||||
<menuitem id="project_funding_setting_board"
|
||||
name="资金来源"
|
||||
parent="executive_trade_setting"
|
||||
action="view_project_funding_setting_action"
|
||||
sequence="90"/>
|
||||
<menuitem id="executive_trade_policy"
|
||||
name="保单"
|
||||
parent="executive_trade_setting"
|
||||
action="view_yuthon_insurance_policy_action"
|
||||
sequence="95"/>
|
||||
</odoo>
|
||||
@@ -70,4 +70,32 @@
|
||||
<field name="res_model">sending.unit.setting</field>
|
||||
<field name="view_mode">tree</field>
|
||||
</record>
|
||||
<record id="view_project_classify_setting_tree" model="ir.ui.view">
|
||||
<field name="name">项目分类</field>
|
||||
<field name="model">project.classify.setting</field>
|
||||
<field name="arch" type="xml">
|
||||
<tree string="项目分类" editable="bottom">
|
||||
<field name="name"/>
|
||||
</tree>
|
||||
</field>
|
||||
</record>
|
||||
<record id="view_project_classify_setting_action" model="ir.actions.act_window">
|
||||
<field name="name">项目分类</field>
|
||||
<field name="res_model">project.classify.setting</field>
|
||||
<field name="view_mode">tree</field>
|
||||
</record>
|
||||
<record id="view_project_funding_setting_tree" model="ir.ui.view">
|
||||
<field name="name">资金来源</field>
|
||||
<field name="model">project.funding.setting</field>
|
||||
<field name="arch" type="xml">
|
||||
<tree string="资金来源" editable="bottom">
|
||||
<field name="name"/>
|
||||
</tree>
|
||||
</field>
|
||||
</record>
|
||||
<record id="view_project_funding_setting_action" model="ir.actions.act_window">
|
||||
<field name="name">资金来源</field>
|
||||
<field name="res_model">project.funding.setting</field>
|
||||
<field name="view_mode">tree</field>
|
||||
</record>
|
||||
</odoo>
|
||||
@@ -28,7 +28,7 @@ class YuthonWillTask(models.Model):
|
||||
user_role_ids = fields.Many2many('soong.user.role', string='角色', store=True, index=True)
|
||||
task_time_ids = fields.Many2many('yuthon.task.time', string='提醒')
|
||||
address = fields.Char(string='地点')
|
||||
start_time = fields.Datetime(string='开始时间',default=lambda self: datetime.combine(datetime.now().date(), time(1, 0, 0)))
|
||||
start_time = fields.Datetime(string='开始时间', default=fields.Datetime.now)
|
||||
end_time = fields.Datetime(string='结束时间')
|
||||
task_state = fields.Selection([('will', '待办'), ('done', '已办'), ('cancel', '取消')], default='will', string='状态', store=True)
|
||||
|
||||
|
||||
@@ -3,7 +3,6 @@
|
||||
<menuitem id="executive_manage_menu_root_board"
|
||||
name="行政管理"
|
||||
web_icon="yuthon_work_brand,static/description/manage.png"
|
||||
active="False"
|
||||
sequence="80"/>
|
||||
|
||||
<menuitem id="executive_manage_union_root_board"
|
||||
|
||||
Reference in New Issue
Block a user