Skip to main content

Till to Vault Cash Transfer

Transfer excess cash from teller till to branch vault.

Overview

Till to Vault transfers allow tellers to deposit excess cash into the branch vault for safekeeping. This operation reduces till balance and increases vault balance, typically performed at end of day or when till exceeds optimal cash levels.

Key Features:

  • Internal cash movement (no customer involvement)
  • Till balance reduction
  • Vault balance increase
  • CashManagement tracking
  • Reconciliation support
  • Concurrent transaction safety

Transaction Flow


Entities Impacted

Command: RemoveCashFromTellerTillCommand (BPMCore)

ImpactedEntities:
[
{
entityType: "TellerTill",
entityId: 789,
fieldName: "Balance",
oldValue: 150000.00,
newValue: 100000.00,
deltaAmount: -50000.00
},
{
entityType: "TellerTill",
entityId: 789,
fieldName: "TransactionCount",
oldValue: 42,
newValue: 43,
deltaAmount: +1
},
{
entityType: "Vault",
entityId: 555,
fieldName: "Balance",
oldValue: 500000.00,
newValue: 550000.00,
deltaAmount: +50000.00
},
{
entityType: "CashManagement",
entityId: 999,
fieldName: "Operation",
oldValue: null,
newValue: "REMOVE_Cash",
deltaAmount: 0
},
{
entityType: "CashManagement",
entityId: 999,
fieldName: "Amount",
oldValue: 0,
newValue: 50000.00,
deltaAmount: +50000.00
},
{
entityType: "GLAccount",
entityKey: "1040-CASH-IN-VAULT",
fieldName: "DebitAmount",
deltaAmount: +50000.00
},
{
entityType: "GLAccount",
entityKey: "1050-CASH-IN-TILL",
fieldName: "CreditAmount",
deltaAmount: +50000.00
}
]
```text
---

## Implementation

**BPMCore Command**: `RemoveCashFromTellerTillCommand`

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

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

## Validation Rules

| Rule | Check | Error Message |
|------|-------|---------------|
| **Till Exists** | Till found | "Till not found" |
| **Till Opened** | `TillAccountState == OPENED` | "Till must be opened" |
| **Sufficient Cash** | `Till.Balance >= Amount` | "Insufficient cash in till. Available: {balance}" |
| **Vault Exists** | Vault found | "Vault not found" |
| **Vault Active** | `VaultAccountState == OPENED` | "Vault is not active" |
| **Same Branch** | `Till.BranchId == Vault.BranchId` | "Till and vault must be in the same branch" |
| **Same Currency** | `Till.CurrencyId == Vault.CurrencyId` | "Currency mismatch" |
| **Amount Valid** | `Amount > 0` | "Amount must be greater than zero" |

---

## GL Account Postings

| Account | Debit (Dr) | Credit (Cr) | Description |
|---------|------------|-------------|-------------|
| **Cash-in-Vault Asset** | Amount | - | Increase vault cash |
| **Cash-in-Till Asset** | - | Amount | Decrease till cash |

**Example** (₦50,000 transfer):

```text
DR: 1040-Cash-in-Vault ₦50,000
CR: 1050-Cash-in-Till ₦50,000
```text
---

## Testing

### Test Scenario 1: Standard Till to Vault Transfer

**Setup**:
- Till Balance: ₦150,000
- Vault Balance: ₦500,000
- Transfer Amount: ₦50,000

**Expected Results**:

```typescript
TellerTill:
Balance: 150000 → 100000 ✓
TransactionCount: +1 ✓

Vault:
Balance: 500000 → 550000 ✓
TransactionCount: +1 ✓

CashManagement:
Operation: REMOVE_Cash ✓
Amount: ₦50,000 ✓
TillAccountId: Set ✓
VaultAccountId: Set ✓

GLEntries:
DR: Cash-in-Vault: ₦50,000 ✓
CR: Cash-in-Till: ₦50,000 ✓
```text
### Test Scenario 2: Insufficient Till Cash

**Setup**:
- Till Balance: ₦30,000
- Transfer Amount: ₦50,000

**Expected Results**:

```typescript
Validation:
Error: "Insufficient cash in till. Available: ₦30,000" ✓
Transaction: REJECTED ✓

Till Balance: 30000 (NO CHANGE) ✓
Vault Balance: NO CHANGE ✓

V2 API Commands

BankLingo V2 provides a BPMCore-compatible command for till-to-vault transfers.

Architecture Overview

The V2 till-to-vault transfer uses the generic remove cash command with vault as destination:

  • V2 Command: RemoveCashFromTellerTillCommand (with vault destination)
  • Alternative: Can be implemented as dedicated TransferToVaultCommand if needed
  • BPM Integration: Accepts parameters via BpmUtil.GetPropertyValue()
  • Impact Tracking: Tracks both till and vault changes via TransactionImpactTracker
  • Atomic Operation: Both till and vault updated in single transaction

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


