Trigger Name: I2C_ProcessOrderReturnTrigger¶
Last Updated: 2025-10-22 Source Code: https://github.com/AANP-IT/I2C.Salesforce.Metadata/blob/STAGING/force-app/main/default/triggers/I2C_ProcessOrderReturnTrigger.trigger
API Name: I2C_ProcessOrderReturnTrigger Object: Process_Order_Refund__e (Platform Event) Pattern: Framework Pattern (TriggerHandler)
Business Purpose¶
This trigger responds to Process_Order_Refund__e platform events to initiate automated refund processing workflows. It provides event-driven architecture for order refunds, enabling decoupled, scalable processing of refund requests from various sources (UI actions, integrations, batch processes) without tight coupling to the triggering system.
Trigger Events¶
This trigger fires on the following events: - ☐ Before Insert - ☐ Before Update - ☐ Before Delete - ☑️ After Insert (Platform Events only support after insert) - ☐ After Update - ☐ After Delete - ☐ After Undelete
Trigger Handler¶
Handler Class: I2C_ProcessOrderReturnTriggerHandler.cls Pattern: Framework Pattern - Extends TriggerHandler base class Entry Point: Handler instantiation with execute() method
trigger I2C_ProcessOrderReturnTrigger on Process_Order_Refund__e (after insert) {
new I2C_ProcessOrderReturnTriggerHandler().execute();
}
Process Flow by Event¶
After Insert¶
Purpose: Capture refund event and initiate refund processing workflow
Business Logic: 1. Extract OrderId__c values from all Process_Order_Refund__e events 2. Collect unique Order IDs into a Set 3. Call I2C_RefundOrder.processOrders() with Order IDs 4. Refund processing logic handles querying orders and initiating refunds
Methods Called:
- I2C_ProcessOrderReturnTriggerHandler.afterInsert(Map<Id, SObject> newRecordsMap) (inherited from TriggerHandler)
- I2C_RefundOrder.processOrders(Set<Id> orderIds)
Related Records Processed: - Order records identified by OrderId__c in platform events - Downstream payment/refund records (handled by I2C_RefundOrder)
Key Business Rules¶
Validation Rules¶
- Platform events must contain valid OrderId__c values
- Refund processing logic (in I2C_RefundOrder) likely validates order eligibility
Field Updates¶
- No direct field updates in trigger (processing handled by I2C_RefundOrder)
Related Record Operations¶
- Orders queried and processed for refunds
- Payment/transaction records likely created or updated by refund logic
Bulkification & Governor Limits¶
Bulkified: Yes (Platform Events) Max Records Handled: Platform Events can handle up to 2,000 events per transaction SOQL Queries: 0 in trigger (queries in I2C_RefundOrder class) DML Operations: 0 in trigger (DML in refund processing logic)
Bulkification Strategy¶
- Platform Events inherently support bulk publishing
- Trigger collects all Order IDs from all events in batch
- Single call to I2C_RefundOrder.processOrders() with all Order IDs
- Refund processing handles multiple orders in single transaction
Governor Limit Considerations¶
- Platform Event Limits: 2,000 events per transaction, 250,000 per 24 hours
- SOQL: Queries happen in I2C_RefundOrder (not in trigger)
- DML: DML operations happen in refund processing logic
- Async Limits: May use Queueable/Future methods for payment processing
Recursion Prevention¶
Strategy: Platform Events cannot trigger themselves
Implementation: - Platform Events are fire-and-forget - Events do not re-trigger on DML operations - Natural protection from recursion due to event architecture
Scenarios: - No recursion risk with platform events - Event processing is one-way (event -> processing -> completion)
Execution Order & Dependencies¶
Order of Execution Impact¶
- Platform Events fire after the publishing transaction commits
- Processing happens asynchronously after event delivery
- Event triggers run in separate transaction from publishing transaction
Dependent Triggers¶
- OrderTrigger: May fire when orders are updated during refund processing
- Risk: Minimal - event processing is decoupled from order triggers
Dependent Processes¶
- I2C_RefundOrder: Core refund processing logic
- I2C_QueueableRefund: Likely handles async payment gateway calls
- Payment Gateway Integration: External system for actual refund execution
Error Handling¶
Strategy: Platform Event error handling with retry
User Experience: - Success: Event processed, refund initiated - Event Delivery Failure: Salesforce automatically retries event delivery - Processing Error: Error occurs in I2C_RefundOrder logic, event still acknowledged
Logging: - Platform Events provide built-in event delivery monitoring - Application-level logging should be in I2C_RefundOrder class - Event Bus monitoring available in Event Manager
Rollback Behavior: - Event publishing transaction separate from processing transaction - Processing errors don't rollback event publication - Failed processing should be logged and may require manual retry
Dependencies¶
Apex Classes¶
I2C_ProcessOrderReturnTriggerHandler: Handler extending TriggerHandlerTriggerHandler: Base framework classI2C_RefundOrder: Core refund processing logicI2C_QueueableRefund: Async payment processing (likely)
Salesforce Objects¶
Process_Order_Refund__e: Platform Event objectOrder: Standard object being processed- Payment/Transaction objects (implementation-specific)
Custom Settings/Metadata¶
- Platform Event Channel Settings (Salesforce managed)
External Systems¶
- Payment Gateway/Processor for actual refund execution
Testing¶
Test Class: I2C_ProcessOrderReturnTriggerHandler likely has corresponding test class Coverage: Unknown
Test Scenarios: - Single event publication and processing - Bulk event publication (multiple events) - Invalid Order IDs in events - Event processing with refund logic errors - Platform Event delivery and acknowledgment - Test.getEventBus().deliver() for event testing
Performance Considerations¶
Average Execution Time: Fast (trigger only routes to handler) Max Records Processed: Up to 2,000 events per transaction Async Processing: Yes - Platform Events are inherently async
Optimization Opportunities: - Already optimized with platform event architecture - Ensure I2C_RefundOrder handles bulk processing efficiently - Monitor Event Bus delivery metrics - Consider event batching if high volume
Changes & History¶
- Author: I2C development team
- Pattern: Modern event-driven architecture using Platform Events and TriggerHandler framework
Pre-Go-Live Concerns¶
CRITICAL - Fix Before Go-Live¶
- No Error Handling in Trigger: Trigger assumes I2C_RefundOrder will handle all errors. Need try-catch wrapper
- Event Idempotency: No mechanism to prevent duplicate refund processing if same event delivered multiple times
- Order ID Validation: No validation that OrderId__c values are valid before processing
HIGH - Address Soon After Go-Live¶
- No Logging in Trigger: Add logging of event receipt and Order IDs being processed
- Event Monitoring: Implement monitoring dashboard for event processing success/failure rates
- Error Notifications: Set up alerts for refund processing failures
- Event Replay Strategy: Document how to replay events in case of processing failures
MEDIUM - Future Enhancement¶
- Event Deduplication: Implement deduplication logic using event replay ID or custom tracking
- Batch Processing: Consider batching for extremely high volumes
- Event Archiving: Strategy for long-term event history and audit
- Rate Limiting: Protection against event flood scenarios
LOW - Monitor¶
- Event Bus Limits: Monitor daily and hourly platform event limits
- Processing Latency: Track time between event publication and processing completion
- Event Delivery Metrics: Use Event Manager to monitor delivery rates
Maintenance Notes¶
Complexity: Low-Medium Recommended Review Schedule: Quarterly (or when refund logic changes)
Key Maintainer Notes: - This trigger uses Platform Events for event-driven architecture - very different from standard triggers - Platform Events are asynchronous and transactional - event published AFTER transaction commits - Testing Platform Events requires Test.getEventBus().deliver() method - Platform Events have separate governor limits from standard Apex - Event delivery is guaranteed but may be delayed under high load - Events cannot be rolled back once published - Use Event Monitor in Setup to troubleshoot delivery issues
Deactivation Instructions: Platform Event triggers cannot be easily disabled in production. Options:
-
Modify trigger to check custom metadata:
-
Stop publishing events at the source (preferred for temporary disable)
Event Replay Considerations: - Platform Events support event replay using replay ID - Replay window is 72 hours (3 days) - Implement idempotency to handle replay scenarios safely - Test replay scenarios in sandbox before go-live