public with sharing class LeadTriggerUtil { public static void duplicateLeadManagement_setup(Lead[] leadsList) { for (Lead l : leadsList) { HLP_duplicateLeadManagement.talentCampaignsMAP.put(l.TalentSource__c, null); HLP_duplicateLeadManagement.inboundCampaignsMAP.put(l.InboundCampaign__c, null); // storing new lead names and emails for duplicate check HLP_duplicateLeadManagement.newNameSet.add(l.LastName); HLP_duplicateLeadManagement.newEmailSet.add(l.Email); } HLP_duplicateLeadManagement.talentCampaignsMAP2.putAll([SELECT Id, Name FROM Campaign WHERE Name IN :HLP_duplicateLeadManagement.talentCampaignsMAP.keySet()]); HLP_duplicateLeadManagement.inboundCampaignsMAP2.putAll([SELECT Id, Name FROM Campaign WHERE Name IN :HLP_duplicateLeadManagement.inboundCampaignsMAP.keySet()]); HLP_duplicateLeadManagement.talentCampaignsMAP.clear(); HLP_duplicateLeadManagement.inboundCampaignsMAP.clear(); // IF B2C???? String B2CID = Schema.SObjectType.Lead.getRecordTypeInfosByName().get('B2C').getRecordTypeId(); HLP_duplicateLeadManagement.dbLeads = [SELECT id, LastName, Email FROM Lead WHERE RecordTypeId=:B2CID AND (Email IN: HLP_duplicateLeadManagement.newEmailSet AND LastName IN: HLP_duplicateLeadManagement.newNameSet)]; HLP_duplicateLeadManagement.dbPersonAccounts = [SELECT Id, Email, LastName FROM Contact WHERE isPersonAccount=true AND (Email IN: HLP_duplicateLeadManagement.newEmailSet AND LastName IN: HLP_duplicateLeadManagement.newNameSet)]; } public static void duplicateLeadManagement_process(Lead[] leadsList) { List talentCampaignsForDup = [SELECT Id FROM Campaign WHERE RecordType.Name = 'Talent']; List leadsToDelete = new List(); List membersToUpdate = new List(); List membersToInsert = new List(); List leadsToUpdate = new List(); List contactsToUpdate = new List(); List cms = new List(); List cmsPA = new List(); Map leadType = new Map(); Id b2cRecordTypeId = Schema.SObjectType.Lead.getRecordTypeInfosByName().get('B2C').getRecordTypeId(); Map campaignMembers = new Map(); if (HLP_duplicateLeadManagement.dbLeads.size() > 0) { // RETRIEVING CAMPAIGN MEMBERS OF DUPLICATE LEADS cms = [SELECT Id, LeadId, ContactId FROM CampaignMember WHERE LeadId IN :HLP_duplicateLeadManagement.dbLeads AND CampaignId IN : talentCampaignsForDup]; } //// RETRIEVING CAMPAIGN MEMBERS OF DUPLICATE PERSON ACCOUNT if (HLP_duplicateLeadManagement.dbPersonAccounts.size() > 0) { cms = [SELECT Id, LeadId, ContactId FROM CampaignMember WHERE ContactId IN :HLP_duplicateLeadManagement.dbPersonAccounts AND CampaignId IN : talentCampaignsForDup]; } // setting a Map with contacts by name and email Map contactsByNameAndEmail = new Map(); for (Contact c : HLP_duplicateLeadManagement.dbPersonAccounts) { contactsByNameAndEmail.put(new Contact(LastName=c.LastName,Email=c.Email), c); } // setting a Map with contacts by name and email Map leadsByNameAndEmail = new Map(); for (Lead l : HLP_duplicateLeadManagement.dbLeads) { leadsByNameAndEmail.put(new Lead(LastName=l.LastName,Email=l.Email), l); } // setting Map with campaign members by either contact Id/leadId for(CampaignMember member: cms) { campaignMembers.put(member.ContactId, member); campaignMembers.put(member.LeadId, member); } for (Lead newLead : leadsList) { // setting value to update to hasemailoptout Boolean hasOptOut; if (newLead.TalentConsent__c == true) { hasOptOut = false; } else { hasOptOut = true; } // setting lead type if (newLead.TalentSource__c != 'Realize Media') { if (newLead.RecordTypeId == b2cRecordTypeId) { leadType.put(newLead.Id, 'B2C'); } else { leadType.put(newLead.Id, 'B2B'); } } else { leadType.put(newLead.Id, 'B2B'); } // for each campaign ID in talentCampaignsMap2 keys check if the corresponding campaign name value equals the new lead TalentSource fields; // if so, have the other map (which is empty) populated with the new lead TalentSource as key and the corresponding campaign as value for (Id idCampaign : HLP_duplicateLeadManagement.talentCampaignsMAP2.keySet()) { if (HLP_duplicateLeadManagement.talentCampaignsMAP2.get(idCampaign).Name == newLead.TalentSource__c) { HLP_duplicateLeadManagement.talentCampaignsMAP.put(newLead.TalentSource__c, HLP_duplicateLeadManagement.talentCampaignsMAP2.get(idCampaign)); } } // same as above but for inbound campaigns for (Id idCampaign : HLP_duplicateLeadManagement.inboundCampaignsMAP2.keySet()) { if (HLP_duplicateLeadManagement.inboundCampaignsMAP2.get(idCampaign).Name == newLead.InboundCampaign__c) { HLP_duplicateLeadManagement.inboundCampaignsMAP.put(newLead.InboundCampaign__c, HLP_duplicateLeadManagement.inboundCampaignsMAP2.get(idCampaign)); } } // IF LEAD IS B2C if (leadType.get(newLead.Id) != 'B2B' && !String.isBlank(newLead.LastName) && !String.isBlank(newLead.Email)) { if (HLP_duplicateLeadManagement.dbLeads.size() > 0) { // duplicate lead found - running lead deduplication // DEDUP LEAD dedupLead(newLead, campaignMembers, leadsByNameAndEmail, leadsToDelete, membersToUpdate, membersToInsert, leadsToUpdate, hasOptOut); } else if (HLP_duplicateLeadManagement.dbPersonAccounts.size() > 0) { // System.debug('DUPLICATE PERSON ACCOUNT FOUND'); dedupPersonAccount(newLead, campaignMembers, contactsByNameAndEmail, leadsToDelete, membersToUpdate, membersToInsert, contactsToUpdate, hasOptOut); } else { // duplicate not found - creating campaign member if (HLP_duplicateLeadManagement.talentCampaignsMAP.size() > 0) { CampaignMember cm = new CampaignMember( LeadId = newLead.id, CampaignId = HLP_duplicateLeadManagement.talentCampaignsMAP.get(newLead.TalentSource__c).Id, HasOptOutOfTalent__c = hasOptOut, LastUpdateHasOptOutOfTalent__c = newLead.DateTalentConsent__c ); Lead newLeadCopy = new Lead( Id = newLead.id, LastDateHasOptOutOfEmail__c = newLead.DateTalentConsent__c, HasOptedOutOfEmail = hasOptOut, SyncToMarketingCloud__c = true, recordTypeId = b2cRecordTypeId ); membersToInsert.add(cm); if (HLP_duplicateLeadManagement.inboundCampaignsMAP2.size() > 0) { CampaignMember cm2 = new CampaignMember( LeadId = newLead.Id, CampaignId = HLP_duplicateLeadManagement.inboundCampaignsMAP.get(newLead.InboundCampaign__c).Id ); membersToInsert.add(cm2); } leadsToUpdate.add(newLeadCopy); } else { // system.debug('Talent campaign not found - cannot execute code'); } } } else { // LEAD IS B2B - WILL BE PROCESSED WITH STANDARD DUPLICATE RULE } } Database.update(membersToUpdate, false); Database.insert(membersToInsert, false); Database.update(leadsToUpdate, false); Database.update(contactsToUpdate, false); Database.delete(leadsToDelete, false); } public static void dedupPersonAccount(Lead newLead, Map cmsPA, Map contactsByNameAndEmail, List leadsToDelete, List membersToUpdate, List membersToInsert, List contactsToUpdate, Boolean hasOptOut) { Contact c = contactsByNameAndEmail.get((new Contact(LastName=newLead.LastName, Email = newLead.Email))); if (c != null) { CampaignMember member = cmsPA.get(c.Id); if (member != null) { // System.debug('LEAD MATCHED WITH PERSON ACCOUNT!'); member.HasOptOutOfTalent__c = hasOptOut; member.LastUpdateHasOptOutOfTalent__c = newLead.DateTalentConsent__c; membersToUpdate.add(member); } else { // creazione campaign member e associazione campagna CampaignMember cm = new CampaignMember( ContactId = c.Id, CampaignId = HLP_duplicateLeadManagement.talentCampaignsMAP.get(newLead.TalentSource__c).Id, HasOptOutOfTalent__c = hasOptOut, LastUpdateHasOptOutOfTalent__c = newlead.DateTalentConsent__c ); membersToInsert.add(cm); if (HLP_duplicateLeadManagement.inboundCampaignsMAP2.size() > 0) { CampaignMember cm2 = new CampaignMember( LeadId = c.Id, CampaignId = HLP_duplicateLeadManagement.inboundCampaignsMAP.get(newLead.InboundCampaign__c).Id ); membersToInsert.add(cm2); } } // updating lead in DB with new lead data c.HasOptedOutOfEmail = hasOptOut; contactsToUpdate.add(c); Lead leadToDel = new Lead(Id=newLead.Id); leadsToDelete.add(leadToDel); } } public static void dedupLead(Lead newLead, Map cms, Map leadsByNameAndEmail, List leadsToDelete, List membersToUpdate, List membersToInsert, List leadsToUpdate, Boolean hasOptOut) { Lead l = leadsByNameAndEmail.get((new Lead(LastName=newLead.LastName, Email = newLead.Email))); if (l != null) { CampaignMember member = cms.get(l.Id); if (member != null) { member.HasOptOutOfTalent__c = hasOptOut; member.LastUpdateHasOptOutOfTalent__c = newLead.DateTalentConsent__c; membersToUpdate.add(member); } else { // creazione campaign member e associazione campagna CampaignMember cm = new CampaignMember( LeadId = l.Id, CampaignId = HLP_duplicateLeadManagement.talentCampaignsMAP.get(newLead.TalentSource__c).Id, HasOptOutOfTalent__c = hasOptOut, LastUpdateHasOptOutOfTalent__c = newlead.DateTalentConsent__c ); membersToInsert.add(cm); if (HLP_duplicateLeadManagement.inboundCampaignsMAP2.size() > 0) { CampaignMember cm2 = new CampaignMember( LeadId = l.Id, CampaignId = HLP_duplicateLeadManagement.inboundCampaignsMAP.get(newLead.InboundCampaign__c).Id ); membersToInsert.add(cm2); } } // updating lead in DB with new lead data l.InboundCampaign__c = newLead.InboundCampaign__c; l.LastDateHasOptOutOfEmail__c = newLead.DateTalentConsent__c; l.HasOptedOutOfEmail = hasOptOut; l.SyncToMarketingCloud__c = true; leadsToUpdate.add(l); Lead leadToDel = new Lead(Id=newLead.Id); leadsToDelete.add(leadToDel); } } }