Skip to content

Commit e55aaf9

Browse files
Jose Alberto Hernandezadamsaghy
authored andcommitted
WEB-257: Loan Capitalized Income - Fetch amortization details
1 parent 704c61d commit e55aaf9

21 files changed

+213
-1
lines changed
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
/** Angular Imports */
2+
import { Injectable } from '@angular/core';
3+
import { ActivatedRouteSnapshot } from '@angular/router';
4+
5+
/** rxjs Imports */
6+
import { Observable } from 'rxjs';
7+
8+
/** Custom Services */
9+
import { LoansService } from '../loans.service';
10+
11+
/**
12+
* Loan Delinquency data resolver.
13+
*/
14+
@Injectable()
15+
export class LoanDeferredIncomeDataResolver {
16+
/**
17+
* @param {LoansService} LoansService Loans service.
18+
*/
19+
constructor(private loansService: LoansService) {}
20+
21+
/**
22+
* Returns the Loans with Association data.
23+
* @returns {Observable<any>}
24+
*/
25+
resolve(route: ActivatedRouteSnapshot): Observable<any> {
26+
const loanId = route.paramMap.get('loanId') || route.parent.paramMap.get('loanId');
27+
return this.loansService.getDeferredIncomeData(loanId);
28+
}
29+
}

src/app/loans/loans-routing.module.ts

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,8 @@ import { LoanDelinquencyDataResolver } from './common-resolvers/loan-delinquency
6262
import { LoanDelinquencyActionsResolver } from './common-resolvers/loan-delinquency-actions.resolver';
6363
import { LoanTermVariationsTabComponent } from './loans-view/loan-term-variations-tab/loan-term-variations-tab.component';
6464
import { LoanTermVariationsResolver } from './common-resolvers/loan-term-variations.resolver';
65+
import { LoanDeferredIncomeTabComponent } from './loans-view/loan-deferred-income-tab/loan-deferred-income-tab.component';
66+
import { LoanDeferredIncomeDataResolver } from './common-resolvers/loan-deferred-income-data.resolver';
6567

6668
/** Loans Route. */
6769
const routes: Routes = [
@@ -130,6 +132,19 @@ const routes: Routes = [
130132
}
131133
]
132134
},
135+
{
136+
path: 'deferred-income',
137+
data: { title: 'Loans Deferred Income', breadcrumb: 'Deferred income', routeParamBreadcrumb: false },
138+
resolve: {
139+
loanDeferredIncomeData: LoanDeferredIncomeDataResolver
140+
},
141+
children: [
142+
{
143+
path: '',
144+
component: LoanDeferredIncomeTabComponent
145+
}
146+
]
147+
},
133148
{
134149
path: 'delinquencytags',
135150
data: { title: 'Loans Delinquency Tags', breadcrumb: 'Delinquency Tags', routeParamBreadcrumb: false },
@@ -391,7 +406,8 @@ const routes: Routes = [
391406
GLIMLoanTemplateResolver,
392407
ExternalAssetOwnerResolver,
393408
LoanDelinquencyDataResolver,
394-
LoanTermVariationsResolver
409+
LoanTermVariationsResolver,
410+
LoanDeferredIncomeDataResolver
395411
]
396412
})
397413
export class LoansRoutingModule {}
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
<div class="container">
2+
<h3>{{ 'labels.inputs.Deferred income' | translate }} - {{ 'labels.menus.Capitalized Income' | translate }}</h3>
3+
4+
<table mat-table [dataSource]="capitalizedIncomeData" *ngIf="capitalizedIncomeData.length > 0">
5+
<ng-container matColumnDef="amount">
6+
<th mat-header-cell *matHeaderCellDef>{{ 'labels.inputs.Amount' | translate }}</th>
7+
<td mat-cell *matCellDef="let item">
8+
{{ item.amount | formatNumber }}
9+
</td>
10+
</ng-container>
11+
12+
<ng-container matColumnDef="amortizedAmount">
13+
<th mat-header-cell *matHeaderCellDef>{{ 'labels.inputs.Amortized Amount' | translate }}</th>
14+
<td mat-cell *matCellDef="let item">
15+
{{ item.amortizedAmount | formatNumber: '0.00' }}
16+
</td>
17+
</ng-container>
18+
19+
<ng-container matColumnDef="unrecognizedAmount">
20+
<th mat-header-cell *matHeaderCellDef>{{ 'labels.inputs.Unrecognized Amount' | translate }}</th>
21+
<td mat-cell *matCellDef="let item">
22+
{{ item.unrecognizedAmount | formatNumber: '0.00' }}
23+
</td>
24+
</ng-container>
25+
26+
<ng-container matColumnDef="amountAdjustment">
27+
<th mat-header-cell *matHeaderCellDef>{{ 'labels.inputs.Adjustment Amount' | translate }}</th>
28+
<td mat-cell *matCellDef="let item">
29+
{{ item.amountAdjustment | formatNumber: '0.00' }}
30+
</td>
31+
</ng-container>
32+
33+
<tr mat-header-row *matHeaderRowDef="capitalizedIncomeColumns"></tr>
34+
<tr mat-row *matRowDef="let row; columns: capitalizedIncomeColumns"></tr>
35+
</table>
36+
</div>

