function readOnly(count){ }
Starting November 20, the site will be set to read-only. On December 4, 2023,
forum discussions will move to the Trailblazer Community.
+ Start a Discussion
ChanBasha skChanBasha sk 

Trigger as Apex class?

Hi,

    How to write the trigger in apex class ?

    trigger UpdatedCaseUserTrigger on Case (before insert,before update) {

   List<ID> cIds = new List<ID>();
       
    List<Case_User__c> cuser = New  List<Case_User__c>();
    Map<ID, Case_User__c> cusermap = new Map<ID, Case_User__c>();

    Set<String> skillSet = new Set<String>();
    List<String> skillSetList = new List<String>();
    
    for(Case c : Trigger.new){
        
        if(c.Status == 'New') {
            cIds.add(c.Id); //add case ids.
        }     
        skillSet.add(c.CaseRelatedTo__c);
     }   
     skillSetList.addAll(skillSet);    
        
         //available users               
         List<Case> cases = Trigger.new;
         List<Case_User__c> availableCaseUsers = [SELECT AvailableUsers__c, Timings__c, SkillSet__c FROM Case_User__c where Availability__c = TRUE ORDER BY Last_Case_Allocated_Time__c ASC];
         //List<Case_User__c> availableCaseUsers = Database.query(queryString);
         integer i=0;
         integer nomatchingSkillset = availableCaseUsers.size();
         for(Case c: cases){
             for(; i<=availableCaseUsers.size();i++){
                if(availableCaseUsers.get(i).SkillSet__c.contains(c.CaseRelatedTo__c)){
                  c.OwnerId = availableCaseUsers.get(i).AvailableUsers__c;
                  availableCaseUsers.get(i).Last_Case_Allocated_Time__c = DateTime.now();
                  cusermap.put(availableCaseUsers.get(i).id, availableCaseUsers.get(i));
                } else {
                      nomatchingSkillset--;
                      if(nomatchingSkillset == 0){
                          //TODO assign to case queue
                          
                           User u =[SELECT Email FROM User WHERE Id IN (SELECT UserOrGroupId FROM GroupMember WHERE Group.DeveloperName ='CaseQueue')];
                            String us = u.Email;
                                                  
                              Messaging.SingleEmailMessage mail = new Messaging.SingleEmailMessage();
                              String[] toAddresses = new String[] {us};
                              mail.setToAddresses(toAddresses );
                              mail.setSubject('No Users available to handle this case');
                              mail.plainTextBody='handle this case';
                              Messaging.SendEmail(new Messaging.SingleEmailMessage[] {mail});
                                                  
                          break;
                      }
                      continue;
                }
                if(i>=availableCaseUsers.size()){
                    i=0;
                }
                break;
             }      
         }
        
      
 
     if(!cusermap.isEmpty()) {
      update cusermap.values();
     }
        
   
   }

Could anyone help me to convert 

Thanks
sagarika bsagarika b
Hi ChanBasha,
  • IF You want to extract all logic from your trigger and put it in a helper class. This way, you can create one trigger per object and have a good overview of which object triggers what logic.
  • First, you create your helper class with the logic from your trigger:
  • public with sharing class CaseTriggerHelper {
    
        public static void updateCaseStage(List<Case> cases) {
            
                 List<Case_User__c> cuser = New  List<Case_User__c>();
                 Map<ID, Case_User__c> cusermap = new Map<ID, Case_User__c>();
    
                 Set<String> skillSet = new Set<String>();
                 List<String> skillSetList = new List<String>();
        
                 for(Case c: cases){
            
                       if(c.Status == 'New') {
                       cIds.add(c.Id); //add case ids.
                       }     
                       skillSet.add(c.CaseRelatedTo__c);
                 }   
               skillSetList.addAll(skillSet);    
            
             //available users               
             
                List<Case_User__c> availableCaseUsers = [SELECT AvailableUsers__c, Timings__c, SkillSet__c       FROM Case_User__c where Availability__c = TRUE ORDER BY Last_Case_Allocated_Time__c ASC];
             //List<Case_User__c> availableCaseUsers = Database.query(queryString);
                integer i=0;
                integer nomatchingSkillset = availableCaseUsers.size();
                for(Case c: cases){
                    for(; i<=availableCaseUsers.size();i++){
                    if(availableCaseUsers.get(i).SkillSet__c.contains(c.CaseRelatedTo__c)){
                      c.OwnerId = availableCaseUsers.get(i).AvailableUsers__c;
                      availableCaseUsers.get(i).Last_Case_Allocated_Time__c = DateTime.now();
                      cusermap.put(availableCaseUsers.get(i).id, availableCaseUsers.get(i));
                     } else {
                          nomatchingSkillset--;
                          if(nomatchingSkillset == 0){
                              //TODO assign to case queue
                              
                                 User u =[SELECT Email FROM User WHERE Id IN (SELECT UserOrGroupId FROM GroupMember WHERE Group.DeveloperName ='CaseQueue')];
                                 String us = u.Email;
                                                      
                                  Messaging.SingleEmailMessage mail = new Messaging.SingleEmailMessage();
                                  String[] toAddresses = new String[] {us};
                                  mail.setToAddresses(toAddresses );
                                  mail.setSubject('No Users available to handle this case');
                                  mail.plainTextBody='handle this case';
                                  Messaging.SendEmail(new Messaging.SingleEmailMessage[] {mail});
                                                      
                              break;
                          }
                          continue;
                    }
                    if(i>=availableCaseUsers.size()){
                        i=0;
                    }
                    break;
                 }      
             }
            
          
     
         if(!cusermap.isEmpty()) {
          update cusermap.values();
         }
    
            
       }
    }
    ​}
    
 
  • Then, you create one single Trigger for your Case object, using the trigger variables to define which methods run for which context:
    trigger CaseTrigger on Case(before insert, after insert, before update, after update, before delete, after delete, after undelete){
        if(Trigger.isUpdate && Trigger.isAfter){
            CaseTriggerHelper.updateCaseStage(Trigger.new);
        }
    }

If you want more example about conversion, please refer below link once
https://developer.salesforce.com/forums/?id=906F0000000A1lmIAC

We hope it will be helpful to you.

BestRegrads 
Sagarika
chanbasha nbskchanbasha nbsk
could anyone please update the Test class for the above apex class