1.强制必填字段

(1)【客户名称】、【税ID】、【Email】、【销售员】、【标签】为强制必填
(2)【电话】、【手机】两个字段控制为二选一强制必填
2.客户校验规则:
(1)【客户名称】+【税ID】两个字段分别与已经创建客户的档案信息进行校验,任意一项100%吻合则不允许创建客户
3.强制必填字段
(1)【名称】、【Email】、【销售员】为强制必填
(2)【电话】、【手机】两个字段控制为二选一强制必填
4.个人校验规则:
(1)【名称】+【Email】两个字段分别与已经创建客户的档案信息进行校验,两项一起100%吻合则不允许创建个人
5.下拉仅显示销售人员的账户用户名(非相关用户及姓名不显示),字段为强制必填
(1)创建人的权限为销售经理,则【销售员】字段自动默认为当前账号的用户姓名,且不可修改
(2)创建人的权限为销售总监,则【销售员】字段自动默认为当前账号的用户姓名,可下拉选择,修改销售人员姓名
This commit is contained in:
jinling.yang
2023-12-19 17:48:30 +08:00
parent 8721bc2de1
commit ef47597cf9
9 changed files with 102 additions and 17 deletions

View File

@@ -6,8 +6,8 @@ import os
from odoo import models, fields, api, _
from odoo.exceptions import ValidationError
from odoo.modules import get_resource_path
from OCC.Extend.DataExchange import read_step_file
from OCC.Extend.DataExchange import write_stl_file
# from OCC.Extend.DataExchange import read_step_file
# from OCC.Extend.DataExchange import write_stl_file
class ResProductMo(models.Model):

View File

@@ -53,8 +53,13 @@ access_product_template_group_equipment_manager,product_template_group_equipment
access_quality_alert_stage_group_quality,quality_alert_stage_group_quality,quality.model_quality_alert_stage,sf_base.group_quality,1,0,0,0
access_quality_alert_stage_group_quality_director,quality_alert_stage_group_quality_director,quality.model_quality_alert_stage,sf_base.group_quality_director,1,0,0,0
access_quality_point_test_type_group_quality,quality_point_test_type_group_quality,quality.model_quality_point_test_type,sf_base.group_quality,1,0,0,0
access_quality_point_test_type_group_quality_director,quality_point_test_type_group_quality_director,quality.model_quality_point_test_type,sf_base.group_quality_director,1,0,0,0
access_quality_point_test_type_group_quality,quality_point_test_type_group_quality,quality.model_quality_point_test_type,sf_base.group_quality,1,0,0,0
access_quality_point_test_type_group_quality_director,quality_point_test_type_group_quality_director,quality.model_quality_point_test_type,sf_base.group_quality_director,1,0,0,0
access_quality_alert_stage,quality.alert.stage,quality.model_quality_alert_stage,sf_base.group_plan_dispatch,1,0,0,0
1 id name model_id:id group_id:id perm_read perm_write perm_create perm_unlink
53 access_quality_point_test_type_group_quality_director quality_point_test_type_group_quality_director quality.model_quality_point_test_type sf_base.group_quality_director 1 0 0 0
54
55
56
57
58
59
60
61
62
63
64
65

View File

@@ -17,6 +17,7 @@
'wizard/sale_order_wizard_views.xml',
'views/sale_team.xml',
'views/sale_order_view.xml',
'views/res_partner_view.xml',
'views/purchase_order_view.xml',
'views/quick_easy_order_view.xml'
],

View File

@@ -2,7 +2,7 @@
import logging
from odoo.modules import get_resource_path
from odoo import fields, models, api
from quatotion import readSql, feature_recognize, auto_quatotion
# from quatotion import readSql, feature_recognize, auto_quatotion
__author__ = 'jinling.yang'
_logger = logging.getLogger(__name__)

View File

