[IMP] crm: provide crm_lead values for related res_partner creation

Define information taken from the lead when a partner is automatically
created from it. It avoids the user to enter the information twice and
automated partner creation now correctly takes information when possible.

Task-3024050

Part-of: odoo/odoo#105111
This commit is contained in:
Pierre-Yves Dufays
2023-02-23 14:53:56 +01:00
committed by Thibault Delavallée
parent 1018c72571
commit a1d508f7ba
2 changed files with 73 additions and 3 deletions
+15
View File
@@ -1822,6 +1822,21 @@ class Lead(models.Model):
return partner_company
return Partner.create(self._prepare_customer_values(self.name, is_company=False))
def _get_customer_information(self):
email_normalized_to_values = super()._get_customer_information()
Partner = self.env['res.partner']
for record in self.filtered('email_normalized'):
values = email_normalized_to_values.setdefault(record.email_normalized, {})
contact_name = record.contact_name or record.partner_name or (
Partner._parse_partner_name(record.email_from)[0] or record.email_from)
# Note that we don't attempt to create the parent company even if partner name is set
values.update(record._prepare_customer_values(contact_name, is_company=False))
values['company_name'] = record.partner_name
if contact_name == record.partner_name:
values['company_type'] = 'company'
return email_normalized_to_values
def _prepare_customer_values(self, partner_name, is_company=False, parent_id=False):
""" Extract data from lead to create a partner.
+58 -3
View File
@@ -10,7 +10,7 @@ from odoo.addons.crm.tests.common import TestCrmCommon, INCOMING_EMAIL
from odoo.addons.phone_validation.tools.phone_validation import phone_format
from odoo.exceptions import UserError
from odoo.tests.common import Form, tagged, users
from odoo.tools import mute_logger
from odoo.tools import formataddr, mute_logger
@tagged('lead_internals')
@@ -663,7 +663,12 @@ class TestCRMLead(TestCrmCommon):
'lang_id': lang_fr.id,
})
data = lead1._message_get_suggested_recipients()[lead1.id]
self.assertEqual(data, [(False, self.test_email, None, 'Customer Email')])
self.assertEqual(len(data), 1)
suggested_partner_id, suggested_partner_email, suggested_lang, suggested_reason = data[0]
self.assertFalse(suggested_partner_id)
self.assertEqual(suggested_partner_email, self.test_email)
self.assertEqual(suggested_lang, None)
self.assertEqual(suggested_reason, 'Customer Email')
# Create a lead with an active language -> should keep the preset language for recipients
lang_en = ResLang.search([('code', '=', 'en_US')])
@@ -678,7 +683,57 @@ class TestCRMLead(TestCrmCommon):
'lang_id': lang_en.id,
})
data = lead2._message_get_suggested_recipients()[lead2.id]
self.assertEqual(data, [(False, self.test_email, "en_US", 'Customer Email')])
self.assertEqual(len(data), 1)
suggested_partner_id, suggested_partner_email, suggested_lang, suggested_reason = data[0]
self.assertFalse(suggested_partner_id)
self.assertEqual(suggested_partner_email, self.test_email)
self.assertEqual(suggested_lang, 'en_US')
self.assertEqual(suggested_reason, 'Customer Email')
@users('user_sales_manager')
def test_message_get_suggested_recipients_auto_creation(self):
"""Check default creates value for auto creation of recipient
(customer)."""
lead_details_for_contact = {
'title': self.env.ref('base.res_partner_title_mister').id,
'street': '3rd Floor, Room 3-C',
'street2': '123 Arlington Avenue',
'zip': '13202',
'city': 'New York',
'country_id': self.env.ref('base.us').id,
'state_id': self.env.ref('base.state_us_39').id,
'website': 'https://www.arlington123.com/3f3c',
'phone': '678-728-0949',
'mobile': '661-606-0781',
'function': 'Delivery Boy',
'team_id': self.sales_team_1.id,
'user_id': self.user_sales_manager.id,
}
for partner_name, name, email in [
(False, 'Test', 'test_default_create@example.com'),
('Delivery Boy company', 'Test With Company', 'default_create_with_partner@example.com'),
('Delivery Boy company', '', 'default_create_with_partner_no_name@example.com'),
]:
formatted_email = formataddr((name, email))
with self.subTest(partner_name=partner_name):
lang = self.env['res.lang'].sudo().search([], limit=1)[0]
description = '<p>Top</p>'
lead1 = self.env['crm.lead'].create({
'name': 'TestLead',
'contact_name': name,
'email_from': formatted_email,
'lang_id': lang.id,
'description': description,
'partner_name': partner_name,
**lead_details_for_contact,
})
data = lead1._message_get_suggested_recipients()[lead1.id]
suggested_partner_id, suggested_partner_email, suggested_lang, suggested_reason = data[0]
self.assertFalse(suggested_partner_id)
self.assertEqual(suggested_partner_email, formatted_email)
self.assertEqual(suggested_lang, lang.code)
self.assertEqual(suggested_reason, 'Customer Email')
@users('user_sales_manager')
def test_phone_mobile_search(self):