Event Context Naming Standards
Overview
This document defines the standardized naming conventions for all event context dictionaries dispatched through the ProcessEventDispatcher service. These standards ensure consistency across all entity types and make BPM process definitions easier to write and maintain.
Last Updated: December 23, 2024
Status: ✅ Fully Implemented (26 dispatch points across 10 handlers)
Why Standardization Matters
Before Standardization âŒ
// Inconsistent field names across entities
if (context.loanStatus === "Active") { }
if (context.rechargeStatus === "SUCCESSFUL") { }
if (context.transferStatus === "Pending") { }
if (context.reconciliationStatus === "Manual") { }
Problems:
- BPM developers must remember entity-specific field names
- Generic process logic cannot be reused
- Documentation becomes entity-specific
After Standardization ✅
// Consistent field names across ALL entities
if (context.status === 2) { } // Numeric comparison (fast)
if (context.statusDescription === "SUCCESSFUL") { } // String for display
Benefits:
- Consistent naming across all 26 dispatch points
- Generic BPM process templates work across entity types
- Type-safe numeric comparisons
- Clear documentation with enum mappings
Core Principles
1. Status Field Naming
Rule: All status-related fields must be named status (or accountStatus for account entities), NOT entity-specific names.
✅ Correct:
Implementation details removed for security.
Contact support for implementation guidance.
⌠Incorrect:
Implementation details removed for security.
Contact support for implementation guidance.
Rationale:
- Consistent naming across all entities
- Simplified BPM condition logic
- Easier documentation and training
2. Enum Value Convention
Rule: Always send BOTH the integer enum value AND a human-readable description.
Format:
Implementation details removed for security.
Contact support for implementation guidance.
Example:
Implementation details removed for security.
Contact support for implementation guidance.
Benefits:
- Performance: Numeric comparisons faster than string comparisons
- Type Safety: BPM conditions use integers (compile-time checking)
- Flexibility: Description available for logging, UI display, debugging
- Future-Proof: Easy to add new enum values without breaking existing processes
3. Account Number Naming
Rule: Use accountNumber consistently, NOT entity-specific variations.
✅ Correct:
Implementation details removed for security.
Contact support for implementation guidance.
⌠Incorrect:
Implementation details removed for security.
Contact support for implementation guidance.
4. Transaction Commit Order
Rule: ALWAYS ensure database transaction is committed BEFORE dispatching events.
✅ Correct:
Implementation details removed for security.
Contact support for implementation guidance.
⌠Incorrect:
Implementation details removed for security.
Contact support for implementation guidance.
Rationale:
- Processes query database for entity data
- Dispatching before commit creates race conditions
- Failed commits after dispatch create inconsistent state
Entity-Specific Implementations
1. Contact (Customer) Events
Handler: AdministrationCoreContactCommandHandlers.cs
Event: OnCustomerCreation
Entity Type: Contact (2)
Context Fields:
Implementation details removed for security.
Contact support for implementation guidance.
Status Enum: ClientState
Pending= 0 - Awaiting KYC verificationActive= 1 - Fully onboardedInactive= 2 - Temporarily disabledRejected= 3 - Failed KYCBlacklisted= 4 - Restricted for fraud/compliance
Type Enum: ClientType.Id (from lookup table)
- Individual, Corporate, Government, etc.
Use Cases:
- Auto-create deposit account after KYC approval
- Trigger welcome email/SMS
- Apply customer tier benefits
- AML/KYC verification workflows
2. Loan Account Events
Handler: AdministrationCoreLoanCommandHandlers.cs
Event: OnLoanCreation
Entity Type: Loan (3)
Context Fields:
Implementation details removed for security.
Contact support for implementation guidance.
Status Enum: LoanState
Pending= 0 - Awaiting approval/disbursementActive= 1 - Disbursed and repayingClosed= 2 - Fully repaidWrittenOff= 3 - Bad debtDefaulted= 4 - Past due
Use Cases:
- Multi-level loan approval workflows
- Automated disbursement after final approval
- Repayment reminders
- Default management processes
- Loan restructuring workflows
3. Deposit Account Events
Handler: AdministrationCoreDepositCommandHandlers.cs
Event: OnAccountCreation
Entity Type: Deposit (4)
Context Fields:
Implementation details removed for security.
Contact support for implementation guidance.
Account Type Enum: DepositAccountType
Savings= 1 - Standard savings accountCurrent= 2 - No interest, transaction accountFixed= 3 - Term deposit with penalty for early withdrawalCall= 4 - High-value, notice required
Account Status Enum: DepositState
Pending= 0 - Awaiting activationActive= 1 - OperationalDormant= 2 - No activity for extended periodClosed= 3 - Permanently closedLocked= 4 - Frozen for legal/compliance
Use Cases:
- Account opening approval workflows
- Welcome kit generation
- ATM card issuance
- Dormancy detection and reactivation
- Account closure workflows
4. Teller Transaction Events
Handler: AdministrationCoreTelleringTransactionCommandHandlers.cs
Events: Multiple (9 transaction types)
Entity Type: Teller (13)
Context Fields:
Implementation details removed for security.
Contact support for implementation guidance.
Status Enum: CBSTransactionHoldState
Processed= 0 - Transaction completedHeld= 1 - Requires authorizationReleased= 2 - Hold released, transaction processedReversed= 3 - Transaction reversed
Transaction Types Covered:
- Cash Deposit
- Cash Withdrawal
- Transfer
- Balance Inquiry
- Check Deposit
- Check Withdrawal
- Bill Payment
- Account Statement
- Other
Use Cases:
- Large transaction authorization workflows
- Fraud alert triggers
- Supervisor approval for held transactions
- End-of-day reconciliation
- Cash position management
5. Reconciliation Events
Handler: ReconcilliationJobCommandHandlers.cs
Events: OnReconciliationDataUpdate, OnReconciliationJobCompletion
Entity Type: Reconciliation (200)
Event 1: OnReconciliationDataUpdate (Manual Reconciliation)
Implementation details removed for security.
Contact support for implementation guidance.
Event 2: OnReconciliationJobCompletion (Automated Job)
Implementation details removed for security.
Contact support for implementation guidance.
Status Enums:
ReconciliationStatusEnum: Manual, Automated, Pending, CompletedReconciliationJobStatusEnum: Running, Completed, Failed, Cancelled
Use Cases:
- Exception handling workflows
- Email notifications for reconciliation failures
- Escalation for unmatched transactions
- Performance monitoring and alerts
6. Self-Service Channel Events
All self-service channel events follow the same standardized pattern.
A. Airtime Recharge
Handler: SelfServiceBankingTransactionCommand.cs
Events: OnAirtimeRechargeTransactionInitiated, OnAirtimeRechargeTransactionFailed, OnAirtimeRechargeTransactionCompleted
Entity Type: AirtimeRecharge (104)
Context Fields:
Implementation details removed for security.
Contact support for implementation guidance.
B. Data Recharge
Handler: SelfServiceBankingTransactionCommand.cs
Events: OnDataRechargeTransactionInitiated, OnDataRechargeTransactionFailed, OnDataRechargeTransactionCompleted
Entity Type: DataRecharge (105)
Context Fields:
Implementation details removed for security.
Contact support for implementation guidance.
C. Bills Payment
Handler: SelfServiceBankingTransactionCommand.cs
Events: OnBillsPaymentTransactionInitiated, OnBillsPaymentTransactionFailed, OnBillsPaymentTransactionCompleted
Entity Type: BillsPayment (103)
Context Fields:
Implementation details removed for security.
Contact support for implementation guidance.
D. Funds Transfer
Handler: SelfServiceBankingTransactionCommand.cs
Events: OnTransferInitiated, OnTransferCompleted (used for both success and failure)
Entity Type: Transfer (102)
Context Fields:
Implementation details removed for security.
Contact support for implementation guidance.
Transfer Variations:
- IntraBank Individual: Same bank, individual account
- IntraBank Corporate: Same bank, corporate account with multi-level approval
- InterBank: Different bank via NIP
- IntraBankLingo: Transfer to another BankLingo tenant
E. Loan Request
Handler: SelfServiceLoanBankingTransactionCommand.cs
Event: OnLoanRequestSubmitted
Entity Type: LoanRequest (101)
Context Fields:
Implementation details removed for security.
Contact support for implementation guidance.
Status Enum: ApprovalState
Pending= 0 - Awaiting reviewApproved= 1 - Request approvedRejected= 2 - Request rejectedCancelled= 3 - User cancelled
Self-Service Transaction Status Enum
All self-service channel transactions (except Loan Request) use the SelfServiceTransactionStatus enum:
| Value | Name | Description | Use Case |
|---|---|---|---|
| 0 | PENDING | Transaction initiated, awaiting processing | Show "processing" to user |
| 1 | PROCESSING | Currently being processed by provider | Real-time status update |
| 2 | SUCCESSFUL | Transaction completed successfully | Credit account, send receipt |
| 3 | FAILED | Transaction failed (includes failureReason) | Reverse transaction, notify user |
| 4 | REVERSED | Transaction was reversed | Refund processing |
BPM Condition Example:
// Check if transaction succeeded
if (context.status === 2) {
// Send success SMS
}
// Check if transaction failed
if (context.status === 3) {
// Log failure reason: context.failureReason
// Trigger retry workflow
}
Standard Implementation Pattern
Complete Example
Implementation details removed for security.
Contact support for implementation guidance.
Key Implementation Points
- ✅ Dependency Injection: Inject
IProcessEventDispatchervia constructor - ✅ Commit Order: ALWAYS
SaveChanges()BEFORE dispatching - ✅ Error Handling: Wrap dispatch in try-catch, log warnings, don't fail transaction
- ✅ Status Fields: Use
status(not entity-specific names) with integer enum + description - ✅ User Tracking: Include
userIdandinitiatorUserIdfor channel requests - ✅ Triggered By: Pass username or "System" to track who triggered the process
Implementation Status
✅ Complete (26 dispatch points across 10 handlers - 100%)
Core Banking Handlers (11 events)
- ✅ Contact - 1 event:
OnCustomerCreation - ✅ Loan - 1 event:
OnLoanCreation - ✅ Deposit - 1 event:
OnAccountCreation - ✅ Teller - 9 events: All transaction types (Deposit, Withdrawal, Transfer, etc.)
- ✅ Reconciliation - 2 events: Manual update, Job completion
Self-Service Channel Handlers (15 events)
- ✅ Airtime Recharge - 3 events: Initiated, Failed, Completed
- ✅ Data Recharge - 3 events: Initiated, Failed, Completed
- ✅ Bills Payment - 3 events: Initiated, Failed, Completed
- ✅ Funds Transfer - 6 events: Initiated, Failed (IntraBank/InterBank), Completed (IntraBank Individual/Corporate/InterBank)
- ✅ Loan Request - 1 event: Submitted
Files Modified: 8 handler files
Build Status: ✅ No compilation errors
Documentation: ✅ Complete
BPM Process Examples
Example 1: Large Transfer Approval
// Process Definition Trigger
{
"event": "onTransferInitiated",
"entityType": "transfer",
"condition": "status === 0 && amount > 1000000", // Pending transfers over 1M
"variables": {
"transferAmount": "{{ amount }}",
"sourceAccount": "{{ sourceAccountNumber }}",
"destAccount": "{{ destinationAccountNumber }}",
"transferType": "{{ transferType }}"
}
}
// Script Task: Check Transfer Limits
if (context.amount > 5000000) {
// Require CEO approval
context.approvalLevel = 3;
} else if (context.amount > 1000000) {
// Require Manager approval
context.approvalLevel = 2;
}
// Service Task: Update Transfer Status
{
"serviceType": "updateEntity",
"entityType": "Transfer",
"entityId": "{{ entityId }}",
"updates": {
"status": 2, // SUCCESSFUL
"approvedBy": "{{ approverUsername }}",
"approvedAt": "{{ now() }}"
}
}
Example 2: Failed Recharge Retry
// Process Definition Trigger
{
"event": "onAirtimeRechargeTransactionFailed",
"entityType": "airtimeRecharge",
"condition": "status === 3", // FAILED status
"variables": {
"phoneNumber": "{{ phoneNumber }}",
"amount": "{{ amount }}",
"provider": "{{ provider }}",
"failureReason": "{{ failureReason }}"
}
}
// Script Task: Determine Retry Strategy
if (context.failureReason.includes("timeout")) {
context.retryCount = 3;
context.retryDelay = 300; // 5 minutes
} else if (context.failureReason.includes("insufficient funds")) {
// Don't retry - notify user
context.retryCount = 0;
}
// Timer Event: Wait before retry
{
"duration": "{{ retryDelay }}s"
}
// Service Task: Retry Recharge
{
"serviceType": "retryTransaction",
"transactionId": "{{ entityId }}",
"transactionType": "airtimeRecharge"
}
Migration Guide
For BPM Process Developers
If you have existing process definitions using old field names, update them as follows:
Old Field Names → New Field Names:
loanStatus→statusrechargeStatus→statuspaymentStatus→statustransferStatus→statusrequestStatus→statusreconciliationStatus→statusholdState→accountStatus(Teller transactions)loanAccountNumber→accountNumber
String Comparisons → Numeric Comparisons (recommended):
// Old (still works via statusDescription)
if (context.transferStatus === "SUCCESSFUL") { }
// New (recommended - faster, type-safe)
if (context.status === 2) { } // SelfServiceTransactionStatus.SUCCESSFUL
// Alternative (for readability)
if (context.statusDescription === "SUCCESSFUL") { }
Testing Checklist
When testing event dispatcher integration:
- Event dispatched AFTER database commit (not before)
- Status field named
statusoraccountStatus(not entity-specific) - Status sent as integer enum value
- StatusDescription sent as string
- All required context fields present
- User tracking included for channel requests (
userId,initiatorUserId) -
triggeredByparameter populated - Dispatch wrapped in try-catch with warning log
- Failed dispatch does not fail the transaction
- Process definition can read all context fields
- BPM conditions work with integer status values
Benefits Summary
For Developers
✅ Consistent patterns across all handlers
✅ Type-safe enum values
✅ Clear documentation and examples
✅ Reduced cognitive load
For BPM Process Authors
✅ Predictable field names
✅ Reusable process templates
✅ Faster condition evaluation
✅ Better debugging with statusDescription
For System Performance
✅ Numeric comparisons faster than strings
✅ Reduced payload size
✅ Better database query optimization
For Maintenance
✅ Single source of truth for enum values
✅ Easy to add new status values
✅ Backward compatible via statusDescription
Related Documentation
- Event-Driven Process Architecture - Overall architecture
- Process Engine Overview - Process engine documentation
- Service Tasks - Service task implementation
- Variables Guide - Process variable handling
- DISPATCHER_EVENT_NAMING_STANDARDS.md - Technical implementation details
Version: 2.0
Last Updated: December 23, 2024
Status: ✅ Production Ready
Author: BankLingo Development Team