@@ -5,8 +5,8 @@ import os
import json
from datetime import datetime
import requests
from OCC.Extend.DataExchange import read_step_file
from OCC.Extend.DataExchange import write_stl_file
# from OCC.Extend.DataExchange import read_step_file
# from OCC.Extend.DataExchange import write_stl_file
from odoo import models, fields, api
from odoo.modules import get_resource_path
from odoo.exceptions import ValidationError, UserError

View File

@@ -1,7 +1,7 @@
import datetime
import base64
from odoo import models, fields, api
from odoo.osv import expression
from odoo.exceptions import UserError
class ReSaleOrder(models.Model):
@@ -86,6 +86,24 @@ class RePurchaseOrder(models.Model):
class ResPartnerToSale(models.Model):
_inherit = 'res.partner'
@api.constrains('name')
def _check_name(self):
obj = self.sudo().search([('name', '=', self.name), ('id', '!=', self.id)])
if obj:
raise UserError('该名称已存在,请重新输入')
@api.constrains('vat')
def _check_vat(self):
obj = self.sudo().search([('vat', '=', self.vat), ('id', '!=', self.id)])
if obj:
raise UserError('该税ID已存在,请重新输入')
@api.constrains('email')
def _check_email(self):
obj = self.sudo().search([('email', '=', self.email), ('id', '!=', self.id)])
if obj:
raise UserError('该邮箱已存在,请重新输入')
@api.model
def _name_search(self, name, args=None, operator='ilike', limit=100, name_get_uid=None):
if self._context.get('is_customer'):
@@ -95,3 +113,21 @@ class ResPartnerToSale(models.Model):
domain = [('user_id', '=', self.env.user.id)]
return self._search(domain, limit=limit, access_rights_uid=name_get_uid)
return super()._name_search(name, args, operator, limit, name_get_uid)
@api.onchange('user_id')
def _get_salesman(self):
self.user_id = self.env.user.id
class ResUserToSale(models.Model):
_inherit = 'res.users'
@api.model
def _name_search(self, name, args=None, operator='ilike', limit=100, name_get_uid=None):
if self._context.get('is_sale'):
if self.env.user.has_group('sf_base.group_sale_director'):
domain = []
elif self.env.user.has_group('sf_base.group_sale_salemanager'):
domain = [('id', '=', self.env.user.id)]
return self._search(domain, limit=limit, access_rights_uid=name_get_uid)
return super()._name_search(name, args, operator, limit, name_get_uid)

View File

@@ -23,7 +23,7 @@
<record model="ir.rule" id="sale_customer_rule_director">
<field name="name">销售总监查看所有客户</field>
<field name="model_id" ref="base.model_res_partner"/>
<field name="domain_force">[(1,'=',1),('customer_rank','=',1)]</field>
<field name="domain_force">[(1,'=',1),('customer_rank','>',0)]</field>
<field name="groups" eval="[(4, ref('sf_base.group_sale_director'))]"/>
<field name="perm_read" eval="1"/>
<field name="perm_write" eval="1"/>
@@ -32,7 +32,8 @@
<record model="ir.rule" id="sale_customer_rule_my">
<field name="name">销售经理查看自己的客户</field>
<field name="model_id" ref="base.model_res_partner"/>
<field name="domain_force">['|',('user_id','=',user.id),('create_uid', '=',user.id)]</field>
<field name="domain_force">[('user_id','=',user.id),('customer_rank','>',0)]
</field>
<field name="groups" eval="[(4, ref('sf_base.group_sale_salemanager'))]"/>
<field name="perm_read" eval="1"/>
<field name="perm_write" eval="1"/>
@@ -73,7 +74,7 @@
<record model="ir.rule" id="purchase_supplier_rule_director">
<field name="name">采购总监查看所有供应商</field>
<field name="model_id" ref="base.model_res_partner"/>
<field name="domain_force">[(1,'=',1)]</field>
<field name="domain_force">[(1,'=',1),('supplier_rank','>', 0)]</field>
<field name="groups" eval="[(4, ref('sf_base.group_purchase_director'))]"/>
<field name="perm_read" eval="1"/>
<field name="perm_write" eval="1"/>
@@ -82,7 +83,7 @@
<record model="ir.rule" id="purchase_supplier_rule_my">
<field name="name">采购岗查看自己的供应商</field>
<field name="model_id" ref="base.model_res_partner"/>
<field name="domain_force">['|',('user_id','=',user.id),('create_uid', '=',user.id)]</field>
<field name="domain_force">[('user_id','=',user.id),('supplier_rank','>', 0)]</field>
<field name="groups" eval="[(4, ref('sf_base.group_purchase'))]"/>
<field name="perm_read" eval="1"/>
<field name="perm_write" eval="1"/>

