許可權管理的四個層次:

· n菜單級別: 即不屬於指定菜單所包含組的用戶看不到該菜單。不安全,只是隱藏菜單,若用戶知道菜單ID,仍然可以通過指定URL訪問

nn

· n對象級別: 即對某個對象是否有『創建,讀取,修改,刪除「的許可權。Odoo中的對象可以簡單理解為表對象,比如「客戶」,「產品」,「銷售訂單」等都是對象

nn

· n記錄級別: 即對對象表中的數據的訪問許可權。比如同樣訪問「客戶」對象,業務員只能對自己創建的客戶有訪問的許可權,而經理可以訪問其所轄的業務員的所有「客戶」對象,這裡的訪問也可以進一步明細到「創建,讀取,修改,刪除」的許可權

nn

· n欄位級別: 即一個對象或表上的某些欄位的訪問許可權。比如產品的成本欄位只有經理有讀許可權,比如訂單上的單價欄位只有經理才有修改的許可權等。

nn

在實際的培訓和實施過程中,我們發現客戶往往會提出很多記錄級別的訪問規則要求。最經典的就是:我希望銷售員只能看到他自己創建的客戶,而其經理則可以看到所有業務員創建的客戶信息」, 本文就是以這個需求為基礎來介紹如何使用Odoo的「記錄規則」來定製記錄級別的訪問控制。

nnnn

測試環境創建:

nn

· n創建三個用戶,分別是manager,nsale1, sale2。 manager的「銷售」應用的訪問許可權為:查看所有線索; 而sale1和sale2兩個業務員的訪問許可權為:查看自己的線索, 這兩個不同的許可權實際上對應兩個不同的:See OwnnLeads (group_sale_salesman), 和 See AllnLeads (group_sale_salesman_all_lead

創建兩個客戶,分別為Company ABC 和Company XYZ, 每個客戶下分別有兩個聯繫人ABC Contact 1, ABC Contact 2, XYZ Contact 1, XYZ Contact 2

· n注意在創建的客戶或聯繫人表單的「銷售與採購」選項卡中有銷售員選項,我們就是用這個欄位(user_id)來過濾記錄,該欄位的默認值為空。若希望改變該欄位默認值為創建用戶的ID,只需改變一行代碼即可實現,以後再做介紹。

nn

記錄規則設置:

nn

我們在做好了以上基本設置以後,可以嘗試用前面定義的三個不同用戶分別登錄系統,並且為客戶設置不同的銷售員,在目前情況下,三個用戶看到的客戶記錄完全一樣,這是因為我們還沒有為客戶對象設置需要的記錄規則

nn

創建記錄規則,需要有「技術特性」(Technical Features)許可權,在做以下操作前先給予Administrator 用戶該許可權。並刷新頁面。

nn

點擊設置->技術->安全設定->記錄規則 菜單項,對於本文之要求我們實際只需創建兩條記錄規則分別適用『SeenOwn Leads」組和」See All Leads」組,這樣銷售和業務員登錄後就可以按要求看到不同的客戶信息了。

nn

以下是設置好的結果,大家可以利用之前測試環境來驗證以下的設置。我們在後面對這個設置做一些解釋:

nn

See Own Leads組的記錄規則

Sell All Leads 組的記錄規則nn

我們首先來看適用於「查看自己線索」(See Own Leads)組的記錄規則中的Domain設置:

nn

[|, |, |, (user_id,=,user.id), &,n(user_id,=, False),(parent_id.user_id, =, user.id), &,n(user_id, =, False), (parent_id.user_id, =, False), &, (user_id,n=, False), (parent_id, =, False)]

nn

Domain實際上就是一個或多個過濾條件的組合,對於上例,實際上四條過濾條件的並集(求或),即:

nnn

user_id == user.id ?

n n

這種情況最容易理解,左邊的user_id是客戶(合作夥伴)對象上的「銷售員」欄位的內部名稱,右邊的user表示當前登錄用戶。整個記錄表示,客戶的 銷售員的id如果與登錄用戶的id相同即滿足條件。這個條件的滿足,表示業務員能看到屬於自己的客戶(即客戶上的銷售員指定為自己的客戶)

nn

或者

nnn

user_id == False 並且 parent_id.user_id == user.id ?

n n

此條規則以及下面兩條規則,都是考慮了因為有客戶可以有「公司」和下屬「聯繫人」兩層關係的情況。此條規則表示:當前的客戶的銷售員未定義(False),但是其父親parent_id(即該聯繫人所屬公司)上的銷售員與當前登錄用戶相符時成立。

nn

或者

nnn

user_id == False 並且 parent_id.user_id == False ?

n n

噹噹前訪問的聯繫人及其所屬公司都沒有設置銷售員信息時,當前用戶可訪問該記錄

nn

或者

nnn

user_id == False 並且 parent_id == False?

n n

噹噹前訪問的客戶(parent_id == False),沒有設置銷售員時,當前用戶可訪問該記錄

nn

對於「訪問所有線索」組,我們只有一條簡單的記錄:

nnn

[(1, =, 1)]

n n

這是因為,「訪問所有線索」組繼承自「訪問自己線索」組,默認適用於「訪問自己線索」組的記錄規則也適用於「訪問所有線索」組,以上的記錄規則永遠為真,從而繞過了」訪問自己線索「組的過濾條件。

nn

我們已經了解如何通過記錄規則來實現「業務員能看到自己的客戶,而經理可以看到全部客戶」這樣的簡單要求。事實上,我們還可以利用記錄規則中對於「創建」,「讀取」, 「修改」,「刪除」許可權的控制來實現,例如「銷售員可以編輯修改自己客戶,但對不屬於自己的客戶僅有查看許可權,經理可以查看,編輯,刪除所有的客戶「這樣的類似的稍微變化的需求。


推薦閱讀:

風起雲湧,2018年開戰--ERP篇
正確誇獎SAP S4/HANA的十種姿勢
<職場信管人> 四. 構建ERP系統所要考慮因素
SAP 諮詢60家合作夥伴
Odoo如何更改詞條翻譯

TAG:Odoo原OpenERP | ERP | 开源软件 |