feat: Client & CKYC UI improvements — filters, KYC management, image crop+merge

- Clients list: CKYC icon, CKYC Number column, status/legal form/CKYC filters
- CKYC: SFTP upload logs, date formatting, modal z-index fix, non-dismissible dialogs
- KYC Management: new standalone module with alert dashboard, notification scheduler, audit inventory, account status
- Image cropper: ngx-image-cropper integration for front+back document merge into single PNG
- Sidebar: KYC Management menu entry after CKYC

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
Aditya
2026-04-16 13:51:11 +05:30
co-authored by Claude Opus 4.6
parent 79e455c4ed
commit d72e969dc3
210 changed files with 14273 additions and 1139 deletions
@@ -40,6 +40,7 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module';
import { DateFormatPipe } from '../../../pipes/date-format.pipe';
import { SanctionsVerifyDialogComponent } from './sanctions-verify-dialog.component';
import { DipVerifyDialogComponent } from './dip-verify-dialog.component';
import { DinVerifyDialogComponent } from './din-verify-dialog.component';
/**
* Create Client Component
@@ -824,6 +825,49 @@ export class ClientGeneralStepComponent implements OnInit, OnDestroy, OnChanges
this.syncSignatoryNames();
this.fetchClientFullDetails(client.id, sig);
this.openDinVerifyDialog(sig);
}
/** Open DIN verification dialog for a signatory */
openDinVerifyDialog(sig: any): void {
const cid = sig.id?.toString();
if (!cid) return;
const entityName = this.createClientForm.get('fullname')?.value || '';
const openDialog = (kycId: string, panFromKyc?: string) => {
const ref = this.dialog.open(DinVerifyDialogComponent, {
width: '620px',
maxWidth: '95vw',
disableClose: false,
autoFocus: true,
data: {
clientId: cid,
kycId,
signatoryName: sig.displayName || '',
cifNumber: sig.cifNumber || sig.accountNumber || cid,
panNumber: sig.panNumber || panFromKyc || '-',
entityName
}
});
ref.afterClosed().subscribe((result: any) => {
if (result && !result.skipped) {
sig.dinNumber = result.dinNumber || '';
sig.dinVerified = result.dinVerified || false;
sig.directorName = result.directorName || '';
sig.dinStatus = result.dinStatus || '';
sig.dinDesignation = result.dinDesignation || '';
sig.companyMatch = result.companyMatch ?? null;
sig.matchedCompany = result.matchedCompany || '';
}
});
};
// Fetch KYC ID first, then open dialog
this.clientService.getClientKyc(cid).subscribe({
next: (kyc: any) => openDialog(kyc?.id?.toString() || '', kyc?.panNumber),
error: () => openDialog('')
});
}
removeSignatoryAt(index: number): void {