Snippet content copied to clipboard.
Are you sure to delete this snippet? No, don't delete
  1. public with sharing class LeadTriggerUtil {
  2. public static void duplicateLeadManagement_setup(Lead[] leadsList) {
  3. for (Lead l : leadsList) {
  4. HLP_duplicateLeadManagement.talentCampaignsMAP.put(l.TalentSource__c, null);
  5. HLP_duplicateLeadManagement.inboundCampaignsMAP.put(l.InboundCampaign__c, null);
  6. // storing new lead names and emails for duplicate check
  7. HLP_duplicateLeadManagement.newNameSet.add(l.LastName);
  8. HLP_duplicateLeadManagement.newEmailSet.add(l.Email);
  9. }
  10. HLP_duplicateLeadManagement.talentCampaignsMAP2.putAll([SELECT Id, Name FROM Campaign WHERE Name IN :HLP_duplicateLeadManagement.talentCampaignsMAP.keySet()]);
  11. HLP_duplicateLeadManagement.inboundCampaignsMAP2.putAll([SELECT Id, Name FROM Campaign WHERE Name IN :HLP_duplicateLeadManagement.inboundCampaignsMAP.keySet()]);
  12. HLP_duplicateLeadManagement.talentCampaignsMAP.clear();
  13. HLP_duplicateLeadManagement.inboundCampaignsMAP.clear();
  14. // IF B2C????
  15. String B2CID = Schema.SObjectType.Lead.getRecordTypeInfosByName().get('B2C').getRecordTypeId();
  16. HLP_duplicateLeadManagement.dbLeads = [SELECT id, LastName, Email FROM Lead WHERE RecordTypeId=:B2CID AND (Email IN: HLP_duplicateLeadManagement.newEmailSet AND LastName IN: HLP_duplicateLeadManagement.newNameSet)];
  17. HLP_duplicateLeadManagement.dbPersonAccounts = [SELECT Id, Email, LastName FROM Contact WHERE isPersonAccount=true AND (Email IN: HLP_duplicateLeadManagement.newEmailSet AND LastName IN: HLP_duplicateLeadManagement.newNameSet)];
  18. }
  19. public static void duplicateLeadManagement_process(Lead[] leadsList) {
  20. List<Campaign> talentCampaignsForDup = [SELECT Id FROM Campaign WHERE RecordType.Name = 'Talent'];
  21. List<Lead> leadsToDelete = new List<Lead>();
  22. List<CampaignMember> membersToUpdate = new List<CampaignMember>();
  23. List<CampaignMember> membersToInsert = new List<CampaignMember>();
  24. List<Lead> leadsToUpdate = new List<Lead>();
  25. List<Contact> contactsToUpdate = new List<Contact>();
  26. List<CampaignMember> cms = new List<CampaignMember>();
  27. List<CampaignMember> cmsPA = new List<CampaignMember>();
  28. Map<Id, String> leadType = new Map<Id, String>();
  29. Id b2cRecordTypeId = Schema.SObjectType.Lead.getRecordTypeInfosByName().get('B2C').getRecordTypeId();
  30. Map<Id, CampaignMember> campaignMembers = new Map<Id, CampaignMember>();
  31. if (HLP_duplicateLeadManagement.dbLeads.size() > 0) {
  32. // RETRIEVING CAMPAIGN MEMBERS OF DUPLICATE LEADS
  33. cms = [SELECT Id, LeadId, ContactId FROM CampaignMember WHERE LeadId IN :HLP_duplicateLeadManagement.dbLeads AND CampaignId IN : talentCampaignsForDup];
  34. }
  35. //// RETRIEVING CAMPAIGN MEMBERS OF DUPLICATE PERSON ACCOUNT
  36. if (HLP_duplicateLeadManagement.dbPersonAccounts.size() > 0) {
  37. cms = [SELECT Id, LeadId, ContactId FROM CampaignMember WHERE ContactId IN :HLP_duplicateLeadManagement.dbPersonAccounts AND CampaignId IN : talentCampaignsForDup];
  38. }
  39. // setting a Map with contacts by name and email
  40. Map<Contact, Contact> contactsByNameAndEmail = new Map<Contact, Contact>();
  41. for (Contact c : HLP_duplicateLeadManagement.dbPersonAccounts) {
  42. contactsByNameAndEmail.put(new Contact(LastName=c.LastName,Email=c.Email), c);
  43. }
  44. // setting a Map with contacts by name and email
  45. Map<Lead, Lead> leadsByNameAndEmail = new Map<Lead, Lead>();
  46. for (Lead l : HLP_duplicateLeadManagement.dbLeads) {
  47. leadsByNameAndEmail.put(new Lead(LastName=l.LastName,Email=l.Email), l);
  48. }
  49. // setting Map with campaign members by either contact Id/leadId
  50. for(CampaignMember member: cms) {
  51. campaignMembers.put(member.ContactId, member);
  52. campaignMembers.put(member.LeadId, member);
  53. }
  54. for (Lead newLead : leadsList) {
  55. // setting value to update to hasemailoptout
  56. Boolean hasOptOut;
  57. if (newLead.TalentConsent__c == true) {
  58. hasOptOut = false;
  59. } else {
  60. hasOptOut = true;
  61. }
  62. // setting lead type
  63. if (newLead.TalentSource__c != 'Realize Media') {
  64. if (newLead.RecordTypeId == b2cRecordTypeId) {
  65. leadType.put(newLead.Id, 'B2C');
  66. } else {
  67. leadType.put(newLead.Id, 'B2B');
  68. }
  69. } else {
  70. leadType.put(newLead.Id, 'B2B');
  71. }
  72. // for each campaign ID in talentCampaignsMap2 keys check if the corresponding campaign name value equals the new lead TalentSource fields;
  73. // if so, have the other map (which is empty) populated with the new lead TalentSource as key and the corresponding campaign as value
  74. for (Id idCampaign : HLP_duplicateLeadManagement.talentCampaignsMAP2.keySet()) {
  75. if (HLP_duplicateLeadManagement.talentCampaignsMAP2.get(idCampaign).Name == newLead.TalentSource__c) {
  76. HLP_duplicateLeadManagement.talentCampaignsMAP.put(newLead.TalentSource__c, HLP_duplicateLeadManagement.talentCampaignsMAP2.get(idCampaign));
  77. }
  78. }
  79. // same as above but for inbound campaigns
  80. for (Id idCampaign : HLP_duplicateLeadManagement.inboundCampaignsMAP2.keySet()) {
  81. if (HLP_duplicateLeadManagement.inboundCampaignsMAP2.get(idCampaign).Name == newLead.InboundCampaign__c) {
  82. HLP_duplicateLeadManagement.inboundCampaignsMAP.put(newLead.InboundCampaign__c, HLP_duplicateLeadManagement.inboundCampaignsMAP2.get(idCampaign));
  83. }
  84. }
  85. // IF LEAD IS B2C
  86. if (leadType.get(newLead.Id) != 'B2B' && !String.isBlank(newLead.LastName) && !String.isBlank(newLead.Email)) {
  87. if (HLP_duplicateLeadManagement.dbLeads.size() > 0) {
  88. // duplicate lead found - running lead deduplication
  89. // DEDUP LEAD
  90. dedupLead(newLead, campaignMembers, leadsByNameAndEmail, leadsToDelete, membersToUpdate, membersToInsert, leadsToUpdate, hasOptOut);
  91. } else if (HLP_duplicateLeadManagement.dbPersonAccounts.size() > 0) {
  92. // System.debug('DUPLICATE PERSON ACCOUNT FOUND');
  93. dedupPersonAccount(newLead, campaignMembers, contactsByNameAndEmail, leadsToDelete, membersToUpdate, membersToInsert, contactsToUpdate, hasOptOut);
  94. } else { // duplicate not found - creating campaign member
  95. if (HLP_duplicateLeadManagement.talentCampaignsMAP.size() > 0) {
  96. CampaignMember cm = new CampaignMember(
  97. LeadId = newLead.id,
  98. CampaignId = HLP_duplicateLeadManagement.talentCampaignsMAP.get(newLead.TalentSource__c).Id,
  99. HasOptOutOfTalent__c = hasOptOut,
  100. LastUpdateHasOptOutOfTalent__c = newLead.DateTalentConsent__c
  101. );
  102. Lead newLeadCopy = new Lead(
  103. Id = newLead.id,
  104. LastDateHasOptOutOfEmail__c = newLead.DateTalentConsent__c,
  105. HasOptedOutOfEmail = hasOptOut,
  106. SyncToMarketingCloud__c = true,
  107. recordTypeId = b2cRecordTypeId
  108. );
  109. membersToInsert.add(cm);
  110. if (HLP_duplicateLeadManagement.inboundCampaignsMAP2.size() > 0) {
  111. CampaignMember cm2 = new CampaignMember(
  112. LeadId = newLead.Id,
  113. CampaignId = HLP_duplicateLeadManagement.inboundCampaignsMAP.get(newLead.InboundCampaign__c).Id
  114. );
  115. membersToInsert.add(cm2);
  116. }
  117. leadsToUpdate.add(newLeadCopy);
  118. } else {
  119. // system.debug('Talent campaign not found - cannot execute code');
  120. }
  121. }
  122. } else {
  123. // LEAD IS B2B - WILL BE PROCESSED WITH STANDARD DUPLICATE RULE
  124. }
  125. }
  126. Database.update(membersToUpdate, false);
  127. Database.insert(membersToInsert, false);
  128. Database.update(leadsToUpdate, false);
  129. Database.update(contactsToUpdate, false);
  130. Database.delete(leadsToDelete, false);
  131. }
  132. 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) {
  133. Contact c = contactsByNameAndEmail.get((new Contact(LastName=newLead.LastName, Email = newLead.Email)));
  134. if (c != null) {
  135. CampaignMember member = cmsPA.get(c.Id);
  136. if (member != null) {
  137. // System.debug('LEAD MATCHED WITH PERSON ACCOUNT!');
  138. member.HasOptOutOfTalent__c = hasOptOut;
  139. member.LastUpdateHasOptOutOfTalent__c = newLead.DateTalentConsent__c;
  140. membersToUpdate.add(member);
  141. } else {
  142. // creazione campaign member e associazione campagna
  143. CampaignMember cm = new CampaignMember(
  144. ContactId = c.Id,
  145. CampaignId = HLP_duplicateLeadManagement.talentCampaignsMAP.get(newLead.TalentSource__c).Id,
  146. HasOptOutOfTalent__c = hasOptOut,
  147. LastUpdateHasOptOutOfTalent__c = newlead.DateTalentConsent__c
  148. );
  149. membersToInsert.add(cm);
  150. if (HLP_duplicateLeadManagement.inboundCampaignsMAP2.size() > 0) {
  151. CampaignMember cm2 = new CampaignMember(
  152. LeadId = c.Id,
  153. CampaignId = HLP_duplicateLeadManagement.inboundCampaignsMAP.get(newLead.InboundCampaign__c).Id
  154. );
  155. membersToInsert.add(cm2);
  156. }
  157. }
  158. // updating lead in DB with new lead data
  159. c.HasOptedOutOfEmail = hasOptOut;
  160. contactsToUpdate.add(c);
  161. Lead leadToDel = new Lead(Id=newLead.Id);
  162. leadsToDelete.add(leadToDel);
  163. }
  164. }
  165. public static void dedupLead(Lead newLead, Map<Id, CampaignMember> cms, Map<Lead, Lead> leadsByNameAndEmail, List<Lead> leadsToDelete, List<CampaignMember> membersToUpdate,
  166. List<CampaignMember> membersToInsert, List<Lead> leadsToUpdate, Boolean hasOptOut) {
  167. Lead l = leadsByNameAndEmail.get((new Lead(LastName=newLead.LastName, Email = newLead.Email)));
  168. if (l != null) {
  169. CampaignMember member = cms.get(l.Id);
  170. if (member != null) {
  171. member.HasOptOutOfTalent__c = hasOptOut;
  172. member.LastUpdateHasOptOutOfTalent__c = newLead.DateTalentConsent__c;
  173. membersToUpdate.add(member);
  174. } else {
  175. // creazione campaign member e associazione campagna
  176. CampaignMember cm = new CampaignMember(
  177. LeadId = l.Id,
  178. CampaignId = HLP_duplicateLeadManagement.talentCampaignsMAP.get(newLead.TalentSource__c).Id,
  179. HasOptOutOfTalent__c = hasOptOut,
  180. LastUpdateHasOptOutOfTalent__c = newlead.DateTalentConsent__c
  181. );
  182. membersToInsert.add(cm);
  183. if (HLP_duplicateLeadManagement.inboundCampaignsMAP2.size() > 0) {
  184. CampaignMember cm2 = new CampaignMember(
  185. LeadId = l.Id,
  186. CampaignId = HLP_duplicateLeadManagement.inboundCampaignsMAP.get(newLead.InboundCampaign__c).Id
  187. );
  188. membersToInsert.add(cm2);
  189. }
  190. }
  191. // updating lead in DB with new lead data
  192. l.InboundCampaign__c = newLead.InboundCampaign__c;
  193. l.LastDateHasOptOutOfEmail__c = newLead.DateTalentConsent__c;
  194. l.HasOptedOutOfEmail = hasOptOut;
  195. l.SyncToMarketingCloud__c = true;
  196. leadsToUpdate.add(l);
  197. Lead leadToDel = new Lead(Id=newLead.Id);
  198. leadsToDelete.add(leadToDel);
  199. }
  200. }
  201. }

Edit this Snippet