[IMP] base, crm: set salesperson and team on partner from parent

This commit does below improvements:

1/ If salesperson and sales team are set on an individual partner, we propagate
   those to parent company being created from m2o of the form view.
2/ If the existing parent company is manually linked to an individual partner
   being created, and salesperson and sales team are not set on the individual,
   we set those values from the linked parent (if set on the parent).

Task-2636290

closes odoo/odoo#78696

Signed-off-by: Thibault Delavallee (tde) <tde@openerp.com>
This commit is contained in:
Mitul Shah
2022-06-24 13:49:07 +02:00
committed by Thibault Delavallée
parent 020046a343
commit f0b7600314
7 changed files with 101 additions and 4 deletions
+10 -1
View File
@@ -8,7 +8,11 @@ class Partner(models.Model):
_name = 'res.partner'
_inherit = 'res.partner'
team_id = fields.Many2one('crm.team', string='Sales Team', ondelete="set null")
team_id = fields.Many2one(
'crm.team', string='Sales Team',
compute='_compute_team_id',
precompute=True, # avoid queries post-create
ondelete='set null', readonly=False, store=True)
opportunity_ids = fields.One2many('crm.lead', 'partner_id', string='Opportunities', domain=[('type', '=', 'opportunity')])
opportunity_count = fields.Integer("Opportunity", compute='_compute_opportunity_count')
@@ -34,6 +38,11 @@ class Partner(models.Model):
)
return rec
@api.depends('parent_id')
def _compute_team_id(self):
for partner in self.filtered(lambda partner: not partner.team_id and partner.company_type == 'person' and partner.parent_id.team_id):
partner.team_id = partner.parent_id.team_id
def _compute_opportunity_count(self):
# retrieve all children partners and prefetch 'parent_id' on them
all_partners = self.with_context(active_test=False).search([('id', 'child_of', self.ids)])
+1
View File
@@ -15,3 +15,4 @@ from . import test_crm_lead_smart_calendar
from . import test_crm_ui
from . import test_crm_pls
from . import test_performances
from . import test_res_partner
+53
View File
@@ -0,0 +1,53 @@
# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.
from odoo.addons.crm.tests.common import TestCrmCommon
from odoo.tests.common import Form
from odoo.tests import tagged, users
@tagged('res_partner')
class TestPartner(TestCrmCommon):
@users('user_sales_leads')
def test_parent_sync_sales_rep(self):
""" Test team_id / user_id sync from parent to children if the contact
is a person. Company children are not updated. """
contact_company = self.contact_company.with_env(self.env)
contact_company_1 = self.contact_company_1.with_env(self.env)
self.assertFalse(contact_company.team_id)
self.assertFalse(contact_company.user_id)
self.assertFalse(contact_company_1.team_id)
self.assertFalse(contact_company_1.user_id)
child = self.contact_1.with_env(self.env)
self.assertEqual(child.parent_id, self.contact_company_1)
self.assertFalse(child.team_id)
self.assertFalse(child.user_id)
# update comppany sales rep info
contact_company.user_id = self.env.uid
contact_company.team_id = self.sales_team_1.id
# change child parent: shold update sales rep info
child.parent_id = contact_company.id
self.assertEqual(child.user_id, self.env.user)
# test form tool
partner_form = Form(self.env['res.partner'], 'base.view_partner_form')
partner_form.parent_id = contact_company
partner_form.company_type = 'person'
partner_form.name = 'Hermes Conrad'
self.assertEqual(partner_form.team_id, self.sales_team_1)
self.assertEqual(partner_form.user_id, self.env.user)
partner_form.parent_id = contact_company_1
self.assertEqual(partner_form.team_id, self.sales_team_1)
self.assertEqual(partner_form.user_id, self.env.user)
# test form tool
partner_form = Form(self.env['res.partner'], 'base.view_partner_form')
partner_form.company_type = 'company'
partner_form.parent_id = contact_company
partner_form.name = 'Mom Corp'
self.assertFalse(partner_form.team_id)
self.assertFalse(partner_form.user_id)
+3
View File
@@ -44,6 +44,9 @@
<field string="Opportunities" name="opportunity_count" widget="statinfo"/>
</button>
</div>
<field name="parent_id" position="attributes">
<attribute name="context">{'default_is_company': True, 'show_vat': True, 'default_user_id': user_id, 'default_team_id': team_id}</attribute>
</field>
</data>
</field>
</record>
+12 -2
View File
@@ -168,8 +168,12 @@ class Partner(models.Model):
"Anywhere else, time values are computed according to the time offset of your web client.")
tz_offset = fields.Char(compute='_compute_tz_offset', string='Timezone offset', invisible=True)
user_id = fields.Many2one('res.users', string='Salesperson',
help='The internal user in charge of this contact.')
user_id = fields.Many2one(
'res.users', string='Salesperson',
compute='_compute_user_id',
precompute=True, # avoid queries post-create
readonly=False, store=True,
help='The internal user in charge of this contact.')
vat = fields.Char(string='Tax ID', index=True, help="The Tax Identification Number. Complete it if the contact is subjected to government taxes. Used in some legal statements.")
same_vat_partner_id = fields.Many2one('res.partner', string='Partner with same Tax ID', compute='_compute_same_vat_partner_id', store=False)
same_company_registry_partner_id = fields.Many2one('res.partner', string='Partner with same Company Registry', compute='_compute_same_vat_partner_id', store=False)
@@ -304,6 +308,12 @@ class Partner(models.Model):
for partner in self:
partner.tz_offset = datetime.datetime.now(pytz.timezone(partner.tz or 'GMT')).strftime('%z')
@api.depends('parent_id')
def _compute_user_id(self):
""" Synchronize sales rep with parent if partner is a person """
for partner in self.filtered(lambda partner: not partner.user_id and partner.company_type == 'person' and partner.parent_id.user_id):
partner.user_id = partner.parent_id.user_id
@api.depends('user_ids.share', 'user_ids.active')
def _compute_partner_share(self):
super_partner = self.env['res.users'].browse(SUPERUSER_ID).partner_id
@@ -157,3 +157,23 @@ class TestPartner(TransactionCase):
self.assertFalse(self.env.ref('base.public_user').active)
self.assertFalse(self.env.ref('base.public_partner').active)
self.assertTrue(self.env.ref('base.public_partner').is_public)
def test_onchange_parent_sync_user(self):
company_1 = self.env['res.company'].create({'name': 'company_1'})
test_user = self.env['res.users'].create({
'name': 'This user',
'login': 'thisu',
'email': 'this.user@example.com',
'company_id': company_1.id,
'company_ids': [company_1.id],
})
test_parent_partner = self.env['res.partner'].create({
'company_type': 'company',
'name': 'Micheline',
'user_id': test_user.id,
})
with Form(self.env['res.partner']) as partner_form:
partner_form.parent_id = test_parent_partner
partner_form.company_type = 'person'
partner_form.name = 'Philip'
self.assertEqual(partner_form.user_id, test_parent_partner.user_id)
+2 -1
View File
@@ -84,6 +84,7 @@
<field name="is_company" invisible="1"/>
<field name="type" invisible="1"/>
<field name="avatar_128" invisible="1"/>
<field name="user_id" invisible="1"/>
<field name="image_1920" widget='image' class="oe_avatar" options='{"preview_image": "avatar_128"}'/>
<div class="oe_title">
<field name="company_type" options="{'horizontal': true}" widget="radio" groups="base.group_no_one"/>
@@ -94,7 +95,7 @@
<field name="parent_id"
widget="res_partner_many2one"
placeholder="Company Name..."
domain="[('is_company', '=', True)]" context="{'default_is_company': True, 'show_vat': True}"
domain="[('is_company', '=', True)]" context="{'default_is_company': True, 'show_vat': True, 'default_user_id': user_id}"
attrs="{'invisible': [('is_company','=', True)]}"/>
</div>
<group>