sf-agent-framework
Version:
AI Agent Orchestration Framework for Salesforce Development - Two-phase architecture with 70% context reduction
395 lines (302 loc) • 10.3 kB
Markdown
# Common Salesforce Validation Rules
## Overview
Validation rules in Salesforce verify that data entered by users meets specified
criteria before saving. This document provides comprehensive patterns and
examples for implementing effective validation rules.
## Core Validation Rule Concepts
### Validation Rule Structure
```
Error Condition Formula: [Boolean expression that returns TRUE when data is invalid]
Error Message: [User-friendly message displayed when validation fails]
Error Location: [Top of page or specific field]
```
### Formula Functions for Validation
- **ISBLANK()**: Check if field is empty
- **ISNULL()**: Check if field is null
- **REGEX()**: Pattern matching
- **CONTAINS()**: Check if text contains substring
- **AND()**, **OR()**, **NOT()**: Logical operators
- **TODAY()**, **NOW()**: Date/time comparisons
## Common Validation Patterns
### 1. Required Field Validations
#### Conditional Required Fields
```javascript
// Require close date when opportunity stage is Closed Won
AND(ISPICKVAL(StageName, 'Closed Won'), ISBLANK(CloseDate));
Error: 'Close Date is required when Stage is Closed Won';
```
#### Multiple Field Dependencies
```javascript
// Require either phone or email
AND(ISBLANK(Phone), ISBLANK(Email));
Error: 'Please provide either Phone or Email';
```
### 2. Data Format Validations
#### Email Format Validation
```javascript
// Validate email format
AND(NOT(ISBLANK(Email)), NOT(REGEX(Email, '^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$')));
Error: 'Please enter a valid email address';
```
#### Phone Number Format
```javascript
// US Phone Number Format (10 digits)
AND(NOT(ISBLANK(Phone)), NOT(REGEX(Phone, '^\\(?[0-9]{3}\\)?[-. ]?[0-9]{3}[-. ]?[0-9]{4}$')));
Error: 'Phone must be in format: (123) 456-7890';
```
#### Postal Code Validation
```javascript
// US Zip Code Format
AND((Country = 'USA'), NOT(ISBLANK(PostalCode)), NOT(REGEX(PostalCode, '^[0-9]{5}(-[0-9]{4})?$')));
Error: 'US Postal Code must be in format: 12345 or 12345-6789';
```
### 3. Date Validations
#### Date Cannot Be in Past
```javascript
// Close date cannot be in the past
CloseDate < TODAY();
Error: 'Close Date cannot be in the past';
```
#### Date Range Validation
```javascript
// Contract end date must be after start date
AND(
NOT(ISBLANK(Contract_Start_Date__c)),
NOT(ISBLANK(Contract_End_Date__c)),
Contract_End_Date__c <= Contract_Start_Date__c
);
Error: 'Contract End Date must be after Start Date';
```
#### Business Days Validation
```javascript
// Due date must be at least 3 business days from today
AND(
NOT(ISBLANK(Due_Date__c)),
Due_Date__c <
CASE(
MOD(TODAY() - DATE(1900, 1, 7), 7),
0,
TODAY() + 3 /* Sunday */,
1,
TODAY() + 3 /* Monday */,
2,
TODAY() + 3 /* Tuesday */,
3,
TODAY() + 5 /* Wednesday */,
4,
TODAY() + 5 /* Thursday */,
5,
TODAY() + 5 /* Friday */,
6,
TODAY() + 4 /* Saturday */,
TODAY() + 3
)
);
Error: 'Due Date must be at least 3 business days from today';
```
### 4. Numeric Validations
#### Range Validation
```javascript
// Discount percentage must be between 0 and 100
OR(Discount_Percent__c < 0, Discount_Percent__c > 100);
Error: 'Discount must be between 0% and 100%';
```
#### Minimum/Maximum Values
```javascript
// Opportunity amount must be at least $1000
AND(NOT(ISBLANK(Amount)), Amount < 1000);
Error: 'Opportunity Amount must be at least $1,000';
```
#### Numeric Precision
```javascript
// Quantity must be whole number
AND(NOT(ISBLANK(Quantity__c)), MOD(Quantity__c, 1) != 0);
Error: 'Quantity must be a whole number';
```
### 5. Text Field Validations
#### Character Length
```javascript
// Description must be at least 10 characters
AND(NOT(ISBLANK(Description)), LEN(Description) < 10);
Error: 'Description must be at least 10 characters';
```
#### Allowed Values
```javascript
// Status must be one of allowed values
AND(NOT(ISBLANK(Status__c)), NOT(CONTAINS('New:In Progress:Complete:Cancelled', Status__c)));
Error: 'Status must be New, In Progress, Complete, or Cancelled';
```
#### No Special Characters
```javascript
// Product code must be alphanumeric only
AND(NOT(ISBLANK(Product_Code__c)), NOT(REGEX(Product_Code__c, '^[A-Za-z0-9]+$')));
Error: 'Product Code must contain only letters and numbers';
```
### 6. Cross-Object Validations
#### Parent Record Validation
```javascript
// Account must be active to create opportunity
Account.Active__c = FALSE;
Error: 'Cannot create Opportunity for inactive Account';
```
#### Related Record Count
```javascript
// Limit number of contacts per account
Account.Number_of_Contacts__c >= 50;
Error: 'Account has reached maximum of 50 contacts';
```
### 7. Business Logic Validations
#### Stage Progression
```javascript
// Opportunity stage must progress in order
AND(
ISCHANGED(StageName),
OR(
AND(ISPICKVAL(PRIORVALUE(StageName), 'Prospecting'), NOT(ISPICKVAL(StageName, 'Qualification'))),
AND(
ISPICKVAL(PRIORVALUE(StageName), 'Qualification'),
NOT(OR(ISPICKVAL(StageName, 'Needs Analysis'), ISPICKVAL(StageName, 'Closed Lost')))
)
)
);
Error: 'Invalid stage progression. Stages must follow the defined sales process';
```
#### Approval Required
```javascript
// Discount over 20% requires approval
AND(Discount_Percent__c > 20, NOT(Approved__c));
Error: 'Discounts over 20% require manager approval';
```
### 8. Integration Validations
#### External ID Format
```javascript
// SAP Customer ID format validation
AND(NOT(ISBLANK(SAP_Customer_ID__c)), NOT(REGEX(SAP_Customer_ID__c, '^[A-Z]{2}[0-9]{8}$')));
Error: 'SAP Customer ID must be in format: XX12345678';
```
#### Data Synchronization
```javascript
// Prevent updates to synced records
AND((Synced_to_ERP__c = TRUE), OR(ISCHANGED(Name), ISCHANGED(Account_Number__c), ISCHANGED(Tax_ID__c)));
Error: 'Cannot modify synced fields. Please update in ERP system';
```
## Advanced Validation Patterns
### 1. Complex Business Rules
```javascript
// Validate opportunity close probability aligns with stage
OR(
AND(ISPICKVAL(StageName, 'Prospecting'), Probability > 10),
AND(ISPICKVAL(StageName, 'Qualification'), OR(Probability < 10, Probability > 20)),
AND(ISPICKVAL(StageName, 'Needs Analysis'), OR(Probability < 20, Probability > 40)),
AND(ISPICKVAL(StageName, 'Value Proposition'), OR(Probability < 40, Probability > 60)),
AND(ISPICKVAL(StageName, 'Decision Makers'), OR(Probability < 60, Probability > 80)),
AND(ISPICKVAL(StageName, 'Perception Analysis'), OR(Probability < 80, Probability > 90)),
AND(ISPICKVAL(StageName, 'Proposal/Price Quote'), Probability < 90),
AND(ISPICKVAL(StageName, 'Negotiation/Review'), Probability < 90)
);
Error: "Probability doesn't match stage guidelines";
```
### 2. Time-Based Validations
```javascript
// Service appointments must be during business hours
AND(
NOT(ISBLANK(Appointment_DateTime__c)),
OR(
VALUE(MID(TEXT(Appointment_DateTime__c), 12, 2)) < 8,
VALUE(MID(TEXT(Appointment_DateTime__c), 12, 2)) > 17,
CASE(
MOD(DATEVALUE(Appointment_DateTime__c) - DATE(1900, 1, 7), 7),
0,
TRUE /* Sunday */,
6,
TRUE /* Saturday */,
FALSE
)
)
);
Error: 'Appointments must be scheduled Monday-Friday, 8 AM - 5 PM';
```
### 3. Hierarchical Validations
```javascript
// Child record value cannot exceed parent limit
AND(NOT(ISBLANK(Amount__c)), Amount__c > Parent_Object__r.Max_Child_Amount__c);
Error: 'Amount exceeds parent record limit';
```
## Best Practices
### 1. User-Friendly Error Messages
```javascript
// Bad
ISBLANK(Account_Number__c);
Error: 'Error: Field required';
// Good
ISBLANK(Account_Number__c);
Error: 'Account Number is required. Please enter the 10-digit account number provided by Finance';
```
### 2. Performance Optimization
- Avoid complex SOQL in validation rules
- Use formula fields for complex calculations
- Limit use of cross-object references
- Test with large data volumes
### 3. Bypass Patterns
```javascript
// Allow system integrations to bypass
AND(NOT(($User.Profile.Name = 'Integration User')), ISBLANK(Required_Field__c));
```
### 4. Testing Considerations
```javascript
// Include test bypass for data loads
AND(NOT($Setup.Validation_Settings__c.Bypass_Validation__c), ISBLANK(Required_Field__c));
```
## Common Issues and Solutions
### Issue 1: Validation on Formula Fields
```javascript
// Problem: Cannot use ISCHANGED on formula fields
// Solution: Use component fields
AND(ISCHANGED(Component_Field_1__c), Formula_Field__c > 100);
```
### Issue 2: Null vs Blank
```javascript
// Handle both null and blank
OR(ISBLANK(Field__c), ISNULL(Field__c));
```
### Issue 3: Picklist Validation
```javascript
// Proper picklist validation
AND(NOT(ISPICKVAL(Status__c, '')), NOT(ISPICKVAL(Status__c, 'Active')), NOT(ISPICKVAL(Status__c, 'Inactive')));
```
## Validation Rule Templates
### Financial Validation Template
```javascript
// Template: Financial amount validation
AND(
/* Check if amount field is populated */
NOT(ISBLANK(Amount_Field__c)),
/* Validate amount is positive */
Amount_Field__c <= 0,
/* Check business rules */
OR(
/* Condition 1: Amount exceeds limit */
Amount_Field__c > Maximum_Allowed__c,
/* Condition 2: Requires approval */
AND(Amount_Field__c > Approval_Threshold__c, Approval_Status__c != 'Approved')
)
);
```
### Data Quality Template
```javascript
// Template: Ensure data quality standards
OR(
/* Check required fields */
ISBLANK(Required_Field_1__c),
ISBLANK(Required_Field_2__c),
/* Validate formats */
AND(NOT(ISBLANK(Email_Field__c)), NOT(CONTAINS(Email_Field__c, '@'))),
/* Check data consistency */
Field_A__c > Field_B__c
);
```
## Additional Resources
- [Salesforce Validation Rule Examples](https://help.salesforce.com/s/articleView?id=sf.fields_validation_rules_examples.htm)
- [Formula Function Reference](https://help.salesforce.com/s/articleView?id=sf.customize_functions.htm)
- [Validation Rule Best Practices](https://developer.salesforce.com/docs/atlas.en-us.usefulValidationFormulas.meta/usefulValidationFormulas/)
- [Trailhead: Data Quality](https://trailhead.salesforce.com/en/content/learn/modules/data_quality)