diff --git a/src/app/products/current-products/current-product-stepper/current-product-preview-step/current-product-preview-step.component.html b/src/app/products/current-products/current-product-stepper/current-product-preview-step/current-product-preview-step.component.html index 7e179aef5..68e5bdde8 100644 --- a/src/app/products/current-products/current-product-stepper/current-product-preview-step/current-product-preview-step.component.html +++ b/src/app/products/current-products/current-product-stepper/current-product-preview-step/current-product-preview-step.component.html @@ -1,4 +1,4 @@ -
- +

{{ recurringDepositProduct.name }}

- +

{{ 'labels.inputs.Details' | translate }}

@@ -27,7 +27,7 @@
} - + @if ( recurringDepositProduct.accountType || recurringDepositProduct.customerSegment || @@ -63,14 +63,14 @@ @if (recurringDepositProduct.effectiveTo) {
Effective To: - {{ recurringDepositProduct.effectiveTo }} + {{ recurringDepositProduct.effectiveTo | dateFormat }}
} @if (recurringDepositProduct.endDate) {
End Date: - {{ recurringDepositProduct.endDate }} + {{ recurringDepositProduct.endDate | dateFormat }}
} @@ -93,7 +93,7 @@ } } - +

{{ 'labels.inputs.Currency' | translate }}

@@ -144,7 +144,7 @@ } - +

{{ 'labels.inputs.Terms' | translate }}

@@ -169,11 +169,22 @@ }} + @if (recurringDepositProduct.interestCalculateSelector) { +
+ {{ 'labels.inputs.Interest Calculation Type' | translate }}: + {{ + recurringDepositProduct.interestCalculateSelector + | find: recurringDepositProductsTemplate.interestCalculationTypeOption : 'id' : 'value' + }} +
+ } +
{{ 'labels.inputs.Interest Calculated using' | translate }}: {{ recurringDepositProduct.interestCalculationType | find: recurringDepositProductsTemplate.interestCalculationTypeOptions : 'id' : 'value' + | translateKey: 'catalogs' }}
@@ -188,7 +199,7 @@ @if (recurringDepositProduct.effectiveDate) {
Effective Date: - {{ recurringDepositProduct.effectiveDate }} + {{ recurringDepositProduct.effectiveDate | dateFormat }}
} @@ -218,11 +229,11 @@ @if (recurringDepositProduct.lastInterestDate) {
Last Interest Date: - {{ recurringDepositProduct.lastInterestDate }} + {{ recurringDepositProduct.lastInterestDate | dateFormat }}
} - +

{{ 'labels.heading.Settings' | translate }}

@@ -313,7 +324,7 @@ } - + @if (recurringDepositProduct.rdSlabs?.length) {

{{ 'labels.heading.Interest Rate Charts' | translate }}

@@ -334,7 +345,7 @@ To - {{ slab.toPeriod ?? '—' }} + {{ slab.toPeriod ?? '—' }} Period @@ -352,7 +363,7 @@ } - + @if (recurringDepositProduct.charges?.length) {

{{ 'labels.inputs.Charges' | translate }}

@@ -380,7 +391,7 @@
} - +

{{ 'labels.heading.Accounting' | translate }}

