diff --git a/src/app/products/loan-products/loan-product-stepper/loan-product-settings-step/loan-product-settings-step.component.ts b/src/app/products/loan-products/loan-product-stepper/loan-product-settings-step/loan-product-settings-step.component.ts
index 67b9d9d47..f053e184e 100644
--- a/src/app/products/loan-products/loan-product-stepper/loan-product-settings-step/loan-product-settings-step.component.ts
+++ b/src/app/products/loan-products/loan-product-stepper/loan-product-settings-step/loan-product-settings-step.component.ts
@@ -1,6 +1,5 @@
import { Component, OnInit, Input } from '@angular/core';
import { FormGroup, FormBuilder, Validators, FormControl } from '@angular/forms';
-import { DatePipe } from '@angular/common';
@Component({
selector: 'mifosx-loan-product-settings-step',
@@ -28,11 +27,7 @@ export class LoanProductSettingsStepComponent implements OnInit {
interestRecalculationDayOfWeekTypeData: any;
interestRecalculationOnDayTypeData: any;
- minDate = new Date(2000, 0, 1);
- maxDate = new Date(new Date().setFullYear(new Date().getFullYear() + 10));
-
- constructor(private formBuilder: FormBuilder,
- private datePipe: DatePipe) {
+ constructor(private formBuilder: FormBuilder) {
this.createLoanProductSettingsForm();
this.setConditionalControls();
}
@@ -41,8 +36,8 @@ export class LoanProductSettingsStepComponent implements OnInit {
this.isLinkedToFloatingInterestRates.valueChanges
.subscribe((isLinkedToFloatingInterestRates: any) => {
if (isLinkedToFloatingInterestRates) {
- this.loanProductSettingsForm.get('isInterestRecalculationEnabled').setValue(true);
- }
+ this.loanProductSettingsForm.get('isInterestRecalculationEnabled').setValue(true);
+ }
});
this.amortizationTypeData = this.loanProductsTemplate.amortizationTypeOptions;
@@ -61,13 +56,83 @@ export class LoanProductSettingsStepComponent implements OnInit {
this.interestRecalculationOnDayTypeData = Array.from({ length: 28 }, (_, index) => index + 1);
this.loanProductSettingsForm.patchValue({
- 'amortizationType': this.amortizationTypeData[0].id,
- 'interestType': this.interestTypeData[0].id,
- 'interestCalculationPeriodType': this.interestCalculationPeriodTypeData[0].id,
- 'transactionProcessingStrategyId': this.transactionProcessingStrategyData[0].id,
- 'daysInYearType': this.daysInYearTypeData[0].id,
- 'daysInMonthType': this.daysInMonthTypeData[0].id,
+ 'amortizationType': this.loanProductsTemplate.amortizationType.id,
+ 'interestType': this.loanProductsTemplate.interestType.id,
+ 'isEqualAmortization': this.loanProductsTemplate.isEqualAmortization,
+ 'interestCalculationPeriodType': this.loanProductsTemplate.interestCalculationPeriodType.id,
+ 'allowPartialPeriodInterestCalcualtion': this.loanProductsTemplate.allowPartialPeriodInterestCalcualtion,
+ 'transactionProcessingStrategyId': this.loanProductsTemplate.transactionProcessingStrategyId || this.transactionProcessingStrategyData[0].id,
+ 'graceOnPrincipalPayment': this.loanProductsTemplate.graceOnPrincipalPayment,
+ 'graceOnInterestPayment': this.loanProductsTemplate.graceOnInterestPayment,
+ 'graceOnInterestCharged': this.loanProductsTemplate.graceOnInterestCharged,
+ 'inArrearsTolerance': this.loanProductsTemplate.inArrearsTolerance,
+ 'daysInYearType': this.loanProductsTemplate.daysInYearType.id,
+ 'daysInMonthType': this.loanProductsTemplate.daysInMonthType.id,
+ 'canDefineInstallmentAmount': this.loanProductsTemplate.canDefineInstallmentAmount,
+ 'graceOnArrearsAgeing': this.loanProductsTemplate.graceOnArrearsAgeing,
+ 'overdueDaysForNPA': this.loanProductsTemplate.overdueDaysForNPA,
+ 'accountMovesOutOfNPAOnlyOnArrearsCompletion': this.loanProductsTemplate.accountMovesOutOfNPAOnlyOnArrearsCompletion,
+ 'principalThresholdForLastInstallment': this.loanProductsTemplate.principalThresholdForLastInstallment,
+ 'allowVariableInstallments': this.loanProductsTemplate.allowVariableInstallments,
+ 'minimumGap': this.loanProductsTemplate.minimumGap,
+ 'maximumGap': this.loanProductsTemplate.maximumGap,
+ 'canUseForTopup': this.loanProductsTemplate.canUseForTopup,
+ 'isInterestRecalculationEnabled': this.loanProductsTemplate.isInterestRecalculationEnabled,
+ 'holdGuaranteeFunds': this.loanProductsTemplate.holdGuaranteeFunds,
+ 'multiDisburseLoan': this.loanProductsTemplate.multiDisburseLoan,
+ 'maxTrancheCount': this.loanProductsTemplate.maxTrancheCount,
+ 'outstandingLoanBalance': this.loanProductsTemplate.outstandingLoanBalance
});
+
+ if (this.loanProductsTemplate.isInterestRecalculationEnabled) {
+ this.loanProductSettingsForm.patchValue({
+ 'preClosureInterestCalculationStrategy': this.loanProductsTemplate.interestRecalculationData.preClosureInterestCalculationStrategy.id,
+ 'rescheduleStrategyMethod': this.loanProductsTemplate.interestRecalculationData.rescheduleStrategyType.id,
+ 'interestRecalculationCompoundingMethod': this.loanProductsTemplate.interestRecalculationData.interestRecalculationCompoundingType.id,
+ 'recalculationRestFrequencyType': this.loanProductsTemplate.interestRecalculationData.recalculationRestFrequencyType.id,
+ 'isArrearsBasedOnOriginalSchedule': this.loanProductsTemplate.interestRecalculationData.isArrearsBasedOnOriginalSchedule,
+ 'recalculationCompoundingFrequencyType': this.loanProductsTemplate.interestRecalculationData.interestRecalculationCompoundingType.id && this.loanProductsTemplate.interestRecalculationData.recalculationCompoundingFrequencyType.id,
+ 'recalculationCompoundingFrequencyInterval': this.loanProductsTemplate.interestRecalculationData.recalculationCompoundingFrequencyInterval,
+ 'recalculationRestFrequencyInterval': this.loanProductsTemplate.interestRecalculationData.recalculationRestFrequencyInterval,
+ 'recalculationRestFrequencyNthDayType': this.loanProductsTemplate.interestRecalculationData.recalculationRestFrequencyType.id === 4 && this.loanProductsTemplate.interestRecalculationData.recalculationRestFrequencyOnDay ?
+ -2 : this.loanProductsTemplate.interestRecalculationData.recalculationRestFrequencyNthDay && this.loanProductsTemplate.interestRecalculationData.recalculationRestFrequencyNthDay.id,
+ 'recalculationCompoundingFrequencyNthDayType': this.loanProductsTemplate.interestRecalculationData.interestRecalculationCompoundingType.id && this.loanProductsTemplate.interestRecalculationData.recalculationCompoundingFrequencyType.id === 4
+ && this.loanProductsTemplate.interestRecalculationData.recalculationCompoundingFrequencyOnDay ? -2 : this.loanProductsTemplate.interestRecalculationData.recalculationCompoundingFrequencyNthDay
+ && this.loanProductsTemplate.interestRecalculationData.recalculationCompoundingFrequencyNthDay.id,
+ 'recalculationCompoundingFrequencyDayOfWeekType': this.loanProductsTemplate.interestRecalculationData.interestRecalculationCompoundingType.id && ((this.loanProductsTemplate.interestRecalculationData.recalculationCompoundingFrequencyType.id
+ === 4 && !this.loanProductsTemplate.interestRecalculationData.recalculationCompoundingFrequencyOnDay) || this.loanProductsTemplate.interestRecalculationData.recalculationCompoundingFrequencyType.id === 3)
+ && this.loanProductsTemplate.interestRecalculationData.recalculationCompoundingFrequencyWeekday && this.loanProductsTemplate.interestRecalculationData.recalculationCompoundingFrequencyWeekday.id,
+ 'recalculationRestFrequencyDayOfWeekType': ((this.loanProductsTemplate.interestRecalculationData.recalculationRestFrequencyType.id === 4 && !this.loanProductsTemplate.interestRecalculationData.recalculationRestFrequencyOnDay)
+ || this.loanProductsTemplate.interestRecalculationData.recalculationRestFrequencyType.id === 3) && this.loanProductsTemplate.interestRecalculationData.recalculationRestFrequencyWeekday
+ && this.loanProductsTemplate.interestRecalculationData.recalculationRestFrequencyWeekday.id,
+ 'recalculationCompoundingFrequencyOnDayType': this.loanProductsTemplate.interestRecalculationData.recalculationCompoundingFrequencyOnDay,
+ 'recalculationRestFrequencyOnDayType': this.loanProductsTemplate.interestRecalculationData.recalculationRestFrequencyOnDay
+ });
+ }
+
+ if (this.loanProductsTemplate.holdGuaranteeFunds) {
+ this.loanProductSettingsForm.patchValue({
+ 'mandatoryGuarantee': this.loanProductsTemplate.productGuaranteeData.mandatoryGuarantee,
+ 'minimumGuaranteeFromOwnFunds': this.loanProductsTemplate.productGuaranteeData.minimumGuaranteeFromOwnFunds,
+ 'minimumGuaranteeFromGuarantor': this.loanProductsTemplate.productGuaranteeData.minimumGuaranteeFromGuarantor
+ });
+ }
+
+ if (this.loanProductsTemplate.allowAttributeOverrides) {
+ this.loanProductSettingsForm.patchValue({
+ 'allowAttributeConfiguration': Object.values(this.loanProductsTemplate.allowAttributeOverrides).some((attribute: boolean) => attribute),
+ 'allowAttributeOverrides': {
+ 'amortizationType': this.loanProductsTemplate.allowAttributeOverrides.amortizationType,
+ 'interestType': this.loanProductsTemplate.allowAttributeOverrides.interestType,
+ 'transactionProcessingStrategyId': this.loanProductsTemplate.allowAttributeOverrides.transactionProcessingStrategyId,
+ 'interestCalculationPeriodType': this.loanProductsTemplate.allowAttributeOverrides.interestCalculationPeriodType,
+ 'inArrearsTolerance': this.loanProductsTemplate.allowAttributeOverrides.inArrearsTolerance,
+ 'repaymentEvery': this.loanProductsTemplate.allowAttributeOverrides.repaymentEvery,
+ 'graceOnPrincipalAndInterestPayment': this.loanProductsTemplate.allowAttributeOverrides.graceOnPrincipalAndInterestPayment,
+ 'graceOnArrearsAgeing': this.loanProductsTemplate.allowAttributeOverrides.graceOnArrearsAgeing
+ }
+ });
+ }
}
createLoanProductSettingsForm() {
@@ -139,34 +204,27 @@ export class LoanProductSettingsStepComponent implements OnInit {
this.loanProductSettingsForm.addControl('recalculationRestFrequencyType', new FormControl(this.interestRecalculationFrequencyTypeData[0].id, Validators.required));
this.loanProductSettingsForm.addControl('isArrearsBasedOnOriginalSchedule', new FormControl(''));
- // interestRecalculationCompoundingMethod (initially 0)
this.loanProductSettingsForm.get('interestRecalculationCompoundingMethod').valueChanges
.subscribe((interestRecalculationCompoundingMethod: any) => {
if (interestRecalculationCompoundingMethod !== 0) {
this.loanProductSettingsForm.addControl('recalculationCompoundingFrequencyType', new FormControl(this.interestRecalculationFrequencyTypeData[0].id, Validators.required));
- // recalculationCompoundingFrequencyType (initially 1)
this.loanProductSettingsForm.get('recalculationCompoundingFrequencyType').valueChanges
.subscribe((recalculationCompoundingFrequencyType: any) => {
if (recalculationCompoundingFrequencyType !== 1) {
this.loanProductSettingsForm.addControl('recalculationCompoundingFrequencyInterval', new FormControl('', Validators.required));
- this.loanProductSettingsForm.addControl('recalculationCompoundingFrequencyDate', new FormControl(''));
} else {
this.loanProductSettingsForm.removeControl('recalculationCompoundingFrequencyInterval');
- this.loanProductSettingsForm.removeControl('recalculationCompoundingFrequencyDate');
}
if (recalculationCompoundingFrequencyType === 3) {
this.loanProductSettingsForm.addControl('recalculationCompoundingFrequencyDayOfWeekType', new FormControl(''));
- } else {
- this.loanProductSettingsForm.removeControl('recalculationCompoundingFrequencyDayOfWeekType');
- }
-
- if (recalculationCompoundingFrequencyType === 4) {
+ this.loanProductSettingsForm.removeControl('recalculationCompoundingFrequencyNthDayType');
+ this.loanProductSettingsForm.removeControl('recalculationCompoundingFrequencyOnDayType');
+ } else if (recalculationCompoundingFrequencyType === 4) {
this.loanProductSettingsForm.addControl('recalculationCompoundingFrequencyNthDayType', new FormControl(''));
this.loanProductSettingsForm.addControl('recalculationCompoundingFrequencyDayOfWeekType', new FormControl(''));
- // recalculationCompoundingFrequencyNthDayType
this.loanProductSettingsForm.get('recalculationCompoundingFrequencyNthDayType').valueChanges
.subscribe((recalculationCompoundingFrequencyNthDayType: any) => {
if (recalculationCompoundingFrequencyNthDayType === -2) {
@@ -177,9 +235,10 @@ export class LoanProductSettingsStepComponent implements OnInit {
this.loanProductSettingsForm.removeControl('recalculationCompoundingFrequencyOnDayType');
}
});
-
} else {
this.loanProductSettingsForm.removeControl('recalculationCompoundingFrequencyNthDayType');
+ this.loanProductSettingsForm.removeControl('recalculationCompoundingFrequencyDayOfWeekType');
+ this.loanProductSettingsForm.removeControl('recalculationCompoundingFrequencyOnDayType');
}
});
@@ -188,28 +247,22 @@ export class LoanProductSettingsStepComponent implements OnInit {
}
});
- // recalculationRestFrequencyType
this.loanProductSettingsForm.get('recalculationRestFrequencyType').valueChanges
.subscribe((recalculationRestFrequencyType: any) => {
if (recalculationRestFrequencyType !== 1) {
this.loanProductSettingsForm.addControl('recalculationRestFrequencyInterval', new FormControl('', Validators.required));
- this.loanProductSettingsForm.addControl('recalculationRestFrequencyDate', new FormControl(''));
} else {
this.loanProductSettingsForm.removeControl('recalculationRestFrequencyInterval');
- this.loanProductSettingsForm.removeControl('recalculationRestFrequencyDate');
}
if (recalculationRestFrequencyType === 3) {
this.loanProductSettingsForm.addControl('recalculationRestFrequencyDayOfWeekType', new FormControl(''));
- } else {
- this.loanProductSettingsForm.removeControl('recalculationRestFrequencyDayOfWeekType');
- }
-
- if (recalculationRestFrequencyType === 4) {
+ this.loanProductSettingsForm.removeControl('recalculationRestFrequencyNthDayType');
+ this.loanProductSettingsForm.removeControl('recalculationRestFrequencyOnDayType');
+ } else if (recalculationRestFrequencyType === 4) {
this.loanProductSettingsForm.addControl('recalculationRestFrequencyNthDayType', new FormControl(''));
this.loanProductSettingsForm.addControl('recalculationRestFrequencyDayOfWeekType', new FormControl(''));
- // recalculationRestFrequencyNthDayType
this.loanProductSettingsForm.get('recalculationRestFrequencyNthDayType').valueChanges
.subscribe((recalculationRestFrequencyNthDayType: any) => {
if (recalculationRestFrequencyNthDayType === -2) {
@@ -223,6 +276,8 @@ export class LoanProductSettingsStepComponent implements OnInit {
} else {
this.loanProductSettingsForm.removeControl('recalculationRestFrequencyNthDayType');
+ this.loanProductSettingsForm.removeControl('recalculationRestFrequencyDayOfWeekType');
+ this.loanProductSettingsForm.removeControl('recalculationRestFrequencyOnDayType');
}
});
@@ -288,20 +343,6 @@ export class LoanProductSettingsStepComponent implements OnInit {
}
get loanProductSettings() {
- const prevCompoundingFrequencyDate: Date = this.loanProductSettingsForm.value.recalculationCompoundingFrequencyDate;
- const prevRestFrequencyDate: Date = this.loanProductSettingsForm.value.recalculationRestFrequencyDate;
- // TODO: Update once language and date settings are setup
- const dateFormat = 'yyyy-MM-dd';
- if (prevCompoundingFrequencyDate) {
- this.loanProductSettingsForm.patchValue({
- recalculationCompoundingFrequencyDate: this.datePipe.transform(prevCompoundingFrequencyDate, dateFormat)
- });
- }
- if (prevRestFrequencyDate) {
- this.loanProductSettingsForm.patchValue({
- recalculationRestFrequencyDate: this.datePipe.transform(prevRestFrequencyDate, dateFormat)
- });
- }
return this.loanProductSettingsForm.value;
}
diff --git a/src/app/products/loan-products/loan-product-stepper/loan-product-terms-step/loan-product-terms-step.component.ts b/src/app/products/loan-products/loan-product-stepper/loan-product-terms-step/loan-product-terms-step.component.ts
index aed23e309..eef99c16b 100644
--- a/src/app/products/loan-products/loan-product-stepper/loan-product-terms-step/loan-product-terms-step.component.ts
+++ b/src/app/products/loan-products/loan-product-stepper/loan-product-terms-step/loan-product-terms-step.component.ts
@@ -38,10 +38,37 @@ export class LoanProductTermsStepComponent implements OnInit {
this.floatingRateData = this.loanProductsTemplate.floatingRateOptions;
this.interestRateFrequencyTypeData = this.loanProductsTemplate.interestRateFrequencyTypeOptions;
this.repaymentFrequencyTypeData = this.loanProductsTemplate.repaymentFrequencyTypeOptions;
+
this.loanProductTermsForm.patchValue({
- 'interestRateFrequencyType': this.interestRateFrequencyTypeData[0].id,
- 'repaymentFrequencyType': this.repaymentFrequencyTypeData[0].id
+ 'minPrincipal': this.loanProductsTemplate.minPrincipal,
+ 'principal': this.loanProductsTemplate.principal,
+ 'maxPrincipal': this.loanProductsTemplate.maxPrincipal,
+ 'minNumberOfRepayments': this.loanProductsTemplate.minNumberOfRepayments,
+ 'numberOfRepayments': this.loanProductsTemplate.numberOfRepayments,
+ 'maxNumberOfRepayments': this.loanProductsTemplate.maxNumberOfRepayments,
+ 'isLinkedToFloatingInterestRates': this.loanProductsTemplate.isLinkedToFloatingInterestRates,
+ 'minInterestRatePerPeriod': this.loanProductsTemplate.minInterestRatePerPeriod,
+ 'interestRatePerPeriod': this.loanProductsTemplate.interestRatePerPeriod,
+ 'maxInterestRatePerPeriod': this.loanProductsTemplate.maxInterestRatePerPeriod,
+ 'interestRateFrequencyType': this.loanProductsTemplate.interestRateFrequencyType.id,
+ 'floatingRatesId': this.loanProductsTemplate.floatingRateId,
+ 'interestRateDifferential': this.loanProductsTemplate.interestRateDifferential,
+ 'isFloatingInterestRateCalculationAllowed': this.loanProductsTemplate.isFloatingInterestRateCalculationAllowed,
+ 'minDifferentialLendingRate': this.loanProductsTemplate.minDifferentialLendingRate,
+ 'defaultDifferentialLendingRate': this.loanProductsTemplate.defaultDifferentialLendingRate,
+ 'maxDifferentialLendingRate': this.loanProductsTemplate.maxDifferentialLendingRate,
+ 'useBorrowerCycle': this.loanProductsTemplate.useBorrowerCycle,
+ 'repaymentEvery': this.loanProductsTemplate.repaymentEvery,
+ 'repaymentFrequencyType': this.loanProductsTemplate.repaymentFrequencyType.id,
+ 'minimumDaysBetweenDisbursalAndFirstRepayment': this.loanProductsTemplate.minimumDaysBetweenDisbursalAndFirstRepayment
});
+
+ this.loanProductTermsForm.setControl('principalVariationsForBorrowerCycle',
+ this.formBuilder.array(this.loanProductsTemplate.principalVariationsForBorrowerCycle.map((variation: any) => ({ ...variation, valueConditionType: variation.valueConditionType.id }))));
+ this.loanProductTermsForm.setControl('numberOfRepaymentVariationsForBorrowerCycle',
+ this.formBuilder.array(this.loanProductsTemplate.numberOfRepaymentVariationsForBorrowerCycle.map((variation: any) => ({ ...variation, valueConditionType: variation.valueConditionType.id }))));
+ this.loanProductTermsForm.setControl('interestRateVariationsForBorrowerCycle',
+ this.formBuilder.array(this.loanProductsTemplate.interestRateVariationsForBorrowerCycle.map((variation: any) => ({ ...variation, valueConditionType: variation.valueConditionType.id }))));
}
createLoanProductTermsForm() {
@@ -82,7 +109,7 @@ export class LoanProductTermsStepComponent implements OnInit {
this.loanProductTermsForm.addControl('minInterestRatePerPeriod', new FormControl(''));
this.loanProductTermsForm.addControl('interestRatePerPeriod', new FormControl('', Validators.required));
this.loanProductTermsForm.addControl('maxInterestRatePerPeriod', new FormControl(''));
- this.loanProductTermsForm.addControl('interestRateFrequencyType', new FormControl(this.interestRateFrequencyTypeData[0].id, Validators.required));
+ this.loanProductTermsForm.addControl('interestRateFrequencyType', new FormControl(this.interestRateFrequencyTypeData.id, Validators.required));
this.loanProductTermsForm.removeControl('floatingRatesId');
this.loanProductTermsForm.removeControl('interestRateDifferential');
this.loanProductTermsForm.removeControl('isFloatingInterestRateCalculationAllowed');
@@ -118,12 +145,19 @@ export class LoanProductTermsStepComponent implements OnInit {
return this.loanProductTermsForm.get('interestRateVariationsForBorrowerCycle') as FormArray;
}
+ setLoanProductTermsFormDirty() {
+ if (this.loanProductTermsForm.pristine) {
+ this.loanProductTermsForm.markAsDirty();
+ }
+ }
+
addVariationsForBorrowerCycle(formType: string, variationsForBorrowerCycleFormArray: FormArray) {
const data = this.getData(formType);
const addVariationsForBorrowerCycleDialogRef = this.dialog.open(FormDialogComponent, { data });
addVariationsForBorrowerCycleDialogRef.afterClosed().subscribe((response: any) => {
if (response.data) {
variationsForBorrowerCycleFormArray.push(response.data);
+ this.setLoanProductTermsFormDirty();
}
});
}
@@ -134,6 +168,7 @@ export class LoanProductTermsStepComponent implements OnInit {
addVariationsForBorrowerCycleDialogRef.afterClosed().subscribe((response: any) => {
if (response.data) {
variationsForBorrowerCycleFormArray.at(index).patchValue(response.data.value);
+ this.setLoanProductTermsFormDirty();
}
});
}
@@ -145,6 +180,7 @@ export class LoanProductTermsStepComponent implements OnInit {
deleteVariationsForBorrowerCycleDialogRef.afterClosed().subscribe((response: any) => {
if (response.delete) {
variationsForBorrowerCycleFormArray.removeAt(index);
+ this.setLoanProductTermsFormDirty();
}
});
}
diff --git a/src/app/products/loan-products/view-loan-product/view-loan-product.component.html b/src/app/products/loan-products/view-loan-product/view-loan-product.component.html
index 48e4e2fcb..f2ea80dcd 100644
--- a/src/app/products/loan-products/view-loan-product/view-loan-product.component.html
+++ b/src/app/products/loan-products/view-loan-product/view-loan-product.component.html
@@ -1,5 +1,5 @@
-