Skip to main content

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:

Code Removed

Implementation details removed for security.

Contact support for implementation guidance.

❌ Incorrect:

Code Removed

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:

Code Removed

Implementation details removed for security.

Contact support for implementation guidance.

Example:

Code Removed

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:

Code Removed

Implementation details removed for security.

Contact support for implementation guidance.

❌ Incorrect:

Code Removed

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:

Code Removed

Implementation details removed for security.

Contact support for implementation guidance.

❌ Incorrect:

Code Removed

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:

Code Removed

Implementation details removed for security.

Contact support for implementation guidance.

Status Enum: ClientState

  • Pending = 0 - Awaiting KYC verification
  • Active = 1 - Fully onboarded
  • Inactive = 2 - Temporarily disabled
  • Rejected = 3 - Failed KYC
  • Blacklisted = 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:

Code Removed

Implementation details removed for security.

Contact support for implementation guidance.

Status Enum: LoanState

  • Pending = 0 - Awaiting approval/disbursement
  • Active = 1 - Disbursed and repaying
  • Closed = 2 - Fully repaid
  • WrittenOff = 3 - Bad debt
  • Defaulted = 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:

Code Removed

Implementation details removed for security.

Contact support for implementation guidance.

Account Type Enum: DepositAccountType

  • Savings = 1 - Standard savings account
  • Current = 2 - No interest, transaction account
  • Fixed = 3 - Term deposit with penalty for early withdrawal
  • Call = 4 - High-value, notice required

Account Status Enum: DepositState

  • Pending = 0 - Awaiting activation
  • Active = 1 - Operational
  • Dormant = 2 - No activity for extended period
  • Closed = 3 - Permanently closed
  • Locked = 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:

Code Removed

Implementation details removed for security.

Contact support for implementation guidance.

Status Enum: CBSTransactionHoldState

  • Processed = 0 - Transaction completed
  • Held = 1 - Requires authorization
  • Released = 2 - Hold released, transaction processed
  • Reversed = 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)

Code Removed

Implementation details removed for security.

Contact support for implementation guidance.

Event 2: OnReconciliationJobCompletion (Automated Job)

Code Removed

Implementation details removed for security.

Contact support for implementation guidance.

Status Enums:

  • ReconciliationStatusEnum: Manual, Automated, Pending, Completed
  • ReconciliationJobStatusEnum: 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:

Code Removed

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:

Code Removed

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:

Code Removed

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:

Code Removed

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:

Code Removed

Implementation details removed for security.

Contact support for implementation guidance.

Status Enum: ApprovalState

  • Pending = 0 - Awaiting review
  • Approved = 1 - Request approved
  • Rejected = 2 - Request rejected
  • Cancelled = 3 - User cancelled

Self-Service Transaction Status Enum

All self-service channel transactions (except Loan Request) use the SelfServiceTransactionStatus enum:

ValueNameDescriptionUse Case
0PENDINGTransaction initiated, awaiting processingShow "processing" to user
1PROCESSINGCurrently being processed by providerReal-time status update
2SUCCESSFULTransaction completed successfullyCredit account, send receipt
3FAILEDTransaction failed (includes failureReason)Reverse transaction, notify user
4REVERSEDTransaction was reversedRefund 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

Code Removed

Implementation details removed for security.

Contact support for implementation guidance.

Key Implementation Points

  1. ✅ Dependency Injection: Inject IProcessEventDispatcher via constructor
  2. ✅ Commit Order: ALWAYS SaveChanges() BEFORE dispatching
  3. ✅ Error Handling: Wrap dispatch in try-catch, log warnings, don't fail transaction
  4. ✅ Status Fields: Use status (not entity-specific names) with integer enum + description
  5. ✅ User Tracking: Include userId and initiatorUserId for channel requests
  6. ✅ 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 → status
  • rechargeStatus → status
  • paymentStatus → status
  • transferStatus → status
  • requestStatus → status
  • reconciliationStatus → status
  • holdState → 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 status or accountStatus (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)
  • triggeredBy parameter 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



Version: 2.0
Last Updated: December 23, 2024
Status: ✅ Production Ready
Author: BankLingo Development Team