feat: MFA/2FA, OTP audit logs, KYC + client/user enhancements

- Access Control module: SMS/Email/TOTP/Hardware-token MFA factor management
- OTP Audit Logs module under Admin menu (list + detail) with 401/403 handling
- Two-factor authentication login flow updates
- Client KYC, India address, family-members, ckyc, nominee enhancements
- New shared KYC helpers (kyc-proof-types, kyc-upload-helper.service)
- User create/edit/view enhancements
- Shell navigation: OTP Audit Logs entry under real Admin menu
This commit is contained in:
Aditya
2026-05-10 13:24:48 +05:30
parent 2d4fb4237e
commit 3b752dc6ae
56 changed files with 7741 additions and 599 deletions
@@ -77,6 +77,74 @@
}
</div>
<!-- KYC Verification Status (Aadhaar + PAN) -->
<div class="kyc-status-card" [class.kyc-status-card--complete]="kycComplete">
<div class="kyc-status-card__head">
<div class="kyc-status-card__title">
<fa-icon [icon]="kycComplete ? 'shield-alt' : 'user-shield'" class="kyc-status-card__icon"></fa-icon>
<span>KYC Verification</span>
</div>
@if (kycComplete) {
<span class="kyc-status-card__badge kyc-status-card__badge--ok">
<fa-icon icon="check-circle"></fa-icon>
KYC Done
</span>
} @else if (panVerified || aadhaarVerified) {
<span class="kyc-status-card__badge kyc-status-card__badge--partial">
<fa-icon icon="clock"></fa-icon>
Partially Verified
</span>
} @else {
<span class="kyc-status-card__badge kyc-status-card__badge--pending">
<fa-icon icon="exclamation-circle"></fa-icon>
Not Verified
</span>
}
</div>
<div class="kyc-status-card__body">
<div class="kyc-status-row">
<div class="kyc-status-row__label">
<fa-icon icon="id-card"></fa-icon>
<span>PAN</span>
</div>
@if (panVerified) {
<div class="kyc-status-row__value">
<span class="kyc-status-row__id">{{ panNumber || '—' }}</span>
@if (panHolderName) {
<span class="kyc-status-row__name">{{ panHolderName }}</span>
}
</div>
<span class="kyc-pill kyc-pill--ok"><fa-icon icon="check-circle"></fa-icon> Verified</span>
} @else {
<span class="kyc-status-row__value kyc-status-row__value--missing">{{ panNumber || 'Not provided' }}</span>
<span class="kyc-pill kyc-pill--pending"><fa-icon icon="times-circle"></fa-icon> Pending</span>
}
</div>
<div class="kyc-status-row">
<div class="kyc-status-row__label">
<fa-icon icon="fingerprint"></fa-icon>
<span>Aadhaar</span>
</div>
@if (aadhaarVerified) {
<div class="kyc-status-row__value">
<span class="kyc-status-row__id">{{ aadhaarMasked || '—' }}</span>
@if (aadhaarHolderName) {
<span class="kyc-status-row__name">{{ aadhaarHolderName }}</span>
}
</div>
<span class="kyc-pill kyc-pill--ok"><fa-icon icon="check-circle"></fa-icon> Verified</span>
} @else {
<span class="kyc-status-row__value kyc-status-row__value--missing">{{
aadhaarMasked || 'Not provided'
}}</span>
<span class="kyc-pill kyc-pill--pending"><fa-icon icon="times-circle"></fa-icon> Pending</span>
}
</div>
</div>
</div>
<!-- Client basic info -->
<div class="ckyc-info-grid">
<div class="ckyc-info-item">