In my org we have implemented Duplicate matching rules for leads. We have the Lead object being referenced in 2 custom objects (Enquiry__c
& Needs_Analysis__c
, simple lookup relationship).
In the below apex class, I am trying to update the reference of the lead with the surviving lead record. The "Enquiry" record's lead id gets updated, however, for the "Needs Analysis" record it does not change.
Am i doing something wrong in this piece of code? I am new to apex so not really sure how to go about debugging it.
public class LeadDuplicateTriggerHandler{
@InvocableMethod(label='Handle Duplicate Leads' description='Todo')
public static void handleDupLeads(List<DuplicateRecordItem> params) {
Set<Id> groupIds = SObjectUtils.getIDFieldValues(params, DuplicateRecordItem.DuplicateRecordSetId);
Map<Id, DuplicateRecordSet> duplicates =
new Map<Id, DuplicateRecordSet>([SELECT Id, (SELECT RecordId FROM DuplicateRecordItems) FROM DuplicateRecordSet WHERE Id IN :groupIds]);
Map<Id, Lead> leads = LeadFinder.getLeadsWithAttachmentsByDuplicateRecordSetIds(groupIds);
Enquiry__c[] enquiries = new Enquiry__c[] {};
Lead[] duplicateLeads = new Lead[] {};
Lead[] masterLeads = new Lead[] {};
Case[] cases = new Case[] {};
Needs_Analysis__c[] NA = new Needs_Analysis__c[] {};
for (DuplicateRecordSet entry : duplicates.values()) {
//calculate master
Lead master = leads.get(entry.DuplicateRecordItems[0].RecordId);
for (DuplicateRecordItem item : entry.DuplicateRecordItems) {
Lead lead = leads.get(item.recordId);
if (lead.CreatedDate < master.CreatedDate) {
master = lead;
if (String.isEmpty(master.Projects_Interested_in__c)) master.Projects_Interested_in__c = '';
}
}
for (DuplicateRecordItem item : entry.DuplicateRecordItems) {
if (item.RecordId != master.Id) {
Lead lead = leads.get(item.recordId);
if (String.isEmpty(master.SitecoreVisitorId__c) && String.isEmpty(lead.SitecoreVisitorId__c) ) master.SitecoreVisitorId__c = lead.SitecoreVisitorId__c;
//copy Enquiries to master Lead from duplicate Lead
//populate Lead fields from updated enquiries
for (Enquiry__c e : lead.Enquiries__r) {
e.Lead__c = master.Id;
if (e.Project__r != null && String.isNotEmpty(e.Project__r.Name) && !master.Projects_Interested_in__c.contains(e.Project__r.Name)) master.Projects_Interested_in__c += ';' + e.Project__r.Name;//TODO refine logic
}
enquiries.addAll(lead.Enquiries__r);
duplicateLeads.add(lead);
for (Case sCase : lead.Cases__r) {
sCase.Lead__c = master.Id;
}
cases.addAll(lead.Cases__r);
for (Needs_Analysis__c sNA : lead.Needs_Analysis__r) {
sNA.Lead__c = master.Id;
}
NA.addAll(lead.Needs_Analysis__r);
}
else {
//copy values for Enquiry linked to master lead
for (Enquiry__c e : master.Enquiries__r) {
if (e.Project__r != null && String.isNotEmpty(e.Project__r.Name) && !master.Projects_Interested_in__c.contains(e.Project__r.Name)) master.Projects_Interested_in__c += ';' + e.Project__r.Name;//TODO refine logic
}
}
}
masterLeads.add(master);
}
try {//TODO use Database. with opt=false; consider trigger byPass
update enquiries;
//Important: we delete duplicate first, after that update master in order to avoid conflicts with duplicates
if(duplicateLeads.size() > 0){
system.debug('CallUpdateCaseOnLeadDedupe:::');
ManualDataFlowService.UpdateCaseOnLeadDedupe(duplicateLeads);
ManualDataFlowService.CreateCaseOnEnquiryCreation(enquiries);
update cases;
}
update NA;
delete duplicateLeads;
update masterLeads;
}
catch(Exception e) {
ApplicationLogUtility.logError(LeadDuplicateTriggerHandler.class, 'handleDupLeads', e, e.getMessage(), null, null, null, null, null);
}
}
}