src/app/loans/loans-view/loan-deferred-income-tab/loan-deferred-income-tab.component.scss

Whitespace-only changes.
Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
import { NgClass } from '@angular/common';
2+
import { Component } from '@angular/core';
3+
import {
4+
MatCell,
5+
MatCellDef,
6+
MatColumnDef,
7+
MatHeaderCell,
8+
MatHeaderCellDef,
9+
MatHeaderRow,
10+
MatHeaderRowDef,
11+
MatRow,
12+
MatRowDef,
13+
MatTable
14+
} from '@angular/material/table';
15+
import { ActivatedRoute } from '@angular/router';
16+
import { FormatNumberPipe } from '@pipes/format-number.pipe';
17+
import { LoanCapitalizedIncomeData, LoanDeferredIncomeData } from 'app/loans/models/loan-account.model';
18+
import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module';
19+
20+
@Component({
21+
selector: 'mifosx-loan-deferred-income-tab',
22+
templateUrl: './loan-deferred-income-tab.component.html',
23+
styleUrl: './loan-deferred-income-tab.component.scss',
24+
imports: [
25+
...STANDALONE_SHARED_IMPORTS,
26+
MatTable,
27+
MatColumnDef,
28+
MatHeaderCellDef,
29+
MatHeaderCell,
30+
MatCellDef,
31+
MatCell,
32+
MatHeaderRowDef,
33+
MatHeaderRow,
34+
MatRowDef,
35+
MatRow,
36+
FormatNumberPipe
37+
]
38+
})
39+
export class LoanDeferredIncomeTabComponent {
40+
capitalizedIncomeData: LoanCapitalizedIncomeData[] = [];
41+
42+
loanId: any;
43+
44+
capitalizedIncomeColumns: string[] = [
45+
'amount',
46+
'amortizedAmount',
47+
'unrecognizedAmount',
48+
'amountAdjustment'
49+
];
50+
51+
constructor(private route: ActivatedRoute) {
52+
this.loanId = this.route.parent.parent.snapshot.params['loanId'];
53+
54+
let capitalizedIncomeData: LoanCapitalizedIncomeData[] = [];
55+
this.route.parent.data.subscribe((data: { loanDeferredIncomeData: LoanDeferredIncomeData }) => {
56+
capitalizedIncomeData = data.loanDeferredIncomeData.capitalizedIncomeData || [];
57+
capitalizedIncomeData.forEach((item: LoanCapitalizedIncomeData) => {
58+
item.amortizedAmount = item.amortizedAmount | 0;
59+
item.unrecognizedAmount = item.unrecognizedAmount | 0;
60+
item.amountAdjustment = item.amountAdjustment | 0;
61+
this.capitalizedIncomeData.push(item);
62+
});
63+
console.log(this.capitalizedIncomeData);
64+
});
65+
}
66+
}

src/app/loans/loans-view/loans-view.component.html

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -208,6 +208,17 @@ <h3>{{ 'labels.heading.Account Overview' | translate }}</h3>
208208
{{ 'labels.inputs.Transactions' | translate }}
209209
</a>
210210
</ng-container>
211+
<ng-container *ngIf="loanDetailsData.enableIncomeCapitalization">
212+
<a
213+
mat-tab-link
214+
[routerLink]="['./deferred-income']"
215+
routerLinkActive
216+
#deferredIncome="routerLinkActive"
217+
[active]="deferredIncome.isActive"
218+
>
219+
{{ 'labels.inputs.Deferred income' | translate }}
220+
</a>
221+
</ng-container>
211222
<ng-container *ngIf="loanDetailsData.status.active">
212223
<a
213224
mat-tab-link

