+ | Type |
Txn # |
Account No |
CIF |
Date |
Amount |
+ ID Proof |
- @for (r of rows; track r.txnId) {
+ @for (r of rows; track $index) {
+ |
+ @if (r.type === 'EXCHANGE') {
+ Exchange
+ } @else {
+ Txn
+ }
+ |
{{ r.txnId }} |
{{ r.accountNo || '—' }} |
{{ r.cifNo || '—' }} |
{{ r.txnDate || '—' }} |
₹{{ r.totalAmount | number: '1.2-2' }} |
+ {{ r.idProof || '—' }} |
}
@if (loaded && rows.length === 0) {
- | No transactions at or above ₹{{ threshold | number }}. |
+ No transactions at or above ₹{{ threshold | number }}. |
}
diff --git a/src/app/current-accounts/current-account-actions/current-account-transactions/current-account-transactions.component.html b/src/app/current-accounts/current-account-actions/current-account-transactions/current-account-transactions.component.html
index d5bed2bd6..038c62eb4 100644
--- a/src/app/current-accounts/current-account-actions/current-account-transactions/current-account-transactions.component.html
+++ b/src/app/current-accounts/current-account-actions/current-account-transactions/current-account-transactions.component.html
@@ -326,6 +326,31 @@
Use ₹{{ denominationTotal | number: '1.2-2' }} as Transaction Amount
+
+ @if (transactionType.withdrawal && hasWithdrawalDenomOverdraft) {
+
+
+
+ Insufficient denomination stock — cannot proceed
+
+
+ @for (item of withdrawalDenomOverdraft; track item.label) {
+
+ {{ item.label }}
+ Need{{ item.requested }}
+ ·
+ Available{{ item.available }}
+ Short: {{ item.requested - item.available }}
+
+ }
+
+
+ }
+
@if (openingLoaded && openingDenoms.length > 0) {
0 && !denominationMatchesForm)"
+ [disabled]="
+ !currentAccountTransactionForm.valid ||
+ (denominationTotal > 0 && !denominationMatchesForm) ||
+ hasWithdrawalDenomOverdraft
+ "
>
{{ 'labels.buttons.Submit' | translate }}
diff --git a/src/app/current-accounts/current-account-actions/current-account-transactions/current-account-transactions.component.scss b/src/app/current-accounts/current-account-actions/current-account-transactions/current-account-transactions.component.scss
index 84588d28c..9211b069a 100644
--- a/src/app/current-accounts/current-account-actions/current-account-transactions/current-account-transactions.component.scss
+++ b/src/app/current-accounts/current-account-actions/current-account-transactions/current-account-transactions.component.scss
@@ -1094,3 +1094,98 @@ $red: #b91c1c;
font-variant-numeric: tabular-nums;
color: #0d1b2a;
}
+
+.sat__denom-warn {
+ margin: 8px 14px;
+ background: #fff5f5;
+ border: 1.5px solid #fca5a5;
+ border-left: 4px solid #ef4444;
+ border-radius: 10px;
+ overflow: hidden;
+
+ &-title {
+ display: flex;
+ align-items: center;
+ gap: 8px;
+ padding: 9px 14px;
+ font-size: 13px;
+ font-weight: 700;
+ color: #7f1d1d;
+ background: #fef2f2;
+ border-bottom: 1px solid #fecaca;
+ }
+
+ &-ico {
+ color: #ef4444;
+ font-size: 14px;
+ flex-shrink: 0;
+ }
+
+ &-rows {
+ display: flex;
+ flex-direction: column;
+ padding: 4px 0;
+ }
+
+ &-row {
+ display: flex;
+ align-items: center;
+ gap: 10px;
+ padding: 7px 14px;
+ font-size: 12.5px;
+ color: #7f1d1d;
+
+ &:not(:last-child) {
+ border-bottom: 1px dashed #fecaca;
+ }
+ }
+
+ &-chip {
+ display: inline-flex;
+ align-items: center;
+ justify-content: center;
+ padding: 3px 10px;
+ background: linear-gradient(135deg, #fee2e2, #fecaca);
+ border: 1px solid #fca5a5;
+ border-radius: 6px;
+ font-size: 12px;
+ font-weight: 800;
+ color: #991b1b;
+ min-width: 52px;
+ letter-spacing: 0.01em;
+ }
+
+ &-stat {
+ display: flex;
+ align-items: center;
+ gap: 4px;
+
+ strong {
+ font-weight: 800;
+ font-variant-numeric: tabular-nums;
+ }
+ }
+
+ &-lbl {
+ font-size: 11px;
+ color: #b91c1c;
+ font-weight: 600;
+ }
+
+ &-dot {
+ color: #fca5a5;
+ font-weight: 700;
+ font-size: 14px;
+ }
+
+ &-short {
+ margin-left: auto;
+ padding: 2px 9px;
+ background: #fff;
+ border: 1.5px solid #f87171;
+ border-radius: 999px;
+ font-size: 11px;
+ font-weight: 800;
+ color: #b91c1c;
+ }
+}
diff --git a/src/app/current-accounts/current-account-actions/current-account-transactions/current-account-transactions.component.ts b/src/app/current-accounts/current-account-actions/current-account-transactions/current-account-transactions.component.ts
index d18a28fc4..413e198f5 100644
--- a/src/app/current-accounts/current-account-actions/current-account-transactions/current-account-transactions.component.ts
+++ b/src/app/current-accounts/current-account-actions/current-account-transactions/current-account-transactions.component.ts
@@ -389,6 +389,24 @@ export class CurrentAccountTransactionsComponent implements OnInit {
return this.denominationTotal > 0 && formAmt === this.denominationTotal;
}
+ get withdrawalDenomOverdraft(): Array<{ label: string; available: number; requested: number }> {
+ if (!this.transactionType.withdrawal || !this.openingLoaded || this.openingDenoms.length === 0) return [];
+ const openMap = new Map();
+ for (const d of this.openingDenoms) {
+ openMap.set(`${d.kind}:${d.denominationValue}`, Number(d.count ?? 0));
+ }
+ return [
+ ...this.notes,
+ ...this.coins
+ ]
+ .map((d) => ({ label: d.label, available: openMap.get(this.denomKey(d)) ?? 0, requested: this.countFor(d) }))
+ .filter((item) => item.requested > 0 && item.requested > item.available);
+ }
+
+ get hasWithdrawalDenomOverdraft(): boolean {
+ return this.withdrawalDenomOverdraft.length > 0;
+ }
+
applyDenominationTotal(): void {
this.currentAccountTransactionForm.controls['transactionAmount'].setValue(this.denominationTotal);
this.currentAccountTransactionForm.controls['transactionAmount'].markAsDirty();
diff --git a/src/app/deposits/fixed-deposits/fixed-deposits-account-actions/fixed-deposits-cash-transaction/fixed-deposits-cash-transaction.component.html b/src/app/deposits/fixed-deposits/fixed-deposits-account-actions/fixed-deposits-cash-transaction/fixed-deposits-cash-transaction.component.html
index 50b747955..ac9b16a5b 100644
--- a/src/app/deposits/fixed-deposits/fixed-deposits-account-actions/fixed-deposits-cash-transaction/fixed-deposits-cash-transaction.component.html
+++ b/src/app/deposits/fixed-deposits/fixed-deposits-account-actions/fixed-deposits-cash-transaction/fixed-deposits-cash-transaction.component.html
@@ -299,6 +299,31 @@
Use ₹{{ denominationTotal | number: '1.2-2' }} as Transaction Amount
+
+ @if (transactionType.withdrawal && hasWithdrawalDenomOverdraft) {
+
+
+
+ Insufficient denomination stock — cannot proceed
+
+
+ @for (item of withdrawalDenomOverdraft; track item.label) {
+
+ {{ item.label }}
+ Need{{ item.requested }}
+ ·
+ Available{{ item.available }}
+ Short: {{ item.requested - item.available }}
+
+ }
+
+
+ }
+
@if (openingLoaded && openingDenoms.length > 0) {
0 && !denominationMatchesForm)"
+ [disabled]="
+ !accountTransactionForm.valid ||
+ (denominationTotal > 0 && !denominationMatchesForm) ||
+ hasWithdrawalDenomOverdraft
+ "
>
{{ 'labels.buttons.Submit' | translate }}
diff --git a/src/app/deposits/fixed-deposits/fixed-deposits-account-actions/fixed-deposits-cash-transaction/fixed-deposits-cash-transaction.component.scss b/src/app/deposits/fixed-deposits/fixed-deposits-account-actions/fixed-deposits-cash-transaction/fixed-deposits-cash-transaction.component.scss
index 515771824..ca898f512 100644
--- a/src/app/deposits/fixed-deposits/fixed-deposits-account-actions/fixed-deposits-cash-transaction/fixed-deposits-cash-transaction.component.scss
+++ b/src/app/deposits/fixed-deposits/fixed-deposits-account-actions/fixed-deposits-cash-transaction/fixed-deposits-cash-transaction.component.scss
@@ -1006,3 +1006,98 @@ $amber-d: #b45309;
font-variant-numeric: tabular-nums;
color: #0d1b2a;
}
+
+.sat__denom-warn {
+ margin: 8px 14px;
+ background: #fff5f5;
+ border: 1.5px solid #fca5a5;
+ border-left: 4px solid #ef4444;
+ border-radius: 10px;
+ overflow: hidden;
+
+ &-title {
+ display: flex;
+ align-items: center;
+ gap: 8px;
+ padding: 9px 14px;
+ font-size: 13px;
+ font-weight: 700;
+ color: #7f1d1d;
+ background: #fef2f2;
+ border-bottom: 1px solid #fecaca;
+ }
+
+ &-ico {
+ color: #ef4444;
+ font-size: 14px;
+ flex-shrink: 0;
+ }
+
+ &-rows {
+ display: flex;
+ flex-direction: column;
+ padding: 4px 0;
+ }
+
+ &-row {
+ display: flex;
+ align-items: center;
+ gap: 10px;
+ padding: 7px 14px;
+ font-size: 12.5px;
+ color: #7f1d1d;
+
+ &:not(:last-child) {
+ border-bottom: 1px dashed #fecaca;
+ }
+ }
+
+ &-chip {
+ display: inline-flex;
+ align-items: center;
+ justify-content: center;
+ padding: 3px 10px;
+ background: linear-gradient(135deg, #fee2e2, #fecaca);
+ border: 1px solid #fca5a5;
+ border-radius: 6px;
+ font-size: 12px;
+ font-weight: 800;
+ color: #991b1b;
+ min-width: 52px;
+ letter-spacing: 0.01em;
+ }
+
+ &-stat {
+ display: flex;
+ align-items: center;
+ gap: 4px;
+
+ strong {
+ font-weight: 800;
+ font-variant-numeric: tabular-nums;
+ }
+ }
+
+ &-lbl {
+ font-size: 11px;
+ color: #b91c1c;
+ font-weight: 600;
+ }
+
+ &-dot {
+ color: #fca5a5;
+ font-weight: 700;
+ font-size: 14px;
+ }
+
+ &-short {
+ margin-left: auto;
+ padding: 2px 9px;
+ background: #fff;
+ border: 1.5px solid #f87171;
+ border-radius: 999px;
+ font-size: 11px;
+ font-weight: 800;
+ color: #b91c1c;
+ }
+}
diff --git a/src/app/deposits/fixed-deposits/fixed-deposits-account-actions/fixed-deposits-cash-transaction/fixed-deposits-cash-transaction.component.ts b/src/app/deposits/fixed-deposits/fixed-deposits-account-actions/fixed-deposits-cash-transaction/fixed-deposits-cash-transaction.component.ts
index 6ae14b86b..79538fd5b 100644
--- a/src/app/deposits/fixed-deposits/fixed-deposits-account-actions/fixed-deposits-cash-transaction/fixed-deposits-cash-transaction.component.ts
+++ b/src/app/deposits/fixed-deposits/fixed-deposits-account-actions/fixed-deposits-cash-transaction/fixed-deposits-cash-transaction.component.ts
@@ -312,6 +312,24 @@ export class FixedDepositsCashTransactionComponent implements OnInit {
return this.denominationTotal > 0 && formAmt === this.denominationTotal;
}
+ get withdrawalDenomOverdraft(): Array<{ label: string; available: number; requested: number }> {
+ if (!this.transactionType.withdrawal || !this.openingLoaded || this.openingDenoms.length === 0) return [];
+ const openMap = new Map();
+ for (const d of this.openingDenoms) {
+ openMap.set(`${d.kind}:${d.denominationValue}`, Number(d.count ?? 0));
+ }
+ return [
+ ...this.notes,
+ ...this.coins
+ ]
+ .map((d) => ({ label: d.label, available: openMap.get(this.denomKey(d)) ?? 0, requested: this.countFor(d) }))
+ .filter((item) => item.requested > 0 && item.requested > item.available);
+ }
+
+ get hasWithdrawalDenomOverdraft(): boolean {
+ return this.withdrawalDenomOverdraft.length > 0;
+ }
+
applyDenominationTotal(): void {
this.accountTransactionForm.controls['transactionAmount'].setValue(this.denominationTotal);
this.accountTransactionForm.controls['transactionAmount'].markAsDirty();
diff --git a/src/app/deposits/recurring-deposits/recurring-deposits-account-actions/deposit-recurring-deposits-account/deposit-recurring-deposits-account.component.html b/src/app/deposits/recurring-deposits/recurring-deposits-account-actions/deposit-recurring-deposits-account/deposit-recurring-deposits-account.component.html
index 6787d4a0a..3f4c8da95 100644
--- a/src/app/deposits/recurring-deposits/recurring-deposits-account-actions/deposit-recurring-deposits-account/deposit-recurring-deposits-account.component.html
+++ b/src/app/deposits/recurring-deposits/recurring-deposits-account-actions/deposit-recurring-deposits-account/deposit-recurring-deposits-account.component.html
@@ -299,6 +299,31 @@
Use ₹{{ denominationTotal | number: '1.2-2' }} as Transaction Amount
+
+ @if (transactionType.withdrawal && hasWithdrawalDenomOverdraft) {
+
+
+
+ Insufficient denomination stock — cannot proceed
+
+
+ @for (item of withdrawalDenomOverdraft; track item.label) {
+
+ {{ item.label }}
+ Need{{ item.requested }}
+ ·
+ Available{{ item.available }}
+ Short: {{ item.requested - item.available }}
+
+ }
+
+
+ }
+
@if (openingLoaded && openingDenoms.length > 0) {
0 && !denominationMatchesForm)"
+ [disabled]="
+ !depositRecurringDepositForm.valid ||
+ (denominationTotal > 0 && !denominationMatchesForm) ||
+ hasWithdrawalDenomOverdraft
+ "
>
{{ 'labels.buttons.Submit' | translate }}
diff --git a/src/app/deposits/recurring-deposits/recurring-deposits-account-actions/deposit-recurring-deposits-account/deposit-recurring-deposits-account.component.scss b/src/app/deposits/recurring-deposits/recurring-deposits-account-actions/deposit-recurring-deposits-account/deposit-recurring-deposits-account.component.scss
index 515771824..ca898f512 100644
--- a/src/app/deposits/recurring-deposits/recurring-deposits-account-actions/deposit-recurring-deposits-account/deposit-recurring-deposits-account.component.scss
+++ b/src/app/deposits/recurring-deposits/recurring-deposits-account-actions/deposit-recurring-deposits-account/deposit-recurring-deposits-account.component.scss
@@ -1006,3 +1006,98 @@ $amber-d: #b45309;
font-variant-numeric: tabular-nums;
color: #0d1b2a;
}
+
+.sat__denom-warn {
+ margin: 8px 14px;
+ background: #fff5f5;
+ border: 1.5px solid #fca5a5;
+ border-left: 4px solid #ef4444;
+ border-radius: 10px;
+ overflow: hidden;
+
+ &-title {
+ display: flex;
+ align-items: center;
+ gap: 8px;
+ padding: 9px 14px;
+ font-size: 13px;
+ font-weight: 700;
+ color: #7f1d1d;
+ background: #fef2f2;
+ border-bottom: 1px solid #fecaca;
+ }
+
+ &-ico {
+ color: #ef4444;
+ font-size: 14px;
+ flex-shrink: 0;
+ }
+
+ &-rows {
+ display: flex;
+ flex-direction: column;
+ padding: 4px 0;
+ }
+
+ &-row {
+ display: flex;
+ align-items: center;
+ gap: 10px;
+ padding: 7px 14px;
+ font-size: 12.5px;
+ color: #7f1d1d;
+
+ &:not(:last-child) {
+ border-bottom: 1px dashed #fecaca;
+ }
+ }
+
+ &-chip {
+ display: inline-flex;
+ align-items: center;
+ justify-content: center;
+ padding: 3px 10px;
+ background: linear-gradient(135deg, #fee2e2, #fecaca);
+ border: 1px solid #fca5a5;
+ border-radius: 6px;
+ font-size: 12px;
+ font-weight: 800;
+ color: #991b1b;
+ min-width: 52px;
+ letter-spacing: 0.01em;
+ }
+
+ &-stat {
+ display: flex;
+ align-items: center;
+ gap: 4px;
+
+ strong {
+ font-weight: 800;
+ font-variant-numeric: tabular-nums;
+ }
+ }
+
+ &-lbl {
+ font-size: 11px;
+ color: #b91c1c;
+ font-weight: 600;
+ }
+
+ &-dot {
+ color: #fca5a5;
+ font-weight: 700;
+ font-size: 14px;
+ }
+
+ &-short {
+ margin-left: auto;
+ padding: 2px 9px;
+ background: #fff;
+ border: 1.5px solid #f87171;
+ border-radius: 999px;
+ font-size: 11px;
+ font-weight: 800;
+ color: #b91c1c;
+ }
+}
diff --git a/src/app/deposits/recurring-deposits/recurring-deposits-account-actions/deposit-recurring-deposits-account/deposit-recurring-deposits-account.component.ts b/src/app/deposits/recurring-deposits/recurring-deposits-account-actions/deposit-recurring-deposits-account/deposit-recurring-deposits-account.component.ts
index 98b9c593c..9c48fa7ba 100644
--- a/src/app/deposits/recurring-deposits/recurring-deposits-account-actions/deposit-recurring-deposits-account/deposit-recurring-deposits-account.component.ts
+++ b/src/app/deposits/recurring-deposits/recurring-deposits-account-actions/deposit-recurring-deposits-account/deposit-recurring-deposits-account.component.ts
@@ -333,6 +333,24 @@ export class DepositRecurringDepositsAccountComponent implements OnInit {
return this.denominationTotal > 0 && formAmt === this.denominationTotal;
}
+ get withdrawalDenomOverdraft(): Array<{ label: string; available: number; requested: number }> {
+ if (!this.transactionType.withdrawal || !this.openingLoaded || this.openingDenoms.length === 0) return [];
+ const openMap = new Map();
+ for (const d of this.openingDenoms) {
+ openMap.set(`${d.kind}:${d.denominationValue}`, Number(d.count ?? 0));
+ }
+ return [
+ ...this.notes,
+ ...this.coins
+ ]
+ .map((d) => ({ label: d.label, available: openMap.get(this.denomKey(d)) ?? 0, requested: this.countFor(d) }))
+ .filter((item) => item.requested > 0 && item.requested > item.available);
+ }
+
+ get hasWithdrawalDenomOverdraft(): boolean {
+ return this.withdrawalDenomOverdraft.length > 0;
+ }
+
applyDenominationTotal(): void {
this.depositRecurringDepositForm.controls['transactionAmount'].setValue(this.denominationTotal);
this.depositRecurringDepositForm.controls['transactionAmount'].markAsDirty();
diff --git a/src/app/savings/saving-account-actions/savings-account-transactions/savings-account-transactions.component.html b/src/app/savings/saving-account-actions/savings-account-transactions/savings-account-transactions.component.html
index 793502a94..143c88ec1 100644
--- a/src/app/savings/saving-account-actions/savings-account-transactions/savings-account-transactions.component.html
+++ b/src/app/savings/saving-account-actions/savings-account-transactions/savings-account-transactions.component.html
@@ -326,6 +326,31 @@
Use ₹{{ denominationTotal | number: '1.2-2' }} as Transaction Amount
+
+ @if (transactionType.withdrawal && hasWithdrawalDenomOverdraft) {
+
+
+
+ Insufficient denomination stock — cannot proceed
+
+
+ @for (item of withdrawalDenomOverdraft; track item.label) {
+
+ {{ item.label }}
+ Need{{ item.requested }}
+ ·
+ Available{{ item.available }}
+ Short: {{ item.requested - item.available }}
+
+ }
+
+
+ }
+
@if (openingLoaded && openingDenoms.length > 0) {
0 && !denominationMatchesForm)"
+ [disabled]="
+ !savingAccountTransactionForm.valid ||
+ (denominationTotal > 0 && !denominationMatchesForm) ||
+ hasWithdrawalDenomOverdraft
+ "
>
{{ 'labels.buttons.Submit' | translate }}
diff --git a/src/app/savings/saving-account-actions/savings-account-transactions/savings-account-transactions.component.scss b/src/app/savings/saving-account-actions/savings-account-transactions/savings-account-transactions.component.scss
index afca13297..e6a0990b0 100644
--- a/src/app/savings/saving-account-actions/savings-account-transactions/savings-account-transactions.component.scss
+++ b/src/app/savings/saving-account-actions/savings-account-transactions/savings-account-transactions.component.scss
@@ -827,6 +827,103 @@ $red: #b91c1c;
}
}
+/* ─── Denomination overdraft warning (withdrawal) ─────────────────── */
+
+.sat__denom-warn {
+ margin: 8px 14px;
+ background: #fff5f5;
+ border: 1.5px solid #fca5a5;
+ border-left: 4px solid #ef4444;
+ border-radius: 10px;
+ overflow: hidden;
+
+ &-title {
+ display: flex;
+ align-items: center;
+ gap: 8px;
+ padding: 9px 14px;
+ font-size: 13px;
+ font-weight: 700;
+ color: #7f1d1d;
+ background: #fef2f2;
+ border-bottom: 1px solid #fecaca;
+ }
+
+ &-ico {
+ color: #ef4444;
+ font-size: 14px;
+ flex-shrink: 0;
+ }
+
+ &-rows {
+ display: flex;
+ flex-direction: column;
+ padding: 4px 0;
+ }
+
+ &-row {
+ display: flex;
+ align-items: center;
+ gap: 10px;
+ padding: 7px 14px;
+ font-size: 12.5px;
+ color: #7f1d1d;
+
+ &:not(:last-child) {
+ border-bottom: 1px dashed #fecaca;
+ }
+ }
+
+ &-chip {
+ display: inline-flex;
+ align-items: center;
+ justify-content: center;
+ padding: 3px 10px;
+ background: linear-gradient(135deg, #fee2e2, #fecaca);
+ border: 1px solid #fca5a5;
+ border-radius: 6px;
+ font-size: 12px;
+ font-weight: 800;
+ color: #991b1b;
+ min-width: 52px;
+ letter-spacing: 0.01em;
+ }
+
+ &-stat {
+ display: flex;
+ align-items: center;
+ gap: 4px;
+
+ strong {
+ font-weight: 800;
+ font-variant-numeric: tabular-nums;
+ }
+ }
+
+ &-lbl {
+ font-size: 11px;
+ color: #b91c1c;
+ font-weight: 600;
+ }
+
+ &-dot {
+ color: #fca5a5;
+ font-weight: 700;
+ font-size: 14px;
+ }
+
+ &-short {
+ margin-left: auto;
+ padding: 2px 9px;
+ background: #fff;
+ border: 1.5px solid #f87171;
+ border-radius: 999px;
+ font-size: 11px;
+ font-weight: 800;
+ color: #b91c1c;
+ }
+}
+
/* ─── Opening / Closing position cards ───────────────────────────── */
.sat__pos-card {
margin: 0 14px 12px;
diff --git a/src/app/savings/saving-account-actions/savings-account-transactions/savings-account-transactions.component.ts b/src/app/savings/saving-account-actions/savings-account-transactions/savings-account-transactions.component.ts
index ef84b5151..e1a1946d4 100644
--- a/src/app/savings/saving-account-actions/savings-account-transactions/savings-account-transactions.component.ts
+++ b/src/app/savings/saving-account-actions/savings-account-transactions/savings-account-transactions.component.ts
@@ -455,6 +455,25 @@ export class SavingsAccountTransactionsComponent implements OnInit {
this.denominationCounts = {};
}
+ /** Denominations where cashier is giving more than currently available (withdrawal only). */
+ get withdrawalDenomOverdraft(): Array<{ label: string; available: number; requested: number }> {
+ if (!this.transactionType.withdrawal || !this.openingLoaded || this.openingDenoms.length === 0) return [];
+ const openMap = new Map();
+ for (const d of this.openingDenoms) {
+ openMap.set(`${d.kind}:${d.denominationValue}`, Number(d.count ?? 0));
+ }
+ return [
+ ...this.notes,
+ ...this.coins
+ ]
+ .map((d) => ({ label: d.label, available: openMap.get(this.denomKey(d)) ?? 0, requested: this.countFor(d) }))
+ .filter((item) => item.requested > 0 && item.requested > item.available);
+ }
+
+ get hasWithdrawalDenomOverdraft(): boolean {
+ return this.withdrawalDenomOverdraft.length > 0;
+ }
+
/**
* Open the identity-verify pop-up. Only meaningful for withdrawals
* (where the cashier needs to match the customer at the counter