From 37ac15f42c856d489ac52a335eae767c2c229dab Mon Sep 17 00:00:00 2001 From: Nitesh Yadav Date: Tue, 19 May 2026 14:21:52 +0530 Subject: [PATCH] fixed current, rd, fd account preview page styling --- angular.json | 4 +- .../search-journal-entry.component.html | 17 +- .../search-journal-entry.component.scss | 4 +- src/app/core/shell/shell.component.scss | 1 + ...current-product-general-tab.component.html | 1231 ++++++++------- ...current-product-general-tab.component.scss | 441 +++++- .../current-product-general-tab.component.ts | 1 + .../fixed-deposit-general-tab.component.html | 1058 +++++++------ .../fixed-deposit-general-tab.component.scss | 418 ++++- .../fixed-deposit-general-tab.component.ts | 26 + .../general-tab/general-tab.component.html | 1 - ...curring-deposit-general-tab.component.html | 1371 +++++++++-------- ...curring-deposit-general-tab.component.scss | 538 ++++++- ...recurring-deposit-general-tab.component.ts | 21 +- 14 files changed, 3329 insertions(+), 1803 deletions(-) diff --git a/angular.json b/angular.json index b4daea670..1fe5293cf 100644 --- a/angular.json +++ b/angular.json @@ -69,8 +69,8 @@ "budgets": [ { "type": "initial", - "maximumWarning": "12mb", - "maximumError": "12mb" + "maximumWarning": "13mb", + "maximumError": "14mb" }, { "type": "anyComponentStyle", diff --git a/src/app/accounting/search-journal-entry/search-journal-entry.component.html b/src/app/accounting/search-journal-entry/search-journal-entry.component.html index e2a190b5a..c7ad57bac 100644 --- a/src/app/accounting/search-journal-entry/search-journal-entry.component.html +++ b/src/app/accounting/search-journal-entry/search-journal-entry.component.html @@ -702,17 +702,16 @@ [class.gl-data-row--cr]="row.entryType?.value === 'CREDIT'" class="gl-data-row" > - - -
-
-
No entries found
-
Try adjusting your filters or date range
-
- - + @if (totalEntries === 0) { +
+
+
No entries found
+
Try adjusting your filters or date range
+
+ } +
diff --git a/src/app/accounting/search-journal-entry/search-journal-entry.component.scss b/src/app/accounting/search-journal-entry/search-journal-entry.component.scss index 8f7ad4359..9a243ba18 100644 --- a/src/app/accounting/search-journal-entry/search-journal-entry.component.scss +++ b/src/app/accounting/search-journal-entry/search-journal-entry.component.scss @@ -1444,9 +1444,11 @@ flex-direction: column; align-items: center; justify-content: center; - min-height: 300px; + min-height: 340px; width: 100%; text-align: center; + padding: 0 16px; + box-sizing: border-box; &__icon { font-size: 2.5rem; diff --git a/src/app/core/shell/shell.component.scss b/src/app/core/shell/shell.component.scss index 926d3abfa..3e6eb1510 100644 --- a/src/app/core/shell/shell.component.scss +++ b/src/app/core/shell/shell.component.scss @@ -98,6 +98,7 @@ $color: #e2e4ec; max-width: 100%; overflow-x: hidden; box-sizing: border-box; + padding: 16px 28px; } } diff --git a/src/app/products/current-products/view-current-product/current-product-general-tab/current-product-general-tab.component.html b/src/app/products/current-products/view-current-product/current-product-general-tab/current-product-general-tab.component.html index b1159bcaf..c2904dd05 100644 --- a/src/app/products/current-products/view-current-product/current-product-general-tab/current-product-general-tab.component.html +++ b/src/app/products/current-products/view-current-product/current-product-general-tab/current-product-general-tab.component.html @@ -6,448 +6,560 @@ file, You can obtain one at http://mozilla.org/MPL/2.0/. --> -
+
-
-
-
-
-
Current-Account Product
-

{{ currentProduct.name }}

-
- {{ currentProduct.shortName }} +
+
+
+
+
Current Account Product
+

{{ currentProduct.name }}

+
+ {{ currentProduct.shortName }} @if (currentProduct.currency?.code) { - {{ currentProduct.currency.code }} + {{ currentProduct.currency.code }} } + @if (currentProduct.accountType) { + {{ currentProduct.accountType }} + } + + + {{ currentProduct.endDate ? 'Inactive' : 'Active' }} +
@if (currentProduct.description) { -

{{ currentProduct.description }}

+

{{ currentProduct.description }}

}
-
-
-

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

- - -
- {{ 'labels.inputs.Short Name' | translate }}: - {{ currentProduct.shortName }} + +
+
+
+

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

- - @if (currentProduct.description) { -
- {{ 'labels.inputs.Description' | translate }}: - {{ currentProduct.description }} +
+
+ {{ 'labels.inputs.Short Name' | translate }} + {{ currentProduct.shortName }}
- } - - @if ( - currentProduct.accountType || - currentProduct.customerSegment || - currentProduct.glAccountId || - currentProduct.effectiveDate || - currentProduct.effectiveTo || - currentProduct.endDate || - currentProduct.introducerRequired !== undefined || - currentProduct.shareLinkingEnabled !== undefined - ) { -

Product Classification

- - - - @if (currentProduct.accountType) { -
- Account Type: - {{ currentProduct.accountType }} + @if (currentProduct.description) { +
+ {{ 'labels.inputs.Description' | translate }} + {{ currentProduct.description }}
} +
+
- @if (currentProduct.customerSegment) { -
- Customer Segment: - {{ currentProduct.customerSegment }} + + @if ( + currentProduct.accountType || + currentProduct.customerSegment || + currentProduct.glAccountId || + currentProduct.effectiveDate || + currentProduct.effectiveTo || + currentProduct.endDate || + currentProduct.introducerRequired !== undefined || + currentProduct.shareLinkingEnabled !== undefined + ) { +
+
+
+

Product Classification

+
+
+ @if (currentProduct.accountType) { +
+ Account Type + {{ currentProduct.accountType }} +
+ } + @if (currentProduct.customerSegment) { +
+ Customer Segment + {{ currentProduct.customerSegment }} +
+ } + @if (currentProduct.glAccountId) { +
+ GL Account (Liability) + {{ currentProduct.glAccountName || currentProduct.glAccountId }} +
+ } + @if (currentProduct.effectiveDate) { +
+ Effective Date + {{ currentProduct.effectiveDate | dateFormat }} +
+ } + @if (currentProduct.effectiveTo) { +
+ Effective To + {{ currentProduct.effectiveTo | dateFormat }} +
+ } + @if (currentProduct.endDate) { +
+ End Date + {{ currentProduct.endDate | dateFormat }} +
+ } + @if (currentProduct.introducerRequired !== undefined) { +
+ Introducer Required + + + {{ + currentProduct.introducerRequired === true || currentProduct.introducerRequired === 'Yes' + ? 'Yes' + : 'No' + }} + + +
+ } + @if (currentProduct.shareLinkingEnabled !== undefined) { +
+ Share Linking Enabled + + + {{ currentProduct.shareLinkingEnabled | yesNo }} + + +
+ } +
+
+ } + + +
+
+
+

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

+
+
+
+ {{ 'labels.inputs.Currency' | translate }} + {{ currentProduct.currency.name }} +
+
+ {{ 'labels.inputs.Decimal Places' | translate }} + {{ currentProduct.currency.decimalPlaces }} +
+ @if (currentProduct.currency.inMultiplesOf !== undefined && currentProduct.currency.inMultiplesOf !== null) { +
+ {{ 'labels.inputs.Currency in multiples of' | translate }} + {{ currentProduct.currency.inMultiplesOf }}
} - - @if (currentProduct.glAccountId) { -
- GL Account (Liability): - {{ currentProduct.glAccountName || currentProduct.glAccountId }} + @if (currentProduct.dormancyAlert !== undefined) { +
+ Dormancy Alert + {{ currentProduct.dormancyAlert | yesNo }}
} - - @if (currentProduct.effectiveDate) { -
- Effective Date: - {{ currentProduct.effectiveDate | dateFormat }} + @if (currentProduct.nominationFacility !== undefined) { +
+ Nomination Facility + {{ currentProduct.nominationFacility | yesNo }}
} - - @if (currentProduct.effectiveTo) { -
- Effective To: - {{ currentProduct.effectiveTo | dateFormat }} + @if (currentProduct.balanceSwapOption !== undefined) { +
+ Balance Swap Option + {{ currentProduct.balanceSwapOption | yesNo }}
} - - @if (currentProduct.endDate) { -
- End Date: - {{ currentProduct.endDate | dateFormat }} + @if (currentProduct.msme !== undefined) { +
+ MSME + {{ currentProduct.msme | yesNo }}
} + @if (currentProduct.autoDebitFacility !== undefined) { +
+ Auto Debit Facility + {{ currentProduct.autoDebitFacility | yesNo }} +
+ } +
+
- @if (currentProduct.introducerRequired !== undefined) { -
- Introducer Required: - {{ - currentProduct.introducerRequired === true || currentProduct.introducerRequired === 'Yes' ? 'Yes' : 'No' + +
+
+
+

Interest On OD

+
+
+ @if (currentProduct.interestPostingPeriodType?.value) { +
+ {{ 'labels.inputs.Interest Posting Period' | translate }} + {{ currentProduct.interestPostingPeriodType.value | translateKey: 'catalogs' }} +
+ } + @if (currentProduct.interestCalculateSelector) { +
+ Interest Calculate + {{ currentProduct.interestCalculateSelector }} +
+ } + @if (currentProduct.averagePeriod) { +
+ Average Period + {{ currentProduct.averagePeriod }} +
+ } + @if (currentProduct.autoPost !== undefined) { +
+ Auto Post + + + {{ currentProduct.autoPost | yesNo }} + + +
+ } + @if (currentProduct.frequencyFixDay) { +
+ Frequency Fix Day + {{ currentProduct.frequencyFixDay }} +
+ } + @if (currentProduct.lastInterestDate) { +
+ Last Interest Date + {{ currentProduct.lastInterestDate | dateFormat }} +
+ } +
+
+ + +
+
+
+

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

+
+
+ @if (currentProduct.minRequiredOpeningBalance) { +
+ {{ 'labels.inputs.Minimum Opening Balance' | translate }} + {{ currentProduct.minRequiredOpeningBalance | formatNumber }} +
+ } + @if (currentProduct.lockinPeriodFrequency) { +
+ {{ 'labels.inputs.Lock-in Period' | translate }} + {{ + currentProduct.lockinPeriodFrequency + + ' ' + + (currentProduct.lockinPeriodFrequencyType?.value || currentProduct.lockinPeriodFrequencyType?.code || '') }}
} - - @if (currentProduct.shareLinkingEnabled !== undefined) { -
- Share Linking Enabled: - {{ currentProduct.shareLinkingEnabled | yesNo }} +
+ {{ 'labels.inputs.Apply Withdrawal Fee for Transfers' | translate }} + + + {{ currentProduct.withdrawalFeeForTransfers | yesNo }} + + +
+ @if (currentProduct.balanceFrequency) { +
+ Balance Frequency + {{ currentProduct.balanceFrequency }}
} - } - -

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

- - - -
- {{ 'labels.inputs.Currency' | translate }}: - {{ currentProduct.currency.name }} -
- -
- {{ 'labels.inputs.Decimal Places' | translate }}: - {{ currentProduct.currency.decimalPlaces }} -
- - @if (currentProduct.currency.inMultiplesOf !== undefined && currentProduct.currency.inMultiplesOf !== null) { -
- {{ 'labels.inputs.Currency in multiples of' | translate }}: - {{ currentProduct.currency.inMultiplesOf }} +
+ Enable Lock-in Period + + + {{ currentProduct.enableLockinPeriod | yesNo }} + +
- } - - @if (currentProduct.dormancyAlert !== undefined) { -
- Dormancy Alert: - {{ currentProduct.dormancyAlert | yesNo }} -
- } - - @if (currentProduct.nominationFacility !== undefined) { -
- Nomination Facility: - {{ currentProduct.nominationFacility | yesNo }} -
- } - - @if (currentProduct.balanceSwapOption !== undefined) { -
- Balance Swap Option: - {{ currentProduct.balanceSwapOption | yesNo }} -
- } - - @if (currentProduct.msme !== undefined) { -
- MSME: - {{ currentProduct.msme | yesNo }} -
- } - - @if (currentProduct.autoDebitFacility !== undefined) { -
- Auto Debit Facility: - {{ currentProduct.autoDebitFacility | yesNo }} -
- } - -

Interest On OD

- - - - @if (currentProduct.interestPostingPeriodType?.value) { -
- {{ 'labels.inputs.Interest Posting Period' | translate }}: - {{ currentProduct.interestPostingPeriodType.value | translateKey: 'catalogs' }} -
- } - - @if (currentProduct.interestCalculateSelector) { -
- Interest Calculate: - {{ currentProduct.interestCalculateSelector }} -
- } - - @if (currentProduct.averagePeriod) { -
- Average Period: - {{ currentProduct.averagePeriod }} -
- } - - @if (currentProduct.autoPost !== undefined) { -
- Auto Post: - {{ currentProduct.autoPost | yesNo }} -
- } - - @if (currentProduct.frequencyFixDay) { -
- Frequency Fix Day: - {{ currentProduct.frequencyFixDay }} -
- } - - @if (currentProduct.lastInterestDate) { -
- Last Interest Date: - {{ currentProduct.lastInterestDate | dateFormat }} -
- } - -

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

- - - - @if (currentProduct.minRequiredOpeningBalance) { -
- {{ 'labels.inputs.Minimum Opening Balance' | translate }}: - {{ currentProduct.minRequiredOpeningBalance | formatNumber }} -
- } - - @if (currentProduct.lockinPeriodFrequency) { -
- {{ 'labels.inputs.Lock-in Period' | translate }}: - {{ - currentProduct.lockinPeriodFrequency + - ' ' + - (currentProduct.lockinPeriodFrequencyType?.value || currentProduct.lockinPeriodFrequencyType?.code || '') - }} -
- } - -
- {{ 'labels.inputs.Apply Withdrawal Fee for Transfers' | translate }}: - {{ currentProduct.withdrawalFeeForTransfers | yesNo }} -
- - @if (currentProduct.balanceFrequency) { -
- Balance Frequency: - {{ currentProduct.balanceFrequency }} -
- } - -
- Enable Lock-in Period: - {{ currentProduct.enableLockinPeriod | yesNo }} -
- - @if (currentProduct.minBalanceForInterestCalculation) { -
- {{ 'labels.inputs.Balance Required for Interest Calculation' | translate }}: - {{ currentProduct.minBalanceForInterestCalculation | formatNumber }} -
- } - -
- {{ 'labels.inputs.Enforce Minimum Balance' | translate }}: - {{ currentProduct.enforceMinRequiredBalance | yesNo }} -
- - @if (currentProduct.minRequiredBalance) { -
- {{ 'labels.inputs.Minimum Balance' | translate }}: - {{ currentProduct.minRequiredBalance | formatNumber }} -
- } - -
- {{ 'labels.inputs.Withhold Tax is Applicable' | translate }}: - {{ currentProduct.withHoldTax | yesNo }} -
- - @if (currentProduct.withHoldTax) { -
- {{ 'labels.inputs.Tax Group' | translate }}: - {{ currentProduct.taxGroup.name }} -
- } - -
- {{ 'labels.inputs.Is Overdraft Allowed' | translate }}: - {{ currentProduct.allowOverdraft | yesNo }} -
- -
- Account Closed Zero Balance in Day Closing: - {{ currentProduct.accountClosedZeroBalanceInDayClosing | yesNo }} -
- - @if (currentProduct.minOverdraftForInterestCalculation) { -
- {{ 'labels.inputs.Minimum Overdraft Required for Interest Calculation' | translate }}: - {{ currentProduct.minOverdraftForInterestCalculation | formatNumber }} -
- } - - @if (currentProduct.nominalAnnualInterestRateOverdraft) { -
- {{ 'labels.inputs.Nominal Annual Interest for Overdraft' | translate }}: - {{ currentProduct.nominalAnnualInterestRateOverdraft | formatNumber }} % -
- } - - @if (currentProduct.overdraftLimit) { -
- {{ 'labels.inputs.Maximum Overdraft Amount Limit' | translate }}: - {{ currentProduct.overdraftLimit | formatNumber }} -
- } - - @if (currentProduct.allowOverdraft) { - @if (currentProduct.avgBalanceCalcPeriod) { -
- Average Balance Calculation Period: - {{ currentProduct.avgBalanceCalcPeriod }} + @if (currentProduct.minBalanceForInterestCalculation) { +
+ {{ 'labels.inputs.Balance Required for Interest Calculation' | translate }} + {{ currentProduct.minBalanceForInterestCalculation | formatNumber }}
} - - @if (currentProduct.validForPeriod) { -
- Valid for Period: - {{ currentProduct.validForPeriod }} -
- } - - @if (currentProduct.odAccountClosedZeroBalanceInDayClosing !== undefined) { -
- OD Account Closed with Zero Balance in Day Closing: - {{ currentProduct.odAccountClosedZeroBalanceInDayClosing | yesNo }} -
- } - } - -
- {{ 'labels.inputs.Enable Dormancy Tracking' | translate }}: - {{ currentProduct.isDormancyTrackingActive | yesNo }} -
- - @if (currentProduct.isDormancyTrackingActive) { -
- {{ 'labels.inputs.Number of Days to Inactive sub-status' | translate }}: - {{ currentProduct.daysToInactive }} - {{ 'labels.inputs.Number of Days to Dormant sub-status' | translate }}: - {{ currentProduct.daysToDormancy }} - {{ 'labels.inputs.Number of Days to Escheat' | translate }}: - {{ currentProduct.daysToEscheat }} +
+ {{ 'labels.inputs.Enforce Minimum Balance' | translate }} + + + {{ currentProduct.enforceMinRequiredBalance | yesNo }} + +
- } - -

Account Facilities

- - - @if (currentProduct.accountFacilityConfig) { -
- @for (feature of accountFacilityFeatureItems; track feature.key) { - @if (currentProduct.accountFacilityConfig[feature.key] !== undefined) { -
- {{ feature.label }}: - {{ currentProduct.accountFacilityConfig[feature.key] | yesNo }} -
- } + @if (currentProduct.minRequiredBalance) { +
+ {{ 'labels.inputs.Minimum Balance' | translate }} + {{ currentProduct.minRequiredBalance | formatNumber }} +
+ } +
+ {{ 'labels.inputs.Withhold Tax is Applicable' | translate }} + + + {{ currentProduct.withHoldTax | yesNo }} + + +
+ @if (currentProduct.withHoldTax) { +
+ {{ 'labels.inputs.Tax Group' | translate }} + {{ currentProduct.taxGroup.name }} +
+ } +
+ {{ 'labels.inputs.Is Overdraft Allowed' | translate }} + + + {{ currentProduct.allowOverdraft | yesNo }} + + +
+
+ Account Closed Zero Balance in Day Closing + + + {{ currentProduct.accountClosedZeroBalanceInDayClosing | yesNo }} + + +
+ @if (currentProduct.minOverdraftForInterestCalculation) { +
+ {{ + 'labels.inputs.Minimum Overdraft Required for Interest Calculation' | translate + }} + {{ currentProduct.minOverdraftForInterestCalculation | formatNumber }} +
+ } + @if (currentProduct.nominalAnnualInterestRateOverdraft) { +
+ {{ 'labels.inputs.Nominal Annual Interest for Overdraft' | translate }} + {{ currentProduct.nominalAnnualInterestRateOverdraft | formatNumber }} % +
+ } + @if (currentProduct.overdraftLimit) { +
+ {{ 'labels.inputs.Maximum Overdraft Amount Limit' | translate }} + {{ currentProduct.overdraftLimit | formatNumber }} +
+ } + @if (currentProduct.allowOverdraft) { + @if (currentProduct.avgBalanceCalcPeriod) { +
+ Average Balance Calculation Period + {{ currentProduct.avgBalanceCalcPeriod }} +
} -
- } - - @if (currentProduct.accountFacilityLimits?.length) { -
-

Account Facility Limits

- - - - - - - - - - - - - - - - - - - - -
Limit Type{{ row.limitType }}General Limit{{ row.generalLimit }}Minor Account Limit{{ row.minorAccountLimit }}Small Saving Limit{{ row.smallSavingLimit }}
-
- } - - @if (currentProduct.depositLimitKyc) { -
-

Deposit Limit (KYC)

-
- General: - {{ currentProduct.depositLimitKyc.general.kycType }} - - {{ currentProduct.depositLimitKyc.general.limit }} + Valid for Period + {{ currentProduct.validForPeriod }} +
+ } + @if (currentProduct.odAccountClosedZeroBalanceInDayClosing !== undefined) { +
+ OD Account Closed with Zero Balance in Day Closing + {{ currentProduct.odAccountClosedZeroBalanceInDayClosing | yesNo }} +
+ } + } +
+ {{ 'labels.inputs.Enable Dormancy Tracking' | translate }} + + -
-
- Minor: - {{ currentProduct.depositLimitKyc.minor.kycType }} - {{ currentProduct.depositLimitKyc.minor.limit }} -
-
- Small Saving: - {{ currentProduct.depositLimitKyc.smallSaving.kycType }} - - {{ currentProduct.depositLimitKyc.smallSaving.limit }} -
+ {{ currentProduct.isDormancyTrackingActive | yesNo }} + +
- } + @if (currentProduct.isDormancyTrackingActive) { +
+ {{ 'labels.inputs.Number of Days to Inactive sub-status' | translate }} + {{ currentProduct.daysToInactive }} +
+
+ {{ 'labels.inputs.Number of Days to Dormant sub-status' | translate }} + {{ currentProduct.daysToDormancy }} +
+
+ {{ 'labels.inputs.Number of Days to Escheat' | translate }} + {{ currentProduct.daysToEscheat }} +
+ } +
+
- @if (currentProduct.charges.length) { -
-

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

- - + + @if ( + currentProduct.accountFacilityConfig || + currentProduct.accountFacilityLimits?.length || + currentProduct.depositLimitKyc + ) { +
+
+
+

Account Facilities

+
+ + @if (currentProduct.accountFacilityConfig) { +
+ @for (feature of accountFacilityFeatureItems; track feature.key) { + @if (currentProduct.accountFacilityConfig[feature.key] !== undefined) { +
+ + {{ feature.label }} +
+ } + } +
+ } + + @if (currentProduct.accountFacilityLimits?.length) { +

Account Facility Limits

+
+
+ + + + + + + + + + + + + + + + + + +
Limit Type{{ row.limitType }}General Limit{{ row.generalLimit }}Minor Account Limit{{ row.minorAccountLimit }}Small Saving Limit{{ row.smallSavingLimit }}
+
+ } + + @if (currentProduct.depositLimitKyc) { +

Deposit Limit (KYC)

+
+
+ General + {{ currentProduct.depositLimitKyc.general.kycType }} · + {{ currentProduct.depositLimitKyc.general.limit }} +
+
+ Minor + {{ currentProduct.depositLimitKyc.minor.kycType }} · + {{ currentProduct.depositLimitKyc.minor.limit }} +
+
+ Small Saving + {{ currentProduct.depositLimitKyc.smallSaving.kycType }} · + {{ currentProduct.depositLimitKyc.smallSaving.limit }} +
+
+ } + + } + + + @if (currentProduct.charges.length) { +
+
+
+

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

+
+
+ - + @@ -457,186 +569,173 @@ - + - +
{{ 'labels.inputs.Name' | translate }} - {{ charge.name + ', ' + charge.currency.displaySymbol }} - {{ charge.name + ', ' + charge.currency.displaySymbol }} {{ 'labels.inputs.Type' | translate }} {{ 'labels.inputs.Amount' | translate }} - {{ charge.amount | formatNumber }} - {{ charge.amount | formatNumber }} {{ 'labels.inputs.Collected On' | translate }} - {{ charge.chargeTimeType.value | translateKey: 'catalogs' }} - {{ charge.chargeTimeType.value | translateKey: 'catalogs' }}
- } - -

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

- - +
+ } + +
+
+
+

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

+
- + > +
- @if (currentProduct.otherGlMappingsMap) { -
-

Other GL Mappings

- - - @if (currentProduct.otherGlMappingsMap.assets?.length) { -

Assets

- - - - - - - - - - - -
Account Name{{ row.accountName }}GL Account{{ row.glCode || row.glAccountId }}
- } - - @if (currentProduct.otherGlMappingsMap.liabilities?.length) { -

Liabilities

- - - - - - - - - - - -
Account Name{{ row.accountName }}GL Account{{ row.glCode || row.glAccountId }}
- } - - @if (currentProduct.otherGlMappingsMap.expenses?.length) { -

Expenses

- - - - - - - - - - - -
Account Name{{ row.accountName }}GL Account{{ row.glCode || row.glAccountId }}
- } - - @if (currentProduct.otherGlMappingsMap.income?.length) { -

Income

- - - - - - - - - - - -
Account Name{{ row.accountName }}GL Account{{ row.glCode || row.glAccountId }}
- } + + @if (currentProduct.otherGlMappingsMap) { +
+
+
+

Other GL Mappings

- } - @if ( - currentProduct.paymentChannelToFundSourceMappings?.length || - currentProduct.feeToIncomeAccountMappings?.length || - currentProduct.penaltyToIncomeAccountMappings?.length - ) { -
-

{{ 'labels.inputs.Advanced Accounting Rules' | translate }}

- - @if (currentProduct.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 (currentProduct.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 (currentProduct.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 }} -
-
- } + @if (currentProduct.otherGlMappingsMap.assets?.length) { +

Assets

+
+ + + + + + + + + + + +
Account Name{{ row.accountName }}GL Account{{ row.glCode || row.glAccountId }}
+
+ } + @if (currentProduct.otherGlMappingsMap.liabilities?.length) { +

Liabilities

+
+ + + + + + + + + + + +
Account Name{{ row.accountName }}GL Account{{ row.glCode || row.glAccountId }}
+
+ } + @if (currentProduct.otherGlMappingsMap.expenses?.length) { +

Expenses

+
+ + + + + + + + + + + +
Account Name{{ row.accountName }}GL Account{{ row.glCode || row.glAccountId }}
+
+ } + @if (currentProduct.otherGlMappingsMap.income?.length) { +

Income

+
+ + + + + + + + + + + +
Account Name{{ row.accountName }}GL Account{{ row.glCode || row.glAccountId }}
+
+ } +
+ } + + + @if ( + currentProduct.paymentChannelToFundSourceMappings?.length || + currentProduct.feeToIncomeAccountMappings?.length || + currentProduct.penaltyToIncomeAccountMappings?.length + ) { +
+
+
+

{{ 'labels.inputs.Advanced Accounting Rules' | translate }}

- } -
+ + @if (currentProduct.paymentChannelToFundSourceMappings?.length) { +

{{ 'labels.inputs.Fund Sources for Payment Channels' | translate }}

+
+ + + + + + + + + + + +
{{ 'labels.inputs.Payment Type' | translate }}{{ p.paymentType.name }}{{ 'labels.inputs.Fund Source' | translate }}({{ p.fundSourceAccount.glCode }}) {{ p.fundSourceAccount.name }}
+
+ } + @if (currentProduct.feeToIncomeAccountMappings?.length) { +

{{ 'labels.inputs.Fees to Specific Income Accounts' | translate }}

+
+ + + + + + + + + + + +
{{ 'labels.inputs.Fee/Charge' | translate }}{{ f.charge.name }}{{ 'labels.inputs.Income Account' | translate }}({{ f.incomeAccount.glCode }}) {{ f.incomeAccount.name }}
+
+ } + @if (currentProduct.penaltyToIncomeAccountMappings?.length) { +

{{ 'labels.inputs.Penalties to Specific Income Accounts' | translate }}

+
+ + + + + + + + + + + +
{{ 'labels.inputs.Penalty' | translate }}{{ p.charge.name }}{{ 'labels.inputs.Income Account' | translate }}({{ p.incomeAccount.glCode }}) {{ p.incomeAccount.name }}
+
+ } + + }
diff --git a/src/app/products/current-products/view-current-product/current-product-general-tab/current-product-general-tab.component.scss b/src/app/products/current-products/view-current-product/current-product-general-tab/current-product-general-tab.component.scss index 367f0cc1d..cf3013549 100644 --- a/src/app/products/current-products/view-current-product/current-product-general-tab/current-product-general-tab.component.scss +++ b/src/app/products/current-products/view-current-product/current-product-general-tab/current-product-general-tab.component.scss @@ -6,48 +6,429 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -@use 'assets/styles/helper'; -@use 'assets/styles/colours' as *; -@use 'assets/styles/product-view' as pv; - -@include pv.product-view-styles; - -/* Current-account-specific green accent */ :host { - --pv-accent: #15803d; - --pv-accent-l: #dcfce7; + --vsp-navy: #0b1e3d; + --vsp-blue: #1d4ed8; + --vsp-blue-l: #eff6ff; + --vsp-teal: #0e7e6b; + --vsp-teal-l: #ccfbf1; + --vsp-purple: #6d28d9; + --vsp-purple-l: #ede9fe; + --vsp-indigo: #3730a3; + --vsp-indigo-l: #e0e7ff; + --vsp-amber: #b45309; + --vsp-amber-l: #fef3c7; + --vsp-green: #15803d; + --vsp-green-l: #dcfce7; + --vsp-red: #c0392b; + --vsp-red-l: #fee2e2; + --vsp-pink: #be185d; + --vsp-pink-l: #fce7f3; + --vsp-g50: #f8fafc; + --vsp-g100: #f1f5f9; + --vsp-g200: #e2e8f0; + --vsp-g500: #64748b; + --vsp-g700: #334155; + --vsp-g900: #0f172a; + + display: block; + font-family: + 'DM Sans', + system-ui, + -apple-system, + sans-serif; + color: var(--vsp-g900); + font-size: 13.5px; } -.tab-container { - padding: 1%; - margin: 1%; +.vsp-root { + padding: 4px 4px 24px; + display: flex; + flex-direction: column; + gap: 14px; } -.mat-h3 { - margin-top: 10px !important; - font-weight: 300; - color: $status-approved; +/* ───────── HERO ───────── */ +.vsp-hero { + background: linear-gradient(135deg, var(--vsp-navy) 0%, var(--vsp-blue) 100%); + border-radius: 14px; + padding: 22px 22px 22px 18px; + display: flex; + align-items: flex-start; + gap: 18px; + box-shadow: + 0 10px 24px rgb(11 30 61 / 18%), + 0 4px 10px rgb(11 30 61 / 12%); + color: #fff; + position: relative; + overflow: hidden; } -h2, -h3, -h4 { - margin: 0; +.vsp-hero::before { + content: ''; + position: absolute; + top: -60px; + right: -60px; + width: 240px; + height: 240px; + border-radius: 50%; + background: radial-gradient(circle, rgb(255 255 255 / 8%) 0%, transparent 70%); + pointer-events: none; +} + +.vsp-hero-left { + display: flex; + align-items: flex-start; + gap: 16px; + flex: 1; + min-width: 0; +} + +.vsp-hero-icon { + width: 56px; + height: 56px; + border-radius: 14px; + background: rgb(255 255 255 / 16%); + border: 1px solid rgb(255 255 255 / 22%); + display: inline-flex; + align-items: center; + justify-content: center; + font-size: 24px; + flex-shrink: 0; +} + +.vsp-hero-text { + flex: 1; + min-width: 0; +} + +.vsp-hero-eyebrow { + font-size: 10.5px; + font-weight: 700; + text-transform: uppercase; + letter-spacing: 0.12em; + color: rgb(255 255 255 / 70%); + margin-bottom: 4px; +} + +.vsp-hero-title { + margin: 0 0 10px; + font-size: 22px; + font-weight: 700; + letter-spacing: 0.01em; + color: #fff; + line-height: 1.2; +} + +.vsp-hero-meta { + display: flex; + align-items: center; + gap: 8px; + flex-wrap: wrap; +} + +.vsp-hero-desc { + margin: 12px 0 0; + font-size: 13px; + color: rgb(255 255 255 / 82%); + line-height: 1.5; + max-width: 720px; +} + +.vsp-edit-btn { + display: inline-flex; + align-items: center; + gap: 8px; + height: 38px; + padding: 0 16px; + border-radius: 10px; + background: rgb(255 255 255 / 14%); + color: #fff; + border: 1px solid rgb(255 255 255 / 28%); + font-size: 13px; + font-weight: 700; + letter-spacing: 0.02em; + cursor: pointer; + text-decoration: none; + white-space: nowrap; + font-family: inherit; + flex-shrink: 0; + transition: all 0.16s ease; + + fa-icon { + font-size: 12px; + } + + &:hover { + background: rgb(255 255 255 / 24%); + border-color: rgb(255 255 255 / 50%); + } +} + +/* ───────── PILLS ───────── */ +.vsp-pill { + display: inline-flex; + align-items: center; + gap: 5px; + font-size: 11px; + font-weight: 700; + letter-spacing: 0.04em; + text-transform: uppercase; + padding: 4px 10px; + border-radius: 999px; + font-family: inherit; + + fa-icon { + font-size: 9.5px; + } + + &--code { + background: rgb(255 255 255 / 18%); + color: #fff; + border: 1px solid rgb(255 255 255 / 24%); + font-family: 'JetBrains Mono', ui-monospace, Menlo, Consolas, monospace; + } + + &--teal { + background: var(--vsp-teal-l); + color: var(--vsp-teal); + border: 1px solid #99f6e4; + } + + &--blue { + background: var(--vsp-blue-l); + color: var(--vsp-blue); + border: 1px solid #dbeafe; + } + + &--green { + background: var(--vsp-green-l); + color: var(--vsp-green); + border: 1px solid #bbf7d0; + } + + &--amber { + background: var(--vsp-amber-l); + color: var(--vsp-amber); + border: 1px solid #fde68a; + } + + &--red { + background: var(--vsp-red-l); + color: var(--vsp-red); + border: 1px solid #fecaca; + } + + &--gray { + background: var(--vsp-g100); + color: var(--vsp-g700); + border: 1px solid var(--vsp-g200); + } +} + +/* ───────── SECTION ───────── */ +.vsp-section { + background: #fff; + border: 1px solid var(--vsp-g200); + border-radius: 12px; + padding: 16px 20px; + box-shadow: 0 1px 2px rgb(15 23 42 / 4%); +} + +.vsp-section-h { + display: flex; + align-items: center; + gap: 12px; + margin-bottom: 14px; + padding-bottom: 12px; + border-bottom: 1px dashed var(--vsp-g200); + + h3 { + margin: 0; + font-size: 14px; + font-weight: 700; + color: var(--vsp-g900); + letter-spacing: 0.02em; + } +} + +.vsp-section-ic { + width: 36px; + height: 36px; + border-radius: 10px; + display: inline-flex; + align-items: center; + justify-content: center; + font-size: 14px; + flex-shrink: 0; + + &--blue { + background: var(--vsp-blue-l); + color: var(--vsp-blue); + } + + &--teal { + background: var(--vsp-teal-l); + color: var(--vsp-teal); + } + + &--purple { + background: var(--vsp-purple-l); + color: var(--vsp-purple); + } + + &--indigo { + background: var(--vsp-indigo-l); + color: var(--vsp-indigo); + } + + &--amber { + background: var(--vsp-amber-l); + color: var(--vsp-amber); + } + + &--green { + background: var(--vsp-green-l); + color: var(--vsp-green); + } + + &--red { + background: var(--vsp-red-l); + color: var(--vsp-red); + } + + &--pink { + background: var(--vsp-pink-l); + color: var(--vsp-pink); + } +} + +.vsp-sub-h { + margin: 16px 0 10px; + font-size: 12px; + font-weight: 700; + color: var(--vsp-g700); + text-transform: uppercase; + letter-spacing: 0.06em; +} + +/* ───────── KEY/VALUE GRID ───────── */ +.vsp-grid { + display: grid; + grid-template-columns: 1fr 1fr; + gap: 10px 24px; +} + +.vsp-grid--3 { + grid-template-columns: repeat(3, 1fr); +} + +@media (width <= 900px) { + .vsp-grid, + .vsp-grid--3 { + grid-template-columns: 1fr 1fr; + } +} + +@media (width <= 600px) { + .vsp-grid, + .vsp-grid--3 { + grid-template-columns: 1fr; + } +} + +.vsp-kv { + display: flex; + flex-direction: column; + gap: 3px; + padding: 8px 0; + border-bottom: 1px dashed var(--vsp-g100); + + &--span { + grid-column: 1 / -1; + } +} + +.vsp-k { + font-size: 10.5px; + font-weight: 700; + text-transform: uppercase; + letter-spacing: 0.06em; + color: var(--vsp-g500); +} + +.vsp-v { + font-size: 13.5px; + color: var(--vsp-g900); font-weight: 500; + word-break: break-word; + + strong { + font-weight: 700; + } } -table { +/* ───────── FEATURE GRID (account facilities) ───────── */ +.vsp-feature { + display: flex; + align-items: center; + gap: 8px; + padding: 8px 12px; + border-radius: 8px; + background: var(--vsp-g50); + border: 1px solid var(--vsp-g200); + font-size: 12.5px; + font-weight: 600; + color: var(--vsp-g700); + + fa-icon { + font-size: 12px; + color: var(--vsp-g500); + } + + &.is-on { + background: var(--vsp-green-l); + border-color: #bbf7d0; + color: var(--vsp-green); + + fa-icon { + color: var(--vsp-green); + } + } +} + +/* ───────── TABLES ───────── */ +.vsp-table-wrap { + overflow-x: auto; + border: 1px solid var(--vsp-g200); + border-radius: 10px; + margin-top: 4px; +} + +.vsp-table { width: 100%; -} + background: #fff; -.mat-elevation-z1 { - margin: 1em 0 1.5em; -} + th.mat-mdc-header-cell { + background: var(--vsp-g50); + color: var(--vsp-g700); + font-size: 11px; + font-weight: 700; + text-transform: uppercase; + letter-spacing: 0.06em; + padding: 11px 14px; + border-bottom: 1px solid var(--vsp-g200); + white-space: nowrap; + } -span { - margin: 0.5em 0; -} + td.mat-mdc-cell { + padding: 10px 14px; + border-bottom: 1px solid var(--vsp-g100); + font-size: 12.5px; + color: var(--vsp-g900); + } -mat-divider { - margin: 0 0 0.5em; + tbody tr:last-child td.mat-mdc-cell { + border-bottom: 0; + } } diff --git a/src/app/products/current-products/view-current-product/current-product-general-tab/current-product-general-tab.component.ts b/src/app/products/current-products/view-current-product/current-product-general-tab/current-product-general-tab.component.ts index ecc8e2eb5..64299416c 100644 --- a/src/app/products/current-products/view-current-product/current-product-general-tab/current-product-general-tab.component.ts +++ b/src/app/products/current-products/view-current-product/current-product-general-tab/current-product-general-tab.component.ts @@ -34,6 +34,7 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; styleUrls: ['./current-product-general-tab.component.scss'], imports: [ ...STANDALONE_SHARED_IMPORTS, + RouterLink, FaIconComponent, MatDivider, MatTable, diff --git a/src/app/products/fixed-deposit-products/view-fixed-deposit-product/fixed-deposit-general-tab/fixed-deposit-general-tab.component.html b/src/app/products/fixed-deposit-products/view-fixed-deposit-product/fixed-deposit-general-tab/fixed-deposit-general-tab.component.html index 85726f0f4..cb3324ea9 100644 --- a/src/app/products/fixed-deposit-products/view-fixed-deposit-product/fixed-deposit-general-tab/fixed-deposit-general-tab.component.html +++ b/src/app/products/fixed-deposit-products/view-fixed-deposit-product/fixed-deposit-general-tab/fixed-deposit-general-tab.component.html @@ -6,524 +6,608 @@ file, You can obtain one at http://mozilla.org/MPL/2.0/. --> -
+
-
-
-
-
-
Fixed Deposit Product
-

{{ fixedDepositProductData.name }}

-
- {{ fixedDepositProductData.shortName }} +
+
+
+
+
Fixed Deposit Product
+

{{ fixedDepositProductData.name }}

+
+ {{ fixedDepositProductData.shortName }} @if (fixedDepositProductData.currency?.code) { - {{ fixedDepositProductData.currency.code }} + {{ fixedDepositProductData.currency.code }} } + + + {{ fixedDepositProductData.endDate ? 'Inactive' : 'Active' }} +
@if (fixedDepositProductData.description) { -

{{ fixedDepositProductData.description }}

+

{{ fixedDepositProductData.description }}

}
-
-
-

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

- - - -
- {{ 'labels.inputs.Short Name' | translate }}: - {{ fixedDepositProductData.shortName }} + +
+
+
+

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

- - @if (fixedDepositProductData.description) { -
- {{ 'labels.inputs.Description' | translate }}: - {{ fixedDepositProductData.description }} -
- } - -

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

- - - -
- {{ 'labels.heading.Currency' | translate }}: - ({{ fixedDepositProductData.currency.code }}) {{ fixedDepositProductData.currency.name }} -
- -
- {{ 'labels.inputs.Decimal Places' | translate }}: - {{ fixedDepositProductData.currency.decimalPlaces }} -
- -
- {{ 'labels.inputs.Currency in multiples of' | translate }}: - {{ fixedDepositProductData.currency.inMultiplesOf | formatNumber }} -
- -

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

- - - -
- {{ 'labels.inputs.Deposit Amount' | translate }}: - {{ - fixedDepositProductData.depositAmount + - ' (Min: ' + - (fixedDepositProductData.minDepositAmount - ? fixedDepositProductData.minDepositAmount - : fixedDepositProductData.depositAmount) + - ', Max: ' + - (fixedDepositProductData.maxDepositAmount - ? fixedDepositProductData.maxDepositAmount - : fixedDepositProductData.depositAmount) + - ')' - }} -
- -
- {{ 'labels.inputs.Interest Compounding Period' | translate }}: - {{ fixedDepositProductData.interestCompoundingPeriodType.value }} -
- -
- {{ 'labels.inputs.Interest Posting Period' | translate }}: - {{ fixedDepositProductData.interestPostingPeriodType.value }} -
- -
- {{ 'labels.inputs.Interest Calculated Using' | translate }}: - {{ fixedDepositProductData.interestCalculationType.value }} -
- -
- {{ 'labels.inputs.Days in Year' | translate }}: - {{ fixedDepositProductData.interestCalculationDaysInYearType.value }} -
- -

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

- - - - @if (fixedDepositProductData.lockinPeriodFrequency) { -
- {{ 'labels.inputs.Lock-in Period' | translate }}: - - {{ fixedDepositProductData.lockinPeriodFrequency }} - {{ fixedDepositProductData.lockinPeriodFrequencyType.value }} +
+ {{ 'labels.inputs.Short Name' | translate }} + {{ fixedDepositProductData.shortName }}
- } - - @if (fixedDepositProductData.minDepositTerm) { -
- {{ 'labels.inputs.Minimum Deposit Term' | translate }}: - @if (fixedDepositProductData.minDepositTerm !== undefined) { - {{ fixedDepositProductData.minDepositTerm }} -   - {{ fixedDepositProductData.minDepositTermType.value }} - } -
- } - - @if (fixedDepositProductData.maxDepositTerm) { -
- {{ 'labels.inputs.Maximum Deposit Term' | translate }}: - @if (fixedDepositProductData.maxDepositTerm !== undefined) { - {{ fixedDepositProductData.maxDepositTerm }} -   - {{ fixedDepositProductData.maxDepositTermType.value }} - } -
- } - - @if (fixedDepositProductData.inMultiplesOfDepositTerm) { -
- {{ 'labels.inputs.Deposit Term In multiple of' | translate }}: - {{ fixedDepositProductData.inMultiplesOfDepositTerm }} - - - {{ fixedDepositProductData.inMultiplesOfDepositTermType.value }} -
- } - -
- {{ 'labels.inputs.Apply Penal Interest (less)' | translate }}: - {{ fixedDepositProductData.preClosurePenalApplicable | yesNo }} -
- - @if (fixedDepositProductData.preClosurePenalApplicable) { -
- {{ 'labels.inputs.Penal Interest' | translate }} (%): - {{ fixedDepositProductData.preClosurePenalInterest }}     %     On    - {{ fixedDepositProductData.preClosurePenalInterestOnType.value }} -
- } - - @if (fixedDepositProductData.minBalanceForInterestCalculation) { -
- {{ 'labels.inputs.Balance Required for Interest Calculation' | translate }}: - {{ fixedDepositProductData.minBalanceForInterestCalculation | formatNumber }} -
- } - -
- {{ 'labels.inputs.Withhold Tax is Applicable' | translate }}: - {{ fixedDepositProductData.withHoldTax | yesNo }} -
- - @if (fixedDepositProductData.withHoldTax) { -
- {{ 'labels.inputs.Withhold Tax group' | translate }}: - {{ fixedDepositProductData.taxGroup.name }} -
- } - - @if (fixedDepositProductData.activeChart) { -
-

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

- -
- @if (fixedDepositProductData.activeChart.name) { -
- {{ 'labels.inputs.Name' | translate }}: - {{ fixedDepositProductData.activeChart.name }} -
- } - @if (fixedDepositProductData.activeChart.description) { -
- {{ 'labels.inputs.Description' | translate }}: - {{ fixedDepositProductData.activeChart.description }} -
- } -
- {{ 'labels.inputs.From Date' | translate }}: - {{ fixedDepositProductData.activeChart.fromDate | dateFormat }} -
- @if (fixedDepositProductData.activeChart.endDate) { -
- {{ 'labels.inputs.End Date' | translate }}: - {{ fixedDepositProductData.activeChart.endDate | dateFormat }} -
- } -
- {{ 'labels.inputs.Primary Grouping by Amount' | translate }}: - {{ fixedDepositProductData.activeChart.isPrimaryGroupingByAmount | yesNo }} -
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
{{ 'labels.inputs.Period' | translate }} - @if (chartSlab.fromPeriod !== undefined) { -
{{ chartSlab.fromPeriod }} - {{ chartSlab.toPeriod }} {{ chartSlab.periodType.value }}
- } - @if (chartSlab.fromPeriod === undefined) { -
 
- } -
{{ 'labels.inputs.Amount Range' | translate }} - @if (chartSlab.amountRangeFrom !== undefined) { -
{{ chartSlab.amountRangeFrom }} - {{ chartSlab.amountRangeTo }}
- } - @if (chartSlab.amountRangeFrom === undefined) { -
 
- } -
{{ 'labels.inputs.Interest' | translate }}{{ chartSlab.annualInterestRate }} %{{ 'labels.inputs.Description' | translate }} - {{ chartSlab.description }} - {{ 'labels.inputs.Actions' | translate }} - - -
- -

- {{ 'labels.heading.Incentives' | translate }} -

- - - - - - - - - - - - - - - - - - - - - - - - - - - -
{{ 'labels.inputs.Entity Type' | translate }} - {{ - incentive.entityType - | find: fixedDepositProductsTemplate.chartTemplate.entityTypeOptions : 'id' : 'value' - }} - {{ 'labels.inputs.Attribute Name' | translate }} - {{ - incentive.attributeName - | find: fixedDepositProductsTemplate.chartTemplate.attributeNameOptions : 'id' : 'value' - }} - {{ 'labels.inputs.Condition Type' | translate }} - {{ - incentive.conditionType - | find: fixedDepositProductsTemplate.chartTemplate.conditionTypeOptions : 'id' : 'value' - }} - {{ 'labels.inputs.Attribute Value' | translate }} - @switch (incentive.attributeName) { - @case (2) { - {{ - incentive.attributeValue - | find: fixedDepositProductsTemplate.chartTemplate.genderOptions : 'id' : 'name' - }} - } - @case (3) { - {{ incentive.attributeValue }} - } - @case (4) { - {{ - incentive.attributeValue - | find: fixedDepositProductsTemplate.chartTemplate.clientTypeOptions : 'id' : 'name' - }} - } - @case (5) { - {{ - incentive.attributeValue - | find - : fixedDepositProductsTemplate.chartTemplate.clientClassificationOptions - : 'id' - : 'name' - }} - } - } - {{ 'labels.inputs.Incentive Type' | translate }} - {{ - incentive.incentiveType - | find: fixedDepositProductsTemplate.chartTemplate.incentiveTypeOptions : 'id' : 'value' - }} - {{ 'labels.inputs.Amount' | translate }} - {{ incentive.amount | formatNumber }} -
-
-
-
+ @if (fixedDepositProductData.description) { +
+ {{ 'labels.inputs.Description' | translate }} + {{ fixedDepositProductData.description }}
-
- } + } +
+
- @if (fixedDepositProductData.charges.length) { -
-

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

- - + +
+
+
+

Product Classification

+
+
+ @if (fixedDepositProductData.accountType) { +
+ {{ 'labels.inputs.Account Type' | translate }} + {{ fixedDepositProductData.accountType }} +
+ } + @if (fixedDepositProductData.fdType) { +
+ {{ 'labels.inputs.FD Type' | translate }} + {{ fixedDepositProductData.fdType }} +
+ } + @if (fixedDepositProductData.glAccountName || fixedDepositProductData.glAccountId) { +
+ GL Account (Liability) + {{ fixedDepositProductData.glAccountName || fixedDepositProductData.glAccountId }} +
+ } + @if (fixedDepositProductData.effectiveTo) { +
+ Effective To + {{ fixedDepositProductData.effectiveTo | dateFormat }} +
+ } + @if (fixedDepositProductData.endDate) { +
+ {{ 'labels.inputs.End Date' | translate }} + {{ fixedDepositProductData.endDate | dateFormat }} +
+ } + @if (fixedDepositProductData.shareLinkingEnabled !== undefined) { +
+ {{ 'labels.inputs.Share Linking Enabled' | translate }} + + + {{ fixedDepositProductData.shareLinkingEnabled | yesNo }} + + +
+ } +
+
+ + +
+
+
+

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

+
+
+
+ {{ 'labels.heading.Currency' | translate }} + ({{ fixedDepositProductData.currency.code }}) {{ fixedDepositProductData.currency.name }} +
+
+ {{ 'labels.inputs.Decimal Places' | translate }} + {{ fixedDepositProductData.currency.decimalPlaces }} +
+
+ {{ 'labels.inputs.Currency in multiples of' | translate }} + {{ fixedDepositProductData.currency.inMultiplesOf | formatNumber }} +
+ @if (fixedDepositProductData.dormancyAlert !== undefined) { +
+ Dormancy Alert + {{ fixedDepositProductData.dormancyAlert | yesNo }} +
+ } + @if (fixedDepositProductData.dormancyAlert) { +
+ Days to Inactive + {{ fixedDepositProductData.daysToInactive }} +
+
+ Days to Dormancy + {{ fixedDepositProductData.daysToDormancy }} +
+
+ Days to Escheat + {{ fixedDepositProductData.daysToEscheat }} +
+ } + @if (fixedDepositProductData.nominationFacility !== undefined) { +
+ {{ 'labels.inputs.Nomination Facility' | translate }} + {{ fixedDepositProductData.nominationFacility | yesNo }} +
+ } + @if (fixedDepositProductData.autoDebitFacility !== undefined) { +
+ {{ 'labels.inputs.Auto Debit Facility' | translate }} + {{ fixedDepositProductData.autoDebitFacility | yesNo }} +
+ } +
+
+ + + @if ( + fixedDepositProductData.minDepositAmount !== undefined || fixedDepositProductData.maxDepositAmount !== undefined + ) { +
+
+
+

Deposit Amount

+
+
+ @if (fixedDepositProductData.minDepositAmount !== undefined) { +
+ Minimum + {{ fixedDepositProductData.minDepositAmount | formatNumber }} +
+ } + @if (fixedDepositProductData.maxDepositAmount !== undefined) { +
+ Maximum + {{ fixedDepositProductData.maxDepositAmount | formatNumber }} +
+ } +
+
+ } + + +
+
+
+

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

+
+
+
+ {{ 'labels.inputs.Nominal Annual Interest Rate' | translate }} (%) + {{ fixedDepositProductData.nominalAnnualInterestRate | formatNumber }}% +
+
+ {{ 'labels.inputs.Interest Compounding Period' | translate }} + {{ fixedDepositProductData.interestCompoundingPeriodType?.value }} +
+
+ {{ 'labels.inputs.Interest Posting Period' | translate }} + {{ fixedDepositProductData.interestPostingPeriodType?.value }} +
+
+ {{ 'labels.inputs.Interest Calculated Using' | translate }} + {{ fixedDepositProductData.interestCalculationType?.value }} +
+
+ {{ 'labels.inputs.Days in Year' | translate }} + {{ fixedDepositProductData.interestCalculationDaysInYearType?.value }} +
+ @if (fixedDepositProductData.interestCalculateSelector) { +
+ Interest Calculation Selector + {{ fixedDepositProductData.interestCalculateSelector }} +
+ } + @if (fixedDepositProductData.averagePeriod) { +
+ Average Period + {{ fixedDepositProductData.averagePeriod }} +
+ } +
+ Auto Interest Post + + + {{ fixedDepositProductData.autoPost | yesNo }} + + +
+ @if (fixedDepositProductData.frequencyFixDay !== undefined) { +
+ Frequency (Fix Day) + {{ fixedDepositProductData.frequencyFixDay }} +
+ } + @if (fixedDepositProductData.lastInterestDate) { +
+ Last Interest Date + {{ fixedDepositProductData.lastInterestDate | dateFormat }} +
+ } +
+
+ + +
+
+
+

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

+
+
+
+ {{ 'labels.inputs.Loan Facility' | translate }} + + + {{ fixedDepositProductData.loanFacility | yesNo }} + + +
+
+ {{ 'labels.inputs.Premature Withdrawal Option' | translate }} + + + {{ fixedDepositProductData.prematureWithdrawalOption | yesNo }} + + +
+
+ {{ 'labels.inputs.Tenure Flexibility' | translate }} + + + {{ fixedDepositProductData.tenureFlexibility | yesNo }} + + +
+
+ {{ 'labels.inputs.Lien Marked' | translate }} + + + {{ fixedDepositProductData.lienMarked | yesNo }} + + +
+
+ {{ 'labels.inputs.Apply Withdrawal Fee for Transfers' | translate }} + + + {{ fixedDepositProductData.withdrawalFeeForTransfers | yesNo }} + + +
+
+ Enable Lock-in Period + + + {{ fixedDepositProductData.enableLockinPeriod | yesNo }} + + +
+ @if (fixedDepositProductData.lockinPeriodFrequency !== undefined) { +
+ {{ 'labels.inputs.Lock-in Period' | translate }} + {{ fixedDepositProductData.lockinPeriodFrequency }} + {{ fixedDepositProductData.lockinPeriodFrequencyType?.value }} +
+ } + @if (fixedDepositProductData.maturityInstructions !== undefined) { +
+ Maturity Instructions + + + {{ fixedDepositProductData.maturityInstructions | yesNo }} + + +
+ } +
+ Credit Maturity Proceeds + + + {{ fixedDepositProductData.creditMaturityProceeds | yesNo }} + + +
+
+ Penalty Grace Period (Missed Installments) + + + {{ fixedDepositProductData.penaltyGracePeriodMissedInstallments | yesNo }} + + +
+
+ Panel Request Applicable + + + {{ fixedDepositProductData.panelRequestApplicable | yesNo }} + + +
+
+ No Penalty (Nominee / Heir Closure) + + + {{ fixedDepositProductData.noPenaltyNomineeHeirClosure | yesNo }} + + +
+
+ Deceased Settlement + + + {{ fixedDepositProductData.deceasedSettlement | yesNo }} + + +
+
+ Allow Debit Txn After Due Date + + + {{ fixedDepositProductData.allowDebitTxnAfterDueDate | yesNo }} + + +
+
+ Account Closed with Zero Balance in Day Closing + + + {{ fixedDepositProductData.accountClosedZeroBalanceInDayClosing | yesNo }} + + +
+ @if (fixedDepositProductData.minBalanceForInterestCalculation !== undefined) { +
+ Min Balance for Interest Calculation + {{ fixedDepositProductData.minBalanceForInterestCalculation | formatNumber }} +
+ } + @if (fixedDepositProductData.minDepositTerm !== undefined) { +
+ {{ 'labels.inputs.Minimum Deposit Term' | translate }} + {{ fixedDepositProductData.minDepositTerm }} {{ fixedDepositProductData.minDepositTermType?.value }} +
+ } + @if (fixedDepositProductData.inMultiplesOfDepositTerm) { +
+ {{ 'labels.inputs.Deposit Term In multiple of' | translate }} + {{ fixedDepositProductData.inMultiplesOfDepositTerm }} + {{ fixedDepositProductData.inMultiplesOfDepositTermType?.value }} +
+ } + @if (fixedDepositProductData.maxDepositTerm) { +
+ {{ 'labels.inputs.Maximum Deposit Term' | translate }} + {{ fixedDepositProductData.maxDepositTerm }} {{ fixedDepositProductData.maxDepositTermType?.value }} +
+ } + @if (fixedDepositProductData.preClosurePenalApplicable) { +
+ {{ 'labels.inputs.Apply Penal Interest (less)' | translate }} + {{ fixedDepositProductData.preClosurePenalApplicable | yesNo }} +
+
+ {{ 'labels.inputs.Penal Interest' | translate }} (%) + {{ fixedDepositProductData.preClosurePenalInterest }} % On + {{ fixedDepositProductData.preClosurePenalInterestOnType?.value }} +
+ } +
+ {{ 'labels.inputs.Withhold Tax is Applicable' | translate }} + + + {{ fixedDepositProductData.withHoldTax | yesNo }} + + +
+ @if (fixedDepositProductData.withHoldTax) { +
+ {{ 'labels.inputs.Withhold Tax group' | translate }} + {{ fixedDepositProductData.taxGroup?.name }} +
+ } +
+
+ + + @if (fdSlabs.length) { +
+
+
+

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

+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Sr.{{ slab.srNo }}Particular{{ slab.description }}From{{ slab.fromPeriod }}To{{ slab.toPeriod ?? '—' }}Period{{ slab.periodTypeLabel }}Rate (%) + {{ slab.annualInterestRate }} +
+
+ + } + + + @if (fixedDepositProductData.charges?.length) { +
+
+
+

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

+
+
+ - + - + - + - +
{{ 'labels.inputs.Name' | translate }} - {{ charge.name }} - {{ charge.name }} {{ 'labels.inputs.Type' | translate }} - {{ charge.chargeCalculationType.value }} - {{ charge.chargeCalculationType?.value }} {{ 'labels.inputs.Amount' | translate }} - {{ charge.amount | formatNumber }} - {{ charge.amount | formatNumber }} {{ 'labels.inputs.Collected On' | translate }} - {{ charge.chargeTimeType.value }} - {{ charge.chargeTimeType?.value }}
+
+ } + + +
+
+
+

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

+
+ @if (!isNoneAccounting()) { + } - -

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

- - - - - - - @if ( - fixedDepositProductData.advancedAccountingRules && - (fixedDepositProductData.paymentChannelToFundSourceMappings?.length || - fixedDepositProductData.feeToIncomeAccountMappings?.length || - fixedDepositProductData.penaltyToIncomeAccountMappings?.length) - ) { -
-

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

- -
- @if (fixedDepositProductData.paymentChannelToFundSourceMappings?.length) { -
-

- {{ 'labels.inputs.Configure Fund Sources for Payment Channels' | translate }} -

- - - - - - - - - - - -
{{ 'labels.inputs.Payment Type' | translate }} - {{ paymentFundSource.paymentType.name }} - {{ 'labels.inputs.Fund Source' | translate }} - {{ paymentFundSource.fundSourceAccount.name }} -
-
- } - @if (fixedDepositProductData.feeToIncomeAccountMappings?.length) { -
-

{{ 'labels.inputs.Fees to Specific Income Accounts' | translate }}

- - - - - - - - - - - -
{{ 'labels.inputs.Fees' | translate }} - {{ feesIncome.charge.name }} - {{ 'labels.inputs.Income Account' | translate }} - {{ feesIncome.incomeAccount.name }} -
-
- } - @if (fixedDepositProductData.penaltyToIncomeAccountMappings?.length) { -
-

- {{ 'labels.heading.Penalties to Specific Income Accounts' | translate }} -

- - - - - - - - - - - -
{{ 'labels.inputs.Penalty' | translate }} - {{ penaltyIncome.charge.name }} - {{ 'labels.inputs.Income Account' | translate }} - {{ penaltyIncome.incomeAccount.name }} -
-
- } -
- } -
+
diff --git a/src/app/products/fixed-deposit-products/view-fixed-deposit-product/fixed-deposit-general-tab/fixed-deposit-general-tab.component.scss b/src/app/products/fixed-deposit-products/view-fixed-deposit-product/fixed-deposit-general-tab/fixed-deposit-general-tab.component.scss index ed63d2d44..5b41b230d 100644 --- a/src/app/products/fixed-deposit-products/view-fixed-deposit-product/fixed-deposit-general-tab/fixed-deposit-general-tab.component.scss +++ b/src/app/products/fixed-deposit-products/view-fixed-deposit-product/fixed-deposit-general-tab/fixed-deposit-general-tab.component.scss @@ -6,77 +6,397 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -@use 'assets/styles/helper'; -@use 'assets/styles/colours' as *; -@use 'assets/styles/product-view' as pv; - -@include pv.product-view-styles; - -/* FD-specific teal accent */ :host { - --pv-accent: #0e7e6b; - --pv-accent-l: #ccfbf1; + --vsp-navy: #0b1e3d; + --vsp-blue: #1d4ed8; + --vsp-blue-l: #eff6ff; + --vsp-teal: #0e7e6b; + --vsp-teal-l: #ccfbf1; + --vsp-purple: #6d28d9; + --vsp-purple-l: #ede9fe; + --vsp-indigo: #3730a3; + --vsp-indigo-l: #e0e7ff; + --vsp-amber: #b45309; + --vsp-amber-l: #fef3c7; + --vsp-green: #15803d; + --vsp-green-l: #dcfce7; + --vsp-red: #c0392b; + --vsp-red-l: #fee2e2; + --vsp-pink: #be185d; + --vsp-pink-l: #fce7f3; + --vsp-g50: #f8fafc; + --vsp-g100: #f1f5f9; + --vsp-g200: #e2e8f0; + --vsp-g500: #64748b; + --vsp-g700: #334155; + --vsp-g900: #0f172a; + + display: block; + font-family: + 'DM Sans', + system-ui, + -apple-system, + sans-serif; + color: var(--vsp-g900); + font-size: 13.5px; } -.container { - width: 100%; +.vsp-root { + padding: 4px 4px 24px; + display: flex; + flex-direction: column; + gap: 14px; } -.tab-container { - padding: 1%; - margin: 1%; +.vsp-hero { + background: linear-gradient(135deg, var(--vsp-navy) 0%, var(--vsp-blue) 100%); + border-radius: 14px; + padding: 22px 22px 22px 18px; + display: flex; + align-items: flex-start; + gap: 18px; + box-shadow: + 0 10px 24px rgb(11 30 61 / 18%), + 0 4px 10px rgb(11 30 61 / 12%); + color: #fff; + position: relative; + overflow: hidden; } -.mat-h3 { - margin-top: 10px !important; - font-weight: 300; - color: $status-approved; +.vsp-hero::before { + content: ''; + position: absolute; + top: -60px; + right: -60px; + width: 240px; + height: 240px; + border-radius: 50%; + background: radial-gradient(circle, rgb(255 255 255 / 8%) 0%, transparent 70%); + pointer-events: none; } -.mat-elevation-z1 { - margin: 1em 0 1.5em; +.vsp-hero-left { + display: flex; + align-items: flex-start; + gap: 16px; + flex: 1; + min-width: 0; } -h2, -h3, -h4 { - margin: 0; - font-weight: 500; +.vsp-hero-icon { + width: 56px; + height: 56px; + border-radius: 14px; + background: rgb(255 255 255 / 16%); + border: 1px solid rgb(255 255 255 / 22%); + display: inline-flex; + align-items: center; + justify-content: center; + font-size: 24px; + flex-shrink: 0; } -span { - margin: 0.5em 0; +.vsp-hero-text { + flex: 1; + min-width: 0; } -mat-divider { - margin: 0 0 0.5em; +.vsp-hero-eyebrow { + font-size: 10.5px; + font-weight: 700; + text-transform: uppercase; + letter-spacing: 0.12em; + color: rgb(255 255 255 / 70%); + margin-bottom: 4px; } -.margin-t { - margin-top: 1em; +.vsp-hero-title { + margin: 0 0 10px; + font-size: 22px; + font-weight: 700; + letter-spacing: 0.01em; + color: #fff; + line-height: 1.2; } -table { - width: 100%; +.vsp-hero-meta { + display: flex; + align-items: center; + gap: 8px; + flex-wrap: wrap; +} - tr.incentives-row { - height: 0; +.vsp-hero-desc { + margin: 12px 0 0; + font-size: 13px; + color: rgb(255 255 255 / 82%); + line-height: 1.5; + max-width: 720px; +} - > td { - padding: 0; - } +.vsp-edit-btn { + display: inline-flex; + align-items: center; + gap: 8px; + height: 38px; + padding: 0 16px; + border-radius: 10px; + background: rgb(255 255 255 / 14%); + color: #fff; + border: 1px solid rgb(255 255 255 / 28%); + font-size: 13px; + font-weight: 700; + letter-spacing: 0.02em; + cursor: pointer; + text-decoration: none; + white-space: nowrap; + font-family: inherit; + flex-shrink: 0; + transition: all 0.16s ease; - .incentives { - overflow: hidden; - } + fa-icon { + font-size: 12px; + } - .mat-card { - border-radius: 0; - - > h4 { - font-weight: 500; - margin: 0.5em 0 0; - } - } + &:hover { + background: rgb(255 255 255 / 24%); + border-color: rgb(255 255 255 / 50%); + } +} + +.vsp-pill { + display: inline-flex; + align-items: center; + gap: 5px; + font-size: 11px; + font-weight: 700; + letter-spacing: 0.04em; + text-transform: uppercase; + padding: 4px 10px; + border-radius: 999px; + font-family: inherit; + + fa-icon { + font-size: 9.5px; + } + + &--code { + background: rgb(255 255 255 / 18%); + color: #fff; + border: 1px solid rgb(255 255 255 / 24%); + font-family: 'JetBrains Mono', ui-monospace, Menlo, Consolas, monospace; + } + + &--teal { + background: var(--vsp-teal-l); + color: var(--vsp-teal); + border: 1px solid #99f6e4; + } + + &--blue { + background: var(--vsp-blue-l); + color: var(--vsp-blue); + border: 1px solid #dbeafe; + } + + &--green { + background: var(--vsp-green-l); + color: var(--vsp-green); + border: 1px solid #bbf7d0; + } + + &--amber { + background: var(--vsp-amber-l); + color: var(--vsp-amber); + border: 1px solid #fde68a; + } + + &--red { + background: var(--vsp-red-l); + color: var(--vsp-red); + border: 1px solid #fecaca; + } + + &--gray { + background: var(--vsp-g100); + color: var(--vsp-g700); + border: 1px solid var(--vsp-g200); + } +} + +.vsp-section { + background: #fff; + border: 1px solid var(--vsp-g200); + border-radius: 12px; + padding: 16px 20px; + box-shadow: 0 1px 2px rgb(15 23 42 / 4%); +} + +.vsp-section-h { + display: flex; + align-items: center; + gap: 12px; + margin-bottom: 14px; + padding-bottom: 12px; + border-bottom: 1px dashed var(--vsp-g200); + + h3 { + margin: 0; + font-size: 14px; + font-weight: 700; + color: var(--vsp-g900); + letter-spacing: 0.02em; + } +} + +.vsp-section-ic { + width: 36px; + height: 36px; + border-radius: 10px; + display: inline-flex; + align-items: center; + justify-content: center; + font-size: 14px; + flex-shrink: 0; + + &--blue { + background: var(--vsp-blue-l); + color: var(--vsp-blue); + } + + &--teal { + background: var(--vsp-teal-l); + color: var(--vsp-teal); + } + + &--purple { + background: var(--vsp-purple-l); + color: var(--vsp-purple); + } + + &--indigo { + background: var(--vsp-indigo-l); + color: var(--vsp-indigo); + } + + &--amber { + background: var(--vsp-amber-l); + color: var(--vsp-amber); + } + + &--green { + background: var(--vsp-green-l); + color: var(--vsp-green); + } + + &--red { + background: var(--vsp-red-l); + color: var(--vsp-red); + } + + &--pink { + background: var(--vsp-pink-l); + color: var(--vsp-pink); + } +} + +.vsp-sub-h { + margin: 16px 0 10px; + font-size: 12px; + font-weight: 700; + color: var(--vsp-g700); + text-transform: uppercase; + letter-spacing: 0.06em; +} + +.vsp-grid { + display: grid; + grid-template-columns: 1fr 1fr; + gap: 10px 24px; +} + +@media (width <= 600px) { + .vsp-grid { + grid-template-columns: 1fr; + } +} + +.vsp-kv { + display: flex; + flex-direction: column; + gap: 3px; + padding: 8px 0; + border-bottom: 1px dashed var(--vsp-g100); + + &--span { + grid-column: 1 / -1; + } +} + +.vsp-k { + font-size: 10.5px; + font-weight: 700; + text-transform: uppercase; + letter-spacing: 0.06em; + color: var(--vsp-g500); +} + +.vsp-v { + font-size: 13.5px; + color: var(--vsp-g900); + font-weight: 500; + word-break: break-word; + + strong { + font-weight: 700; + } +} + +.vsp-v--accent { + font-size: 18px; + font-weight: 700; + color: var(--vsp-blue); + letter-spacing: 0.01em; +} + +.vsp-suffix { + font-size: 12px; + font-weight: 600; + color: var(--vsp-g500); + margin-left: 4px; +} + +.vsp-table-wrap { + overflow-x: auto; + border: 1px solid var(--vsp-g200); + border-radius: 10px; + margin-top: 4px; +} + +.vsp-table { + width: 100%; + background: #fff; + + th.mat-mdc-header-cell { + background: var(--vsp-g50); + color: var(--vsp-g700); + font-size: 11px; + font-weight: 700; + text-transform: uppercase; + letter-spacing: 0.06em; + padding: 11px 14px; + border-bottom: 1px solid var(--vsp-g200); + white-space: nowrap; + } + + td.mat-mdc-cell { + padding: 10px 14px; + border-bottom: 1px solid var(--vsp-g100); + font-size: 12.5px; + color: var(--vsp-g900); + } + + tbody tr:last-child td.mat-mdc-cell { + border-bottom: 0; } } diff --git a/src/app/products/fixed-deposit-products/view-fixed-deposit-product/fixed-deposit-general-tab/fixed-deposit-general-tab.component.ts b/src/app/products/fixed-deposit-products/view-fixed-deposit-product/fixed-deposit-general-tab/fixed-deposit-general-tab.component.ts index 6952ed868..6ec2fffe9 100644 --- a/src/app/products/fixed-deposit-products/view-fixed-deposit-product/fixed-deposit-general-tab/fixed-deposit-general-tab.component.ts +++ b/src/app/products/fixed-deposit-products/view-fixed-deposit-product/fixed-deposit-general-tab/fixed-deposit-general-tab.component.ts @@ -8,6 +8,7 @@ import { Component, OnInit, inject } from '@angular/core'; import { ActivatedRoute, RouterLink } from '@angular/router'; +import { trigger, state, style, animate, transition } from '@angular/animations'; import { FaIconComponent } from '@fortawesome/angular-fontawesome'; import { MatDivider } from '@angular/material/divider'; import { @@ -36,6 +37,13 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; selector: 'mifosx-fixed-deposit-general-tab', templateUrl: './fixed-deposit-general-tab.component.html', styleUrls: ['./fixed-deposit-general-tab.component.scss'], + animations: [ + trigger('expandChartSlab', [ + state('collapsed', style({ height: '0px', overflow: 'hidden', opacity: 0 })), + state('expanded', style({ height: '*', overflow: 'visible', opacity: 1 })), + transition('collapsed <=> expanded', animate('200ms ease')) + ]) + ], imports: [ ...STANDALONE_SHARED_IMPORTS, RouterLink, @@ -80,6 +88,24 @@ export class FixedDepositGeneralTabComponent implements OnInit { 'periodTypeLabel', 'annualInterestRate' ]; + readonly chartSlabsDisplayedColumns = [ + 'period', + 'amountRange', + 'annualInterestRate', + 'description', + 'actions' + ]; + readonly chartSlabsIncentivesDisplayedColumns = ['incentives']; + readonly incentivesDisplayedColumns = [ + 'entityType', + 'attributeName', + 'conditionType', + 'attributeValue', + 'incentiveType', + 'amount' + ]; + expandChartSlabIndex: number | null = null; + readonly chargesDisplayedColumns = [ 'name', 'type', diff --git a/src/app/products/loan-products/view-loan-product/general-tab/general-tab.component.html b/src/app/products/loan-products/view-loan-product/general-tab/general-tab.component.html index daadc5f00..91b2336e0 100644 --- a/src/app/products/loan-products/view-loan-product/general-tab/general-tab.component.html +++ b/src/app/products/loan-products/view-loan-product/general-tab/general-tab.component.html @@ -53,7 +53,6 @@ -
+
-
-
-
-
-
Recurring Deposit Product
-

{{ recurringDepositProduct.name }}

-
- {{ recurringDepositProduct.shortName }} +
+
+
+
+
Recurring Deposit Product
+

{{ recurringDepositProduct.name }}

+
+ {{ recurringDepositProduct.shortName }} @if (recurringDepositProduct.currency?.code) { - {{ recurringDepositProduct.currency.code }} + {{ recurringDepositProduct.currency.code }} } + + + {{ recurringDepositProduct.endDate ? 'Inactive' : 'Active' }} +
@if (recurringDepositProduct.description) { -

{{ recurringDepositProduct.description }}

+

{{ recurringDepositProduct.description }}

}
-
- -

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

- - -
- {{ 'labels.inputs.Short Name' | translate }}: - {{ recurringDepositProduct.shortName }} + +
+
+
+

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

- - @if (recurringDepositProduct.description) { -
- {{ 'labels.inputs.Description' | translate }}: - {{ recurringDepositProduct.description }} -
- } - - -

Product Classification

- - - @if (recurringDepositProduct.accountType) { -
- Account Type: - {{ recurringDepositProduct.accountType }} -
- } - @if (recurringDepositProduct.customerSegment) { -
- Customer Segment: - {{ recurringDepositProduct.customerSegment }} -
- } - @if (recurringDepositProduct.glAccountId) { -
- GL Account (Liability): - {{ recurringDepositProduct.glAccountName || recurringDepositProduct.glAccountId }} -
- } - @if (recurringDepositProduct.effectiveTo) { -
- Effective To: - {{ recurringDepositProduct.effectiveTo | dateFormat }} -
- } - @if (recurringDepositProduct.endDate) { -
- End Date: - {{ recurringDepositProduct.endDate | dateFormat }} -
- } -
- Introducer Required: - {{ recurringDepositProduct.introducerRequired | yesNo }} -
-
- Deposit Account Link: - {{ recurringDepositProduct.shareLinkingEnabled | yesNo }} -
- - -

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

- - -
- {{ 'labels.inputs.Currency' | translate }}: - ({{ recurringDepositProduct.currency.code }}) {{ recurringDepositProduct.currency.name }} -
-
- {{ 'labels.inputs.Decimal Places' | translate }}: - {{ recurringDepositProduct.currency.decimalPlaces }} -
-
- Dormancy Alert: - {{ recurringDepositProduct.dormancyAlert | yesNo }} -
-
- Balance Swap Option: - {{ recurringDepositProduct.balanceSwapOption | yesNo }} -
-
- MSME: - {{ recurringDepositProduct.msme | yesNo }} -
-
- Nomination Facility: - {{ recurringDepositProduct.nominationFacility | yesNo }} -
-
- Auto Debit Facility: - {{ recurringDepositProduct.autoDebitFacility | yesNo }} -
- - -

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

- - -
- {{ 'labels.inputs.Deposit Amount' | translate }}: - {{ - recurringDepositProduct.depositAmount + - ' (Min: ' + - (recurringDepositProduct.minDepositAmount || recurringDepositProduct.depositAmount) + - ', Max: ' + - (recurringDepositProduct.maxDepositAmount || recurringDepositProduct.depositAmount) + - ')' - }} -
-
- {{ 'labels.inputs.Nominal Annual Interest' | translate }}: - {{ recurringDepositProduct.nominalAnnualInterestRate | formatNumber }} % -
- @if (recurringDepositProduct.effectiveDate) { -
- Effective Date: - {{ recurringDepositProduct.effectiveDate | dateFormat }} -
- } - @if (recurringDepositProduct.interestCalculationTypeName) { -
- {{ 'labels.inputs.Interest Calculation Type' | translate }}: - {{ recurringDepositProduct.interestCalculationTypeName }} -
- } -
- Interest Calculate: - {{ recurringDepositProduct.interestCalculationType?.value }} -
- @if (recurringDepositProduct.averagePeriod) { -
- Average Period: - {{ recurringDepositProduct.averagePeriod }} -
- } -
- {{ 'labels.inputs.Interest Posting Period' | translate }}: - {{ recurringDepositProduct.interestPostingPeriodType.value }} -
-
- {{ 'labels.inputs.Interest Compounding Period' | translate }}: - {{ recurringDepositProduct.interestCompoundingPeriodType.value }} -
-
- {{ 'labels.inputs.Days in Year' | translate }}: - {{ recurringDepositProduct.interestCalculationDaysInYearType.value }} -
-
- Auto Post: - {{ recurringDepositProduct.autoPost | yesNo }} -
- @if (recurringDepositProduct.frequencyFixDay) { -
- Frequency (Fix Day): - {{ recurringDepositProduct.frequencyFixDay }} -
- } - @if (recurringDepositProduct.lastInterestDate) { -
- Last Interest Date: - {{ recurringDepositProduct.lastInterestDate | dateFormat }} -
- } - - -

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

- - - -

Premature Option

-
- Loan Facility: - {{ recurringDepositProduct.loanFacility | yesNo }} -
-
- Premature Withdrawal Option: - {{ recurringDepositProduct.prematureWithdrawalOption | yesNo }} -
-
- Tenure Flexibility: - {{ recurringDepositProduct.tenureFlexibility | yesNo }} -
-
- Lien Marked: - {{ recurringDepositProduct.lienMarked | yesNo }} -
-
- {{ 'labels.inputs.Apply Withdrawal Fee for Transfers' | translate }}: - {{ recurringDepositProduct.withdrawalFeeForTransfers | yesNo }} -
- - -

{{ 'labels.inputs.Lock-in Period' | translate }}

-
- Enable Lock-in Period: - {{ recurringDepositProduct.enableLockinPeriod | yesNo }} -
- @if (recurringDepositProduct.lockinPeriodFrequency) { -
- {{ 'labels.inputs.Lock-in Period' | translate }}: - {{ recurringDepositProduct.lockinPeriodFrequency }} - {{ recurringDepositProduct.lockinPeriodFrequencyType?.value }} +
+ {{ 'labels.inputs.Short Name' | translate }} + {{ recurringDepositProduct.shortName }}
- } - - -

Maturity Instructions

-
- Maturity Instructions: - {{ recurringDepositProduct.maturityInstructions | yesNo }} -
-
- Credit Maturity Proceeds: - {{ recurringDepositProduct.creditMaturityProceeds | yesNo }} -
-
- Penalty Grace Period (Missed Installments): - {{ recurringDepositProduct.penaltyGracePeriodMissedInstallments | yesNo }} -
-
- Panel Request Applicable: - {{ recurringDepositProduct.panelRequestApplicable | yesNo }} -
-
- No Penalty (Nominee / Heir Closure): - {{ recurringDepositProduct.noPenaltyNomineeHeirClosure | yesNo }} -
-
- Deceased Settlement: - {{ recurringDepositProduct.deceasedSettlement | yesNo }} -
-
- Allow Debit Txn After Due Date: - {{ recurringDepositProduct.allowDebitTxnAfterDueDate | yesNo }} -
- - -

Additional Rules

-
- Account Closed Zero Balance in Day Closing: - {{ recurringDepositProduct.accountClosedZeroBalanceInDayClosing | yesNo }} -
- @if (recurringDepositProduct.minBalanceForInterestCalculation) { -
- {{ 'labels.inputs.Balance Required for Interest Calculation' | translate }}: - {{ recurringDepositProduct.minBalanceForInterestCalculation | formatNumber }} -
- } - - @if (recurringDepositProduct.minDepositTerm) { -
- {{ 'labels.inputs.Minimum Deposit Term' | translate }}: - {{ recurringDepositProduct.minDepositTerm }} {{ recurringDepositProduct.minDepositTermType?.value }} -
- } - @if (recurringDepositProduct.maxDepositTerm) { -
- {{ 'labels.inputs.Maximum Deposit Term' | translate }}: - {{ recurringDepositProduct.maxDepositTerm }} {{ recurringDepositProduct.maxDepositTermType?.value }} -
- } - @if (recurringDepositProduct.inMultipleOfDepositTerm) { -
- {{ 'labels.inputs.Deposit Term In multiple of' | translate }}: - {{ recurringDepositProduct.inMultipleOfDepositTerm }} - - {{ recurringDepositProduct.inMultipleOfDepositTermType?.value }} -
- } - @if (recurringDepositProduct.isMandatoryDeposit !== undefined) { -
- {{ 'labels.inputs.Recurring Deposit Type' | translate }}: - {{ - recurringDepositProduct.isMandatoryDeposit - ? ('labels.text.Mandatory' | translate) - : ('labels.text.Voluntary' | translate) - }} -
- } - @if (recurringDepositProduct.preClosurePenalInterest) { -
- {{ 'labels.inputs.Apply penal interest (less)' | translate }}: - {{ recurringDepositProduct.preClosurePenalInterest }}% On - {{ recurringDepositProduct.preClosurePenalInterestOnType?.value }} -
- } -
- {{ 'labels.inputs.Withhold Tax is Applicable' | translate }}: - {{ recurringDepositProduct.withHoldTax | yesNo }} -
- @if (recurringDepositProduct.withHoldTax) { -
- {{ 'labels.inputs.Tax Group' | translate }}: - {{ recurringDepositProduct.taxGroup?.name }} -
- } - - - @if (recurringDepositProduct.activeChart) { -
-

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

- -
- @if (recurringDepositProduct.activeChart.name) { -
- {{ 'labels.inputs.Name' | translate }}: - {{ recurringDepositProduct.activeChart.name }} -
- } -
- {{ 'labels.inputs.Valid from Date' | translate }}: - {{ recurringDepositProduct.activeChart.fromDate | dateFormat }} -
- @if (recurringDepositProduct.activeChart.endDate) { -
- {{ 'labels.inputs.End Date' | translate }}: - {{ recurringDepositProduct.activeChart.endDate | dateFormat }} -
- } - @if (recurringDepositProduct.activeChart.description) { -
- {{ 'labels.inputs.Description' | translate }}: - {{ recurringDepositProduct.activeChart.description }} -
- } -
- {{ 'labels.inputs.Primary Grouping by Amount' | translate }}: - {{ recurringDepositProduct.activeChart.isPrimaryGroupingByAmount | yesNo }} -
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
{{ 'labels.inputs.Period' | translate }} - @if (chartSlab.fromPeriod !== undefined) { -
{{ chartSlab.fromPeriod }} - {{ chartSlab.toPeriod }} {{ chartSlab.periodType.value }}
- } - @if (chartSlab.fromPeriod === undefined) { -
 
- } -
{{ 'labels.inputs.Amount Range' | translate }} - @if (chartSlab.amountRangeFrom !== undefined) { -
{{ chartSlab.amountRangeFrom }} - {{ chartSlab.amountRangeTo }}
- } - @if (chartSlab.amountRangeFrom === undefined) { -
 
- } -
{{ 'labels.inputs.Interest' | translate }}{{ chartSlab.annualInterestRate }}{{ 'labels.inputs.Description' | translate }}{{ chartSlab.description }}{{ 'labels.inputs.Actions' | translate }} - - -
- -

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

- - - - - - - - - - - - - - - - - - - - - - - - - - - -
{{ 'labels.inputs.Entity Type' | translate }} - {{ - incentive.entityType - | find: recurringDepositProductTemplate.chartTemplate.entityTypeOptions : 'id' : 'value' - }} - {{ 'labels.inputs.Attribute Name' | translate }} - {{ - incentive.attributeName - | find - : recurringDepositProductTemplate.chartTemplate.attributeNameOptions - : 'id' - : 'value' - }} - {{ 'labels.inputs.Condition Type' | translate }} - {{ - incentive.conditionType - | find - : recurringDepositProductTemplate.chartTemplate.conditionTypeOptions - : 'id' - : 'value' - }} - {{ 'labels.inputs.Attribute Value' | translate }} - @switch (incentive.attributeName) { - @case (2) { - {{ - incentive.attributeValue - | find: recurringDepositProductTemplate.chartTemplate.genderOptions : 'id' : 'name' - }} - } - @case (3) { - {{ incentive.attributeValue }} - } - @case (4) { - {{ - incentive.attributeValue - | find - : recurringDepositProductTemplate.chartTemplate.clientTypeOptions - : 'id' - : 'name' - }} - } - @case (5) { - {{ - incentive.attributeValue - | find - : recurringDepositProductTemplate.chartTemplate.clientClassificationOptions - : 'id' - : 'name' - }} - } - } - {{ 'labels.inputs.Incentive Type' | translate }} - {{ - incentive.incentiveType - | find - : recurringDepositProductTemplate.chartTemplate.incentiveTypeOptions - : 'id' - : 'value' - }} - {{ 'labels.inputs.Amount' | translate }}{{ incentive.amount }}
-
-
-
- + @if (recurringDepositProduct.description) { +
+ {{ 'labels.inputs.Description' | translate }} + {{ recurringDepositProduct.description }}
-
- } + } +
+
- - @if (recurringDepositProduct.charges.length) { -
-

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

- - + +
+
+
+

Product Classification

+
+
+ @if (recurringDepositProduct.accountType) { +
+ Account Type + {{ recurringDepositProduct.accountType }} +
+ } + @if (recurringDepositProduct.customerSegment) { +
+ Customer Segment + {{ recurringDepositProduct.customerSegment }} +
+ } + @if (recurringDepositProduct.glAccountId) { +
+ GL Account (Liability) + {{ recurringDepositProduct.glAccountName || recurringDepositProduct.glAccountId }} +
+ } + @if (recurringDepositProduct.effectiveTo) { +
+ Effective To + {{ recurringDepositProduct.effectiveTo | dateFormat }} +
+ } + @if (recurringDepositProduct.endDate) { +
+ End Date + {{ recurringDepositProduct.endDate | dateFormat }} +
+ } +
+ Introducer Required + + + {{ recurringDepositProduct.introducerRequired | yesNo }} + + +
+
+ Deposit Account Link + + + {{ recurringDepositProduct.shareLinkingEnabled | yesNo }} + + +
+
+
+ + +
+
+
+

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

+
+
+
+ {{ 'labels.inputs.Currency' | translate }} + ({{ recurringDepositProduct.currency.code }}) {{ recurringDepositProduct.currency.name }} +
+
+ {{ 'labels.inputs.Decimal Places' | translate }} + {{ recurringDepositProduct.currency.decimalPlaces }} +
+
+ Dormancy Alert + {{ recurringDepositProduct.dormancyAlert | yesNo }} +
+
+ Balance Swap Option + {{ recurringDepositProduct.balanceSwapOption | yesNo }} +
+
+ MSME + {{ recurringDepositProduct.msme | yesNo }} +
+
+ Nomination Facility + {{ recurringDepositProduct.nominationFacility | yesNo }} +
+
+ Auto Debit Facility + {{ recurringDepositProduct.autoDebitFacility | yesNo }} +
+
+
+ + +
+
+
+

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

+
+
+
+ {{ 'labels.inputs.Deposit Amount' | translate }} + + {{ recurringDepositProduct.depositAmount | formatNumber }} + (Min: {{ recurringDepositProduct.minDepositAmount || recurringDepositProduct.depositAmount }}, Max: + {{ recurringDepositProduct.maxDepositAmount || recurringDepositProduct.depositAmount }}) + +
+
+ {{ 'labels.inputs.Nominal Annual Interest' | translate }} + {{ recurringDepositProduct.nominalAnnualInterestRate | formatNumber }}% +
+ @if (recurringDepositProduct.effectiveDate) { +
+ Effective Date + {{ recurringDepositProduct.effectiveDate | dateFormat }} +
+ } + @if (recurringDepositProduct.interestCalculationTypeName) { +
+ {{ 'labels.inputs.Interest Calculation Type' | translate }} + {{ recurringDepositProduct.interestCalculationTypeName }} +
+ } +
+ Interest Calculate + {{ recurringDepositProduct.interestCalculationType?.value }} +
+ @if (recurringDepositProduct.averagePeriod) { +
+ Average Period + {{ recurringDepositProduct.averagePeriod }} +
+ } +
+ {{ 'labels.inputs.Interest Posting Period' | translate }} + {{ recurringDepositProduct.interestPostingPeriodType.value }} +
+
+ {{ 'labels.inputs.Interest Compounding Period' | translate }} + {{ recurringDepositProduct.interestCompoundingPeriodType.value }} +
+
+ {{ 'labels.inputs.Days in Year' | translate }} + {{ recurringDepositProduct.interestCalculationDaysInYearType.value }} +
+
+ Auto Post + + + {{ recurringDepositProduct.autoPost | yesNo }} + + +
+ @if (recurringDepositProduct.frequencyFixDay) { +
+ Frequency (Fix Day) + {{ recurringDepositProduct.frequencyFixDay }} +
+ } + @if (recurringDepositProduct.lastInterestDate) { +
+ Last Interest Date + {{ recurringDepositProduct.lastInterestDate | dateFormat }} +
+ } +
+
+ + +
+
+
+

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

+
+ +

Premature Option

+
+
+ Loan Facility + + + {{ recurringDepositProduct.loanFacility | yesNo }} + + +
+
+ Premature Withdrawal Option + + + {{ recurringDepositProduct.prematureWithdrawalOption | yesNo }} + + +
+
+ Tenure Flexibility + + + {{ recurringDepositProduct.tenureFlexibility | yesNo }} + + +
+
+ Lien Marked + + + {{ recurringDepositProduct.lienMarked | yesNo }} + + +
+
+ {{ 'labels.inputs.Apply Withdrawal Fee for Transfers' | translate }} + + + {{ recurringDepositProduct.withdrawalFeeForTransfers | yesNo }} + + +
+
+ +

{{ 'labels.inputs.Lock-in Period' | translate }}

+
+
+ Enable Lock-in Period + + + {{ recurringDepositProduct.enableLockinPeriod | yesNo }} + + +
+ @if (recurringDepositProduct.lockinPeriodFrequency) { +
+ {{ 'labels.inputs.Lock-in Period' | translate }} + {{ recurringDepositProduct.lockinPeriodFrequency }} + {{ recurringDepositProduct.lockinPeriodFrequencyType?.value }} +
+ } +
+ +

Maturity Instructions

+
+
+ Maturity Instructions + + + {{ recurringDepositProduct.maturityInstructions | yesNo }} + + +
+
+ Credit Maturity Proceeds + + + {{ recurringDepositProduct.creditMaturityProceeds | yesNo }} + + +
+
+ Penalty Grace Period (Missed Installments) + + + {{ recurringDepositProduct.penaltyGracePeriodMissedInstallments | yesNo }} + + +
+
+ Panel Request Applicable + + + {{ recurringDepositProduct.panelRequestApplicable | yesNo }} + + +
+
+ No Penalty (Nominee / Heir Closure) + + + {{ recurringDepositProduct.noPenaltyNomineeHeirClosure | yesNo }} + + +
+
+ Deceased Settlement + + + {{ recurringDepositProduct.deceasedSettlement | yesNo }} + + +
+
+ Allow Debit Txn After Due Date + + + {{ recurringDepositProduct.allowDebitTxnAfterDueDate | yesNo }} + + +
+
+ +

Additional Rules

+
+
+ Account Closed Zero Balance in Day Closing + + + {{ recurringDepositProduct.accountClosedZeroBalanceInDayClosing | yesNo }} + + +
+ @if (recurringDepositProduct.minBalanceForInterestCalculation) { +
+ {{ 'labels.inputs.Balance Required for Interest Calculation' | translate }} + {{ recurringDepositProduct.minBalanceForInterestCalculation | formatNumber }} +
+ } + @if (recurringDepositProduct.minDepositTerm) { +
+ {{ 'labels.inputs.Minimum Deposit Term' | translate }} + {{ recurringDepositProduct.minDepositTerm }} {{ recurringDepositProduct.minDepositTermType?.value }} +
+ } + @if (recurringDepositProduct.maxDepositTerm) { +
+ {{ 'labels.inputs.Maximum Deposit Term' | translate }} + {{ recurringDepositProduct.maxDepositTerm }} {{ recurringDepositProduct.maxDepositTermType?.value }} +
+ } + @if (recurringDepositProduct.inMultipleOfDepositTerm) { +
+ {{ 'labels.inputs.Deposit Term In multiple of' | translate }} + {{ recurringDepositProduct.inMultipleOfDepositTerm }} - + {{ recurringDepositProduct.inMultipleOfDepositTermType?.value }} +
+ } + @if (recurringDepositProduct.isMandatoryDeposit !== undefined) { +
+ {{ 'labels.inputs.Recurring Deposit Type' | translate }} + {{ + recurringDepositProduct.isMandatoryDeposit + ? ('labels.text.Mandatory' | translate) + : ('labels.text.Voluntary' | translate) + }} +
+ } + @if (recurringDepositProduct.preClosurePenalInterest) { +
+ {{ 'labels.inputs.Apply penal interest (less)' | translate }} + {{ recurringDepositProduct.preClosurePenalInterest }}% On + {{ recurringDepositProduct.preClosurePenalInterestOnType?.value }} +
+ } +
+ {{ 'labels.inputs.Withhold Tax is Applicable' | translate }} + + + {{ recurringDepositProduct.withHoldTax | yesNo }} + + +
+ @if (recurringDepositProduct.withHoldTax) { +
+ {{ 'labels.inputs.Tax Group' | translate }} + {{ recurringDepositProduct.taxGroup?.name }} +
+ } +
+
+ + + @if (recurringDepositProduct.activeChart) { +
+
+
+

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

+
+ + +
+ @if (recurringDepositProduct.activeChart.name) { + {{ recurringDepositProduct.activeChart.name }} + } + {{ recurringDepositProduct.activeChart.fromDate | dateFormat }} + @if (recurringDepositProduct.activeChart.endDate) { + + {{ recurringDepositProduct.activeChart.endDate | dateFormat }} + } + + Primary by Amount: {{ recurringDepositProduct.activeChart.isPrimaryGroupingByAmount | yesNo }} + +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Sr.{{ i + 1 }}Particular{{ chartSlab.description }}From{{ chartSlab.fromPeriod }}To{{ chartSlab.toPeriod ?? '—' }}Period{{ chartSlab.periodType?.value }}Rate (%) + {{ chartSlab.annualInterestRate }} + + + +
+

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

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
{{ 'labels.inputs.Entity Type' | translate }} + {{ + incentive.entityType + | find: recurringDepositProductTemplate.chartTemplate.entityTypeOptions : 'id' : 'value' + }} + {{ 'labels.inputs.Attribute Name' | translate }} + {{ + incentive.attributeName + | find: recurringDepositProductTemplate.chartTemplate.attributeNameOptions : 'id' : 'value' + }} + {{ 'labels.inputs.Condition Type' | translate }} + {{ + incentive.conditionType + | find: recurringDepositProductTemplate.chartTemplate.conditionTypeOptions : 'id' : 'value' + }} + {{ 'labels.inputs.Attribute Value' | translate }} + @switch (incentive.attributeName) { + @case (2) { + {{ + incentive.attributeValue + | find: recurringDepositProductTemplate.chartTemplate.genderOptions : 'id' : 'name' + }} + } + @case (3) { + {{ incentive.attributeValue }} + } + @case (4) { + {{ + incentive.attributeValue + | find: recurringDepositProductTemplate.chartTemplate.clientTypeOptions : 'id' : 'name' + }} + } + @case (5) { + {{ + incentive.attributeValue + | find + : recurringDepositProductTemplate.chartTemplate.clientClassificationOptions + : 'id' + : 'name' + }} + } + } + {{ 'labels.inputs.Incentive Type' | translate }} + {{ + incentive.incentiveType + | find: recurringDepositProductTemplate.chartTemplate.incentiveTypeOptions : 'id' : 'value' + }} + {{ 'labels.inputs.Amount' | translate }}{{ incentive.amount }}
+
+
+
+
+ + } + + + @if (recurringDepositProduct.charges.length) { +
+
+
+

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

+
+
+ @@ -571,91 +740,83 @@
{{ 'labels.inputs.Name' | translate }} {{ charge.name }}
- } - - -

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

- +
+ } + +
+
+
+

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

+
- + > +
- @if ( - recurringDepositProduct.paymentChannelToFundSourceMappings?.length || - recurringDepositProduct.feeToIncomeAccountMappings?.length || - recurringDepositProduct.penaltyToIncomeAccountMappings?.length - ) { -
-

{{ 'labels.inputs.Advanced Accounting Rules' | translate }}

- - @if (recurringDepositProduct.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.name }}
-
- } - @if (recurringDepositProduct.feeToIncomeAccountMappings?.length) { -
-

{{ 'labels.inputs.Fees to Specific Income Accounts' | translate }}

- - - - - - - - - - - -
{{ 'labels.inputs.Fee/Charge' | translate }}{{ feesIncome.charge.name }}{{ 'labels.inputs.Income Account' | translate }}{{ feesIncome.incomeAccount.name }}
-
- } - @if (recurringDepositProduct.penaltyToIncomeAccountMappings?.length) { -
-

{{ 'labels.inputs.Penalties to Specific Income Accounts' | translate }}

- - - - - - - - - - - -
{{ 'labels.inputs.Penalty' | translate }}{{ penaltyIncome.charge.name }}{{ 'labels.inputs.Income Account' | translate }}{{ penaltyIncome.incomeAccount.name }}
-
- } + + @if ( + recurringDepositProduct.paymentChannelToFundSourceMappings?.length || + recurringDepositProduct.feeToIncomeAccountMappings?.length || + recurringDepositProduct.penaltyToIncomeAccountMappings?.length + ) { +
+
+
+

{{ 'labels.inputs.Advanced Accounting Rules' | translate }}

- } -
+ @if (recurringDepositProduct.paymentChannelToFundSourceMappings?.length) { +

{{ 'labels.inputs.Fund Sources for Payment Channels' | translate }}

+
+ + + + + + + + + + + +
{{ 'labels.inputs.Payment Type' | translate }}{{ p.paymentType.name }}{{ 'labels.inputs.Fund Source' | translate }}{{ p.fundSourceAccount.name }}
+
+ } + @if (recurringDepositProduct.feeToIncomeAccountMappings?.length) { +

{{ 'labels.inputs.Fees to Specific Income Accounts' | translate }}

+
+ + + + + + + + + + + +
{{ 'labels.inputs.Fee/Charge' | translate }}{{ f.charge.name }}{{ 'labels.inputs.Income Account' | translate }}{{ f.incomeAccount.name }}
+
+ } + @if (recurringDepositProduct.penaltyToIncomeAccountMappings?.length) { +

{{ 'labels.inputs.Penalties to Specific Income Accounts' | translate }}

+
+ + + + + + + + + + + +
{{ 'labels.inputs.Penalty' | translate }}{{ p.charge.name }}{{ 'labels.inputs.Income Account' | translate }}{{ p.incomeAccount.name }}
+
+ } + + }
diff --git a/src/app/products/recurring-deposit-products/view-recurring-deposit-product/recurring-deposit-general-tab/recurring-deposit-general-tab.component.scss b/src/app/products/recurring-deposit-products/view-recurring-deposit-product/recurring-deposit-general-tab/recurring-deposit-general-tab.component.scss index cdee63517..9e7b167c3 100644 --- a/src/app/products/recurring-deposit-products/view-recurring-deposit-product/recurring-deposit-general-tab/recurring-deposit-general-tab.component.scss +++ b/src/app/products/recurring-deposit-products/view-recurring-deposit-product/recurring-deposit-general-tab/recurring-deposit-general-tab.component.scss @@ -6,50 +6,513 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -@use 'assets/styles/helper'; -@use 'assets/styles/colours' as *; -@use 'assets/styles/product-view' as pv; - -@include pv.product-view-styles; - -/* RD-specific purple accent */ :host { - --pv-accent: #6d28d9; - --pv-accent-l: #ede9fe; + --vsp-navy: #0b1e3d; + --vsp-blue: #1d4ed8; + --vsp-blue-l: #eff6ff; + --vsp-teal: #0e7e6b; + --vsp-teal-l: #ccfbf1; + --vsp-purple: #6d28d9; + --vsp-purple-l: #ede9fe; + --vsp-indigo: #3730a3; + --vsp-indigo-l: #e0e7ff; + --vsp-amber: #b45309; + --vsp-amber-l: #fef3c7; + --vsp-green: #15803d; + --vsp-green-l: #dcfce7; + --vsp-red: #c0392b; + --vsp-red-l: #fee2e2; + --vsp-pink: #be185d; + --vsp-pink-l: #fce7f3; + --vsp-g50: #f8fafc; + --vsp-g100: #f1f5f9; + --vsp-g200: #e2e8f0; + --vsp-g500: #64748b; + --vsp-g700: #334155; + --vsp-g900: #0f172a; + + display: block; + font-family: + 'DM Sans', + system-ui, + -apple-system, + sans-serif; + color: var(--vsp-g900); + font-size: 13.5px; } -.container { - width: 100%; +.vsp-root { + padding: 4px 4px 24px; + display: flex; + flex-direction: column; + gap: 14px; } -.tab-container { - padding: 1%; - margin: 1%; +.vsp-hero { + background: linear-gradient(135deg, var(--vsp-navy) 0%, var(--vsp-blue) 100%); + border-radius: 14px; + padding: 22px 22px 22px 18px; + display: flex; + align-items: flex-start; + gap: 18px; + box-shadow: + 0 10px 24px rgb(11 30 61 / 18%), + 0 4px 10px rgb(11 30 61 / 12%); + color: #fff; + position: relative; + overflow: hidden; } -.mat-h3 { - margin-top: 10px !important; - font-weight: 300; - color: $status-approved; +.vsp-hero::before { + content: ''; + position: absolute; + top: -60px; + right: -60px; + width: 240px; + height: 240px; + border-radius: 50%; + background: radial-gradient(circle, rgb(255 255 255 / 8%) 0%, transparent 70%); + pointer-events: none; } -.mat-elevation-z1 { - margin: 1em 0 1.5em; +.vsp-hero-left { + display: flex; + align-items: flex-start; + gap: 16px; + flex: 1; + min-width: 0; } -.interestCarts { - float: right; +.vsp-hero-icon { + width: 56px; + height: 56px; + border-radius: 14px; + background: rgb(255 255 255 / 16%); + border: 1px solid rgb(255 255 255 / 22%); + display: inline-flex; + align-items: center; + justify-content: center; + font-size: 24px; + flex-shrink: 0; } -h2, -h3, -h4 { - margin: 0; +.vsp-hero-text { + flex: 1; + min-width: 0; +} + +.vsp-hero-eyebrow { + font-size: 10.5px; + font-weight: 700; + text-transform: uppercase; + letter-spacing: 0.12em; + color: rgb(255 255 255 / 70%); + margin-bottom: 4px; +} + +.vsp-hero-title { + margin: 0 0 10px; + font-size: 22px; + font-weight: 700; + letter-spacing: 0.01em; + color: #fff; + line-height: 1.2; +} + +.vsp-hero-meta { + display: flex; + align-items: center; + gap: 8px; + flex-wrap: wrap; +} + +.vsp-hero-desc { + margin: 12px 0 0; + font-size: 13px; + color: rgb(255 255 255 / 82%); + line-height: 1.5; + max-width: 720px; +} + +.vsp-edit-btn { + display: inline-flex; + align-items: center; + gap: 8px; + height: 38px; + padding: 0 16px; + border-radius: 10px; + background: rgb(255 255 255 / 14%); + color: #fff; + border: 1px solid rgb(255 255 255 / 28%); + font-size: 13px; + font-weight: 700; + letter-spacing: 0.02em; + cursor: pointer; + text-decoration: none; + white-space: nowrap; + font-family: inherit; + flex-shrink: 0; + transition: all 0.16s ease; + + fa-icon { + font-size: 12px; + } + + &:hover { + background: rgb(255 255 255 / 24%); + border-color: rgb(255 255 255 / 50%); + } +} + +.vsp-pill { + display: inline-flex; + align-items: center; + gap: 5px; + font-size: 11px; + font-weight: 700; + letter-spacing: 0.04em; + text-transform: uppercase; + padding: 4px 10px; + border-radius: 999px; + font-family: inherit; + + fa-icon { + font-size: 9.5px; + } + + &--code { + background: rgb(255 255 255 / 18%); + color: #fff; + border: 1px solid rgb(255 255 255 / 24%); + font-family: 'JetBrains Mono', ui-monospace, Menlo, Consolas, monospace; + } + + &--teal { + background: var(--vsp-teal-l); + color: var(--vsp-teal); + border: 1px solid #99f6e4; + } + + &--blue { + background: var(--vsp-blue-l); + color: var(--vsp-blue); + border: 1px solid #dbeafe; + } + + &--green { + background: var(--vsp-green-l); + color: var(--vsp-green); + border: 1px solid #bbf7d0; + } + + &--amber { + background: var(--vsp-amber-l); + color: var(--vsp-amber); + border: 1px solid #fde68a; + } + + &--red { + background: var(--vsp-red-l); + color: var(--vsp-red); + border: 1px solid #fecaca; + } + + &--gray { + background: var(--vsp-g100); + color: var(--vsp-g700); + border: 1px solid var(--vsp-g200); + } +} + +.vsp-section { + background: #fff; + border: 1px solid var(--vsp-g200); + border-radius: 12px; + padding: 16px 20px; + box-shadow: 0 1px 2px rgb(15 23 42 / 4%); +} + +.vsp-section-h { + display: flex; + align-items: center; + gap: 12px; + margin-bottom: 14px; + padding-bottom: 12px; + border-bottom: 1px dashed var(--vsp-g200); + + h3 { + margin: 0; + font-size: 14px; + font-weight: 700; + color: var(--vsp-g900); + letter-spacing: 0.02em; + } +} + +.vsp-section-ic { + width: 36px; + height: 36px; + border-radius: 10px; + display: inline-flex; + align-items: center; + justify-content: center; + font-size: 14px; + flex-shrink: 0; + + &--blue { + background: var(--vsp-blue-l); + color: var(--vsp-blue); + } + + &--teal { + background: var(--vsp-teal-l); + color: var(--vsp-teal); + } + + &--purple { + background: var(--vsp-purple-l); + color: var(--vsp-purple); + } + + &--indigo { + background: var(--vsp-indigo-l); + color: var(--vsp-indigo); + } + + &--amber { + background: var(--vsp-amber-l); + color: var(--vsp-amber); + } + + &--green { + background: var(--vsp-green-l); + color: var(--vsp-green); + } + + &--red { + background: var(--vsp-red-l); + color: var(--vsp-red); + } + + &--pink { + background: var(--vsp-pink-l); + color: var(--vsp-pink); + } +} + +.vsp-sub-h { + margin: 16px 0 10px; + font-size: 12px; + font-weight: 700; + color: var(--vsp-g700); + text-transform: uppercase; + letter-spacing: 0.06em; +} + +.vsp-grid { + display: grid; + grid-template-columns: 1fr 1fr; + gap: 10px 24px; +} + +@media (width <=600px) { + .vsp-grid { + grid-template-columns: 1fr; + } +} + +.vsp-kv { + display: flex; + flex-direction: column; + gap: 3px; + padding: 8px 0; + border-bottom: 1px dashed var(--vsp-g100); + + &--span { + grid-column: 1 / -1; + } +} + +.vsp-k { + font-size: 10.5px; + font-weight: 700; + text-transform: uppercase; + letter-spacing: 0.06em; + color: var(--vsp-g500); +} + +.vsp-v { + font-size: 13.5px; + color: var(--vsp-g900); font-weight: 500; + word-break: break-word; + + strong { + font-weight: 700; + } } -table { +.vsp-v--accent { + font-size: 18px; + font-weight: 700; + color: var(--vsp-blue); + letter-spacing: 0.01em; +} + +.vsp-suffix { + font-size: 12px; + font-weight: 600; + color: var(--vsp-g500); + margin-left: 4px; +} + +.vsp-table-wrap { + overflow-x: auto; + border: 1px solid var(--vsp-g200); + border-radius: 10px; + margin-top: 4px; +} + +/* ───────── CHART META PILLS ───────── */ +.vsp-chart-meta { + display: flex; + align-items: center; + flex-wrap: wrap; + gap: 8px; + margin-bottom: 14px; +} + +.vsp-chart-pill { + display: inline-flex; + align-items: center; + gap: 6px; + font-size: 12px; + font-weight: 600; + padding: 5px 12px; + border-radius: 8px; + background: var(--vsp-g100); + border: 1px solid var(--vsp-g200); + color: var(--vsp-g700); + + fa-icon { + font-size: 11px; + color: var(--vsp-g500); + } + + &--green { + background: var(--vsp-green-l); + border-color: #bbf7d0; + color: var(--vsp-green); + } + + &--red { + background: var(--vsp-red-l); + border-color: #fecaca; + color: var(--vsp-red); + } +} + +/* ───────── RATE BADGE ───────── */ +.vsp-rate-badge { + display: inline-block; + font-size: 13px; + font-weight: 700; + color: var(--vsp-blue); + background: var(--vsp-blue-l); + border: 1px solid #dbeafe; + border-radius: 6px; + padding: 3px 10px; + letter-spacing: 0.02em; +} + +/* ───────── CELL SUB TEXT ───────── */ +.vsp-cell-sub { + display: block; + font-size: 10.5px; + color: var(--vsp-g500); + margin-top: 2px; +} + +/* ───────── INCENTIVE EXPAND ───────── */ +.vsp-incentive-btn { + display: inline-flex; + align-items: center; + gap: 6px; + font-size: 11.5px; + font-weight: 600; + padding: 5px 12px; + border-radius: 8px; + border: 1px solid var(--vsp-g200); + background: var(--vsp-g50); + color: var(--vsp-blue); + cursor: pointer; + font-family: inherit; + transition: all 0.14s ease; + + fa-icon { + font-size: 11px; + } + + &:hover { + background: var(--vsp-blue-l); + border-color: #dbeafe; + } +} + +.vsp-incentive-cell { + padding: 0 !important; +} + +.vsp-incentive-panel { + overflow: hidden; + padding: 0 14px; + background: var(--vsp-g50); + border-top: 1px dashed var(--vsp-g200); +} + +.vsp-incentive-title { + margin: 12px 0 8px; + font-size: 11px; + font-weight: 700; + text-transform: uppercase; + letter-spacing: 0.06em; + color: var(--vsp-g500); +} + +.vsp-table { width: 100%; + background: #fff; + + th.mat-mdc-header-cell { + background: var(--vsp-g50); + color: var(--vsp-g700); + font-size: 11px; + font-weight: 700; + text-transform: uppercase; + letter-spacing: 0.06em; + padding: 11px 14px; + border-bottom: 1px solid var(--vsp-g200); + white-space: nowrap; + } + + td.mat-mdc-cell { + padding: 10px 14px; + border-bottom: 1px solid var(--vsp-g100); + font-size: 12.5px; + color: var(--vsp-g900); + } + + tbody tr:last-child td.mat-mdc-cell { + border-bottom: 0; + } + + tbody tr:not(.incentives-row, .vsp-row-even) td.mat-mdc-cell { + background: #fff !important; + } + + tbody tr.vsp-row-even td.mat-mdc-cell { + background: var(--vsp-g50) !important; + } tr.incentives-row { height: 0; @@ -61,26 +524,5 @@ table { .incentives { overflow: hidden; } - - .mat-card { - border-radius: 0; - - > h4 { - font-weight: 500; - margin: 0.5em 0 0; - } - } } } - -span { - margin: 0.5em 0; -} - -mat-divider { - margin: 0 0 0.5em; -} - -.margin-t { - margin-top: 1em; -} diff --git a/src/app/products/recurring-deposit-products/view-recurring-deposit-product/recurring-deposit-general-tab/recurring-deposit-general-tab.component.ts b/src/app/products/recurring-deposit-products/view-recurring-deposit-product/recurring-deposit-general-tab/recurring-deposit-general-tab.component.ts index 4ba8ac022..f932b76d6 100644 --- a/src/app/products/recurring-deposit-products/view-recurring-deposit-product/recurring-deposit-general-tab/recurring-deposit-general-tab.component.ts +++ b/src/app/products/recurring-deposit-products/view-recurring-deposit-product/recurring-deposit-general-tab/recurring-deposit-general-tab.component.ts @@ -44,6 +44,7 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ], imports: [ ...STANDALONE_SHARED_IMPORTS, + RouterLink, FaIconComponent, MatDivider, MatTable, @@ -71,13 +72,23 @@ export class RecurringDepositGeneralTabComponent { expandChartSlabIndex: number | null = null; chartSlabsIncentivesDisplayedColumns: string[] = ['incentives']; - chartSlabsDisplayedColumns: string[] = [ - 'period', - 'amountRange', - 'annualInterestRate', + readonly chartSlabsBaseColumns = [ + 'srNo', 'description', - 'actions' + 'fromPeriod', + 'toPeriod', + 'periodTypeLabel', + 'annualInterestRate' ]; + + get chartSlabsDisplayedColumns(): string[] { + const slabs = this.recurringDepositProduct?.activeChart?.chartSlabs || []; + const hasIncentives = slabs.some((s: any) => s.incentives?.length); + return hasIncentives ? [ + ...this.chartSlabsBaseColumns, + 'actions' + ] : this.chartSlabsBaseColumns; + } incentivesDisplayedColumns: string[] = [ 'entityType', 'attributeName',