diff --git a/src/app/products/loan-products/common/loan-product-summary/loan-product-summary.component.html b/src/app/products/loan-products/common/loan-product-summary/loan-product-summary.component.html index beebafd873..14ca19674d 100644 --- a/src/app/products/loan-products/common/loan-product-summary/loan-product-summary.component.html +++ b/src/app/products/loan-products/common/loan-product-summary/loan-product-summary.component.html @@ -964,7 +964,8 @@

{{ 'labels.inputs.Configurable Terms and Settings' } } - @if (loanProductService.isLoanProduct && loanProduct.charges.length) { + + @if (loanProduct.charges?.length) {

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

@@ -1000,40 +1001,43 @@

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

-

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

- - - - - - - - - - - - - - - - - - - - -
{{ 'labels.inputs.Name' | translate }} - {{ overdueCharge.name + ', ' + overdueCharge.currency.displaySymbol }} - {{ 'labels.inputs.Charge Type' | translate }} - {{ overdueCharge.chargeCalculationType.value | translateKey: 'catalogs' }} - {{ 'labels.inputs.Amount' | translate }} - {{ overdueCharge.amount | formatNumber }} - {{ 'labels.inputs.Collected On' | translate }} - {{ overdueCharge.chargeTimeType.value | translateKey: 'catalogs' }} -
+ + @if (loanProductService.isLoanProduct) { +

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

+ + + + + + + + + + + + + + + + + + + + +
{{ 'labels.inputs.Name' | translate }} + {{ overdueCharge.name + ', ' + overdueCharge.currency.displaySymbol }} + {{ 'labels.inputs.Charge Type' | translate }} + {{ overdueCharge.chargeCalculationType.value | translateKey: 'catalogs' }} + {{ 'labels.inputs.Amount' | translate }} + {{ overdueCharge.amount | formatNumber }} + {{ 'labels.inputs.Collected On' | translate }} + {{ overdueCharge.chargeTimeType.value | translateKey: 'catalogs' }} +
+ }
} @if (isAdvancedPaymentAllocation) { diff --git a/src/app/products/loan-products/create-loan-product-classic/create-loan-product-classic.component.html b/src/app/products/loan-products/create-loan-product-classic/create-loan-product-classic.component.html index ee9d4f8af0..368768399c 100644 --- a/src/app/products/loan-products/create-loan-product-classic/create-loan-product-classic.component.html +++ b/src/app/products/loan-products/create-loan-product-classic/create-loan-product-classic.component.html @@ -113,22 +113,18 @@ - @if (loanProductService.isLoanProduct) { - - {{ getProductTypeLabel(true) }} : {{ 'labels.inputs.CHARGES' | translate }} + + {{ getProductTypeLabel(true) }} : {{ 'labels.inputs.CHARGES' | translate }} - - - - } + + + @if (isAdvancedPaymentStrategy) { diff --git a/src/app/products/loan-products/create-loan-product-classic/create-loan-product-classic.component.ts b/src/app/products/loan-products/create-loan-product-classic/create-loan-product-classic.component.ts index 63b4afddb5..4b868bbed7 100644 --- a/src/app/products/loan-products/create-loan-product-classic/create-loan-product-classic.component.ts +++ b/src/app/products/loan-products/create-loan-product-classic/create-loan-product-classic.component.ts @@ -336,6 +336,7 @@ export class CreateLoanProductClassicComponent extends LoanProductBaseComponent ...this.loanProductCurrencyStep.loanProductCurrency, ...this.loanProductTermsStep.loanProductTerms, ...this.loanProductSettingsStep.loanProductSettings, + ...this.loanProductChargesStep.loanProductCharges, ...this.loanProductAccountingStep.loanProductAccounting }; loanProduct['paymentAllocation'] = this.paymentAllocation; diff --git a/src/app/products/loan-products/edit-loan-product/edit-loan-product.component.html b/src/app/products/loan-products/edit-loan-product/edit-loan-product.component.html index 3c8777a979..db301b9cf0 100644 --- a/src/app/products/loan-products/edit-loan-product/edit-loan-product.component.html +++ b/src/app/products/loan-products/edit-loan-product/edit-loan-product.component.html @@ -113,22 +113,18 @@ - @if (loanProductService.isLoanProduct) { - - {{ getProductTypeLabel(true) }} : {{ 'labels.inputs.CHARGES' | translate }} + + {{ getProductTypeLabel(true) }} : {{ 'labels.inputs.CHARGES' | translate }} - - - - } + + + @if (isAdvancedPaymentStrategy) { diff --git a/src/app/products/loan-products/edit-loan-product/edit-loan-product.component.ts b/src/app/products/loan-products/edit-loan-product/edit-loan-product.component.ts index 31ba54719e..c4f3e34249 100644 --- a/src/app/products/loan-products/edit-loan-product/edit-loan-product.component.ts +++ b/src/app/products/loan-products/edit-loan-product/edit-loan-product.component.ts @@ -336,6 +336,7 @@ export class EditLoanProductComponent extends LoanProductBaseComponent implement !this.loanProductCurrencyForm.pristine || !this.loanProductTermsForm.pristine || !this.loanProductSettingsForm.pristine || + !(this.loanProductChargesStep?.pristine ?? true) || !(this.loanProductAccountingForm?.pristine ?? true) || this.wasPaymentAllocationChanged ); @@ -397,6 +398,7 @@ export class EditLoanProductComponent extends LoanProductBaseComponent implement ...this.loanProductCurrencyStep.loanProductCurrency, ...this.loanProductTermsStep.loanProductTerms, ...this.loanProductSettingsStep.loanProductSettings, + ...this.loanProductChargesStep.loanProductCharges, ...this.loanProductAccountingStep.loanProductAccounting }; loanProduct['paymentAllocation'] = this.paymentAllocation; diff --git a/src/app/products/loan-products/loan-product-stepper/loan-product-charges-step/loan-product-charges-step.component.html b/src/app/products/loan-products/loan-product-stepper/loan-product-charges-step/loan-product-charges-step.component.html index f64b1b9c18..06d7b62ac6 100644 --- a/src/app/products/loan-products/loan-product-stepper/loan-product-charges-step/loan-product-charges-step.component.html +++ b/src/app/products/loan-products/loan-product-stepper/loan-product-charges-step/loan-product-charges-step.component.html @@ -11,7 +11,7 @@ {{ 'labels.inputs.Charge' | translate }} @for ( - charge of chargeData | chargesFilter: chargesDataSource : currencyCode.value : multiDisburseLoan.value; + charge of chargeData | chargesFilter: chargesDataSource : currencyCode.value : multiDisburseLoan?.value; track charge ) { @@ -76,86 +76,89 @@ - - -
-

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

-
- - - {{ 'labels.inputs.Overdue Charge' | translate }} - - @for ( - overdueCharge of overdueChargeData | chargesFilter: chargesDataSource : currencyCode.value; - track overdueCharge - ) { - - {{ overdueCharge.name }} - - } - - - -
- +
+ + - - {{ 'labels.buttons.Add' | translate }} - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
{{ 'labels.inputs.Name' | translate }} - {{ overdueCharge.name + ', ' + overdueCharge.currency.displaySymbol }} - {{ 'labels.inputs.Type' | translate }} - {{ overdueCharge.chargeCalculationType.value | translateKey: 'catalogs' }} - {{ 'labels.inputs.Amount' | translate }} - {{ overdueCharge.amount | formatNumber }} - {{ 'labels.inputs.Collected On' | translate }} - {{ overdueCharge.chargeTimeType.value | translateKey: 'catalogs' }} - {{ 'labels.inputs.Actions' | translate }} - -
+ + {{ 'labels.inputs.Name' | translate }} + + {{ overdueCharge.name + ', ' + overdueCharge.currency.displaySymbol }} + + + + + {{ 'labels.inputs.Type' | translate }} + + {{ overdueCharge.chargeCalculationType.value | translateKey: 'catalogs' }} + + + + + {{ 'labels.inputs.Amount' | translate }} + + {{ overdueCharge.amount | formatNumber }} + + + + + {{ 'labels.inputs.Collected On' | translate }} + + {{ overdueCharge.chargeTimeType.value | translateKey: 'catalogs' }} + + + + + {{ 'labels.inputs.Actions' | translate }} + + + + + + + + + }
diff --git a/src/app/products/loan-products/loan-product-stepper/loan-product-charges-step/loan-product-charges-step.component.ts b/src/app/products/loan-products/loan-product-stepper/loan-product-charges-step/loan-product-charges-step.component.ts index dd21938e5c..6ca1aa14a1 100644 --- a/src/app/products/loan-products/loan-product-stepper/loan-product-charges-step/loan-product-charges-step.component.ts +++ b/src/app/products/loan-products/loan-product-stepper/loan-product-charges-step/loan-product-charges-step.component.ts @@ -88,7 +88,7 @@ export class LoanProductChargesStepComponent extends LoanProductBaseComponent im pristine = true; ngOnInit() { - this.chargeData = this.loanProductsTemplate.chargeOptions; + this.chargeData = this.loanProductsTemplate.chargeOptions || []; this.overdueChargeData = this.loanProductsTemplate.penaltyOptions ? this.loanProductsTemplate.penaltyOptions.filter( (penalty: any) => penalty.chargeTimeType.code === 'chargeTimeType.overdueInstallment' diff --git a/src/app/products/loan-products/loan-products.ts b/src/app/products/loan-products/loan-products.ts index d64e5bc0a5..f6ee634e10 100644 --- a/src/app/products/loan-products/loan-products.ts +++ b/src/app/products/loan-products/loan-products.ts @@ -73,18 +73,14 @@ export class LoanProducts { const dateFormat: string = this.settingsService.dateFormat; const locale: string = this.settingsService.language.code; - const loanProduct = this.loanProductService.isLoanProduct - ? { - ...loanProductData, - charges: (loanProductData.charges || []).map((charge: any) => ({ id: charge.id })), - dateFormat, - locale - } - : { - ...loanProductData, - dateFormat, - locale - }; + // Both product types accept the optional `charges` parameter as a list of `{ id }` references, and + // both replace the whole association list on update, so the mapping is shared. + const loanProduct = { + ...loanProductData, + charges: (loanProductData.charges || []).map((charge: any) => ({ id: charge.id })), + dateFormat, + locale + }; // Remove unnecessary properties delete loanProduct.allowAttributeConfiguration; delete loanProduct.advancedAccountingRules;