update rd,fd,saving and current product update validation end date and and this all account nominee facility code

This commit is contained in:
Nitesh Yadav
2026-05-15 12:53:47 +05:30
parent 8758b9222f
commit 52e216fbe5
62 changed files with 3069 additions and 886 deletions
@@ -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>
@@ -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) => {
@@ -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>
@@ -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 {
@@ -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 &amp; 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">
@@ -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;
@@ -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) {
@@ -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>
@@ -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: [