src/app/loans/loans.service.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,10 @@ export class LoansService {
100100
return this.http.post(`/loans/${loanId}/delinquency-actions`, delinquencyActions);
101101
}
102102

103+
getDeferredIncomeData(loanId: string) {
104+
return this.http.get(`/loans/${loanId}/deferredincome`);
105+
}
106+
103107
/**
104108
* Returns the loan template data with specific condition
105109
* @param loanId Loan Id

src/app/loans/models/loan-account.model.ts

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -122,3 +122,14 @@ export interface DisbursementData {
122122
principal: number;
123123
id?: number;
124124
}
125+
126+
export interface LoanDeferredIncomeData {
127+
capitalizedIncomeData: LoanCapitalizedIncomeData[];
128+
}
129+
130+
export interface LoanCapitalizedIncomeData {
131+
amount: number;
132+
amortizedAmount?: number;
133+
unrecognizedAmount?: number;
134+
amountAdjustment?: number;
135+
}

src/assets/translations/cs-CS.json

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1223,6 +1223,7 @@
12231223
"Address Type": "Typ adresy",
12241224
"Adjust advance payments toward future installments": "Upravte zálohové platby směrem k budoucím splátkám",
12251225
"Adjust interest rates for remainder of loan": "Upravte úrokové sazby pro zbytek půjčky",
1226+
"Adjustment Amount": "Částka úpravy",
12261227
"Advance payments adjustment type": "Typ úpravy záloh",
12271228
"Advanced Payment Allocation Transactions": "Pokročilé transakce alokace plateb",
12281229
"Advanced Payment Allocation Transaction Type": "Typ transakce pro pokročilé přidělování plateb",
@@ -1246,6 +1247,7 @@
12461247
"Alt": "Alt",
12471248
"Amortization": "Amortizace",
12481249
"Amortization Type": "Typ amortizace",
1250+
"Amortized Amount": "Amortizovaná částka",
12491251
"Amount": "Množství",
12501252
"Amount Collected": "Vybraná částka",
12511253
"Amount Paid": "Částka vyplacená",
@@ -2384,6 +2386,7 @@
23842386
"Unassignment Date": "Datum vyřazení",
23852387
"Unique": "Unikátní",
23862388
"Unit Type": "Typ jednotky",
2389+
"Unrecognized Amount": "Nerozpoznaná částka",
23872390
"Updated By": "Aktualizováno uživatelem",
23882391
"Updated on": "Aktualizováno dne",
23892392
"Url": "URL",

src/assets/translations/de-DE.json

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1223,6 +1223,7 @@
12231223
"Address Type": "Adresstyp",
12241224
"Adjust advance payments toward future installments": "Passen Sie Vorauszahlungen an zukünftige Raten an",
12251225
"Adjust interest rates for remainder of loan": "Passen Sie die Zinssätze für die Restlaufzeit des Darlehens an",
1226+
"Adjustment Amount": "Anpassungsbetrag",
12261227
"Advance payments adjustment type": "Art der Anpassung der Vorauszahlungen",
12271228
"Advanced Payment Allocation Transactions": "Erweiterte Zahlungszuordnungstransaktionen",
12281229
"Advanced Payment Allocation Transaction Type": "Fortgeschrittene Zahlungszuweisungstransaktionstyp",
@@ -1246,6 +1247,7 @@
12461247
"Alt": "Alt",
12471248
"Amortization": "Amortisation",
12481249
"Amortization Type": "Amortisationsart",
1250+
"Amortized Amount": "Amortisierter Betrag",
12491251
"Amount": "Menge",
12501252
"Amount Collected": "Eingezogener Betrag",
12511253
"Amount Paid": "Bezahlter Betrag",
@@ -2384,6 +2386,7 @@
23842386
"Unassignment Date": "Datum der Aufhebung der Zuweisung",
23852387
"Unique": "Einzigartig",
23862388
"Unit Type": "Gerätetyp",
2389+
"Unrecognized Amount": "Nicht erfasster Betrag",
23872390
"Updated By": "Aktualisiert von",
23882391
"Updated on": "Aktualisiert am",
23892392
"Url": "URL",

0 commit comments

Comments
 (0)