/*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;
}
}









No comments:
Post a Comment