fix(cashier): recognise 'Fund Transfer' alongside 'Enter Bank Transfer' for share redemption
Tests / testRigor (push) Canceled after 0s
build-run / Run Lint, Build and Deploy (push) Canceled after 0s
Publish Image in Docker Hub / build (push) Canceled after 0s
Playwright E2E Tests / Run Playwright Tests (push) Canceled after 0s

'Fund Transfer' and 'Enter Bank Transfer' are the same flow under two TYPE labels -- onTypChange()
already defaults them identically and the auto-mirror-row logic already treats them as equivalent --
but the Resolution No./Meeting Date fields and onSave()'s clerk-transfer submission gate only checked
'Enter Bank Transfer'. Picking 'Fund Transfer' for a Share row silently hid the board-resolution
fields and skipped submitShareRedemptionTransfer() entirely, falling through to the wrong save path.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
2026-08-30 21:44:06 +05:30
co-authored by Claude Sonnet 5
parent e89b1cfc23
commit cb3e43fd44
2 changed files with 17 additions and 6 deletions
@@ -267,7 +267,7 @@
>
}
</div>
@if (row.acTyp === 'SHR' && row.typ === 'Enter Bank Transfer') {
@if (row.acTyp === 'SHR' && (row.typ === 'Enter Bank Transfer' || row.typ === 'Fund Transfer')) {
<div class="ws-f ws-f--cheqno">
<label class="ws-f__lbl" title="Board Resolution Number">RESOLUTION NO.</label>
<input
@@ -1474,7 +1474,9 @@
>
}
</div>
@if (row.acTyp === 'SHR' && row.typ === 'Enter Bank Transfer') {
@if (
row.acTyp === 'SHR' && (row.typ === 'Enter Bank Transfer' || row.typ === 'Fund Transfer')
) {
<div class="ws-f ws-f--cheqno">
<label class="ws-f__lbl">RESOLUTION NO.</label>
<input
@@ -1507,9 +1507,11 @@ export class TransactionEntryComponent implements OnInit, OnDestroy {
return tellerFacing.filter((pt: any) => !pt.isCashPayment);
}
const isShareSettlementCredit =
row.typ === 'Enter Bank Transfer' &&
(row.typ === 'Enter Bank Transfer' || row.typ === 'Fund Transfer') &&
row.dbCr === 'Cr' &&
this.rows.some((r) => r.typ === 'Enter Bank Transfer' && r.dbCr === 'Dr' && r.acTyp === 'SHR');
this.rows.some(
(r) => (r.typ === 'Enter Bank Transfer' || r.typ === 'Fund Transfer') && r.dbCr === 'Dr' && r.acTyp === 'SHR'
);
if (isShareSettlementCredit) {
return tellerFacing.filter((pt: any) => !pt.isCashPayment);
}
@@ -3694,8 +3696,15 @@ export class TransactionEntryComponent implements OnInit, OnDestroy {
}
onSave(): void {
// Clerk bank transfer — N DR savings/CA + N CR savings/CA, immediate execution
if (this.isClerk && this.rows.length >= 2 && this.rows.every((r) => r.typ === 'Enter Bank Transfer')) {
// Clerk bank transfer — N DR savings/CA + N CR savings/CA, immediate execution. 'Fund Transfer'
// is the same flow under a second TYPE label — onTypChange() already defaults it identically to
// 'Enter Bank Transfer', so submission has to recognise both or a share redemption or bank
// transfer raised under this label silently falls through to the wrong branch below.
if (
this.isClerk &&
this.rows.length >= 2 &&
this.rows.every((r) => r.typ === 'Enter Bank Transfer' || r.typ === 'Fund Transfer')
) {
const drRows = this.rows.filter((r) => r.dbCr === 'Dr');
const crRows = this.rows.filter((r) => r.dbCr === 'Cr');