UNPKG

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
# 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)