Skip to main content

Vault Funding Transaction

Fund branch vault from external source (CIT company, Head Office, Bank transfer).

Overview​

Vault funding transactions allow branch managers to increase vault cash balances from external sources such as Cash-In-Transit (CIT) companies, head office transfers, or bank deposits. This is the primary mechanism for injecting cash into the branch cash management ecosystem.

Key Features:

  • External cash injection to vault
  • Multiple funding sources (CIT, Head Office, Bank Transfer)
  • Vault balance increase
  • No till involvement (direct to vault)
  • Reconciliation with external records
  • Concurrent transaction safety

Transaction Flow​


Entities Impacted​

Command: FundBranchVaultAccountCommand

CIT Funding Scenario​

ImpactedEntities:
[
{
entityType: "Vault",
entityId: 555,
fieldName: "Balance",
oldValue: 500000.00,
newValue: 1500000.00,
deltaAmount: +1000000.00
},
{
entityType: "Vault",
entityId: 555,
fieldName: "TransactionCount",
oldValue: 15,
newValue: 16,
deltaAmount: +1
},
{
entityType: "VaultFunding",
entityId: 777,
fieldName: "FundingSource",
oldValue: null,
newValue: "CIT",
deltaAmount: 0
},
{
entityType: "VaultFunding",
entityId: 777,
fieldName: "Amount",
oldValue: 0,
newValue: 1000000.00,
deltaAmount: +1000000.00
},
{
entityType: "VaultFunding",
entityId: 777,
fieldName: "ExternalReference",
oldValue: null,
newValue: "CIT-2025-001234",
deltaAmount: 0
},
{
entityType: "GLAccount",
entityKey: "1040-CASH-IN-VAULT",
fieldName: "DebitAmount",
deltaAmount: +1000000.00
},
{
entityType: "GLAccount",
entityKey: "2100-CIT-SUSPENSE",
fieldName: "CreditAmount",
deltaAmount: +1000000.00
}
]
```text
---

## Implementation

**Command**: `FundBranchVaultAccountCommand`

:::warning[Code Removed]
**Implementation details removed for security.**

Contact support for implementation guidance.
:::text
---

## Funding Sources

### 1. CIT (Cash-In-Transit) Company

**Use Case**: External cash delivery service

**GL Posting**:

```text
DR: 1040-Cash-in-Vault ₦1,000,000
CR: 2100-CIT-Suspense ₦1,000,000
```text
**Reconciliation**: When CIT invoice received, clear suspense account

### 2. Head Office Transfer

**Use Case**: Internal cash transfer from head office

**GL Posting**:

```text
DR: 1040-Cash-in-Vault ₦500,000
CR: 2200-Head-Office-Account ₦500,000
```text
**Reconciliation**: Automatic via inter-branch settlement

### 3. Bank Transfer

**Use Case**: Cash withdrawal from bank account

**GL Posting**:

```text
DR: 1040-Cash-in-Vault ₦200,000
CR: 1010-Bank-Account ₦200,000
```text
**Reconciliation**: Match with bank statement

---

## Validation Rules

| Rule | Check | Error Message |
|------|-------|---------------|
| **Vault Exists** | Vault found | "Vault not found" |
| **Vault Active** | `VaultAccountState == OPENED` | "Vault is not active" |
| **Amount Valid** | `Amount > 0` | "Amount must be greater than zero" |
| **External Reference** | Reference provided | "External reference is required" |
| **No Duplicate** | Reference not used | "Duplicate external reference: {reference}" |
| **Funding Source** | Valid source enum | "Invalid funding source" |

---

## GL Account Postings

| Account | Debit (Dr) | Credit (Cr) | Description |
|---------|------------|-------------|-------------|
| **Cash-in-Vault Asset** | Amount | - | Increase vault cash |
| **External Source** | - | Amount | CIT Suspense / Head Office / Bank Account |

---

## Testing

### Test Scenario 1: CIT Funding

**Setup**:
- Vault Balance: ₦500,000
- CIT Delivery: ₦1,000,000
- External Reference: CIT-2025-001234

**Expected Results**:

```typescript
Vault:
Balance: 500000 → 1500000 ✓
TransactionCount: +1 ✓

VaultFunding:
FundingSource: CIT ✓
Amount: ₦1,000,000 ✓
ExternalReference: "CIT-2025-001234" ✓
Status: COMPLETED ✓

GLEntries:
DR: Cash-in-Vault: ₦1,000,000 ✓
CR: CIT-Suspense: ₦1,000,000 ✓
```text
### Test Scenario 2: Duplicate Reference

**Setup**:
- Previous Funding: CIT-2025-001234 already exists
- New Funding: Same reference CIT-2025-001234

**Expected Results**:

```typescript
Validation:
Error: "Duplicate external reference: CIT-2025-001234" ✓
Transaction: REJECTED ✓

