odoo 8 中销售团队的设置

8.0版本中,销售团队只是一个树形结构,并没有跟权限进行关联,这样就对我们CRM的一些设置造成了困难。举个简单的例子来说,
公司销售团队中有北京大区、上海大区和大中华区三个团队,通常我们都会希望,北京地区和上海地区的销售线索仅团队人员可见,而对于大中华区则是全部可见的。对于8.0 的这个先天性缺陷,我们该如何进行纠正呢。

rule规则

我们最先想到的是利用ir.rule进行设置过滤,但是在实际实现过程中却发现并非想象中的那么简单。首先,销售团队并没有实现child_of的运算。其次,我们在rule中并没办法拿到销售团队成员member与当前登录用户(所属的销售团队)进行比较。第三,当前登录用户user跟销售团队设置并没有关联关系。虽然在user对象中有隐藏的section_id字段,目前并没有看出来有什么用。总不能一个一个用户的设置销售团队,再在销售目录中设置一遍,使二者保持一致。

实现方案

既然rule不能实现我们目的,我们就想着能否通过user和user间的上下级关系进行设置。这里需要指出的是,本解决方案有缺陷,即使用了本方案,对今后的HR模块会有影响,如果HR模块中引用了部门,那么部门之间的从属关系如果反应到user上,将会与本方案拥有冲突。解决冲突的方法虽然也很简单,建一个新的字段用于记录层级关系,但终究还是将user对象变得更加复杂。

本方案的思路是,拓展user对象,使user对象拥有层级关系,每个user拥有唯一的parent_uid(多领导的情况不适用),可以拥有多个child_uid,这样就形成了用户间的上下级关系。上下级关系的建立通过销售团队进行设置。这样就形成了一套层级关系体系,对于需要这个层级关系的对象,可以简单的使用[(‘user_id’,’child_of’,user.id)]的方式进行过滤。

user的拓展

1
2
3
4
5
6
7
8
9
10
11
12
class res_users(models.Model):
_name="res.users"
_inherit="res.users"
parent_uid = fields.Many2one('res.users',string='TL',ondelete='cascade')
parent_left = fields.Integer('Parent Left',select=True)
parent_right = fields.Integer('Parent Right',select=True)
child_uid = fields.One2many('res.users','parent_uid',string='childs')
_order = 'parent_left'
_parent_name = "parent_uid"
_parent_store = True

拓展user对象,这里需要注意的是,user对象跟 partner对象有冲突,详情参见我以前的博客, 这里需要处理。

销售团队的设置

在处理销售团队的关系设置时,需要考虑如果改变了销售团队的某一个字段,应该会对上下级的用户产生何种影响,然后再变更关联到用户的上下级关系。

笔者会在后续过程中将这个单独整理成一个模块,并公布出来,敬请期待哦。