From ce8ca77ad7f98d023d23b115bbbb79418a9f3d97 Mon Sep 17 00:00:00 2001 From: Karan Takalkar Date: Tue, 30 Jun 2020 01:23:11 +0530 Subject: [PATCH] feat: edit savings account transaction page (#954) Fixes: #953 --- ...s-account-transaction-template.resolver.ts | 33 +++++ .../edit-transaction.component.html | 81 ++++++++++++ .../edit-transaction.component.scss | 3 + .../edit-transaction.component.spec.ts | 25 ++++ .../edit-transaction.component.ts | 123 ++++++++++++++++++ .../view-transaction.component.html | 16 ++- src/app/savings/savings-routing.module.ts | 13 +- src/app/savings/savings.module.ts | 4 +- src/app/savings/savings.service.ts | 10 ++ 9 files changed, 302 insertions(+), 6 deletions(-) create mode 100644 src/app/savings/common-resolvers/savings-account-transaction-template.resolver.ts create mode 100644 src/app/savings/savings-account-view/transactions/edit-transaction/edit-transaction.component.html create mode 100644 src/app/savings/savings-account-view/transactions/edit-transaction/edit-transaction.component.scss create mode 100644 src/app/savings/savings-account-view/transactions/edit-transaction/edit-transaction.component.spec.ts create mode 100644 src/app/savings/savings-account-view/transactions/edit-transaction/edit-transaction.component.ts diff --git a/src/app/savings/common-resolvers/savings-account-transaction-template.resolver.ts b/src/app/savings/common-resolvers/savings-account-transaction-template.resolver.ts new file mode 100644 index 000000000..d449f9208 --- /dev/null +++ b/src/app/savings/common-resolvers/savings-account-transaction-template.resolver.ts @@ -0,0 +1,33 @@ +/** Angular Imports */ +import { Injectable } from '@angular/core'; +import { Resolve, ActivatedRouteSnapshot } from '@angular/router'; + +/** rxjs Imports */ +import { Observable } from 'rxjs'; + +/** Custom Services */ +import { SavingsService } from '../savings.service'; + +/** + * Savings Account Transaction Template data resolver. + */ +@Injectable() +export class SavingsAccountTransactionTemplateResolver implements Resolve { + + /** + * @param {SavingsService} SavingsService Savings service. + */ + constructor(private savingsService: SavingsService) { } + + /** + * Returns the Savings Account Transaction Template data. + * @param {ActivatedRouteSnapshot} route Route Snapshot + * @returns {Observable} + */ + resolve(route: ActivatedRouteSnapshot): Observable { + const savingAccountId = route.parent.paramMap.get('savingAccountId'); + const transactionId = route.paramMap.get('id'); + return this.savingsService.getSavingsAccountTransactionTemplate(savingAccountId, transactionId); + } + +} diff --git a/src/app/savings/savings-account-view/transactions/edit-transaction/edit-transaction.component.html b/src/app/savings/savings-account-view/transactions/edit-transaction/edit-transaction.component.html new file mode 100644 index 000000000..4db1dc4c4 --- /dev/null +++ b/src/app/savings/savings-account-view/transactions/edit-transaction/edit-transaction.component.html @@ -0,0 +1,81 @@ +
+ + + +
+ + + + + Transaction Date + + + + + Transaction Date is required + + + + + Transaction Amount + + + Transaction Amount is required + + + + + Payment Type + + + {{ paymentType.name }} + + + + +
+ Show Payment Details + +
+ + + Account Number + + + + + Cheque + + + + + Routing Code + + + + + Receipt Number + + + + + Bank + + + + + + + + +
+ +
+ +
+ +
+ \ No newline at end of file diff --git a/src/app/savings/savings-account-view/transactions/edit-transaction/edit-transaction.component.scss b/src/app/savings/savings-account-view/transactions/edit-transaction/edit-transaction.component.scss new file mode 100644 index 000000000..aeead06e0 --- /dev/null +++ b/src/app/savings/savings-account-view/transactions/edit-transaction/edit-transaction.component.scss @@ -0,0 +1,3 @@ +.container { + width: 37rem; +} diff --git a/src/app/savings/savings-account-view/transactions/edit-transaction/edit-transaction.component.spec.ts b/src/app/savings/savings-account-view/transactions/edit-transaction/edit-transaction.component.spec.ts new file mode 100644 index 000000000..abea649f7 --- /dev/null +++ b/src/app/savings/savings-account-view/transactions/edit-transaction/edit-transaction.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { EditTransactionComponent } from './edit-transaction.component'; + +describe('EditTransactionComponent', () => { + let component: EditTransactionComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ EditTransactionComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(EditTransactionComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/savings/savings-account-view/transactions/edit-transaction/edit-transaction.component.ts b/src/app/savings/savings-account-view/transactions/edit-transaction/edit-transaction.component.ts new file mode 100644 index 000000000..3db599e82 --- /dev/null +++ b/src/app/savings/savings-account-view/transactions/edit-transaction/edit-transaction.component.ts @@ -0,0 +1,123 @@ +/** Angular Imports */ +import { Component, OnInit } from '@angular/core'; +import { FormGroup, FormBuilder, Validators, FormControl } from '@angular/forms'; +import { Router, ActivatedRoute } from '@angular/router'; +import { DatePipe } from '@angular/common'; + +/** Custom Services */ +import { SavingsService } from 'app/savings/savings.service'; + +/** + * Edit Transaction component. + */ +@Component({ + selector: 'mifosx-edit-transaction', + templateUrl: './edit-transaction.component.html', + styleUrls: ['./edit-transaction.component.scss'] +}) +export class EditTransactionComponent implements OnInit { + + /** Minimum Due Date allowed. */ + minDate = new Date(2000, 0, 1); + /** Maximum Due Date allowed. */ + maxDate = new Date(); + /** Savings account transaction form. */ + editTransactionForm: FormGroup; + /** savings account transaction payment options. */ + paymentTypeOptions: { + id: number, + name: string, + description: string, + isCashPayment: boolean, + position: number + }[]; + /** Flag to enable payment details fields. */ + addPaymentDetailsFlag: Boolean = false; + /** saving account's Id */ + savingAccountId: string; + /** Transaction Template */ + transactionTemplateData: any; + + /** + * Retrieves the Saving Account transaction template data from `resolve`. + * @param {FormBuilder} formBuilder Form Builder. + * @param {SavingsService} savingsService Savings Service. + * @param {ActivatedRoute} route Activated Route. + * @param {DatePipe} datePipe DatePipe. + * @param {Router} router Router for navigation. + */ + constructor(private formBuilder: FormBuilder, + private route: ActivatedRoute, + private router: Router, + private datePipe: DatePipe, + private savingsService: SavingsService) { + this.route.data.subscribe((data: { savingsAccountTransactionTemplate: any }) => { + this.transactionTemplateData = data.savingsAccountTransactionTemplate; + this.paymentTypeOptions = this.transactionTemplateData.paymentTypeOptions; + }); + this.savingAccountId = this.route.parent.snapshot.params['savingAccountId']; + } + + /** + * Creates the Saving account transaction form when component loads. + */ + ngOnInit() { + this.createEditTransactionForm(); + this.editTransactionForm.patchValue({ + 'transactionDate': this.transactionTemplateData.date && new Date(this.transactionTemplateData.date), + 'transactionAmount': this.transactionTemplateData.amount, + 'paymentTypeId': this.transactionTemplateData.paymentTypeId + }); + } + + /** + * Method to create the Saving Account Transaction Form. + */ + createEditTransactionForm() { + this.editTransactionForm = this.formBuilder.group({ + 'transactionDate': ['', Validators.required], + 'transactionAmount': ['', Validators.required], + 'paymentTypeId': [''], + }); + } + + /** + * Method to add payment detail fields to the UI. + */ + addPaymentDetails() { + this.addPaymentDetailsFlag = !this.addPaymentDetailsFlag; + if (this.addPaymentDetailsFlag) { + this.editTransactionForm.addControl('accountNumber', new FormControl('')); + this.editTransactionForm.addControl('checkNumber', new FormControl('')); + this.editTransactionForm.addControl('routingCode', new FormControl('')); + this.editTransactionForm.addControl('receiptNumber', new FormControl('')); + this.editTransactionForm.addControl('bankNumber', new FormControl('')); + } else { + this.editTransactionForm.removeControl('accountNumber'); + this.editTransactionForm.removeControl('checkNumber'); + this.editTransactionForm.removeControl('routingCode'); + this.editTransactionForm.removeControl('receiptNumber'); + this.editTransactionForm.removeControl('bankNumber'); + } + } + + /** + * Method to submit the transaction details. + */ + submit() { + const prevTransactionDate: Date = this.editTransactionForm.value.transactionDate; + // TODO: Update once language and date settings are setup + const dateFormat = 'dd-MM-yyyy'; + this.editTransactionForm.patchValue({ + transactionDate: this.datePipe.transform(prevTransactionDate, dateFormat) + }); + const transactionData = this.editTransactionForm.value; + transactionData.locale = 'en'; + transactionData.dateFormat = dateFormat; + this.savingsService.executeSavingsAccountTransactionsCommand(this.savingAccountId, 'modify', transactionData, this.transactionTemplateData.id) + .subscribe(res => { + this.router.navigate(['../'], { relativeTo: this.route }); + }); + } + +} diff --git a/src/app/savings/savings-account-view/transactions/view-transaction/view-transaction.component.html b/src/app/savings/savings-account-view/transactions/view-transaction/view-transaction.component.html index bc9528fed..ed3fd4b0f 100644 --- a/src/app/savings/savings-account-view/transactions/view-transaction/view-transaction.component.html +++ b/src/app/savings/savings-account-view/transactions/view-transaction/view-transaction.component.html @@ -1,9 +1,17 @@ -
- + +
diff --git a/src/app/savings/savings-routing.module.ts b/src/app/savings/savings-routing.module.ts index f4b7c3383..2cfa2a069 100644 --- a/src/app/savings/savings-routing.module.ts +++ b/src/app/savings/savings-routing.module.ts @@ -18,6 +18,7 @@ import { ViewTransactionComponent } from './savings-account-view/transactions/vi import { ViewChargeComponent } from './savings-account-view/view-charge/view-charge.component'; import { ViewRecieptComponent } from './savings-account-view/transactions/view-reciept/view-reciept.component'; import { ExportTransactionsComponent } from './savings-account-view/transactions-tab/export-transactions/export-transactions.component'; +import { EditTransactionComponent } from './savings-account-view/transactions/edit-transaction/edit-transaction.component'; /** Custom Resolvers */ import { SavingsAccountViewResolver } from './common-resolvers/savings-account-view.resolver'; @@ -29,6 +30,7 @@ import { SavingsAccountTransactionResolver } from './common-resolvers/savings-ac import { SavingsAccountChargeResolver } from './common-resolvers/savings-account-charge.resolver'; import { SavingsAccountActionsResolver } from './common-resolvers/savings-account-actions.resolver'; import { SavingsTransactionRecieptResolver } from './common-resolvers/savings-transaction-reciept.resolver'; +import { SavingsAccountTransactionTemplateResolver } from './common-resolvers/savings-account-transaction-template.resolver'; const routes: Routes = [ @@ -125,6 +127,14 @@ const routes: Routes = [ savingsAccountTransaction: SavingsAccountTransactionResolver } }, + { + path: 'edit', + component: EditTransactionComponent, + data: { breadcrumb: 'Edit', routeParamBreadcrumb: false }, + resolve: { + savingsAccountTransactionTemplate: SavingsAccountTransactionTemplateResolver + } + }, { path: 'reciept', component: ViewRecieptComponent, @@ -180,6 +190,7 @@ const routes: Routes = [ SavingsAccountTransactionResolver, SavingsAccountChargeResolver, SavingsAccountActionsResolver, - SavingsTransactionRecieptResolver] + SavingsTransactionRecieptResolver, + SavingsAccountTransactionTemplateResolver] }) export class SavingsRoutingModule {} diff --git a/src/app/savings/savings.module.ts b/src/app/savings/savings.module.ts index b28deb7ef..50de10104 100644 --- a/src/app/savings/savings.module.ts +++ b/src/app/savings/savings.module.ts @@ -44,6 +44,7 @@ import { CloseSavingsAccountComponent } from './saving-account-actions/close-sav import { ToggleWithholdTaxDialogComponent } from './savings-account-view/custom-dialogs/toggle-withhold-tax-dialog/toggle-withhold-tax-dialog.component'; import { ViewRecieptComponent } from './savings-account-view/transactions/view-reciept/view-reciept.component'; import { ExportTransactionsComponent } from './savings-account-view/transactions-tab/export-transactions/export-transactions.component'; +import { EditTransactionComponent } from './savings-account-view/transactions/edit-transaction/edit-transaction.component'; /** @@ -93,7 +94,8 @@ import { ExportTransactionsComponent } from './savings-account-view/transactions CloseSavingsAccountComponent, ToggleWithholdTaxDialogComponent, ViewRecieptComponent, - ExportTransactionsComponent + ExportTransactionsComponent, + EditTransactionComponent ], entryComponents: [ CalculateInterestDialogComponent, diff --git a/src/app/savings/savings.service.ts b/src/app/savings/savings.service.ts index 33776b930..94ebf49f8 100644 --- a/src/app/savings/savings.service.ts +++ b/src/app/savings/savings.service.ts @@ -204,6 +204,16 @@ export class SavingsService { return this.http.get(`/savingsaccounts/${accountId}/transactions/${transactionId}`); } + /** + * @param {string} accountId Savings Account Id + * @param {string} transactionId Transaction Id + * @returns {Observable} + */ + getSavingsAccountTransactionTemplate(accountId: string, transactionId: string): Observable { + const httpParams = new HttpParams().set('template', 'true'); + return this.http.get(`/savingsaccounts/${accountId}/transactions/${transactionId}`, { params: httpParams }); + } + /** * @param {string} accountId Savings Account Id * @param {string} command Command