-
-
Save BrightCloudNH/6779008 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// leadsRoundRobin.trigger: | |
trigger leadRoundRobin on Lead (before insert, before update) { | |
// | |
//Check if assignment owner has changed | |
// | |
Map<Integer,Id> queueIds = new Map<Integer,Id>(); //Trigger index --> Queue ID | |
Integer idx = 0; | |
for (Lead l : Trigger.new) | |
{ | |
if(Trigger.isUpdate) { | |
if(l.OwnerId <> Trigger.oldMap.get(l.id).OwnerId) { | |
if (l.TempOwnerId__c == 'SKIP') { | |
Trigger.new[idx].TempOwnerId__c = ''; | |
} else { | |
queueIds.put(idx, l.OwnerId); | |
} | |
} | |
}else { | |
queueIds.put(idx, l.OwnerId); | |
} | |
idx++; | |
} | |
System.debug('>>>>>queueIds: '+queueIds); | |
if (queueIds.isEmpty()) return; | |
// | |
//Find active Assignment Group for Queue | |
// | |
Map<Integer,Id> asgnGroupNameIds = new Map<Integer,Id>(); //Trigger index --> Assignment_Group_Name ID | |
Map<Id,Assignment_Group_Queues__c> asgnGroupQueues = new Map<Id,Assignment_Group_Queues__c>(); //Queue ID --> Assignment Group Queues | |
for(Assignment_Group_Queues__c[] agq : [SELECT Assignment_Group_Name__c, QueueId__c | |
FROM Assignment_Group_Queues__c | |
WHERE QueueId__c in :queueIds.values() | |
AND Active__c = 'True']) | |
{ | |
for (Integer i = 0; i < agq.size() ; i++) { | |
asgnGroupQueues.put(agq[i].QueueId__c, agq[i]); | |
} | |
} | |
System.debug('>>>>>asgnGroupQueues: '+asgnGroupQueues); | |
if (asgnGroupQueues.isEmpty()) return; | |
for (Integer i : queueIds.keySet()) { | |
Assignment_Group_Queues__c agq = asgnGroupQueues.get(queueIds.get(i)); | |
if (agq <> null) { | |
asgnGroupNameIds.put(i, agq.Assignment_Group_Name__c); | |
} | |
//else no active assignment group queue error | |
} | |
System.debug('>>>>>asgnGroupNameIds: '+asgnGroupNameIds); | |
if (asgnGroupNameIds.isEmpty()) return; | |
// | |
//Determine next valid user in Queue/Assignment Group for round robin | |
//User with earliest last assignment date wins. | |
// | |
Map<Id,Assignment_Groups__c[]> asgnGroups = new Map<Id,Assignment_Groups__c[]>(); // Assignment Group Name ID --> User ID | |
for(Assignment_Groups__c[] ags : [SELECT Group_Name__c, User__c, Last_Assignment__c, Millisecond__c | |
FROM Assignment_Groups__c | |
WHERE Group_Name__c in :asgnGroupNameIds.values() | |
AND Active__c = 'True' AND User_Active__c = 'True' | |
ORDER BY Last_Assignment__c, Millisecond__c]) | |
{ | |
if (ags.size()>0) { | |
asgnGroups.put(ags[0].Group_Name__c, ags); | |
} | |
} | |
System.debug('>>>>>asgnGroups: '+asgnGroups); | |
if (asgnGroups.isEmpty()) return; | |
Map<Id,Assignment_Groups__c> updateAssignmentGroups = new Map<Id,Assignment_Groups__c>(); | |
Map<Id, datetime> latestAGDateTime = new Map<Id,datetime>(); | |
idx = 0; | |
for (Integer i : queueIds.keySet()) | |
{ | |
Assignment_Groups__c[] ags = asgnGroups.get(asgnGroupNameIds.get(i)); | |
if (ags != null) | |
{ | |
//Choose next user in line if user ID has already been used but not committed in this trigger batch | |
Assignment_Groups__c ag = ags[math.mod(idx, ags.size())]; | |
//Assign User to Lead as the new owner | |
System.debug('>>>>>Owner changed for Lead ' + Trigger.new[i].Id + ' from '+Trigger.new[i].OwnerId+' to '+ ag.User__c); | |
Trigger.new[i].OwnerId = ag.User__c; | |
Trigger.new[i].TempOwnerId__c = ''; // don't assign back in an endless loop | |
//Set last assignment datetime | |
datetime now = datetime.now(); | |
ag.Last_Assignment__c = now; | |
ag.Millisecond__c = now.millisecondGMT(); | |
//update only latest Assignment Groups per ID | |
if (latestAGDateTime.containsKey(ag.id)) { | |
if(latestAGDateTime.get(ag.id) < now) { | |
updateAssignmentGroups.put(ag.id, ag); | |
latestAGDateTime.put(ag.id, now); | |
} | |
} else { | |
updateAssignmentGroups.put(ag.id, ag); | |
latestAGDateTime.put(ag.id,now); | |
} | |
idx++; | |
} | |
} | |
//Map --> List/Array for DML update | |
List<Assignment_Groups__c> updateAG = new List<Assignment_Groups__c>(); | |
for (Id agId : updateAssignmentGroups.keySet()) { | |
updateAG.add(updateAssignmentGroups.get(agId)); | |
} | |
System.debug('>>>>>Update Assignment Groups: '+updateAG); | |
// | |
//Update last assignment for Assignment Group in batch | |
// | |
if (updateAG.size()>0) { | |
try { | |
update updateAG; | |
} catch (Exception e){ | |
for (Integer i : queueIds.keySet()) | |
{ | |
Trigger.new[i].addError('ERROR: Could not update Assignment Group records ' + ' DETAIL: '+e.getMessage()); | |
} | |
} | |
} | |
} | |
// leadOwnerUpdate.trigger: | |
trigger leadOwnerUpdate on Lead (after update) { | |
List<Lead> updateLeads = new List<Lead>(); | |
Map<Id,Lead> leads = new Map<Id,Lead>(); | |
for (Lead l : Trigger.new) | |
{ | |
if(Trigger.isUpdate) { | |
System.debug('>>>>> Owner ID: '+l.ownerId+' Temp Owner ID: '+ l.TempOwnerId__c); | |
if(l.TempOwnerId__c <> null && l.TempOwnerId__c <> '') { | |
if(l.OwnerId <> l.TempOwnerId__c) { | |
leads.put(l.id,l); | |
} | |
} | |
} | |
} | |
if (leads.isEmpty()) return; | |
for (Lead l : [SELECT OwnerId,TempOwnerId__c FROM Lead WHERE id in :leads.keySet()]) { | |
l.OwnerId = leads.get(l.Id).TempOwnerId__c; | |
l.TempOwnerId__c = 'SKIP'; //flag to stop infinite loop upon update | |
updateLeads.add(l); | |
} | |
System.debug('>>>>>Update Leads: '+updateLeads); | |
// | |
//Update last assignment for Assignment Group in batch | |
// | |
if (updateLeads.size() > 0) { | |
try { | |
update updateLeads; | |
} catch (Exception e){ | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment