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:
co-authored by
Jose Alberto Hernandez
parent
4d56a0ac73
commit
38cc44e5db
@@ -63,7 +63,7 @@ export class HomeComponent implements OnInit, AfterViewInit {
|
|||||||
private router: Router,
|
private router: Router,
|
||||||
private dialog: MatDialog,
|
private dialog: MatDialog,
|
||||||
private configurationWizardService: ConfigurationWizardService,
|
private configurationWizardService: ConfigurationWizardService,
|
||||||
private popoverService: PopoverService,) { }
|
private popoverService: PopoverService) { }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Sets the username of the authenticated user.
|
* Sets the username of the authenticated user.
|
||||||
|
|||||||
@@ -14,7 +14,7 @@ import { AmountCollectedPieComponent } from './dashboard/amount-collected-pie/am
|
|||||||
import { AmountDisbursedPieComponent } from './dashboard/amount-disbursed-pie/amount-disbursed-pie.component';
|
import { AmountDisbursedPieComponent } from './dashboard/amount-disbursed-pie/amount-disbursed-pie.component';
|
||||||
import { ClientTrendsBarComponent } from './dashboard/client-trends-bar/client-trends-bar.component';
|
import { ClientTrendsBarComponent } from './dashboard/client-trends-bar/client-trends-bar.component';
|
||||||
import { TranslateModule } from '@ngx-translate/core';
|
import { TranslateModule } from '@ngx-translate/core';
|
||||||
import { WarningDialogComponent } from './warning-dialog/warning-dialog.component'
|
import { WarningDialogComponent } from './warning-dialog/warning-dialog.component';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Home Component
|
* Home Component
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ import { MatDialogRef } from '@angular/material/dialog';
|
|||||||
import { environment } from '../../../environments/environment';
|
import { environment } from '../../../environments/environment';
|
||||||
|
|
||||||
@Component({
|
@Component({
|
||||||
selector: 'mifos-warning-dialog',
|
selector: 'mifosx-warning-dialog',
|
||||||
templateUrl: './warning-dialog.component.html',
|
templateUrl: './warning-dialog.component.html',
|
||||||
styleUrls: ['./warning-dialog.component.scss']
|
styleUrls: ['./warning-dialog.component.scss']
|
||||||
})
|
})
|
||||||
@@ -22,4 +22,4 @@ export class WarningDialogComponent implements OnInit {
|
|||||||
ngOnInit() {
|
ngOnInit() {
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -125,6 +125,11 @@ export class CreateLoanProductComponent implements OnInit {
|
|||||||
|
|
||||||
submit() {
|
submit() {
|
||||||
const loanProduct = this.loanProducts.buildPayload(this.loanProduct, this.itemsByDefault);
|
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)
|
this.productsService.createLoanProduct(loanProduct)
|
||||||
.subscribe((response: any) => {
|
.subscribe((response: any) => {
|
||||||
|
|||||||
@@ -142,6 +142,11 @@ export class EditLoanProductComponent implements OnInit {
|
|||||||
|
|
||||||
submit() {
|
submit() {
|
||||||
const loanProduct = this.loanProducts.buildPayload(this.loanProduct, this.itemsByDefault);
|
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)
|
this.productsService.updateLoanProduct(this.loanProductAndTemplate.id, loanProduct)
|
||||||
.subscribe((response: any) => {
|
.subscribe((response: any) => {
|
||||||
|
|||||||
+34
-73
@@ -4,18 +4,6 @@ import { LoanProducts } from '../../loan-products';
|
|||||||
import { rangeValidator } from 'app/shared/validators/percentage.validator';
|
import { rangeValidator } from 'app/shared/validators/percentage.validator';
|
||||||
import { GlobalConfiguration } from 'app/system/configurations/global-configurations-tab/configuration.model';
|
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({
|
@Component({
|
||||||
selector: 'mifosx-loan-product-settings-step',
|
selector: 'mifosx-loan-product-settings-step',
|
||||||
@@ -51,7 +39,6 @@ export class LoanProductSettingsStepComponent implements OnInit {
|
|||||||
|
|
||||||
/** Values to Days for Repayments */
|
/** Values to Days for Repayments */
|
||||||
defaultConfigValues: GlobalConfiguration[] = [];
|
defaultConfigValues: GlobalConfiguration[] = [];
|
||||||
daysForRepayments: DaysForRepayment[] = [];
|
|
||||||
|
|
||||||
constructor(private formBuilder: UntypedFormBuilder) {
|
constructor(private formBuilder: UntypedFormBuilder) {
|
||||||
this.createLoanProductSettingsForm();
|
this.createLoanProductSettingsForm();
|
||||||
@@ -60,26 +47,6 @@ export class LoanProductSettingsStepComponent implements OnInit {
|
|||||||
|
|
||||||
ngOnInit() {
|
ngOnInit() {
|
||||||
this.defaultConfigValues = this.loanProductsTemplate['itemsByDefault'];
|
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
|
this.isLinkedToFloatingInterestRates.valueChanges
|
||||||
.subscribe((isLinkedToFloatingInterestRates: any) => {
|
.subscribe((isLinkedToFloatingInterestRates: any) => {
|
||||||
if (isLinkedToFloatingInterestRates) {
|
if (isLinkedToFloatingInterestRates) {
|
||||||
@@ -133,10 +100,24 @@ export class LoanProductSettingsStepComponent implements OnInit {
|
|||||||
'maxTrancheCount': this.loanProductsTemplate.maxTrancheCount,
|
'maxTrancheCount': this.loanProductsTemplate.maxTrancheCount,
|
||||||
'outstandingLoanBalance': this.loanProductsTemplate.outstandingLoanBalance,
|
'outstandingLoanBalance': this.loanProductsTemplate.outstandingLoanBalance,
|
||||||
'enableDownPayment': this.loanProductsTemplate.enableDownPayment,
|
'enableDownPayment': this.loanProductsTemplate.enableDownPayment,
|
||||||
'enableInstallmentLevelDelinquency': this.loanProductsTemplate.enableInstallmentLevelDelinquency,
|
'enableInstallmentLevelDelinquency': this.loanProductsTemplate.enableInstallmentLevelDelinquency
|
||||||
'useDueForRepaymentsConfigurations': this.loanProductsTemplate.useDueForRepaymentsConfigurations
|
|
||||||
});
|
});
|
||||||
|
|
||||||
|
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) {
|
if (this.loanProductsTemplate.delinquencyBucket) {
|
||||||
this.loanProductSettingsForm.patchValue({
|
this.loanProductSettingsForm.patchValue({
|
||||||
'delinquencyBucketId': this.loanProductsTemplate.delinquencyBucket.id
|
'delinquencyBucketId': this.loanProductsTemplate.delinquencyBucket.id
|
||||||
@@ -240,7 +221,9 @@ export class LoanProductSettingsStepComponent implements OnInit {
|
|||||||
'delinquencyBucketId': ['', Validators.required],
|
'delinquencyBucketId': ['', Validators.required],
|
||||||
'enableDownPayment': [false],
|
'enableDownPayment': [false],
|
||||||
'enableInstallmentLevelDelinquency': [false],
|
'enableInstallmentLevelDelinquency': [false],
|
||||||
'useDueForRepaymentsConfigurations': [false]
|
'useDueForRepaymentsConfigurations': [false],
|
||||||
|
'dueDaysForRepaymentEvent': [''],
|
||||||
|
'overDueDaysForRepaymentEvent': [''],
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -433,49 +416,27 @@ export class LoanProductSettingsStepComponent implements OnInit {
|
|||||||
this.loanProductSettingsForm.get('useDueForRepaymentsConfigurations').valueChanges
|
this.loanProductSettingsForm.get('useDueForRepaymentsConfigurations').valueChanges
|
||||||
.subscribe((useDueForRepaymentsConfigurations: boolean) => {
|
.subscribe((useDueForRepaymentsConfigurations: boolean) => {
|
||||||
if (useDueForRepaymentsConfigurations) {
|
if (useDueForRepaymentsConfigurations) {
|
||||||
this.loanProductSettingsForm.removeControl('dueDaysForRepaymentEvent');
|
this.loanProductSettingsForm.patchValue({
|
||||||
this.loanProductSettingsForm.removeControl('overDueDaysForRepaymentEvent');
|
'dueDaysForRepaymentEvent': null,
|
||||||
|
'overDueDaysForRepaymentEvent': null
|
||||||
|
});
|
||||||
} else {
|
} else {
|
||||||
this.loanProductSettingsForm.addControl('dueDaysForRepaymentEvent',
|
this.loanProductSettingsForm.patchValue({
|
||||||
new UntypedFormControl(this.loanProductsTemplate.dueDaysForRepaymentEvent, [Validators.required, rangeValidator(1, 100) ]));
|
'dueDaysForRepaymentEvent': this.getGlobalConfigValue(LoanProducts.DAYS_BEFORE_REPAYMENT_IS_DUE),
|
||||||
this.loanProductSettingsForm.addControl('overDueDaysForRepaymentEvent',
|
'overDueDaysForRepaymentEvent': this.getGlobalConfigValue(LoanProducts.DAYS_AFTER_REPAYMENT_IS_OVERDUE)
|
||||||
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.daysForRepayments.push(dfr);
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
styleDaysForRepayment(attribute: string): string {
|
private getGlobalConfigValue(configName: string): number {
|
||||||
this.daysForRepayments.forEach((item: DaysForRepayment) => {
|
let value: number | null = null;
|
||||||
if (item.code === attribute) {
|
this.defaultConfigValues.forEach((config: GlobalConfiguration) => {
|
||||||
return item.style;
|
if (config.name === configName) {
|
||||||
|
value = config.value;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
return '';
|
return value;
|
||||||
}
|
|
||||||
|
|
||||||
getDaysForRepayments(attribute: string): DaysData[] {
|
|
||||||
let days: DaysData[] = [];
|
|
||||||
this.daysForRepayments.forEach((item: DaysForRepayment) => {
|
|
||||||
if (item.code === attribute) {
|
|
||||||
days = item.days;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
return days;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
get loanProductSettings() {
|
get loanProductSettings() {
|
||||||
@@ -484,8 +445,8 @@ export class LoanProductSettingsStepComponent implements OnInit {
|
|||||||
delete productSettings['disableScheduleExtensionForDownPayment'];
|
delete productSettings['disableScheduleExtensionForDownPayment'];
|
||||||
}
|
}
|
||||||
if (this.loanProductSettingsForm.value.useDueForRepaymentsConfigurations) {
|
if (this.loanProductSettingsForm.value.useDueForRepaymentsConfigurations) {
|
||||||
delete productSettings['dueDaysForRepaymentEvent'];
|
productSettings['dueDaysForRepaymentEvent'] = null;
|
||||||
delete productSettings['overDueDaysForRepaymentEvent'];
|
productSettings['overDueDaysForRepaymentEvent'] = null;
|
||||||
}
|
}
|
||||||
return productSettings;
|
return productSettings;
|
||||||
}
|
}
|
||||||
|
|||||||
+3
-3
@@ -563,15 +563,15 @@
|
|||||||
|
|
||||||
<div fxFlexFill>
|
<div fxFlexFill>
|
||||||
<span fxFlex="40%">Use the Global Configurations values to the Repayment Event (notifications):</span>
|
<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>
|
||||||
|
|
||||||
<div fxFlexFill *ngIf="!loanProduct.useDueForRepaymentsConfigurations">
|
<div fxFlexFill *ngIf="loanProduct.dueDaysForRepaymentEvent">
|
||||||
<span fxFlex="40%">Due days for repayment event:</span>
|
<span fxFlex="40%">Due days for repayment event:</span>
|
||||||
<span fxFlex="60%">{{ loanProduct.dueDaysForRepaymentEvent | number }}</span>
|
<span fxFlex="60%">{{ loanProduct.dueDaysForRepaymentEvent | number }}</span>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div fxFlexFill *ngIf="!loanProduct.useDueForRepaymentsConfigurations">
|
<div fxFlexFill *ngIf="loanProduct.overDueDaysForRepaymentEvent">
|
||||||
<span fxFlex="40%">OverDue days for repayment event:</span>
|
<span fxFlex="40%">OverDue days for repayment event:</span>
|
||||||
<span fxFlex="60%">{{ loanProduct.overDueDaysForRepaymentEvent | number }}</span>
|
<span fxFlex="60%">{{ loanProduct.overDueDaysForRepaymentEvent | number }}</span>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -18,9 +18,12 @@ export class GeneralTabComponent implements OnInit {
|
|||||||
|
|
||||||
advancePaymentAllocationData: AdvancePaymentAllocationData;
|
advancePaymentAllocationData: AdvancePaymentAllocationData;
|
||||||
|
|
||||||
|
useDueForRepaymentsConfigurations = false;
|
||||||
|
|
||||||
constructor(private route: ActivatedRoute) {
|
constructor(private route: ActivatedRoute) {
|
||||||
this.route.data.subscribe((data: { loanProduct: any }) => {
|
this.route.data.subscribe((data: { loanProduct: any }) => {
|
||||||
this.loanProduct = data.loanProduct;
|
this.loanProduct = data.loanProduct;
|
||||||
|
this.useDueForRepaymentsConfigurations = (!this.loanProduct.dueDaysForRepaymentEvent && !this.loanProduct.overDueDaysForRepaymentEvent);
|
||||||
this.advancePaymentAllocationData = {
|
this.advancePaymentAllocationData = {
|
||||||
transactionTypes: this.loanProduct.advancedPaymentAllocationTransactionTypes,
|
transactionTypes: this.loanProduct.advancedPaymentAllocationTransactionTypes,
|
||||||
allocationTypes: this.loanProduct.advancedPaymentAllocationTypes,
|
allocationTypes: this.loanProduct.advancedPaymentAllocationTypes,
|
||||||
|
|||||||
Reference in New Issue
Block a user