+ Start a Discussion
dhruv aroradhruv arora 

Test class for particular profiles that update the count on a field whenever new task is inserted.

Hello,
i have a trigger which calls a handler which further calls a helper. What it basically does is update a field on lead and contact whenever a new task is inserted or updated on lead and contact object.
Also this trigger only works for two specific profiles that i have stored in a custom label.
Code is below:

Trigger: TaskUpdate


trigger TaskUpdateTrigger on Task (after insert,after update) {  
    if(Trigger.isAfter)
    {
        if(Label.TaskTriggerSFDCUse.contains(UserInfo.getProfileId())){
            if(Trigger.isInsert) {
                TaskTriggerHandler.afterInsertHandler(Trigger.new);
            }
            if(Trigger.isUpdate) {
                TaskTriggerHandler.afterUpdateHandler(Trigger.new, Trigger.oldMap);
            }
        }
    }
    
}


TaskTriggerHandler:

public class TaskTriggerHandler{
     public static void afterInsertHandler(List<Task> newList){
        Set<Id> LeadIds = new Set<Id>();
        Map<Id,Lead> callMadeInfoLdIds = new Map<Id,Lead>();
        for (Task each : newList){            
            // call this to fill collections to be used for processing
            TaskTriggerHelper.collectionGenAfterInsert(each,leadIds,callMadeInfoLdIds);  
        } 
         system.debug(LeadIds);
         system.debug(callMadeInfoLdIds);
        if(!LeadIds.isEmpty() || !callMadeInfoLdIds.isEmpty()) TaskTriggerHelper.leadUpdateHandler(leadIds,callMadeInfoLdIds);
    }
    
     public static void afterUpdateHandler(List<Task> newList, Map<Id,Task> oldMap){
         Set<Id> leadIds = new Set<Id>();
         Map<Id,Lead> callMadeInfoLdIds = new Map<Id,Lead>();
         for (Task each : newList){            
            // call this to fill collections to be used for processing
            TaskTriggerHelper.collectionGenAfterUpdate(each,oldMap.get(each.Id),LeadIds,callMadeInfoLdIds);  
        }
        if(!LeadIds.isEmpty() || !callMadeInfoLdIds.isEmpty()) TaskTriggerHelper.leadUpdateHandler(leadIds,callMadeInfoLdIds);
     }
     
}

TaskTriggerHelper:

public class TaskTriggerHelper{
    
    public static void collectionGenAfterInsert(Task t,Set<Id> leadIds,Map<Id,Lead> callMadeInfoLdIds){
        if(t.whoId != null && ((''+t.whoId).startsWith('00Q') || (''+t.whoId).startsWith('003'))){
            system.debug('abcd'+t.whoId);
            if(String.isNotBlank(t.Subject)){
                if(isTaskQualified(t, null)){
                    leadIds.add(t.whoId);
                }
            }
            if(t.Call_Made__c && t.Call_Back_Date_Time__c != null && (''+t.whoId).startsWith('00Q')) {
                Lead ld = new Lead();
                ld.Call_Made__c = true;
                ld.Call_Back_Date_Time__c = t.Call_Back_Date_Time__c;
                callMadeInfoLdIds.put(t.whoId, ld);  
            }  
        }
    }
    
    public static void collectionGenAfterUpdate(Task newTask,Task oldTask,Set<Id> leadIds,Map<Id,Lead> callMadeInfoLdIds){
            if(newTask.whoId != null && (''+newTask.whoId).startsWith('00Q')){
                if(String.isNotBlank(newTask.Subject)){
                    if(!isTaskQualified(newTask, oldTask)){
                        leadIds.add(newTask.whoId);
                        system.debug('lead id is:' + leadIds);
                    }
                }

                if(newTask.Call_Made__c && newTask.Call_Back_Date_Time__c != null &&
                 (newTask.Call_Made__c != oldTask.Call_Made__c || newTask.Call_Back_Date_Time__c != oldTask.Call_Back_Date_Time__c)) {
                     Lead ld = new Lead();
                     ld.Call_Made__c = true;
                     ld.Call_Back_Date_Time__c = newTask.Call_Back_Date_Time__c;
                     callMadeInfoLdIds.put(newTask.whoId, ld);  
                 }
            }
            if(oldTask.whoId != null && (''+oldTask.whoId).startsWith('00Q')) {
                //leadIds.add(oldTask.whoId);  
            }
            System.Debug('----------'+leadIds);
    }

