From 780fc000cb01f79611caa0a40a167b1b55dc77eb Mon Sep 17 00:00:00 2001
From: Benura Abeywardena <43112139+BLasan@users.noreply.github.com>
Date: Sun, 2 Aug 2020 11:51:56 +0530
Subject: [PATCH] feat: add bulk loan reassignment component (#792)
Fixes: #754
---
.../bulk-loan-reassignmnet.component.html | 159 ++++++++++++++++++
.../bulk-loan-reassignmnet.component.scss | 3 +
.../bulk-loan-reassignmnet.component.spec.ts | 25 +++
.../bulk-loan-reassignmnet.component.ts | 126 ++++++++++++++
.../organization-routing.module.ts | 12 +-
.../organization/organization.component.html | 2 +-
src/app/organization/organization.module.ts | 2 +
src/app/organization/organization.service.ts | 31 ++++
8 files changed, 358 insertions(+), 2 deletions(-)
create mode 100644 src/app/organization/bulk-loan-reassignmnet/bulk-loan-reassignmnet.component.html
create mode 100644 src/app/organization/bulk-loan-reassignmnet/bulk-loan-reassignmnet.component.scss
create mode 100644 src/app/organization/bulk-loan-reassignmnet/bulk-loan-reassignmnet.component.spec.ts
create mode 100644 src/app/organization/bulk-loan-reassignmnet/bulk-loan-reassignmnet.component.ts
diff --git a/src/app/organization/bulk-loan-reassignmnet/bulk-loan-reassignmnet.component.html b/src/app/organization/bulk-loan-reassignmnet/bulk-loan-reassignmnet.component.html
new file mode 100644
index 000000000..30c2babf3
--- /dev/null
+++ b/src/app/organization/bulk-loan-reassignmnet/bulk-loan-reassignmnet.component.html
@@ -0,0 +1,159 @@
+
diff --git a/src/app/organization/bulk-loan-reassignmnet/bulk-loan-reassignmnet.component.scss b/src/app/organization/bulk-loan-reassignmnet/bulk-loan-reassignmnet.component.scss
new file mode 100644
index 000000000..464f9078e
--- /dev/null
+++ b/src/app/organization/bulk-loan-reassignmnet/bulk-loan-reassignmnet.component.scss
@@ -0,0 +1,3 @@
+table {
+ border: none;
+}
diff --git a/src/app/organization/bulk-loan-reassignmnet/bulk-loan-reassignmnet.component.spec.ts b/src/app/organization/bulk-loan-reassignmnet/bulk-loan-reassignmnet.component.spec.ts
new file mode 100644
index 000000000..a929403d7
--- /dev/null
+++ b/src/app/organization/bulk-loan-reassignmnet/bulk-loan-reassignmnet.component.spec.ts
@@ -0,0 +1,25 @@
+import { async, ComponentFixture, TestBed } from '@angular/core/testing';
+
+import { BulkLoanReassignmnetComponent } from './bulk-loan-reassignmnet.component';
+
+describe('BulkLoanReassignmnetComponent', () => {
+ let component: BulkLoanReassignmnetComponent;
+ let fixture: ComponentFixture;
+
+ beforeEach(async(() => {
+ TestBed.configureTestingModule({
+ declarations: [ BulkLoanReassignmnetComponent ]
+ })
+ .compileComponents();
+ }));
+
+ beforeEach(() => {
+ fixture = TestBed.createComponent(BulkLoanReassignmnetComponent);
+ component = fixture.componentInstance;
+ fixture.detectChanges();
+ });
+
+ it('should create', () => {
+ expect(component).toBeTruthy();
+ });
+});
diff --git a/src/app/organization/bulk-loan-reassignmnet/bulk-loan-reassignmnet.component.ts b/src/app/organization/bulk-loan-reassignmnet/bulk-loan-reassignmnet.component.ts
new file mode 100644
index 000000000..bdb4c4ab1
--- /dev/null
+++ b/src/app/organization/bulk-loan-reassignmnet/bulk-loan-reassignmnet.component.ts
@@ -0,0 +1,126 @@
+/** Angular Imports. */
+import { Component, OnInit } from '@angular/core';
+import { FormGroup, FormBuilder, Validators, FormControl } from '@angular/forms';
+import { ActivatedRoute, Router } from '@angular/router';
+import { DatePipe } from '@angular/common';
+
+/** Custom Services. */
+import { OrganizationService } from '../organization.service';
+
+/**
+ * Bulk Loan Reassignment component.
+ */
+@Component({
+ selector: 'mifosx-bulk-loan-reassignmnet',
+ templateUrl: './bulk-loan-reassignmnet.component.html',
+ styleUrls: ['./bulk-loan-reassignmnet.component.scss']
+})
+export class BulkLoanReassignmnetComponent implements OnInit {
+
+ /** Bulk Loan form. */
+ bulkLoanForm: FormGroup;
+ /** Office data. */
+ offices: any;
+ /** To Loan Officers. */
+ toLoanOfficers: any[];
+ /** From Loan Offices. */
+ fromLoanOfficers: any[];
+ /** Office Template. */
+ officeTemplate: any;
+ /** Officer Template. */
+ officerTemplate: any;
+ /** Loans. */
+ loans: any[] = new Array();
+ /** Minimum Date allowed. */
+ minDate = new Date(2000, 0, 1);
+ /** Maximum Date allowed. */
+ maxDate = new Date();
+
+ /**
+ * Get Office data from `resolver`.
+ * @param {FormBuilder} formBuilder Form Builder.
+ * @param {ActivatedRoute} route Activated Route.
+ * @param {Router} router Router.
+ */
+ constructor(private formBuilder: FormBuilder,
+ private route: ActivatedRoute,
+ private organizationSevice: OrganizationService,
+ private datePipe: DatePipe,
+ private router: Router) {
+ this.route.data.subscribe((data: { offices: any} ) => {
+ this.offices = data.offices;
+ });
+ }
+
+ ngOnInit() {
+ this.setBulkLoanForm();
+ }
+
+ /**
+ * Set Bulk Loan Form.
+ */
+ setBulkLoanForm() {
+ this.bulkLoanForm = this.formBuilder.group({
+ 'assignmentDate': [new Date(), Validators.required],
+ 'toLoanOfficerId': ['', Validators.required]
+ });
+ }
+
+ /**
+ * Get Office template.
+ * @param officeId Office Id.
+ */
+ getOffice(officeId: string) {
+ this.organizationSevice.getOfficeTemplate(officeId).subscribe((response: any) => {
+ this.officeTemplate = response;
+ this.fromLoanOfficers = this.officeTemplate.loanOfficerOptions;
+ this.bulkLoanForm.addControl('fromLoanOfficerId', new FormControl('', Validators.required));
+ });
+ }
+
+ /**
+ * Get From Officers.
+ * @param officerId Office Id.
+ */
+ getFromOfficers(officerId: any) {
+ this.toLoanOfficers = this.fromLoanOfficers.filter((officer: any) => officer.id !== officerId );
+ console.log(this.toLoanOfficers);
+ this.organizationSevice.getOfficerTemplate(officerId, this.officeTemplate.id).subscribe((response: any) => {
+ this.officerTemplate = response;
+ });
+ }
+
+ /**
+ * Get all loans.
+ * @param event Mat Checkbox Event.
+ * @param loanId Loan Id.
+ */
+ getLoans(event: any, loanId: any) {
+ const isChecked = event.checked;
+ if (isChecked) {
+ this.loans.push(loanId);
+ } else {
+ const index = this.loans.indexOf(loanId, 0);
+ this.loans.splice(index, 1);
+ }
+ }
+
+ /**
+ * Submits bulk loan reassignment form.
+ */
+ submit() {
+ const dateFormat = 'yyyy-MM-dd';
+ const assignmentDate = this.bulkLoanForm.value.assignmentDate;
+ this.bulkLoanForm.patchValue({
+ assignmentDate: this.datePipe.transform(assignmentDate, dateFormat)
+ });
+ const bulkForm = this.bulkLoanForm.value;
+ bulkForm.locale = 'en';
+ bulkForm.dateFormat = dateFormat;
+ bulkForm.loans = this.loans;
+ this.organizationSevice.createLoanReassignment(bulkForm).subscribe((response: any) => {
+ this.router.navigate(['../'], { relativeTo: this.route });
+ });
+ }
+
+}
diff --git a/src/app/organization/organization-routing.module.ts b/src/app/organization/organization-routing.module.ts
index 11dd09070..ee69afbe9 100644
--- a/src/app/organization/organization-routing.module.ts
+++ b/src/app/organization/organization-routing.module.ts
@@ -92,6 +92,7 @@ import { AdhocQueryAndTemplateResolver } from './adhoc-query/common-resolvers/ad
import { BulkImportResolver } from './bulk-import/bulk-import.resolver';
import { SmsCampaignTemplateResolver } from './sms-campaigns/common-resolvers/sms-campaign-template.resolver';
import { EntityDataTableChecksTemplateResolver } from './entity-data-table-checks/enitity-data-table-checks-template.resolver';
+import { BulkLoanReassignmnetComponent } from './bulk-loan-reassignmnet/bulk-loan-reassignmnet.component';
/** Organization Routes */
const routes: Routes = [
@@ -491,6 +492,14 @@ const routes: Routes = [
passwordPreferencesTemplate: PasswordPreferencesTemplateResolver
}
},
+ {
+ path: 'bulkloan',
+ component: BulkLoanReassignmnetComponent,
+ data: { title: extract('Bulk Loan Reassignment'), breadcrumb: 'Bulk Loan Reasssignment' },
+ resolve: {
+ offices: OfficesResolver
+ }
+ },
{
path: 'entity-data-table-checks',
data: { title: extract('Entity Data Table Checks'), breadcrumb: 'Entity Data Table Checks' },
@@ -631,7 +640,8 @@ const routes: Routes = [
HolidayTemplateResolver,
BulkImportResolver,
HolidayResolver,
- EntityDataTableChecksTemplateResolver
+ EntityDataTableChecksTemplateResolver,
+ LoanProvisioningCriteriasResolver
]
})
export class OrganizationRoutingModule { }
diff --git a/src/app/organization/organization.component.html b/src/app/organization/organization.component.html
index 2f20de294..67ff39ce0 100644
--- a/src/app/organization/organization.component.html
+++ b/src/app/organization/organization.component.html
@@ -97,7 +97,7 @@
Funds are associated with loans
-
+
diff --git a/src/app/organization/organization.module.ts b/src/app/organization/organization.module.ts
index 020532dc1..ac67adb27 100644
--- a/src/app/organization/organization.module.ts
+++ b/src/app/organization/organization.module.ts
@@ -63,6 +63,7 @@ import { EditCampaignComponent } from './sms-campaigns/edit-campaign/edit-campai
import { EditSmsCampaignStepComponent } from './sms-campaigns/sms-campaign-stepper/edit-sms-campaign-step/edit-sms-campaign-step.component';
import { EditBusinessRuleParametersComponent } from './sms-campaigns/sms-campaign-stepper/edit-sms-campaign-step/edit-business-rule-parameters/edit-business-rule-parameters.component';
import { CreateEnityDataTableChecksComponent } from './entity-data-table-checks/create-enity-data-table-checks/create-enity-data-table-checks.component';
+import { BulkLoanReassignmnetComponent } from './bulk-loan-reassignmnet/bulk-loan-reassignmnet.component';
/**
* Organization Module
@@ -132,6 +133,7 @@ import { CreateEnityDataTableChecksComponent } from './entity-data-table-checks/
EditSmsCampaignStepComponent,
EditBusinessRuleParametersComponent,
CreateEnityDataTableChecksComponent,
+ BulkLoanReassignmnetComponent,
]
})
export class OrganizationModule { }
diff --git a/src/app/organization/organization.service.ts b/src/app/organization/organization.service.ts
index a6e4a9db5..5684baec9 100644
--- a/src/app/organization/organization.service.ts
+++ b/src/app/organization/organization.service.ts
@@ -56,6 +56,37 @@ export class OrganizationService {
return this.http.get('/offices');
}
+ /**
+ * Get Office Template.
+ * @param {string} officeId Office Id of the office selected.
+ * @returns {Observable} Office Template.
+ */
+ getOfficeTemplate(officeId: string): Observable {
+ const httpParams = new HttpParams().set('officeId', officeId.toString());
+ return this.http.get(`/loans/loanreassignment/template`, { params: httpParams });
+ }
+
+ /**
+ * Get Officer Template.
+ * @param officerId Officer Id.
+ * @param officeId Office Id.
+ */
+ getOfficerTemplate(officerId: string, officeId: string): Observable {
+ const httpParams = new HttpParams()
+ .set('fromLoanOfficerId', officerId.toString())
+ .set('officeId', officerId.toString());
+ return this.http.get('/loans/loanreassignment/template', { params: httpParams });
+ }
+
+ /**
+ * Bulk Loan Reassignment.
+ * @param loanData Load Data to be created.
+ * @returns {Observable}
+ */
+ createLoanReassignment(loanData: any): Observable {
+ return this.http.post('/loans/loanreassignment', loanData);
+ }
+
/**
* @param {string} officeId Office ID of Office.
* @param {boolean} template