Remark Loan Product attribute values set by default from global configurations (#1890)

Co-authored-by: Jose Alberto Hernandez <alberto@blue-daemon.local>
This commit is contained in:
José Alberto Hernández
2023-11-05 16:31:44 -06:00
committed by GitHub
co-authored by Jose Alberto Hernandez
parent 4d56a0ac73
commit 38cc44e5db
8 changed files with 54 additions and 80 deletions
@@ -125,6 +125,11 @@ export class CreateLoanProductComponent implements OnInit {
submit() {
const loanProduct = this.loanProducts.buildPayload(this.loanProduct, this.itemsByDefault);
if (loanProduct['useDueForRepaymentsConfigurations'] === true) {
loanProduct['dueDaysForRepaymentEvent'] = null;
loanProduct['overDueDaysForRepaymentEvent'] = null;
}
delete loanProduct['useDueForRepaymentsConfigurations'];
this.productsService.createLoanProduct(loanProduct)
.subscribe((response: any) => {
@@ -142,6 +142,11 @@ export class EditLoanProductComponent implements OnInit {
submit() {
const loanProduct = this.loanProducts.buildPayload(this.loanProduct, this.itemsByDefault);
if (loanProduct['useDueForRepaymentsConfigurations'] === true) {
loanProduct['dueDaysForRepaymentEvent'] = null;
loanProduct['overDueDaysForRepaymentEvent'] = null;
}
delete loanProduct['useDueForRepaymentsConfigurations'];
this.productsService.updateLoanProduct(this.loanProductAndTemplate.id, loanProduct)
.subscribe((response: any) => {
@@ -4,18 +4,6 @@ import { LoanProducts } from '../../loan-products';
import { rangeValidator } from 'app/shared/validators/percentage.validator';
import { GlobalConfiguration } from 'app/system/configurations/global-configurations-tab/configuration.model';
interface DaysData {
days: number;
label: string;
style: string;
}
interface DaysForRepayment {
days: DaysData[];
code: string;
config: GlobalConfiguration;
style: string;
}
@Component({
selector: 'mifosx-loan-product-settings-step',
@@ -51,7 +39,6 @@ export class LoanProductSettingsStepComponent implements OnInit {
/** Values to Days for Repayments */
defaultConfigValues: GlobalConfiguration[] = [];
daysForRepayments: DaysForRepayment[] = [];
constructor(private formBuilder: UntypedFormBuilder) {
this.createLoanProductSettingsForm();
@@ -60,26 +47,6 @@ export class LoanProductSettingsStepComponent implements OnInit {
ngOnInit() {
this.defaultConfigValues = this.loanProductsTemplate['itemsByDefault'];
this.defaultConfigValues.forEach((config: GlobalConfiguration) => {
const days: DaysData[] = [];
[...Array(10).keys()].forEach((day: number) => {
let label: string = day.toString();
let style = '';
if (day === config.value) {
label = day + ' *';
style = 'by-default';
}
days.push({days: day, label: label, style: style});
});
this.daysForRepayments.push({
days: days,
code: config.name,
config: config,
style: ''
});
});
this.isLinkedToFloatingInterestRates.valueChanges
.subscribe((isLinkedToFloatingInterestRates: any) => {
if (isLinkedToFloatingInterestRates) {
@@ -133,10 +100,24 @@ export class LoanProductSettingsStepComponent implements OnInit {
'maxTrancheCount': this.loanProductsTemplate.maxTrancheCount,
'outstandingLoanBalance': this.loanProductsTemplate.outstandingLoanBalance,
'enableDownPayment': this.loanProductsTemplate.enableDownPayment,
'enableInstallmentLevelDelinquency': this.loanProductsTemplate.enableInstallmentLevelDelinquency,
'useDueForRepaymentsConfigurations': this.loanProductsTemplate.useDueForRepaymentsConfigurations
'enableInstallmentLevelDelinquency': this.loanProductsTemplate.enableInstallmentLevelDelinquency
});
if (this.loanProductsTemplate.dueDaysForRepaymentEvent != null &&
this.loanProductsTemplate.overDueDaysForRepaymentEvent != null) {
this.loanProductSettingsForm.patchValue({
'useDueForRepaymentsConfigurations': false,
'dueDaysForRepaymentEvent': this.loanProductsTemplate.dueDaysForRepaymentEvent,
'overDueDaysForRepaymentEvent': this.loanProductsTemplate.overDueDaysForRepaymentEvent
});
} else {
this.loanProductSettingsForm.patchValue({
'useDueForRepaymentsConfigurations': true,
'dueDaysForRepaymentEvent': null,
'overDueDaysForRepaymentEvent': null
});
}
if (this.loanProductsTemplate.delinquencyBucket) {
this.loanProductSettingsForm.patchValue({
'delinquencyBucketId': this.loanProductsTemplate.delinquencyBucket.id
@@ -240,7 +221,9 @@ export class LoanProductSettingsStepComponent implements OnInit {
'delinquencyBucketId': ['', Validators.required],
'enableDownPayment': [false],
'enableInstallmentLevelDelinquency': [false],
'useDueForRepaymentsConfigurations': [false]
'useDueForRepaymentsConfigurations': [false],
'dueDaysForRepaymentEvent': [''],
'overDueDaysForRepaymentEvent': [''],
});
}
@@ -433,49 +416,27 @@ export class LoanProductSettingsStepComponent implements OnInit {
this.loanProductSettingsForm.get('useDueForRepaymentsConfigurations').valueChanges
.subscribe((useDueForRepaymentsConfigurations: boolean) => {
if (useDueForRepaymentsConfigurations) {
this.loanProductSettingsForm.removeControl('dueDaysForRepaymentEvent');
this.loanProductSettingsForm.removeControl('overDueDaysForRepaymentEvent');
this.loanProductSettingsForm.patchValue({
'dueDaysForRepaymentEvent': null,
'overDueDaysForRepaymentEvent': null
});
} else {
this.loanProductSettingsForm.addControl('dueDaysForRepaymentEvent',
new UntypedFormControl(this.loanProductsTemplate.dueDaysForRepaymentEvent, [Validators.required, rangeValidator(1, 100) ]));
this.loanProductSettingsForm.addControl('overDueDaysForRepaymentEvent',
new UntypedFormControl(this.loanProductsTemplate.overDueDaysForRepaymentEvent, [Validators.required, rangeValidator(1, 100) ]));
}
});
}
setStyleDaysForRepayment(attribute: string, currentValue: number): void {
const currentValues: DaysForRepayment[] = this.daysForRepayments;
this.daysForRepayments = [];
currentValues.forEach((dfr: DaysForRepayment) => {
if (dfr.code === attribute) {
dfr.days.forEach((days: DaysData) => {
if (days.days === currentValue) {
dfr.style = days.style;
}
this.loanProductSettingsForm.patchValue({
'dueDaysForRepaymentEvent': this.getGlobalConfigValue(LoanProducts.DAYS_BEFORE_REPAYMENT_IS_DUE),
'overDueDaysForRepaymentEvent': this.getGlobalConfigValue(LoanProducts.DAYS_AFTER_REPAYMENT_IS_OVERDUE)
});
}
this.daysForRepayments.push(dfr);
});
}
styleDaysForRepayment(attribute: string): string {
this.daysForRepayments.forEach((item: DaysForRepayment) => {
if (item.code === attribute) {
return item.style;
private getGlobalConfigValue(configName: string): number {
let value: number | null = null;
this.defaultConfigValues.forEach((config: GlobalConfiguration) => {
if (config.name === configName) {
value = config.value;
}
});
return '';
}
getDaysForRepayments(attribute: string): DaysData[] {
let days: DaysData[] = [];
this.daysForRepayments.forEach((item: DaysForRepayment) => {
if (item.code === attribute) {
days = item.days;
}
});
return days;
return value;
}
get loanProductSettings() {
@@ -484,8 +445,8 @@ export class LoanProductSettingsStepComponent implements OnInit {
delete productSettings['disableScheduleExtensionForDownPayment'];
}
if (this.loanProductSettingsForm.value.useDueForRepaymentsConfigurations) {
delete productSettings['dueDaysForRepaymentEvent'];
delete productSettings['overDueDaysForRepaymentEvent'];
productSettings['dueDaysForRepaymentEvent'] = null;
productSettings['overDueDaysForRepaymentEvent'] = null;
}
return productSettings;
}
@@ -563,15 +563,15 @@
<div fxFlexFill>
<span fxFlex="40%">Use the Global Configurations values to the Repayment Event (notifications):</span>
<span fxFlex="60%">{{ loanProduct.useDueForRepaymentsConfigurations | yesNo }}</span>
<span fxFlex="60%">{{ useDueForRepaymentsConfigurations | yesNo }}</span>
</div>
<div fxFlexFill *ngIf="!loanProduct.useDueForRepaymentsConfigurations">
<div fxFlexFill *ngIf="loanProduct.dueDaysForRepaymentEvent">
<span fxFlex="40%">Due days for repayment event:</span>
<span fxFlex="60%">{{ loanProduct.dueDaysForRepaymentEvent | number }}</span>
</div>
<div fxFlexFill *ngIf="!loanProduct.useDueForRepaymentsConfigurations">
<div fxFlexFill *ngIf="loanProduct.overDueDaysForRepaymentEvent">
<span fxFlex="40%">OverDue days for repayment event:</span>
<span fxFlex="60%">{{ loanProduct.overDueDaysForRepaymentEvent | number }}</span>
</div>
@@ -18,9 +18,12 @@ export class GeneralTabComponent implements OnInit {
advancePaymentAllocationData: AdvancePaymentAllocationData;
useDueForRepaymentsConfigurations = false;
constructor(private route: ActivatedRoute) {
this.route.data.subscribe((data: { loanProduct: any }) => {
this.loanProduct = data.loanProduct;
this.useDueForRepaymentsConfigurations = (!this.loanProduct.dueDaysForRepaymentEvent && !this.loanProduct.overDueDaysForRepaymentEvent);
this.advancePaymentAllocationData = {
transactionTypes: this.loanProduct.advancedPaymentAllocationTransactionTypes,
allocationTypes: this.loanProduct.advancedPaymentAllocationTypes,