From f618bb3cda58e689912c3930d9c9e25086c30933 Mon Sep 17 00:00:00 2001 From: Muskan Khedia <36980003+muskankhedia@users.noreply.github.com> Date: Tue, 21 Jul 2020 22:45:39 +0530 Subject: [PATCH] feat: add loan action button (approve) (#1148) Fixes: #829 Co-authored-by: Benura Abeywardena --- .../loan-action-button.resolver.ts | 2 + .../approve-loan/approve-loan.component.html | 58 +++++++++++ .../approve-loan/approve-loan.component.scss | 3 + .../approve-loan.component.spec.ts | 25 +++++ .../approve-loan/approve-loan.component.ts | 95 +++++++++++++++++++ .../loan-account-actions.component.html | 1 + .../loan-account-actions.component.ts | 6 +- src/app/loans/loans.module.ts | 4 +- src/app/loans/loans.service.ts | 16 ++++ 9 files changed, 207 insertions(+), 3 deletions(-) create mode 100644 src/app/loans/loans-view/loan-account-actions/approve-loan/approve-loan.component.html create mode 100644 src/app/loans/loans-view/loan-account-actions/approve-loan/approve-loan.component.scss create mode 100644 src/app/loans/loans-view/loan-account-actions/approve-loan/approve-loan.component.spec.ts create mode 100644 src/app/loans/loans-view/loan-account-actions/approve-loan/approve-loan.component.ts diff --git a/src/app/loans/common-resolvers/loan-action-button.resolver.ts b/src/app/loans/common-resolvers/loan-action-button.resolver.ts index 3a5cffd1d..410b20926 100644 --- a/src/app/loans/common-resolvers/loan-action-button.resolver.ts +++ b/src/app/loans/common-resolvers/loan-action-button.resolver.ts @@ -56,6 +56,8 @@ export class LoanActionButtonResolver implements Resolve { return this.loansService.getLoanActionTemplate(loanId, 'disburse'); } else if (loanActionButton === 'loan-screen-reports') { return this.loansService.getLoanScreenReportsData(); + } else if (loanActionButton === 'approve') { + return this.loansService.getLoanApprovalTemplate(loanId); } else { return undefined; } diff --git a/src/app/loans/loans-view/loan-account-actions/approve-loan/approve-loan.component.html b/src/app/loans/loans-view/loan-account-actions/approve-loan/approve-loan.component.html new file mode 100644 index 000000000..a1dc7dd80 --- /dev/null +++ b/src/app/loans/loans-view/loan-account-actions/approve-loan/approve-loan.component.html @@ -0,0 +1,58 @@ +
+ +
+ + + +
+ + + Approved On + + + + + Approved Date is required + + + + + Expected disbursement on + + + + + + + Approved Amount + + + + + Transaction Amount + + + Transaction Amount is required + + + + + Note + + + +
+ + + + + + +
+ +
+ +
diff --git a/src/app/loans/loans-view/loan-account-actions/approve-loan/approve-loan.component.scss b/src/app/loans/loans-view/loan-account-actions/approve-loan/approve-loan.component.scss new file mode 100644 index 000000000..1915ad6d3 --- /dev/null +++ b/src/app/loans/loans-view/loan-account-actions/approve-loan/approve-loan.component.scss @@ -0,0 +1,3 @@ +.container { + max-width: 37rem; +} diff --git a/src/app/loans/loans-view/loan-account-actions/approve-loan/approve-loan.component.spec.ts b/src/app/loans/loans-view/loan-account-actions/approve-loan/approve-loan.component.spec.ts new file mode 100644 index 000000000..2cc6a2c10 --- /dev/null +++ b/src/app/loans/loans-view/loan-account-actions/approve-loan/approve-loan.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { ApproveLoanComponent } from './approve-loan.component'; + +describe('ApproveLoanComponent', () => { + let component: ApproveLoanComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ ApproveLoanComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(ApproveLoanComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/loans/loans-view/loan-account-actions/approve-loan/approve-loan.component.ts b/src/app/loans/loans-view/loan-account-actions/approve-loan/approve-loan.component.ts new file mode 100644 index 000000000..863329d8e --- /dev/null +++ b/src/app/loans/loans-view/loan-account-actions/approve-loan/approve-loan.component.ts @@ -0,0 +1,95 @@ +/** Angular Imports. */ +import { Component, OnInit, Input } from '@angular/core'; +import { FormGroup, FormBuilder, Validators, FormControl } from '@angular/forms'; +import { ActivatedRoute, Router } from '@angular/router'; +import { distinctUntilChanged } from 'rxjs/operators'; +import { DatePipe } from '@angular/common'; + +/** Custom Services. */ +import { LoansService } from 'app/loans/loans.service'; + +/** + * Approve Loan component. + */ +@Component({ + selector: 'mifosx-approve-loan', + templateUrl: './approve-loan.component.html', + styleUrls: ['./approve-loan.component.scss'] +}) +export class ApproveLoanComponent implements OnInit { + + /** Approve Loan form. */ + approveLoanForm: FormGroup; + /** Loan data. */ + loanData: any = new Object(); + /** Association Data */ + associationData: any; + /** Minimum Date allowed. */ + minDate = new Date(2000, 0, 1); + /** Loan Id */ + loanId: any; + + /** + * Retrieve data from `Resolver`. + * @param formBuilder Form Builder. + * @param route Activated Route. + * @param datePipe Date Pipe. + * @param loanService Loan Service. + * @param router Router. + */ + constructor(private formBuilder: FormBuilder, + private route: ActivatedRoute, + private datePipe: DatePipe, + private loanService: LoansService, + private router: Router) { + this.route.data.subscribe((data: { actionButtonData: any }) => { + this.loanData = data.actionButtonData; + }); + this.loanId = this.route.parent.snapshot.params['loanId']; + } + + ngOnInit() { + this.setApproveLoanForm(); + this.loanService.getApproveAssociationsDetails(this.loanId).subscribe((response: any) => { + this.associationData = response; + this.approveLoanForm.patchValue({ + 'expectedDisbursementDate': new Date(response.timeline.expectedDisbursementDate) + }); + }); + } + + /** + * Set Approve Loan form. + */ + setApproveLoanForm() { + this.approveLoanForm = this.formBuilder.group({ + 'approvedOnDate': [this.loanData.approvalDate && new Date(this.loanData.approvalDate), Validators.required], + 'expectedDisbursementDate': [''], + 'approvedLoanAmount': [this.loanData.approvalAmount, Validators.required], + 'note': [''] + }); + } + + /** + * Submits Approve form. + */ + submit() { + const dateFormat = 'dd MMMM yyyy'; + const local = 'en'; + const approvedOnDate = this.approveLoanForm.value.approvedOnDate; + const expectedDisbursementDate = this.approveLoanForm.value.expectedDisbursementDate; + this.approveLoanForm.patchValue({ + approvedOnDate: this.datePipe.transform(approvedOnDate, dateFormat), + expectedDisbursementDate: this.datePipe.transform(expectedDisbursementDate, dateFormat) + }); + const approveLoanFormData = { + ... this.approveLoanForm.value, + dateFormat, + local + }; + this.loanService.loanActionButtons(this.loanId, 'approve', approveLoanFormData).subscribe((response: any) => { + this.router.navigate(['../../'], { relativeTo: this.route }); + }); + } + +} diff --git a/src/app/loans/loans-view/loan-account-actions/loan-account-actions.component.html b/src/app/loans/loans-view/loan-account-actions/loan-account-actions.component.html index d184b2963..0ce3645a6 100644 --- a/src/app/loans/loans-view/loan-account-actions/loan-account-actions.component.html +++ b/src/app/loans/loans-view/loan-account-actions/loan-account-actions.component.html @@ -20,5 +20,6 @@ + diff --git a/src/app/loans/loans-view/loan-account-actions/loan-account-actions.component.ts b/src/app/loans/loans-view/loan-account-actions/loan-account-actions.component.ts index 30e44a2f7..627543ab6 100644 --- a/src/app/loans/loans-view/loan-account-actions/loan-account-actions.component.ts +++ b/src/app/loans/loans-view/loan-account-actions/loan-account-actions.component.ts @@ -32,7 +32,8 @@ export class LoanAccountActionsComponent { disburse: boolean, withdrawn_by_client: boolean, undo_disbursal: boolean, - loan_screen_reports: boolean } = { + loan_screen_reports: boolean, + approve: boolean } = { close: false, undo_approval: false, write_off: false, @@ -52,7 +53,8 @@ export class LoanAccountActionsComponent { disburse: false, withdrawn_by_client: false, undo_disbursal: false, - loan_screen_reports: false }; + loan_screen_reports: false, + approve: false }; actionButtonData: any; actionName: any; diff --git a/src/app/loans/loans.module.ts b/src/app/loans/loans.module.ts index 03c989023..95e2ea480 100644 --- a/src/app/loans/loans.module.ts +++ b/src/app/loans/loans.module.ts @@ -60,6 +60,7 @@ import { LoanAccountLoadDocumentsDialogComponent } from './custom-dialog/loan-ac import { StandingInstructionsTabComponent } from './loans-view/standing-instructions-tab/standing-instructions-tab.component'; import { EditLoansAccountComponent } from './edit-loans-account/edit-loans-account.component'; import { LoanScreenReportsComponent } from './loans-view/loan-account-actions/loan-screen-reports/loan-screen-reports.component'; +import { ApproveLoanComponent } from './loans-view/loan-account-actions/approve-loan/approve-loan.component'; /** * Loans Module @@ -117,7 +118,8 @@ import { LoanScreenReportsComponent } from './loans-view/loan-account-actions/lo LoanAccountLoadDocumentsDialogComponent, StandingInstructionsTabComponent, EditLoansAccountComponent, - LoanScreenReportsComponent + LoanScreenReportsComponent, + ApproveLoanComponent ], entryComponents: [ LoansAccountAddCollateralDialogComponent, diff --git a/src/app/loans/loans.service.ts b/src/app/loans/loans.service.ts index 0e9bb616a..fef7ed108 100644 --- a/src/app/loans/loans.service.ts +++ b/src/app/loans/loans.service.ts @@ -105,6 +105,11 @@ export class LoansService { return this.http.get(`/loans/${loanId}`, {params: httpParams}); } + getApproveAssociationsDetails(loanId: any) { + const httpParams = new HttpParams() + .set('associations', 'multiDisburseDetails'); + return this.http.get(`/loans/${loanId}`, { params: httpParams }); + } /** * @param loanId Loan Id * @returns The notes for particular loan @@ -342,4 +347,15 @@ export class LoansService { return this.http.post(`/templates/${templateId}`, {}, { params: httpParams, responseType: 'text'}); } + /** + * Get Loan Charge Aproval template. + * @param {string} loanId Loan Id. + * @returns {Observable} + */ + getLoanApprovalTemplate(loanId: string): Observable { + const httpParams = new HttpParams() + .set('templateType', 'approval'); + return this.http.get(`/loans/${loanId}/template`, { params: httpParams }); + } + }