- 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<Campaign> talentCampaignsForDup = [SELECT Id FROM Campaign WHERE RecordType.Name = 'Talent'];
- List<Lead> leadsToDelete = new List<Lead>();
- List<CampaignMember> membersToUpdate = new List<CampaignMember>();
- List<CampaignMember> membersToInsert = new List<CampaignMember>();
- List<Lead> leadsToUpdate = new List<Lead>();
- List<Contact> contactsToUpdate = new List<Contact>();
- List<CampaignMember> cms = new List<CampaignMember>();
- List<CampaignMember> cmsPA = new List<CampaignMember>();
- Map<Id, String> leadType = new Map<Id, String>();
- Id b2cRecordTypeId = Schema.SObjectType.Lead.getRecordTypeInfosByName().get('B2C').getRecordTypeId();
- Map<Id, CampaignMember> campaignMembers = new Map<Id, CampaignMember>();
-
- 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<Contact, Contact> contactsByNameAndEmail = new Map<Contact, Contact>();
- 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<Lead, Lead> leadsByNameAndEmail = new Map<Lead, Lead>();
- 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<Id, CampaignMember> cmsPA, Map<Contact, Contact> contactsByNameAndEmail, List<Lead> leadsToDelete, List<CampaignMember> membersToUpdate, List<CampaignMember> membersToInsert, List<Contact> 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<Id, CampaignMember> cms, Map<Lead, Lead> leadsByNameAndEmail, List<Lead> leadsToDelete, List<CampaignMember> membersToUpdate,
- List<CampaignMember> membersToInsert, List<Lead> 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);
- }
- }
- }