diff --git a/src/app/account-transfers/account-transfers-routing.module.ts b/src/app/account-transfers/account-transfers-routing.module.ts index 1ea58416a..e1438f1ab 100644 --- a/src/app/account-transfers/account-transfers-routing.module.ts +++ b/src/app/account-transfers/account-transfers-routing.module.ts @@ -14,6 +14,8 @@ import { CreateStandingInstructionsComponent } from './create-standing-instructi import { ViewStandingInstructionsResolver } from './common-resolvers/view-standing-instructions.resolver'; import { StandingInstructionsDataAndTemplateResolver } from './common-resolvers/standing-instructions-data-and-template.resolver'; import { StandingInstructionsTemplateResolver } from './common-resolvers/standing-instructions-template.resolver'; +import { MakeAccountTransersComponent } from './make-account-transers/make-account-transers.component'; +import { MakeAccountTransferTemplateResolver } from './common-resolvers/make-account-transfer-template.resolver'; /** Loans Route. */ const routes: Routes = [ @@ -28,6 +30,14 @@ const routes: Routes = [ standingIntructionsTemplate: StandingInstructionsTemplateResolver } }, + { + path: 'make-account-transfer', + data: { title: extract('Account Transfer'), breadcrumb: 'Account Transfer', routeParamBreadcrumb: 'Account Transfer' }, + component: MakeAccountTransersComponent, + resolve: { + accountTransferTemplate: MakeAccountTransferTemplateResolver + } + }, { path: ':standingInstructionsId', data: { title: extract('Standing Instructions'), routeParamBreadcrumb: 'standingInstructionsId' }, @@ -60,7 +70,8 @@ const routes: Routes = [ providers: [ ViewStandingInstructionsResolver, StandingInstructionsDataAndTemplateResolver, - StandingInstructionsTemplateResolver + StandingInstructionsTemplateResolver, + MakeAccountTransferTemplateResolver ] }) diff --git a/src/app/account-transfers/account-transfers.module.ts b/src/app/account-transfers/account-transfers.module.ts index e485d08a1..d22be1481 100644 --- a/src/app/account-transfers/account-transfers.module.ts +++ b/src/app/account-transfers/account-transfers.module.ts @@ -12,6 +12,7 @@ import { DirectivesModule } from '../directives/directives.module'; import { ViewStandingInstructionsComponent } from './view-standing-instructions/view-standing-instructions.component'; import { EditStandingInstructionsComponent } from './edit-standing-instructions/edit-standing-instructions.component'; import { CreateStandingInstructionsComponent } from './create-standing-instructions/create-standing-instructions.component'; +import { MakeAccountTransersComponent } from './make-account-transers/make-account-transers.component'; /** * Account Transfers Module @@ -23,7 +24,8 @@ import { CreateStandingInstructionsComponent } from './create-standing-instructi declarations: [ ViewStandingInstructionsComponent, EditStandingInstructionsComponent, - CreateStandingInstructionsComponent + CreateStandingInstructionsComponent, + MakeAccountTransersComponent ], providers: [DatePipe] }) diff --git a/src/app/account-transfers/account-transfers.service.ts b/src/app/account-transfers/account-transfers.service.ts index fb2dc9445..58b644eba 100644 --- a/src/app/account-transfers/account-transfers.service.ts +++ b/src/app/account-transfers/account-transfers.service.ts @@ -51,4 +51,22 @@ export class AccountTransfersService { return this.http.post(`/standinginstructions`, data); } + newAccountTranferResource(id: any, accountTypeId: any, formValue?: any): Observable { + let httpParams = new HttpParams().set('fromAccountId', id) + .set('fromAccountType', accountTypeId); + if (formValue) { + const propNames = Object.getOwnPropertyNames(formValue); + for (let i = 0; i < propNames.length; i++) { + const propName = propNames[i]; + httpParams = httpParams.set(propName, formValue[propName]); + } + } + return this.http.get(`/accounttransfers/template`, { params: httpParams }); + + } + + createAccountTransfer(data: any): Observable { + return this.http.post(`/accounttransfers`, data); + } + } diff --git a/src/app/account-transfers/common-resolvers/make-account-transfer-template.resolver.ts b/src/app/account-transfers/common-resolvers/make-account-transfer-template.resolver.ts new file mode 100644 index 000000000..173702da0 --- /dev/null +++ b/src/app/account-transfers/common-resolvers/make-account-transfer-template.resolver.ts @@ -0,0 +1,46 @@ +/** Angular Imports */ +import { Injectable } from '@angular/core'; +import { Resolve, ActivatedRouteSnapshot } from '@angular/router'; + +/** rxjs Imports */ +import { Observable } from 'rxjs'; + +/** Custom Services */ +import { AccountTransfersService } from '../account-transfers.service'; + +/** + * View Standing Instructions resolver. + */ +@Injectable() +export class MakeAccountTransferTemplateResolver implements Resolve { + + accountTypeId: string; + id: any; + /** + * @param {accountTransfersService} AccountTransfersService Account Transfers service. + */ + constructor(private accountTransfersService: AccountTransfersService) { } + + /** + * Returns the Standing Instructions Data. + * @param {ActivatedRouteSnapshot} route Route Snapshot + * @returns {Observable} + */ + resolve(route: ActivatedRouteSnapshot): Observable { + const accountType = route.queryParamMap.get('accountType'); + switch (accountType) { + case 'fromloans': + this.accountTypeId = '1'; + this.id = route.queryParamMap.get('loanId'); + break; + case 'fromsavings': + this.accountTypeId = '2'; + this.id = route.queryParamMap.get('savingsId'); + break; + default: + this.accountTypeId = '0'; + } + return this.accountTransfersService.newAccountTranferResource(this.id, this.accountTypeId); + } + +} diff --git a/src/app/account-transfers/make-account-transers/make-account-transers.component.html b/src/app/account-transfers/make-account-transers/make-account-transers.component.html new file mode 100644 index 000000000..2a3ed03f7 --- /dev/null +++ b/src/app/account-transfers/make-account-transers/make-account-transers.component.html @@ -0,0 +1,141 @@ +
+ + + + + +
+ +

