diff --git a/src/app/cashier/transaction-entry/transaction-entry.component.ts b/src/app/cashier/transaction-entry/transaction-entry.component.ts index f0be400ff..958d36dc1 100644 --- a/src/app/cashier/transaction-entry/transaction-entry.component.ts +++ b/src/app/cashier/transaction-entry/transaction-entry.component.ts @@ -4060,8 +4060,11 @@ export class TransactionEntryComponent implements OnInit, OnDestroy { .pipe(catchError(() => of(null))) .subscribe((res: any) => { if (token !== this.searchToken) return; // stale result — newer search started - const allItems: any[] = res?.pageItems ?? (Array.isArray(res) ? res : []); + const found: any[] = res?.pageItems ?? (Array.isArray(res) ? res : []); const f = cfg.matchField; + // SD, FD and RD share one list that returns any kind of deposit account: keep only the kind chosen in A/C TP. + const allItems = + cfg.depositTypeId != null ? found.filter((x: any) => x?.depositType?.id === cfg.depositTypeId) : found; // Exact match first, then suffix/partial match. Some account types (e.g. Share — its // list endpoint only accepts offset/limit, no accountNo filter at all) always return the const exactMatch = allItems.find((x: any) => String(x[f] ?? '').trim() === String(acNo).trim()); @@ -4091,7 +4094,18 @@ export class TransactionEntryComponent implements OnInit, OnDestroy { return; } this.loadingAccount = false; - this.accountError = 'Account not found for: ' + acNo; + // The number may exist as another kind of account (an FD typed under SD, say): say so, so the clerk can fix A/C TP. + const otherKind = + cfg.depositTypeId != null + ? found.find( + (x: any) => + x?.depositType?.id !== cfg.depositTypeId && + (String(x[f] ?? '').trim() === String(acNo).trim() || String(x[f] ?? '').endsWith(acNo)) + ) + : null; + this.accountError = otherKind + ? `${acTyp} account not found for: ${acNo} (this number is a ${otherKind.depositType?.value ?? 'different kind of'} account - change A/C TP)` + : `${acTyp} account not found for: ${acNo}`; }); } @@ -4155,6 +4169,10 @@ export class TransactionEntryComponent implements OnInit, OnDestroy { * account type — used to keep Header GL accounts out of the results a clerk/cashier can pick * for a transaction; a Header can never receive a posting, so it should never be offered. */ extraListQueryParams?: string; + /** SD, FD and RD are all served by the one /savingsaccounts list, which answers with a deposit + * account of any kind for a number. This is the depositType.id the chosen A/C type accepts + * (100 savings, 200 fixed, 300 recurring), so a number of another kind is "not found" here. */ + depositTypeId?: number; } { const t = acTyp?.toUpperCase(); if (t === 'LA') { @@ -4235,6 +4253,7 @@ export class TransactionEntryComponent implements OnInit, OnDestroy { return { list: '/savingsaccounts', detail: '/fixeddepositaccounts', + depositTypeId: 200, nominee: 'FD', search: 'fixeddeposit', siAccountType: 2, @@ -4252,6 +4271,7 @@ export class TransactionEntryComponent implements OnInit, OnDestroy { return { list: '/savingsaccounts', detail: '/recurringdepositaccounts', + depositTypeId: 300, nominee: 'RD', search: 'recurringdeposit', siAccountType: 2, @@ -4269,6 +4289,7 @@ export class TransactionEntryComponent implements OnInit, OnDestroy { return { list: '/savingsaccounts', detail: '/savingsaccounts', + depositTypeId: 100, nominee: 'SB', search: 'saving', siAccountType: 2,