-
{{ 'labels.inputs.Balance Required for Interest Calculation' | translate }}:
-
{{ savingProduct.minBalanceForInterestCalculation | formatNumber }}
+ @if (savingProduct.shareLinkingEnabled !== undefined) {
+
+ Share Linking Enabled:
+ {{ savingProduct.shareLinkingEnabled | yesNo }}
}
+ }
-
- {{ 'labels.inputs.Enforce Minimum Balance' | translate }}:
- {{ savingProduct.enforceMinRequiredBalance | yesNo }}
-
+
{{ 'labels.inputs.Currency' | translate }}
- @if (savingProduct.minRequiredBalance) {
-
- {{ 'labels.inputs.Minimum Balance' | translate }}:
- {{ savingProduct.minRequiredBalance | formatNumber }}
-
- }
+
-
- {{ 'labels.inputs.Withhold Tax is Applicable' | translate }}:
- {{ savingProduct.withHoldTax | yesNo }}
-
-
- @if (savingProduct.withHoldTax) {
-
- {{ 'labels.inputs.Tax Group' | translate }}:
- {{ savingProduct.taxGroup.name }}
-
- }
-
-
- {{ 'labels.inputs.Is Overdraft Allowed' | translate }}:
- {{ savingProduct.allowOverdraft | yesNo }}
-
-
- @if (savingProduct.minOverdraftForInterestCalculation) {
-
- {{ 'labels.inputs.Minimum Overdraft Required for Interest Calculation' | translate }}:
- {{ savingProduct.minOverdraftForInterestCalculation }}
-
- }
-
- @if (savingProduct.nominalAnnualInterestRateOverdraft) {
-
- {{ 'labels.inputs.Nominal Annual Interest for Overdraft' | translate }}:
- {{ savingProduct.nominalAnnualInterestRateOverdraft }} %
-
- }
-
- @if (savingProduct.overdraftLimit) {
-
- {{ 'labels.inputs.Maximum Overdraft Amount Limit' | translate }}:
- {{ savingProduct.overdraftLimit | formatNumber }}
-
- }
-
-
- {{ 'labels.inputs.Enable Dormancy Tracking' | translate }}:
- {{ savingProduct.isDormancyTrackingActive | yesNo }}
-
-
- @if (savingProduct.isDormancyTrackingActive) {
-
- {{ 'labels.inputs.Number of Days to Inactive sub-status' | translate }}:
- {{ savingProduct.daysToInactive }}
- {{ 'labels.inputs.Number of Days to Dormant sub-status' | translate }}:
- {{ savingProduct.daysToDormancy }}
- {{ 'labels.inputs.Number of Days to Escheat' | translate }}:
- {{ savingProduct.daysToEscheat }}
-
- }
-
- @if (savingProduct.charges.length) {
-
-
{{ 'labels.heading.Charges' | translate }}
-
-
-
- | {{ 'labels.inputs.Name' | translate }} |
-
- {{ charge.name + ', ' + charge.currency.displaySymbol }}
- |
-
-
- {{ 'labels.inputs.Type' | translate }} |
-
- {{ charge.chargeCalculationType.value | translateKey: 'catalogs' }}
- |
-
-
- {{ 'labels.inputs.Amount' | translate }} |
-
- {{ charge.amount | formatNumber }}
- |
-
-
- {{ 'labels.inputs.Collected On' | translate }} |
-
- {{ charge.chargeTimeType.value | translateKey: 'catalogs' }}
- |
-
-
-
-
-
- }
-
-
{{ 'labels.heading.Accounting' | translate }}
-
-
-
-
-
-
- @if (
- savingProduct.paymentChannelToFundSourceMappings?.length ||
- savingProduct.feeToIncomeAccountMappings?.length ||
- savingProduct.penaltyToIncomeAccountMappings?.length
- ) {
-
-
{{ 'labels.inputs.Advanced Accounting Rules' | translate }}
-
- @if (savingProduct.paymentChannelToFundSourceMappings?.length) {
-
-
{{ 'labels.inputs.Fund Sources for Payment Channels' | translate }}
-
-
- | {{ 'labels.inputs.Payment Type' | translate }} |
-
- {{ paymentFundSource.paymentType.name }}
- |
-
-
- {{ 'labels.inputs.Fund Source' | translate }} |
-
- ({{ paymentFundSource.fundSourceAccount.glCode }}) {{ paymentFundSource.fundSourceAccount.name }}
- |
-
-
-
-
-
- }
- @if (savingProduct.feeToIncomeAccountMappings?.length) {
-
-
{{ 'labels.inputs.Fees to Specific Income Accounts' | translate }}
-
-
- | {{ 'labels.inputs.Fees' | translate }} |
-
- {{ feesIncome.charge.name }}
- |
-
-
- {{ 'labels.inputs.Income Account' | translate }} |
-
- ({{ feesIncome.incomeAccount.glCode }}) {{ feesIncome.incomeAccount.name }}
- |
-
-
-
-
-
- }
- @if (savingProduct.penaltyToIncomeAccountMappings?.length) {
-
-
{{ 'labels.inputs.Penalties to Specific Income Accounts' | translate }}
-
-
- | {{ 'labels.inputs.Penalty' | translate }} |
-
- {{ penaltyIncome.charge.name }}
- |
-
-
- {{ 'labels.inputs.Income Account' | translate }} |
-
- ({{ penaltyIncome.incomeAccount.glCode }}) {{ penaltyIncome.incomeAccount.name }}
- |
-
-
-
-
-
- }
-
- }
+
+ {{ 'labels.inputs.Currency' | translate }}:
+ {{ savingProduct.currency.name }}
+
+
+ {{ 'labels.inputs.Decimal Places' | translate }}:
+ {{ savingProduct.currency.decimalPlaces }}
+
+
+ @if (savingProduct.currency.inMultiplesOf !== undefined && savingProduct.currency.inMultiplesOf !== null) {
+
+ {{ 'labels.inputs.Currency in multiples of' | translate }}:
+ {{ savingProduct.currency.inMultiplesOf }}
+
+ }
+
+ @if (savingProduct.dormancyAlert !== undefined) {
+
+ Dormancy Alert:
+ {{ savingProduct.dormancyAlert | yesNo }}
+
+ }
+
+ @if (savingProduct.nominationFacility !== undefined) {
+
+ Nomination Facility:
+ {{ savingProduct.nominationFacility | yesNo }}
+
+ }
+
+
{{ 'labels.inputs.Terms' | translate }}
+
+
+
+
+ {{ 'labels.inputs.Nominal Annual Interest' | translate }}:
+ {{ savingProduct.nominalAnnualInterestRate | formatNumber }} %
+
+
+
+ {{ 'labels.inputs.Interest Compounding Period' | translate }}:
+ {{ savingProduct.interestCompoundingPeriodType.value | translateKey: 'catalogs' }}
+
+
+
+ {{ 'labels.inputs.Interest Posting Period' | translate }}:
+ {{ savingProduct.interestPostingPeriodType.value | translateKey: 'catalogs' }}
+
+
+
+ {{ 'labels.inputs.Interest Calculated using' | translate }}:
+ {{ savingProduct.interestCalculationType.value | translateKey: 'catalogs' }}
+
+
+
+ {{ 'labels.inputs.Days in Year' | translate }}:
+ {{ savingProduct.interestCalculationDaysInYearType.value | translateKey: 'catalogs' }}
+
+
+ @if (savingProduct.effectiveDate) {
+
+ Effective Date:
+ {{ savingProduct.effectiveDate }}
+
+ }
+
+
+ Interest Calculate:
+ {{ savingProduct.interestCalculateSelector }}
+
+
+ @if (savingProduct.averagePeriod) {
+
+ Average Period:
+ {{ savingProduct.averagePeriod }}
+
+ }
+
+
+ Auto Post:
+ {{ savingProduct.autoPost | yesNo }}
+
+
+ @if (savingProduct.frequencyFixDay) {
+
+ Frequency Fix Day:
+ {{ savingProduct.frequencyFixDay }}
+
+ }
+
+ @if (savingProduct.lastInterestDate) {
+
+ Last Interest Date:
+ {{ savingProduct.lastInterestDate }}
+
+ }
+
+
{{ 'labels.inputs.Settings' | translate }}
+
+
+
+ @if (savingProduct.minRequiredOpeningBalance) {
+
+ {{ 'labels.inputs.Minimum Opening Balance' | translate }}:
+ {{ savingProduct.minRequiredOpeningBalance | formatNumber }}
+
+ }
+
+ @if (savingProduct.lockinPeriodFrequency) {
+
+ {{ 'labels.inputs.Lock-in Period' | translate }}:
+ {{
+ savingProduct.lockinPeriodFrequency + ' ' + savingProduct.lockinPeriodFrequencyType.value
+ }}
+
+ }
+
+
+ {{ 'labels.inputs.Apply Withdrawal Fee for Transfers' | translate }}:
+ {{ savingProduct.withdrawalFeeForTransfers | yesNo }}
+
+
+ @if (savingProduct.balanceFrequency) {
+
+ Balance Frequency:
+ {{ savingProduct.balanceFrequency }}
+
+ }
+
+
+ Enable Lock-in Period:
+ {{ savingProduct.enableLockinPeriod | yesNo }}
+
+
+ @if (savingProduct.minBalanceForInterestCalculation) {
+
+ {{ 'labels.inputs.Balance Required for Interest Calculation' | translate }}:
+ {{ savingProduct.minBalanceForInterestCalculation | formatNumber }}
+
+ }
+
+
+ {{ 'labels.inputs.Enforce Minimum Balance' | translate }}:
+ {{ savingProduct.enforceMinRequiredBalance | yesNo }}
+
+
+ @if (savingProduct.minRequiredBalance) {
+
+ {{ 'labels.inputs.Minimum Balance' | translate }}:
+ {{ savingProduct.minRequiredBalance | formatNumber }}
+
+ }
+
+
+ {{ 'labels.inputs.Withhold Tax is Applicable' | translate }}:
+ {{ savingProduct.withHoldTax | yesNo }}
+
+
+ @if (savingProduct.withHoldTax) {
+
+ {{ 'labels.inputs.Tax Group' | translate }}:
+ {{ savingProduct.taxGroup.name }}
+
+ }
+
+
+ {{ 'labels.inputs.Is Overdraft Allowed' | translate }}:
+ {{ savingProduct.allowOverdraft | yesNo }}
+
+
+
+ Account Closed Zero Balance in Day Closing:
+ {{ savingProduct.accountClosedZeroBalanceInDayClosing | yesNo }}
+
+
+ @if (savingProduct.minOverdraftForInterestCalculation) {
+
+ {{ 'labels.inputs.Minimum Overdraft Required for Interest Calculation' | translate }}:
+ {{ savingProduct.minOverdraftForInterestCalculation | formatNumber }}
+
+ }
+
+ @if (savingProduct.nominalAnnualInterestRateOverdraft) {
+
+ {{ 'labels.inputs.Nominal Annual Interest for Overdraft' | translate }}:
+ {{ savingProduct.nominalAnnualInterestRateOverdraft | formatNumber }} %
+
+ }
+
+ @if (savingProduct.overdraftLimit) {
+
+ {{ 'labels.inputs.Maximum Overdraft Amount Limit' | translate }}:
+ {{ savingProduct.overdraftLimit | formatNumber }}
+
+ }
+
+
+ {{ 'labels.inputs.Enable Dormancy Tracking' | translate }}:
+ {{ savingProduct.isDormancyTrackingActive | yesNo }}
+
+
+ @if (savingProduct.isDormancyTrackingActive) {
+
+ {{ 'labels.inputs.Number of Days to Inactive sub-status' | translate }}:
+ {{ savingProduct.daysToInactive }}
+ {{ 'labels.inputs.Number of Days to Dormant sub-status' | translate }}:
+ {{ savingProduct.daysToDormancy }}
+ {{ 'labels.inputs.Number of Days to Escheat' | translate }}:
+ {{ savingProduct.daysToEscheat }}
+
+ }
+
+
Account Facilities
+
+
+ @if (savingProduct.accountFacilityConfig) {
+
+ @for (feature of accountFacilityFeatureItems; track feature.key) {
+ @if (savingProduct.accountFacilityConfig[feature.key] !== undefined) {
+
+ {{ feature.label }}:
+ {{ savingProduct.accountFacilityConfig[feature.key] | yesNo }}
+
+ }
+ }
+
+ }
+
+ @if (savingProduct.accountFacilityLimits?.length) {
+
+
Account Facility Limits
+
+
+
+ | Limit Type |
+ {{ row.limitType }} |
+
+
+ General Limit |
+ {{ row.generalLimit }} |
+
+
+ Minor Account Limit |
+ {{ row.minorAccountLimit }} |
+
+
+ Small Saving Limit |
+ {{ row.smallSavingLimit }} |
+
+
+
+
+
+ }
+
+ @if (savingProduct.depositLimitKyc) {
+
+
Deposit Limit (KYC)
+
+ General:
+ {{ savingProduct.depositLimitKyc.general.kycType }} - {{ savingProduct.depositLimitKyc.general.limit }}
+
+
+ Minor:
+ {{ savingProduct.depositLimitKyc.minor.kycType }} - {{ savingProduct.depositLimitKyc.minor.limit }}
+
+
+ Small Saving:
+ {{ savingProduct.depositLimitKyc.smallSaving.kycType }} -
+ {{ savingProduct.depositLimitKyc.smallSaving.limit }}
+
+
+ }
+
+ @if (savingProduct.charges.length) {
+
+
{{ 'labels.heading.Charges' | translate }}
+
+
+
+ | {{ 'labels.inputs.Name' | translate }} |
+
+ {{ charge.name + ', ' + charge.currency.displaySymbol }}
+ |
+
+
+ {{ 'labels.inputs.Type' | translate }} |
+
+ {{ charge.chargeCalculationType.value | translateKey: 'catalogs' }}
+ |
+
+
+ {{ 'labels.inputs.Amount' | translate }} |
+
+ {{ charge.amount | formatNumber }}
+ |
+
+
+ {{ 'labels.inputs.Collected On' | translate }} |
+
+ {{ charge.chargeTimeType.value | translateKey: 'catalogs' }}
+ |
+
+
+
+
+
+ }
+
+
{{ 'labels.heading.Accounting' | translate }}
+
+
+
+
+
+
+ @if (
+ savingProduct.paymentChannelToFundSourceMappings?.length ||
+ savingProduct.feeToIncomeAccountMappings?.length ||
+ savingProduct.penaltyToIncomeAccountMappings?.length
+ ) {
+
+
{{ 'labels.inputs.Advanced Accounting Rules' | translate }}
+
+ @if (savingProduct.paymentChannelToFundSourceMappings?.length) {
+
+
{{ 'labels.inputs.Fund Sources for Payment Channels' | translate }}
+
+
+ | {{ 'labels.inputs.Payment Type' | translate }} |
+
+ {{ paymentFundSource.paymentType.name }}
+ |
+
+
+ {{ 'labels.inputs.Fund Source' | translate }} |
+
+ ({{ paymentFundSource.fundSourceAccount.glCode }}) {{ paymentFundSource.fundSourceAccount.name }}
+ |
+
+
+
+
+
+ }
+ @if (savingProduct.feeToIncomeAccountMappings?.length) {
+
+
{{ 'labels.inputs.Fees to Specific Income Accounts' | translate }}
+
+
+ | {{ 'labels.inputs.Fee/Charge' | translate }} |
+
+ {{ fee.charge.name }}
+ |
+
+
+ {{ 'labels.inputs.Income Account' | translate }} |
+ ({{ fee.incomeAccount.glCode }}) {{ fee.incomeAccount.name }} |
+
+
+
+
+
+ }
+ @if (savingProduct.penaltyToIncomeAccountMappings?.length) {
+
+
{{ 'labels.inputs.Penalties to Specific Income Accounts' | translate }}
+
+
+ | {{ 'labels.inputs.Penalty' | translate }} |
+
+ {{ penalty.charge.name }}
+ |
+
+
+ {{ 'labels.inputs.Income Account' | translate }} |
+
+ ({{ penalty.incomeAccount.glCode }}) {{ penalty.incomeAccount.name }}
+ |
+
+
+
+
+
+ }
+
+ }
diff --git a/src/app/products/saving-products/view-saving-product/saving-product-general-tab/saving-product-general-tab.component.scss b/src/app/products/saving-products/view-saving-product/saving-product-general-tab/saving-product-general-tab.component.scss
index 258b214cd..84df78f65 100644
--- a/src/app/products/saving-products/view-saving-product/saving-product-general-tab/saving-product-general-tab.component.scss
+++ b/src/app/products/saving-products/view-saving-product/saving-product-general-tab/saving-product-general-tab.component.scss
@@ -71,3 +71,95 @@ mat-divider {
.margin-t {
margin-top: 1em;
}
+
+.spa-gl-summary,
+.spa-other-gl-summary {
+ display: flex;
+ flex-direction: column;
+ gap: 0.9rem;
+ margin-top: 1.25rem;
+}
+
+.spa-gl-summary__header {
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ padding: 0.25rem 0 0.5rem;
+}
+
+.spa-gl-section {
+ display: flex;
+ flex-direction: column;
+ gap: 0.75rem;
+ padding: 1rem 1.15rem;
+ border: 1px solid #e3e7f2;
+ border-radius: 12px;
+ background: #fff;
+}
+
+.spa-gl-section h5 {
+ font-size: 0.9rem;
+ font-weight: 700;
+ letter-spacing: 0.08em;
+ text-transform: uppercase;
+ color: #91a0bc;
+}
+
+.spa-gl-row {
+ display: grid;
+ grid-template-columns: minmax(220px, 40%) 1fr;
+ gap: 1rem;
+ align-items: baseline;
+ padding: 0.2rem 0;
+}
+
+.spa-gl-row__label {
+ color: #1f2f4a;
+ font-weight: 500;
+}
+
+.spa-gl-row__value {
+ color: #101828;
+ font-weight: 600;
+ word-break: break-word;
+}
+
+.spa-other-gl-table {
+ margin-top: 0.5rem;
+ margin-bottom: 0.75rem;
+ table-layout: fixed;
+ width: 100%;
+}
+
+.spa-other-gl-table:first-of-type {
+ margin-top: 0.25rem;
+}
+
+.spa-other-gl-summary .mat-elevation-z1 {
+ border-radius: 10px;
+ overflow: hidden;
+}
+
+.spa-other-gl-table th.mat-mdc-header-cell,
+.spa-other-gl-table td.mat-mdc-cell {
+ padding-left: 1.25rem;
+ padding-right: 1.25rem;
+}
+
+.spa-other-gl-table th.mat-mdc-header-cell:first-child,
+.spa-other-gl-table td.mat-mdc-cell:first-child {
+ width: 38%;
+}
+
+.spa-other-gl-table th.mat-mdc-header-cell:last-child,
+.spa-other-gl-table td.mat-mdc-cell:last-child {
+ width: 62%;
+ word-break: break-word;
+}
+
+@media (width <= 768px) {
+ .spa-gl-row {
+ grid-template-columns: 1fr;
+ gap: 0.35rem;
+ }
+}
diff --git a/src/app/products/saving-products/view-saving-product/saving-product-general-tab/saving-product-general-tab.component.ts b/src/app/products/saving-products/view-saving-product/saving-product-general-tab/saving-product-general-tab.component.ts
index f52332234..63de34766 100644
--- a/src/app/products/saving-products/view-saving-product/saving-product-general-tab/saving-product-general-tab.component.ts
+++ b/src/app/products/saving-products/view-saving-product/saving-product-general-tab/saving-product-general-tab.component.ts
@@ -72,6 +72,25 @@ export class SavingProductGeneralTabComponent {
'incomeAccountId'
];
+ accountFacilityFeatureItems = [
+ { key: 'atmFacility', label: 'ATM Facility' },
+ { key: 'atmWithdrawalFacility', label: 'ATM Withdrawal Facility' },
+ { key: 'upiFacility', label: 'UPI Facility' },
+ { key: 'posTransactionsFacility', label: 'POS Transactions Facility' },
+ { key: 'chequeBook', label: 'Cheque Book' },
+ { key: 'impsFacility', label: 'IMPS Facility' },
+ { key: 'smsAlerts', label: 'SMS Alerts' },
+ { key: 'bbpsFacility', label: 'BBPS Facility' },
+ { key: 'insuranceCover', label: 'Insurance Cover' },
+ { key: 'bepgFacility', label: 'BEPG Facility' },
+ { key: 'neftFacility', label: 'NEFT Facility' },
+ { key: 'rtgsFacility', label: 'RTGS Facility' },
+ { key: 'interBankTotalCapFacility', label: 'Inter-Bank Total Cap Facility' },
+ { key: 'withdrawalFacility', label: 'Withdrawal Facility' },
+ { key: 'depositFacilityKyc', label: 'Deposit Facility (KYC)' },
+ { key: 'virtualDebitCard', label: 'Virtual Debit Card' }
+ ];
+
constructor() {
this.route.data.subscribe((data: { savingProduct: any }) => {
this.savingProduct = data.savingProduct;
@@ -85,4 +104,22 @@ export class SavingProductGeneralTabComponent {
isAccrualAccounting(): boolean {
return this.accounting.isAccrualAccounting(this.savingProduct.accountingRule);
}
+
+ formatGlAccountById(glAccountId: number, options: any[]): string {
+ if (!glAccountId || !Array.isArray(options)) {
+ return '-';
+ }
+
+ const account = this.accounting.glAccountLookUp(glAccountId, options as any);
+ return account ? `(${account.glCode}) ${account.name}` : '-';
+ }
+
+ formatGlAccountByCode(glCode: string, options: any[]): string {
+ if (!glCode || !Array.isArray(options)) {
+ return '-';
+ }
+
+ const account = options.find((option) => option?.glCode === glCode);
+ return account ? `(${account.glCode}) ${account.name}` : glCode;
+ }
}
diff --git a/src/environments/.env.ts b/src/environments/.env.ts
index 9dd2af68c..a46de5b84 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': '260407',
- 'hash': 'gb890d24bb'
+ 'version': '260413',
+ 'hash': '79e455c4'
},
'allow_switching_backend_instance': true
};