diff --git a/src/app/loans/loans-routing.module.ts b/src/app/loans/loans-routing.module.ts
index 1b0e84062..fcf0df270 100644
--- a/src/app/loans/loans-routing.module.ts
+++ b/src/app/loans/loans-routing.module.ts
@@ -29,6 +29,7 @@ import { LoanDatatablesResolver } from './common-resolvers/loan-datatables.resol
import { LoanDatatableResolver } from './common-resolvers/loan-datatable.resolver';
import { LoanActionButtonResolver } from './common-resolvers/loan-action-button.resolver';
import { FloatingInterestRatesComponent } from './loans-view/floating-interest-rates/floating-interest-rates.component';
+import { LoanTrancheDetailsComponent } from './loans-view/loan-tranche-details/loan-tranche-details.component';
const routes: Routes = [
{
@@ -84,6 +85,14 @@ const routes: Routes = [
loanDetailsAssociationData: LoanDetailsChargesResolver
}
},
+ {
+ path: 'loan-tranche-details',
+ component: LoanTrancheDetailsComponent,
+ data: { title: extract('Loan Tranche Details'), breadcrumb: 'Loan Tranche Details', routeParamBreadcrumb: false },
+ resolve: {
+ loanDetailsAssociationData: LoanDetailsChargesResolver
+ }
+ },
{
path: 'overdue-charges',
component: OverdueChargesTabComponent,
diff --git a/src/app/loans/loans-view/loan-account-actions/write-off-page/write-off-page.component.ts b/src/app/loans/loans-view/loan-account-actions/write-off-page/write-off-page.component.ts
index 6791c7d64..30a913629 100644
--- a/src/app/loans/loans-view/loan-account-actions/write-off-page/write-off-page.component.ts
+++ b/src/app/loans/loans-view/loan-account-actions/write-off-page/write-off-page.component.ts
@@ -18,6 +18,11 @@ export class WriteOffPageComponent implements OnInit {
@Input() dataObject: any;
+ /** Minimum Date allowed. */
+ minDate = new Date(2000, 0, 1);
+ /** Maximum Date allowed. */
+ maxDate = new Date();
+
/** Write Off form. */
writeOffForm: FormGroup;
diff --git a/src/app/loans/loans-view/loan-tranche-details/loan-tranche-details.component.html b/src/app/loans/loans-view/loan-tranche-details/loan-tranche-details.component.html
new file mode 100644
index 000000000..72683c6b2
--- /dev/null
+++ b/src/app/loans/loans-view/loan-tranche-details/loan-tranche-details.component.html
@@ -0,0 +1,80 @@
+
+
+
+ Maximum allowed outstanding balance:
+ {{ loanDetails.maxOutstandingLoanBalance | number }}
+
+
+
Loan Tranche Details
+
+
+
+
+
+
+
+
+
0">
+
+
+ | Expected Disbursement On |
+ {{ ele.expectedDisbursementDate | date}} |
+
+
+
+ Disbursed On |
+
+
+ {{ ele.actualDisbursementDate | date }}
+
+ |
+
+
+
+ Principal |
+ {{ ele.principal }} |
+
+
+
+ Actions |
+
+
+
+
+
+ |
+
+
+
+
+
+
+
0">
+
+
Installment Amount Variations:
+
+
+
+
+ | Applicable From Date |
+ {{ ele.termVariationApplicableFrom | date}} |
+
+
+
+ Installment Amount |
+ {{ ele.termValue }} |
+
+
+
+
+
+
+
+
+
diff --git a/src/app/loans/loans-view/loan-tranche-details/loan-tranche-details.component.scss b/src/app/loans/loans-view/loan-tranche-details/loan-tranche-details.component.scss
new file mode 100644
index 000000000..5ffc94951
--- /dev/null
+++ b/src/app/loans/loans-view/loan-tranche-details/loan-tranche-details.component.scss
@@ -0,0 +1,11 @@
+table {
+ width: 100%;
+}
+
+.container {
+ padding-top: 1%;
+ padding-bottom: 2%;
+ .delete-button {
+ margin-left: 1%;
+ }
+}
diff --git a/src/app/loans/loans-view/loan-tranche-details/loan-tranche-details.component.spec.ts b/src/app/loans/loans-view/loan-tranche-details/loan-tranche-details.component.spec.ts
new file mode 100644
index 000000000..4a3ad1a0a
--- /dev/null
+++ b/src/app/loans/loans-view/loan-tranche-details/loan-tranche-details.component.spec.ts
@@ -0,0 +1,25 @@
+import { async, ComponentFixture, TestBed } from '@angular/core/testing';
+
+import { LoanTrancheDetailsComponent } from './loan-tranche-details.component';
+
+describe('LoanTrancheDetailsComponent', () => {
+ let component: LoanTrancheDetailsComponent;
+ let fixture: ComponentFixture;
+
+ beforeEach(async(() => {
+ TestBed.configureTestingModule({
+ declarations: [ LoanTrancheDetailsComponent ]
+ })
+ .compileComponents();
+ }));
+
+ beforeEach(() => {
+ fixture = TestBed.createComponent(LoanTrancheDetailsComponent);
+ component = fixture.componentInstance;
+ fixture.detectChanges();
+ });
+
+ it('should create', () => {
+ expect(component).toBeTruthy();
+ });
+});
diff --git a/src/app/loans/loans-view/loan-tranche-details/loan-tranche-details.component.ts b/src/app/loans/loans-view/loan-tranche-details/loan-tranche-details.component.ts
new file mode 100644
index 000000000..5491c02d4
--- /dev/null
+++ b/src/app/loans/loans-view/loan-tranche-details/loan-tranche-details.component.ts
@@ -0,0 +1,72 @@
+import { Component, OnInit } from '@angular/core';
+import { ActivatedRoute } from '@angular/router';
+
+@Component({
+ selector: 'mifosx-loan-tranche-details',
+ templateUrl: './loan-tranche-details.component.html',
+ styleUrls: ['./loan-tranche-details.component.scss'],
+})
+export class LoanTrancheDetailsComponent implements OnInit {
+ loanDetails: any;
+ return: any;
+ status: any;
+ totalDisbursedAmount: any;
+ count: number;
+ expectedDisbursementColumns: string[] = ['expected disbursement on', 'disbursed on', 'principal', 'action'];
+ emivariationColumns: string[] = ['emi amount variation from', 'fixed emi amount'];
+
+ /**
+ * Retrieves the loans data from `resolve`.
+ * @param {ActivatedRoute} route Activated Route.
+ */
+ constructor(private route: ActivatedRoute) {
+ this.route.data.subscribe((data: { loanDetailsAssociationData: any }) => {
+ this.loanDetails = data.loanDetailsAssociationData;
+ });
+ }
+
+ ngOnInit() {
+ this.status = this.loanDetails.status.value;
+ }
+
+ showAddDeleteTrancheButtons(action: string) {
+ this.return = true;
+ if (
+ this.status === 'Closed (obligations met)' ||
+ this.status === 'Overpaid' ||
+ this.status === 'Closed (rescheduled)' ||
+ this.status === 'Closed (written off)' ||
+ this.status === 'Submitted and pending approval'
+ ) {
+ this.return = false;
+ }
+ this.totalDisbursedAmount = 0;
+ this.count = 0;
+ this.loanDetails.disbursementDetails.forEach((element: any) => {
+ if (element.actualDisbursementDate) {
+ this.totalDisbursedAmount += element.principal;
+ } else {
+ this.count += 1;
+ }
+ });
+
+ if (this.totalDisbursedAmount === this.loanDetails.approvedPrincipal || this.return === false) {
+ return false;
+ }
+ if (this.count === 0 && action === 'deletedisbursedetails') {
+ return false;
+ }
+
+ return true;
+ }
+
+ showEdit(disbursementDetail: any) {
+ if (
+ (!disbursementDetail.actualDisbursementDate || disbursementDetail.actualDisbursementDate === null) &&
+ this.status === 'Approved'
+ ) {
+ return true;
+ }
+ return false;
+ }
+}
diff --git a/src/app/loans/loans-view/loans-view.component.html b/src/app/loans/loans-view/loans-view.component.html
index d1e45b44b..8278ba7e5 100644
--- a/src/app/loans/loans-view/loans-view.component.html
+++ b/src/app/loans/loans-view/loans-view.component.html
@@ -70,6 +70,11 @@
Transactions
+
+
+
+ Loan Tranche Details
+
0">
diff --git a/src/app/loans/loans.module.ts b/src/app/loans/loans.module.ts
index 4b70c956e..9b6d06d1d 100644
--- a/src/app/loans/loans.module.ts
+++ b/src/app/loans/loans.module.ts
@@ -32,6 +32,7 @@ import { MakeRepaymentComponent } from './loans-view/loan-account-actions/make-r
import { WaiveInterestComponent } from './loans-view/loan-account-actions/waive-interest/waive-interest.component';
import { FloatingInterestRatesComponent } from './loans-view/floating-interest-rates/floating-interest-rates.component';
import { WriteOffPageComponent } from './loans-view/loan-account-actions/write-off-page/write-off-page.component';
+import { LoanTrancheDetailsComponent } from './loans-view/loan-tranche-details/loan-tranche-details.component';
/**
* Loans Module
@@ -64,6 +65,7 @@ import { WriteOffPageComponent } from './loans-view/loan-account-actions/write-o
WaiveInterestComponent,
FloatingInterestRatesComponent,
WriteOffPageComponent,
+ LoanTrancheDetailsComponent,
],
providers: [DatePipe],
})