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
+1 -1
View File
@@ -63,7 +63,7 @@ export class HomeComponent implements OnInit, AfterViewInit {
private router: Router,
private dialog: MatDialog,
private configurationWizardService: ConfigurationWizardService,
private popoverService: PopoverService,) { }
private popoverService: PopoverService) { }
/**
* Sets the username of the authenticated user.
+1 -1
View File
@@ -14,7 +14,7 @@ import { AmountCollectedPieComponent } from './dashboard/amount-collected-pie/am
import { AmountDisbursedPieComponent } from './dashboard/amount-disbursed-pie/amount-disbursed-pie.component';
import { ClientTrendsBarComponent } from './dashboard/client-trends-bar/client-trends-bar.component';
import { TranslateModule } from '@ngx-translate/core';
import { WarningDialogComponent } from './warning-dialog/warning-dialog.component'
import { WarningDialogComponent } from './warning-dialog/warning-dialog.component';
/**
* Home Component
@@ -3,7 +3,7 @@ import { MatDialogRef } from '@angular/material/dialog';
import { environment } from '../../../environments/environment';
@Component({
selector: 'mifos-warning-dialog',
selector: 'mifosx-warning-dialog',
templateUrl: './warning-dialog.component.html',
styleUrls: ['./warning-dialog.component.scss']
})
@@ -22,4 +22,4 @@ export class WarningDialogComponent implements OnInit {
ngOnInit() {
}
}
}
@@ -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,