You need to sign in to do that
Don't have an account?
Ashley Cobb 25
Lead conversion trigger not firing
Hello,
The company that I work for has custom code to convert a lead to a contact/account. For some reason it only fires about half the time. This is extrememly important because our users do not have access to leads so when they are not converted they are not followed up with. I would really appreciate it if anyone can look and see if they find any errors. I have been looking through it for days and cannot seem to figure out why it only fires half the time and doesn't send me any error messages. This is a little bit beyond my ability as I have never worked with @future methods or scheduling things via the UI.
Trigger:
Thanks!!
The company that I work for has custom code to convert a lead to a contact/account. For some reason it only fires about half the time. This is extrememly important because our users do not have access to leads so when they are not converted they are not followed up with. I would really appreciate it if anyone can look and see if they find any errors. I have been looking through it for days and cannot seem to figure out why it only fires half the time and doesn't send me any error messages. This is a little bit beyond my ability as I have never worked with @future methods or scheduling things via the UI.
Trigger:
trigger LeadTrigger on Lead( after update, after insert ) { // Assign values of trigger new list to helper class variable LeadTriggerHelper.newLeadList = trigger.new; // Assign values of trigger old list to helper class variable LeadTriggerHelper.oldLeadList = trigger.old; // Assign values of trigger new map to helper class variable LeadTriggerHelper.newLeadMap = trigger.newMap; // Assign values of trigger old map to helper class variable LeadTriggerHelper.oldLeadMap = trigger.oldMap; // Check if runTrigger if( LeadTriggerHelper.runTrigger ) { // Check if after if( trigger.isAfter ) { // Check if Update if( trigger.isUpdate ) { // Call method to convert lead LeadTriggerHelper.leadConversionAfterInsert(); } if( trigger.isInsert ) { LeadTriggerHelper.scheduleLeadConversion(); } } } }Classes:
public with sharing class LeadTriggerHelper { // To check whether to call boolean or not public static Boolean runTrigger = true; // List to store Lead of trigger.new public static List<Lead> newLeadList = new List<Lead>(); // List to store Lead of trigger.old public static List<Lead> oldLeadList = new List<Lead>(); // Map to store Lead of trigger.newMap public static Map<Id, Lead> newLeadMap = new Map<Id, Lead>(); // Map to store Lead of trigger.oldMap public static Map<Id, Lead> oldLeadMap = new Map<Id, Lead>(); private static String convertStatus; private static Map<String, User> nameToUserMap = new Map<String, User>(); /** * Name: leadConversionAfterInsert * @param: * @return: * Desc: Method to convert lead when created **/ public static void leadConversionAfterInsert() { //try //{ Set<String> uniqueEmails = new Set<String>(); Set<String> uniqueWebsites = new Set<String>(); List<Lead> uniqueLeads = new List<Lead>(); List<Lead> existingLeads = new List<Lead>(); List<Lead> newAccountExistingEmail = new List<Lead>(); Set<String> userNames = new Set<String>(); for( Lead lead : newLeadList ) { if( lead.Convert__c && !oldLeadMap.get( lead.Id ).Convert__c && !lead.Isconverted ) { if( lead.Website != null && lead.Website != '' ) { if( uniqueWebsites.contains( lead.Website.replace( 'https://', '' ).replace( 'http://', '' ).replace( 'www.', '' ))) { if( lead.Email != null && lead.Email != '' ) { if( uniqueEmails.contains( lead.Email )) { newAccountExistingEmail.add( lead ); } else { uniqueEmails.add( lead.Email ); existingLeads.add( lead ); } } else { existingLeads.add( lead ); } } else { uniqueWebsites.add( lead.Website.replace( 'https://', '' ).replace( 'http://', '' ).replace( 'www.', '' )); uniqueLeads.add( lead ); if( lead.Email != null && lead.Email != '' ) { uniqueEmails.add( lead.Email ); } } } else if( lead.Email != null && lead.Email != '' ) { if( uniqueEmails.contains( lead.Email )) { existingLeads.add( lead ); } else { uniqueEmails.add( lead.Email ); uniqueLeads.add( lead ); } } else { uniqueLeads.add( lead ); } if( lead.MASTER_SDR_Owner__c != null && lead.MASTER_SDR_Owner__c != '' ) userNames.add( lead.MASTER_SDR_Owner__c ); } } LeadStatus convertStatuses = [ Select MasterLabel from LeadStatus where IsConverted = true limit 1 ]; convertStatus = convertStatuses.MasterLabel; for( User u : [ Select Id, Name from User where Name IN :userNames ]) { nameToUserMap.put( u.Name, u ); } convertLeads( uniqueLeads ); convertLeads( existingLeads ); convertLeads( newAccountExistingEmail ); /*} catch( Exception e ) { system.debug( 'Error********************' + e.getMessage() + ':::::::::::::::' + e.getLineNumber() ); }*/ } public static void convertLeads( List<Lead> leadsToBeConverted ) { Set<String> emailAddressSet = new Set<String>(); Set<Id> accountIds = new Set<Id>(); Set<String> webSiteSet = new Set<String>(); for( Lead lead : leadsToBeConverted ) { if( lead.bizible2__Account__c != null ) accountIds.add( lead.bizible2__Account__c ); else if( lead.Website != null && lead.Website != '' ) webSiteSet.add( '%' + lead.Website.replace( 'https://', '' ).replace( 'http://', '' ).replace( 'www.', '' )); if( lead.Email != null && lead.Email != '' ) emailAddressSet.add( lead.Email ); } Map<Id, Account> accountMap = new Map<Id, Account>([ Select Id, Website, Phone, Description, Intel_City__c, Intel_Country__c, Intel_State__c, Territory_New__c, ( Select Id, Email, Phone, Title, Description, Survey_Agency_Services__c, Survey_Current_Attribution_Model__c, Survey_Marketing_Channels_in_Use__c, Survey_Name_of_Agency__c, Survey_Reporting_Tools_and_Apps_in_Use__c, Survey_Using_an_Agency__c, Calls_Made__c, Follow_up_Date__c, Relevant_ADR_Notes__c, ADR_Owner__c, Current_Stage__c, Snapengage__c, Demo_Scheduled_Date__c, Demo_Result__c, LeadSource from Contacts where Email IN :emailAddressSet ) from Account where Id IN :accountIds ]); Map<String, List<Account>> websiteToAccountMap = new Map<String, List<Account>>(); for( Account acc : [ Select Id, Website, Phone, Description, Intel_City__c, Intel_Country__c, Intel_State__c, Territory_New__c, ( Select Id, Email, Phone, Title, Description, Survey_Agency_Services__c, Survey_Current_Attribution_Model__c, Survey_Marketing_Channels_in_Use__c, Survey_Name_of_Agency__c, Survey_Reporting_Tools_and_Apps_in_Use__c, Survey_Using_an_Agency__c, Calls_Made__c, Follow_up_Date__c, Relevant_ADR_Notes__c, ADR_Owner__c, Current_Stage__c, Snapengage__c, Demo_Scheduled_Date__c, Demo_Result__c, LeadSource from Contacts where Email IN :emailAddressSet ) from Account where Website like :webSiteSet ]) { List<Account> accs = new List<Account>(); if( websiteToAccountMap.containsKey( acc.Website.replace( 'https://', '' ).replace( 'http://', '' ).replace( 'www.', '' ))) { accs = websiteToAccountMap.get( acc.Website.replace( 'https://', '' ).replace( 'http://', '' ).replace( 'www.', '' )); } accs.add( acc ); websiteToAccountMap.put( acc.Website.replace( 'https://', '' ).replace( 'http://', '' ).replace( 'www.', '' ), accs ); } /*Map<String, Contact> emailAddressToContactMap = new Map<String, Contact>(); for( Contact con : [ Select Id, Email, Phone, Description, Survey_Agency_Services__c, Survey_Current_Attribution_Model__c, Survey_Marketing_Channels_in_Use__c, Survey_Name_of_Agency__c, Survey_Reporting_Tools_and_Apps_in_Use__c, Survey_Using_an_Agency__c, MASTER_SDR_Contact_Attempts__c, MASTER_SDR_Follow_Up_Date__c, MASTER_SDR_Notes__c, MASTER_SDR_Owner__c, MASTER_SDR_Stage__c, Snapengage__c, Demo_Scheduled_Date__c, Demo_Result__c, LeadSource from Contact where Email IN :emailAddressSet ]) { emailAddressToContactMap.put( con.Email, con ); }*/ List<Database.LeadConvert> leadConverts = new List<Database.LeadConvert>(); Map<Id, Account> accountsToBeUpdated = new Map<Id, Account>(); Map<Id, Contact> contactsToBeUpdated = new Map<Id, Contact>(); for( Lead lead : leadsToBeConverted ) { Database.LeadConvert lc = new Database.LeadConvert(); lc.setDoNotCreateOpportunity( true ); lc.setLeadId( lead.Id ); lc.setConvertedStatus( convertStatus ); Account acc; Contact con; if( lead.bizible2__Account__c != null && accountMap.containsKey( lead.bizible2__Account__c )) { acc = accountMap.get( lead.bizible2__Account__c ); if( lead.Email != null && lead.Email != '' ) { for( Contact c : acc.Contacts ) { if( c.Email != null && c.Email != '' && c.Email.equalsIgnoreCase( lead.Email )) { con = c; break; } } } } else if( lead.Website != null && lead.WebSite != '' && websiteToAccountMap.containsKey( lead.Website.replace( 'https://', '' ).replace( 'http://', '' ).replace( 'www.', '' ))) { List<Account> accounts = websiteToAccountMap.get( lead.Website.replace( 'https://', '' ).replace( 'http://', '' ).replace( 'www.', '' )); if( lead.Email != null && lead.Email != '' ) { for( Account a : accounts ) { for( Contact c : a.Contacts ) { if( c.Email != null && c.Email != '' && c.Email.equalsIgnoreCase( lead.Email )) { acc = a; con = c; break; } } if( acc != null ) break; } if( acc == null ) acc = accounts[0]; } } if( acc != null ) { lc.setAccountId( acc.Id ); Boolean flag = false; if( acc.Phone == null || acc.Phone == '' ) { acc.Phone = lead.Phone; flag = true; } if( acc.Description == null || acc.Description == '' ) { acc.Description = lead.Description; flag = true; } if( acc.Intel_City__c == null || acc.Intel_City__c == '' ) { acc.Intel_City__c = lead.Intel_City__c; flag = true; } if( acc.Intel_Country__c == null || acc.Intel_Country__c == '' ) { acc.Intel_Country__c = lead.Intel_Country__c; flag = true; } if( acc.Territory_New__c == null || acc.Territory_New__c == '' ) { acc.Territory_New__c = lead.Territory_New__c; flag = true; } if( acc.Intel_State__c == null || acc.Intel_State__c == '' ) { acc.Intel_State__c = lead.Intel_State__c; flag = true; } if( flag ) accountsToBeUpdated.put( acc.Id, acc ); } if( con != null ) { lc.setContactId( con.Id ); Boolean flag = false; //Contact con = emailAddressToContactMap.get( lead.Email ); if( con.Phone == null || con.Phone == '' ) { con.Phone = lead.Phone; flag = true; } if( con.Title == null || con.Title == '' ) { con.Title = lead.Title; flag = true; } if( con.Description == null || con.Description == '' ) { con.Description = lead.Description; flag = true; } if( con.LeadSource == null || con.LeadSource == '' ) { con.LeadSource = lead.LeadSource; flag = true; } if( !con.Snapengage__c ) { con.Snapengage__c = lead.Snapengage__c; flag = true; } if( con.Survey_Agency_Services__c == null || con.Survey_Agency_Services__c == '' ) { con.Survey_Agency_Services__c = lead.Survey_Agency_Services__c; flag = true; } if( con.Survey_Current_Attribution_Model__c == null || con.Survey_Current_Attribution_Model__c == '' ) { con.Survey_Current_Attribution_Model__c = lead.Current_Attribution_Model_in_Use__c; flag = true; } if( con.Survey_Marketing_Channels_in_Use__c == null || con.Survey_Marketing_Channels_in_Use__c == '' ) { con.Survey_Marketing_Channels_in_Use__c = lead.Marketing_Channels_in_Use__c; flag = true; } if( con.Survey_Name_of_Agency__c == null || con.Survey_Name_of_Agency__c == '' ) { con.Survey_Name_of_Agency__c = lead.Survey_Name_of_Agency__c; flag = true; } if( con.Survey_Reporting_Tools_and_Apps_in_Use__c == null || con.Survey_Reporting_Tools_and_Apps_in_Use__c == '' ) { con.Survey_Reporting_Tools_and_Apps_in_Use__c = lead.Reporting_Tools_and_Apps_in_Use__c; flag = true; } if( con.Survey_Using_an_Agency__c == null || con.Survey_Using_an_Agency__c == '' ) { con.Survey_Using_an_Agency__c = lead.Survey_Using_an_Agency__c; flag = true; } if( con.Calls_Made__c == null || con.Calls_Made__c == '' ) { con.Calls_Made__c = lead.MASTER_SDR_Contact_Attempts_2__c; flag = true; } if( con.Follow_up_Date__c == null ) { con.Follow_up_Date__c = lead.MASTER_SDR_Follow_Up_Date__c; flag = true; } if( con.Relevant_ADR_Notes__c == null || con.Relevant_ADR_Notes__c == '' ) { con.Relevant_ADR_Notes__c = lead.MASTER_SDR_Notes__c; flag = true; } if( con.ADR_Owner__c == null ) { if( lead.MASTER_SDR_Owner__c != null && lead.MASTER_SDR_Owner__c != '' && nameToUserMap.containsKey( lead.MASTER_SDR_Owner__c )) { con.ADR_Owner__c = nameToUserMap.get( lead.MASTER_SDR_Owner__c ).Id; flag = true; } } if( con.Current_Stage__c == null || con.Current_Stage__c == '' ) { con.Current_Stage__c = lead.MASTER_SDR_Stage_2__c; flag = true; } if( con.Demo_Result__c == null || con.Demo_Result__c == '' ) { con.Demo_Result__c = lead.Demo_Rejection_Reason__c; flag = true; } if( con.Demo_Scheduled_Date__c == null ) { con.Demo_Scheduled_Date__c = lead.Demo_Scheduled_Date__c; flag = true; } if( flag ) contactsToBeUpdated.put( con.Id, con ); } leadConverts.add(lc); } if( leadConverts.size() > 0 ) Database.convertLead( leadConverts ); if( accountsToBeUpdated.size() > 0 ) update accountsToBeUpdated.values(); if( contactsToBeUpdated.size() > 0 ) update contactsToBeUpdated.values(); } public static void scheduleLeadConversion() { Set<Id> leadIdsToScheduleAterFiveMins = new Set<Id>(); Set<Id> leadIdsToScheduleAterThirtyMins = new Set<Id>(); Set<Id> leadIds = new Set<Id>(); for( Lead lead : newLeadList ) { if( !lead.IsConverted ) { if( lead.bizible2__Account__c != null ) leadIds.add( lead.Id ); else if( lead.Inbound__c ) leadIdsToScheduleAterFiveMins.add( lead.Id ); else leadIdsToScheduleAterThirtyMins.add( lead.Id ); } system.debug(leadIds); system.debug(leadIdsToScheduleAterFiveMins); system.debug(leadIdsToScheduleAterThirtyMins); } if( leadIds.size() > 0 ) LeadConnectorBatch.runBatchJob( 200, '', leadIds ); if( leadIdsToScheduleAterFiveMins.size() > 0 ) convertLeadsByBatch( leadIdsToScheduleAterFiveMins, 5 ); if( leadIdsToScheduleAterThirtyMins.size() > 0 ) convertLeadsByBatch( leadIdsToScheduleAterThirtyMins, 30 ); } @future private static void convertLeadsByBatch( Set<Id> leadIds, Integer mins ) { // Get the new Date time instance for schedular Datetime nextRunInstance = Datetime.now().addMinutes( mins ); // Get seconds, minutes and hours String seconds = String.valueOf( nextRunInstance.second()); String minutes = String.valueOf( nextRunInstance.minute()); String hour = String.valueOf( nextRunInstance.hour()); String day = String.valueOf( nextRunInstance.day()); String month = String.valueOf( nextRunInstance.month()); String year = String.valueOf( nextRunInstance.year()); // Create Schedular string and return String nextFireTime = seconds + ' ' + minutes + ' ' + hour + ' ' + day + ' ' + month + ' ? ' + year; LeadConversionScheduler.runSchedular( nextFireTime, leadIds ); } }
global with sharing class LeadConversionScheduler implements Schedulable { // To store lead Id private Set<Id> leadIds; /** * Name: runSchedular * @param: schedularString - Time string to schedule batch * leadId - Lead id to be converted * @return: * Desc: Method which initiates the schedular class to run the Batch Class **/ global static void runSchedular( String schedularString, Set<Id> leadIds ) { // Create the instance of schedular class LeadConversionScheduler schedularInstance = new LeadConversionScheduler(); schedularInstance.leadIds = leadIds; // Schedule the class System.schedule( 'Lead Conversion starts at ' + Datetime.now() + ' ' + Math.random(), schedularString, schedularInstance ); } /** * Name: execute * @param: SC - SchedulableContext * @return: * Desc: Schedular execution method, to process results **/ global void execute( SchedulableContext SC ) { // Run the Queue LeadConnectorBatch.runBatchJob( 200, '', leadIds ); } }
Thanks!!
Ashley Cobb 25
This is the final piece. This is a huge moster of a code and I am lost so I appreciate it!!