Transferring From Details

+ + + +
+ Applicant + {{ accountTransferTemplateData.fromClient.displayName }} +
+ +
+ Office + {{ accountTransferTemplateData.fromOffice.name }} +
+ +
+ From Account + {{ accountTransferTemplateData.fromAccount.productName}} - #{{ accountTransferTemplateData.fromAccount.accountNo }} +
+ +
+ From Account Type + {{ accountTransferTemplateData.fromAccountType.value }} +
+ +
+ Currency + {{ accountTransferTemplateData.currency.name }} +
+ +
+ +

Transferring To

+ + + +
+ +
+ + + Office + + + {{ toOfficeType.name }} + + + + Office is required + + + + + Client + + + Client is required + + + + + + {{ client.id }} - {{ client.displayName }} + + + + + Account Type + + + {{ toAccountType.value }} + + + + Account Type is required + + + + + Account + + + {{ toAccount.productName }} - {{ toAccount.accountNo }} + + + + Account is required + + + + + Amount + + + Amount is required + + + + + Transaction Date + + + + + Transactions Date is required + + + + + Description + + + Transfer Description is required + + + + +
+ +
+ +
+ + + + + + +
+ +
diff --git a/src/app/account-transfers/make-account-transers/make-account-transers.component.scss b/src/app/account-transfers/make-account-transers/make-account-transers.component.scss new file mode 100644 index 000000000..d19c9bbf2 --- /dev/null +++ b/src/app/account-transfers/make-account-transers/make-account-transers.component.scss @@ -0,0 +1,20 @@ +h2, h3, h4 { + margin: 0; + font-weight: 500; +} + +span { + margin: 0.5em 0; +} + +.margin-t { + margin-top: 1em; +} + +mat-divider { + margin: 0 0 0.5em 0; +} + +.container { + max-width: 37rem; +} diff --git a/src/app/account-transfers/make-account-transers/make-account-transers.component.spec.ts b/src/app/account-transfers/make-account-transers/make-account-transers.component.spec.ts new file mode 100644 index 000000000..1ab095121 --- /dev/null +++ b/src/app/account-transfers/make-account-transers/make-account-transers.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { MakeAccountTransersComponent } from './make-account-transers.component'; + +describe('MakeAccountTransersComponent', () => { + let component: MakeAccountTransersComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ MakeAccountTransersComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(MakeAccountTransersComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/account-transfers/make-account-transers/make-account-transers.component.ts b/src/app/account-transfers/make-account-transers/make-account-transers.component.ts new file mode 100644 index 000000000..acb793de7 --- /dev/null +++ b/src/app/account-transfers/make-account-transers/make-account-transers.component.ts @@ -0,0 +1,182 @@ +import { Component, OnInit, AfterViewInit } from '@angular/core'; +import { ActivatedRoute, Router } from '@angular/router'; +import { AccountTransfersService } from '../account-transfers.service'; +import { FormBuilder, FormGroup, Validators } from '@angular/forms'; +import { DatePipe } from '@angular/common'; +import { ClientsService } from 'app/clients/clients.service'; + +@Component({ + selector: 'mifosx-make-account-transers', + templateUrl: './make-account-transers.component.html', + styleUrls: ['./make-account-transers.component.scss'] +}) +export class MakeAccountTransersComponent implements OnInit, AfterViewInit { + + /** Standing Instructions Data */ + accountTransferTemplateData: any; + /** Minimum date allowed. */ + minDate = new Date(2000, 0, 1); + /** Maximum date allowed. */ + maxDate = new Date(2100, 0, 1); + /** Edit Standing Instructions form. */ + makeAccountTransferForm: FormGroup; + /** To Office Type Data */ + toOfficeTypeData: any; + /** To Client Type Data */ + toClientTypeData: any; + /** To Account Type Data */ + toAccountTypeData: any; + /** To Account Data */ + toAccountData: any; + /** Account Type Id */ + accountTypeId: any; + /** Account Type */ + accountType: any; + /** Savings Id or Loans Id */ + id: any; + /** Clients Data */ + clientsData: any; + + /** + * Retrieves the standing instructions template from `resolve`. + * @param {ActivatedRoute} route Activated Route. + * @param {FormBuilder} formBuilder Form Builder + * @param {Router} router Router + * @param {AccountTransfersService} accountTransfersService Account Transfers Service + * @param {DatePipe} datePipe Date Pipe + */ + constructor(private formBuilder: FormBuilder, + private route: ActivatedRoute, + private router: Router, + private accountTransfersService: AccountTransfersService, + private datePipe: DatePipe, + private clientsService: ClientsService) { + this.route.data.subscribe((data: { accountTransferTemplate: any }) => { + this.accountTransferTemplateData = data.accountTransferTemplate; + this.setParams(); + this.setOptions(); + }); + } + /** Sets the value from the URL */ + setParams() { + this.accountType = this.route.snapshot.queryParams['accountType']; + switch (this.accountType) { + case 'fromloans': + this.accountTypeId = '1'; + this.id = this.route.snapshot.queryParams['loanId']; + break; + case 'fromsavings': + this.accountTypeId = '2'; + this.id = this.route.snapshot.queryParams['savingsId']; + break; + default: + this.accountTypeId = '0'; + } + } + + /** + * Creates and sets the create standing instructions form. + */ + ngOnInit() { + this.createMakeAccountTransferForm(); + } + + /** + * Creates the standing instruction form. + */ + createMakeAccountTransferForm() { + this.makeAccountTransferForm = this.formBuilder.group({ + 'toOfficeId': ['', Validators.required], + 'toClientId': ['', Validators.required], + 'toAccountType': ['', Validators.required], + 'toAccountId': ['', Validators.required], + 'transferAmount': [this.accountTransferTemplateData.transferAmount, Validators.required], + 'transferDate': ['', Validators.required], + 'transferDescription': ['', Validators.required], + }); + } + + /** Sets options value */ + setOptions() { + this.toOfficeTypeData = this.accountTransferTemplateData.toOfficeOptions; + this.toAccountTypeData = this.accountTransferTemplateData.toAccountTypeOptions; + this.toAccountData = this.accountTransferTemplateData.toAccountOptions; + } + + /** Executes on change of various select options */ + changeEvent() { + const formValue = this.refineObject(this.makeAccountTransferForm.value); + this.accountTransfersService.newAccountTranferResource(this.id, this.accountTypeId, formValue).subscribe((response: any) => { + this.accountTransferTemplateData = response; + this.toClientTypeData = response.toClientOptions; + this.setOptions(); + }); + } + + /** Refine Object + * Removes the object param with null or '' values + */ + refineObject(dataObj: { [x: string]: any; transferAmount: any; transferDate: any; transferDescription: any; }) { + delete dataObj.transferAmount; + delete dataObj.transferDate; + delete dataObj.transferDescription; + if (dataObj.toClientId) { + dataObj.toClientId = dataObj.toClientId.id; + } + const propNames = Object.getOwnPropertyNames(dataObj); + for (let i = 0; i < propNames.length; i++) { + const propName = propNames[i]; + if (dataObj[propName] === null || dataObj[propName] === undefined || dataObj[propName] === '') { + delete dataObj[propName]; + } + } + return dataObj; + } + + /** + * Subscribes to Clients search filter: + */ + ngAfterViewInit() { + this.makeAccountTransferForm.controls.toClientId.valueChanges.subscribe((value: string) => { + if (value.length >= 2) { + this.clientsService.getFilteredClients('displayName', 'ASC', true, value) + .subscribe((data: any) => { + this.clientsData = data.pageItems; + }); + this.changeEvent(); + } + }); + } + + /** + * Displays Client name in form control input. + * @param {any} client Client data. + * @returns {string} Client name if valid otherwise undefined. + */ + displayClient(client: any): string | undefined { + return client ? client.displayName : undefined; + } + + /** + * Submits the standing instructions form + */ + submit() { + const dateFormat = 'dd MMMM yyyy'; + const locale = 'en'; + const makeAccountTransferData = { + ... this.makeAccountTransferForm.value, + transferDate: this.datePipe.transform(this.makeAccountTransferForm.value.transferDate, dateFormat), + dateFormat, + locale, + toClientId: this.makeAccountTransferForm.controls.toClientId.value.id, + fromAccountId: this.id, + fromAccountType: this.accountTypeId, + fromClientId: this.accountTransferTemplateData.fromClient.id, + fromOfficeId: this.accountTransferTemplateData.fromClient.officeId + }; + this.accountTransfersService.createAccountTransfer(makeAccountTransferData).subscribe(() => { + this.router.navigate(['../../'], { relativeTo: this.route }); + }); + } + +} diff --git a/src/app/clients/clients-view/general-tab/general-tab.component.html b/src/app/clients/clients-view/general-tab/general-tab.component.html index 1b9233971..342a1fa83 100644 --- a/src/app/clients/clients-view/general-tab/general-tab.component.html +++ b/src/app/clients/clients-view/general-tab/general-tab.component.html @@ -157,7 +157,8 @@ diff --git a/src/app/clients/clients-view/general-tab/general-tab.component.ts b/src/app/clients/clients-view/general-tab/general-tab.component.ts index c155babe5..6d6fecc1b 100644 --- a/src/app/clients/clients-view/general-tab/general-tab.component.ts +++ b/src/app/clients/clients-view/general-tab/general-tab.component.ts @@ -38,7 +38,8 @@ export class GeneralTabComponent { constructor( private route: ActivatedRoute, - private clientService: ClientsService + private clientService: ClientsService, + private router: Router ) { this.route.data.subscribe((data: { clientAccountsData: any, clientChargesData: any, clientSummary: any }) => { this.clientAccountData = data.clientAccountsData; @@ -101,5 +102,11 @@ export class GeneralTabComponent { $event.stopPropagation(); } + routeTransferFund(loanId: any) { + console.log('loanId: ', loanId); + + const queryParams: any = { loanId: loanId, accountType: 'fromloans' }; + this.router.navigate(['../', 'loans', loanId, 'transfer-funds', 'make-account-transfer'], { relativeTo: this.route, queryParams: queryParams }); + } } diff --git a/src/app/loans/loans-routing.module.ts b/src/app/loans/loans-routing.module.ts index b1bf29be5..1ee270e7e 100644 --- a/src/app/loans/loans-routing.module.ts +++ b/src/app/loans/loans-routing.module.ts @@ -175,6 +175,10 @@ const routes: Routes = [ actionButtonData: LoanActionButtonResolver } }, + { + path: 'transfer-funds', + loadChildren: '../account-transfers/account-transfers.module#AccountTransfersModule' + } ] }, { @@ -187,7 +191,7 @@ const routes: Routes = [ }, ] }] - } + }, ]; @NgModule({ imports: [RouterModule.forChild(routes)], diff --git a/src/app/loans/loans-view/loan-account-actions/create-guarantor/create-guarantor.component.ts b/src/app/loans/loans-view/loan-account-actions/create-guarantor/create-guarantor.component.ts index d57768c09..a0d531b4e 100644 --- a/src/app/loans/loans-view/loan-account-actions/create-guarantor/create-guarantor.component.ts +++ b/src/app/loans/loans-view/loan-account-actions/create-guarantor/create-guarantor.component.ts @@ -129,12 +129,12 @@ export class CreateGuarantorComponent implements OnInit, AfterViewInit { } } - clientSelected(clientDetails: any){ + clientSelected(clientDetails: any) { console.log(clientDetails); this.accountOptions = []; this.loanService.guarantorAccountResource(this.loanId, clientDetails.id).subscribe((response: any) => { this.accountOptions = response.accountLinkingOptions; - }) + }); } /** @@ -153,17 +153,17 @@ export class CreateGuarantorComponent implements OnInit, AfterViewInit { // TODO: Update once language and date settings are setup const dateFormat = 'dd-MM-yyyy'; const locale = 'en'; - let newGuarantorData = { + const newGuarantorData = { ... this.newGuarantorForm.value, locale, guarantorTypeId }; - if(this.newGuarantorForm.value.existingClient) { + if (this.newGuarantorForm.value.existingClient) { newGuarantorData['entityId'] = this.newGuarantorForm.controls.name.value.id; } else { newGuarantorData['dob'] = this.datePipe.transform(prevdob, dateFormat), - newGuarantorData['dateFormat'] = dateFormat + newGuarantorData['dateFormat'] = dateFormat; } delete newGuarantorData.existingClient; diff --git a/src/app/loans/loans-view/loans-view.component.ts b/src/app/loans/loans-view/loans-view.component.ts index a8d0117df..ffffd70f9 100644 --- a/src/app/loans/loans-view/loans-view.component.ts +++ b/src/app/loans/loans-view/loans-view.component.ts @@ -127,6 +127,10 @@ export class LoansViewComponent implements OnInit { case 'Modify Application': this.router.navigate(['edit-loans-account'], { relativeTo: this.route}); break; + case 'Transfer Funds': + const queryParams: any = { loanId: this.loanId, accountType: 'fromloans' }; + this.router.navigate(['transfer-funds/make-account-transfer'], { relativeTo: this.route, queryParams: queryParams }); + break; default: button = button.replace(/\s/g, '-').toLowerCase(); button = button.replace(/\(/g, ''); diff --git a/src/app/products/recurring-deposit-products/view-recurring-deposit-product/view-recurring-deposit-product.component.scss b/src/app/products/recurring-deposit-products/view-recurring-deposit-product/view-recurring-deposit-product.component.scss index edcf8f5c1..71b93450a 100644 --- a/src/app/products/recurring-deposit-products/view-recurring-deposit-product/view-recurring-deposit-product.component.scss +++ b/src/app/products/recurring-deposit-products/view-recurring-deposit-product/view-recurring-deposit-product.component.scss @@ -1,7 +1,3 @@ -table { - width: 100%; -} - .mat-elevation-z1 { margin: 1em 0 1.5em 0; } @@ -24,47 +20,30 @@ span { } table { - width: 100%; + width: 100%; - tr.incentives-row { - height: 0; + tr.incentives-row { + height: 0; - > td { - padding: 0; - } + > td { + padding: 0; + } - .incentives { - overflow: hidden; - } + .incentives { + overflow: hidden; + } - .mat-card { - border-radius: 0; + .mat-card { + border-radius: 0; - > h4 { - font-weight: 500; - margin: 0.5em 0 0; - } + > h4 { + font-weight: 500; + margin: 0.5em 0 0; } } } +} - .mat-elevation-z1 { - margin: 1em 0 1.5em 0; - } - - h2, h3, h4 { - margin: 0; - font-weight: 500; - } - - span { - margin: 0.5em 0; - } - - mat-divider { - margin: 0 0 0.5em 0; - } - - .margin-t { - margin-top: 1em; - } +mat-divider { + margin: 0 0 0.5em 0; +} diff --git a/src/app/savings/savings-account-view/savings-account-view.component.ts b/src/app/savings/savings-account-view/savings-account-view.component.ts index 670ebb351..f142628a3 100644 --- a/src/app/savings/savings-account-view/savings-account-view.component.ts +++ b/src/app/savings/savings-account-view/savings-account-view.component.ts @@ -152,6 +152,10 @@ export class SavingsAccountViewComponent implements OnInit { case 'Disable Withhold Tax': this.disableWithHoldTax(); break; + case 'Transfer Funds': + const queryParams: any = { savingsId: this.savingsAccountData.id, accountType: 'fromsavings' }; + this.router.navigate(['transfer-funds/make-account-transfer'], { relativeTo: this.route, queryParams: queryParams }); + break; } } diff --git a/src/app/savings/savings-routing.module.ts b/src/app/savings/savings-routing.module.ts index 2cfa2a069..b962c171f 100644 --- a/src/app/savings/savings-routing.module.ts +++ b/src/app/savings/savings-routing.module.ts @@ -172,6 +172,10 @@ const routes: Routes = [ resolve: { savingsAccountActionData: SavingsAccountActionsResolver } + }, + { + path: 'transfer-funds', + loadChildren: '../account-transfers/account-transfers.module#AccountTransfersModule' } ] }