RemoveCashFromTellerTillCommand (to Vault)

Purpose: Transfer excess cash from teller till to branch vault

Command: RemoveCashFromTellerTillCommand

Transaction State: PENDING → SETTLED

BPM Parameters

{
"commandName": "RemoveCashFromTellerTillCommand",
"data": {
"tillId": "string (mandatory)",
"amount": "decimal (mandatory)",
"destinationAccountKey": "string (mandatory)",
"destinationType": "VAULT",
"removalReason": "string (optional)",
"transactionDate": "DateTime (optional)",
"notes": "string (optional)"
}
}

Parameter Details

ParameterTypeRequiredDescription
tillIdstring✅ YesSource till ID
amountdecimal✅ YesTransfer amount (must be > 0)
destinationAccountKeystring✅ YesVault ID (destination)
destinationTypestring✅ YesMust be "VAULT"
removalReasonstring❌ NoReason (e.g., "END_OF_DAY", "EXCESS_CASH")
transactionDateDateTime❌ NoTransaction date (defaults to today)
notesstring❌ NoTransfer notes/remarks

Balance Impact (Atomic)

Teller Till:

Balance FieldChangeReason
CashBalance-amountCash transferred to vault
AvailableBalance-amountFunds withdrawn
TotalCashOut+amountTrack outflow
TransactionCount+1Transaction counter

Branch Vault:

Balance FieldChangeReason
CashBalance+amountCash received from till
AvailableBalance+amountFunds added
TransactionCount+1Transaction counter

Validation Rules

✅ Till Validation:

  • Till must exist and be OPENED
  • Till balance >= amount (sufficient funds)
  • Till balance - amount >= Minimum till balance
  • Till and vault must be same branch

✅ Vault Validation:

  • Vault must exist and be active
  • Currency must match till

Example Request/Response

Request:

{
"commandName": "RemoveCashFromTellerTillCommand",
"data": {
"tillId": "TILL-001",
"amount": 400000.00,
"destinationAccountKey": "VAULT-HQ-001",
"destinationType": "VAULT",
"removalReason": "END_OF_DAY",
"transactionDate": "2025-12-29T17:00:00Z",
"notes": "End of day - excess cash to vault"
}
}

Response:

{
"isSuccessful": true,
"transactionId": "TXN-TILL-VAULT-20251229-0001",
"transactionState": "SETTLED",
"message": "Cash transferred from till to vault successfully",
"data": {
"tillId": "TILL-001",
"tillOwner": "Jane Doe",
"vaultId": "VAULT-HQ-001",
"amount": 400000.00,
"transactionDate": "2025-12-29T17:00:00Z",
"tillBalance": {
"previousBalance": 650000.00,
"newBalance": 250000.00,
"minimumBalance": 50000.00
},
"vaultBalance": {
"previousBalance": 6700000.00,
"newBalance": 7100000.00
},
"impactRecords": 8
}
}

Use Cases

1. End of Day Deposit:

{
"tillId": "TILL-002",
"amount": 500000.00,
"destinationAccountKey": "VAULT-BRANCH-01",
"destinationType": "VAULT",
"removalReason": "END_OF_DAY",
"notes": "Daily close - excess cash deposit"
}

2. Excess Cash Management:

{
"tillId": "TILL-003",
"amount": 300000.00,
"destinationAccountKey": "VAULT-BRANCH-01",
"destinationType": "VAULT",
"removalReason": "EXCESS_CASH",
"notes": "Till over optimal level - transfer to vault"
}

3. Till Closure:

{
"tillId": "TILL-005",
"amount": 450000.00,
"destinationAccountKey": "VAULT-BRANCH-01",
"destinationType": "VAULT",
"removalReason": "TILL_CLOSURE",
"notes": "Teller leaving - closing till for day"
}

Business Rules

  1. Atomic Operation: Both till and vault updated together (all or nothing)
  2. Minimum Balance: Cannot leave till below minimum balance requirement
  3. Same Branch: Can only transfer within same branch
  4. Physical Transfer: System transaction requires physical cash handover to vault custodian
  5. Authorization: May require supervisor approval for large amounts
  6. Audit Trail: Full tracking of till-to-vault movement
  7. End of Day: Typically part of daily till closing process
  • Vault to Till: TransferFromBranchVaultAccountCommand (replenish till)
  • Remove Cash from Till: RemoveCashFromTellerTillCommand (generic remove)
  • Till to Till: TransferBetweenTellerTillCommand (direct till transfers)
  • Vault Funding: FundBranchVaultAccountCommand (external vault funding)


Developer Resources

For API implementation details, see: