diff --git a/src/app/organization/organization-routing.module.ts b/src/app/organization/organization-routing.module.ts index 043200631..2cfb51daa 100644 --- a/src/app/organization/organization-routing.module.ts +++ b/src/app/organization/organization-routing.module.ts @@ -58,7 +58,8 @@ import { EditCampaignComponent } from './sms-campaigns/edit-campaign/edit-campai import { CreateEnityDataTableChecksComponent } from './entity-data-table-checks/create-enity-data-table-checks/create-enity-data-table-checks.component'; import { CreateLoanProvisioningCriteriaComponent } from './loan-provisioning-criteria/create-loan-provisioning-criteria/create-loan-provisioning-criteria.component'; import { BulkLoanReassignmnetComponent } from './bulk-loan-reassignmnet/bulk-loan-reassignmnet.component'; -import {EditLoanProvisioningCriteriaComponent } from './loan-provisioning-criteria/edit-loan-provisioning-criteria/edit-loan-provisioning-criteria.component'; +import { EditLoanProvisioningCriteriaComponent } from './loan-provisioning-criteria/edit-loan-provisioning-criteria/edit-loan-provisioning-criteria.component'; +import { StandingInstructionsHistoryComponent } from './standing-instructions-history/standing-instructions-history.component'; /** Custom Resolvers */ import { LoanProvisioningCriteriaResolver } from './loan-provisioning-criteria/common-resolvers/loan-provisioning-criteria.resolver'; @@ -88,7 +89,7 @@ import { OfficeDatatableResolver } from './offices/common-resolvers/office-datat import { OfficeDatatablesResolver } from './offices/common-resolvers/office-datatables.resolver'; import { SmsCampaignResolver } from './sms-campaigns/common-resolvers/sms-campaign.resolver'; import { ManageFundsResolver } from './manage-funds/manage-funds.resolver'; -import { CashierTransactionTemplateResolver } from './tellers/teller-transaction-template.resolver'; +import { CashierTransactionTemplateResolver } from './tellers/common-resolvers/teller-transaction-template.resolver'; import { EditCashierResolver } from './tellers/common-resolvers/edit-cashier.resolver'; import { HolidayTemplateResolver } from './holidays/holiday-template.resolver'; import { AdhocQueryAndTemplateResolver } from './adhoc-query/common-resolvers/adhoc-query-and-template.resolver'; @@ -97,6 +98,7 @@ import { SmsCampaignTemplateResolver } from './sms-campaigns/common-resolvers/sm import { EntityDataTableChecksTemplateResolver } from './entity-data-table-checks/enitity-data-table-checks-template.resolver'; import { LoanProvisioningCriteriaTemplateResolver } from './loan-provisioning-criteria/common-resolvers/loan-provisioning-criteria-template.resolver'; import { LoanProvisioningCriteriaAndTemplateResolver } from './loan-provisioning-criteria/common-resolvers/loan-provisioning-criteria-and-template.resolver'; +import { StandingInstructionsTemplateResolver } from './standing-instructions-history/standing-instructions-template.resolver'; /** Organization Routes */ const routes: Routes = [ @@ -319,6 +321,14 @@ const routes: Routes = [ } ] }, + { + path: 'standing-instructions-history', + component: StandingInstructionsHistoryComponent, + data: { title: extract('Standing Instructions History'), breadcrumb: 'Standing Instructions History' }, + resolve: { + standingInstructionsTemplate: StandingInstructionsTemplateResolver + } + }, { path: 'adhoc-query', data: { title: extract('Adhoc Query'), breadcrumb: 'Adhoc Query' }, @@ -663,7 +673,8 @@ const routes: Routes = [ EntityDataTableChecksTemplateResolver, LoanProvisioningCriteriasResolver, LoanProvisioningCriteriaTemplateResolver, - LoanProvisioningCriteriaAndTemplateResolver + LoanProvisioningCriteriaAndTemplateResolver, + StandingInstructionsTemplateResolver ] }) export class OrganizationRoutingModule { } diff --git a/src/app/organization/organization.component.html b/src/app/organization/organization.component.html index 67ff39ce0..50385a574 100644 --- a/src/app/organization/organization.component.html +++ b/src/app/organization/organization.component.html @@ -32,7 +32,7 @@

An employee represents loan officers with no access to systems

