KYC management: stage-wise notices, pagination, RD base chart
This commit is contained in:
@@ -43,6 +43,8 @@ import { KycUploadHelperService } from '../../shared/kyc-upload-helper.service';
|
||||
import { CaptureImageDialogComponent } from '../../clients-view/custom-dialogs/capture-image-dialog/capture-image-dialog.component';
|
||||
import { DrawSignatureDialogComponent } from '../../clients-view/custom-dialogs/draw-signature-dialog/draw-signature-dialog.component';
|
||||
import { dataUrlToFile } from 'app/shared/utils/data-url.util';
|
||||
import { aadhaarHash } from '../../utils/aadhaar-hash.util';
|
||||
import { ClientIdentityState } from '../client-identity-check/client-identity-check.component';
|
||||
import { DocumentPreviewDialogComponent } from '../../shared/document-preview-dialog/document-preview-dialog.component';
|
||||
import {
|
||||
PanDeclarationDialogComponent,
|
||||
@@ -108,6 +110,32 @@ export class ClientKycStepComponent implements OnInit, OnChanges, OnDestroy {
|
||||
@Input() verificationDateOfBirth: Date | null = null;
|
||||
/** Read-only mode — disables form editing until user clicks edit icon */
|
||||
@Input() readOnly = false;
|
||||
|
||||
/**
|
||||
* The identifiers the officer already typed into the existing-customer check on the General step. They are filled
|
||||
* in here so they are not typed twice, but only into fields that are still empty: whatever was entered on this
|
||||
* step wins. Ignored while the check says the customer already exists, since no client is created then.
|
||||
*/
|
||||
@Input() set identityPrefill(identity: ClientIdentityState | null) {
|
||||
if (!identity || identity.blocking) {
|
||||
return;
|
||||
}
|
||||
const isEmpty = (name: string) => !String(this.kycForm?.get(name)?.value ?? '').trim();
|
||||
const patch: Record<string, unknown> = {};
|
||||
if (this.isNonIndividual) {
|
||||
if (identity.gstin && isEmpty('gstinNumber')) patch['gstinNumber'] = identity.gstin;
|
||||
if (identity.pan && isEmpty('enterprisePan')) patch['enterprisePan'] = identity.pan;
|
||||
} else {
|
||||
if (identity.pan && isEmpty('panNumber')) {
|
||||
patch['panNumber'] = identity.pan;
|
||||
patch['hasPan'] = true;
|
||||
}
|
||||
if (identity.aadhaar && isEmpty('aadhaarNumber')) patch['aadhaarNumber'] = identity.aadhaar;
|
||||
}
|
||||
if (Object.keys(patch).length) {
|
||||
this.kycForm.patchValue(patch);
|
||||
}
|
||||
}
|
||||
@Input() calculatedRisk: {
|
||||
category: number;
|
||||
reason: string;
|
||||
@@ -1756,7 +1784,8 @@ export class ClientKycStepComponent implements OnInit, OnChanges, OnDestroy {
|
||||
kycType: this.kycTypeValue,
|
||||
riskCategory: this.currentRiskCategory,
|
||||
panNumber: pan,
|
||||
aadhaarNumberMasked: aadhaarRaw.length === 12 ? 'XXXXXXXX' + aadhaarRaw.slice(-4) : 'XXXXXXXX0000'
|
||||
aadhaarNumberMasked: aadhaarRaw.length === 12 ? 'XXXXXXXX' + aadhaarRaw.slice(-4) : 'XXXXXXXX0000',
|
||||
...this.aadhaarHashField(aadhaarRaw)
|
||||
};
|
||||
|
||||
// A proprietorship reaches this method (it verifies the proprietor's individual PAN) but is
|
||||
@@ -2358,7 +2387,8 @@ export class ClientKycStepComponent implements OnInit, OnChanges, OnDestroy {
|
||||
locale: 'en',
|
||||
kycType: this.kycTypeValue,
|
||||
riskCategory: this.currentRiskCategory,
|
||||
aadhaarNumberMasked: aadhaarMasked
|
||||
aadhaarNumberMasked: aadhaarMasked,
|
||||
...this.aadhaarHashField(aadhaar)
|
||||
};
|
||||
const panVal = this.kycForm.value.panNumber;
|
||||
if (panVal) {
|
||||
@@ -2679,6 +2709,15 @@ export class ClientKycStepComponent implements OnInit, OnChanges, OnDestroy {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* `{ aadhaarHash }` for a full 12-digit Aadhaar, `{}` otherwise. The number itself is never sent: KYC calls are
|
||||
* recorded server-side, so only its SHA-256 goes.
|
||||
*/
|
||||
private aadhaarHashField(aadhaar: string | null | undefined): { aadhaarHash?: string } {
|
||||
const hash = aadhaarHash(aadhaar);
|
||||
return hash ? { aadhaarHash: hash } : {};
|
||||
}
|
||||
|
||||
get kycData(): any {
|
||||
const formVal = this.kycForm.getRawValue();
|
||||
const aadhaarRaw = formVal.aadhaarNumber || '';
|
||||
@@ -2707,6 +2746,9 @@ export class ClientKycStepComponent implements OnInit, OnChanges, OnDestroy {
|
||||
// For non-individual: Company PAN is used as panNumber for verification
|
||||
panNumber: this.isNonIndividual ? enterprisePanNorm : v.hasPan ? panNorm : null,
|
||||
aadhaarNumberMasked: this.isNonIndividual ? 'XXXXXXXX0000' : aadhaarMasked,
|
||||
// The fingerprint of the full number, so the server can tell two Aadhaar numbers apart (the masked form keeps
|
||||
// only the last four digits). Absent when the field holds a masked value reloaded from the server.
|
||||
...(this.isNonIndividual ? {} : this.aadhaarHashField(aadhaarRaw)),
|
||||
// Only ever sent when this screen actually holds a value. The seeding status is derived by
|
||||
// the provider during PAN verification and written straight to the record, so sending an
|
||||
// empty one back would blank a field the server filled in — which reads as an officer
|
||||
|
||||
Reference in New Issue
Block a user