1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
|
# -*- 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.event.tests.common import TestEventCommon
class TestEventCrmCommon(TestCrmCommon, TestEventCommon):
@classmethod
def setUpClass(cls):
super(TestEventCrmCommon, cls).setUpClass()
# avoid clash with existing rules
cls.env['event.lead.rule'].search([]).write({'active': False})
cls.test_lead_tag = cls.env['crm.tag'].create({'name': 'TagTest'})
cls.test_rule_attendee = cls.env['event.lead.rule'].create({
'name': 'Rule Attendee',
'lead_creation_basis': 'attendee',
'lead_creation_trigger': 'create',
'event_id': cls.event_0.id,
'event_registration_filter': [['email', 'ilike', '@test.example.com']],
'lead_type': 'lead',
'lead_user_id': cls.user_sales_salesman.id,
'lead_tag_ids': cls.test_lead_tag,
})
cls.test_rule_order = cls.env['event.lead.rule'].create({
'name': 'Rule Order',
'lead_creation_basis': 'order',
'lead_creation_trigger': 'create',
'event_id': cls.event_0.id,
'event_registration_filter': [['email', 'ilike', '@test.example.com']],
'lead_type': 'opportunity',
'lead_user_id': cls.user_sales_leads.id,
'lead_sales_team_id': cls.sales_team_1.id,
})
cls.test_rule_order_done = cls.env['event.lead.rule'].create({
'name': 'Rule Order: confirmed partner only',
'lead_creation_basis': 'order',
'lead_creation_trigger': 'done',
'event_registration_filter': [['partner_id', '!=', False]],
'lead_type': 'opportunity',
})
cls.batch_customer_data = [{
'partner_id': cls.event_customer.id,
}] + [{
'name': 'My Customer 00',
'partner_id': cls.event_customer2.id,
'email': 'email.00@test.example.com',
'phone': '0456000000',
}] + [{
'name': 'My Customer %02d' % x,
'partner_id': cls.env.ref('base.public_partner').id if x == 0 else False,
'email': 'email.%02d@test.example.com' % x,
'phone': '04560000%02d' % x,
} for x in range(1, 4)]
def assertLeadConvertion(self, rule, registrations, partner=None, **expected):
""" Tool method hiding details of lead value generation and check
:param lead: lead created through automated rule;
:param rule: event.lead.rule that created the lead;
:param event: original event;
:param registrations: source registrations (singleton or record set if done in batch);
:param partner: partner on lead;
"""
registrations = registrations.sorted('id') # currently order is forced to id ASC
lead = self.env['crm.lead'].sudo().search([
('registration_ids', 'in', registrations.ids),
('event_lead_rule_id', '=', rule.id)
])
self.assertEqual(len(lead), 1, 'Invalid registrations -> lead creation, found %s leads where only 1 is expected.' % len(lead))
self.assertEqual(lead.registration_ids, registrations, 'Invalid registrations -> lead creation, too much registrations on it.')
event = registrations.event_id
self.assertEqual(len(event), 1, 'Invalid registrations -> event assertion, all registrations should belong to same event')
if partner is None:
partner = self.env['res.partner']
expected_reg_name = partner.name or registrations._find_first_notnull('name') or registrations._find_first_notnull('email')
if partner:
expected_contact_name = partner.name if not partner.is_company else False
expected_partner_name = partner.name if partner.is_company else False
else:
expected_contact_name = registrations._find_first_notnull('name')
expected_partner_name = False
# event information
self.assertEqual(lead.event_id, event)
self.assertEqual(lead.referred, event.name)
# registration information
self.assertEqual(lead.partner_id, partner)
self.assertEqual(lead.name, '%s - %s' % (event.name, expected_reg_name))
self.assertNotIn('False', lead.name) # avoid a "Dear False" like construct ^^ (this assert is serious and intended)
self.assertEqual(lead.contact_name, expected_contact_name)
self.assertEqual(lead.partner_name, expected_partner_name)
self.assertEqual(lead.email_from, partner.email if partner else registrations._find_first_notnull('email'))
self.assertEqual(lead.phone, partner.phone if partner else registrations._find_first_notnull('phone'))
self.assertEqual(lead.mobile, partner.mobile if partner and partner.mobile else registrations._find_first_notnull('mobile'))
# description: to improve
self.assertNotIn('False', lead.description) # avoid a "Dear False" like construct ^^ (this assert is serious and intended)
for registration in registrations:
if registration.name:
self.assertIn(registration.name, lead.description)
elif registration.partner_id.name:
self.assertIn(registration.partner_id.name, lead.description)
if registration.email:
self.assertIn(registration.email, lead.description)
if registration.phone:
self.assertIn(registration.phone, lead.description)
# lead configuration
self.assertEqual(lead.type, rule.lead_type)
self.assertEqual(lead.user_id, rule.lead_user_id)
self.assertEqual(lead.team_id, rule.lead_sales_team_id)
self.assertEqual(lead.tag_ids, rule.lead_tag_ids)
|