Vault Balance: NO CHANGE ✓
```text
---

## Reconciliation Process

### CIT Reconciliation

1. **Receive Cash**: Physical cash delivered by CIT
2. **Record Funding**: `FundBranchVaultAccountCommand` executed
3. **Receive Invoice**: CIT company sends invoice
4. **Match Records**: Compare funding record with invoice
5. **Clear Suspense**: Post journal entry to clear suspense

```text
DR: 2100-CIT-Suspense ₦1,000,000
CR: 2300-CIT-Payable ₦1,000,000
```text
### Head Office Reconciliation

1. **Request Funding**: Branch requests cash from head office
2. **Approve Transfer**: Head office approves
3. **Record Funding**: `FundBranchVaultAccountCommand` executed
4. **Auto-Settlement**: Inter-branch settlement automatically reconciles

### Bank Transfer Reconciliation

1. **Withdraw from Bank**: Branch manager withdraws from bank
2. **Record Funding**: `FundBranchVaultAccountCommand` executed
3. **Bank Statement**: Receive bank statement
4. **Match Transaction**: Compare with bank records

---

## V2 API Commands

BankLingo V2 provides a BPMCore-compatible command for vault funding operations.

### Architecture Overview

The V2 vault funding command follows the **BPMCore Command Pattern**:

- **V2 Command**: `FundBranchVaultAccountCommand` (BPMCore compatible)
- **BPM Integration**: Accepts parameters via `BpmUtil.GetPropertyValue()`
- **Impact Tracking**: Full impact tracking via `TransactionImpactTracker`
- **State Management**: PENDING → SETTLED
- **External Reconciliation**: Links to external funding sources

**Implementation**: `CB.Administration.Api/Commands/BPMCore/Tellering/AdministrationCoreTelleringTransactionCommandHandlers.cs`

---

### FundBranchVaultAccountCommand

**Purpose**: Fund branch vault from external source (increase vault cash balance)

**Command**: `FundBranchVaultAccountCommand`

**Transaction State**: PENDING → SETTLED

#### BPM Parameters

```json
{
"commandName": "FundBranchVaultAccountCommand",
"data": {
"vaultId": "string (mandatory)",
"amount": "decimal (mandatory)",
"fundingSource": "string (optional)",
"externalReference": "string (optional)",
"transactionDate": "DateTime (optional)",
"notes": "string (optional)"
}
}

Parameter Details​

ParameterTypeRequiredDescription
vaultIdstring✅ YesBranch vault ID to fund
amountdecimal✅ YesFunding amount (must be > 0)
fundingSourcestring❌ NoSource type (e.g., "CIT", "HEAD_OFFICE", "BANK_TRANSFER")
externalReferencestring❌ NoExternal reference (CIT reference, transfer ID)
transactionDateDateTime❌ NoFunding date (defaults to today)
notesstring❌ NoFunding notes/remarks

Balance Impact​

Branch Vault:

Balance FieldChangeReason
CashBalance+amountVault funded
AvailableBalance+amountAvailable for till replenishment
TotalFunding+amountTrack total inflow
TransactionCount+1Transaction counter
LastUpdateDateSet to nowTrack last update

GL Accounts:

AccountDebit/CreditAmountDescription
Cash-in-VaultDebit+amountIncrease vault asset
External SourceCredit+amountCIT suspense/Head office/Bank account

Validation Rules​

✅ Vault Validation:

  • Vault must exist and be active
  • Vault must not be locked or suspended
  • Amount currency must match vault currency

✅ Amount Validation:

  • Amount must be > 0
  • No maximum limit (vaults can hold large amounts)

✅ Source Validation (if specified):

  • External reference should be provided for audit
  • Funding source should be valid type

Example Request/Response​

Request:

{
"commandName": "FundBranchVaultAccountCommand",
"data": {
"vaultId": "VAULT-HQ-001",
"amount": 5000000.00,
"fundingSource": "CIT",
"externalReference": "CIT-2025-001234",
"transactionDate": "2025-12-29T08:00:00Z",
"notes": "Weekly CIT delivery - G4S"
}
}

Response:

{
"isSuccessful": true,
"transactionId": "TXN-VAULT-FUND-20251229-0001",
"transactionState": "SETTLED",
"message": "Vault funded successfully",
"data": {
"vaultId": "VAULT-HQ-001",
"branchName": "Head Office",
"amount": 5000000.00,
"fundingSource": "CIT",
"externalReference": "CIT-2025-001234",
"transactionDate": "2025-12-29T08:00:00Z",
"vaultBalance": {
"previousBalance": 2000000.00,
"newBalance": 7000000.00,
"totalFunding": 50000000.00
},
"impactRecords": 6
}
}

Impact Tracking​

Impacted Entities:

  • ✅ Branch Vault (5 field changes: cash balance, available balance, total funding, transaction count, last update)
  • ✅ GL Accounts (2 entries: vault DR, external source CR)
  • ✅ Vault Funding Record (external reference tracking)

Use Cases​

1. CIT Delivery:

{
"vaultId": "VAULT-BRANCH-05",
"amount": 10000000.00,
"fundingSource": "CIT",
"externalReference": "G4S-2025-W52-001",
"notes": "Weekly CIT delivery - G4S"
}

2. Head Office Transfer:

{
"vaultId": "VAULT-BRANCH-02",
"amount": 3000000.00,
"fundingSource": "HEAD_OFFICE",
"externalReference": "HO-TRF-20251229-045",
"notes": "Inter-branch transfer from HO"
}

3. Bank Transfer Credit:

{
"vaultId": "VAULT-BRANCH-10",
"amount": 2500000.00,
"fundingSource": "BANK_TRANSFER",
"externalReference": "BANK-DEP-20251229-789",
"notes": "Bank deposit for vault replenishment"
}

Business Rules​

  1. No Maximum Limit: Vaults can hold large amounts (unlike tills with maximum balance)
  2. External Reconciliation: All fundings should have external reference for reconciliation
  3. Audit Trail: Full audit trail with funding source, reference, and amount
  4. Physical Verification: System funding should be verified with physical cash count
  5. GL Integration: Automatic GL posting to vault and external source accounts
  6. No Approval Required: Vault fundings typically auto-approved (external funds already verified)
  • Vault to Till: TransferFromBranchVaultAccountCommand (distribute to tills)
  • Till to Vault: Transfer excess till cash back to vault
  • Add Cash to Till: AddCashToTellerTillCommand (ultimate destination of vault cash)


Developer Resources​

For API implementation details, see: