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

+ +
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + +
Expected Disbursement On {{ ele.expectedDisbursementDate | date}} Disbursed On + + {{ ele.actualDisbursementDate | date }} + + Principal {{ ele.principal }} Actions + + + + +
+ +
+ +

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 + 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], })