- + diff --git a/src/app/organization/organization.module.ts b/src/app/organization/organization.module.ts index 2fff2032e..3eb39fbac 100644 --- a/src/app/organization/organization.module.ts +++ b/src/app/organization/organization.module.ts @@ -66,6 +66,7 @@ import { CreateEnityDataTableChecksComponent } from './entity-data-table-checks/ import { BulkLoanReassignmnetComponent } from './bulk-loan-reassignmnet/bulk-loan-reassignmnet.component'; import { CreateLoanProvisioningCriteriaComponent } from './loan-provisioning-criteria/create-loan-provisioning-criteria/create-loan-provisioning-criteria.component'; import { EditLoanProvisioningCriteriaComponent } from './loan-provisioning-criteria/edit-loan-provisioning-criteria/edit-loan-provisioning-criteria.component'; +import { StandingInstructionsHistoryComponent } from './standing-instructions-history/standing-instructions-history.component'; /** * Organization Module @@ -138,6 +139,7 @@ import { EditLoanProvisioningCriteriaComponent } from './loan-provisioning-crite BulkLoanReassignmnetComponent, CreateLoanProvisioningCriteriaComponent, EditLoanProvisioningCriteriaComponent, + StandingInstructionsHistoryComponent, ] }) export class OrganizationModule { } diff --git a/src/app/organization/organization.service.ts b/src/app/organization/organization.service.ts index a458a0d18..338dd7b24 100644 --- a/src/app/organization/organization.service.ts +++ b/src/app/organization/organization.service.ts @@ -682,11 +682,31 @@ export class OrganizationService { * @returns {Observable} Imports data. */ getImports(entity: string): Observable { - const httpParams = new HttpParams() - .set('entityType', entity); + const httpParams = new HttpParams().set('entityType', entity); return this.http.get('/imports', { params: httpParams } ); } + /** + * @returns {Observable} + */ + getStandingInstructionTemplate(): Observable { + return this.http.get('/standinginstructions/template'); + } + + /** + * @param {any} instruction + * @returns {Observable} Standing Instructions + */ + getStandingInstructions(instruction: any): Observable { + let httpParams = new HttpParams(); + for (const key in instruction) { + if (instruction[key] !== '' && instruction[key] !== null) { + httpParams = httpParams.set(key, instruction[key]); + } + } + return this.http.get(`/standinginstructionrunhistory`, { params: httpParams }); + } + /** * @param urlSuffix of Bulk-Import * @param officeId Office ID for template retrieval diff --git a/src/app/organization/standing-instructions-history/standing-instructions-history.component.html b/src/app/organization/standing-instructions-history/standing-instructions-history.component.html new file mode 100644 index 000000000..484446f7d --- /dev/null +++ b/src/app/organization/standing-instructions-history/standing-instructions-history.component.html @@ -0,0 +1,141 @@ +
+ + + +
+ + + +
+ + + Client Name + + + + + Client Id + + + + + Transfer Type + + + {{ transferType.value }} + + + + + + Account Type + + + {{ accountType.value }} + + + + + + From Account ID + + + + + From Date + + + + + + + To Date + + + + + +
+ +
+ + + + + + +
+ +
+ +
+ +
+ + + +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
From Client {{ instruction.fromClient.displayName }}({{ instruction.fromClient.id }}) From Account {{ instruction.fromAccount.productName }}({{ instruction.fromAccount.id }}) To Client {{ instruction.toClient.displayName }}({{ instruction.toClient.id }}) To Account {{ instruction.toAccount.productName }}({{ instruction.toAccount.id }}) Execution Time {{ instruction.executionTime }} Amount {{ instruction.amount | number }} Status {{ instruction.status }} Error Log + +
+ + + +
+ +
diff --git a/src/app/organization/standing-instructions-history/standing-instructions-history.component.scss b/src/app/organization/standing-instructions-history/standing-instructions-history.component.scss new file mode 100644 index 000000000..08a2e2bee --- /dev/null +++ b/src/app/organization/standing-instructions-history/standing-instructions-history.component.scss @@ -0,0 +1,12 @@ +.input { + max-width: 37rem; +} + +.output { + .error-log{ + min-width: 26px; + padding: 0 6px; + margin: 4px; + line-height: 25px; + } +} diff --git a/src/app/organization/standing-instructions-history/standing-instructions-history.component.spec.ts b/src/app/organization/standing-instructions-history/standing-instructions-history.component.spec.ts new file mode 100644 index 000000000..750c13d1c --- /dev/null +++ b/src/app/organization/standing-instructions-history/standing-instructions-history.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { StandingInstructionsHistoryComponent } from './standing-instructions-history.component'; + +describe('StandingInstructionsHistoryComponent', () => { + let component: StandingInstructionsHistoryComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ StandingInstructionsHistoryComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(StandingInstructionsHistoryComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/organization/standing-instructions-history/standing-instructions-history.component.ts b/src/app/organization/standing-instructions-history/standing-instructions-history.component.ts new file mode 100644 index 000000000..ab6ee00d4 --- /dev/null +++ b/src/app/organization/standing-instructions-history/standing-instructions-history.component.ts @@ -0,0 +1,115 @@ +/** Angular Imports */ +import { Component, OnInit, ViewChild } from '@angular/core'; +import { MatTableDataSource, MatPaginator, MatSort, MatTable } from '@angular/material'; +import { FormGroup, FormBuilder, FormControl } from '@angular/forms'; +import { Router, ActivatedRoute } from '@angular/router'; +import { DatePipe } from '@angular/common'; + +/** Custom Services */ +import { OrganizationService } from '../organization.service'; + +/** + * View Standing Instructions History Component. + */ +@Component({ + selector: 'mifosx-standing-instructions-history', + templateUrl: './standing-instructions-history.component.html', + styleUrls: ['./standing-instructions-history.component.scss'] +}) +export class StandingInstructionsHistoryComponent implements OnInit { + + /** Minimum Date allowed. */ + minDate = new Date(2000, 0, 1); + /** Maximum Date allowed. */ + maxDate = new Date(); + /** Instruction form. */ + instructionForm: FormGroup; + /** Standing Instructions Template */ + standingInstructionsTemplate: any; + /** Toggles b/w form and table */ + isCollapsed = false; + + /** Columns to be displayed in instructions table. */ + displayedColumns: string[] = ['fromClient', 'fromAccount', 'toClient', 'toAccount', 'executionTime', 'amount', 'status', 'errorLog']; + /** Data source for instructions table. */ + dataSource: MatTableDataSource; + + /** Paginator for instructions table. */ + @ViewChild(MatPaginator) paginator: MatPaginator; + /** Sorter for instructions table. */ + @ViewChild(MatSort) sort: MatSort; + + /** + * Retrieves the instructions template from `resolve`. + * @param {FormBuilder} formBuilder Form Builder. + * @param {OrganizationService} organizationService Organization Service. + * @param {ActivatedRoute} route Activated Route. + * @param {Router} router Router for navigation. + * @param {DatePipe} datePipe Date Pipe to format date. + */ + constructor(private formBuilder: FormBuilder, + private organizationService: OrganizationService, + private router: Router, + private route: ActivatedRoute, + private datePipe: DatePipe) { + this.route.data.subscribe((data: { standingInstructionsTemplate: any }) => { + this.standingInstructionsTemplate = data.standingInstructionsTemplate; + }); + } + + ngOnInit() { + this.createInstructionForm(); + this.buildDependencies(); + } + + /** + * Creates the Instruction Form + */ + createInstructionForm() { + this.instructionForm = this.formBuilder.group({ + 'clientName': [''], + 'clientId': [''], + 'transferType': [''], + 'fromAccountType': [''], + 'fromDate': [''], + 'toDate': [''] + }); + } + + /** + * Sets conditional child controls. + */ + buildDependencies() { + this.instructionForm.get('fromAccountType').valueChanges.subscribe(() => { + this.instructionForm.addControl('fromAccountId', new FormControl('')); + }); + } + + /** + * Initializes the data source, paginator and sorter for instructions table. + * @param {any} data + */ + setInstructions(data: any) { + this.dataSource = new MatTableDataSource(data); + this.dataSource.paginator = this.paginator; + this.dataSource.sort = this.sort; + } + + /** + * Searches standing instructions. + */ + search() { + this.isCollapsed = true; + // TODO: Update once language and date settings are setup + const dateFormat = 'dd MMMM yyyy'; + const instruction = this.instructionForm.value; + instruction.locale = 'en'; + instruction.dateFormat = dateFormat; + instruction.fromDate = this.datePipe.transform(instruction.fromDate, dateFormat); + instruction.toDate = this.datePipe.transform(instruction.toDate, dateFormat); + this.organizationService.getStandingInstructions(instruction).subscribe((response: any) => { + this.setInstructions(response.pageItems); + }); + } + +} diff --git a/src/app/organization/standing-instructions-history/standing-instructions-template.resolver.ts b/src/app/organization/standing-instructions-history/standing-instructions-template.resolver.ts new file mode 100644 index 000000000..cdb9e989d --- /dev/null +++ b/src/app/organization/standing-instructions-history/standing-instructions-template.resolver.ts @@ -0,0 +1,30 @@ +/** Angular Imports */ +import { Injectable } from '@angular/core'; +import { Resolve } from '@angular/router'; + +/** rxjs Imports */ +import { Observable } from 'rxjs'; + +/** Custom Services */ +import { OrganizationService } from '../organization.service'; + +/** + * Standing Instructions Template resolver. + */ +@Injectable() +export class StandingInstructionsTemplateResolver implements Resolve { + + /** + * @param {OrganizationService} organizationService Organization service. + */ + constructor(private organizationService: OrganizationService) {} + + /** + * Returns the Standing Instruction template. + * @returns {Observable} + */ + resolve(): Observable { + return this.organizationService.getStandingInstructionTemplate(); + } + +} diff --git a/src/app/organization/tellers/teller-transaction-template.resolver.ts b/src/app/organization/tellers/common-resolvers/teller-transaction-template.resolver.ts similarity index 100% rename from src/app/organization/tellers/teller-transaction-template.resolver.ts rename to src/app/organization/tellers/common-resolvers/teller-transaction-template.resolver.ts