Client-stepper: pre-fill existing KYC/address proofs in edit, fix identifier saves

Edit-mode now shows the previously selected KYC document type + uploaded file thumbnail
(loads from /clients/{id}/identifiers + /client_identifiers/{id}/documents). Same for
address proof on the India address step. Closes the gap where editing a client showed
an empty file picker even when proof had been uploaded on create.

Identifier-save hardened across all three callsites (create-client, edit-client,
identities-tab.createIdentifierWithDocs) - the KYC chip picker proofId is a CODE
string ('AADHAAR'), but backend ClientIdentifierRequest.documentTypeId is Long, which
Spring rejects with HttpMessageNotReadableException -> 400. resolveDocumentTypeId
helper looks up the code against /kyc/proof-types?type=id and substitutes the numeric
CodeValue id before posting. Skips silently for constitution-specific non-individual
docs that have no CodeValue mapping.

KYC payload normalises panNumber / enterprisePan / gstinNumber / cinNumber via
toUpperCase + whitespace strip so user-typed lowercase or trailing spaces don't trip
the backend regex (validation.msg.CLIENTKYC.panNumber.does.not.match.regexp).

State name match in client-address save now normalises both sides (lowercase, collapse
underscores + spaces) so legacy MADHYA_PRADESH resolves to 'Madhya Pradesh' returned
by api.postalpincode.in. Backed by tenant migration 0297.

Identities-tab resolver flattened - was returning identifiers before the per-row
forkJoin(getClientIdentificationDocuments) completed, so the view rendered empty
documents arrays. Now uses switchMap + forkJoin so the resolver awaits completion.

