Loan Interest Pauses management to Edit or Delete
This commit is contained in:
committed by
Jose Alberto Hernandez
parent
b729898147
commit
9d6cf1514a
+3
@@ -1,5 +1,8 @@
|
|||||||
<div class="container mat-elevation-z8">
|
<div class="container mat-elevation-z8">
|
||||||
<mat-card>
|
<mat-card>
|
||||||
|
<div class="m-b-20" fxLayout="column" *ngIf="maturityDate">
|
||||||
|
<span class="m-r-10">{{'Maturity Date' | translateKey:'inputs'}} : {{ maturityDate | dateFormat}}</span>
|
||||||
|
</div>
|
||||||
<form [formGroup]="interestPauseLoanForm" (ngSubmit)="submit()">
|
<form [formGroup]="interestPauseLoanForm" (ngSubmit)="submit()">
|
||||||
<mat-card-content>
|
<mat-card-content>
|
||||||
<div fxLayout="column">
|
<div fxLayout="column">
|
||||||
|
|||||||
+3
-3
@@ -24,6 +24,7 @@ export class AddInterestPauseComponent implements OnInit {
|
|||||||
/** Maximum Date allowed. */
|
/** Maximum Date allowed. */
|
||||||
maxDate = new Date();
|
maxDate = new Date();
|
||||||
startDate = new Date();
|
startDate = new Date();
|
||||||
|
maturityDate: Date | null = null;
|
||||||
/** Interest Pause Loan Form */
|
/** Interest Pause Loan Form */
|
||||||
interestPauseLoanForm: UntypedFormGroup;
|
interestPauseLoanForm: UntypedFormGroup;
|
||||||
|
|
||||||
@@ -49,11 +50,10 @@ export class AddInterestPauseComponent implements OnInit {
|
|||||||
* and initialize with the required values
|
* and initialize with the required values
|
||||||
*/
|
*/
|
||||||
ngOnInit() {
|
ngOnInit() {
|
||||||
|
this.maturityDate = new Date(this.dataObject.timeline.expectedMaturityDate);
|
||||||
this.maxDate = new Date(this.dataObject.timeline.expectedMaturityDate);
|
this.maxDate = new Date(this.dataObject.timeline.expectedMaturityDate);
|
||||||
this.startDate = new Date(this.settingsService.businessDate);
|
this.startDate = new Date(this.settingsService.businessDate);
|
||||||
if (this.startDate < this.maxDate) {
|
if (this.startDate > this.maxDate) {
|
||||||
this.maxDate = this.startDate;
|
|
||||||
} else {
|
|
||||||
this.startDate = this.maxDate;
|
this.startDate = this.maxDate;
|
||||||
}
|
}
|
||||||
this.createInterestPauseLoanForm();
|
this.createInterestPauseLoanForm();
|
||||||
|
|||||||
@@ -159,10 +159,6 @@ export class LoansAccountButtonConfiguration {
|
|||||||
switch (status) {
|
switch (status) {
|
||||||
case 'Active':
|
case 'Active':
|
||||||
this.optionArray = [
|
this.optionArray = [
|
||||||
{
|
|
||||||
name: 'Add Interest Pause',
|
|
||||||
taskPermissionName: 'CREATE_INTEREST_PAUSE',
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
name: 'Waive Interest',
|
name: 'Waive Interest',
|
||||||
taskPermissionName: 'WAIVEINTERESTPORTION_LOAN',
|
taskPermissionName: 'WAIVEINTERESTPORTION_LOAN',
|
||||||
|
|||||||
+17
-1
@@ -23,7 +23,7 @@
|
|||||||
<tr mat-row *matRowDef="let row; columns: loanDTermVariationsColumns;"></tr>
|
<tr mat-row *matRowDef="let row; columns: loanDTermVariationsColumns;"></tr>
|
||||||
</table>
|
</table>
|
||||||
|
|
||||||
<h3 class="m-t-20">{{ 'labels.heading.Interest Pauses' | translate }}</h3>
|
<h3 class="m-t-20" *ngIf="interestPausesData?.length > 0">{{ 'labels.heading.Interest Pauses' | translate }}</h3>
|
||||||
<table mat-table class="m-t-20" [dataSource]="interestPausesData" *ngIf="interestPausesData?.length > 0">
|
<table mat-table class="m-t-20" [dataSource]="interestPausesData" *ngIf="interestPausesData?.length > 0">
|
||||||
<ng-container matColumnDef="row">
|
<ng-container matColumnDef="row">
|
||||||
<th mat-header-cell *matHeaderCellDef>#</th>
|
<th mat-header-cell *matHeaderCellDef>#</th>
|
||||||
@@ -45,6 +45,22 @@
|
|||||||
<td mat-cell *matCellDef="let item">{{ item.days | formatNumber }}</td>
|
<td mat-cell *matCellDef="let item">{{ item.days | formatNumber }}</td>
|
||||||
</ng-container>
|
</ng-container>
|
||||||
|
|
||||||
|
<ng-container matColumnDef="actions">
|
||||||
|
<th mat-header-cell *matHeaderCellDef>{{ 'labels.inputs.Actions' | translate }}</th>
|
||||||
|
<td mat-cell *matCellDef="let item">
|
||||||
|
<button class="button" mat-icon-button color="primary"
|
||||||
|
matTooltip="{{ 'tooltips.Edit' | translate }}" matTooltipPosition="right"
|
||||||
|
(click)="manageRequest(item, 'Edit')">
|
||||||
|
<fa-icon icon="edit" size="lg"></fa-icon>
|
||||||
|
</button>
|
||||||
|
<button class="button" mat-icon-button color="warn"
|
||||||
|
matTooltip="{{ 'tooltips.Delete' | translate }}" matTooltipPosition="left"
|
||||||
|
(click)="manageRequest(item, 'Delete')">
|
||||||
|
<fa-icon icon="trash" size="lg"></fa-icon>
|
||||||
|
</button>
|
||||||
|
</td>
|
||||||
|
</ng-container>
|
||||||
|
|
||||||
<tr mat-header-row *matHeaderRowDef="interestPausesColumns"></tr>
|
<tr mat-header-row *matHeaderRowDef="interestPausesColumns"></tr>
|
||||||
<tr mat-row *matRowDef="let row; columns: interestPausesColumns"></tr>
|
<tr mat-row *matRowDef="let row; columns: interestPausesColumns"></tr>
|
||||||
</table>
|
</table>
|
||||||
|
|||||||
+7
@@ -1,5 +1,12 @@
|
|||||||
table {
|
table {
|
||||||
width: 100%;
|
width: 100%;
|
||||||
|
|
||||||
|
.action-button {
|
||||||
|
min-width: 26px;
|
||||||
|
padding: 0 0 3px;
|
||||||
|
margin: 0 2%;
|
||||||
|
line-height: 25px;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.container {
|
.container {
|
||||||
|
|||||||
+92
-3
@@ -1,6 +1,14 @@
|
|||||||
import { Component } from '@angular/core';
|
import { Component } from '@angular/core';
|
||||||
import { ActivatedRoute } from '@angular/router';
|
import { MatDialog } from '@angular/material/dialog';
|
||||||
|
import { ActivatedRoute, Router } from '@angular/router';
|
||||||
import { Dates } from 'app/core/utils/dates';
|
import { Dates } from 'app/core/utils/dates';
|
||||||
|
import { LoansService } from 'app/loans/loans.service';
|
||||||
|
import { SettingsService } from 'app/settings/settings.service';
|
||||||
|
import { DeleteDialogComponent } from 'app/shared/delete-dialog/delete-dialog.component';
|
||||||
|
import { FormDialogComponent } from 'app/shared/form-dialog/form-dialog.component';
|
||||||
|
import { DatepickerBase } from 'app/shared/form-dialog/formfield/model/datepicker-base';
|
||||||
|
import { FormfieldBase } from 'app/shared/form-dialog/formfield/model/formfield-base';
|
||||||
|
import { AnyKindOfDictionary } from 'cypress/types/lodash';
|
||||||
|
|
||||||
@Component({
|
@Component({
|
||||||
selector: 'mifosx-loan-term-variations-tab',
|
selector: 'mifosx-loan-term-variations-tab',
|
||||||
@@ -14,13 +22,22 @@ export class LoanTermVariationsTabComponent {
|
|||||||
loanDTermVariationsColumns: string[] = ['termType', 'applicableFrom', 'value', 'specificToInstallment'];
|
loanDTermVariationsColumns: string[] = ['termType', 'applicableFrom', 'value', 'specificToInstallment'];
|
||||||
/** Interest Pauses Data */
|
/** Interest Pauses Data */
|
||||||
interestPausesData: any[] = [];
|
interestPausesData: any[] = [];
|
||||||
interestPausesColumns: string[] = ['row', 'startDate', 'endDate', 'days'];
|
interestPausesColumns: string[] = ['row', 'startDate', 'endDate', 'days', 'actions'];
|
||||||
|
|
||||||
|
loanId: number;
|
||||||
|
clientId: AnyKindOfDictionary;
|
||||||
|
|
||||||
constructor(private route: ActivatedRoute,
|
constructor(private route: ActivatedRoute,
|
||||||
private dates: Dates
|
private router: Router,
|
||||||
|
private dates: Dates,
|
||||||
|
private settingsService: SettingsService,
|
||||||
|
private loansService: LoansService,
|
||||||
|
private dialog: MatDialog
|
||||||
) {
|
) {
|
||||||
this.interestPausesData = [];
|
this.interestPausesData = [];
|
||||||
|
this.clientId = this.route.parent.parent.snapshot.paramMap.get('clientId');
|
||||||
this.route.data.subscribe((data: { loanDetailsData: any, interestPausesData: any }) => {
|
this.route.data.subscribe((data: { loanDetailsData: any, interestPausesData: any }) => {
|
||||||
|
this.loanId = data.loanDetailsData.id;
|
||||||
this.loanTermVariationsData = data.loanDetailsData.loanTermVariations;
|
this.loanTermVariationsData = data.loanDetailsData.loanTermVariations;
|
||||||
this.interestPausesData = [];
|
this.interestPausesData = [];
|
||||||
data.interestPausesData?.forEach((item: any) => {
|
data.interestPausesData?.forEach((item: any) => {
|
||||||
@@ -29,4 +46,76 @@ export class LoanTermVariationsTabComponent {
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
manageRequest(variation: any, action: string) {
|
||||||
|
if (action === 'Delete') {
|
||||||
|
this.deleteInterestPause(variation);
|
||||||
|
} else if (action === 'Edit') {
|
||||||
|
this.updateInterestPause(variation);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
deleteInterestPause(variation: any) {
|
||||||
|
const deleteStandingInstructionDialogRef = this.dialog.open(DeleteDialogComponent, {
|
||||||
|
data: { deleteContext: `interest pause from ${variation.startDate} to ${variation.endDate}` }
|
||||||
|
});
|
||||||
|
deleteStandingInstructionDialogRef.afterClosed().subscribe((response: any) => {
|
||||||
|
if (response.delete) {
|
||||||
|
this.loansService.deleteInterestPause(this.loanId, variation.id).subscribe((response: any) => {
|
||||||
|
this.reload();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
updateInterestPause(variation: any) {
|
||||||
|
const startDate: Date = this.dates.parseDate(variation.startDate);
|
||||||
|
const endDate: Date = this.dates.parseDate(variation.endDate);
|
||||||
|
const formfields: FormfieldBase[] = [
|
||||||
|
new DatepickerBase({
|
||||||
|
controlName: 'startDate',
|
||||||
|
label: 'Start Date',
|
||||||
|
value: startDate,
|
||||||
|
maxDate: this.settingsService.maxFutureDate,
|
||||||
|
required: true
|
||||||
|
}),
|
||||||
|
new DatepickerBase({
|
||||||
|
controlName: 'endDate',
|
||||||
|
label: 'End Date',
|
||||||
|
value: endDate,
|
||||||
|
maxDate: this.settingsService.maxFutureDate,
|
||||||
|
required: true
|
||||||
|
}),
|
||||||
|
];
|
||||||
|
|
||||||
|
const data = {
|
||||||
|
title: 'Edit Interest Pause id: ' + variation.id,
|
||||||
|
formfields: formfields,
|
||||||
|
layout: { addButtonText: 'Submit' }
|
||||||
|
};
|
||||||
|
const editDialogRef = this.dialog.open(FormDialogComponent, { data, width: '50rem' });
|
||||||
|
editDialogRef.afterClosed().subscribe((response: any) => {
|
||||||
|
if (response.data) {
|
||||||
|
if (response.data.value.startDate <= response.data.value.endDate) {
|
||||||
|
const locale = this.settingsService.language.code;
|
||||||
|
const dateFormat = this.settingsService.dateFormat;
|
||||||
|
const payload = {
|
||||||
|
startDate: this.dates.formatDate(response.data.value.startDate, dateFormat),
|
||||||
|
endDate: this.dates.formatDate(response.data.value.endDate, dateFormat),
|
||||||
|
locale,
|
||||||
|
dateFormat
|
||||||
|
}
|
||||||
|
this.loansService.updateInterestPause(this.loanId, variation.id, payload).subscribe((response: any) => {
|
||||||
|
this.reload();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
private reload() {
|
||||||
|
const url: string = this.router.url;
|
||||||
|
this.router.navigateByUrl(`/clients/${this.clientId}/loans-accounts`, { skipLocationChange: true })
|
||||||
|
.then(() => this.router.navigate([url]));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -151,6 +151,13 @@ export class LoansViewComponent implements OnInit {
|
|||||||
taskPermissionName: 'DISBURSALLASTUNDO_LOAN'
|
taskPermissionName: 'DISBURSALLASTUNDO_LOAN'
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
if (this.recalculateInterest) {
|
||||||
|
this.buttonConfig.addButton({
|
||||||
|
name: 'Add Interest Pause',
|
||||||
|
icon: 'calendar',
|
||||||
|
taskPermissionName: 'CREATE_INTEREST_PAUSE'
|
||||||
|
});
|
||||||
|
}
|
||||||
// loan officer not assigned to loan, below logic
|
// loan officer not assigned to loan, below logic
|
||||||
// helps to display otherwise not
|
// helps to display otherwise not
|
||||||
if (!this.loanDetailsData.loanOfficerName) {
|
if (!this.loanDetailsData.loanOfficerName) {
|
||||||
|
|||||||
@@ -285,6 +285,14 @@ export class LoansService {
|
|||||||
return this.http.get(`/loans/${loanId}/interest-pauses`);
|
return this.http.get(`/loans/${loanId}/interest-pauses`);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
updateInterestPause(loanId: number, variationId: number, data?: any): Observable<any> {
|
||||||
|
return this.http.put(`/loans/${loanId}/interest-pauses/${variationId}`, data);
|
||||||
|
}
|
||||||
|
|
||||||
|
deleteInterestPause(loanId: number, variationId: number): Observable<any> {
|
||||||
|
return this.http.delete(`/loans/${loanId}/interest-pauses/${variationId}`);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param {string|number} loanId Loan Id.
|
* @param {string|number} loanId Loan Id.
|
||||||
* @param {any} foreclosuredata ForeClosure Data
|
* @param {any} foreclosuredata ForeClosure Data
|
||||||
|
|||||||
Reference in New Issue
Block a user