diff --git a/src/app/products/recurring-deposit-products/recurring-deposit-product-stepper/recurring-deposit-product-terms-step/recurring-deposit-product-terms-step.component.html b/src/app/products/recurring-deposit-products/recurring-deposit-product-stepper/recurring-deposit-product-terms-step/recurring-deposit-product-terms-step.component.html index 65358d314..df3d7e0f7 100644 --- a/src/app/products/recurring-deposit-products/recurring-deposit-product-stepper/recurring-deposit-product-terms-step/recurring-deposit-product-terms-step.component.html +++ b/src/app/products/recurring-deposit-products/recurring-deposit-product-stepper/recurring-deposit-product-terms-step/recurring-deposit-product-terms-step.component.html @@ -54,14 +54,22 @@ {{ 'labels.inputs.Interest Calculation Type' | translate }} - @for (interestCalculationType of interestCalculationTypeOptionData; track interestCalculationType.id) { - - {{ interestCalculationType.value | translateKey: 'catalogs' }} - + @for (opt of interestCalculationTypeOptionData; track opt.id) { + {{ opt.value }} + } + + + + +
+ + Interest Calculate + + @for (mode of interestCalculationTypeData; track mode.id) { + {{ mode.value | translateKey: 'catalogs' }} } @@ -69,19 +77,8 @@ {{ 'labels.commons.required' | translate }} -
-
- - Interest Calculate - - @for (mode of interestCalculationTypeData; track mode.id) { - {{ mode.value }} - } - - - - @if (recurringDepositProductTermsForm.value.interestCalculateSelector === 2) { + @if (recurringDepositProductTermsForm.value.interestCalculationType === 2) { Average Period @@ -142,7 +139,7 @@
- @if (recurringDepositProductTermsForm.value.interestCalculateSelector === 1) { + @if (recurringDepositProductTermsForm.value.interestCalculationType === 1) {
⚠️ 2) { - this.recurringDepositProductTermsForm.patchValue({ interestCalculationType: 1 }); - } } private parseDate(dateValue: any): Date | null { @@ -163,10 +159,6 @@ export class RecurringDepositProductTermsStepComponent implements OnInit { if (formValue.lastInterestDate instanceof Date) { formValue.lastInterestDate = this.dateUtils.formatDate(formValue.lastInterestDate, dateFormat) || ''; } - if (formValue.interestCalculationType && formValue.interestCalculationType > 2) { - formValue.interestCalculationType = 1; - } - for (const key in formValue) { if (formValue[key] === '') { delete formValue[key]; diff --git a/src/app/products/recurring-deposit-products/view-recurring-deposit-product/recurring-deposit-general-tab/recurring-deposit-general-tab.component.html b/src/app/products/recurring-deposit-products/view-recurring-deposit-product/recurring-deposit-general-tab/recurring-deposit-general-tab.component.html index 241b30d61..09319e1dc 100644 --- a/src/app/products/recurring-deposit-products/view-recurring-deposit-product/recurring-deposit-general-tab/recurring-deposit-general-tab.component.html +++ b/src/app/products/recurring-deposit-products/view-recurring-deposit-product/recurring-deposit-general-tab/recurring-deposit-general-tab.component.html @@ -141,16 +141,16 @@ {{ recurringDepositProduct.effectiveDate | dateFormat }}
} -
- {{ 'labels.inputs.Interest Calculation Type' | translate }}: - {{ recurringDepositProduct.interestCalculationType.value }} -
- @if (recurringDepositProduct.interestCalculateSelector !== undefined) { + @if (recurringDepositProduct.interestCalculationTypeName) {
- Interest Calculate: - {{ recurringDepositProduct.interestCalculateSelector }} + {{ 'labels.inputs.Interest Calculation Type' | translate }}: + {{ recurringDepositProduct.interestCalculationTypeName }}
} +
+ Interest Calculate: + {{ recurringDepositProduct.interestCalculationType?.value }} +
@if (recurringDepositProduct.averagePeriod) {
Average Period: diff --git a/src/app/products/saving-products/saving-product-stepper/saving-product-preview-step/saving-product-preview-step.component.html b/src/app/products/saving-products/saving-product-stepper/saving-product-preview-step/saving-product-preview-step.component.html index c75a6a993..1fbae2866 100644 --- a/src/app/products/saving-products/saving-product-stepper/saving-product-preview-step/saving-product-preview-step.component.html +++ b/src/app/products/saving-products/saving-product-stepper/saving-product-preview-step/saving-product-preview-step.component.html @@ -1,4 +1,4 @@ - - {{ 'labels.inputs.DETAILS' | translate }} + Product Classification - - {{ 'labels.inputs.TERMS' | translate }} + + + Currency - + + + +
+ + +
+ + + Term + + + + +
+ + +
+
+ + + + {{ 'labels.inputs.SETTINGS' | translate }} + + + + +
+ + +
+
+ + + + Digital + + + + +
+ + +
+
+ + {{ 'labels.inputs.CHARGES' | translate }} @@ -63,6 +133,7 @@ + @if (savingsAccountFormValid) { {{ 'labels.inputs.PREVIEW' | translate }} diff --git a/src/app/savings/create-savings-account/create-savings-account.component.ts b/src/app/savings/create-savings-account/create-savings-account.component.ts index 8ee38716a..134b23abe 100644 --- a/src/app/savings/create-savings-account/create-savings-account.component.ts +++ b/src/app/savings/create-savings-account/create-savings-account.component.ts @@ -12,8 +12,11 @@ import { Router, ActivatedRoute } from '@angular/router'; /** Custom Components */ import { SavingsAccountDetailsStepComponent } from '../savings-account-stepper/savings-account-details-step/savings-account-details-step.component'; -import { SavingsAccountTermsStepComponent } from '../savings-account-stepper/savings-account-terms-step/savings-account-terms-step.component'; +import { SavingsAccountTermStepComponent } from '../savings-account-stepper/savings-account-term-step/savings-account-term-step.component'; +import { SavingsAccountSettingsStepComponent } from '../savings-account-stepper/savings-account-settings-step/savings-account-settings-step.component'; import { SavingsAccountChargesStepComponent } from '../savings-account-stepper/savings-account-charges-step/savings-account-charges-step.component'; +import { SavingsAccountCurrencyStepComponent } from '../savings-account-stepper/savings-account-currency-step/savings-account-currency-step.component'; +import { SavingsAccountDigitalStepComponent } from '../savings-account-stepper/savings-account-digital-step/savings-account-digital-step.component'; /** Custom Services */ import { SavingsService } from '../savings.service'; @@ -39,8 +42,11 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; MatStep, MatStepLabel, SavingsAccountDetailsStepComponent, - SavingsAccountTermsStepComponent, + SavingsAccountCurrencyStepComponent, + SavingsAccountTermStepComponent, + SavingsAccountSettingsStepComponent, SavingsAccountChargesStepComponent, + SavingsAccountDigitalStepComponent, SavingsAccountPreviewStepComponent ] }) @@ -56,75 +62,58 @@ export class CreateSavingsAccountComponent { /** Savings Account Product Template */ savingsAccountProductTemplate: any; - /** Savings Account Details Step */ @ViewChild(SavingsAccountDetailsStepComponent, { static: true }) savingsAccountDetailsStep: SavingsAccountDetailsStepComponent; - /** Savings Account Terms Step */ - @ViewChild(SavingsAccountTermsStepComponent, { static: true }) - savingsAccountTermsStep: SavingsAccountTermsStepComponent; - /** Savings Account Charges Step */ + + @ViewChild(SavingsAccountTermStepComponent, { static: true }) + savingsAccountTermStep: SavingsAccountTermStepComponent; + + @ViewChild(SavingsAccountSettingsStepComponent, { static: true }) + savingsAccountSettingsStep: SavingsAccountSettingsStepComponent; + @ViewChild(SavingsAccountChargesStepComponent, { static: true }) savingsAccountChargesStep: SavingsAccountChargesStepComponent; - /** - * Fetches savings account template from `resolve` - * @param {ActivatedRoute} route Activated Route - * @param {Router} router Router - * @param {Dates} dateUtils Date Utils - * @param {SavingsService} savingsService Savings Service - * @param {SettingsService} settingsService Settings Service - */ constructor() { this.route.data.subscribe((data: { savingsAccountTemplate: any }) => { this.savingsAccountTemplate = data.savingsAccountTemplate; }); } - /** - * Sets savings account product template. - * @param {any} $event API response - */ setTemplate($event: any) { this.savingsAccountProductTemplate = $event; } - /** - * Retrieves savings account details form. - */ get savingsAccountDetailsForm() { return this.savingsAccountDetailsStep.savingsAccountDetailsForm; } - /** - * Retrieves savings account terms form. - */ get savingsAccountTermsForm() { - return this.savingsAccountTermsStep.savingsAccountTermsForm; + return this.savingsAccountTermStep.savingsAccountTermForm; + } + + get savingsAccountSettingsForm() { + return this.savingsAccountSettingsStep.savingsAccountSettingsForm; } - /** - * Checks validity of overall savings account form. - */ get savingsAccountFormValid() { - return this.savingsAccountDetailsForm.valid && this.savingsAccountTermsForm.valid; + return ( + this.savingsAccountDetailsForm.valid && + this.savingsAccountTermsForm.valid && + this.savingsAccountSettingsForm.valid + ); } - /** - * Retrieves savings account object. - */ get savingsAccount() { return { ...this.savingsAccountDetailsStep.savingsAccountDetails, - ...this.savingsAccountTermsStep.savingsAccountTerms, + ...this.savingsAccountTermStep.savingsAccountTerms, + ...this.savingsAccountSettingsStep.savingsAccountSettings, ...this.savingsAccountChargesStep.savingsAccountCharges }; } - /** - * Creates a new share account. - */ submit() { - // TODO: Update once language and date settings are setup const locale = this.settingsService.language.code; const dateFormat = this.settingsService.dateFormat; const monthDayFormat = 'dd MMMM'; diff --git a/src/app/savings/savings-account-stepper/savings-account-charges-step/savings-account-charges-step.component.ts b/src/app/savings/savings-account-stepper/savings-account-charges-step/savings-account-charges-step.component.ts index 78ac98e4b..fc6e7b6b5 100644 --- a/src/app/savings/savings-account-stepper/savings-account-charges-step/savings-account-charges-step.component.ts +++ b/src/app/savings/savings-account-stepper/savings-account-charges-step/savings-account-charges-step.component.ts @@ -7,7 +7,7 @@ */ /** Angular Imports */ -import { Component, OnInit, OnChanges, Input, inject } from '@angular/core'; +import { Component, OnInit, Input, inject } from '@angular/core'; import { MatDialog } from '@angular/material/dialog'; import { UntypedFormControl } from '@angular/forms'; @@ -69,13 +69,25 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; FormatNumberPipe ] }) -export class SavingsAccountChargesStepComponent implements OnInit, OnChanges { +export class SavingsAccountChargesStepComponent implements OnInit { private dialog = inject(MatDialog); private dateUtils = inject(Dates); private translateService = inject(TranslateService); + private _savingsAccountProductTemplate: any; + /** Savings Account Product Template */ - @Input() savingsAccountProductTemplate: any; + @Input() + set savingsAccountProductTemplate(value: any) { + this._savingsAccountProductTemplate = value; + if (value) { + this.chargeData = value.chargeOptions || []; + this.chargesDataSource = (value.charges || []).map((charge: any) => ({ ...charge, id: charge.chargeId })); + } + } + get savingsAccountProductTemplate(): any { + return this._savingsAccountProductTemplate; + } /** Savings Account Template */ @Input() savingsAccountTemplate: any; /** Currency Code */ @@ -126,14 +138,6 @@ export class SavingsAccountChargesStepComponent implements OnInit, OnChanges { } } - ngOnChanges() { - if (this.savingsAccountProductTemplate) { - this.chargeData = this.savingsAccountProductTemplate.chargeOptions; - this.chargesDataSource = - this.savingsAccountProductTemplate.charges.map((charge: any) => ({ ...charge, id: charge.chargeId })) || []; - } - } - /** * Adds the charge to charges table * @param {any} charge Charge diff --git a/src/app/savings/savings-account-stepper/savings-account-currency-step/savings-account-currency-step.component.html b/src/app/savings/savings-account-stepper/savings-account-currency-step/savings-account-currency-step.component.html new file mode 100644 index 000000000..10c787094 --- /dev/null +++ b/src/app/savings/savings-account-stepper/savings-account-currency-step/savings-account-currency-step.component.html @@ -0,0 +1,49 @@ + + +
+
+ + Currency & Account Status Configuration +
+
+
+ + Currency + + Inherited from selected product + + + + Decimal Places + + Inherited from selected product + +
+ +
+
+

Dormancy Alert

+

Enable automated notifications when an account becomes inactive based on product rules.

+
+ + {{ savingsAccountProductTemplate?.dormancyAlert ? 'Yes' : 'No' }} + +
+ +
+
+

Nomination Facility

+

Allow account holders to designate individuals to receive funds in the event of account holder's death.

+
+ + {{ savingsAccountProductTemplate?.nominationFacility ? 'Yes' : 'No' }} + +
+
+
diff --git a/src/app/savings/savings-account-stepper/savings-account-currency-step/savings-account-currency-step.component.scss b/src/app/savings/savings-account-stepper/savings-account-currency-step/savings-account-currency-step.component.scss new file mode 100644 index 000000000..17712a898 --- /dev/null +++ b/src/app/savings/savings-account-stepper/savings-account-currency-step/savings-account-currency-step.component.scss @@ -0,0 +1,116 @@ +/** + * Copyright since 2025 Mifos Initiative + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +$accent: #0ea5e9; +$border: #e2e8f0; +$gray-50: #f8f9fa; +$gray-200: #e8eaed; +$gray-900: #202124; + +.sac-section { + border: 1px solid $border; + border-radius: 10px; + overflow: hidden; + background: #fff; + + & + & { + margin-top: 16px; + } + + &__header { + display: flex; + align-items: center; + gap: 10px; + padding: 12px 24px; + background: $gray-50; + border-bottom: 1px solid $gray-200; + + i { + font-size: 14px; + color: $accent; + } + + span { + margin: 0; + font-size: 14px; + font-weight: 600; + color: $gray-900; + } + } +} + +.sac-body { + background: #fff; +} + +.sac-grid { + display: grid; + grid-template-columns: repeat(2, 1fr); + gap: 4px 16px; + padding: 16px 24px; + + @media (width <= 600px) { + grid-template-columns: 1fr; + } +} + +.sac-field { + width: 100%; +} + +.sac-alert { + display: flex; + align-items: center; + justify-content: space-between; + gap: 24px; + padding: 18px 24px; + border-top: 1px solid $border; + background: #f8fafc; + + @media (width <= 760px) { + flex-direction: column; + align-items: flex-start; + } + + &__content { + h4 { + margin: 0 0 6px; + font-size: 14px; + font-weight: 600; + color: $gray-900; + } + + p { + margin: 0; + font-size: 12px; + line-height: 1.5; + color: #64748b; + max-width: 540px; + } + } +} + +.sac-badge { + display: inline-flex; + align-items: center; + justify-content: center; + min-width: 48px; + padding: 4px 14px; + border-radius: 999px; + font-size: 12px; + font-weight: 700; + background: #fee2e2; + color: #b91c1c; + border: 1px solid #fecaca; + + &--yes { + background: #dcfce7; + color: #15803d; + border-color: #bbf7d0; + } +} diff --git a/src/app/savings/savings-account-stepper/savings-account-currency-step/savings-account-currency-step.component.ts b/src/app/savings/savings-account-stepper/savings-account-currency-step/savings-account-currency-step.component.ts new file mode 100644 index 000000000..553256ce0 --- /dev/null +++ b/src/app/savings/savings-account-stepper/savings-account-currency-step/savings-account-currency-step.component.ts @@ -0,0 +1,20 @@ +/** + * Copyright since 2025 Mifos Initiative + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +import { Component, Input } from '@angular/core'; +import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; + +@Component({ + selector: 'mifosx-savings-account-currency-step', + templateUrl: './savings-account-currency-step.component.html', + styleUrls: ['./savings-account-currency-step.component.scss'], + imports: [...STANDALONE_SHARED_IMPORTS] +}) +export class SavingsAccountCurrencyStepComponent { + @Input() savingsAccountProductTemplate: any; +} diff --git a/src/app/savings/savings-account-stepper/savings-account-details-step/savings-account-details-step.component.html b/src/app/savings/savings-account-stepper/savings-account-details-step/savings-account-details-step.component.html index 6f492fa09..df5db2234 100644 --- a/src/app/savings/savings-account-stepper/savings-account-details-step/savings-account-details-step.component.html +++ b/src/app/savings/savings-account-stepper/savings-account-details-step/savings-account-details-step.component.html @@ -1,4 +1,4 @@ -
-
- - {{ 'labels.inputs.Product Name' | translate }} - - @for (product of productData; track product) { - - {{ product.name }} - - } - - - {{ 'labels.inputs.Product Name' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - - - - @if (savingsProductSelected) { - - {{ 'labels.inputs.Submitted On' | translate }} - - - + +
+
+ +

Account Details

+
+
+ + {{ 'labels.inputs.Product Name' | translate }} + + @for (product of productData; track product) { + {{ product.name }} + } + - {{ 'labels.inputs.Submitted On' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.inputs.Product Name' | translate }} {{ 'labels.commons.is' | translate }} {{ 'labels.commons.required' | translate }} - } - @if (savingsProductSelected) { - - {{ 'labels.inputs.Field Officer' | translate }} - - @for (officer of fieldOfficerData; track officer) { - - {{ officer.displayName }} - - } - - - } + @if (savingsProductSelected) { + + {{ 'labels.inputs.Submitted On' | translate }} + + + + + {{ 'labels.inputs.Submitted On' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + + } - @if (savingsProductSelected) { - - {{ 'labels.inputs.External ID' | translate }} - - - } + @if (savingsProductSelected) { + + {{ 'labels.inputs.Field Officer' | translate }} + + @for (officer of fieldOfficerData; track officer) { + {{ officer.displayName }} + } + + + } + + @if (savingsProductSelected) { + + {{ 'labels.inputs.External ID' | translate }} + + + } +
+ + @if (savingsProductSelected) { +
+
+ +

Product Classification

+ From Product +
+
+ + Account Type + + + + + Customer Segment + + + + + Product Code + + + + @if (productTemplate.effectiveDate) { + + Effective Date + + + } + + @if (productTemplate.endDate) { + + End Date + + + } + + + Introducer Required + + + +
+ Share Linking Enabled + + {{ productTemplate.shareLinkingEnabled ? 'Yes' : 'No' }} + +
+
+
+ } +
+ @if (savingsAccountProductTemplate?.effectiveDate) { +
+ Effective Date + {{ savingsAccountProductTemplate.effectiveDate | dateFormat }} +
+ } + + @if (savingsAccountProductTemplate?.effectiveTo) { +
+ Effective To + {{ savingsAccountProductTemplate.effectiveTo | dateFormat }} +
+ } + + @if (savingsAccountProductTemplate?.endDate) { +
+ End Date + {{ savingsAccountProductTemplate.endDate | dateFormat }} +
+ } +
{{ 'labels.inputs.External Id' | translate }} @if (savingsAccount.externalId) { @@ -74,7 +95,7 @@
{{ 'labels.inputs.Decimal Places' | translate }} - {{ savingsAccountTermsForm.get('decimal').value }} + {{ savingsAccountProductTemplate?.currency?.decimalPlaces }}
@@ -82,6 +103,49 @@ {{ savingsAccount.nominalAnnualInterestRate | formatNumber }} %
+ @if (savingsAccountProductTemplate?.interestCalculationTypeName) { +
+ Interest Calculation Mode + {{ savingsAccountProductTemplate.interestCalculationTypeName }} +
+ } + + @if (savingsAccountProductTemplate?.lastInterestDate) { +
+ Last Interest Date + {{ savingsAccountProductTemplate.lastInterestDate | dateFormat }} +
+ } + +
+ Interest Calculation Selector + {{ + getCatalogTranslation( + savingsAccount.interestCalculateSelector + | find: savingsAccountProductTemplate.interestCalculationTypeOption : 'id' : 'value' + ) + }} +
+ + @if (savingsAccount.averagePeriod) { +
+ Average Period + {{ savingsAccount.averagePeriod }} +
+ } + +
+ Auto Post + {{ savingsAccount.autoPost | yesNo }} +
+ + @if (savingsAccount.frequencyFixDay !== undefined && savingsAccount.frequencyFixDay !== null) { +
+ Frequency Fix Day + {{ savingsAccount.frequencyFixDay }} +
+ } +
{{ 'labels.inputs.Interest Compounding Period' | translate }}: {{ @@ -181,6 +245,27 @@ {{ savingsAccount.enforceMinRequiredBalance | yesNo }}
+ @if (savingsAccountProductTemplate?.enableLockinPeriod !== undefined) { +
+ Enable Lock-in Period + {{ savingsAccountProductTemplate.enableLockinPeriod | yesNo }} +
+ } + + @if (savingsAccountProductTemplate?.balanceFrequency) { +
+ Balance Frequency + {{ savingsAccountProductTemplate.balanceFrequency }} +
+ } + + @if (savingsAccountProductTemplate?.accountClosedZeroBalanceInDayClosing !== undefined) { +
+ Account Closed Zero Balance In Day Closing + {{ savingsAccountProductTemplate.accountClosedZeroBalanceInDayClosing | yesNo }} +
+ } + @if (savingsAccount.minRequiredBalance) {
{{ 'labels.inputs.Minimum Balance' | translate }}: diff --git a/src/app/savings/savings-account-stepper/savings-account-settings-step/savings-account-settings-step.component.html b/src/app/savings/savings-account-stepper/savings-account-settings-step/savings-account-settings-step.component.html new file mode 100644 index 000000000..0cfb16fb7 --- /dev/null +++ b/src/app/savings/savings-account-stepper/savings-account-settings-step/savings-account-settings-step.component.html @@ -0,0 +1,113 @@ + + + +
+
+ + Balance & Minimum Balance +
+
+
+
+ + {{ 'labels.inputs.Minimum Opening Balance' | translate }} + + + +
+ + Enforce Minimum Balance + +
+ + + Minimum Balance (₹) + + Penal charge applies on breach + +
+ +
+ + Balance Frequency + + @for (freq of periodFrequencyData; track freq.value) { + {{ freq.value }} + } + + + +
+ + {{ 'labels.inputs.Apply Withdrawal Fee for Transfers' | translate }} + +
+
+
+
+
+ +
+
+ + Lock-in Period +
+
+
+ Enable Lock-in Period + +
+ + @if (savingsAccountSettingsForm.value.enableLockinPeriod) { +
+ + {{ 'labels.inputs.Frequency' | translate }}* + + + + + {{ 'labels.inputs.Type' | translate }}* + + @for (type of lockinPeriodFrequencyTypeData; track type) { + {{ type.value | translateKey: 'catalogs' }} + } + + +
+ } +
+
+ +
+
+ + Additional Rules +
+
+
+
+ + Account Closed with Zero balance in Day Closing + +
+ + @if (savingsAccountProductTemplate?.minBalanceForInterestCalculation != null) { + + {{ 'labels.inputs.Balance Required for Interest Calculation' | translate }} + + + } +
+
+
+ diff --git a/src/app/savings/savings-account-stepper/savings-account-settings-step/savings-account-settings-step.component.scss b/src/app/savings/savings-account-stepper/savings-account-settings-step/savings-account-settings-step.component.scss new file mode 100644 index 000000000..4356c409f --- /dev/null +++ b/src/app/savings/savings-account-stepper/savings-account-settings-step/savings-account-settings-step.component.scss @@ -0,0 +1,169 @@ +/** + * Copyright since 2025 Mifos Initiative + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +$accent: #0ea5e9; +$border: #e2e8f0; +$gray-50: #f8f9fa; +$gray-200: #e8eaed; +$gray-900: #202124; + +.sps-section { + border: 1px solid $border; + border-radius: 10px; + overflow: hidden; + background: #fff; + + & + & { + margin-top: 16px; + } + + &__header { + display: flex; + align-items: center; + gap: 10px; + padding: 12px 24px; + background: $gray-50; + border-bottom: 1px solid $gray-200; + + i { + font-size: 14px; + color: $accent; + } + + span { + font-size: 14px; + font-weight: 600; + color: $gray-900; + } + } +} + +.sps-section__badge { + display: inline-flex; + align-items: center; + justify-content: center; + width: 24px; + height: 24px; + border-radius: 6px; + background: #eff6ff; + font-size: 14px; +} + +.sps-body { + background: #fff; + padding: 18px 24px 24px; +} + +.sps-field { + width: 100%; + + &--full { + grid-column: 1 / -1; + } + + &--compact { + width: 100%; + } +} + +.sps-layout { + display: grid; + gap: 16px; +} + +.sps-layout--balance { + gap: 22px; +} + +.sps-layout--additional { + grid-template-columns: repeat(2, minmax(0, 1fr)); + align-items: start; + + @media (width <= 1100px) { + grid-template-columns: 1fr; + } +} + +.sps-row { + display: grid; + gap: 18px; + align-items: start; +} + +.sps-row--three { + grid-template-columns: minmax(0, 1fr) auto minmax(0, 1fr); + align-items: center; + + .sps-field--compact:first-child { + min-width: 0; + } + + .sps-toggle--inline { + align-self: center; + min-height: 56px; + } +} + +.sps-row--two { + grid-template-columns: minmax(0, 1fr) auto; + align-items: center; + + .sps-field--compact { + min-width: 0; + } +} + +.sps-toggle { + display: flex; + align-items: center; + min-height: 56px; + + mat-checkbox { + font-size: 14px; + color: $gray-900; + } + + &--full { + min-height: auto; + margin-bottom: 8px; + } + + &--inline { + padding-top: 0; + } + + &--right { + justify-content: flex-start; + } +} + +.sps-lockin-row { + display: flex; + align-items: center; + justify-content: space-between; + gap: 16px; + margin-bottom: 16px; + padding-bottom: 16px; + border-bottom: 1px solid $gray-200; + font-size: 14px; + color: $gray-900; +} + +.sps-lockin-row mat-checkbox { + margin-right: 2px; +} + +.sps-lockin-fields { + display: grid; + grid-template-columns: repeat(2, minmax(0, 1fr)); + gap: 16px; + + @media (width <= 640px) { + grid-template-columns: 1fr; + } +} diff --git a/src/app/savings/savings-account-stepper/savings-account-settings-step/savings-account-settings-step.component.ts b/src/app/savings/savings-account-stepper/savings-account-settings-step/savings-account-settings-step.component.ts new file mode 100644 index 000000000..d3683e753 --- /dev/null +++ b/src/app/savings/savings-account-stepper/savings-account-settings-step/savings-account-settings-step.component.ts @@ -0,0 +1,152 @@ +/** + * Copyright since 2025 Mifos Initiative + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +import { Component, Input, OnInit, inject } from '@angular/core'; +import { UntypedFormGroup, UntypedFormBuilder, Validators, UntypedFormControl } from '@angular/forms'; +import { MatCheckbox } from '@angular/material/checkbox'; +import { FormatNumberPipe } from '../../../pipes/format-number.pipe'; +import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; + +@Component({ + selector: 'mifosx-savings-account-settings-step', + templateUrl: './savings-account-settings-step.component.html', + styleUrls: ['./savings-account-settings-step.component.scss'], + imports: [ + ...STANDALONE_SHARED_IMPORTS, + MatCheckbox, + FormatNumberPipe + ] +}) +export class SavingsAccountSettingsStepComponent implements OnInit { + private formBuilder = inject(UntypedFormBuilder); + + private _savingsAccountProductTemplate: any; + + @Input() + set savingsAccountProductTemplate(value: any) { + this._savingsAccountProductTemplate = value; + if (value && this.savingsAccountSettingsForm) { + this.applyTemplate(value); + } + } + get savingsAccountProductTemplate(): any { + return this._savingsAccountProductTemplate; + } + + savingsAccountSettingsForm: UntypedFormGroup; + + lockinPeriodFrequencyTypeData: any[] = []; + + periodFrequencyData: any[] = [ + { value: 'Daily' }, + { value: 'Weekly' }, + { value: 'Monthly' }, + { value: 'Quarterly' }, + { value: 'Half Yearly' }, + { value: 'Yearly' }]; + + constructor() { + this.createForm(); + this.buildDependencies(); + } + + createForm() { + this.savingsAccountSettingsForm = this.formBuilder.group({ + minRequiredOpeningBalance: [''], + withdrawalFeeForTransfers: [false], + enforceMinRequiredBalance: [false], + minRequiredBalance: [''], + balanceFrequency: ['Monthly'], + enableLockinPeriod: [false], + lockinPeriodFrequency: [''], + lockinPeriodFrequencyType: [''], + accountClosedZeroBalanceInDayClosing: [false], + allowOverdraft: [false] + }); + } + + ngOnInit() { + if (this._savingsAccountProductTemplate) { + this.applyTemplate(this._savingsAccountProductTemplate); + } + } + + private applyTemplate(t: any) { + this.lockinPeriodFrequencyTypeData = t.lockinPeriodFrequencyTypeOptions || []; + const hasLockin = !!(t.lockinPeriodFrequency && t.lockinPeriodFrequency > 0); + + this.savingsAccountSettingsForm.patchValue({ + minRequiredOpeningBalance: t.minRequiredOpeningBalance, + withdrawalFeeForTransfers: t.withdrawalFeeForTransfers || false, + enforceMinRequiredBalance: t.enforceMinRequiredBalance || false, + minRequiredBalance: t.minRequiredBalance, + balanceFrequency: t.balanceFrequency || 'Monthly', + enableLockinPeriod: hasLockin, + lockinPeriodFrequency: hasLockin ? t.lockinPeriodFrequency : '', + lockinPeriodFrequencyType: hasLockin ? t.lockinPeriodFrequencyType?.id || '' : '', + accountClosedZeroBalanceInDayClosing: t.accountClosedZeroBalanceInDayClosing || false, + allowOverdraft: t.allowOverdraft || false + }); + + if (t.allowOverdraft) { + if (!this.savingsAccountSettingsForm.contains('minOverdraftForInterestCalculation')) { + this.savingsAccountSettingsForm.addControl('minOverdraftForInterestCalculation', new UntypedFormControl('')); + this.savingsAccountSettingsForm.addControl('nominalAnnualInterestRateOverdraft', new UntypedFormControl('')); + this.savingsAccountSettingsForm.addControl('overdraftLimit', new UntypedFormControl('')); + } + this.savingsAccountSettingsForm.patchValue({ + minOverdraftForInterestCalculation: t.minOverdraftForInterestCalculation, + nominalAnnualInterestRateOverdraft: t.nominalAnnualInterestRateOverdraft, + overdraftLimit: t.overdraftLimit + }); + } + } + + buildDependencies() { + this.savingsAccountSettingsForm.get('enableLockinPeriod').valueChanges.subscribe((enabled: boolean) => { + if (enabled) { + this.savingsAccountSettingsForm.get('lockinPeriodFrequency').setValidators([ + Validators.required, + Validators.min(1) + ]); + this.savingsAccountSettingsForm.get('lockinPeriodFrequencyType').setValidators([Validators.required]); + } else { + this.savingsAccountSettingsForm.get('lockinPeriodFrequency').setValue(''); + this.savingsAccountSettingsForm.get('lockinPeriodFrequencyType').setValue(''); + this.savingsAccountSettingsForm.get('lockinPeriodFrequency').clearValidators(); + this.savingsAccountSettingsForm.get('lockinPeriodFrequencyType').clearValidators(); + } + this.savingsAccountSettingsForm.get('lockinPeriodFrequency').updateValueAndValidity(); + this.savingsAccountSettingsForm.get('lockinPeriodFrequencyType').updateValueAndValidity(); + }); + + this.savingsAccountSettingsForm.get('allowOverdraft').valueChanges.subscribe((allowed: boolean) => { + if (allowed) { + this.savingsAccountSettingsForm.addControl('minOverdraftForInterestCalculation', new UntypedFormControl('')); + this.savingsAccountSettingsForm.addControl('nominalAnnualInterestRateOverdraft', new UntypedFormControl('')); + this.savingsAccountSettingsForm.addControl('overdraftLimit', new UntypedFormControl('')); + } else { + this.savingsAccountSettingsForm.removeControl('minOverdraftForInterestCalculation'); + this.savingsAccountSettingsForm.removeControl('nominalAnnualInterestRateOverdraft'); + this.savingsAccountSettingsForm.removeControl('overdraftLimit'); + } + }); + } + + get savingsAccountSettings() { + const value = { ...this.savingsAccountSettingsForm.getRawValue() }; + if (!value.enableLockinPeriod) { + value.lockinPeriodFrequency = null; + value.lockinPeriodFrequencyType = null; + } + delete value.enableLockinPeriod; + delete value.balanceFrequency; + delete value.accountClosedZeroBalanceInDayClosing; + return value; + } +} diff --git a/src/app/savings/savings-account-stepper/savings-account-term-step/savings-account-term-step.component.html b/src/app/savings/savings-account-stepper/savings-account-term-step/savings-account-term-step.component.html new file mode 100644 index 000000000..a90dfeba3 --- /dev/null +++ b/src/app/savings/savings-account-stepper/savings-account-term-step/savings-account-term-step.component.html @@ -0,0 +1,170 @@ + + +
+
+
+ + Interest Rate & Posting Terms +
+
+ +
+ ℹ️ + + Savings Account base rate: + {{ savingsAccountTermForm.get('nominalAnnualInterestRate').value || 0 }}% + +
+ + +
+ + {{ 'labels.inputs.Nominal Annual Interest' | translate }} + + @if (savingsAccountTermForm.get('nominalAnnualInterestRate').hasError('required')) { + Nominal Annual Interest is required + } + @if (savingsAccountTermForm.get('nominalAnnualInterestRate').hasError('min')) { + Must be zero or greater + } + + + + Effective Date + + + + + + + {{ 'labels.inputs.Interest Calculation Type' | translate }} + + @for (opt of interestCalculateSelectorData; track opt.id) { + {{ opt.value }} + } + + +
+ + +
+ + Interest Calculate + + @for (opt of interestCalculationTypeData; track opt.id) { + {{ opt.value | translateKey: 'catalogs' }} + } + + {{ 'labels.inputs.Interest Calculation Type' | translate }} is required + + + @if (savingsAccountTermForm.value.interestCalculationType === 2) { + + Average Period + + @for (period of periodFrequencyData; track period) { + {{ period.value }} + } + + + } + + + {{ 'labels.inputs.Interest Posting Period' | translate }} + + @for (opt of interestPostingPeriodTypeData; track opt) { + {{ opt.value | translateKey: 'catalogs' }} + } + + {{ 'labels.inputs.Interest Posting Period' | translate }} is required + +
+ + +
+ + {{ 'labels.inputs.Interest Compounding Period' | translate }} + + @for (opt of interestCompoundingPeriodTypeData; track opt) { + {{ opt.value | translateKey: 'catalogs' }} + } + + {{ 'labels.inputs.Interest Compounding Period' | translate }} is required + + + + {{ 'labels.inputs.Days in Year' | translate }} + + @for (opt of interestCalculationDaysInYearTypeData; track opt) { + {{ opt.value | translateKey: 'catalogs' }} + } + + {{ 'labels.inputs.Days in Year' | translate }} is required + +
+ + + +
+
+
diff --git a/src/app/savings/savings-account-stepper/savings-account-term-step/savings-account-term-step.component.scss b/src/app/savings/savings-account-stepper/savings-account-term-step/savings-account-term-step.component.scss new file mode 100644 index 000000000..038977265 --- /dev/null +++ b/src/app/savings/savings-account-stepper/savings-account-term-step/savings-account-term-step.component.scss @@ -0,0 +1,166 @@ +/** + * Copyright since 2025 Mifos Initiative + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +$accent: #0ea5e9; +$border: #e2e8f0; +$gray-50: #f8f9fa; +$gray-200: #e8eaed; +$gray-900: #202124; + +.sat-section { + border: 1px solid $border; + border-radius: 10px; + overflow: hidden; + background: #fff; + + & + & { + margin-top: 16px; + } + + &__header { + display: flex; + align-items: center; + gap: 10px; + padding: 12px 24px; + background: $gray-50; + border-bottom: 1px solid $gray-200; + + span { + font-size: 14px; + font-weight: 600; + color: $gray-900; + } + } +} + +.sat-section__badge { + display: inline-flex; + align-items: center; + justify-content: center; + width: 24px; + height: 24px; + border-radius: 6px; + background: #eff6ff; + font-size: 14px; +} + +.sat-body { + background: #fff; + padding: 18px 24px 24px; +} + +.sat-banner { + display: flex; + align-items: center; + gap: 8px; + padding: 10px 14px; + margin-bottom: 18px; + border-radius: 8px; + background: #eff6ff; + border: 1px solid #bfdbfe; + font-size: 13px; + color: $gray-900; + + &__icon { + font-size: 16px; + } +} + +.sat-grid { + display: grid; + grid-template-columns: repeat(3, minmax(0, 1fr)); + gap: 4px 16px; + + @media (width <= 900px) { + grid-template-columns: repeat(2, minmax(0, 1fr)); + } + + @media (width <= 600px) { + grid-template-columns: 1fr; + } +} + +.sat-field { + width: 100%; +} + +.sat-footer { + margin-top: 16px; + padding-top: 16px; + border-top: 1px solid $border; + + &__grid { + display: grid; + grid-template-columns: auto 1fr 1fr; + gap: 4px 16px; + align-items: start; + + @media (width <= 900px) { + grid-template-columns: 1fr 1fr; + } + + @media (width <= 600px) { + grid-template-columns: 1fr; + } + } +} + +.sat-toggle-card { + display: flex; + flex-direction: column; + gap: 8px; + padding: 10px 14px; + border: 1px solid $border; + border-radius: 8px; + background: $gray-50; + min-height: 56px; + + h4 { + margin: 0; + font-size: 12px; + font-weight: 600; + color: #64748b; + text-transform: uppercase; + letter-spacing: 0.04em; + } + + &__choices { + display: flex; + gap: 16px; + align-items: center; + } +} + +.sat-radio-label { + display: flex; + align-items: center; + gap: 6px; + font-size: 14px; + color: $gray-900; + cursor: pointer; + + [type='radio'] { + accent-color: $accent; + width: 16px; + height: 16px; + cursor: pointer; + } +} + +.sat-note { + display: flex; + align-items: flex-start; + gap: 8px; + margin-top: 12px; + padding: 10px 14px; + border-radius: 8px; + background: #fffbeb; + border: 1px solid #fde68a; + font-size: 13px; + color: #92400e; +} diff --git a/src/app/savings/savings-account-stepper/savings-account-term-step/savings-account-term-step.component.ts b/src/app/savings/savings-account-stepper/savings-account-term-step/savings-account-term-step.component.ts new file mode 100644 index 000000000..fbf388008 --- /dev/null +++ b/src/app/savings/savings-account-stepper/savings-account-term-step/savings-account-term-step.component.ts @@ -0,0 +1,154 @@ +/** + * Copyright since 2025 Mifos Initiative + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +import { Component, Input, OnInit, inject } from '@angular/core'; +import { UntypedFormGroup, UntypedFormBuilder, Validators } from '@angular/forms'; +import { Dates } from 'app/core/utils/dates'; +import { SettingsService } from 'app/settings/settings.service'; +import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; + +@Component({ + selector: 'mifosx-savings-account-term-step', + templateUrl: './savings-account-term-step.component.html', + styleUrls: ['./savings-account-term-step.component.scss'], + imports: [...STANDALONE_SHARED_IMPORTS] +}) +export class SavingsAccountTermStepComponent implements OnInit { + private formBuilder = inject(UntypedFormBuilder); + private dateUtils = inject(Dates); + private settingsService = inject(SettingsService); + + private _savingsAccountProductTemplate: any; + + @Input() + set savingsAccountProductTemplate(value: any) { + this._savingsAccountProductTemplate = value; + if (value && this.savingsAccountTermForm) { + this.applyTemplate(value); + } + } + get savingsAccountProductTemplate(): any { + return this._savingsAccountProductTemplate; + } + + savingsAccountTermForm: UntypedFormGroup; + + interestCompoundingPeriodTypeData: any[] = []; + interestPostingPeriodTypeData: any[] = []; + interestCalculationTypeData: any[] = []; + interestCalculationDaysInYearTypeData: any[] = []; + interestCalculateSelectorData: any[] = []; + periodFrequencyData: any[] = []; + + yesNoOptions = [ + { value: true, label: 'Yes' }, + { value: false, label: 'No' } + ]; + + minDate = new Date(2000, 0, 1); + maxDate = new Date(); + + constructor() { + this.createForm(); + } + + createForm() { + this.savingsAccountTermForm = this.formBuilder.group({ + currencyCode: [{ value: '', disabled: true }], + nominalAnnualInterestRate: [ + '', + [ + Validators.required, + Validators.min(0) + ] + ], + interestCompoundingPeriodType: [ + '', + Validators.required + ], + interestPostingPeriodType: [ + '', + Validators.required + ], + interestCalculationType: [ + '', + Validators.required + ], + interestCalculationDaysInYearType: [ + '', + Validators.required + ], + effectiveDate: [''], + interestCalculateSelector: [1], + averagePeriod: ['Monthly'], + autoPost: [true], + frequencyFixDay: [ + 30, + [Validators.min(0)] + ], + lastInterestDate: [''] + }); + } + + ngOnInit() { + this.maxDate = this.settingsService.businessDate; + // Apply template if it was set before the form was ready + if (this._savingsAccountProductTemplate) { + this.applyTemplate(this._savingsAccountProductTemplate); + } + } + + private applyTemplate(t: any) { + this.maxDate = this.settingsService.businessDate; + + this.interestCompoundingPeriodTypeData = t.interestCompoundingPeriodTypeOptions || []; + this.interestPostingPeriodTypeData = t.interestPostingPeriodTypeOptions || []; + this.interestCalculationTypeData = t.interestCalculationTypeOptions || []; + this.interestCalculateSelectorData = t.interestCalculationTypeOption || []; + this.interestCalculationDaysInYearTypeData = t.interestCalculationDaysInYearTypeOptions || []; + this.periodFrequencyData = t.periodFrequencyOptions?.length ? t.periodFrequencyOptions : [ + { value: 'Monthly' }, + { value: 'Quarterly' }, + { value: 'Half Yearly' }, + { value: 'Yearly' }]; + + const defaultPeriod = this.periodFrequencyData[0]?.value || 'Monthly'; + const savedEnumTypeId = t.interestCalculationType?.id || this.interestCalculationTypeData?.[0]?.id || 1; + const savedSelectorId = t.interestCalculateSelector ?? this.interestCalculateSelectorData?.[0]?.id ?? null; + + this.savingsAccountTermForm.patchValue({ + currencyCode: t.currency?.code, + nominalAnnualInterestRate: t.nominalAnnualInterestRate, + interestCompoundingPeriodType: t.interestCompoundingPeriodType?.id, + interestPostingPeriodType: t.interestPostingPeriodType?.id, + interestCalculationType: savedEnumTypeId, + interestCalculationDaysInYearType: t.interestCalculationDaysInYearType?.id, + effectiveDate: t.effectiveDate ? new Date(t.effectiveDate) : '', + interestCalculateSelector: savedSelectorId, + averagePeriod: t.averagePeriod || defaultPeriod, + autoPost: t.autoPost ?? true, + frequencyFixDay: t.frequencyFixDay ?? 30, + lastInterestDate: t.lastInterestDate ? new Date(t.lastInterestDate) : '' + }); + } + + get savingsAccountTerms() { + const value = { ...this.savingsAccountTermForm.getRawValue() }; + const dateFormat = this.settingsService.dateFormat; + + if (value.effectiveDate instanceof Date) { + value.effectiveDate = this.dateUtils.formatDate(value.effectiveDate, dateFormat) || ''; + } + if (value.lastInterestDate instanceof Date) { + value.lastInterestDate = this.dateUtils.formatDate(value.lastInterestDate, dateFormat) || ''; + } + + delete value.currencyCode; + return value; + } +} diff --git a/src/app/savings/savings-account-stepper/savings-account-terms-step/savings-account-terms-step.component.html b/src/app/savings/savings-account-stepper/savings-account-terms-step/savings-account-terms-step.component.html index 2f6b97985..8d2053bc9 100644 --- a/src/app/savings/savings-account-stepper/savings-account-terms-step/savings-account-terms-step.component.html +++ b/src/app/savings/savings-account-stepper/savings-account-terms-step/savings-account-terms-step.component.html @@ -152,13 +152,6 @@ {{ 'labels.inputs.Minimum Balance' | translate }} - - @if (savingsAccountTermsForm.controls.minBalanceForInterestCalculation.value) { - - {{ 'labels.inputs.Balance Required for Interest Calculation' | translate }} - - - }
diff --git a/src/environments/.env.ts b/src/environments/.env.ts index c92cec15e..e32239a6a 100644 --- a/src/environments/.env.ts +++ b/src/environments/.env.ts @@ -5,13 +5,12 @@ * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ - // IMPORTANT: THIS FILE IS AUTO GENERATED! DO NOT MANUALLY EDIT OR CHECKIN! /* tslint:disable */ export default { 'mifos_x': { - 'version': '260420', - 'hash': 'fe61c925' + 'version': '260421', + 'hash': 'e212bf7d' }, 'allow_switching_backend_instance': true };