Home

Friday, 3 January 2025

sfdc-learn #14 : Salesforce Trigger Scenario

 /*Requirement:
 We have two object Task__c and Project__C.
write trigger to update project status as 'Completed' when all associated tasks are completed below scenario:
  • updating task status or 
  • creating new task or 
  • by deleting task . 
 Otherwise update Project status as 'In Progress'.
 Note: On Task object have Project Lookup (Project -->Parent and task is child) */

Trigger Code:


    trigger taskTrigger on Task__c (after update, after insert , after delete) {
        set<Id> projIdSet = new set<Id>();
        List<Project__c> projList =  new List<Project__c>();
        Boolean isInsert = trigger.oldmap == null ? true: false;

        if(trigger.isInsert || trigger.isUpdate){
            for(Task__c taskrec: trigger.new){
                if( taskrec.Project__c != null && (isInsert || (!isInsert
&& taskrec.Status__c != trigger.oldmap.get(taskrec.Id).Status__c))){
                    projIdSet.add(taskrec.Project__c);
                }
            }
        }else if(trigger.isDelete){
            for(Task__c taskrec: trigger.old){
                if( taskrec.Project__c != null){
                    projIdSet.add(taskrec.Project__c);
                }
            }  
        }

       
        //Create map of project with associated all task count
        Map<string,Integer> projectWithTaskTotalCount = new Map<string,Integer>();
   
        for(AggregateResult aggr:[SELECT Count(Id)taskCount, Project__c
                                FROM Task__c
                                GROUP BY Project__c
                                HAVING Project__c IN:projIdSet]){
                                   
      projectWithTaskTotalCount.put(string.valueOf(aggr.get('Project__c')), Integer.valueOf(aggr.get('taskCount')));
        }
       
        map<Id,string> projWithstatusMap = new map<Id,string>();
       
        //Compare each task status count with total task count for associated project.
        //And Create map with project id and status
        for(AggregateResult aggr:[SELECT count(Id)countStatus, Status__c,Project__c
                                            from Task__c
                                            group by Status__c,Project__c
                                            Having Project__c IN:projIdSet ]){
           
              string strpro = string.valueOf(aggr.get('Project__C'));
            if(aggr.get('Status__c') == 'Completed' && Integer.ValueOf(projectWithTaskTotalCount.get(strpro)) == Integer.valueOf(aggr.get('countStatus'))){
            projWithstatusMap.put(string.valueOf(aggr.get('Project__C')), 'Completed');
            }else{
                string strid = string.valueOf(aggr.get('Project__C'));
                projWithstatusMap.put(string.valueOf(aggr.get('Project__C')), 'In Progress');
            }
        }
       
        // Create project list to update
        if(!projWithstatusMap.isEmpty()){
            for(Id proId: projWithstatusMap.keySet()){
                Project__c proj = new Project__c(Id=proId , Status__c = projWithstatusMap.get(proId));
                projList.add(proj);    
            }
        }
        //Update projects.
        if(!projList.isEmpty()){
            update projList;
        }
    }
Test Results:

Update Scenario:





Create Scenario:


Delete Scenario:




No comments:

Post a Comment