update rd,fd,saving and current product update validation end date and and this all account nominee facility code
This commit is contained in:
+4
-4
@@ -52,8 +52,8 @@
|
||||
|
||||
<mifosx-fixed-deposit-account-currency-step
|
||||
[fixedDepositsAccountProductTemplate]="fixedDepositsAccountProductTemplate"
|
||||
>
|
||||
</mifosx-fixed-deposit-account-currency-step>
|
||||
[primaryClientId]="fixedDepositsAccountTemplate?.clientId ?? null"
|
||||
></mifosx-fixed-deposit-account-currency-step>
|
||||
|
||||
<div class="layout-row align-center gap-2percent margin-t responsive-column">
|
||||
<button mat-raised-button matStepperPrevious>
|
||||
@@ -98,9 +98,9 @@
|
||||
[fixedDepositsAccountProductTemplate]="fixedDepositsAccountProductTemplate"
|
||||
[fixedDepositAccountData]="fixedDepositAccount"
|
||||
[selectedTenure]="selectedTenure"
|
||||
[fdNominee]="fdNominee"
|
||||
(submitEvent)="submit()"
|
||||
>
|
||||
</mifosx-fixed-deposit-account-preview-step>
|
||||
></mifosx-fixed-deposit-account-preview-step>
|
||||
</mat-step>
|
||||
}
|
||||
</mat-stepper>
|
||||
|
||||
+17
@@ -138,6 +138,10 @@ export class CreateFixedDepositAccountComponent {
|
||||
};
|
||||
}
|
||||
|
||||
get fdNominee() {
|
||||
return this.fixedDepositAccountCurrencyStep?.liveNomineeData ?? null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Submits the fixed deposit form and creates a new fixed deposit account
|
||||
*/
|
||||
@@ -223,6 +227,19 @@ export class CreateFixedDepositAccountComponent {
|
||||
monthDayFormat,
|
||||
locale
|
||||
};
|
||||
const nominee = this.fdNominee;
|
||||
if (nominee) {
|
||||
fixedDepositAccount.nominee = {
|
||||
nomineeClientId: nominee.nomineeClientId,
|
||||
nominationType: nominee.nominationType,
|
||||
relationshipId: nominee.relationshipId,
|
||||
percentageShare: nominee.percentageShare,
|
||||
nomineeIsMinor: nominee.nomineeIsMinor,
|
||||
...(nominee.guardianClientId ? { guardianClientId: nominee.guardianClientId } : {}),
|
||||
remarks: nominee.remarks
|
||||
};
|
||||
}
|
||||
|
||||
this.fixedDepositsService.createFixedDepositAccount(fixedDepositAccount).subscribe((response: any) => {
|
||||
this.router.navigate(
|
||||
[
|
||||
|
||||
+5
-1
@@ -58,7 +58,11 @@
|
||||
<mat-slide-toggle [(ngModel)]="nominationFacility" color="primary"></mat-slide-toggle>
|
||||
</div>
|
||||
@if (nominationFacility) {
|
||||
<mifosx-nominee-form (nomineeChange)="onNomineeChange($event)"></mifosx-nominee-form>
|
||||
<mifosx-nominee-form
|
||||
[primaryClientId]="primaryClientId"
|
||||
[showActions]="false"
|
||||
(nomineeChange)="onNomineeChange($event)"
|
||||
></mifosx-nominee-form>
|
||||
}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
+7
-1
@@ -6,7 +6,7 @@
|
||||
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||
*/
|
||||
|
||||
import { Component, Input, OnChanges, SimpleChanges } from '@angular/core';
|
||||
import { Component, Input, OnChanges, SimpleChanges, ViewChild } from '@angular/core';
|
||||
import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module';
|
||||
import { NomineeFormComponent } from 'app/shared/nominee-form/nominee-form.component';
|
||||
import { DormancyAlertPanelComponent } from 'app/shared/dormancy-alert-panel/dormancy-alert-panel.component';
|
||||
@@ -27,6 +27,8 @@ import { FormsModule } from '@angular/forms';
|
||||
})
|
||||
export class FixedDepositAccountCurrencyStepComponent implements OnChanges {
|
||||
@Input() fixedDepositsAccountProductTemplate: any;
|
||||
@Input() primaryClientId: number | null = null;
|
||||
@ViewChild(NomineeFormComponent) nomineeFormComp: NomineeFormComponent;
|
||||
|
||||
nomineeData: any = null;
|
||||
|
||||
@@ -47,6 +49,10 @@ export class FixedDepositAccountCurrencyStepComponent implements OnChanges {
|
||||
this.nomineeData = event;
|
||||
}
|
||||
|
||||
get liveNomineeData(): any {
|
||||
return this.nomineeFormComp?.currentNomineeData ?? this.nomineeData;
|
||||
}
|
||||
|
||||
/** Called by parent to collect currency step values */
|
||||
get currencyStepData() {
|
||||
return {
|
||||
|
||||
+9
-2
@@ -276,7 +276,11 @@
|
||||
} @else {
|
||||
<div class="dal-list">
|
||||
@for (account of dalFilteredAccounts; track account.id) {
|
||||
<div class="dal-item" (click)="selectLinkedAccount(account)">
|
||||
<div
|
||||
class="dal-item"
|
||||
[class.dal-item--disabled]="account.status !== 'Active'"
|
||||
(click)="selectLinkedAccount(account)"
|
||||
>
|
||||
<div class="dal-item__details">
|
||||
<span class="dal-item__accno">{{ account.accountNo }}</span>
|
||||
<span class="dal-item__product">{{ account.productName }}</span>
|
||||
@@ -653,7 +657,10 @@
|
||||
<mat-icon>manage_accounts</mat-icon>
|
||||
<span>Search & Link Guardian (existing client)</span>
|
||||
</div>
|
||||
<mifosx-introducer-search (introducerChange)="onGuardianChange($event)"></mifosx-introducer-search>
|
||||
<mifosx-introducer-search
|
||||
[excludedClientIds]="primaryClientId ? [primaryClientId] : []"
|
||||
(introducerChange)="onGuardianChange($event)"
|
||||
></mifosx-introducer-search>
|
||||
|
||||
@if (guardianName) {
|
||||
<div class="soa-guardian-selected">
|
||||
|
||||
+17
-16
@@ -415,12 +415,18 @@ $gray-900: #202124;
|
||||
background 0.15s,
|
||||
box-shadow 0.15s;
|
||||
|
||||
&:hover {
|
||||
&:hover:not(&--disabled) {
|
||||
border-color: #0ea5e9;
|
||||
background: #f0f9ff;
|
||||
box-shadow: 0 2px 8px rgb(14 165 233 / 12%);
|
||||
}
|
||||
|
||||
&--disabled {
|
||||
opacity: 0.5;
|
||||
cursor: not-allowed;
|
||||
background: #f8fafc;
|
||||
}
|
||||
|
||||
&__details {
|
||||
flex: 1;
|
||||
display: flex;
|
||||
@@ -1289,36 +1295,31 @@ $gray-900: #202124;
|
||||
}
|
||||
|
||||
.soa-guardian-selected {
|
||||
margin-top: 16px;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 12px;
|
||||
padding: 12px 16px;
|
||||
background: #fff;
|
||||
border: 2px solid #f59e0b;
|
||||
border-radius: 10px;
|
||||
padding: 10px 14px;
|
||||
background: #f0fdf4;
|
||||
border: 1px solid #bbf7d0;
|
||||
border-radius: 8px;
|
||||
margin-top: 10px;
|
||||
|
||||
&__icon {
|
||||
color: #f59e0b;
|
||||
font-size: 24px;
|
||||
height: 24px;
|
||||
width: 24px;
|
||||
color: #16a34a;
|
||||
}
|
||||
|
||||
&__name {
|
||||
font-size: 14px;
|
||||
font-weight: 700;
|
||||
color: #1e293b;
|
||||
font-size: 13px;
|
||||
font-weight: 600;
|
||||
color: #1f2937;
|
||||
}
|
||||
|
||||
&__cif {
|
||||
font-size: 11px;
|
||||
color: #64748b;
|
||||
font-family: monospace;
|
||||
}
|
||||
|
||||
.soa-pill {
|
||||
margin-left: auto;
|
||||
color: #6b7280;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
+10
-2
@@ -23,6 +23,7 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module';
|
||||
import { MatIcon } from '@angular/material/icon';
|
||||
import { AddRelatedClientDialogComponent } from 'app/current-accounts/current-account-stepper/current-account-details-step/add-related-client-dialog/add-related-client-dialog.component';
|
||||
import { AlertService } from 'app/core/alert/alert.service';
|
||||
import { IntroducerSearchComponent } from 'app/shared/introducer-search/introducer-search.component';
|
||||
|
||||
/**
|
||||
* Fixed Deposits Account Details Step
|
||||
@@ -38,7 +39,8 @@ import { AlertService } from 'app/core/alert/alert.service';
|
||||
FaIconComponent,
|
||||
MatStepperNext,
|
||||
FormsModule,
|
||||
MatIcon
|
||||
MatIcon,
|
||||
IntroducerSearchComponent
|
||||
]
|
||||
})
|
||||
export class FixedDepositAccountDetailsStepComponent implements OnInit {
|
||||
@@ -208,6 +210,7 @@ export class FixedDepositAccountDetailsStepComponent implements OnInit {
|
||||
}
|
||||
|
||||
selectLinkedAccount(account: any): void {
|
||||
if (account.status !== 'Active') return;
|
||||
this.selectedLinkedAccount = account;
|
||||
}
|
||||
|
||||
@@ -466,10 +469,15 @@ export class FixedDepositAccountDetailsStepComponent implements OnInit {
|
||||
|
||||
// ── Joint Account helpers ──────────────────────────────────────────────
|
||||
openAddJointHolderDialog(): void {
|
||||
const excludedClientIds = [
|
||||
...(this.primaryClientId ? [this.primaryClientId] : []),
|
||||
...this.jointHolders.map((h: any) => h.clientId).filter(Boolean)
|
||||
];
|
||||
const ref = this.dialog.open(AddRelatedClientDialogComponent, {
|
||||
width: '500px',
|
||||
panelClass: 'arc-dialog-panel',
|
||||
disableClose: true
|
||||
disableClose: true,
|
||||
data: { excludedClientIds }
|
||||
});
|
||||
ref.afterClosed().subscribe((result) => {
|
||||
if (result) {
|
||||
|
||||
+47
-19
@@ -384,47 +384,75 @@
|
||||
}
|
||||
|
||||
<!-- ══ 2c. Nominee Details ══════════════════════════════════════ -->
|
||||
@if (fixedDepositAccountData?.nominee) {
|
||||
@if (fdNominee) {
|
||||
<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">{{
|
||||
fixedDepositAccountData.nominee.mode === 'linked' ? 'Linked Client' : 'Manual Entry'
|
||||
}}</span>
|
||||
<span class="preview-section__badge">{{ fdNominee?.nominationType || 'DA1' }}</span>
|
||||
</div>
|
||||
<div class="preview-body">
|
||||
<div class="preview-grid preview-grid--three">
|
||||
<div class="preview-field">
|
||||
<span class="preview-label">Full Name</span>
|
||||
<span class="preview-value">{{
|
||||
fixedDepositAccountData.nominee.fullName || fixedDepositAccountData.nominee.displayName
|
||||
}}</span>
|
||||
<span class="preview-label">Name</span>
|
||||
<span class="preview-value">{{ fdNominee?.nomineeDisplayName || '—' }}</span>
|
||||
</div>
|
||||
<div class="preview-field">
|
||||
<span class="preview-label">Client ID</span>
|
||||
<span class="preview-value preview-mono">{{ fdNominee?.nomineeClientId || '—' }}</span>
|
||||
</div>
|
||||
<div class="preview-field">
|
||||
<span class="preview-label">Relationship</span>
|
||||
<span class="preview-value">{{ fixedDepositAccountData.nominee.relationship }}</span>
|
||||
<span class="preview-value">{{ fdNominee?.relationshipName || '—' }}</span>
|
||||
</div>
|
||||
<div class="preview-field">
|
||||
<span class="preview-label">Nominee Share (%)</span>
|
||||
<span class="preview-value">{{ fixedDepositAccountData.nominee.nomineeShare }}%</span>
|
||||
<span class="preview-label">Share %</span>
|
||||
<span class="preview-value">{{ fdNominee?.percentageShare ?? '—' }}%</span>
|
||||
</div>
|
||||
@if (fixedDepositAccountData.nominee.dateOfBirth) {
|
||||
<div class="preview-field">
|
||||
<span class="preview-label">Minor</span>
|
||||
<span class="preview-value">{{ fdNominee?.nomineeIsMinor ? 'Yes' : 'No' }}</span>
|
||||
</div>
|
||||
@if (fdNominee?.nomineeDateOfBirth) {
|
||||
<div class="preview-field">
|
||||
<span class="preview-label">Date of Birth</span>
|
||||
<span class="preview-value">{{ fixedDepositAccountData.nominee.dateOfBirth | dateFormat }}</span>
|
||||
<span class="preview-value">{{ fdNominee?.nomineeDateOfBirth | dateFormat }}</span>
|
||||
</div>
|
||||
}
|
||||
@if (fixedDepositAccountData.nominee.nationality) {
|
||||
@if (fdNominee?.nomineeMobileNo) {
|
||||
<div class="preview-field">
|
||||
<span class="preview-label">Nationality</span>
|
||||
<span class="preview-value">{{ fixedDepositAccountData.nominee.nationality }}</span>
|
||||
<span class="preview-label">Mobile No</span>
|
||||
<span class="preview-value preview-mono">{{ fdNominee?.nomineeMobileNo }}</span>
|
||||
</div>
|
||||
}
|
||||
@if (fixedDepositAccountData.nominee.mobileNo) {
|
||||
@if (fdNominee?.nomineeAadhaar) {
|
||||
<div class="preview-field">
|
||||
<span class="preview-label">Mobile Number</span>
|
||||
<span class="preview-value preview-mono">{{ fixedDepositAccountData.nominee.mobileNo }}</span>
|
||||
<span class="preview-label">Aadhaar</span>
|
||||
<span class="preview-value preview-mono">{{ fdNominee?.nomineeAadhaar }}</span>
|
||||
</div>
|
||||
}
|
||||
@if (fdNominee?.nomineePan) {
|
||||
<div class="preview-field">
|
||||
<span class="preview-label">PAN</span>
|
||||
<span class="preview-value preview-mono">{{ fdNominee?.nomineePan }}</span>
|
||||
</div>
|
||||
}
|
||||
@if (fdNominee?.guardianDisplayName) {
|
||||
<div class="preview-field">
|
||||
<span class="preview-label">Guardian</span>
|
||||
<span class="preview-value">{{ fdNominee?.guardianDisplayName }}</span>
|
||||
</div>
|
||||
}
|
||||
@if (fdNominee?.guardianClientId) {
|
||||
<div class="preview-field">
|
||||
<span class="preview-label">Guardian Client ID</span>
|
||||
<span class="preview-value preview-mono">{{ fdNominee?.guardianClientId }}</span>
|
||||
</div>
|
||||
}
|
||||
@if (fdNominee?.remarks) {
|
||||
<div class="preview-field">
|
||||
<span class="preview-label">Remarks</span>
|
||||
<span class="preview-value">{{ fdNominee?.remarks }}</span>
|
||||
</div>
|
||||
}
|
||||
</div>
|
||||
|
||||
+1
@@ -76,6 +76,7 @@ export class FixedDepositAccountPreviewStepComponent implements OnChanges {
|
||||
@Input() fixedDepositsAccountProductTemplate: any;
|
||||
/** Fixed Deposits Account Data */
|
||||
@Input() fixedDepositAccountData: any;
|
||||
@Input() fdNominee: any = null;
|
||||
/** Tenure selected from the interest rate chart step (includes pre-calculated maturity if user used calculator) */
|
||||
@Input() selectedTenure: {
|
||||
depositPeriod: number;
|
||||
|
||||
+9
@@ -166,6 +166,15 @@
|
||||
{{ 'labels.inputs.Standing Instructions' | translate }}
|
||||
</a>
|
||||
}
|
||||
<a
|
||||
mat-tab-link
|
||||
[routerLink]="['./nominees']"
|
||||
routerLinkActive
|
||||
#nominees="routerLinkActive"
|
||||
[active]="nominees.isActive"
|
||||
>
|
||||
Nominees
|
||||
</a>
|
||||
@for (savingsDatatable of savingsDatatables; track savingsDatatable) {
|
||||
<a
|
||||
mat-tab-link
|
||||
|
||||
@@ -31,6 +31,7 @@ import { FixedDepositsAccountActionsResolver } from './common-resolvers/fixed-de
|
||||
import { FixedDepositsAccountTemplateResolver } from './common-resolvers/fixed-deposit-account-template.resolver';
|
||||
import { FixedDepositsAccountAndTemplateResolver } from './common-resolvers/fixed-deposit-account-and-template.resolver';
|
||||
import { GeneralTabComponent } from './fixed-deposit-account-view/general-tab/general-tab.component';
|
||||
import { AccountNomineesTabComponent } from 'app/shared/account-nominees-tab/account-nominees-tab.component';
|
||||
|
||||
const routes: Routes = [
|
||||
{
|
||||
@@ -102,6 +103,17 @@ const routes: Routes = [
|
||||
routeParamBreadcrumb: false
|
||||
}
|
||||
},
|
||||
{
|
||||
path: 'nominees',
|
||||
component: AccountNomineesTabComponent,
|
||||
data: {
|
||||
title: 'Fixed Deposit Nominees',
|
||||
breadcrumb: 'Nominees',
|
||||
routeParamBreadcrumb: false,
|
||||
accountDataKey: 'fixedDepositsAccountData',
|
||||
accountType: 'FD'
|
||||
}
|
||||
},
|
||||
{
|
||||
path: 'datatables',
|
||||
children: [
|
||||
|
||||
+2
-2
@@ -52,8 +52,8 @@
|
||||
|
||||
<mifosx-recurring-deposits-account-currency-step
|
||||
[recurringDepositsAccountProductTemplate]="recurringDepositsAccountProductTemplate"
|
||||
>
|
||||
</mifosx-recurring-deposits-account-currency-step>
|
||||
[primaryClientId]="recurringDepositsAccountTemplate?.clientId ?? null"
|
||||
></mifosx-recurring-deposits-account-currency-step>
|
||||
|
||||
<div class="layout-row align-center gap-2percent margin-t responsive-column">
|
||||
<button mat-raised-button matStepperPrevious>
|
||||
|
||||
+12
-4
@@ -122,7 +122,7 @@ export class CreateRecurringDepositsAccountComponent {
|
||||
}
|
||||
|
||||
get rdNominee() {
|
||||
return this.recurringDepositsAccountCurrencyStep?.nomineeData ?? null;
|
||||
return this.recurringDepositsAccountCurrencyStep?.liveNomineeData ?? null;
|
||||
}
|
||||
|
||||
get rdTenureDays(): number | null {
|
||||
@@ -259,9 +259,17 @@ export class CreateRecurringDepositsAccountComponent {
|
||||
recurringDepositAccount.mandatoryRecommendedDepositAmount = this.selectedDepositAmount;
|
||||
}
|
||||
|
||||
// Nominee from currency step
|
||||
if (currencyStep?.nomineeData) {
|
||||
recurringDepositAccount.nominee = currencyStep.nomineeData;
|
||||
const nominee = this.rdNominee;
|
||||
if (nominee) {
|
||||
recurringDepositAccount.nominee = {
|
||||
nomineeClientId: nominee.nomineeClientId,
|
||||
nominationType: nominee.nominationType,
|
||||
relationshipId: nominee.relationshipId,
|
||||
percentageShare: nominee.percentageShare,
|
||||
nomineeIsMinor: nominee.nomineeIsMinor,
|
||||
...(nominee.guardianClientId ? { guardianClientId: nominee.guardianClientId } : {}),
|
||||
remarks: nominee.remarks
|
||||
};
|
||||
}
|
||||
|
||||
this.recurringDepositsService.createRecurringDepositAccount(recurringDepositAccount).subscribe((response: any) => {
|
||||
|
||||
+5
-1
@@ -60,7 +60,11 @@
|
||||
</span>
|
||||
</div>
|
||||
@if (recurringDepositsAccountProductTemplate?.nominationFacility) {
|
||||
<mifosx-nominee-form (nomineeChange)="onNomineeChange($event)"></mifosx-nominee-form>
|
||||
<mifosx-nominee-form
|
||||
[primaryClientId]="primaryClientId"
|
||||
[showActions]="false"
|
||||
(nomineeChange)="onNomineeChange($event)"
|
||||
></mifosx-nominee-form>
|
||||
}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
+7
-1
@@ -6,7 +6,7 @@
|
||||
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||
*/
|
||||
|
||||
import { Component, Input, OnChanges, SimpleChanges } from '@angular/core';
|
||||
import { Component, Input, OnChanges, SimpleChanges, ViewChild } from '@angular/core';
|
||||
import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module';
|
||||
import { NomineeFormComponent } from 'app/shared/nominee-form/nominee-form.component';
|
||||
import { DormancyAlertPanelComponent } from 'app/shared/dormancy-alert-panel/dormancy-alert-panel.component';
|
||||
@@ -27,6 +27,8 @@ import { FormsModule } from '@angular/forms';
|
||||
})
|
||||
export class RecurringDepositsAccountCurrencyStepComponent implements OnChanges {
|
||||
@Input() recurringDepositsAccountProductTemplate: any;
|
||||
@Input() primaryClientId: number | null = null;
|
||||
@ViewChild(NomineeFormComponent) nomineeFormComp: NomineeFormComponent;
|
||||
|
||||
nomineeData: any = null;
|
||||
|
||||
@@ -44,6 +46,10 @@ export class RecurringDepositsAccountCurrencyStepComponent implements OnChanges
|
||||
this.nomineeData = event;
|
||||
}
|
||||
|
||||
get liveNomineeData(): any {
|
||||
return this.nomineeFormComp?.currentNomineeData ?? this.nomineeData;
|
||||
}
|
||||
|
||||
/** Called by parent to collect currency step values */
|
||||
get currencyStepData() {
|
||||
return {
|
||||
|
||||
+9
-2
@@ -246,7 +246,11 @@
|
||||
} @else {
|
||||
<div class="dal-list">
|
||||
@for (account of dalFilteredAccounts; track account.id) {
|
||||
<div class="dal-item" (click)="selectLinkedAccount(account)">
|
||||
<div
|
||||
class="dal-item"
|
||||
[class.dal-item--disabled]="account.status !== 'Active'"
|
||||
(click)="selectLinkedAccount(account)"
|
||||
>
|
||||
<div class="dal-item__details">
|
||||
<span class="dal-item__accno">{{ account.accountNo }}</span>
|
||||
<span class="dal-item__product">{{ account.productName }}</span>
|
||||
@@ -623,7 +627,10 @@
|
||||
<mat-icon>manage_accounts</mat-icon>
|
||||
<span>Search & Link Guardian (existing client)</span>
|
||||
</div>
|
||||
<mifosx-introducer-search (introducerChange)="onGuardianChange($event)"></mifosx-introducer-search>
|
||||
<mifosx-introducer-search
|
||||
[excludedClientIds]="primaryClientId ? [primaryClientId] : []"
|
||||
(introducerChange)="onGuardianChange($event)"
|
||||
></mifosx-introducer-search>
|
||||
|
||||
@if (guardianName) {
|
||||
<div class="soa-guardian-selected">
|
||||
|
||||
+7
-1
@@ -415,12 +415,18 @@ $gray-900: #202124;
|
||||
background 0.15s,
|
||||
box-shadow 0.15s;
|
||||
|
||||
&:hover {
|
||||
&:hover:not(&--disabled) {
|
||||
border-color: #0ea5e9;
|
||||
background: #f0f9ff;
|
||||
box-shadow: 0 2px 8px rgb(14 165 233 / 12%);
|
||||
}
|
||||
|
||||
&--disabled {
|
||||
opacity: 0.5;
|
||||
cursor: not-allowed;
|
||||
background: #f8fafc;
|
||||
}
|
||||
|
||||
&__details {
|
||||
flex: 1;
|
||||
display: flex;
|
||||
|
||||
+10
-2
@@ -23,6 +23,7 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module';
|
||||
import { MatIcon } from '@angular/material/icon';
|
||||
import { AddRelatedClientDialogComponent } from 'app/current-accounts/current-account-stepper/current-account-details-step/add-related-client-dialog/add-related-client-dialog.component';
|
||||
import { AlertService } from 'app/core/alert/alert.service';
|
||||
import { IntroducerSearchComponent } from 'app/shared/introducer-search/introducer-search.component';
|
||||
|
||||
/**
|
||||
* Recurring Deposits Account Details Step
|
||||
@@ -38,7 +39,8 @@ import { AlertService } from 'app/core/alert/alert.service';
|
||||
FaIconComponent,
|
||||
MatStepperNext,
|
||||
FormsModule,
|
||||
MatIcon
|
||||
MatIcon,
|
||||
IntroducerSearchComponent
|
||||
]
|
||||
})
|
||||
export class RecurringDepositsAccountDetailsStepComponent implements OnInit {
|
||||
@@ -185,6 +187,7 @@ export class RecurringDepositsAccountDetailsStepComponent implements OnInit {
|
||||
}
|
||||
|
||||
selectLinkedAccount(account: any): void {
|
||||
if (account.status !== 'Active') return;
|
||||
this.selectedLinkedAccount = account;
|
||||
}
|
||||
|
||||
@@ -427,10 +430,15 @@ export class RecurringDepositsAccountDetailsStepComponent implements OnInit {
|
||||
|
||||
// ── Joint Account helpers ──────────────────────────────────────────────
|
||||
openAddJointHolderDialog(): void {
|
||||
const excludedClientIds = [
|
||||
...(this.primaryClientId ? [this.primaryClientId] : []),
|
||||
...this.jointHolders.map((h: any) => h.clientId).filter(Boolean)
|
||||
];
|
||||
const ref = this.dialog.open(AddRelatedClientDialogComponent, {
|
||||
width: '500px',
|
||||
panelClass: 'arc-dialog-panel',
|
||||
disableClose: true
|
||||
disableClose: true,
|
||||
data: { excludedClientIds }
|
||||
});
|
||||
ref.afterClosed().subscribe((result) => {
|
||||
if (result) {
|
||||
|
||||
+29
-35
@@ -546,76 +546,70 @@
|
||||
<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">
|
||||
{{ rdNominee?.mode === 'linked' ? 'Linked Client' : 'Manual Entry' }}
|
||||
</span>
|
||||
<span class="preview-section__badge">{{ rdNominee?.nominationType || 'DA1' }}</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">{{ rdNominee?.fullName || rdNominee?.displayName || '—' }}</span>
|
||||
<span class="preview-value">{{ rdNominee?.nomineeDisplayName || '—' }}</span>
|
||||
</div>
|
||||
<div class="preview-field">
|
||||
<span class="preview-label">Client ID</span>
|
||||
<span class="preview-value preview-mono">{{ rdNominee?.nomineeClientId || '—' }}</span>
|
||||
</div>
|
||||
@if (rdNominee?.cifNumber) {
|
||||
<div class="preview-field">
|
||||
<span class="preview-label">CIF No</span>
|
||||
<span class="preview-value preview-mono">{{ rdNominee.cifNumber }}</span>
|
||||
</div>
|
||||
}
|
||||
<div class="preview-field">
|
||||
<span class="preview-label">Relationship</span>
|
||||
<span class="preview-value">{{ rdNominee?.relationship || '—' }}</span>
|
||||
<span class="preview-value">{{ rdNominee?.relationshipName || '—' }}</span>
|
||||
</div>
|
||||
<div class="preview-field">
|
||||
<span class="preview-label">Share %</span>
|
||||
<span class="preview-value">{{ rdNominee?.nomineeShare ?? '—' }}%</span>
|
||||
<span class="preview-value">{{ rdNominee?.percentageShare ?? '—' }}%</span>
|
||||
</div>
|
||||
@if (rdNominee?.dateOfBirth) {
|
||||
<div class="preview-field">
|
||||
<span class="preview-label">Minor</span>
|
||||
<span class="preview-value">{{ rdNominee?.nomineeIsMinor ? 'Yes' : 'No' }}</span>
|
||||
</div>
|
||||
@if (rdNominee?.nomineeDateOfBirth) {
|
||||
<div class="preview-field">
|
||||
<span class="preview-label">Date of Birth</span>
|
||||
<span class="preview-value">{{ rdNominee?.dateOfBirth | dateFormat }}</span>
|
||||
<span class="preview-value">{{ rdNominee?.nomineeDateOfBirth | dateFormat }}</span>
|
||||
</div>
|
||||
}
|
||||
@if (rdNominee?.nationality) {
|
||||
<div class="preview-field">
|
||||
<span class="preview-label">Nationality</span>
|
||||
<span class="preview-value">{{ rdNominee.nationality }}</span>
|
||||
</div>
|
||||
}
|
||||
@if (rdNominee?.mobileNo) {
|
||||
@if (rdNominee?.nomineeMobileNo) {
|
||||
<div class="preview-field">
|
||||
<span class="preview-label">Mobile No</span>
|
||||
<span class="preview-value preview-mono">{{ rdNominee.mobileNo }}</span>
|
||||
<span class="preview-value preview-mono">{{ rdNominee?.nomineeMobileNo }}</span>
|
||||
</div>
|
||||
}
|
||||
@if (rdNominee?.aadhaarNumber) {
|
||||
@if (rdNominee?.nomineeAadhaar) {
|
||||
<div class="preview-field">
|
||||
<span class="preview-label">Aadhaar No</span>
|
||||
<span class="preview-value preview-mono">{{ rdNominee.aadhaarNumber }}</span>
|
||||
<span class="preview-label">Aadhaar</span>
|
||||
<span class="preview-value preview-mono">{{ rdNominee?.nomineeAadhaar }}</span>
|
||||
</div>
|
||||
}
|
||||
@if (rdNominee?.panNumber) {
|
||||
@if (rdNominee?.nomineePan) {
|
||||
<div class="preview-field">
|
||||
<span class="preview-label">PAN No</span>
|
||||
<span class="preview-value preview-mono">{{ rdNominee.panNumber }}</span>
|
||||
<span class="preview-label">PAN</span>
|
||||
<span class="preview-value preview-mono">{{ rdNominee?.nomineePan }}</span>
|
||||
</div>
|
||||
}
|
||||
@if (rdNominee?.guardianName) {
|
||||
@if (rdNominee?.guardianDisplayName) {
|
||||
<div class="preview-field">
|
||||
<span class="preview-label">Guardian Name</span>
|
||||
<span class="preview-value">{{ rdNominee.guardianName }}</span>
|
||||
<span class="preview-label">Guardian</span>
|
||||
<span class="preview-value">{{ rdNominee?.guardianDisplayName }}</span>
|
||||
</div>
|
||||
}
|
||||
@if (rdNominee?.guardianRelationship) {
|
||||
@if (rdNominee?.guardianClientId) {
|
||||
<div class="preview-field">
|
||||
<span class="preview-label">Guardian Relationship</span>
|
||||
<span class="preview-value">{{ rdNominee.guardianRelationship }}</span>
|
||||
<span class="preview-label">Guardian Client ID</span>
|
||||
<span class="preview-value preview-mono">{{ rdNominee?.guardianClientId }}</span>
|
||||
</div>
|
||||
}
|
||||
@if (rdNominee?.remarks) {
|
||||
<div class="preview-field">
|
||||
<span class="preview-label">Remarks</span>
|
||||
<span class="preview-value">{{ rdNominee.remarks }}</span>
|
||||
<span class="preview-value">{{ rdNominee?.remarks }}</span>
|
||||
</div>
|
||||
}
|
||||
</div>
|
||||
|
||||
+9
@@ -172,6 +172,15 @@
|
||||
{{ 'labels.inputs.Standing Instructions' | translate }}
|
||||
</a>
|
||||
}
|
||||
<a
|
||||
mat-tab-link
|
||||
[routerLink]="['./nominees']"
|
||||
routerLinkActive
|
||||
#nominees="routerLinkActive"
|
||||
[active]="nominees.isActive"
|
||||
>
|
||||
Nominees
|
||||
</a>
|
||||
@for (savingsDatatable of savingsDatatables; track savingsDatatable) {
|
||||
<a
|
||||
mat-tab-link
|
||||
|
||||
@@ -34,6 +34,7 @@ import { RecurringDepositsAccountAndTemplateResolver } from './common-resolvers/
|
||||
import { RecurringDepositsAccountTransactionResolver } from './common-resolvers/recurring-deposit-account-transaction.resolver';
|
||||
import { RecurringDepositsAccountTransactionTemplateResolver } from './common-resolvers/recurring-deposit-account-transaction-template.resolver';
|
||||
import { GeneralTabComponent } from './recurring-deposits-account-view/general-tab/general-tab.component';
|
||||
import { AccountNomineesTabComponent } from 'app/shared/account-nominees-tab/account-nominees-tab.component';
|
||||
|
||||
const routes: Routes = [
|
||||
{
|
||||
@@ -102,6 +103,17 @@ const routes: Routes = [
|
||||
routeParamBreadcrumb: false
|
||||
}
|
||||
},
|
||||
{
|
||||
path: 'nominees',
|
||||
component: AccountNomineesTabComponent,
|
||||
data: {
|
||||
title: 'Recurring Deposit Nominees',
|
||||
breadcrumb: 'Nominees',
|
||||
routeParamBreadcrumb: false,
|
||||
accountDataKey: 'recurringDepositsAccountData',
|
||||
accountType: 'RD'
|
||||
}
|
||||
},
|
||||
{
|
||||
path: 'datatables',
|
||||
children: [
|
||||
|
||||
Reference in New Issue
Block a user