{{ 'labels.heading.Record Master' | translate }}

Clients missing CKYC registration or required artefacts

@if (loading) {
Loading CKYC records…
} @if (error && !loading) {
{{ error }}
} @if (!loading && !error && rows.length === 0) {

No records found

All clients matching your filters have complete CKYC artefacts. 🎉

} @if (!loading && rows.length > 0) {
Showing {{ pageStart }}–{{ pageEnd }} of {{ totalFilteredRecords }} @if (selected.size > 0) { {{ selected.size }} selected }
@for (row of rows; track row.clientId) { }
Client Contact Address Artefacts Completion Actions
{{ row.fullName?.charAt(0) || '?' }}
{{ row.fullName }}
{{ row.email || 'No email' }}
{{ row.mobile || 'No mobile' }}
{{ row.address || 'No address on file' }}
P S ID Ad
{{ artefactCompletion(row) }}/4
Rows per page:
{{ pageStart }}–{{ pageEnd }}
} @if (selected.size > 0) {
{{ selected.size }} selected
@if (selectedIncompleteCount > 0) { {{ selectedIncompleteCount }} incomplete }
} @if (showViewDialog && viewDetails) {
Client KYC details
{{ viewDetails.row.fullName?.charAt(0) || '?' }}
{{ viewDetails.row.fullName }}
CIF {{ viewDetails.row.accountNo }} • {{ viewDetails.row.email || 'No email' }} • {{ viewDetails.row.mobile || 'No mobile' }}
@if (viewLoading) {
Loading KYC details…
}
KYC Snapshot
KYC Status
@if (viewDetails.kycStatus) {
{{ viewDetails.kycStatus }}
} @else {
—
}
KYC Date
{{ viewDetails.kycDate || '—' }}
Expiry Date
{{ viewDetails.expiryDate || '—' }}
Risk Category
{{ viewDetails.riskCategory || '—' }}
CKYC Documents
{{ label }}
{{ slot.name }} @if (slot.key) { {{ slot.key }} }
@if (slot.files?.length) {
@for (file of slot.files; track file.id) {
@if (file.previewUrl && file.isImage !== false && !file.isPdf) { } @else if (file.isPdf) {
} @else {
}
@if (file.fileName) { {{ file.fileName }} } @else { {{ file.name }} }
}
} @else if (slot.present) {
Loading preview…
}
} @if (showZipDialog) {
Auto ZIP Creation

Bundling {{ selected.size }} client record{{ selected.size === 1 ? '' : 's' }} into CERSAI-format ZIP. Files will be packaged with an SHA-256 checksum and registered for SFTP upload.

@if (selectedIncompleteCount > 0 && !zipRunning && !zipResult) {
{{ selectedIncompleteCount }} record(s) are missing artefacts. They will still be packaged but flagged as incomplete in the manifest.
} @if (!zipRunning && !zipResult) {
}
    @for (phase of zipPhases; track phase.key; let i = $index) {
  1. @if (phase.status === 'done') { } @else if (phase.status === 'active') { } @else if (phase.status === 'failed') { } @else { {{ i + 1 }} }
    {{ phase.label }}
    @if (phase.message) {
    {{ phase.message }}
    }
  2. }
@if (zipResult && !zipResult.error) {
Batch created successfully
Batch ID {{ zipResult.batchId }}
Filename {{ zipResult.filename }}
Records {{ zipResult.recordCount }}
@if (zipResult.sizeBytes) {
Size {{ (zipResult.sizeBytes / 1024 / 1024).toFixed(2) }} MB
} @if (zipResult.createdOn) {
Created on {{ zipResult.createdOn }}
} @if (zipResult.documentId) {
Document ID #{{ zipResult.documentId }}
}
Checksum {{ zipResult.checksum }}
@if (zipResult.manifest && zipResult.manifest.length > 0) {
@if (manifestExpanded) {
@for (entry of zipResult.manifest; track entry.clientId) { }
Client P S ID Ad Total size
{{ entry.displayName || 'Client ' + entry.clientId }} @if (entry.cifNumber) { {{ entry.cifNumber }} }
{{ formatBytes( (entry.photo?.bytes || 0) + (entry.signature?.bytes || 0) + (entry.idProof?.bytes || 0) + (entry.addressProof?.bytes || 0) ) }}
}
} } @if (zipResult?.error) {
Batch creation failed {{ zipResult!.error }}
}
} @if (showUploadDialog) {
SFTP Upload to CERSAI

Transferring batch to the CERSAI SFTP drop server and waiting for acknowledgement. On success, the returned CKYC numbers will be saved against each client's master record.

@if (uploadResult?.status === 'ALREADY_UPLOADED') {
Batch already uploaded. {{ uploadResult?.remarks || 'No action was taken.' }}
}
    @for (phase of uploadPhases; track phase.key; let i = $index) {
  1. @if (phase.status === 'done') { } @else if (phase.status === 'active') { } @else if (phase.status === 'failed') { } @else { {{ i + 1 }} }
    {{ phase.label }}
    @if (phase.message) {
    {{ phase.message }}
    }
  2. }
@if (uploadResult && !uploadResult.error) {
@if (uploadResult.status === 'ALREADY_UPLOADED') { Batch already uploaded to CERSAI } @else { Upload successful — ACK received }
CERSAI Reference {{ uploadResult.cersaiReference }}
Batch ID {{ uploadResult.batchId }}
Uploaded on {{ uploadResult.uploadedOn }}
@if (uploadResult.receivedAt) {
Received at {{ uploadResult.receivedAt }}
}
Records {{ uploadResult.processedRecords }} / {{ uploadResult.totalRecords }}
Status {{ uploadResult.status }}
Checksum sent {{ uploadResult.checksumSent }}
Checksum verified {{ uploadResult.checksumVerified }}
@if (uploadResult.perClientCkycNumbers && uploadResult.perClientCkycNumbers.length > 0) {
Issued CKYC numbers ({{ uploadResult.perClientCkycNumbers.length }})
@for (c of uploadResult.perClientCkycNumbers; track c.clientId) { }
Client CIF CKYC Number Status
#{{ c.clientId }} {{ c.cifNumber }} {{ c.ckycNumber }} {{ c.status }}
} } @if (uploadResult?.error) {
Upload failed {{ uploadResult!.error }}
}
}