-
ChatterFeed
-
0Best Answers
-
0Likes Received
-
0Likes Given
-
2Questions
-
1Replies
Help with NullPointerException
Hello,
Can someone help point out where the NullPointerException occurs? This class is invocable from a process that gets the Opportunity Line Item ID for created and updated records where Product End Date = null.
Thank you,
Maggie
Can someone help point out where the NullPointerException occurs? This class is invocable from a process that gets the Opportunity Line Item ID for created and updated records where Product End Date = null.
public with sharing class invocable_productEndDate { /*Params to be passed from different process builder processes from varying objects. None required, because each process will execute slightly different logic and use different params.*/ public class productVariables { @InvocableVariable public Id opptyLineItemId; } @InvocableMethod public static void productEndDate(List<productVariables> Vars) { List<Id> oppLineItemIds = new List<Id>(); List<OpportunityLineItem> oppLineItems = new List<OpportunityLineItem>(); Map<Id, OpportunityLineItem> oliIdandOLI = new Map<Id, OpportunityLineItem>(); Map<Id, Date> oliAndProductEndDate = new Map<Id, Date>(); Set<Id> updateOLIIds = new Set<Id>(); List<OpportunityLineItem> olisToUpdate = new List<OpportunityLineItem>(); /*Loop through variable objects passed from process builder and assign Ids to lists. Because of SOQL governors, don't want to query inside loop, so list assignment works around that*/ for (productVariables var : Vars) { if (var.opptyLineItemId != null) { oppLineItemIds.add(var.opptyLineItemId); system.debug('oppLineItemIds = ' + oppLineItemIds); } } oppLineItems = [SELECT Id, ServiceDate, Product_End_Date__c, PricebookEntry.Product2.FY16_Revenue_Type__c FROM OpportunityLineItem WHERE Id IN : oppLineItemIds AND PricebookEntry.Product2.FY16_Revenue_Type__c = 'Recurring']; system.debug('oppLineItems = ' + oppLineItems); /*Product Term Months may be null, because Product End Date is not required on Salesforce ui when adding a product. Assume 12 months from ServiceDate and calculate months between. Default Product Date based on these assumptions - updates will re-calculate accordingly.*/ for (OpportunityLineItem oli : oppLineItems) { oliIdandOLI.put(oli.Id, oli); Date tempProductEndDate = oli.ServiceDate.addYears(1).addDays(-1); oliAndProductEndDate.put(oli.Id, tempProductEndDate); } /*Line Item field values to update go in maps in this block*/ if (!oliIdandOLI.isEmpty()) { for (Id oliID : oliIdandOLI.keySet()) { if (!oliAndProductEndDate.isEmpty()) { oliIdandOLI.get(oliId).Product_End_Date__c = oliAndProductEndDate.get(oliId); } } } /*Don't want duplicates in list of line items to update, so loop through ordered set of Ids and add to update list only if the record is not already there.*/ for (Id oliId : oliIdandOLI.keySet()) { if (!updateOLIIds.contains(oliId)) { olisToUpdate.add(oliIdandOLI.get(oliId)); system.debug('olisToUpdate = ' + olisToUpdate); } else { updateOLIIds.add(oliId); system.debug('updateOLIIds = ' + updateOLIIds); } }
Thank you,
Maggie
- Maggie Farley 20
- August 08, 2017
- Like
- 0
Fields updated then immediately deleted
Hi there,
I have been going in circles with an issue on the Case object. The main issue is that Case fields are being updated but the values are immediately deleted. I am new to Apex and need some help breaking this issue down because I cannot find the root cause. I'd like to simplify the solution, but I'd like to understand what is going on before I make any changes.
Here is an example of the issue:
What is supposed to happen:
Whenever a task is completed, a trigger fires to count the number of completed tasks and add that value into the Completed Activities field. When the Completed Activities field is populated, a workflow rule fires to update the FPR field. There is another trigger that updates the Time to FPR(Business Hours) using the FPR field value. I am new to Apex and need some help breaking this issue down because I cannot find the root cause.
Components:
1. CaseHelper Class
Criteria: ISBLANK(FPR__c) && Completed_Activities__c > 0
Evaluation: Evaluate the rule when a record is created, and any time it's edited to subsequently meet criteria
I have been going in circles with an issue on the Case object. The main issue is that Case fields are being updated but the values are immediately deleted. I am new to Apex and need some help breaking this issue down because I cannot find the root cause. I'd like to simplify the solution, but I'd like to understand what is going on before I make any changes.
Here is an example of the issue:
What is supposed to happen:
Whenever a task is completed, a trigger fires to count the number of completed tasks and add that value into the Completed Activities field. When the Completed Activities field is populated, a workflow rule fires to update the FPR field. There is another trigger that updates the Time to FPR(Business Hours) using the FPR field value. I am new to Apex and need some help breaking this issue down because I cannot find the root cause.
Components:
1. CaseHelper Class
public static void FPRCalc(List<Case> cases, List<Case> oldList, Map<ID, sObject> newMap, Map<ID, sObject> oldMap){ for(Case c : cases){ if(c.FPR__c != NULL && c.BusinessHoursId !=NULL){ if(c.Time_to_FPR_Business_Hours__c != ((Double)(BusinessHours.diff(c.BusinessHoursId, c.CreatedDate, c.FPR__c))/3600000)){ c.Time_to_FPR_Business_Hours__c = ((Double)(BusinessHours.diff(c.BusinessHoursId, c.CreatedDate, c.FPR__c))/3600000); } } if(c.Date_Time_Assigned__c != NULL && c.BusinessHoursId !=NULL){ if(c.Time_to_Assignment_Hours__c != ((Double)(BusinessHours.diff(c.BusinessHoursId, c.CreatedDate, c.Date_Time_Assigned__c))/3600000)){ c.Time_to_Assignment_Hours__c = (((Double)(BusinessHours.diff(c.BusinessHoursId, c.CreatedDate, c.Date_Time_Assigned__c))/3600000)); } } } }2. taskAndActivity Trigger
trigger taskAndActivityTrigger on Task (after insert, after update, before delete) { /* taskandactivity trigger to update Completed Activities */ List<Task> taskList = new List<Task>(); Set<Id> casesToDecrement = new Set<Id>(); List<Id> leadIds = new List<Id>(); Map<Id, Lead> leadIdandLead = new Map<Id, Lead>(); Map<Id, Decimal> leadIdandCount = new Map<Id, Decimal>(); Map<Id, Date> leadIdandMaxDate = new Map<Id, Date>(); Map<Id, Id> leadIdandTaskId = new Map<Id, Id>(); List<Lead> leadsToUpdate = new List<Lead>(); Set<Id> leadsToUpdateIds = new Set<Id>(); Map<Id, Case> caseIdandCase = new Map<Id, Case>(); List<Id> caseIds = new List<Id>(); Map<Id, Decimal> caseIdandCount = new Map<Id, Decimal>(); Map<Id, Datetime> caseIdandDateTime = new Map<Id, DateTime>(); List<Case> casesToUpdate = new List<Case>(); Set<Id> casesToUpdateIds = new Set<Id>(); /*Can't traverse What and Who relationships in Trigger.new, so must query for these fields. Can't use trigger.newMap in delete trigger*/ if (!Trigger.isDelete) { taskList = [SELECT Id, Status, isClosed, What.Type, Who.Type, What.Id, Who.Id, ActivityDate, CreatedDate FROM Task Where Id IN : trigger.newMap.keyset() AND Lead_Source_Activity__c != TRUE]; system.debug('taskList = ' + taskList); } else { taskList = [SELECT Id, Status, isClosed, What.Type, Who.Type, What.Id, Who.Id, ActivityDate, CreatedDate FROM Task Where Id IN : trigger.oldMap.keyset() AND Lead_Source_Activity__c != TRUE]; system.debug('taskList = ' + taskList); } if (!taskList.isEmpty()) { for (Task t : taskList) { /*Only want closed tasks/activities*/ if (Trigger.isInsert && t.isClosed) { system.debug('Trigger.isInsert'); if (t.What.Type == 'Case') { system.debug('What.Type = Case'); /*Can't add to caseIdandCase map here - can't get full Case object off Task. Will query for this and add to map outside of this loop.*/ caseIds.add(t.WhatId); system.debug('caseIds = ' + caseIds); } /*Only want to get the tasks on update that have changed Status*/ if (Trigger.isUpdate) { if ((Trigger.oldMap.get(t.Id).Status != Trigger.newMap.get(t.Id).Status) || (t.Status == 'Completed' && Trigger.oldMap.get(t.Id).ActivityDate != Trigger.newMap.get(t.Id).ActivityDate)) { system.debug('Trigger.isUpdate and isClosed changed'); system.debug('new task status = ' + Trigger.newMap.get(t.Id).Status); system.debug('old task status = ' + Trigger.oldMap.get(t.Id).Status); if (t.What.Type == 'Case') { system.debug('What.Type = Case'); /*Can't add to caseIdandCase map here - can't get full Case object off Task. Will query for this and add to map outside of this loop.*/ caseIds.add(t.WhatId); system.debug('caseIds = ' + caseIds); } if (t.Who.Type == 'Lead') { system.debug('What.Type = Lead'); /*Can't add to leadIdandLead map here - can't get full Lead object off Task. Will query for this and add to map outside of this loop.*/ leadIds.add(t.WhoId); system.debug('leadIds = ' + leadIds); } } } if (Trigger.isDelete) { if (t.What.Type == 'Case' && t.isClosed == TRUE) { leadIds.add(t.WhoId); system.debug('leadIds = ' + leadIds); system.debug('What.Type = Case'); casesToDecrement.add(t.WhatId); system.debug('casesToDecrement = ' + casesToDecrement); } if (t.Who.Type == 'Lead' && t.isClosed == TRUE) { leadIds.add(t.WhoId); system.debug('leadIds = ' + leadIds); system.debug('Who.Type = Lead'); leadIdandTaskId.put(t.Id, t.WhoId); system.debug('leadIdandTaskId = ' + leadIdandTaskId); } } } } /*Build key-value pairs from list of ids obtained in trigger context, since task --> case relationship can't be traversed*/ if (!caseIds.isEmpty()) { for (Case c : [SELECT Id, Last_Activity__c, Completed_Activities__c FROM Case WHERE Id IN : caseIds]) { caseIdandCase.put(c.Id, c); } } if (!caseIdandCase.isEmpty()) { AggregateResult[] caseAggregate = [SELECT WhatId, Count(Id)closedTaskCount FROM Task WHERE isCLosed = TRUE AND What.Type = 'Case' AND WhatId IN : caseIdandCase.keyset() GROUP BY WhatId]; system.debug('caseAggregate = ' + caseAggregate); if (!caseAggregate.isEmpty()) { for (AggregateResult ca : caseAggregate) { caseIdandCount.put((ID)ca.get('WhatId'), (Decimal)ca.get('closedTaskCount')); system.debug('caseIdandCount = ' + caseIdandCount); } if (!caseIdandCount.isEmpty()) { for (Case c : [SELECT Id, Completed_Activities__c FROM CAse WHERE Id IN : caseIdandCount.keyset()]) { caseIdandCase.get(c.Id).Completed_Activities__c = caseIdandCount.get(c.Id); } } } /*If task is updated from isClosed to !isClosed, and it is the only task related to that case, we need to decrement it. This list also contains deleted deleted case tasks.*/ else if (caseAggregate.isEmpty()) { for (Id caseId : caseIdandCase.keySet()) { casesToDecrement.add(caseId); system.debug('casesToDecrement = ' + casesToDecrement); } } if (!caseIdandDateTime.isEmpty()) { for (Case c : [SELECT Id, Last_Activity__c, Next_Business_Day_After_Last_Activity__c, BusinessHoursId FROM Case Where Id IN : caseIdandDateTime.keySet()]) { caseIdandCase.get(c.Id).Last_Activity__c = caseIdandDateTime.get(c.Id); system.debug('caseIdandCase.get(c.Id).Last_Activity__c ' + caseIdandCase.get(c.Id).Last_Activity__c); dateTime tempDateTime = caseIdandDateTime.get(c.Id); system.debug('tempDateTime = ' + tempDateTime); if (c.BusinessHoursId != null && tempDateTime != null) { BusinessDays bizDays = new BusinessDays(c.BusinessHoursId); system.debug('bizDays = ' + bizDays); caseIdandCase.get(c.Id).Next_Business_Day_After_Last_Activity__c = BizDays.nextBusinessDay(date.newInstance(tempDateTime.year(), tempDateTime.month(), tempDateTime.day())); system.debug('caseIdandCase.get(c.Id).Next_Business_Day_After_Last_Activity__c = ' + caseIdandCase.get(c.Id).Next_Business_Day_After_Last_Activity__c); } } } if (!casesToDecrement.isEmpty()) { for (Case c : [SELECT Id, Completed_Activities__c FROM Case WHERE Id IN : casesToDecrement]) { caseIdandCase.get(c.Id).Completed_Activities__c = caseIdandCase.get(c.Id).Completed_Activities__c - 1; } } } /*Loop through the key-value pairs and add them to the list of Cases to pass into the saveResult - only List of sObjects accepted, and don't want dups, hence the set.*/ for (Id caseId : caseIdAndCase.keySet()) { if (!casesToUpdateIds.contains(caseId)) { casesToUpdate.add(caseIdAndCase.get(caseId)); system.debug('casesToUpdate = ' + casesToUpdate); } else { casesToUpdateIds.add(caseId); system.debug('casesToUpdateIds = ' + casesToUpdateIds); } } if (!casesToUpdate.isEmpty()) { /*Update cases, partial processing*/ Database.saveResult[] caseResults = Database.update(casesToUpdate, false); String subject = 'Error Updating cases with Completed_Activities__c'; List<String> toAddresses = new List<String>{'bspencer@appextremes.com, rdente@appextremes.com'}; String body = ''; for (Database.saveResult res : caseResults) { if (!res.isSuccess()) { body += 'Id = ' + res.getId() + '\n\n' + res.getErrors() + '\n\n'; } } } }3. FPR Timestamp WFR
Criteria: ISBLANK(FPR__c) && Completed_Activities__c > 0
Evaluation: Evaluate the rule when a record is created, and any time it's edited to subsequently meet criteria
- Maggie Farley 20
- April 07, 2017
- Like
- 0
Fields updated then immediately deleted
Hi there,
I have been going in circles with an issue on the Case object. The main issue is that Case fields are being updated but the values are immediately deleted. I am new to Apex and need some help breaking this issue down because I cannot find the root cause. I'd like to simplify the solution, but I'd like to understand what is going on before I make any changes.
Here is an example of the issue:
What is supposed to happen:
Whenever a task is completed, a trigger fires to count the number of completed tasks and add that value into the Completed Activities field. When the Completed Activities field is populated, a workflow rule fires to update the FPR field. There is another trigger that updates the Time to FPR(Business Hours) using the FPR field value. I am new to Apex and need some help breaking this issue down because I cannot find the root cause.
Components:
1. CaseHelper Class
Criteria: ISBLANK(FPR__c) && Completed_Activities__c > 0
Evaluation: Evaluate the rule when a record is created, and any time it's edited to subsequently meet criteria
I have been going in circles with an issue on the Case object. The main issue is that Case fields are being updated but the values are immediately deleted. I am new to Apex and need some help breaking this issue down because I cannot find the root cause. I'd like to simplify the solution, but I'd like to understand what is going on before I make any changes.
Here is an example of the issue:
What is supposed to happen:
Whenever a task is completed, a trigger fires to count the number of completed tasks and add that value into the Completed Activities field. When the Completed Activities field is populated, a workflow rule fires to update the FPR field. There is another trigger that updates the Time to FPR(Business Hours) using the FPR field value. I am new to Apex and need some help breaking this issue down because I cannot find the root cause.
Components:
1. CaseHelper Class
public static void FPRCalc(List<Case> cases, List<Case> oldList, Map<ID, sObject> newMap, Map<ID, sObject> oldMap){ for(Case c : cases){ if(c.FPR__c != NULL && c.BusinessHoursId !=NULL){ if(c.Time_to_FPR_Business_Hours__c != ((Double)(BusinessHours.diff(c.BusinessHoursId, c.CreatedDate, c.FPR__c))/3600000)){ c.Time_to_FPR_Business_Hours__c = ((Double)(BusinessHours.diff(c.BusinessHoursId, c.CreatedDate, c.FPR__c))/3600000); } } if(c.Date_Time_Assigned__c != NULL && c.BusinessHoursId !=NULL){ if(c.Time_to_Assignment_Hours__c != ((Double)(BusinessHours.diff(c.BusinessHoursId, c.CreatedDate, c.Date_Time_Assigned__c))/3600000)){ c.Time_to_Assignment_Hours__c = (((Double)(BusinessHours.diff(c.BusinessHoursId, c.CreatedDate, c.Date_Time_Assigned__c))/3600000)); } } } }2. taskAndActivity Trigger
trigger taskAndActivityTrigger on Task (after insert, after update, before delete) { /* taskandactivity trigger to update Completed Activities */ List<Task> taskList = new List<Task>(); Set<Id> casesToDecrement = new Set<Id>(); List<Id> leadIds = new List<Id>(); Map<Id, Lead> leadIdandLead = new Map<Id, Lead>(); Map<Id, Decimal> leadIdandCount = new Map<Id, Decimal>(); Map<Id, Date> leadIdandMaxDate = new Map<Id, Date>(); Map<Id, Id> leadIdandTaskId = new Map<Id, Id>(); List<Lead> leadsToUpdate = new List<Lead>(); Set<Id> leadsToUpdateIds = new Set<Id>(); Map<Id, Case> caseIdandCase = new Map<Id, Case>(); List<Id> caseIds = new List<Id>(); Map<Id, Decimal> caseIdandCount = new Map<Id, Decimal>(); Map<Id, Datetime> caseIdandDateTime = new Map<Id, DateTime>(); List<Case> casesToUpdate = new List<Case>(); Set<Id> casesToUpdateIds = new Set<Id>(); /*Can't traverse What and Who relationships in Trigger.new, so must query for these fields. Can't use trigger.newMap in delete trigger*/ if (!Trigger.isDelete) { taskList = [SELECT Id, Status, isClosed, What.Type, Who.Type, What.Id, Who.Id, ActivityDate, CreatedDate FROM Task Where Id IN : trigger.newMap.keyset() AND Lead_Source_Activity__c != TRUE]; system.debug('taskList = ' + taskList); } else { taskList = [SELECT Id, Status, isClosed, What.Type, Who.Type, What.Id, Who.Id, ActivityDate, CreatedDate FROM Task Where Id IN : trigger.oldMap.keyset() AND Lead_Source_Activity__c != TRUE]; system.debug('taskList = ' + taskList); } if (!taskList.isEmpty()) { for (Task t : taskList) { /*Only want closed tasks/activities*/ if (Trigger.isInsert && t.isClosed) { system.debug('Trigger.isInsert'); if (t.What.Type == 'Case') { system.debug('What.Type = Case'); /*Can't add to caseIdandCase map here - can't get full Case object off Task. Will query for this and add to map outside of this loop.*/ caseIds.add(t.WhatId); system.debug('caseIds = ' + caseIds); } /*Only want to get the tasks on update that have changed Status*/ if (Trigger.isUpdate) { if ((Trigger.oldMap.get(t.Id).Status != Trigger.newMap.get(t.Id).Status) || (t.Status == 'Completed' && Trigger.oldMap.get(t.Id).ActivityDate != Trigger.newMap.get(t.Id).ActivityDate)) { system.debug('Trigger.isUpdate and isClosed changed'); system.debug('new task status = ' + Trigger.newMap.get(t.Id).Status); system.debug('old task status = ' + Trigger.oldMap.get(t.Id).Status); if (t.What.Type == 'Case') { system.debug('What.Type = Case'); /*Can't add to caseIdandCase map here - can't get full Case object off Task. Will query for this and add to map outside of this loop.*/ caseIds.add(t.WhatId); system.debug('caseIds = ' + caseIds); } if (t.Who.Type == 'Lead') { system.debug('What.Type = Lead'); /*Can't add to leadIdandLead map here - can't get full Lead object off Task. Will query for this and add to map outside of this loop.*/ leadIds.add(t.WhoId); system.debug('leadIds = ' + leadIds); } } } if (Trigger.isDelete) { if (t.What.Type == 'Case' && t.isClosed == TRUE) { leadIds.add(t.WhoId); system.debug('leadIds = ' + leadIds); system.debug('What.Type = Case'); casesToDecrement.add(t.WhatId); system.debug('casesToDecrement = ' + casesToDecrement); } if (t.Who.Type == 'Lead' && t.isClosed == TRUE) { leadIds.add(t.WhoId); system.debug('leadIds = ' + leadIds); system.debug('Who.Type = Lead'); leadIdandTaskId.put(t.Id, t.WhoId); system.debug('leadIdandTaskId = ' + leadIdandTaskId); } } } } /*Build key-value pairs from list of ids obtained in trigger context, since task --> case relationship can't be traversed*/ if (!caseIds.isEmpty()) { for (Case c : [SELECT Id, Last_Activity__c, Completed_Activities__c FROM Case WHERE Id IN : caseIds]) { caseIdandCase.put(c.Id, c); } } if (!caseIdandCase.isEmpty()) { AggregateResult[] caseAggregate = [SELECT WhatId, Count(Id)closedTaskCount FROM Task WHERE isCLosed = TRUE AND What.Type = 'Case' AND WhatId IN : caseIdandCase.keyset() GROUP BY WhatId]; system.debug('caseAggregate = ' + caseAggregate); if (!caseAggregate.isEmpty()) { for (AggregateResult ca : caseAggregate) { caseIdandCount.put((ID)ca.get('WhatId'), (Decimal)ca.get('closedTaskCount')); system.debug('caseIdandCount = ' + caseIdandCount); } if (!caseIdandCount.isEmpty()) { for (Case c : [SELECT Id, Completed_Activities__c FROM CAse WHERE Id IN : caseIdandCount.keyset()]) { caseIdandCase.get(c.Id).Completed_Activities__c = caseIdandCount.get(c.Id); } } } /*If task is updated from isClosed to !isClosed, and it is the only task related to that case, we need to decrement it. This list also contains deleted deleted case tasks.*/ else if (caseAggregate.isEmpty()) { for (Id caseId : caseIdandCase.keySet()) { casesToDecrement.add(caseId); system.debug('casesToDecrement = ' + casesToDecrement); } } if (!caseIdandDateTime.isEmpty()) { for (Case c : [SELECT Id, Last_Activity__c, Next_Business_Day_After_Last_Activity__c, BusinessHoursId FROM Case Where Id IN : caseIdandDateTime.keySet()]) { caseIdandCase.get(c.Id).Last_Activity__c = caseIdandDateTime.get(c.Id); system.debug('caseIdandCase.get(c.Id).Last_Activity__c ' + caseIdandCase.get(c.Id).Last_Activity__c); dateTime tempDateTime = caseIdandDateTime.get(c.Id); system.debug('tempDateTime = ' + tempDateTime); if (c.BusinessHoursId != null && tempDateTime != null) { BusinessDays bizDays = new BusinessDays(c.BusinessHoursId); system.debug('bizDays = ' + bizDays); caseIdandCase.get(c.Id).Next_Business_Day_After_Last_Activity__c = BizDays.nextBusinessDay(date.newInstance(tempDateTime.year(), tempDateTime.month(), tempDateTime.day())); system.debug('caseIdandCase.get(c.Id).Next_Business_Day_After_Last_Activity__c = ' + caseIdandCase.get(c.Id).Next_Business_Day_After_Last_Activity__c); } } } if (!casesToDecrement.isEmpty()) { for (Case c : [SELECT Id, Completed_Activities__c FROM Case WHERE Id IN : casesToDecrement]) { caseIdandCase.get(c.Id).Completed_Activities__c = caseIdandCase.get(c.Id).Completed_Activities__c - 1; } } } /*Loop through the key-value pairs and add them to the list of Cases to pass into the saveResult - only List of sObjects accepted, and don't want dups, hence the set.*/ for (Id caseId : caseIdAndCase.keySet()) { if (!casesToUpdateIds.contains(caseId)) { casesToUpdate.add(caseIdAndCase.get(caseId)); system.debug('casesToUpdate = ' + casesToUpdate); } else { casesToUpdateIds.add(caseId); system.debug('casesToUpdateIds = ' + casesToUpdateIds); } } if (!casesToUpdate.isEmpty()) { /*Update cases, partial processing*/ Database.saveResult[] caseResults = Database.update(casesToUpdate, false); String subject = 'Error Updating cases with Completed_Activities__c'; List<String> toAddresses = new List<String>{'bspencer@appextremes.com, rdente@appextremes.com'}; String body = ''; for (Database.saveResult res : caseResults) { if (!res.isSuccess()) { body += 'Id = ' + res.getId() + '\n\n' + res.getErrors() + '\n\n'; } } } }3. FPR Timestamp WFR
Criteria: ISBLANK(FPR__c) && Completed_Activities__c > 0
Evaluation: Evaluate the rule when a record is created, and any time it's edited to subsequently meet criteria
- Maggie Farley 20
- April 07, 2017
- Like
- 0