2018-01-16 06:58:15 +01:00
# -*- coding: utf-8 -*-
2018-01-16 11:34:37 +01:00
# Part of Odoo, Flectra. See LICENSE file for full copyright and licensing details.
2018-01-16 06:58:15 +01:00
from . common import TestCrmCases
2018-01-16 11:34:37 +01:00
from flectra . modules . module import get_module_resource
2018-01-16 06:58:15 +01:00
class TestCRMLead ( TestCrmCases ) :
def test_crm_lead_cancel ( self ) :
# I set a new sales team giving access rights of salesman.
team = self . env [ ' crm.team ' ] . sudo ( self . crm_salemanager . id ) . create ( { ' name ' : " Phone Marketing " } )
lead = self . env . ref ( ' crm.crm_case_1 ' )
lead . sudo ( self . crm_salemanager . id ) . write ( { ' team_id ' : team . id } )
# Salesmananger check unqualified lead
self . assertEqual ( lead . stage_id . sequence , 1 , ' Lead is in new stage ' )
def test_crm_lead_copy ( self ) :
# I make duplicate the Lead
self . env . ref ( ' crm.crm_case_4 ' ) . copy ( )
def test_crm_lead_unlink ( self ) :
# Only Sales manager Unlink the Lead so test with Manager's access rights
self . env . ref ( ' crm.crm_case_4 ' ) . sudo ( self . crm_salemanager . id ) . unlink ( )
def test_find_stage ( self ) :
# I create a new lead
2018-01-16 13:51:36 +01:00
branch = self . env . ref ( ' base_branch_company.data_branch_1 ' )
2018-01-16 06:58:15 +01:00
lead = self . env [ ' crm.lead ' ] . create ( {
' type ' : " lead " ,
2018-01-16 13:51:36 +01:00
' branch_id ' : branch . id ,
2018-01-16 06:58:15 +01:00
' name ' : " Test lead new " ,
' partner_id ' : self . env . ref ( " base.res_partner_1 " ) . id ,
' description ' : " This is the description of the test new lead. " ,
' team_id ' : self . env . ref ( " sales_team.team_sales_department " ) . id
} )
# I change type from lead to opportunity
lead . convert_opportunity ( self . env . ref ( " base.res_partner_2 " ) . id )
# I check default stage of opportunity
self . assertLessEqual ( lead . stage_id . sequence , 1 , " Default stage of lead is incorrect! " )
# Now I change the stage of opportunity to won.
lead . action_set_won ( )
# I check stage of opp should won, after change stage.
stage_id = lead . _stage_find ( domain = [ ( ' probability ' , ' = ' , 100.0 ) ] )
self . assertEqual ( stage_id , lead . stage_id , " Stage of opportunity is incorrect! " )
def test_crm_lead_message ( self ) :
# Give the access rights of Salesman to communicate with customer
# Customer interested in our product, so he sends request by email to get more details.
# Mail script will fetch his request from mail server. Then I process that mail after read EML file.
request_file = open ( get_module_resource ( ' crm ' , ' tests ' , ' customer_request.eml ' ) , ' rb ' )
request_message = request_file . read ( )
self . env [ ' mail.thread ' ] . sudo ( self . crm_salesman ) . message_process ( ' crm.lead ' , request_message )
# After getting the mail, I check details of new lead of that customer
lead = self . env [ ' crm.lead ' ] . sudo ( self . crm_salesman ) . search ( [ ( ' email_from ' , ' = ' , ' Mr. John Right <info@customer.com> ' ) ] , limit = 1 )
self . assertTrue ( lead . ids , ' Fail to create merge opportunity wizard ' )
self . assertFalse ( lead . partner_id , ' Customer should be a new one ' )
self . assertEqual ( lead . name , ' Fournir votre devis avec le meilleur prix. ' , ' Subject does not match ' )
# I reply his request with welcome message.
# TODO revert mail.mail to mail.compose.message (conversion to customer should be automatic).
lead = self . env [ ' crm.lead ' ] . search ( [ ( ' email_from ' , ' = ' , ' Mr. John Right <info@customer.com> ' ) ] , limit = 1 )
mail = self . env [ ' mail.compose.message ' ] . with_context ( active_model = ' crm.lead ' , active_id = lead . id ) . create ( {
' body ' : " Merci de votre intérêt pour notre produit, nous vous contacterons bientôt. Bien à vous " ,
' email_from ' : ' sales@mycompany.com '
} )
try :
mail . send_mail ( )
except :
pass
# Now, I convert him into customer and put him into regular customer list
lead = self . env [ ' crm.lead ' ] . search ( [ ( ' email_from ' , ' = ' , ' Mr. John Right <info@customer.com> ' ) ] , limit = 1 )
lead . handle_partner_assignation ( )
def test_crm_lead_merge ( self ) :
# During a mixed merge (involving leads and opps), data should be handled a certain way following their type (m2o, m2m, text, ...) Start by creating two leads and an opp and giving the rights of Sales manager.
default_stage_id = self . ref ( " crm.stage_lead1 " )
LeadSalesmanager = self . env [ ' crm.lead ' ] . sudo ( self . crm_salemanager . id )
2018-01-16 13:51:36 +01:00
branch = self . env . ref ( ' base_branch_company.data_branch_2 ' )
2018-01-16 06:58:15 +01:00
# TEST CASE 1
test_crm_opp_01 = LeadSalesmanager . create ( {
' type ' : ' opportunity ' ,
' name ' : ' Test opportunity 1 ' ,
2018-01-16 13:51:36 +01:00
' branch_id ' : branch . id ,
2018-01-16 06:58:15 +01:00
' partner_id ' : self . env . ref ( " base.res_partner_3 " ) . id ,
' stage_id ' : default_stage_id ,
' description ' : ' This is the description of the test opp 1. '
} )
test_crm_lead_01 = LeadSalesmanager . create ( {
' type ' : ' lead ' ,
' name ' : ' Test lead first ' ,
' partner_id ' : self . env . ref ( " base.res_partner_1 " ) . id ,
2018-01-16 13:51:36 +01:00
' stage_id ' : default_stage_id , ' branch_id ' : branch . id ,
2018-01-16 06:58:15 +01:00
' description ' : ' This is the description of the test lead first. '
} )
test_crm_lead_02 = LeadSalesmanager . create ( {
' type ' : ' lead ' ,
' name ' : ' Test lead second ' ,
' partner_id ' : self . env . ref ( " base.res_partner_1 " ) . id ,
2018-01-16 13:51:36 +01:00
' stage_id ' : default_stage_id , ' branch_id ' : branch . id ,
2018-01-16 06:58:15 +01:00
' description ' : ' This is the description of the test lead second. '
} )
lead_ids = [ test_crm_opp_01 . id , test_crm_lead_01 . id , test_crm_lead_02 . id ]
additionnal_context = { ' active_model ' : ' crm.lead ' , ' active_ids ' : lead_ids , ' active_id ' : lead_ids [ 0 ] }
# I create a merge wizard and merge the leads and opp together in the first item of the list.
merge_opp_wizard_01 = self . env [ ' crm.merge.opportunity ' ] . sudo ( self . crm_salemanager . id ) . with_context ( * * additionnal_context ) . create ( { } )
merge_opp_wizard_01 . action_merge ( )
# I check for the resulting merged opp (based on name and partner)
merged_lead = self . env [ ' crm.lead ' ] . search ( [ ( ' name ' , ' = ' , ' Test opportunity 1 ' ) , ( ' partner_id ' , ' = ' , self . env . ref ( " base.res_partner_3 " ) . id ) ] , limit = 1 )
self . assertTrue ( merged_lead , ' Fail to create merge opportunity wizard ' )
self . assertEqual ( merged_lead . description , ' This is the description of the test opp 1. \n \n This is the description of the test lead first. \n \n This is the description of the test lead second. ' , ' Description mismatch: when merging leads/opps with different text values, these values should get concatenated and separated with line returns ' )
self . assertEqual ( merged_lead . type , ' opportunity ' , ' Type mismatch: when at least one opp in involved in the merge, the result should be a new opp (instead of %s ) ' % merged_lead . type )
# The other (tailing) leads/opps shouldn't exist anymore
self . assertFalse ( test_crm_lead_01 . exists ( ) , ' This tailing lead (id %s ) should not exist anymore ' % test_crm_lead_02 . id )
self . assertFalse ( test_crm_lead_02 . exists ( ) , ' This tailing opp (id %s ) should not exist anymore ' % test_crm_opp_01 . id )
# TEST CASE 2
# I want to test leads merge. Start by creating two leads (with the same partner)
test_crm_lead_03 = LeadSalesmanager . create ( {
' type ' : ' lead ' ,
2018-01-16 13:51:36 +01:00
' name ' : ' Test lead 3 ' , ' branch_id ' : branch . id ,
2018-01-16 06:58:15 +01:00
' partner_id ' : self . env . ref ( " base.res_partner_1 " ) . id ,
' stage_id ' : default_stage_id
} )
test_crm_lead_04 = LeadSalesmanager . create ( {
' type ' : ' lead ' ,
2018-01-16 13:51:36 +01:00
' name ' : ' Test lead 4 ' , ' branch_id ' : branch . id ,
2018-01-16 06:58:15 +01:00
' partner_id ' : self . env . ref ( " base.res_partner_1 " ) . id ,
' stage_id ' : default_stage_id
} )
lead_ids = [ test_crm_lead_03 . id , test_crm_lead_04 . id ]
additionnal_context = { ' active_model ' : ' crm.lead ' , ' active_ids ' : lead_ids , ' active_id ' : lead_ids [ 0 ] }
# I create a merge wizard and merge the leads together.
merge_opp_wizard_02 = self . env [ ' crm.merge.opportunity ' ] . sudo ( self . crm_salemanager . id ) . with_context ( * * additionnal_context ) . create ( { } )
merge_opp_wizard_02 . action_merge ( )
# I check for the resulting merged lead (based on name and partner)
merged_lead = self . env [ ' crm.lead ' ] . search ( [ ( ' name ' , ' = ' , ' Test lead 3 ' ) , ( ' partner_id ' , ' = ' , self . env . ref ( " base.res_partner_1 " ) . id ) ] , limit = 1 )
self . assertTrue ( merged_lead , ' Fail to create merge opportunity wizard ' )
self . assertEqual ( merged_lead . partner_id . id , self . env . ref ( " base.res_partner_1 " ) . id , ' Partner mismatch ' )
self . assertEqual ( merged_lead . type , ' lead ' , ' Type mismatch: when leads get merged together, the result should be a new lead (instead of %s ) ' % merged_lead . type )
self . assertFalse ( test_crm_lead_04 . exists ( ) , ' This tailing lead (id %s ) should not exist anymore ' % test_crm_lead_04 . id )
# TEST CASE 3
# I want to test opps merge. Start by creating two opportunities (with the same partner).
test_crm_opp_02 = LeadSalesmanager . create ( {
' type ' : ' opportunity ' ,
2018-01-16 13:51:36 +01:00
' name ' : ' Test opportunity 2 ' , ' branch_id ' : branch . id ,
2018-01-16 06:58:15 +01:00
' partner_id ' : self . env . ref ( " base.res_partner_3 " ) . id ,
' stage_id ' : default_stage_id
} )
test_crm_opp_03 = LeadSalesmanager . create ( {
' type ' : ' opportunity ' ,
2018-01-16 13:51:36 +01:00
' name ' : ' Test opportunity 3 ' , ' branch_id ' : branch . id ,
2018-01-16 06:58:15 +01:00
' partner_id ' : self . env . ref ( " base.res_partner_3 " ) . id ,
' stage_id ' : default_stage_id
} )
opportunity_ids = [ test_crm_opp_02 . id , test_crm_opp_03 . id ]
additionnal_context = { ' active_model ' : ' crm.lead ' , ' active_ids ' : opportunity_ids , ' active_id ' : opportunity_ids [ 0 ] }
# I create a merge wizard and merge the opps together.
merge_opp_wizard_03 = self . env [ ' crm.merge.opportunity ' ] . sudo ( self . crm_salemanager . id ) . with_context ( * * additionnal_context ) . create ( { } )
merge_opp_wizard_03 . action_merge ( )
merged_opportunity = self . env [ ' crm.lead ' ] . search ( [ ( ' name ' , ' = ' , ' Test opportunity 2 ' ) , ( ' partner_id ' , ' = ' , self . env . ref ( " base.res_partner_3 " ) . id ) ] , limit = 1 )
self . assertTrue ( merged_opportunity , ' Fail to create merge opportunity wizard ' )
self . assertEqual ( merged_opportunity . partner_id . id , self . env . ref ( " base.res_partner_3 " ) . id , ' Partner mismatch ' )
self . assertEqual ( merged_opportunity . type , ' opportunity ' , ' Type mismatch: when opps get merged together, the result should be a new opp (instead of %s ) ' % merged_opportunity . type )
self . assertFalse ( test_crm_opp_03 . exists ( ) , ' This tailing opp (id %s ) should not exist anymore ' % test_crm_opp_03 . id )