Tuesday, 5 December 2017

salesforce - trigger before update



Trigger Code:
==========

trigger UpdateClosedCaseTrigger on Case (before update) {
//before update 
    if(Trigger.isUpdate && Trigger.isBefore){
        UpdateClosedCase_Helper.updateCase(Trigger.new,Trigger.oldMap,Trigger.newMap);
    }
}


Helper Code:
==========

public class UpdateClosedCaseHelper {
    public static boolean skipSuperUserFilter = false;
    public static void updateCase(List<Case> newcaselist,Map<Id,Case> oldMap,Map<Id,Case> newMap){
        if(!skipSuperUserFilter){
            //get current user info
            User u=[SELECT Id,Support_Super_User__c From User WHERE Id=:UserInfo.getUserId()];
            Set<Id> caseIdset=new Set<Id>();
            Map<Id,case> junctionMap=new Map<Id,case>();
            //get all case id's
            for(Case cd:newcaselist){
                caseIdset.add(cd.Id);
                junctionMap.put(cd.Id,cd);
            }
            //query all child cases          
            for(Case c:[SELECT Id, status,(select Id,status from cases) FROM Case WHERE Id IN:caseIdset]){
                //check for value change
                if(oldMap.get(c.Id)!=newMap.get(c.Id)){
                    //case is not going to close
                    if(!newMap.get(c.Id).status.equals('Closed') &&
                      !newMap.get(c.Id).status.equals('Resolved')){
                        if(u.Support_Super_User__c){
                            //update case
                        }
                        else{
                            if(oldMap.get(c.Id).status.equals('Closed'))
                                c.addError('Please contact your Almac Super User to re-open closed cases');
                            else{
                                //update case
                            }
                        }                     
                    }else{
                        //closing or resolving case
                        if((newMap.get(c.Id).status.equals('Closed') || newMap.get(c.Id).status.equals('Resolved')) &&
                           !isAllchildsClosed(c.cases)){                     
                               if(u.Support_Super_User__c){
                                   //update case
                               }
                               else{
                                   if(oldMap.get(c.Id).status.equals('Closed'))
                                       c.addError('Please contact your Almac Super User to re-open closed cases');
                                   else{
                                       //update case
                                   }
                               }
                           }
                        else{
                            junctionMap.get(c.Id).addError('Please close all child cases before Closing/Resolving it');
                        }
                    }
                }
            } 
        }
    }
    public static boolean isAllchildsClosed(List<Case> childs){
        boolean flag=false;
        for(Case c:childs){
            if(!'Closed'.equals(c.Status)){
                flag=true;
                break;
            }
        }
        return flag;
    }
}



Notes:
=====
1.Records will be updated only if Trigger.new list is iterated in helper class. in below case the helper class must contain the below statements, no explicity update statement needed.

for(Case c:newcaselist){
      c.status='Closed';
}


2.Related fields like owner.name, account.name are not available in newcaselist, we need to query them in helper class and all other object fields are available to update in helper class.


 

No comments:

Post a Comment