    public static void leadUpdateHandler(Set<Id> recIds,Map<Id,Lead> callMadeInfoLdIds){
        List<Sobject> recordsToUpdate = new List<Sobject>();
        Set<Id> recordsToQuery = new Set<Id>(recIds);
        Date todayDate = Date.today();
        if(!recIds.isEmpty()){
            recordsToQuery.addAll(recIds);
        } 
        if(callMadeInfoLdIds != null && !callMadeInfoLdIds.isEmpty()){
            recordsToQuery.addAll(callMadeInfoLdIds.keySet());
        }
        system.debug(recordsToQuery);
        
        if(!recordsToQuery.isEmpty()){
            ID objId = new List<ID>(recordsToQuery)[0];
            Boolean isLeadObject = (String.valueof(objId).startsWith('00Q')) ? true : false; 
            String qryStr = generateQuery(recordsToQuery);
            system.debug('qryStr'+ qryStr);
            if(isLeadObject){
                for(Lead each : DataBase.query(qryStr)){
                    Boolean isAnyFieldUpdated = false;
                    if(recIds.contains(each.Id)){
                        List<Task> tasks = (List<Task>)each.Tasks;
                        system.debug('tasks'+ tasks);
                        List<Event> events = each.Events;
                        system.debug('events'+ events);
                        Integer noOfOutReach = tasks.size() + events.size();
                        system.debug('noOfOutReach'+ noOfOutReach);
                        if(each.SalesLoft_Attempts__c != noOfOutReach){
                            each.SalesLoft_Attempts__c = noOfOutReach;
                            isAnyFieldUpdated = true;
                        }
                        if(Trigger.isInsert && each.Latest_Outreach_Activity_Date__c != todayDate){
                            each.Latest_Outreach_Activity_Date__c = todayDate;
                            isAnyFieldUpdated = true;
                        }
                    }                
                    if(callMadeInfoLdIds != null && callMadeInfoLdIds.containsKey(each.Id)){
                        Lead temp = callMadeInfoLdIds.get(each.Id);
                        if(each.Call_Made__c != temp.Call_Made__c){
                            each.Call_Made__c = temp.Call_Made__c;
                            isAnyFieldUpdated = true;                        
                        }
                        if(each.Call_Back_Date_Time__c != temp.Call_Back_Date_Time__c){
                            each.Call_Back_Date_Time__c = temp.Call_Back_Date_Time__c;
                            isAnyFieldUpdated = true;
                        }
                    }
                    if(isAnyFieldUpdated){
                        recordsToUpdate.add(each);
                    }
                }
            }else{
                for(Contact each : DataBase.query(qryStr)){
                    Boolean isAnyFieldUpdated = false;
                    if(recIds.contains(each.Id)){
                        List<Task> tasks = (List<Task>)each.Tasks;
                        system.debug('tasks'+ tasks);
                        List<Event> events = each.Events;
                        system.debug('events'+ events);
                        Integer noOfOutReach = tasks.size() + events.size();
                        system.debug('noOfOutReach'+ noOfOutReach);
                        if(each.SalesLoft_Attempts__c != noOfOutReach){
                            each.SalesLoft_Attempts__c = noOfOutReach;
                            isAnyFieldUpdated = true;
                        }
                    }
                    if(isAnyFieldUpdated){
                        recordsToUpdate.add(each);
                    }
                }
            }
        }
        if(!recordsToUpdate.isEmpty()){
            Database.update(recordsToUpdate,false);
        }
    }
    
    public static Map<String,Set<String>> metaMap = new Map<String,Set<String>>();
    public static Map<String, Set<String>> getsubjectFilter(){
        if(metaMap.isEmpty()){
            for(SalesLoft_Attempts_Management__mdt meta : [SELECT Id, MasterLabel, Filter__c, Keywords__c FROM SalesLoft_Attempts_Management__mdt]){
                if(meta.Keywords__c != null){
                    if(metaMap.containsKey(meta.Filter__c)){
                        metaMap.get(meta.Filter__c).addAll(new Set<String>(meta.Keywords__c.split(',')));
                    }else{
                        metaMap.put(meta.Filter__c, new Set<String>(meta.Keywords__c.split(',')));
                    }
                }
            }
        }
        return metaMap;
    }
    
