From f0b7600314fee4e99de7ff48c91132f2754a9a40 Mon Sep 17 00:00:00 2001 From: Mitul Shah Date: Wed, 10 Nov 2021 05:49:29 +0000 Subject: [PATCH] [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) --- addons/crm/models/res_partner.py | 11 +++- addons/crm/tests/__init__.py | 1 + addons/crm/tests/test_res_partner.py | 53 ++++++++++++++++++++ addons/crm/views/res_partner_views.xml | 3 ++ odoo/addons/base/models/res_partner.py | 14 +++++- odoo/addons/base/tests/test_res_partner.py | 20 ++++++++ odoo/addons/base/views/res_partner_views.xml | 3 +- 7 files changed, 101 insertions(+), 4 deletions(-) create mode 100644 addons/crm/tests/test_res_partner.py diff --git a/addons/crm/models/res_partner.py b/addons/crm/models/res_partner.py index 2e52405aff9..3582b398f56 100644 --- a/addons/crm/models/res_partner.py +++ b/addons/crm/models/res_partner.py @@ -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)]) diff --git a/addons/crm/tests/__init__.py b/addons/crm/tests/__init__.py index e5d7f8d6aec..22d65ecef45 100644 --- a/addons/crm/tests/__init__.py +++ b/addons/crm/tests/__init__.py @@ -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 diff --git a/addons/crm/tests/test_res_partner.py b/addons/crm/tests/test_res_partner.py new file mode 100644 index 00000000000..e8b5c295496 --- /dev/null +++ b/addons/crm/tests/test_res_partner.py @@ -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) diff --git a/addons/crm/views/res_partner_views.xml b/addons/crm/views/res_partner_views.xml index 187b51a49e2..518f92cf298 100644 --- a/addons/crm/views/res_partner_views.xml +++ b/addons/crm/views/res_partner_views.xml @@ -44,6 +44,9 @@ + + {'default_is_company': True, 'show_vat': True, 'default_user_id': user_id, 'default_team_id': team_id} + diff --git a/odoo/addons/base/models/res_partner.py b/odoo/addons/base/models/res_partner.py index 7cc04e48983..aa7c483e868 100644 --- a/odoo/addons/base/models/res_partner.py +++ b/odoo/addons/base/models/res_partner.py @@ -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 diff --git a/odoo/addons/base/tests/test_res_partner.py b/odoo/addons/base/tests/test_res_partner.py index b780a9396a5..a62891e8c40 100644 --- a/odoo/addons/base/tests/test_res_partner.py +++ b/odoo/addons/base/tests/test_res_partner.py @@ -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) diff --git a/odoo/addons/base/views/res_partner_views.xml b/odoo/addons/base/views/res_partner_views.xml index d5de1f2937e..99638f989ef 100644 --- a/odoo/addons/base/views/res_partner_views.xml +++ b/odoo/addons/base/views/res_partner_views.xml @@ -84,6 +84,7 @@ +
@@ -94,7 +95,7 @@