@@ -0,0 +1,34 @@
|
|||||||
|
/** 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';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Loans notes data resolver.
|
||||||
|
*/
|
||||||
|
@Injectable()
|
||||||
|
export class LoanActionButtonResolver implements Resolve<Object> {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param {LoansService} LoansService Loans service.
|
||||||
|
*/
|
||||||
|
constructor(private loansService: LoansService) { }
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the Loans Notes Data.
|
||||||
|
* @returns {Observable<any>}
|
||||||
|
*/
|
||||||
|
resolve(route: ActivatedRouteSnapshot): Observable<any> {
|
||||||
|
const loanId = route.parent.paramMap.get('loanId');
|
||||||
|
const loanActionButton = route.paramMap.get('action');
|
||||||
|
// if (loanActionButton === 'assign-loan-officer') {
|
||||||
|
return this.loansService.getLoanTemplate(loanId);
|
||||||
|
// }
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -27,6 +27,7 @@ import { LoanDetailsChargesResolver } from './common-resolvers/loan-details-char
|
|||||||
import { LoanAccountActionsComponent } from './loans-view/loan-account-actions/loan-account-actions.component';
|
import { LoanAccountActionsComponent } from './loans-view/loan-account-actions/loan-account-actions.component';
|
||||||
import { LoanDatatablesResolver } from './common-resolvers/loan-datatables.resolver';
|
import { LoanDatatablesResolver } from './common-resolvers/loan-datatables.resolver';
|
||||||
import { LoanDatatableResolver } from './common-resolvers/loan-datatable.resolver';
|
import { LoanDatatableResolver } from './common-resolvers/loan-datatable.resolver';
|
||||||
|
import { LoanActionButtonResolver } from './common-resolvers/loan-action-button-resolver';
|
||||||
|
|
||||||
const routes: Routes = [
|
const routes: Routes = [
|
||||||
{
|
{
|
||||||
@@ -129,6 +130,9 @@ const routes: Routes = [
|
|||||||
path: ':action',
|
path: ':action',
|
||||||
component: LoanAccountActionsComponent,
|
component: LoanAccountActionsComponent,
|
||||||
data: { title: extract('Loan Account Actions'), routeParamBreadcrumb: 'action' },
|
data: { title: extract('Loan Account Actions'), routeParamBreadcrumb: 'action' },
|
||||||
|
resolve: {
|
||||||
|
actionButtonData: LoanActionButtonResolver
|
||||||
|
}
|
||||||
},
|
},
|
||||||
]
|
]
|
||||||
}]
|
}]
|
||||||
@@ -145,7 +149,8 @@ const routes: Routes = [
|
|||||||
LoanNotesResolver,
|
LoanNotesResolver,
|
||||||
LoanDetailsChargesResolver,
|
LoanDetailsChargesResolver,
|
||||||
LoanDatatablesResolver,
|
LoanDatatablesResolver,
|
||||||
LoanDatatableResolver
|
LoanDatatableResolver,
|
||||||
|
LoanActionButtonResolver
|
||||||
]
|
]
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|||||||
+42
@@ -0,0 +1,42 @@
|
|||||||
|
<div class="container">
|
||||||
|
|
||||||
|
<form [formGroup]="assignOfficerForm" (ngSubmit)="submit()">
|
||||||
|
|
||||||
|
<mat-card-content>
|
||||||
|
|
||||||
|
<div fxLayout="column">
|
||||||
|
|
||||||
|
<mat-form-field>
|
||||||
|
<mat-label> To Loan Officer</mat-label>
|
||||||
|
<mat-select required formControlName="toLoanOfficerId">
|
||||||
|
<mat-option *ngFor="let loanOfficer of loanOfficers" [value]="loanOfficer.id">
|
||||||
|
{{ loanOfficer.displayName }}
|
||||||
|
</mat-option>
|
||||||
|
</mat-select>
|
||||||
|
<mat-error *ngIf="assignOfficerForm.controls.toLoanOfficerId.hasError('required')">
|
||||||
|
Loan Officer is <strong>required</strong>
|
||||||
|
</mat-error>
|
||||||
|
</mat-form-field>
|
||||||
|
|
||||||
|
<mat-form-field>
|
||||||
|
<mat-label>Assignment Date</mat-label>
|
||||||
|
<input matInput [min]="minDate" [max]="maxDate" [matDatepicker]="assignOnDatePicker" required formControlName="assignmentDate">
|
||||||
|
<mat-datepicker-toggle matSuffix [for]="assignOnDatePicker"></mat-datepicker-toggle>
|
||||||
|
<mat-datepicker #assignOnDatePicker></mat-datepicker>
|
||||||
|
<mat-error *ngIf="assignOfficerForm.controls.assignmentDate.hasError('required')">
|
||||||
|
Assignment Date <strong>is required</strong>
|
||||||
|
</mat-error>
|
||||||
|
</mat-form-field>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<mat-card-actions fxLayout="row" fxLayout.xs="column" fxLayoutAlign="center" fxLayoutGap="5px">
|
||||||
|
<button type="button" mat-raised-button [routerLink]="['../general']">Cancel</button>
|
||||||
|
<button mat-raised-button color="primary" [disabled]="!assignOfficerForm.valid" *mifosxHasPermission="'BULKREASSIGN_LOAN'">Submit</button>
|
||||||
|
</mat-card-actions>
|
||||||
|
|
||||||
|
</mat-card-content>
|
||||||
|
|
||||||
|
</form>
|
||||||
|
|
||||||
|
</div>
|
||||||
+25
@@ -0,0 +1,25 @@
|
|||||||
|
import { async, ComponentFixture, TestBed } from '@angular/core/testing';
|
||||||
|
|
||||||
|
import { AssignLoanOfficerComponent } from './assign-loan-officer.component';
|
||||||
|
|
||||||
|
describe('AssignLoanOfficerComponent', () => {
|
||||||
|
let component: AssignLoanOfficerComponent;
|
||||||
|
let fixture: ComponentFixture<AssignLoanOfficerComponent>;
|
||||||
|
|
||||||
|
beforeEach(async(() => {
|
||||||
|
TestBed.configureTestingModule({
|
||||||
|
declarations: [ AssignLoanOfficerComponent ]
|
||||||
|
})
|
||||||
|
.compileComponents();
|
||||||
|
}));
|
||||||
|
|
||||||
|
beforeEach(() => {
|
||||||
|
fixture = TestBed.createComponent(AssignLoanOfficerComponent);
|
||||||
|
component = fixture.componentInstance;
|
||||||
|
fixture.detectChanges();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should create', () => {
|
||||||
|
expect(component).toBeTruthy();
|
||||||
|
});
|
||||||
|
});
|
||||||
+75
@@ -0,0 +1,75 @@
|
|||||||
|
import { Component, OnInit, Input } from '@angular/core';
|
||||||
|
import { ActivatedRoute, Router } from '@angular/router';
|
||||||
|
import { DatePipe } from '@angular/common';
|
||||||
|
import { MatDialog } from '@angular/material';
|
||||||
|
import { LoansService } from 'app/loans/loans.service';
|
||||||
|
import { FormGroup, FormBuilder, Validators } from '@angular/forms';
|
||||||
|
|
||||||
|
@Component({
|
||||||
|
selector: 'mifosx-assign-loan-officer',
|
||||||
|
templateUrl: './assign-loan-officer.component.html',
|
||||||
|
styleUrls: ['./assign-loan-officer.component.scss']
|
||||||
|
})
|
||||||
|
export class AssignLoanOfficerComponent implements OnInit {
|
||||||
|
|
||||||
|
@Input() dataObject: any;
|
||||||
|
/** Loan Id */
|
||||||
|
loanId: string;
|
||||||
|
loanOfficers: any[];
|
||||||
|
/** Minimum Date allowed. */
|
||||||
|
minDate = new Date(2000, 0, 1);
|
||||||
|
/** Maximum Date allowed. */
|
||||||
|
maxDate = new Date();
|
||||||
|
/** Assign loan Officer form. */
|
||||||
|
assignOfficerForm: FormGroup;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param {FormBuilder} formBuilder Form Builder.
|
||||||
|
* @param {LoansService} systemService Loan Service.
|
||||||
|
* @param {ActivatedRoute} route Activated Route.
|
||||||
|
* @param {Router} router Router for navigation.
|
||||||
|
*/
|
||||||
|
constructor(private formBuilder: FormBuilder,
|
||||||
|
private loanService: LoansService,
|
||||||
|
private route: ActivatedRoute,
|
||||||
|
private router: Router,
|
||||||
|
private datePipe: DatePipe) {
|
||||||
|
this.loanId = this.route.parent.snapshot.params['loanId'];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates the assign officer form.
|
||||||
|
*/
|
||||||
|
ngOnInit() {
|
||||||
|
this.createassignOfficerForm();
|
||||||
|
this.loanOfficers = this.dataObject.loanOfficerOptions;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates the create close form.
|
||||||
|
*/
|
||||||
|
createassignOfficerForm() {
|
||||||
|
this.assignOfficerForm = this.formBuilder.group({
|
||||||
|
'toLoanOfficerId': ['', Validators.required],
|
||||||
|
'assignmentDate': [new Date(), Validators.required]
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
submit() {
|
||||||
|
const assignmentDatee = this.assignOfficerForm.value.assignmentDate;
|
||||||
|
const dateFormat = 'yyyy-MM-dd';
|
||||||
|
this.assignOfficerForm.patchValue({
|
||||||
|
assignmentDate: this.datePipe.transform(assignmentDatee, dateFormat)
|
||||||
|
});
|
||||||
|
const assignForm = this.assignOfficerForm.value;
|
||||||
|
assignForm.locale = 'en';
|
||||||
|
assignForm.dateFormat = dateFormat;
|
||||||
|
assignForm.fromLoanOfficerId = this.dataObject.loanOfficerId || '';
|
||||||
|
|
||||||
|
this.loanService.loanActionButtons(this.loanId, assignForm, 'assignLoanOfficer')
|
||||||
|
.subscribe((response: any) => {
|
||||||
|
this.router.navigate([`../../${this.loanId}/general`], { relativeTo: this.route });
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -2,5 +2,6 @@
|
|||||||
<mat-card>
|
<mat-card>
|
||||||
<mifosx-loans-account-close *ngIf="actions.close"></mifosx-loans-account-close>
|
<mifosx-loans-account-close *ngIf="actions.close"></mifosx-loans-account-close>
|
||||||
<mifosx-undo-approval *ngIf="actions.undo_approval"></mifosx-undo-approval>
|
<mifosx-undo-approval *ngIf="actions.undo_approval"></mifosx-undo-approval>
|
||||||
|
<mifosx-assign-loan-officer *ngIf="actions.assign_loan_officer" [dataObject]="actionButtonData" ></mifosx-assign-loan-officer>
|
||||||
</mat-card>
|
</mat-card>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -13,7 +13,14 @@ import { ActivatedRoute, Router } from '@angular/router';
|
|||||||
export class LoanAccountActionsComponent {
|
export class LoanAccountActionsComponent {
|
||||||
|
|
||||||
/** flag object to store possible actions and render appropriate UI to the user */
|
/** flag object to store possible actions and render appropriate UI to the user */
|
||||||
actions: { close: boolean, undo_approval: boolean } = { close: false, undo_approval: false };
|
actions: { close: boolean,
|
||||||
|
undo_approval: boolean,
|
||||||
|
assign_loan_officer: boolean } = {
|
||||||
|
close: false,
|
||||||
|
undo_approval: false,
|
||||||
|
assign_loan_officer: false };
|
||||||
|
actionButtonData: any;
|
||||||
|
actionName: any;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param router Router.
|
* @param router Router.
|
||||||
@@ -21,11 +28,16 @@ export class LoanAccountActionsComponent {
|
|||||||
*/
|
*/
|
||||||
constructor(private router: Router,
|
constructor(private router: Router,
|
||||||
private route: ActivatedRoute) {
|
private route: ActivatedRoute) {
|
||||||
|
this.route.data.subscribe(( data: { actionButtonData: any }) => {
|
||||||
|
this.actionButtonData = data.actionButtonData;
|
||||||
|
});
|
||||||
|
|
||||||
this.route.params.subscribe(params => {
|
this.route.params.subscribe(params => {
|
||||||
if (params['action'].indexOf('-') > 0) {
|
this.actionName = params['action'];
|
||||||
this.actions[params['action'].replace('-', '_')] = true;
|
if (this.actionName === 'change-loan-officer') {
|
||||||
|
this.actionName = 'assign-loan-officer';
|
||||||
}
|
}
|
||||||
this.actions[params['action']] = true;
|
this.actions[this.actionName.replace(/-/g, '_')] = true;
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+1
-1
@@ -37,7 +37,7 @@ export class UndoApprovalComponent implements OnInit {
|
|||||||
*/
|
*/
|
||||||
submit() {
|
submit() {
|
||||||
const loanId = this.route.parent.snapshot.params['loanId'];
|
const loanId = this.route.parent.snapshot.params['loanId'];
|
||||||
this.loanService.undoLoanApproval(loanId, {'note': this.note.value}).subscribe((response: any) => {
|
this.loanService.loanActionButtons(loanId, {'note': this.note.value}, 'undoapproval').subscribe((response: any) => {
|
||||||
this.router.navigate(['../general'], {relativeTo: this.route});
|
this.router.navigate(['../general'], {relativeTo: this.route});
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -111,7 +111,7 @@ export class LoansViewComponent implements OnInit {
|
|||||||
}
|
}
|
||||||
|
|
||||||
loanAction(button: string) {
|
loanAction(button: string) {
|
||||||
button = button.replace(' ', '-').toLowerCase();
|
button = button.replace(/\s/g, '-').toLowerCase();
|
||||||
this.router.navigate([button], { relativeTo: this.route });
|
this.router.navigate([button], { relativeTo: this.route });
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -25,6 +25,7 @@ import { DatatableTabComponent } from './loans-view/datatable-tab/datatable-tab.
|
|||||||
import { MultiRowComponent } from './loans-view/datatable-tab/multi-row/multi-row.component';
|
import { MultiRowComponent } from './loans-view/datatable-tab/multi-row/multi-row.component';
|
||||||
import { SingleRowComponent } from './loans-view/datatable-tab/single-row/single-row.component';
|
import { SingleRowComponent } from './loans-view/datatable-tab/single-row/single-row.component';
|
||||||
import { UndoApprovalComponent } from './loans-view/loan-account-actions/undo-approval/undo-approval.component';
|
import { UndoApprovalComponent } from './loans-view/loan-account-actions/undo-approval/undo-approval.component';
|
||||||
|
import { AssignLoanOfficerComponent } from './loans-view/loan-account-actions/assign-loan-officer/assign-loan-officer.component';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Loans Module
|
* Loans Module
|
||||||
@@ -50,6 +51,7 @@ import { UndoApprovalComponent } from './loans-view/loan-account-actions/undo-ap
|
|||||||
MultiRowComponent,
|
MultiRowComponent,
|
||||||
SingleRowComponent,
|
SingleRowComponent,
|
||||||
UndoApprovalComponent,
|
UndoApprovalComponent,
|
||||||
|
AssignLoanOfficerComponent,
|
||||||
],
|
],
|
||||||
providers: [DatePipe],
|
providers: [DatePipe],
|
||||||
})
|
})
|
||||||
|
|||||||
@@ -26,6 +26,18 @@ export class LoansService {
|
|||||||
return this.http.get(`/loans/${loanId}/transactions/template`, { params: httpParams });
|
return this.http.get(`/loans/${loanId}/transactions/template`, { params: httpParams });
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the loan template data with specific condition
|
||||||
|
* @param loanId Loan Id
|
||||||
|
*/
|
||||||
|
getLoanTemplate(loanId: string): Observable<any> {
|
||||||
|
const httpParams = new HttpParams()
|
||||||
|
.set('fields', 'id,loanOfficerId,loanOfficerOptions')
|
||||||
|
.set('staffInSelectedOfficeOnly', 'true')
|
||||||
|
.set('template', 'true');
|
||||||
|
return this.http.get(`/loans/${loanId}`, { params: httpParams });
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param {any} loanCharge to apply on a Loan Account.
|
* @param {any} loanCharge to apply on a Loan Account.
|
||||||
* @returns {Observable<any>}
|
* @returns {Observable<any>}
|
||||||
@@ -146,13 +158,12 @@ export class LoansService {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Undo Loan Approval.
|
|
||||||
* @param {string} loanId Loan Id.
|
* @param {string} loanId Loan Id.
|
||||||
* @param {any} data Data.
|
* @param {any} data Data.
|
||||||
* @returns {Observable<any>}
|
* @returns {Observable<any>}
|
||||||
*/
|
*/
|
||||||
undoLoanApproval(loanId: string, data: any): Observable<any> {
|
loanActionButtons(loanId: string, data: any, command: any): Observable<any> {
|
||||||
const httpParams = new HttpParams().set('command', 'undoapproval');
|
const httpParams = new HttpParams().set('command', command);
|
||||||
return this.http.post(`/loans/${loanId}`, data, {params: httpParams});
|
return this.http.post(`/loans/${loanId}`, data, {params: httpParams});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -10,7 +10,7 @@ export const environment = {
|
|||||||
production: false,
|
production: false,
|
||||||
version: env.npm_package_version + '-dev',
|
version: env.npm_package_version + '-dev',
|
||||||
fineractPlatformTenantId: 'default', // For connecting to server running elsewhere update the tenant identifier
|
fineractPlatformTenantId: 'default', // For connecting to server running elsewhere update the tenant identifier
|
||||||
baseApiUrl: 'https://staging.mifos.io', // For connecting to server running elsewhere update the base API URL
|
baseApiUrl: 'https://dev.mifos.io', // For connecting to server running elsewhere update the base API URL
|
||||||
apiProvider: '/fineract-provider/api',
|
apiProvider: '/fineract-provider/api',
|
||||||
apiVersion: '/v1',
|
apiVersion: '/v1',
|
||||||
serverUrl: '',
|
serverUrl: '',
|
||||||
|
|||||||
Reference in New Issue
Block a user