Also bundles concurrent work-in-progress on letter-mgmt, organization, users,
bank-calendar, shell, nominee/notes/identifier dialogs, and theming.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
Aditya
2026-05-20 12:40:58 +05:30
co-authored by Claude Opus 4.7
parent 325228c514
commit 83ea57ccf0
84 changed files with 10281 additions and 1194 deletions
+176 -12
View File
@@ -190,8 +190,9 @@
<fa-icon icon="mobile-alt" class="ni-ico"></fa-icon>Digital
<fa-icon icon="caret-down" class="ni-caret"></fa-icon>
</a>
<a class="ni" tabindex="0" (click)="openConfigWizard()" *mifosxHasPermission="'MENU_CONFIG_WIZARD'">
<fa-icon icon="cog" class="ni-ico"></fa-icon>Config Wizard
<a class="ni" tabindex="0" [matMenuTriggerFor]="reconciliationMenu" *mifosxHasPermission="'MENU_CONFIG_WIZARD'">
<fa-icon icon="sync-alt" class="ni-ico"></fa-icon>Reconciliation
<fa-icon icon="caret-down" class="ni-caret"></fa-icon>
</a>
<a class="ni" tabindex="0" [matMenuTriggerFor]="ckycMenu" *mifosxHasPermission="'MENU_CKYC_MGMT'">
<fa-icon icon="fingerprint" class="ni-ico"></fa-icon>CKYC Mgmt
@@ -270,6 +271,16 @@
<button mat-menu-item routerLink="/otp-audit-logs" tabindex="0">
<i class="fa fa-key menu-item-icon"></i> OTP Audit Logs
</button>
<mat-divider></mat-divider>
<button mat-menu-item tabindex="0">
<fa-icon icon="building" class="menu-item-icon" style="color: #7c3aed"></fa-icon> Bank Profile
</button>
<button mat-menu-item tabindex="0">
<fa-icon icon="user-tie" class="menu-item-icon" style="color: #7c3aed"></fa-icon> Statutory Auditor Appointment
</button>
<button mat-menu-item tabindex="0">
<fa-icon icon="clipboard-check" class="menu-item-icon" style="color: #7c3aed"></fa-icon> Internal Audit Report
</button>
</mat-menu>
<!-- Sub Ledger Mega Menu -->
@@ -745,6 +756,9 @@
<!-- General -->
<div class="deposit-menu-group">
<div class="deposit-group-title">General</div>
<button mat-menu-item tabindex="0">
<fa-icon icon="user-slash" class="menu-item-icon" style="color: #c2410c"></fa-icon> Non-Customer Entry
</button>
<button mat-menu-item tabindex="0"><fa-icon icon="lock" class="menu-item-icon"></fa-icon> Locker</button>
<button mat-menu-item tabindex="0">
<fa-icon icon="chart-line" class="menu-item-icon"></fa-icon> SLR and Non SLR Investment Report
@@ -853,6 +867,108 @@
<button mat-menu-item tabindex="0" (click)="openCkycReportsDialog('CERSAI')">
<fa-icon icon="shield-alt" class="menu-item-icon" style="color: #be185d"></fa-icon> CERSAI Report
</button>
<mat-divider></mat-divider>
<button mat-menu-item tabindex="0">
<fa-icon icon="database" class="menu-item-icon" style="color: #be185d"></fa-icon> Dump KYC &amp; Loan Data
</button>
</mat-menu>
<!-- Reconciliation Mega Menu -->
<mat-menu #reconciliationMenu="matMenu" class="reconciliation-mega-panel" [overlapTrigger]="false">
<div class="deposit-menu-grid reconciliation-grid" (click)="$event.stopPropagation()">
<!-- Core / Books -->
<div class="deposit-menu-group">
<div class="deposit-group-title">Core &amp; Books</div>
<button mat-menu-item tabindex="0">
<fa-icon icon="receipt" class="menu-item-icon" style="color: #0d9488"></fa-icon>
Voucher Reconciliation
</button>
<button mat-menu-item tabindex="0">
<fa-icon icon="random" class="menu-item-icon" style="color: #0d9488"></fa-icon>
Sundry Dr / Cr Reconciliation
</button>
<button mat-menu-item tabindex="0">
<fa-icon icon="chart-line" class="menu-item-icon" style="color: #0d9488"></fa-icon>
P&amp;L Impact Reconciliation
</button>
<button mat-menu-item tabindex="0">
<fa-icon icon="book-open" class="menu-item-icon" style="color: #0d9488"></fa-icon>
GL Reconciliation
</button>
<button mat-menu-item tabindex="0">
<fa-icon icon="cube" class="menu-item-icon" style="color: #0d9488"></fa-icon>
Fixed Assets Reconciliation
</button>
<button mat-menu-item tabindex="0">
<fa-icon icon="sitemap" class="menu-item-icon" style="color: #0d9488"></fa-icon>
Inter-Company Reconciliation
</button>
</div>
<!-- Bank & Clearing -->
<div class="deposit-menu-group">
<div class="deposit-group-title">Bank &amp; Clearing</div>
<button mat-menu-item tabindex="0">
<fa-icon icon="university" class="menu-item-icon" style="color: #0d9488"></fa-icon>
Bank Reconciliation
</button>
<button mat-menu-item tabindex="0">
<fa-icon icon="code-branch" class="menu-item-icon" style="color: #0d9488"></fa-icon>
API Based Bank Reconciliation
</button>
<button mat-menu-item tabindex="0">
<fa-icon icon="exchange" class="menu-item-icon" style="color: #0d9488"></fa-icon>
NEFT / RTGS Reconciliation
</button>
<button mat-menu-item tabindex="0">
<fa-icon icon="hand-holding-usd" class="menu-item-icon" style="color: #0d9488"></fa-icon>
Clearing Reconciliation
</button>
</div>
<!-- Digital / Payments -->
<div class="deposit-menu-group">
<div class="deposit-group-title">Digital &amp; Payments</div>
<button mat-menu-item tabindex="0">
<fa-icon icon="mobile-alt" class="menu-item-icon" style="color: #0d9488"></fa-icon>
UDIR (IMPS / UPI / ATM)
</button>
<button mat-menu-item tabindex="0">
<fa-icon icon="project-diagram" class="menu-item-icon" style="color: #0d9488"></fa-icon>
Three-way Digital Reconciliation
</button>
<button mat-menu-item tabindex="0">
<fa-icon icon="sync-alt" class="menu-item-icon" style="color: #0d9488"></fa-icon>
NACH Reconciliation
</button>
</div>
<!-- Instruments & Members -->
<div class="deposit-menu-group">
<div class="deposit-group-title">Instruments &amp; Members</div>
<button mat-menu-item tabindex="0">
<fa-icon icon="money-check-alt" class="menu-item-icon" style="color: #0d9488"></fa-icon>
DD / Pay Order Reconciliation
</button>
<button mat-menu-item tabindex="0">
<fa-icon icon="coins" class="menu-item-icon" style="color: #0d9488"></fa-icon>
Share Member Reconciliation
</button>
</div>
<!-- Compliance & Financials -->
<div class="deposit-menu-group">
<div class="deposit-group-title">Compliance &amp; Financials</div>
<button mat-menu-item tabindex="0">
<fa-icon icon="file-invoice" class="menu-item-icon" style="color: #0d9488"></fa-icon>
Invoice Payment
</button>
<button mat-menu-item tabindex="0">
<fa-icon icon="percentage" class="menu-item-icon" style="color: #0d9488"></fa-icon>
Tax Reconciliation
</button>
</div>
</div>
</mat-menu>
<mat-menu #advancesMenu="matMenu" class="advances-mega-panel" [overlapTrigger]="false">
@@ -885,6 +1001,9 @@
<button mat-menu-item tabindex="0">
<fa-icon icon="check-circle" class="menu-item-icon"></fa-icon> Loan Sanction
</button>
<button mat-menu-item tabindex="0">
<fa-icon icon="shield-alt" class="menu-item-icon"></fa-icon> Security Wise Report
</button>
</div>
<!-- Recovery & Cash Flow -->
<div class="deposit-menu-group">
@@ -922,14 +1041,25 @@
<div class="deposit-menu-group">
<div class="deposit-group-title">Printing</div>
<button mat-menu-item tabindex="0">
<fa-icon icon="print" class="menu-item-icon"></fa-icon> FD Printing / Renewal
</button>
<button mat-menu-item tabindex="0"><fa-icon icon="book" class="menu-item-icon"></fa-icon> Passbook</button>
<button mat-menu-item tabindex="0">
<fa-icon icon="file-alt" class="menu-item-icon"></fa-icon> Statement
<fa-icon icon="receipt" class="menu-item-icon" style="color: #15803d"></fa-icon> Voucher
</button>
<button mat-menu-item tabindex="0">
<fa-icon icon="receipt" class="menu-item-icon"></fa-icon> Voucher Printing
<fa-icon icon="book" class="menu-item-icon" style="color: #15803d"></fa-icon> Passbook
</button>
<button mat-menu-item tabindex="0">
<fa-icon icon="file-alt" class="menu-item-icon" style="color: #15803d"></fa-icon> Statement
</button>
<button mat-menu-item tabindex="0">
<fa-icon icon="print" class="menu-item-icon" style="color: #15803d"></fa-icon> FD / Renewal
</button>
<button mat-menu-item tabindex="0">
<fa-icon icon="coins" class="menu-item-icon" style="color: #15803d"></fa-icon> Share Member
</button>
<button mat-menu-item tabindex="0">
<fa-icon icon="money-check-alt" class="menu-item-icon" style="color: #15803d"></fa-icon> Demand Draft (DD)
</button>
<button mat-menu-item tabindex="0">
<fa-icon icon="envelope" class="menu-item-icon" style="color: #15803d"></fa-icon> Letter
</button>
</div>
<!-- Certificates -->
@@ -942,6 +1072,9 @@
<button mat-menu-item routerLink="/letter-mgmt/form-60" tabindex="0">
<fa-icon icon="file-signature" class="menu-item-icon" style="color: #15803d"></fa-icon> Form 60
</button>
<button mat-menu-item tabindex="0">
<fa-icon icon="file-signature" class="menu-item-icon" style="color: #15803d"></fa-icon> Form 61
</button>
<button mat-menu-item routerLink="/letter-mgmt/form-15gh" tabindex="0">
<fa-icon icon="file-signature" class="menu-item-icon" style="color: #15803d"></fa-icon> Form 15G and H
</button>
@@ -956,10 +1089,6 @@
<button mat-menu-item routerLink="/letter-mgmt/noc" tabindex="0">
<fa-icon icon="id-card" class="menu-item-icon" style="color: #15803d"></fa-icon> NOC
</button>
<button mat-menu-item routerLink="/kyc-management" tabindex="0">
<fa-icon icon="fingerprint" class="menu-item-icon" style="color: #15803d"></fa-icon>
KYC &amp; ReKYC Management
</button>
<button mat-menu-item tabindex="0">
<fa-icon icon="money-bill-wave" class="menu-item-icon"></fa-icon> Digital Transaction UTR
</button>
@@ -1078,6 +1207,41 @@
Returns)
</a>
</div>
<!-- Income Tax & Ratios -->
<div class="gl-group">
<div class="gl-group-title">Income Tax &amp; Ratios</div>
<a class="gl-link" [class.hidden]="!matchesRbiSearch('Form 24Q 26Q TDS')" (click)="rbiMenuOpen = false">
<fa-icon icon="file-signature" class="gl-icon" style="color: #1d4ed8"></fa-icon> Form 24Q and 26Q
</a>
<a class="gl-link" [class.hidden]="!matchesRbiSearch('MCPR Reporting')" (click)="rbiMenuOpen = false">
<fa-icon icon="clipboard-check" class="gl-icon" style="color: #1d4ed8"></fa-icon> MCPR Reporting
</a>
<a
class="gl-link"
[class.hidden]="!matchesRbiSearch('FSWM Financially Sound')"
(click)="rbiMenuOpen = false"
>
<fa-icon icon="shield-alt" class="gl-icon" style="color: #1d4ed8"></fa-icon> FSWM
</a>
<a class="gl-link" [class.hidden]="!matchesRbiSearch('CD Ratio')" (click)="rbiMenuOpen = false">
<fa-icon icon="percentage" class="gl-icon" style="color: #1d4ed8"></fa-icon> CD Ratio
</a>
<a
class="gl-link"
[class.hidden]="!matchesRbiSearch('Capital Tier 1 Tier 2 CRAR')"
(click)="rbiMenuOpen = false"
>
<fa-icon icon="layer-group" class="gl-icon" style="color: #1d4ed8"></fa-icon> Capital Tier 1 / Tier 2
</a>
<a
class="gl-link"
[class.hidden]="!matchesRbiSearch('Deposit Portion Advance Ratio')"
(click)="rbiMenuOpen = false"
>
<fa-icon icon="balance-scale" class="gl-icon" style="color: #1d4ed8"></fa-icon> Deposit Portion / Advance
Ratio
</a>
</div>
<!-- Statement Reports -->
<div class="gl-group">
<div class="gl-group-title">Statement Reports</div>
+12
View File
@@ -537,6 +537,18 @@ $gray-700: #334155;
}
}
/* Reconciliation Mega Panel — 5 columns, teal accent to match the icon palette */
.reconciliation-grid {
grid-template-columns: repeat(5, minmax(190px, 1fr));
min-width: 1040px;
max-width: 96vw;
.deposit-group-title {
color: #0d9488;
border-bottom-color: #0d9488;
}
}
/* General Ledger Mega Menu */
.gl-backdrop {
position: fixed;
+2
View File
@@ -26,6 +26,7 @@ import { ContentComponent } from './content/content.component';
import { FooterComponent } from '../../shared/footer/footer.component';
import { FaIconComponent } from '@fortawesome/angular-fontawesome';
import { MatMenuModule } from '@angular/material/menu';
import { MatDividerModule } from '@angular/material/divider';
import { MatTooltipModule } from '@angular/material/tooltip';
import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module';
@@ -50,6 +51,7 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module';
AsyncPipe,
FaIconComponent,
MatMenuModule,
MatDividerModule,
MatTooltipModule
]
})