diff --git a/src/app/loans/common-resolvers/loan-details-charges.resolver.ts b/src/app/loans/common-resolvers/loan-details-charges.resolver.ts new file mode 100644 index 000000000..1dcf09640 --- /dev/null +++ b/src/app/loans/common-resolvers/loan-details-charges.resolver.ts @@ -0,0 +1,31 @@ +/** Angular Imports */ +import { Injectable } from '@angular/core'; +import { Resolve, ActivatedRouteSnapshot } from '@angular/router'; + +/** rxjs Imports */ +import { Observable } from 'rxjs'; + +/** Custom Services */ +import { LoansService } from '../loans.service'; + +/** + * Clients data resolver. + */ +@Injectable() +export class LoanDetailsChargesResolver implements Resolve { + + /** + * @param {LoansService} LoansService Loans service. + */ + constructor(private loansService: LoansService) { } + + /** + * Returns the Loans with Association data. + * @returns {Observable} + */ + resolve(route: ActivatedRouteSnapshot): Observable { + const loanId = route.parent.paramMap.get('loanId'); + return this.loansService.getLoanAccountAssociationDetails(loanId); + } + +} diff --git a/src/app/loans/common-resolvers/loan-details.resolver.ts b/src/app/loans/common-resolvers/loan-details.resolver.ts index f4968d082..a404e2033 100644 --- a/src/app/loans/common-resolvers/loan-details.resolver.ts +++ b/src/app/loans/common-resolvers/loan-details.resolver.ts @@ -20,12 +20,12 @@ export class LoanDetailsResolver implements Resolve { constructor(private loansService: LoansService) { } /** - * Returns the Loans data. + * Returns the Loans with Association data. * @returns {Observable} */ resolve(route: ActivatedRouteSnapshot): Observable { const loanId = route.paramMap.get('loanId'); - return this.loansService.getLoanAccountDetails(loanId); + return this.loansService.getLoanAccountAssociationDetails(loanId); } } diff --git a/src/app/loans/loans-routing.module.ts b/src/app/loans/loans-routing.module.ts index e68435456..4d851544d 100644 --- a/src/app/loans/loans-routing.module.ts +++ b/src/app/loans/loans-routing.module.ts @@ -17,6 +17,8 @@ import { LoanChargeTemplateResolver } from './common-resolvers/loan-charge-templ import { LoanDetailsResolver } from './common-resolvers/loan-details.resolver'; import { LoanDetailsGeneralResolver } from './common-resolvers/loan-details-general.resolver'; import { LoanNotesResolver } from './common-resolvers/loan-notes-resolver'; +import { ChargesTabComponent } from './loans-view/charges-tab/charges-tab.component'; +import { LoanDetailsChargesResolver } from './common-resolvers/loan-details-charges.resolver'; const routes: Routes = [ { @@ -47,6 +49,14 @@ const routes: Routes = [ loanDetailsData: LoanDetailsGeneralResolver } }, + { + path: 'charges', + component: ChargesTabComponent, + data: { title: extract('Charges'), breadcrumb: 'Charges', routeParamBreadcrumb: false }, + resolve: { + loanDetailsAssociationData: LoanDetailsChargesResolver + } + }, { path: 'notes', component: NotesTabComponent, @@ -75,7 +85,8 @@ const routes: Routes = [ LoanChargeTemplateResolver, LoanDetailsGeneralResolver, LoanDetailsResolver, - LoanNotesResolver + LoanNotesResolver, + LoanDetailsChargesResolver ] }) diff --git a/src/app/loans/loans-view/charges-tab/charges-tab.component.html b/src/app/loans/loans-view/charges-tab/charges-tab.component.html new file mode 100644 index 000000000..cfd1234a8 --- /dev/null +++ b/src/app/loans/loans-view/charges-tab/charges-tab.component.html @@ -0,0 +1,77 @@ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Name {{ charge.name }} Fee/Penalty + Penalty + Fee + Payment due at {{ charge.chargeTimeType.value }} Due as of {{ charge.dueDate| date }} Calculation Type {{ charge.chargeCalculationType.value }} Due {{ charge.currency.displaySymbol }}{{ charge.amount| number }} Paid {{ charge.currency.displaySymbol }}{{ charge.amountPaid| number }} Waived {{ charge.currency.displaySymbol }}{{ charge.amountWaived| number }} Outstanding {{ charge.currency.displaySymbol }}{{ charge.amountOutstanding| number }} Actions + + + + +
+ + + +
diff --git a/src/app/loans/loans-view/charges-tab/charges-tab.component.scss b/src/app/loans/loans-view/charges-tab/charges-tab.component.scss new file mode 100644 index 000000000..ca97dafbe --- /dev/null +++ b/src/app/loans/loans-view/charges-tab/charges-tab.component.scss @@ -0,0 +1,4 @@ +table { + width: 100%; + margin-top: 3%; +} diff --git a/src/app/loans/loans-view/charges-tab/charges-tab.component.spec.ts b/src/app/loans/loans-view/charges-tab/charges-tab.component.spec.ts new file mode 100644 index 000000000..1ef118215 --- /dev/null +++ b/src/app/loans/loans-view/charges-tab/charges-tab.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { ChargesTabComponent } from './charges-tab.component'; + +describe('ChargesTabComponent', () => { + let component: ChargesTabComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ ChargesTabComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(ChargesTabComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/loans/loans-view/charges-tab/charges-tab.component.ts b/src/app/loans/loans-view/charges-tab/charges-tab.component.ts new file mode 100644 index 000000000..f7dafad65 --- /dev/null +++ b/src/app/loans/loans-view/charges-tab/charges-tab.component.ts @@ -0,0 +1,57 @@ +/** Angular Imports */ +import { Component, OnInit, ViewChild } from '@angular/core'; +import { MatTableDataSource, MatPaginator, MatSort } from '@angular/material'; +import { ActivatedRoute } from '@angular/router'; + +@Component({ + selector: 'mifosx-charges-tab', + templateUrl: './charges-tab.component.html', + styleUrls: ['./charges-tab.component.scss'] +}) +export class ChargesTabComponent implements OnInit { + + /** Loan Details Data */ + loanDetails: any; + /** Charges Data */ + chargesData: any; + /** Status */ + status: any; + /** Columns to be displayed in codes table. */ + displayedColumns: string[] = ['name', 'feepenalty', 'paymentdueat', 'dueasof', 'calculationtype', 'due', 'paid', 'waived', 'outstanding', 'actions']; + /** Data source for codes table. */ + dataSource: MatTableDataSource; + + /** Paginator for codes table. */ + @ViewChild(MatPaginator) paginator: MatPaginator; + /** Sorter for codes table. */ + @ViewChild(MatSort) sort: MatSort; + + /** + * Retrieves the codes 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.chargesData = this.loanDetails.charges; + this.status = this.loanDetails.status.value; + let actionFlag; + this.chargesData.forEach((element: any) => { + if (element.paid || element.waived || element.chargeTimeType.value === 'Disbursement' || this.loanDetails.status.value !== 'Active') { + actionFlag = true; + } else { + actionFlag = false; + } + element.actionFlag = actionFlag; + }); + this.dataSource = new MatTableDataSource(this.chargesData); + this.dataSource.paginator = this.paginator; + this.dataSource.sort = this.sort; + } + +} diff --git a/src/app/loans/loans-view/loans-view.component.html b/src/app/loans/loans-view/loans-view.component.html index c99241bca..aa60a661b 100644 --- a/src/app/loans/loans-view/loans-view.component.html +++ b/src/app/loans/loans-view/loans-view.component.html @@ -58,6 +58,11 @@ Account Details + + + Charges + + Notes diff --git a/src/app/loans/loans.module.ts b/src/app/loans/loans.module.ts index 381d4cbfb..2d45ef3aa 100644 --- a/src/app/loans/loans.module.ts +++ b/src/app/loans/loans.module.ts @@ -14,6 +14,7 @@ import { LoansViewComponent } from './loans-view/loans-view.component'; import { GeneralTabComponent } from './loans-view/general-tab/general-tab.component'; import { AccountDetailsComponent } from './loans-view/account-details/account-details.component'; import { NotesTabComponent } from './loans-view/notes-tab/notes-tab.component'; +import { ChargesTabComponent } from './loans-view/charges-tab/charges-tab.component'; /** * Loans Module @@ -28,6 +29,7 @@ import { NotesTabComponent } from './loans-view/notes-tab/notes-tab.component'; GeneralTabComponent, AccountDetailsComponent, NotesTabComponent, + ChargesTabComponent, ], providers: [DatePipe], }) diff --git a/src/app/loans/loans.service.ts b/src/app/loans/loans.service.ts index 540be6f43..86a0296b7 100644 --- a/src/app/loans/loans.service.ts +++ b/src/app/loans/loans.service.ts @@ -1,6 +1,6 @@ /** Angular Imports */ import { Injectable } from '@angular/core'; -import { HttpClient } from '@angular/common/http'; +import { HttpClient, HttpParams } from '@angular/common/http'; /** rxjs Imports */ import { Observable } from 'rxjs'; @@ -29,10 +29,25 @@ export class LoansService { return this.http.post(`/loans/${loanId}/${resourceType}`, loanCharge); } + /** + * Get Loan Account Details + * @param loanId Loan Id + */ getLoanAccountDetails(loanId: string) { return this.http.get(`/loans/${loanId}`); } + /** + * Get Loans details with httpParams + * @param loanId Loan ID + */ + getLoanAccountAssociationDetails(loanId: string) { + const httpParams = new HttpParams() + .set('associations', 'all') + .set('exclude', 'guarantors,futureSchedule'); + return this.http.get(`/loans/${loanId}`, {params: httpParams}); + } + /** * @param loanId Loan Id * @returns The notes for particular loan