-
ChatterFeed
-
0Best Answers
-
0Likes Received
-
0Likes Given
-
1Questions
-
1Replies
Testing the Accept Button
Hello,
I recently created a trigger on Case that updates a couple custom fields when the Case Owner changes. It works great, except when a User uses the Accept button to change the ownership from a Queue to their account. When this happens, the trigger executes twice. I need to catch this behavior and make sure the trigger logic only executes once, but I cannot figure out how to mimic the "Accept" button in my Apex Text Class.
There are two ways I hope this community could help me:
1) How can I get the Developer Console to generate logs based on my actions using clicks within SF, rather than just from running tests within the developer's console?
2) Or, how can I mimic the 'Accept' button in an Apex test?
Thank you!
-John Gorzynski
Trigger Code:
trigger CaseOwnerChangeEscalation on Case (after insert, before update) { //, before update /**************************** * Written by: John Gorzynski * June 04, 2015 * * This trigger looks at new and modified Cases and sets the GSCC_Queue__c field in order to track Escalations. * STEP 1) Determine if the Record Type is a Support Services Case, or if a change in Case Owner or Oracle_SR_Owner_Name__c has occurred. Only process these cases. * STEP 2) Process all Case changes, collect User and Group (Queue) IDs to find the correct value for GSCC_Queue__c * -) If Owner is Group, use Group.Name. If Owner is User, use User.GSCC_Queue__c, which is set by Formula Field on the Users table. * STEP 3) Once Cases have been updated, check if they moved from Tier 1 to Tier 2 or Tier 3. If so, increment Case.Escalation_Count__c * -) If an Escalation happened, add a Case Comment with the User who updated the ticket, regardless of queue, and what Tier change or Tier 3 group assignment occurred. * **************************/ /*** Step 1: Identify Support Services Cases where the Case Owner or Oracle_SR_Owner_Name__c has changed. Ignore all others.***/ System.debug('[Trigger Start]'); List<Case> caseList = new List<Case>(); List<Case> oldCases = new List<Case>(); List<Case> newCases = new List<Case>(); List<Group> groupList = new List<Group>(); List<User> userList = new List<User>(); Set<Id> ownerIds = new Set<Id>(); Set<Id> Tier3Ids = new Set<Id>(); Set<Id> rt = new Set<Id>(); if(Trigger.isInsert){ for(Case ci : [SELECT Id, OwnerId, Escalation_Count__c, Oracle_SR_Owner_Name__c, GSCC_Queue__c, RecordTypeId FROM Case WHERE ID IN :Trigger.New]) { newCases.add(ci); } } if(Trigger.isUpdate){ for(Case cu : Trigger.New) { newCases.add(cu); } } //Grab all Record Types that include Support Services in the Name field. Only run trigger on cases with these RecordTypeIds. for(RecordType rec : [Select Id, Name FROM RecordType WHERE Name LIKE '%Support Services%']) { rt.add(rec.Id); } //Filter cases by those with an owner change or Tier 3 change, but only for Support Services cases. for(Case c : newCases) { //Set beforeUpdate so Trigger.isInsert will avoid a Null Pointer exception. Case beforeUpdate = (Trigger.isUpdate) ? System.Trigger.oldMap.get(c.Id) : new Case(); String oldTier3 = (beforeUpdate.Oracle_SR_Owner_Name__c!=NULL) ? beforeUpdate.Oracle_SR_Owner_Name__c : ''; String newTier3 = (c.Oracle_SR_Owner_Name__c!=NULL) ? c.Oracle_SR_Owner_Name__c : ''; Boolean isOwnerChange = (beforeUpdate.OwnerID != c.OwnerID); //OwnerID Should never be null Boolean isTier3Change = (oldTier3 != newTier3); Boolean isTier3 = (c.Oracle_SR_Owner_Name__c!=NULL); //We only want Tier3 changes to trigger, but always use Tier 3 if set. Boolean isSupportRT = false; try{ String newRT = (c.RecordTypeId==NULL) ? '' : c.RecordTypeId; isSupportRT = rt.contains(newRT); //True if Record Type contains 'Support Services' } catch (Exception e) { isSupportRT = false; } //Throws a String Exception: Invalid ID if RecordTypeId is not set. System.debug('[Pre-Trigger] Old Trigger: GSCC_Queue__c:'+beforeUpdate.GSCC_Queue__c+' | OwnerID:'+beforeUpdate.OwnerID+' | Oracle_SR_Owner_Name__c:'+beforeUpdate.Oracle_SR_Owner_Name__c+' | Escalation_Count__C:'+beforeUpdate.Escalation_Count__C+' ||| New Trigger: GSCC_Queue__c:'+c.GSCC_Queue__c+' | OwnerID:'+c.OwnerID+' | Oracle_SR_Owner_Name__c:'+c.Oracle_SR_Owner_Name__c+' | Escalation_Count__C:'+c.Escalation_Count__C); if((Trigger.isInsert||isOwnerChange||isTier3Change)&&isSupportRT){ Decimal newEscalation = (c.Escalation_Count__c!=NULL) ? c.Escalation_Count__c : 0; c.Escalation_Count__c = newEscalation; System.debug('[Trig Test]: c.Escalation_Count__c:'+c.Escalation_Count__c+' newEscalation:'+newEscalation); caseList.add(c); if(!isTier3) ownerIds.add(c.ownerId); //We don't need OwnerID if Tier 3 is set if(isTier3) Tier3Ids.add(c.Id); oldCases.add(beforeUpdate); } if(!isSupportRT) System.debug('[Pre-Trigger] Case.RecordType does not include Support Services'); } System.debug('[Trig] caseList.size():'+caseList.size()+' = OwnerIDs:'+OwnerIds.size()+' + Tier3Ids:'+Tier3Ids.size()); /*** Step 2: For valid Case updates, determine what field changed and set GSCC_Queue__c: -) If new CaseOwner is a Queue, set to Group.name; -) If new CaseOwner is a User, set to User.GSCC_Queue__c (set by Formula Field on User object) -) If Oracle_SR_Owner_Name__c is set, ignore any CaseOwner change and use that value for Tier 3. ***/ if(caseList.size()>0){ System.debug('[Trig] Cases have recent updates, processing Trigger.'); for(Group g : [SELECT Id, Name FROM Group WHERE Id IN :ownerIds]){ if(g.Name==NULL) g.Name = ''; groupList.add(g); } System.debug('[Trig] groupList.size():'+groupList.size()); for(User u : [SELECT Id,Name,GSCC_Queue__c FROM User WHERE Id IN :ownerIds]){ if(u.GSCC_Queue__c==NULL) u.GSCC_Queue__c = ''; //Prevents Null Pointer Exception if GSCC_Queue__c is not set. userList.add(u); } System.debug('[Trig] userList.size():'+userList.size()); //If CaseOwner is a Queue, Assign Queue.Name to Case.GSCC_Queue__c for(Integer i = 0; i < caseList.size();i++){ if((caseList[i].OwnerId.getSobjectType() == Group.sobjecttype)&&!(Tier3Ids.contains(caseList[i].Id))){ for(Integer k=0; k < groupList.size();k++){ if(caseList[i].OwnerId == groupList[k].Id){ caseList[i].GSCC_Queue__c = groupList[k].Name; } } } //If CaseOwner is a User, Assign User.GSCC_Queue__c to Case.GSCC_Queue__c //User.GSCC_Queue__c is set manually per Agent in a Formula Field on the User table. if((caseList[i].OwnerId.getSobjectType() == User.sobjecttype)&&!(Tier3Ids.contains(caseList[i].Id))){ for(Integer m=0; m < userList.size(); m++){ if(caseList[i].OwnerId == userList[m].Id){ caseList[i].GSCC_Queue__c = userList[m].GSCC_Queue__c; } } } System.debug('[Trig: Assignment Complete] caseList['+i+']: Id:'+caseList[i].Id+' | GSCC_Queue__c:'+caseList[i].GSCC_Queue__c+' | Oracle_SR_Owner_Name__c:'+caseList[i].Oracle_SR_Owner_Name__c+' | Escalation_Count__c:'+caseList[i].Escalation_Count__c); if(caseList[i].Oracle_SR_Owner_Name__C!=NULL){ caseList[i].GSCC_Queue__c = (caseList[i].Oracle_SR_Owner_Name__c.contains('Tier 3')) ? caseList[i].Oracle_SR_Owner_Name__c : 'Tier 3 '+caseList[i].Oracle_SR_Owner_Name__c; } } //End for loops for setting c.GSCC_Queue__c /*** Step 3: If Tier level has increased, increment Case.Escalation_Count__c. and add a Case Comment***/ for(Integer j = 0; j < caseList.size();j++){ String oldQueue = (oldCases[j].GSCC_Queue__c!=NULL) ? oldCases[j].GSCC_Queue__c : '[No GSCC Tier Set]'; String newQueue = (caseList[j].GSCC_Queue__c!=NULL) ? caseList[j].GSCC_Queue__c : '[No GSCC Tier Set]'; datetime myDateTime = datetime.now(); //If GSCC_Queue__c has changed Tier, escalate the case and add a Case Comment if((oldQueue.contains('Tier 1')&&newQueue.contains('Tier 2'))|| (oldQueue.contains('Tier 2')&&newQueue.contains('Tier 3'))|| (oldQueue.contains('Tier 1')&&newQueue.contains('Tier 3'))|| (oldQueue=='[No GSCC Tier Set]'&&newQueue.contains('Tier 2'))|| (oldQueue=='[No GSCC Tier Set]'&&newQueue.contains('Tier 3'))) { caseList[j].Escalation_Count__c += 1; system.debug('[Trig] CaseList['+j+'] Escalated - Escalation_Count__c:'+caseList[j].Escalation_Count__c+', Id:'+ caseList[j].id); CaseComment com = new CaseComment(); TimeZone tz = UserInfo.getTimeZone(); String strConvertedDate = myDateTime.format('MMMM dd, yyyy hh:mm:ss a z', tz.getId()); com.ParentId = caseList[j].id; com.CommentBody = 'This case was escalated by '+ UserInfo.getName() +' from '+oldQueue+' to '+newQueue+' on '+strConvertedDate; system.debug('[Trig] Case Comment:'+com.CommentBody); Insert com; } } if(Trigger.isInsert) { update caseList; } } //End If: caseList.size()>0 or isInsert }
Test Code:
@isTest static void TestEscalationByOracleSRNameChange() { //Test Queues and Users have had their values chosen to run ten tests: //0) Tier 1 Nav (Tier3 set) -> Tier 2 Nav (Tier 3 No Change) Result: Escalation:1 Setting to Tier 2 should be ignored. //1) Tier 2 Nav -> Tier 2 Nav (Tier 3 set) Result: Escalation:2 Escalates on Insert to Tier 2 And when Tier 3 is set. //2) Tier 1 Ops (Tier3 set) -> Tier 1 Nav (Tier 3 Change) Result: Escalation:1 Changes within Tier 3 are not another Escalation. //3) Tier 2 Ops (Tier3 set) -> Tier 2 Nav (Tier 3 No Change) Result: Escalation:1 Setting to Tier 2 should be ignored. //4) Record Type set to Professional Services Result: No change //5) Professional Services w/ Tier 2 Owner + Tier 3 set Result: No change, but Oracle_SR_Owner_Name__c was still set. //Cases will first be assigned the the Queue List, and then updated to the Owner List to run these tests. List<Case> cList2 = new List<Case>(); List<ID> QownIDs = new ID[6]; List<ID> UownIDs = new ID[6]; List<QueueSobject> mappingObjects = new List<QueueSobject>(); RecordType rt = [Select Id from RecordType where Name = 'Support Services NAV Case' LIMIT 1]; RecordType rt2 = [Select Id from RecordType where Name = 'Professional Services Case' LIMIT 1]; List<Group> gList = new List<Group> { new Group(Name='Tier 1 GSCC NAV ',Type='Queue'), new Group(Name='Tier 2 GSCC NAV ',Type='Queue'), new Group(Name='Tier 1 GSCC OPS ',Type='Queue'), new Group(Name='Tier 2 GSCC OPS ',Type='Queue'), new Group(Name='Tier 1 GSCC NAV ',Type='Queue'), new Group(Name='Tier 2 GSCC NAV ',Type='Queue')}; //Insert Queues System.runAs(new User(Id = UserInfo.getUserId())) { insert gList; } for(Integer i=0; i < gList.size(); i++){ QueueSobject mapObj = new QueueSobject(QueueId = gList[i].Id, SobjectType = 'Case'); mappingObjects.add(mapObj); } //Insert Queue Relational Maps System.runAs(new User(Id = UserInfo.getUserId())) { insert mappingObjects; } List<User> uList = new List<User> { //createUser generates a User object with all required fields set. The first parameter gives unique names. The second parameter is set to GSCC_Queue__c. createUser(1,'Tier 2 GSCC NAV'), createUser(2,'Tier 2 GSCC NAV'), createUser(3,'Tier 1 GSCC NAV'), createUser(4,'Tier 2 GSCC NAV'), createUser(5,'Tier 1 GSCC NAV'), createUser(6,'Tier 2 GSCC NAV')}; System.runAs(new User(Id = UserInfo.getUserId())) { insert uList; } for(Integer k=0; k < gList.size(); k++){ QownIDs[k] = gList[k].ID; UownIDs[k] = uList[k].ID; } List<case> cList = new List<Case> { new Case(OwnerID=QownIDs[0],Subject='Testing Updates',RecordTypeId = rt.Id,Oracle_SR_Owner_Name__c='Tier 3 Group 1',Escalation_Count__c = NULL), new Case(OwnerID=QownIDs[1],Subject='Testing Updates',RecordTypeId = rt.Id,Escalation_Count__c = NULL), new Case(OwnerID=QownIDs[2],Subject='Testing Updates',RecordTypeId = rt.Id,Oracle_SR_Owner_Name__c='Tier 3 Group 1'',Escalation_Count__c = NULL), new Case(OwnerID=QownIDs[3],Subject='Testing Updates',RecordTypeId = rt.Id,Oracle_SR_Owner_Name__c='Tier 3 Group 1'',Escalation_Count__c = NULL), new Case(OwnerID=QownIDs[4],Subject='Testing Updates',RecordTypeId = rt2.Id,Escalation_Count__c = NULL), new Case(OwnerID=QownIDs[5],Subject='Testing Updates',RecordTypeId = rt2.Id,Escalation_Count__c = NULL)}; System.debug('pre-test cList[0].id:'+cList[0].Id+' - pre-test gList[0].id:'+gList[0].Id); System.debug('pre-test c[0]:'+cList[0]); System.debug('pre-test g[0]:'+gList[0]); System.debug('[TEST] After Insert Setup'); List<Database.SaveResult> srList = new List<Database.SaveResult>(); System.runAs(new User(Id = UserInfo.getUserId())) { srList = Database.insert(cList,false); } for (Database.SaveResult sr : srList){ if(sr.isSuccess()) { //Operation was Successful } else { //Operation failed, so get all errors for(Database.Error err : sr.getErrors()) { System.debug('Database Error:'+ err.getMessage()); System.debug('Fields that affected this error:'+ err.getFields()); } } } /*** afterInsert Tests *** * Trigger will execute twice due to also firing beforeUpdate, * but the second time should result in a caseList.size() of 0, causing the trigger to end before Steps 2 or 3.***/ List<Case> insertTest = new List<Case>(); for( Case ct : [SELECT Id,GSCC_Queue__c,Escalation_Count__c,Oracle_SR_Owner_Name__c FROM Case WHERE Id IN :cList]){ insertTest.add(ct); } System.assertEquals('Tier 3 Group 1', insertTest[0].GSCC_Queue__c); System.assertEquals('Tier 2 GSCC NAV', insertTest[1].GSCC_Queue__c); System.assertEquals('Tier 3 Group 1', insertTest[2].GSCC_Queue__c); System.assertEquals('Tier 3 Group 1', insertTest[3].GSCC_Queue__c); System.assertEquals(NULL, insertTest[4].GSCC_Queue__c); System.assertEquals(NULL, insertTest[5].GSCC_Queue__c); System.assertEquals(1, insertTest[0].Escalation_Count__c); System.assertEquals(1, insertTest[1].Escalation_Count__c); System.assertEquals(1, insertTest[2].Escalation_Count__c); System.assertEquals(1, insertTest[3].Escalation_Count__c); System.assertEquals(NULL, insertTest[4].Escalation_Count__c); System.assertEquals(NULL, insertTest[5].Escalation_Count__c); System.assertEquals('Tier 3 Group 1', insertTest[0].Oracle_SR_Owner_Name__c); System.assertEquals('Tier 3 Group 1', insertTest[2].Oracle_SR_Owner_Name__c); System.assertEquals('Tier 3 Group 1', insertTest[3].Oracle_SR_Owner_Name__c); /*** afterInsert Tests end ***/ Integer l=0; for(Case c2 : [SELECT Id, GSCC_Queue__c, Escalation_Count__c, OwnerId FROM Case WHERE Subject='Testing Updates']) { c2.OwnerID=UownIDs[l]; cList2.add(c2); l++; } cList2[1].Oracle_SR_Owner_Name__c='Tier 3 Group 2'; cList2[2].Oracle_SR_Owner_Name__c='Tier 3 Group 2'; cList2[5].Oracle_SR_Owner_Name__c='Tier 3 Group 2'; List<Database.SaveResult> srList2 = new List<Database.SaveResult>(); Test.startTest(); System.runAs(new User(Id = UserInfo.getUserId())) { srList2 = Database.Update(cList2,false); } Test.stopTest(); for (Database.SaveResult sr2 : srList2){ if(sr2.isSuccess()) { //Operation was Successful } else { //Operation failed, so get all errors for(Database.Error err2 : sr2.getErrors()) { System.debug('Database Error:'+ err2.getMessage()); System.debug('Fields that affected this error:'+ err2.getFields()); } } } System.debug('post-test c[0]:'+cList[0]); System.debug('post-test cList[0].Id:'+cList[0].Id); System.debug('post-test cList[0].GSCC_Queue__c:'+cList[0].GSCC_Queue__c); /*** beforeUpdate Tests *** * Trigger executes a third time for beforeUpdate ***/ List<Case> updateTest = new List<Case>(); for( Case ct2 : [SELECT Id,GSCC_Queue__c,Escalation_Count__c,Oracle_SR_Owner_Name__c FROM Case WHERE Id IN :cList2]){ updateTest.add(ct2); } //0) Tier 1 Nav (Tier3 set) -> Tier 2 Nav (Tier 3 No Change) Result: Escalation:1 Setting to Tier 2 should be ignored. //1) Tier 2 Nav -> Tier 2 Nav (Tier 3 set) Result: Escalation:2 Escalates on Insert to Tier 2 And when Tier 3 is set. //2) Tier 1 Ops (Tier3 set) -> Tier 1 Nav (Tier 3 Change) Result: Escalation:1 Changes within Tier 3 are not another Escalation. //3) Tier 2 Ops (Tier3 set) -> Tier 2 Nav (Tier 3 No Change) Result: Escalation:1 Setting to Tier 2 should be ignored. //4) Record Type set to Professional Services Result: No change //5) Professional Services w/ Tier 2 Owner + Tier 3 set Result: No change, but Oracle_SR_Owner_Name__c was still set. System.assertEquals('Tier 3 Group 1', updateTest[0].GSCC_Queue__c); System.assertEquals('Tier 3 Group 2', updateTest[1].GSCC_Queue__c); System.assertEquals('Tier 3 Group 2', updateTest[2].GSCC_Queue__c); System.assertEquals('Tier 3 Group 1', updateTest[3].GSCC_Queue__c); System.assertEquals(NULL, updateTest[4].GSCC_Queue__c); System.assertEquals(NULL, updateTest[5].GSCC_Queue__c); System.assertEquals(1, updateTest[0].Escalation_Count__c); System.assertEquals(2, updateTest[1].Escalation_Count__c); System.assertEquals(1, updateTest[2].Escalation_Count__c); System.assertEquals(1, updateTest[3].Escalation_Count__c); System.assertEquals(NULL, updateTest[4].Escalation_Count__c); System.assertEquals(NULL, updateTest[5].Escalation_Count__c); System.assertEquals('Tier 3 Group 1', updateTest[0].Oracle_SR_Owner_Name__c); System.assertEquals('Tier 3 Group 2', updateTest[1].Oracle_SR_Owner_Name__c); System.assertEquals('Tier 3 Group 2', updateTest[2].Oracle_SR_Owner_Name__c); System.assertEquals('Tier 3 Group 1', updateTest[3].Oracle_SR_Owner_Name__c); System.assertEquals(NULL, updateTest[4].Oracle_SR_Owner_Name__c); System.assertEquals('Tier 3 Group 2', updateTest[5].Oracle_SR_Owner_Name__c); /*** beforeUpdate Tests end ***/ }
- John Gorzynski 1
- June 22, 2015
- Like
- 0
Testing the Accept Button
Hello,
I recently created a trigger on Case that updates a couple custom fields when the Case Owner changes. It works great, except when a User uses the Accept button to change the ownership from a Queue to their account. When this happens, the trigger executes twice. I need to catch this behavior and make sure the trigger logic only executes once, but I cannot figure out how to mimic the "Accept" button in my Apex Text Class.
There are two ways I hope this community could help me:
1) How can I get the Developer Console to generate logs based on my actions using clicks within SF, rather than just from running tests within the developer's console?
2) Or, how can I mimic the 'Accept' button in an Apex test?
Thank you!
-John Gorzynski
Trigger Code:
trigger CaseOwnerChangeEscalation on Case (after insert, before update) { //, before update /**************************** * Written by: John Gorzynski * June 04, 2015 * * This trigger looks at new and modified Cases and sets the GSCC_Queue__c field in order to track Escalations. * STEP 1) Determine if the Record Type is a Support Services Case, or if a change in Case Owner or Oracle_SR_Owner_Name__c has occurred. Only process these cases. * STEP 2) Process all Case changes, collect User and Group (Queue) IDs to find the correct value for GSCC_Queue__c * -) If Owner is Group, use Group.Name. If Owner is User, use User.GSCC_Queue__c, which is set by Formula Field on the Users table. * STEP 3) Once Cases have been updated, check if they moved from Tier 1 to Tier 2 or Tier 3. If so, increment Case.Escalation_Count__c * -) If an Escalation happened, add a Case Comment with the User who updated the ticket, regardless of queue, and what Tier change or Tier 3 group assignment occurred. * **************************/ /*** Step 1: Identify Support Services Cases where the Case Owner or Oracle_SR_Owner_Name__c has changed. Ignore all others.***/ System.debug('[Trigger Start]'); List<Case> caseList = new List<Case>(); List<Case> oldCases = new List<Case>(); List<Case> newCases = new List<Case>(); List<Group> groupList = new List<Group>(); List<User> userList = new List<User>(); Set<Id> ownerIds = new Set<Id>(); Set<Id> Tier3Ids = new Set<Id>(); Set<Id> rt = new Set<Id>(); if(Trigger.isInsert){ for(Case ci : [SELECT Id, OwnerId, Escalation_Count__c, Oracle_SR_Owner_Name__c, GSCC_Queue__c, RecordTypeId FROM Case WHERE ID IN :Trigger.New]) { newCases.add(ci); } } if(Trigger.isUpdate){ for(Case cu : Trigger.New) { newCases.add(cu); } } //Grab all Record Types that include Support Services in the Name field. Only run trigger on cases with these RecordTypeIds. for(RecordType rec : [Select Id, Name FROM RecordType WHERE Name LIKE '%Support Services%']) { rt.add(rec.Id); } //Filter cases by those with an owner change or Tier 3 change, but only for Support Services cases. for(Case c : newCases) { //Set beforeUpdate so Trigger.isInsert will avoid a Null Pointer exception. Case beforeUpdate = (Trigger.isUpdate) ? System.Trigger.oldMap.get(c.Id) : new Case(); String oldTier3 = (beforeUpdate.Oracle_SR_Owner_Name__c!=NULL) ? beforeUpdate.Oracle_SR_Owner_Name__c : ''; String newTier3 = (c.Oracle_SR_Owner_Name__c!=NULL) ? c.Oracle_SR_Owner_Name__c : ''; Boolean isOwnerChange = (beforeUpdate.OwnerID != c.OwnerID); //OwnerID Should never be null Boolean isTier3Change = (oldTier3 != newTier3); Boolean isTier3 = (c.Oracle_SR_Owner_Name__c!=NULL); //We only want Tier3 changes to trigger, but always use Tier 3 if set. Boolean isSupportRT = false; try{ String newRT = (c.RecordTypeId==NULL) ? '' : c.RecordTypeId; isSupportRT = rt.contains(newRT); //True if Record Type contains 'Support Services' } catch (Exception e) { isSupportRT = false; } //Throws a String Exception: Invalid ID if RecordTypeId is not set. System.debug('[Pre-Trigger] Old Trigger: GSCC_Queue__c:'+beforeUpdate.GSCC_Queue__c+' | OwnerID:'+beforeUpdate.OwnerID+' | Oracle_SR_Owner_Name__c:'+beforeUpdate.Oracle_SR_Owner_Name__c+' | Escalation_Count__C:'+beforeUpdate.Escalation_Count__C+' ||| New Trigger: GSCC_Queue__c:'+c.GSCC_Queue__c+' | OwnerID:'+c.OwnerID+' | Oracle_SR_Owner_Name__c:'+c.Oracle_SR_Owner_Name__c+' | Escalation_Count__C:'+c.Escalation_Count__C); if((Trigger.isInsert||isOwnerChange||isTier3Change)&&isSupportRT){ Decimal newEscalation = (c.Escalation_Count__c!=NULL) ? c.Escalation_Count__c : 0; c.Escalation_Count__c = newEscalation; System.debug('[Trig Test]: c.Escalation_Count__c:'+c.Escalation_Count__c+' newEscalation:'+newEscalation); caseList.add(c); if(!isTier3) ownerIds.add(c.ownerId); //We don't need OwnerID if Tier 3 is set if(isTier3) Tier3Ids.add(c.Id); oldCases.add(beforeUpdate); } if(!isSupportRT) System.debug('[Pre-Trigger] Case.RecordType does not include Support Services'); } System.debug('[Trig] caseList.size():'+caseList.size()+' = OwnerIDs:'+OwnerIds.size()+' + Tier3Ids:'+Tier3Ids.size()); /*** Step 2: For valid Case updates, determine what field changed and set GSCC_Queue__c: -) If new CaseOwner is a Queue, set to Group.name; -) If new CaseOwner is a User, set to User.GSCC_Queue__c (set by Formula Field on User object) -) If Oracle_SR_Owner_Name__c is set, ignore any CaseOwner change and use that value for Tier 3. ***/ if(caseList.size()>0){ System.debug('[Trig] Cases have recent updates, processing Trigger.'); for(Group g : [SELECT Id, Name FROM Group WHERE Id IN :ownerIds]){ if(g.Name==NULL) g.Name = ''; groupList.add(g); } System.debug('[Trig] groupList.size():'+groupList.size()); for(User u : [SELECT Id,Name,GSCC_Queue__c FROM User WHERE Id IN :ownerIds]){ if(u.GSCC_Queue__c==NULL) u.GSCC_Queue__c = ''; //Prevents Null Pointer Exception if GSCC_Queue__c is not set. userList.add(u); } System.debug('[Trig] userList.size():'+userList.size()); //If CaseOwner is a Queue, Assign Queue.Name to Case.GSCC_Queue__c for(Integer i = 0; i < caseList.size();i++){ if((caseList[i].OwnerId.getSobjectType() == Group.sobjecttype)&&!(Tier3Ids.contains(caseList[i].Id))){ for(Integer k=0; k < groupList.size();k++){ if(caseList[i].OwnerId == groupList[k].Id){ caseList[i].GSCC_Queue__c = groupList[k].Name; } } } //If CaseOwner is a User, Assign User.GSCC_Queue__c to Case.GSCC_Queue__c //User.GSCC_Queue__c is set manually per Agent in a Formula Field on the User table. if((caseList[i].OwnerId.getSobjectType() == User.sobjecttype)&&!(Tier3Ids.contains(caseList[i].Id))){ for(Integer m=0; m < userList.size(); m++){ if(caseList[i].OwnerId == userList[m].Id){ caseList[i].GSCC_Queue__c = userList[m].GSCC_Queue__c; } } } System.debug('[Trig: Assignment Complete] caseList['+i+']: Id:'+caseList[i].Id+' | GSCC_Queue__c:'+caseList[i].GSCC_Queue__c+' | Oracle_SR_Owner_Name__c:'+caseList[i].Oracle_SR_Owner_Name__c+' | Escalation_Count__c:'+caseList[i].Escalation_Count__c); if(caseList[i].Oracle_SR_Owner_Name__C!=NULL){ caseList[i].GSCC_Queue__c = (caseList[i].Oracle_SR_Owner_Name__c.contains('Tier 3')) ? caseList[i].Oracle_SR_Owner_Name__c : 'Tier 3 '+caseList[i].Oracle_SR_Owner_Name__c; } } //End for loops for setting c.GSCC_Queue__c /*** Step 3: If Tier level has increased, increment Case.Escalation_Count__c. and add a Case Comment***/ for(Integer j = 0; j < caseList.size();j++){ String oldQueue = (oldCases[j].GSCC_Queue__c!=NULL) ? oldCases[j].GSCC_Queue__c : '[No GSCC Tier Set]'; String newQueue = (caseList[j].GSCC_Queue__c!=NULL) ? caseList[j].GSCC_Queue__c : '[No GSCC Tier Set]'; datetime myDateTime = datetime.now(); //If GSCC_Queue__c has changed Tier, escalate the case and add a Case Comment if((oldQueue.contains('Tier 1')&&newQueue.contains('Tier 2'))|| (oldQueue.contains('Tier 2')&&newQueue.contains('Tier 3'))|| (oldQueue.contains('Tier 1')&&newQueue.contains('Tier 3'))|| (oldQueue=='[No GSCC Tier Set]'&&newQueue.contains('Tier 2'))|| (oldQueue=='[No GSCC Tier Set]'&&newQueue.contains('Tier 3'))) { caseList[j].Escalation_Count__c += 1; system.debug('[Trig] CaseList['+j+'] Escalated - Escalation_Count__c:'+caseList[j].Escalation_Count__c+', Id:'+ caseList[j].id); CaseComment com = new CaseComment(); TimeZone tz = UserInfo.getTimeZone(); String strConvertedDate = myDateTime.format('MMMM dd, yyyy hh:mm:ss a z', tz.getId()); com.ParentId = caseList[j].id; com.CommentBody = 'This case was escalated by '+ UserInfo.getName() +' from '+oldQueue+' to '+newQueue+' on '+strConvertedDate; system.debug('[Trig] Case Comment:'+com.CommentBody); Insert com; } } if(Trigger.isInsert) { update caseList; } } //End If: caseList.size()>0 or isInsert }
Test Code:
@isTest static void TestEscalationByOracleSRNameChange() { //Test Queues and Users have had their values chosen to run ten tests: //0) Tier 1 Nav (Tier3 set) -> Tier 2 Nav (Tier 3 No Change) Result: Escalation:1 Setting to Tier 2 should be ignored. //1) Tier 2 Nav -> Tier 2 Nav (Tier 3 set) Result: Escalation:2 Escalates on Insert to Tier 2 And when Tier 3 is set. //2) Tier 1 Ops (Tier3 set) -> Tier 1 Nav (Tier 3 Change) Result: Escalation:1 Changes within Tier 3 are not another Escalation. //3) Tier 2 Ops (Tier3 set) -> Tier 2 Nav (Tier 3 No Change) Result: Escalation:1 Setting to Tier 2 should be ignored. //4) Record Type set to Professional Services Result: No change //5) Professional Services w/ Tier 2 Owner + Tier 3 set Result: No change, but Oracle_SR_Owner_Name__c was still set. //Cases will first be assigned the the Queue List, and then updated to the Owner List to run these tests. List<Case> cList2 = new List<Case>(); List<ID> QownIDs = new ID[6]; List<ID> UownIDs = new ID[6]; List<QueueSobject> mappingObjects = new List<QueueSobject>(); RecordType rt = [Select Id from RecordType where Name = 'Support Services NAV Case' LIMIT 1]; RecordType rt2 = [Select Id from RecordType where Name = 'Professional Services Case' LIMIT 1]; List<Group> gList = new List<Group> { new Group(Name='Tier 1 GSCC NAV ',Type='Queue'), new Group(Name='Tier 2 GSCC NAV ',Type='Queue'), new Group(Name='Tier 1 GSCC OPS ',Type='Queue'), new Group(Name='Tier 2 GSCC OPS ',Type='Queue'), new Group(Name='Tier 1 GSCC NAV ',Type='Queue'), new Group(Name='Tier 2 GSCC NAV ',Type='Queue')}; //Insert Queues System.runAs(new User(Id = UserInfo.getUserId())) { insert gList; } for(Integer i=0; i < gList.size(); i++){ QueueSobject mapObj = new QueueSobject(QueueId = gList[i].Id, SobjectType = 'Case'); mappingObjects.add(mapObj); } //Insert Queue Relational Maps System.runAs(new User(Id = UserInfo.getUserId())) { insert mappingObjects; } List<User> uList = new List<User> { //createUser generates a User object with all required fields set. The first parameter gives unique names. The second parameter is set to GSCC_Queue__c. createUser(1,'Tier 2 GSCC NAV'), createUser(2,'Tier 2 GSCC NAV'), createUser(3,'Tier 1 GSCC NAV'), createUser(4,'Tier 2 GSCC NAV'), createUser(5,'Tier 1 GSCC NAV'), createUser(6,'Tier 2 GSCC NAV')}; System.runAs(new User(Id = UserInfo.getUserId())) { insert uList; } for(Integer k=0; k < gList.size(); k++){ QownIDs[k] = gList[k].ID; UownIDs[k] = uList[k].ID; } List<case> cList = new List<Case> { new Case(OwnerID=QownIDs[0],Subject='Testing Updates',RecordTypeId = rt.Id,Oracle_SR_Owner_Name__c='Tier 3 Group 1',Escalation_Count__c = NULL), new Case(OwnerID=QownIDs[1],Subject='Testing Updates',RecordTypeId = rt.Id,Escalation_Count__c = NULL), new Case(OwnerID=QownIDs[2],Subject='Testing Updates',RecordTypeId = rt.Id,Oracle_SR_Owner_Name__c='Tier 3 Group 1'',Escalation_Count__c = NULL), new Case(OwnerID=QownIDs[3],Subject='Testing Updates',RecordTypeId = rt.Id,Oracle_SR_Owner_Name__c='Tier 3 Group 1'',Escalation_Count__c = NULL), new Case(OwnerID=QownIDs[4],Subject='Testing Updates',RecordTypeId = rt2.Id,Escalation_Count__c = NULL), new Case(OwnerID=QownIDs[5],Subject='Testing Updates',RecordTypeId = rt2.Id,Escalation_Count__c = NULL)}; System.debug('pre-test cList[0].id:'+cList[0].Id+' - pre-test gList[0].id:'+gList[0].Id); System.debug('pre-test c[0]:'+cList[0]); System.debug('pre-test g[0]:'+gList[0]); System.debug('[TEST] After Insert Setup'); List<Database.SaveResult> srList = new List<Database.SaveResult>(); System.runAs(new User(Id = UserInfo.getUserId())) { srList = Database.insert(cList,false); } for (Database.SaveResult sr : srList){ if(sr.isSuccess()) { //Operation was Successful } else { //Operation failed, so get all errors for(Database.Error err : sr.getErrors()) { System.debug('Database Error:'+ err.getMessage()); System.debug('Fields that affected this error:'+ err.getFields()); } } } /*** afterInsert Tests *** * Trigger will execute twice due to also firing beforeUpdate, * but the second time should result in a caseList.size() of 0, causing the trigger to end before Steps 2 or 3.***/ List<Case> insertTest = new List<Case>(); for( Case ct : [SELECT Id,GSCC_Queue__c,Escalation_Count__c,Oracle_SR_Owner_Name__c FROM Case WHERE Id IN :cList]){ insertTest.add(ct); } System.assertEquals('Tier 3 Group 1', insertTest[0].GSCC_Queue__c); System.assertEquals('Tier 2 GSCC NAV', insertTest[1].GSCC_Queue__c); System.assertEquals('Tier 3 Group 1', insertTest[2].GSCC_Queue__c); System.assertEquals('Tier 3 Group 1', insertTest[3].GSCC_Queue__c); System.assertEquals(NULL, insertTest[4].GSCC_Queue__c); System.assertEquals(NULL, insertTest[5].GSCC_Queue__c); System.assertEquals(1, insertTest[0].Escalation_Count__c); System.assertEquals(1, insertTest[1].Escalation_Count__c); System.assertEquals(1, insertTest[2].Escalation_Count__c); System.assertEquals(1, insertTest[3].Escalation_Count__c); System.assertEquals(NULL, insertTest[4].Escalation_Count__c); System.assertEquals(NULL, insertTest[5].Escalation_Count__c); System.assertEquals('Tier 3 Group 1', insertTest[0].Oracle_SR_Owner_Name__c); System.assertEquals('Tier 3 Group 1', insertTest[2].Oracle_SR_Owner_Name__c); System.assertEquals('Tier 3 Group 1', insertTest[3].Oracle_SR_Owner_Name__c); /*** afterInsert Tests end ***/ Integer l=0; for(Case c2 : [SELECT Id, GSCC_Queue__c, Escalation_Count__c, OwnerId FROM Case WHERE Subject='Testing Updates']) { c2.OwnerID=UownIDs[l]; cList2.add(c2); l++; } cList2[1].Oracle_SR_Owner_Name__c='Tier 3 Group 2'; cList2[2].Oracle_SR_Owner_Name__c='Tier 3 Group 2'; cList2[5].Oracle_SR_Owner_Name__c='Tier 3 Group 2'; List<Database.SaveResult> srList2 = new List<Database.SaveResult>(); Test.startTest(); System.runAs(new User(Id = UserInfo.getUserId())) { srList2 = Database.Update(cList2,false); } Test.stopTest(); for (Database.SaveResult sr2 : srList2){ if(sr2.isSuccess()) { //Operation was Successful } else { //Operation failed, so get all errors for(Database.Error err2 : sr2.getErrors()) { System.debug('Database Error:'+ err2.getMessage()); System.debug('Fields that affected this error:'+ err2.getFields()); } } } System.debug('post-test c[0]:'+cList[0]); System.debug('post-test cList[0].Id:'+cList[0].Id); System.debug('post-test cList[0].GSCC_Queue__c:'+cList[0].GSCC_Queue__c); /*** beforeUpdate Tests *** * Trigger executes a third time for beforeUpdate ***/ List<Case> updateTest = new List<Case>(); for( Case ct2 : [SELECT Id,GSCC_Queue__c,Escalation_Count__c,Oracle_SR_Owner_Name__c FROM Case WHERE Id IN :cList2]){ updateTest.add(ct2); } //0) Tier 1 Nav (Tier3 set) -> Tier 2 Nav (Tier 3 No Change) Result: Escalation:1 Setting to Tier 2 should be ignored. //1) Tier 2 Nav -> Tier 2 Nav (Tier 3 set) Result: Escalation:2 Escalates on Insert to Tier 2 And when Tier 3 is set. //2) Tier 1 Ops (Tier3 set) -> Tier 1 Nav (Tier 3 Change) Result: Escalation:1 Changes within Tier 3 are not another Escalation. //3) Tier 2 Ops (Tier3 set) -> Tier 2 Nav (Tier 3 No Change) Result: Escalation:1 Setting to Tier 2 should be ignored. //4) Record Type set to Professional Services Result: No change //5) Professional Services w/ Tier 2 Owner + Tier 3 set Result: No change, but Oracle_SR_Owner_Name__c was still set. System.assertEquals('Tier 3 Group 1', updateTest[0].GSCC_Queue__c); System.assertEquals('Tier 3 Group 2', updateTest[1].GSCC_Queue__c); System.assertEquals('Tier 3 Group 2', updateTest[2].GSCC_Queue__c); System.assertEquals('Tier 3 Group 1', updateTest[3].GSCC_Queue__c); System.assertEquals(NULL, updateTest[4].GSCC_Queue__c); System.assertEquals(NULL, updateTest[5].GSCC_Queue__c); System.assertEquals(1, updateTest[0].Escalation_Count__c); System.assertEquals(2, updateTest[1].Escalation_Count__c); System.assertEquals(1, updateTest[2].Escalation_Count__c); System.assertEquals(1, updateTest[3].Escalation_Count__c); System.assertEquals(NULL, updateTest[4].Escalation_Count__c); System.assertEquals(NULL, updateTest[5].Escalation_Count__c); System.assertEquals('Tier 3 Group 1', updateTest[0].Oracle_SR_Owner_Name__c); System.assertEquals('Tier 3 Group 2', updateTest[1].Oracle_SR_Owner_Name__c); System.assertEquals('Tier 3 Group 2', updateTest[2].Oracle_SR_Owner_Name__c); System.assertEquals('Tier 3 Group 1', updateTest[3].Oracle_SR_Owner_Name__c); System.assertEquals(NULL, updateTest[4].Oracle_SR_Owner_Name__c); System.assertEquals('Tier 3 Group 2', updateTest[5].Oracle_SR_Owner_Name__c); /*** beforeUpdate Tests end ***/ }
- John Gorzynski 1
- June 22, 2015
- Like
- 0