You need to sign in to do that
Don't have an account?
dhruv 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;
}
}
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;
}
}