Loan account term variations support for different term types
This commit is contained in:
+43
-75
@@ -1,84 +1,52 @@
|
||||
<div class="container">
|
||||
<h3>{{ 'labels.heading.Term Variations' | translate }}</h3>
|
||||
<table mat-table [dataSource]="loanTermVariationsData" *ngIf="loanTermVariationsData.length > 0">
|
||||
<ng-container matColumnDef="termType">
|
||||
<th mat-header-cell *matHeaderCellDef>{{ 'labels.inputs.Type' | translate }}</th>
|
||||
<td mat-cell *matCellDef="let item">{{ item.termType.value | translate }}</td>
|
||||
</ng-container>
|
||||
<div *ngFor="let loanTermVariation of loanTermVariationsData">
|
||||
|
||||
<ng-container matColumnDef="applicableFrom">
|
||||
<th mat-header-cell *matHeaderCellDef>{{ 'labels.inputs.Added On' | translate }}</th>
|
||||
<td mat-cell *matCellDef="let item">{{ item.termVariationApplicableFrom | dateFormat }}</td>
|
||||
</ng-container>
|
||||
<ng-container matColumnDef="value">
|
||||
<th mat-header-cell *matHeaderCellDef>{{ 'labels.inputs.Value' | translate }}</th>
|
||||
<td mat-cell *matCellDef="let item">{{ item.decimalValue | formatNumber }}</td>
|
||||
</ng-container>
|
||||
<h3 class="m-t-20">{{ 'labels.heading.' + loanTermVariation.label | translate }}</h3>
|
||||
<table mat-table [dataSource]="loanTermVariation.data">
|
||||
<ng-container matColumnDef="row">
|
||||
<th mat-header-cell *matHeaderCellDef>#</th>
|
||||
<td mat-cell *matCellDef="let item; let idx = index">{{ idx + 1 }}</td>
|
||||
</ng-container>
|
||||
|
||||
<ng-container matColumnDef="specificToInstallment">
|
||||
<th mat-header-cell *matHeaderCellDef>{{ 'labels.inputs.Specific to Installment' | translate }}</th>
|
||||
<td mat-cell *matCellDef="let item">{{ item.isSpecificToInstallment | yesNo }}</td>
|
||||
</ng-container>
|
||||
<tr mat-header-row *matHeaderRowDef="loanDTermVariationsColumns"></tr>
|
||||
<tr mat-row *matRowDef="let row; columns: loanDTermVariationsColumns"></tr>
|
||||
</table>
|
||||
<ng-container matColumnDef="startDate">
|
||||
<th mat-header-cell *matHeaderCellDef>{{ 'labels.inputs.Start Date' | translate }}</th>
|
||||
<td mat-cell *matCellDef="let item">{{ item.termVariationApplicableFrom | dateFormat }}</td>
|
||||
</ng-container>
|
||||
|
||||
<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">
|
||||
<ng-container matColumnDef="row">
|
||||
<th mat-header-cell *matHeaderCellDef>#</th>
|
||||
<td mat-cell *matCellDef="let item; let idx = index">{{ idx + 1 }}</td>
|
||||
</ng-container>
|
||||
<ng-container matColumnDef="endDate">
|
||||
<th mat-header-cell *matHeaderCellDef>{{ 'labels.inputs.End Date' | translate }}</th>
|
||||
<td mat-cell *matCellDef="let item">{{ item.dateValue | dateFormat }}</td>
|
||||
</ng-container>
|
||||
|
||||
<ng-container matColumnDef="startDate">
|
||||
<th mat-header-cell *matHeaderCellDef>{{ 'labels.inputs.Start Date' | translate }}</th>
|
||||
<td mat-cell *matCellDef="let item">{{ item.startDate | dateFormat }}</td>
|
||||
</ng-container>
|
||||
<ng-container matColumnDef="value">
|
||||
<th mat-header-cell *matHeaderCellDef>{{ 'labels.inputs.Value' | translate }}</th>
|
||||
<td mat-cell *matCellDef="let item">{{ item.decimalValue | formatNumber }}</td>
|
||||
</ng-container>
|
||||
|
||||
<ng-container matColumnDef="endDate">
|
||||
<th mat-header-cell *matHeaderCellDef>{{ 'labels.inputs.End Date' | translate }}</th>
|
||||
<td mat-cell *matCellDef="let item">{{ item.endDate | dateFormat }}</td>
|
||||
</ng-container>
|
||||
<ng-container matColumnDef="days">
|
||||
<th mat-header-cell *matHeaderCellDef>{{ 'labels.inputs.Days' | translate }}</th>
|
||||
<td mat-cell *matCellDef="let item">{{ item.days | formatNumber }}</td>
|
||||
</ng-container>
|
||||
|
||||
<ng-container matColumnDef="days">
|
||||
<th mat-header-cell *matHeaderCellDef>{{ 'labels.inputs.Days' | translate }}</th>
|
||||
<td mat-cell *matCellDef="let item">{{ item.days | formatNumber }}</td>
|
||||
</ng-container>
|
||||
<ng-container matColumnDef="actions">
|
||||
<th mat-header-cell *matHeaderCellDef>{{ 'labels.inputs.Actions' | translate }}</th>
|
||||
<td mat-cell *matCellDef="let item">
|
||||
<span *ngIf="allowActions(item.termType.value)">
|
||||
<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>
|
||||
</span>
|
||||
</td>
|
||||
</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-row *matRowDef="let row; columns: interestPausesColumns"></tr>
|
||||
</table>
|
||||
|
||||
<div class="alert" [hidden]="interestPausesData?.length > 0">
|
||||
<div class="message">
|
||||
<i class="fa fa-exclamation-circle alert-check"></i>
|
||||
{{ 'labels.text.No data found' | translate }}
|
||||
</div>
|
||||
<tr mat-header-row *matHeaderRowDef="loanDTermVariationsColumns"></tr>
|
||||
<tr mat-row *matRowDef="let row; columns: loanDTermVariationsColumns"></tr>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
+126
-14
@@ -19,14 +19,6 @@ export class LoanTermVariationsTabComponent {
|
||||
/** Loan Term Variation Data */
|
||||
loanTermVariationsData: any[] = [];
|
||||
loanDTermVariationsColumns: string[] = [
|
||||
'termType',
|
||||
'applicableFrom',
|
||||
'value',
|
||||
'specificToInstallment'
|
||||
];
|
||||
/** Interest Pauses Data */
|
||||
interestPausesData: any[] = [];
|
||||
interestPausesColumns: string[] = [
|
||||
'row',
|
||||
'startDate',
|
||||
'endDate',
|
||||
@@ -34,6 +26,19 @@ export class LoanTermVariationsTabComponent {
|
||||
'actions'
|
||||
];
|
||||
|
||||
emiAmountData: any[] = [];
|
||||
interestRateData: any[] = [];
|
||||
dueDateData: any[] = [];
|
||||
deleteInstallmentData: any[] = [];
|
||||
insertInstallmentData: any[] = [];
|
||||
principalAmountData: any[] = [];
|
||||
graceOnInterestData: any[] = [];
|
||||
graceOnPrincipalData: any[] = [];
|
||||
extendRepaymentPeriodData: any[] = [];
|
||||
interestRateFromInstallmentData: any[] = [];
|
||||
interestPausesData: any[] = [];
|
||||
invalidData: any[] = [];
|
||||
|
||||
loanId: number;
|
||||
clientId: AnyKindOfDictionary;
|
||||
|
||||
@@ -47,14 +52,117 @@ export class LoanTermVariationsTabComponent {
|
||||
) {
|
||||
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; }) => {
|
||||
this.loanId = data.loanDetailsData.id;
|
||||
this.loanTermVariationsData = data.loanDetailsData.loanTermVariations;
|
||||
this.interestPausesData = [];
|
||||
data.interestPausesData?.forEach((item: any) => {
|
||||
item.days = dates.calculateDiff(new Date(item.startDate), new Date(item.endDate));
|
||||
this.interestPausesData.push(item);
|
||||
this.loanTermVariationsData = [];
|
||||
data.loanDetailsData.loanTermVariations?.forEach((item: any) => {
|
||||
item.days = dates.calculateDiff(new Date(item.termVariationApplicableFrom), new Date(item.dateValue)) + 1;
|
||||
switch (item.termType.value) {
|
||||
case 'emiAmount':
|
||||
this.emiAmountData.push(item);
|
||||
break;
|
||||
case 'interestRate':
|
||||
this.interestRateData.push(item);
|
||||
break;
|
||||
case 'deleteInstallment':
|
||||
this.deleteInstallmentData.push(item);
|
||||
break;
|
||||
case 'dueDate':
|
||||
this.dueDateData.push(item);
|
||||
break;
|
||||
case 'insertInstallment':
|
||||
this.insertInstallmentData.push(item);
|
||||
break;
|
||||
case 'principalAmount':
|
||||
this.principalAmountData.push(item);
|
||||
break;
|
||||
case 'graceOnInterest':
|
||||
this.graceOnInterestData.push(item);
|
||||
break;
|
||||
case 'graceOnPrincipal':
|
||||
this.graceOnPrincipalData.push(item);
|
||||
break;
|
||||
case 'extendRepaymentPeriod':
|
||||
this.extendRepaymentPeriodData.push(item);
|
||||
break;
|
||||
case 'interestRateForInstallment':
|
||||
this.interestRateFromInstallmentData.push(item);
|
||||
break;
|
||||
case 'interestPause':
|
||||
this.interestPausesData.push(item);
|
||||
break;
|
||||
default:
|
||||
this.invalidData.push(item);
|
||||
break;
|
||||
}
|
||||
});
|
||||
|
||||
if (this.deleteInstallmentData.length > 0) {
|
||||
this.loanTermVariationsData.push({
|
||||
"label": "Delete Installment",
|
||||
"data": this.deleteInstallmentData
|
||||
});
|
||||
}
|
||||
if (this.dueDateData.length > 0) {
|
||||
this.loanTermVariationsData.push({
|
||||
"label": "Due Date",
|
||||
"data": this.dueDateData
|
||||
});
|
||||
}
|
||||
if (this.emiAmountData.length > 0) {
|
||||
this.loanTermVariationsData.push({
|
||||
"label": "EMI Amount",
|
||||
"data": this.emiAmountData
|
||||
});
|
||||
}
|
||||
if (this.extendRepaymentPeriodData.length > 0) {
|
||||
this.loanTermVariationsData.push({
|
||||
"label": "Extend Repayment Period",
|
||||
"data": this.extendRepaymentPeriodData
|
||||
});
|
||||
}
|
||||
if (this.graceOnInterestData.length > 0) {
|
||||
this.loanTermVariationsData.push({
|
||||
"label": "Grace On Interest",
|
||||
"data": this.graceOnInterestData
|
||||
});
|
||||
}
|
||||
if (this.graceOnPrincipalData.length > 0) {
|
||||
this.loanTermVariationsData.push({
|
||||
"label": "Grace On Principal",
|
||||
"data": this.graceOnPrincipalData
|
||||
});
|
||||
}
|
||||
if (this.insertInstallmentData.length > 0) {
|
||||
this.loanTermVariationsData.push({
|
||||
"label": "Insert Installment",
|
||||
"data": this.insertInstallmentData
|
||||
});
|
||||
}
|
||||
if (this.interestPausesData.length > 0) {
|
||||
this.loanTermVariationsData.push({
|
||||
"label": "Interest Pauses",
|
||||
"data": this.interestPausesData
|
||||
});
|
||||
}
|
||||
if (this.interestRateData.length > 0) {
|
||||
this.loanTermVariationsData.push({
|
||||
"label": "Interest Rate",
|
||||
"data": this.interestRateData
|
||||
});
|
||||
}
|
||||
if (this.interestRateFromInstallmentData.length > 0) {
|
||||
this.loanTermVariationsData.push({
|
||||
"label": "Interest Rate From Installment",
|
||||
"data": this.interestRateFromInstallmentData
|
||||
});
|
||||
}
|
||||
if (this.principalAmountData.length > 0) {
|
||||
this.loanTermVariationsData.push({
|
||||
"label": "Principal Amount",
|
||||
"data": this.principalAmountData
|
||||
});
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@@ -131,4 +239,8 @@ export class LoanTermVariationsTabComponent {
|
||||
.navigateByUrl(`/clients/${this.clientId}/loans-accounts`, { skipLocationChange: true })
|
||||
.then(() => this.router.navigate([url]));
|
||||
}
|
||||
|
||||
allowActions(termType: string): boolean {
|
||||
return (termType === 'interestPause')
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user