feat: client extra fields + KYC home-visit & video-KYC dialogs

- Add Education Level, Degree/Qualification, Religion, Social Category dropdowns (individual clients) with dependent filtering on the create/edit/preview/view flows
- Add Agriculture Income & Non-Agriculture Income fields under Financial & Classification
- Gate Save with a Verify Client alert dialog when sanctions screening is not yet performed
- Trim Office Name and CKYC Number columns from clients list; widen table to fill container
- Remove DIP/Screening log IDs from preview and personal-data tabs
- Rename "Branch Visit" to "Home Visit" across KYC management
- Wire Take Action: open dedicated dialogs for Schedule Home Visit (officer + datetime) and Send Video KYC link (channels + officer + 48h expiry + session preview)
- Migrate Signatory and Guardian image dialogs to inject() for prefer-inject lint rule

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
Aditya
2026-04-27 16:36:58 +05:30
co-authored by Claude Opus 4.7
parent d72e969dc3
commit 52e3395345
15 changed files with 4021 additions and 997 deletions
+30 -29
View File
@@ -90,11 +90,9 @@ export class ClientsComponent implements OnInit {
'displayName',
'accountNumber',
'cifNumber',
'ckycNumber',
'legalForm',
'status',
'profileCompletion',
'officeName',
'actions'
];
dataSource: MatTableDataSource<any> = new MatTableDataSource();
@@ -167,34 +165,37 @@ export class ClientsComponent implements OnInit {
// Use individual subscriptions instead of forkJoin to avoid EMPTY observable issues
clients.forEach((client, i) => {
this.clientService.getClientData(client.id?.toString()).pipe(
catchError(() => of(null))
).subscribe((data: any) => {
if (data?.legalForm) {
clients[i].legalForm = data.legalForm;
this.applyClientFilters();
}
});
this.clientService
.getClientData(client.id?.toString())
.pipe(catchError(() => of(null)))
.subscribe((data: any) => {
if (data?.legalForm) {
clients[i].legalForm = data.legalForm;
this.applyClientFilters();
}
});
this.clientService.getClientKyc(client.id?.toString()).pipe(
catchError(() => of(null))
).subscribe((kyc: any) => {
if (kyc) {
clients[i]._kycDone = kyc.kycStatus === 300;
clients[i]._ckycDone = !!kyc.ckycNumber;
clients[i]._ckycNumber = kyc.ckycNumber || '';
this.applyClientFilters();
}
});
this.clientService
.getClientKyc(client.id?.toString())
.pipe(catchError(() => of(null)))
.subscribe((kyc: any) => {
if (kyc) {
clients[i]._kycDone = kyc.kycStatus === 300;
clients[i]._ckycDone = !!kyc.ckycNumber;
clients[i]._ckycNumber = kyc.ckycNumber || '';
this.applyClientFilters();
}
});
this.clientService.getClientAddressData(client.id?.toString()).pipe(
catchError(() => of(null))
).subscribe((addr: any) => {
if (addr && Array.isArray(addr) && addr.length > 0) {
clients[i]._addressDone = true;
this.applyClientFilters();
}
});
this.clientService
.getClientAddressData(client.id?.toString())
.pipe(catchError(() => of(null)))
.subscribe((addr: any) => {
if (addr && Array.isArray(addr) && addr.length > 0) {
clients[i]._addressDone = true;
this.applyClientFilters();
}
});
});
}
@@ -255,7 +256,7 @@ export class ClientsComponent implements OnInit {
}
getCompletedCount(row: any): number {
return this.getProfileSteps(row).filter(s => s.done).length;
return this.getProfileSteps(row).filter((s) => s.done).length;
}
private resetPaginator() {