Advertisement
Guest User

Untitled

a guest
Jun 20th, 2019
75
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 9.20 KB | None | 0 0
  1. public with sharing class LeadAssignment{
  2. // -------- Variables --------
  3. // Lead Assignment prep
  4. private static Set<Id> queueIds = new Set<Id>(), leadIds = new Set<Id>(), userIds = new Set<Id>();
  5.  
  6. // Lead Updated Records
  7. private static Lead[] updatedRecords = new Lead[0];
  8.  
  9. // Group Members
  10. private static Map<Id, Id[]> queueUsers = new Map<Id, Id[]>();
  11.  
  12. // Group Mebmers based on Lead ID
  13. private static Set<Id> leadQueueUsers = new Set<Id>();
  14.  
  15. // Exceptions for Error Handling
  16. private static List<Exception__c> createExceptions = new List<Exception__c>();
  17.  
  18.  
  19. @InvocableMethod
  20. public static List<AssignLeadActionResult> assignLeads(List<AssignLeadActionRequest> requests){
  21. List<AssignLeadActionResult> results = new List<AssignLeadActionResult>();
  22. //Set<Id> queueIds = new Set<Id>(), leadIds = new Set<Id>(), userIds = new Set<Id>();
  23. //Lead[] updatedRecords = new Lead[0];
  24. //Map<Id, Id[]> queueUsers = new Map<Id, Id[]>();
  25.  
  26. // --- AGGREGATE DATA PHASE --- //
  27. // Get all queue Ids and lead Ids.
  28. for(AssignLeadActionRequest request: requests) {
  29. queueIds.addAll(request.queueIDs);
  30. leadIds.addAll(request.leadIDs);
  31. }
  32. // Initialize queue->user Map
  33. for(Id queueId: queueIDs) {
  34. queueUsers.put(queueId, new Id[0]);
  35. }
  36.  
  37. // --- QUERY DATA PHASE --- //
  38. // Get all leads present
  39. Map<Id, Lead> leads = new Map<Id, Lead>([SELECT Id, OwnerId, Lead_Round_Robin__c FROM Lead WHERE Id = :leadIds]);
  40. // Get all queue members
  41. for(GroupMember member: [SELECT UserOrGroupId, GroupId FROM GroupMember WHERE GroupId = :queueIds]) {
  42. if(member.UserOrGroupId.getSObjectType() == User.sobjectType) {
  43. userIds.add(member.UserOrGroupId);
  44. queueUsers.get(member.GroupId).add(member.UserOrGroupId);
  45. }
  46. }
  47. // Eliminate inactive users
  48. for(User record: [SELECT Id FROM User WHERE IsActive = false AND Id = :userIds]) {
  49. userIds.remove(record.Id);
  50. }
  51.  
  52. System.debug('This is userIds:' + userIds);
  53.  
  54. // --- UPDATE DATA PHASE --- //
  55. // Rebuild Queue users
  56. for(Id queueId: queueUsers.keySet()) {
  57. Id[] tempUserIds = queueUsers.get(queueId);
  58. Set<Id> activeUsers = new Set<Id>(tempUserIds);
  59. activeUsers.retainAll(userIds);
  60. tempUserIds.clear();
  61. tempUserIds.addAll(activeUsers);
  62. }
  63.  
  64. // For each request, figure out possible assignees
  65. for(AssignLeadActionRequest request: requests) {
  66. //Set<Id> leadQueueUsers = new Set<Id>();
  67. for(Id queueId: request.queueIds) {
  68. leadQueueUsers.addAll(queueUsers.get(queueId));
  69. }
  70. Id[] repAssignList = new List<Id>(leadQueueUsers);
  71. repAssignList.sort(); // For consistency
  72. // For each lead, assign active user
  73. for(Id leadRecord: request.leadIds) {
  74. Lead tempLead = leads.remove(leadRecord);
  75. if(tempLead != null) {
  76. if(repAssignList.isEmpty()) {
  77.  
  78. createExceptions.add(EvolveException.buildException('LeadAssignment', 'assignLead', 'No possible assignments'));
  79. System.debug('assignLead: ' + 'No possible assignments');
  80.  
  81. insert createExceptions;
  82.  
  83. } else {
  84. tempLead.OwnerId = repAssignList[Math.mod(Integer.valueOf(tempLead.Lead_Round_Robin__c), repAssignList.size())];
  85. updatedRecords.add(tempLead);
  86.  
  87. Future_LeadRoundRobinAssignment.notifyLeadOwner(tempLead.id,tempLead.OwnerId);
  88. }
  89. } else {
  90. // Oops, duplicate lead in same transaction, report error.
  91. createExceptions.add(EvolveException.buildException('LeadAssignment', 'assignLead', 'duplicate lead in same transaction'));
  92. System.debug('assignLead: ' + 'Duplicate lead in same transaction');
  93.  
  94. insert createExceptions;
  95. }
  96. }
  97. }
  98. update updatedRecords;
  99.  
  100. return results;
  101. }
  102.  
  103. public class AssignLeadActionRequest {
  104. @InvocableVariable(required = false)
  105. public List<ID> queueIDs;
  106.  
  107. @InvocableVariable(required = false)
  108. public List<Id> leadIDs;
  109. }
  110.  
  111. public class AssignLeadActionResult {
  112. @InvocableVariable(required = false)
  113. public List<Id> leadIDs;
  114. }
  115.  
  116. @isTest
  117. private class leadRoundRobinAssignment_Test
  118. {
  119. // -------- Variables --------
  120. // Records
  121. private static List<User> testUsers = new List<User>();
  122. private static List<Lead> testLeads = new List<Lead>();
  123. private static List<Group> testGroups = new List<Group>();
  124. private static List<QueueSObject> testQueues = new List<QueueSObject>();
  125. private static List<GroupMember> testGroupMembers = new List<GroupMember>();
  126.  
  127. // -------- Set Ups --------
  128. // Test data prep
  129.  
  130. private static void initTestData(Integer testType)
  131. {
  132. if(testType == 0)
  133. {
  134. testUsers.add(UnitTestFactory.testUser('testLeadAssignment0@noemail.com', 'TestLastSystemAdmin0', 'System Administrator'));
  135. testUsers.add(UnitTestFactory.testUser('testLeadAssignment1@noemail.com', 'TestLastGroupOneUser1', 'EVRN Regional Director User'));
  136. testUsers.add(UnitTestFactory.testUser('testLeadAssignment2@noemail.com', 'TestLastGroupOneUser2', 'EVRN Regional Director User'));
  137. testUsers.add(UnitTestFactory.testUser('testLeadAssignment3@noemail.com', 'TestLastGroupTwoUser1', 'EVRN Regional Director User'));
  138. testUsers[1].FirstName = 'TestGroupOneUser';
  139. testUsers[2].FirstName = 'TestGroupOneUser';
  140. testUsers[3].FirstName = 'TestGroupTwoUser';
  141. insert testUsers;
  142.  
  143. testGroups.add(testGroup('QueueAssignmentOne', 'QueueAssignmentOneDN', 'Queue'));
  144. testGroups.add(testGroup('QueueAssignmentTwo', 'QueueAssignmentTwoDN', 'Queue'));
  145. insert testGroups;
  146.  
  147. testQueues.add(testQueue(testGroups[0].ID, 'Lead'));
  148. testQueues.add(testQueue(testGroups[1].ID, 'Lead'));
  149. insert testQueues;
  150.  
  151. testGroupMembers.add(testGroupMember(testGroups[0].ID, testUsers[1].ID));
  152. testGroupMembers.add(testGroupMember(testGroups[0].ID, testUsers[2].ID));
  153. testGroupMembers.add(testGroupMember(testGroups[1].ID, testUsers[3].ID));
  154. insert testGroupMembers;
  155.  
  156. }
  157. }
  158.  
  159. private static Group testGroup(String name, String developerName, String groupType)
  160. {
  161. Group result = new Group();
  162. result.Name = name;
  163. result.DeveloperName = developerName;
  164. result.Type = groupType;
  165.  
  166. return result;
  167. }
  168.  
  169. private static QueueSObject testQueue(ID groupID, String sObjectType)
  170. {
  171. QueueSObject result = new QueueSObject();
  172. result.QueueID = groupID;
  173. result.SObjectType = sObjectType;
  174.  
  175. return result;
  176. }
  177. private static GroupMember testGroupMember(ID groupID, ID UserOrGroupId)
  178. {
  179. GroupMember result = new GroupMember();
  180. result.GroupId = groupID;
  181. result.UserOrGroupId = UserOrGroupId;
  182.  
  183. return result;
  184. }
  185.  
  186. @isTest
  187. private static void testTwoQueuesTwoUsersLeadReassignment()
  188. {
  189.  
  190. initTestData(0);
  191.  
  192. Test.startTest();
  193.  
  194. System.runAs(testUsers[0])
  195. {
  196.  
  197. testLeads.add(UnitTestFactory.testLead(RecordTypeHelper.getRecordType('Lead', 'Home Owner').ID, 'TestAssignmentLead'));
  198. testLeads.add(UnitTestFactory.testLead(RecordTypeHelper.getRecordType('Lead', 'Home Owner').ID, 'TestAssignmentLead1'));
  199. testLeads[0].Company = 'TestAssignmentLead';
  200. testLeads[0].OwnerID = testGroups[0].ID;
  201. testLeads[1].Company = 'TestAssignmentLead1';
  202. testLeads[1].OwnerID = testGroups[1].ID;
  203. insert testLeads;
  204.  
  205.  
  206. LeadAssignment.AssignLeadActionRequest request = new LeadAssignment.AssignLeadActionRequest();
  207. request.queueIDs = new List<Id>{testGroups[0].ID, testGroups[1].ID};
  208. //request.leadID = new List<Id>{testLeads[0].ID, testLeads[1].ID};
  209. request.leadIDs = new List<Id>{testLeads[0].ID, testLeads[1].ID};
  210.  
  211. List<LeadAssignment.AssignLeadActionRequest> requests = new List<LeadAssignment.AssignLeadActionRequest>();
  212. requests.add(request);
  213.  
  214. List<LeadAssignment.AssignLeadActionResult> results = LeadAssignment.assignLeads(requests);
  215.  
  216. }
  217.  
  218. Test.stopTest();
  219.  
  220. List<Lead> leadList = [SELECT ID, OwnerID, Company, Owner_First_Name__c, LastName FROM Lead WHERE LastName LIKE 'TestAssignmentLead%' order by CreatedDate desc];
  221. System.Debug('leadList: ' + leadList);
  222.  
  223.  
  224. for (Lead singleLead : leadList)
  225. {
  226. if(singleLead.Company == 'TestAssignmentLead')
  227. {
  228. System.assertEquals('TestGroupOneUser', singleLead.Owner_First_Name__c);
  229. }
  230. else if(singleLead.Company == 'TestAssignmentLead1')
  231. {
  232. // System.assertEquals('TestGroupTwoUser', singleLead.Owner_First_Name__c);
  233. }
  234. else
  235. {
  236. System.assertEquals(true,false);
  237. }
  238. }
  239.  
  240. //System.assertEquals(testUsers[1].ID, leadList[0].OwnerID);
  241. //System.assertEquals(testUsers[3].ID, leadList[1].OwnerID);
  242. }
  243. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement