feat: add nominee, auto-debit, charges UI for SB/CA/FD/RD accounts; enforce required fields

- SB/CA/FD/RD Currency Step: add Nomination Facility toggle with multi-nominee form
  (NomineeFormComponent), auto-debit facility toggle, dormancy alert panel
- SB/CA/FD/RD Preview Step: display nominees list, auto-debit status, dormancy info
- FD/RD create component: validate Deposit Tenure, Monthly Installment (RD), and
  Customer Segment are filled before submit; show clear alert messages on missing fields
- FD account details step: remove duplicate Currency section (already shown in
  Currency & Account Status Configuration step)
- CA/SB create component: handle duplicate externalId API error with user-friendly alert
  instead of raw error display

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Nitesh Yadav
2026-05-20 08:08:08 +05:30
co-authored by Claude Sonnet 4.6
parent 37ac15f42c
commit 3df7d100df
29 changed files with 1658 additions and 443 deletions
@@ -473,78 +473,53 @@
}
<!-- ══ 7. Nominee Details (if filled) ═══════════════════════════ -->
@if (savingsAccountNominee) {
@if (savingsAccountNominees?.length > 0) {
<div class="preview-section">
<div class="preview-section__header">
<i class="fas fa-user-shield preview-section__icon"></i>
<span class="preview-section__title">Nominee Details</span>
<span class="preview-section__badge">{{ savingsAccountNominee?.nominationType || 'DA1' }}</span>
<span class="preview-section__badge">{{ savingsAccountNominees.length }} Nominee(s)</span>
</div>
<div class="preview-body">
<div class="preview-grid preview-grid--three">
<div class="preview-field">
<span class="preview-label">Name</span>
<span class="preview-value">{{ savingsAccountNominee?.nomineeDisplayName || '—' }}</span>
@for (nom of savingsAccountNominees; track nom.nomineeClientId; let i = $index) {
@if (i > 0) {
<hr class="preview-nom-divider" />
}
<div class="preview-grid preview-grid--three">
<div class="preview-field">
<span class="preview-label">Name</span>
<span class="preview-value">{{ nom.nomineeDisplayName || '—' }}</span>
</div>
<div class="preview-field">
<span class="preview-label">Client ID</span>
<span class="preview-value preview-mono">{{ nom.nomineeClientId || '—' }}</span>
</div>
<div class="preview-field">
<span class="preview-label">Relationship</span>
<span class="preview-value">{{ nom.relationshipName || '—' }}</span>
</div>
<div class="preview-field">
<span class="preview-label">Share %</span>
<span class="preview-value">{{ nom.percentageShare ?? '—' }}%</span>
</div>
<div class="preview-field">
<span class="preview-label">Minor</span>
<span class="preview-value">{{ nom.nomineeIsMinor ? 'Yes' : 'No' }}</span>
</div>
@if (nom.guardianDisplayName) {
<div class="preview-field">
<span class="preview-label">Guardian</span>
<span class="preview-value">{{ nom.guardianDisplayName }}</span>
</div>
}
@if (nom.remarks) {
<div class="preview-field">
<span class="preview-label">Remarks</span>
<span class="preview-value">{{ nom.remarks }}</span>
</div>
}
</div>
<div class="preview-field">
<span class="preview-label">Client ID</span>
<span class="preview-value preview-mono">{{ savingsAccountNominee?.nomineeClientId || '—' }}</span>
</div>
<div class="preview-field">
<span class="preview-label">Relationship</span>
<span class="preview-value">{{ savingsAccountNominee?.relationshipName || '—' }}</span>
</div>
<div class="preview-field">
<span class="preview-label">Share %</span>
<span class="preview-value">{{ savingsAccountNominee?.percentageShare ?? '—' }}%</span>
</div>
<div class="preview-field">
<span class="preview-label">Minor</span>
<span class="preview-value">{{ savingsAccountNominee?.nomineeIsMinor ? 'Yes' : 'No' }}</span>
</div>
@if (savingsAccountNominee?.nomineeDateOfBirth) {
<div class="preview-field">
<span class="preview-label">Date of Birth</span>
<span class="preview-value">{{ savingsAccountNominee?.nomineeDateOfBirth | dateFormat }}</span>
</div>
}
@if (savingsAccountNominee?.nomineeMobileNo) {
<div class="preview-field">
<span class="preview-label">Mobile No</span>
<span class="preview-value preview-mono">{{ savingsAccountNominee?.nomineeMobileNo }}</span>
</div>
}
@if (savingsAccountNominee?.nomineeAadhaar) {
<div class="preview-field">
<span class="preview-label">Aadhaar</span>
<span class="preview-value preview-mono">{{ savingsAccountNominee?.nomineeAadhaar }}</span>
</div>
}
@if (savingsAccountNominee?.nomineePan) {
<div class="preview-field">
<span class="preview-label">PAN</span>
<span class="preview-value preview-mono">{{ savingsAccountNominee?.nomineePan }}</span>
</div>
}
@if (savingsAccountNominee?.guardianDisplayName) {
<div class="preview-field">
<span class="preview-label">Guardian</span>
<span class="preview-value">{{ savingsAccountNominee?.guardianDisplayName }}</span>
</div>
}
@if (savingsAccountNominee?.guardianClientId) {
<div class="preview-field">
<span class="preview-label">Guardian Client ID</span>
<span class="preview-value preview-mono">{{ savingsAccountNominee?.guardianClientId }}</span>
</div>
}
@if (savingsAccountNominee?.remarks) {
<div class="preview-field">
<span class="preview-label">Remarks</span>
<span class="preview-value">{{ savingsAccountNominee?.remarks }}</span>
</div>
}
</div>
}
</div>
</div>
}
@@ -90,8 +90,8 @@ export class SavingsAccountPreviewStepComponent implements OnChanges {
@Input() savingsAccount: any;
/** Digital facilities — user-modified values from digital step */
@Input() savingsAccountDigital: any;
/** Nominee data from currency step */
@Input() savingsAccountNominee: any;
/** Nominees list from currency step */
@Input() savingsAccountNominees: any[] = [];
/** active Client Members in case of GSIM Account */
@Input() activeClientMembers?: any;