CASHIER · CASH EXCHANGE

Cash Exchange Entry

Customer gives notes/coins and takes equal-value change. Net amount must be ₹0.

@if (cashier) {
{{ cashierInitials }}
Cashier at the counter
{{ cashier.name || '—' }}
south Receives from customer north Gives to customer
Counter{{ cashier.tellerName || '—' }}
Branch{{ cashier.officeName || '—' }}
Allocated today{{ cashier.allocatedAmount === null ? '—' : '₹' + (cashier.allocatedAmount | number: '1.2-2') }}
Cash in hand₹{{ cashier.totalAmount | number: '1.2-2' }}
} @else if (noCashier) {
person_off
Your login is not linked to a cashier
A cash exchange moves notes in and out of a cashier's drawer, so it can only be recorded by a cashier. Log in as a cashier to continue.
}
groups
Customer
Who is exchanging cash at the counter
@if (customerMode === 'existing') { @if (loadingCustomer) {
autorenew
Loading customer details…
} @else if (!selectedCustomer) {
person_search
No customer selected
Search by name, account no., PAN or Aadhaar
} @else {
{{ customerInitials }}
{{ selectedCustomer.displayName }}
{{ selectedCustomer.kycStatus === 'Verified' ? 'verified_user' : 'gpp_maybe' }} KYC: {{ selectedCustomer.kycStatus }} @if (selectedCustomer.accountType) { {{ selectedCustomer.accountType }} }
CIF No.{{ selectedCustomer.cifNumber || '—' }}
Client ID{{ selectedCustomer.clientId }}
Mobile{{ selectedCustomer.mobileNo || '—' }}
Branch{{ selectedCustomer.officeName || '—' }}
Account{{ selectedCustomer.accountNo || 'No account' }}
PAN on record {{ selectedCustomer.kycPan || 'Not on record' }} @if (selectedCustomer.kycPan) { {{ selectedCustomer.panVerified ? 'Verified' : 'Not verified' }} }
} } @else {
}
credit_card PAN Card {{ needsPan ? 'Mandatory' : 'Optional' }}
@if (panValue && !panFormatInvalid) { check_circle } @else if (panFormatInvalid) { error }
@if (panFormatInvalid) { PAN is 5 letters, 4 digits, 1 letter (e.g. ABCDE1234F). } @else if (panFromKyc) { link Fetched from the customer's KYC record. } @else if (panMissing) { Required: this exchange is above ₹50,000 (Income Tax Rule 114B / RBI). } @else { Mandatory for exchanges above ₹50,000. }
@if (availableFor(d) === null) { — } @else { In drawer {{ availableFor(d) }} @if (netFor(d) !== 0) { {{ netFor(d) > 0 ? 'trending_up' : 'trending_down' }} {{ drawerAfter(d) }} ({{ netFor(d) > 0 ? '+' : '' }}{{ netFor(d) }}) } }
south Received from customer ₹{{ receivedTotal | number: '1.2-2' }}
@if (notes.length) {
Bank Notes
} @for (d of notes; track d.id) {
{{ d.label }}
₹{{ subtotal('r', d) | number: '1.2-2' }}
} @if (coins.length) {
Coins
} @for (d of coins; track d.id) {
{{ d.label }}
₹{{ subtotal('r', d) | number: '1.2-2' }}
}
north Given to customer ₹{{ givenTotal | number: '1.2-2' }}
@if (notes.length) {
Bank Notes
} @for (d of notes; track d.id) {
{{ d.label }}
₹{{ subtotal('g', d) | number: '1.2-2' }}
} @if (coins.length) {
Coins
} @for (d of coins; track d.id) {
{{ d.label }}
₹{{ subtotal('g', d) | number: '1.2-2' }}
}
@if (impactRows.length) {
inventory_2 Drawer after this exchange
@for (r of impactRows; track r.id) { {{ r.label }} {{ r.before }} → {{ r.after }} ({{ r.net > 0 ? '+' : '' }}{{ r.net }}) }
The branch's total for each denomination moves by the same amount; the vault is not touched (Branch Ops → Branch Cash Position).
}
Received₹{{ receivedTotal | number: '1.2-2' }}
swap_horiz
Given₹{{ givenTotal | number: '1.2-2' }}
Difference ₹{{ difference | number: '1.2-2' }}
@if (receivedTotal > 0 && !matches) {
warning Received and Given totals must match (net ₹0).
} @if (hasGivenOverdraft) {
block Insufficient stock — cannot give to customer
@for (item of givenOverdraftItems; track item.label) {
{{ item.label }} Need{{ item.requested }} · Available{{ item.available }} Short: {{ item.requested - item.available }}
}
} @if (panMissing) {
badge Enter the customer's PAN to proceed (amount above ₹50,000).
} @if (!customerIdentified && !loadingCustomer) {
person_search {{ customerMode === 'existing' ? 'Search and select the customer.' : "Enter the walk-in customer's name." }}
}