    public static Boolean isTaskQualified(Task newTask, Task oldTask){
        Map<String,Set<String>> subMap = getsubjectFilter();
        for(String FILTER : subMap.keySet()){
            Set<String> valueSet = subMap.get(FILTER);
            for(String val : valueSet){
                if(FILTER == 'STARTS WITH'){
                    if(oldTask != null){
                        if((newTask.Subject.startsWithIgnoreCase(val) && !oldTask.Subject.startsWith(val)) || (oldTask.Subject.startsWithIgnoreCase(val) && !newTask.Subject.startsWith(val))){
                            return true;
                        }
                    }else{
                        if(newTask.Subject.startsWithIgnoreCase(val)){
                            return true;
                        }
                    }
                }else if(FILTER == 'CONTAINS'){
                    if(oldTask != null){
                        if((newTask.Subject.containsIgnoreCase(val) && !oldTask.Subject.containsIgnoreCase(val)) || (oldTask.Subject.containsIgnoreCase(val) && !newTask.Subject.containsIgnoreCase(val))){
                            return true;
                        }
                    }else{
                        if(newTask.Subject.containsIgnoreCase(val)){
                            return true;
                        }
                    }
                }else if(FILTER == 'EQUAL'){
                    if(oldTask != null){
                        if((newTask.Subject.equalsIgnoreCase(val) && !oldTask.Subject.equalsIgnoreCase(val)) || (oldTask.Subject.equalsIgnoreCase(val) && !newTask.Subject.equalsIgnoreCase(val))){
                            return true;
                        }
                    }else{
                        if(newTask.Subject.equalsIgnoreCase(val)){
                            return true;
                        }
                    }
                }else if(FILTER == 'ENDS WITH'){
                    if(oldTask != null){
                        if((newTask.Subject.endsWithIgnoreCase(val) && !oldTask.Subject.endsWithIgnoreCase(val)) || (oldTask.Subject.endsWithIgnoreCase(val) && !newTask.Subject.endsWithIgnoreCase(val))){
                            return true;
                        }
                    }else{
                        if(newTask.Subject.endsWithIgnoreCase(val)){
                            return true;
                        }
                    }
                }
            }
        }
        return false;
    }
    
    public static String generateQuery(Set<ID> recIds){
        ID objId = new List<ID>(recIds)[0];
        String qryStr ='';
        String objName = '';
        if(String.valueof(objId).startsWith('003')){
            qryStr = 'SELECT Id, SalesLoft_Attempts__c, (SELECT Id FROM Tasks ';
            objName = 'Contact';
        }else if(String.valueof(objId).startsWith('00Q')){
            qryStr = 'SELECT Id, Call_Made__c, Latest_Outreach_Activity_Date__c, Call_Back_Date_Time__c, SalesLoft_Attempts__c, (SELECT Id FROM Tasks ';
            objName = 'Lead';
        }
        
        Map<String,Set<String>> subMap = getsubjectFilter();
        if(!subMap.isEmpty()){
            qryStr += ' WHERE ';
            for(String FILTER : subMap.keySet()){
                Set<String> valueSet = subMap.get(FILTER);
                for(String val : valueSet){
                    if(FILTER == 'STARTS WITH'){
                        qryStr += ' Subject LIKE \'' + val + '%\' OR ';
                    }else if(FILTER == 'CONTAINS'){
                        qryStr += ' Subject LIKE \'%' + val + '%\' OR ';
                    }else if(FILTER == 'EQUAL'){
                        qryStr += ' Subject = \'' + val + '\' OR ';
                    }else if(FILTER == 'ENDS WITH'){
                        qryStr += ' Subject LIKE \'%' + val + '\' OR ';
                    }
                }
            }
            qryStr = qryStr.removeEnd('OR ');
        }
        qryStr += ' ),( SELECT Id FROM Events ';
        if(!subMap.isEmpty()){
            qryStr += ' WHERE ';
            for(String FILTER : subMap.keySet()){
                Set<String> valueSet = subMap.get(FILTER);
                for(String val : valueSet){
                    if(FILTER == 'STARTS WITH'){
                        qryStr += ' Subject LIKE \'' + val + '%\' OR ';
                    }else if(FILTER == 'CONTAINS'){
                        qryStr += ' Subject LIKE \'%' + val + '%\' OR ';
                    }else if(FILTER == 'EQUAL'){
                        qryStr += ' Subject = \'' + val + '\' OR ';
                    }else if(FILTER == 'ENDS WITH'){
                        qryStr += ' Subject LIKE \'%' + val + '\' OR ';
                    }
                }
            }
            qryStr = qryStr.removeEnd('OR ');
        }
        String objids = '';
        for(Id recid : recIds){
            objids += '\''+recid+'\',';
        }
        objids = objids.removeEnd(',');
        qryStr +=') FROM '+ objName +' WHERE ID IN ('+objids+')';
        
        System.Debug('QUERY SIZE ---- '+qryStr.length()+' ---- FINAL QUERY ----- '+qryStr);
        return qryStr;
    }
    
}