View File

@@ -38,13 +38,20 @@ access_uom_category_group_purchase_director,uom_category_group_purchase_director
access_sale_order_check_wizard_group_sale_salemanager,sale_order_check_wizard_group_sale_salemanager,model_sale_order_check_wizard,sf_base.group_sale_salemanager,1,1,1,0
access_sale_order_check_wizard_group_sale_director,sale_order_check_wizard_group_sale_director,model_sale_order_check_wizard,sf_base.group_sale_director,1,1,1,0
access_account_move_line_group_purchase,account_move_line_group_purchase,account.model_account_move_line,sf_base.group_purchase,1,1,1,0
access_account_move_line_group_purchase_director,account_move_line_group_purchase_director,account.model_account_move_line,sf_base.group_purchase_director,1,1,1,0
access_res_users_group_purchase,res_user_group_purchase,model_res_users,sf_base.group_purchase,1,1,1,0
access_res_users_group_purchase_director,res_user_group_purchase_director,model_res_users,sf_base.group_purchase_director,1,1,1,0
access_res_users_sale_salemanager,res_user_group_sale_salemanager,model_res_users,sf_base.group_sale_salemanager,1,0,0,0
access_res_users_group_sale_director,res_user_group_sale_director,model_res_users,sf_base.group_sale_director,1,1,1,0
access_sale_order,sale_order,model_sale_order,sf_base.group_plan_dispatch,1,0,0,0
1 id name model_id:id group_id:id perm_read perm_write perm_create perm_unlink
38 access_res_users_group_purchase res_user_group_purchase model_res_users sf_base.group_purchase 1 1 1 0
39 access_res_users_group_purchase_director res_user_group_purchase_director model_res_users sf_base.group_purchase_director 1 1 1 0
40 access_res_users_sale_salemanager res_user_group_sale_salemanager model_res_users sf_base.group_sale_salemanager 1 0 0 0
41 access_res_users_group_sale_director res_user_group_sale_director model_res_users sf_base.group_sale_director 1 1 1 0
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57

View File

@@ -0,0 +1,35 @@
<?xml version="1.0" encoding="UTF-8" ?>
<odoo>
<data>
<record model="ir.ui.view" id="view_partner_form_inherit_sf">
<field name="name">res.partner.form.inherit.sf</field>
<field name="model">res.partner</field>
<field name="inherit_id" ref="base.view_partner_form"/>
<field name="arch" type="xml">
<field name="vat" position="replace">
<field name="vat" attrs="{'required' : [('company_type', '=', 'company')]}"/>
</field>
<field name="email" position="replace">
<field name="email" required="1"/>
</field>
<field name="mobile" position="attributes">
<attribute name="attrs">{'required': [('phone', '=', False),('company_type','=', 'company')]}
</attribute>
</field>
<field name="phone" position="attributes">
<attribute name="attrs">{'required': [('mobile', '=', False),('company_type','=', 'company')]}
</attribute>
</field>
<xpath expr="//group[@name='sale']/field[@name='user_id']" position="replace">
<field name="user_id" widget="many2one_avatar_user" context="{'is_sale': True }"
attrs="{'required' : [('company_type', '=', 'company')]}"/>
</xpath>
<field name="category_id" position="attributes">
<attribute name="attrs">{'required': [('company_type', '=', 'company')]}</attribute>
</field>
</field>
</record>
</data>
</odoo>