diff --git a/src/app/deposits/recurring-deposits/recurring-deposits-account-view/charges-tab/charges-tab.component.html b/src/app/deposits/recurring-deposits/recurring-deposits-account-view/charges-tab/charges-tab.component.html index 2b5607f02..14eaa6dae 100644 --- a/src/app/deposits/recurring-deposits/recurring-deposits-account-view/charges-tab/charges-tab.component.html +++ b/src/app/deposits/recurring-deposits/recurring-deposits-account-view/charges-tab/charges-tab.component.html @@ -4,10 +4,6 @@

All Charges

-
- -
@@ -69,25 +65,26 @@ Actions - - - - - - - - + + diff --git a/src/app/deposits/recurring-deposits/recurring-deposits-account-view/charges-tab/charges-tab.component.ts b/src/app/deposits/recurring-deposits/recurring-deposits-account-view/charges-tab/charges-tab.component.ts index 1431f8b20..7faf17f43 100644 --- a/src/app/deposits/recurring-deposits/recurring-deposits-account-view/charges-tab/charges-tab.component.ts +++ b/src/app/deposits/recurring-deposits/recurring-deposits-account-view/charges-tab/charges-tab.component.ts @@ -1,7 +1,21 @@ /** Angular Imports */ import { Component, OnInit, ViewChild } from '@angular/core'; -import { MatTableDataSource, MatTable } from '@angular/material'; -import { ActivatedRoute } from '@angular/router'; +import { ActivatedRoute, Router } from '@angular/router'; +import { MatDialog, MatTableDataSource, MatTable } from '@angular/material'; +import { DatePipe } from '@angular/common'; + +/** Custom Services */ +import { SavingsService } from 'app/savings/savings.service'; + +/** Custom Dialogs */ +import { FormDialogComponent } from 'app/shared/form-dialog/form-dialog.component'; +import { RecurringDepositConfirmationDialogComponent } from '../custom-dialogs/recurring-deposit-confirmation-dialog/recurring-deposit-confirmation-dialog.component'; +import { DeleteDialogComponent } from 'app/shared/delete-dialog/delete-dialog.component'; + +/** Custom Models */ +import { FormfieldBase } from 'app/shared/form-dialog/formfield/model/formfield-base'; +import { InputBase } from 'app/shared/form-dialog/formfield/model/input-base'; +import { DatepickerBase } from 'app/shared/form-dialog/formfield/model/datepicker-base'; /** * Charges Tab Component @@ -43,8 +57,12 @@ export class ChargesTabComponent implements OnInit { * Retrieves Recurring Deposits Account Data from `resolve`. * @param {ActivatedRoute} route Activated Route. */ - constructor(private route: ActivatedRoute) { - this.route.parent.data.subscribe((data: { recurringDepositsAccountData: any }) => { + constructor(private route: ActivatedRoute, + private savingsService: SavingsService, + private datePipe: DatePipe, + private router: Router, + public dialog: MatDialog) { + this.route.parent.data.subscribe((data: { recurringDepositsAccountData: any }) => { this.recurringDepositsAccountData = data.recurringDepositsAccountData; this.chargesData = this.recurringDepositsAccountData.charges; }); @@ -56,26 +74,138 @@ export class ChargesTabComponent implements OnInit { } /** - * Toggles datasource for active/inactive charges. + * Pays the charge. + * @param {any} chargeId Charge Id */ - toggleCharges() { - this.showInactiveCharges = !this.showInactiveCharges; - if (!this.showInactiveCharges) { - const activeCharges = this.chargesData.filter(charge => charge.isActive); - this.dataSource.data = activeCharges; - } else { - const inActiveCharges = this.chargesData.filter(charge => !charge.isActive); - this.dataSource.data = inActiveCharges; - } - this.chargesTableRef.renderRows(); + payCharge(chargeId: any) { + const formfields: FormfieldBase[] = [ + new InputBase({ + controlName: 'amount', + label: 'Amount', + value: '', + type: 'number', + required: true + }), + new DatepickerBase({ + controlName: 'dueDate', + label: 'Payment Date', + value: '', + type: 'date', + required: true + }) + ]; + const data = { + title: `Pay Charge ${chargeId}`, + layout: { addButtonText: 'Confirm' }, + formfields: formfields + }; + const payChargeDialogRef = this.dialog.open(FormDialogComponent, { data }); + payChargeDialogRef.afterClosed().subscribe((response: any) => { + if (response.data) { + const locale = 'en'; + const dateFormat = 'dd MMMM yyyy'; + const dataObject = { + ...response.data.value, + dueDate: this.datePipe.transform(response.data.value.dueDate, dateFormat), + dateFormat, + locale + }; + this.savingsService.executeSavingsAccountChargesCommand(this.recurringDepositsAccountData.id, 'paycharge', dataObject, chargeId) + .subscribe(() => { + this.reload(); + }); + } + }); } /** - * Checks if charge is recurring. + * Waive's the charge + * @param {any} chargeId Charge Id + */ + waiveCharge(chargeId: any) { + const waiveChargeDialogRef = this.dialog.open(RecurringDepositConfirmationDialogComponent, { data: { heading: 'Waive Charge', dialogContext: `Are you sure you want to waive charge with id: ${chargeId}` } }); + waiveChargeDialogRef.afterClosed().subscribe((response: any) => { + if (response.confirm) { + this.savingsService.executeSavingsAccountChargesCommand(this.recurringDepositsAccountData.id, 'waive', {}, chargeId) + .subscribe(() => { + this.reload(); + }); + } + }); + } + + /** + * Edits the charge * @param {any} charge Charge */ - isRecurringCharge(charge: any) { - return charge.chargeTimeType.value === 'Monthly Fee' || charge.chargeTimeType.value === 'Annual Fee' || charge.chargeTimeType.value === 'Weekly Fee'; + editCharge(charge: any) { + const formfields: FormfieldBase[] = [ + new InputBase({ + controlName: 'amount', + label: 'Amount', + value: charge.amount || charge.amountOrPercentage, + type: 'number', + required: true + }) + ]; + const data = { + title: `Edit Charge ${charge.id}`, + layout: { addButtonText: 'Confirm' }, + formfields: formfields + }; + const editChargeDialogRef = this.dialog.open(FormDialogComponent, { data }); + editChargeDialogRef.afterClosed().subscribe((response: any) => { + if (response.data) { + const locale = 'en'; + const dateFormat = 'dd MMMM yyyy'; + const dataObject = { + ...response.data.value, + dateFormat, + locale + }; + this.savingsService.editSavingsAccountCharge(this.recurringDepositsAccountData.id, dataObject, charge.id) + .subscribe(() => { + this.reload(); + }); + } + }); + } + + /** + * Deletes the charge + * @param {any} chargeId Charge Id + */ + deleteCharge(chargeId: any) { + const deleteChargeDialogRef = this.dialog.open(DeleteDialogComponent, { + data: { deleteContext: `charge id:${chargeId}` } + }); + deleteChargeDialogRef.afterClosed().subscribe((response: any) => { + if (response.delete) { + this.savingsService.deleteSavingsAccountCharge(this.recurringDepositsAccountData.id, chargeId) + .subscribe(() => { + this.reload(); + }); + } + }); + } + + /** + * Stops the propagation to view charge page. + * @param $event Mouse Event + */ + routeEdit($event: MouseEvent) { + $event.stopPropagation(); + } + + /** + * Refetches data for the component + * TODO: Replace by a custom reload component instead of hard-coded back-routing. + */ + private reload() { + const clientId = this.recurringDepositsAccountData.clientId; + const url: string = this.router.url; + this.router.navigateByUrl(`/clients/${clientId}/recurringdeposits`, { skipLocationChange: true }) + .then(() => this.router.navigate([url])); } }