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 @@ +
+ + + +
+ + + +
+ + + Office + + + {{ office.name }} + + + + +
+ +
+ + + Assignment Date + + + + + Assignment Date is required + + + +
+ +
+ + + From loan officer + + + {{ fromOfficers.displayName }} + + + + From Loan Officer is required + + + +
+ +
+ + + To loan officer + + + {{ toOfficers.displayName }} + + + + To Loan Officer is required + + + +
+ +
+ + + + + + + + + + + + + +
Clients
+ + + + + + + + + + + + + +
{{ clients.displayName }}
+ + {{ loans.productName}}({{ loans.accountNo }}) + +
+ + + + + + + + + + + + + + + + + + + +
Groups
+ + + + + + + + + + + + + +
{{ groups.displayName }}
+ + {{ loans.productName}}({{ loans.accountNo }}) + +
+ + + + + + + +
+ +
+ + + + + + +
+ +
+ +
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