Files
odoo_source/addons/crm_livechat/tests/test_crm_lead.py
T
Thibault Delavallée 473b07e34c [FIX] crm_livechat: do not set public user partner as lead customer usign /lead command
When chatting with visitors, operator may use /lead command to directly create
a lead from discussion. That way commercial discussion can follow visitors
inquiries.

Anonymous (public) users may be part of channels, notably since f5fe11cf1e.
In that case we don't want new leads to be associated with those users. Indeed

  * they are not real users, just technical users for website / frontend;
  * merge processes may think all leads having public users as customer are
    duplicates and should be merged, which means loosing information and
    leads;

We therefore set the following heuristics

  * if a public user is member of a channel -> consider this is a livechat
    with an anonymous and set customer_id to False;
  * otherwise try to find a share partner in channel members and link the lead
    to that partner;

Task ID-2389564

closes odoo/odoo#62192

X-original-commit: 7fbeda3f7d92fa501c2752c873be2255697f5d97
Signed-off-by: Thibault Delavallee (tde) <tde@openerp.com>
2020-11-23 14:58:06 +00:00

78 lines
3.3 KiB
Python

# -*- 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.addons.mail.tests.common import mail_new_test_user
from odoo.tests.common import users
class TestLivechatLead(TestCrmCommon):
@classmethod
def setUpClass(cls):
super(TestLivechatLead, cls).setUpClass()
cls.user_anonymous = mail_new_test_user(
cls.env, login='user_anonymous',
name='Anonymous Website', email=False,
company_id=cls.company_main.id,
notification_type='inbox',
groups='base.group_public',
)
cls.user_portal = mail_new_test_user(
cls.env, login='user_portal',
name='Paulette Portal', email='user_portal@test.example.com',
company_id=cls.company_main.id,
notification_type='inbox',
groups='base.group_portal',
)
@users('user_sales_leads')
def test_crm_lead_creation_guest(self):
""" Test customer set on lead: not if public, guest if not public """
# public: should not be set as customer
channel = self.env['mail.channel'].create({
'name': 'Chat with Visitor',
'channel_partner_ids': [(4, self.user_anonymous.partner_id.id)]
})
lead = channel._convert_visitor_to_lead(self.env.user.partner_id, channel.channel_last_seen_partner_ids, '/lead TestLead command')
self.assertEqual(
channel.channel_last_seen_partner_ids.partner_id,
self.user_sales_leads.partner_id | self.user_anonymous.partner_id
)
self.assertEqual(lead.name, 'TestLead command')
self.assertEqual(lead.partner_id, self.env['res.partner'])
# public + someone else: no customer (as he was anonymous)
channel.write({
'channel_partner_ids': [(4, self.user_sales_manager.partner_id.id)]
})
lead = channel._convert_visitor_to_lead(self.env.user.partner_id, channel.channel_last_seen_partner_ids, '/lead TestLead command')
self.assertEqual(lead.partner_id, self.env['res.partner'])
# portal: should be set as customer
channel = self.env['mail.channel'].create({
'name': 'Chat with Visitor',
'channel_partner_ids': [(4, self.user_portal.partner_id.id)]
})
lead = channel._convert_visitor_to_lead(self.env.user.partner_id, channel.channel_last_seen_partner_ids, '/lead TestLead command')
self.assertEqual(
channel.channel_last_seen_partner_ids.partner_id,
self.user_sales_leads.partner_id | self.user_portal.partner_id
)
self.assertEqual(lead.partner_id, self.user_portal.partner_id)
# another operator invited: internal user should not be customer if portal is present
channel.write({
'channel_partner_ids': [(4, self.user_sales_manager.partner_id.id)]
})
lead = channel._convert_visitor_to_lead(self.env.user.partner_id, channel.channel_last_seen_partner_ids, '/lead TestLead command')
self.assertEqual(
channel.channel_last_seen_partner_ids.partner_id,
self.user_sales_leads.partner_id | self.user_portal.partner_id | self.user_sales_manager.partner_id
)
self.assertEqual(lead.partner_id, self.user_portal.partner_id)