diff --git a/src/app/clients/clients-view/client-actions/add-client-charge/add-client-charge.component.html b/src/app/clients/clients-view/client-actions/add-client-charge/add-client-charge.component.html
new file mode 100644
index 000000000..742c4828d
--- /dev/null
+++ b/src/app/clients/clients-view/client-actions/add-client-charge/add-client-charge.component.html
@@ -0,0 +1,93 @@
+
diff --git a/src/app/clients/clients-view/client-actions/add-client-charge/add-client-charge.component.scss b/src/app/clients/clients-view/client-actions/add-client-charge/add-client-charge.component.scss
new file mode 100644
index 000000000..aeead06e0
--- /dev/null
+++ b/src/app/clients/clients-view/client-actions/add-client-charge/add-client-charge.component.scss
@@ -0,0 +1,3 @@
+.container {
+ width: 37rem;
+}
diff --git a/src/app/clients/clients-view/client-actions/add-client-charge/add-client-charge.component.spec.ts b/src/app/clients/clients-view/client-actions/add-client-charge/add-client-charge.component.spec.ts
new file mode 100644
index 000000000..3cb62bca9
--- /dev/null
+++ b/src/app/clients/clients-view/client-actions/add-client-charge/add-client-charge.component.spec.ts
@@ -0,0 +1,25 @@
+import { async, ComponentFixture, TestBed } from '@angular/core/testing';
+
+import { AddClientChargeComponent } from './add-client-charge.component';
+
+describe('AddClientChargeComponent', () => {
+ let component: AddClientChargeComponent;
+ let fixture: ComponentFixture;
+
+ beforeEach(async(() => {
+ TestBed.configureTestingModule({
+ declarations: [ AddClientChargeComponent ]
+ })
+ .compileComponents();
+ }));
+
+ beforeEach(() => {
+ fixture = TestBed.createComponent(AddClientChargeComponent);
+ component = fixture.componentInstance;
+ fixture.detectChanges();
+ });
+
+ it('should create', () => {
+ expect(component).toBeTruthy();
+ });
+});
diff --git a/src/app/clients/clients-view/client-actions/add-client-charge/add-client-charge.component.ts b/src/app/clients/clients-view/client-actions/add-client-charge/add-client-charge.component.ts
new file mode 100644
index 000000000..e5c8772da
--- /dev/null
+++ b/src/app/clients/clients-view/client-actions/add-client-charge/add-client-charge.component.ts
@@ -0,0 +1,140 @@
+/** 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 { ClientsService } from 'app/clients/clients.service';
+
+/**
+ * Add Clients Charge component.
+ */
+@Component({
+ selector: 'mifosx-add-client-charge',
+ templateUrl: './add-client-charge.component.html',
+ styleUrls: ['./add-client-charge.component.scss']
+})
+export class AddClientChargeComponent implements OnInit {
+
+ /** Minimum Due Date allowed. */
+ minDate = new Date(2000, 0, 1);
+ /** Maximum Due Date allowed. */
+ maxDate = new Date();
+ /** Add Clients Charge form. */
+ clientChargeForm: FormGroup;
+ /** clients charge options. */
+ clientChargeOptions: any;
+ /** clients Id */
+ clientId: string;
+ /** charge details */
+ chargeDetails: any;
+
+ /**
+ * Retrieves charge template data from `resolve`
+ * @param {FormBuilder} formBuilder Form Builder
+ * @param {ActivatedRoute} route Activated Route
+ * @param {Router} router Router
+ * @param {DatePipe} datePipe Date Pipe
+ * @param {ClientsService} clientsService Clients Service
+ */
+ constructor(
+ private formBuilder: FormBuilder,
+ private route: ActivatedRoute,
+ private router: Router,
+ private datePipe: DatePipe,
+ private clientsService: ClientsService
+ ) {
+ this.route.data.subscribe((data: { clientActionData: any }) => {
+ this.clientChargeOptions = data.clientActionData.chargeOptions;
+ });
+ this.clientId = this.route.parent.snapshot.params['clientId'];
+ }
+
+ ngOnInit() {
+ this.createClientsChargeForm();
+ this.buildDependencies();
+ }
+
+ /**
+ * Subscribe to form controls value changes
+ */
+ buildDependencies() {
+ this.clientChargeForm.controls.chargeId.valueChanges.subscribe(chargeId => {
+ this.clientsService.getChargeAndTemplate(chargeId).subscribe((data: any) => {
+ this.chargeDetails = data;
+ const chargeTimeType = data.chargeTimeType.id;
+ if (data.chargeTimeType.value === 'Withdrawal Fee' || data.chargeTimeType.value === 'Saving No Activity Fee') {
+ this.chargeDetails.dueDateNotRequired = true;
+ }
+ if (data.chargeTimeType.value === 'Annual Fee' || data.chargeTimeType.value === 'Monthly Fee') {
+ this.chargeDetails.chargeTimeTypeAnnualOrMonth = true;
+ }
+ if (!this.chargeDetails.dueDateNotRequired && !this.chargeDetails.chargeTimeTypeAnnualOrMonth) {
+ this.clientChargeForm.addControl('dueDate', new FormControl('', Validators.required));
+ } else {
+ this.clientChargeForm.removeControl('dueDate');
+ }
+ if (!this.chargeDetails.dueDateNotRequired && this.chargeDetails.chargeTimeTypeAnnualOrMonth) {
+ this.clientChargeForm.addControl('feeOnMonthDay', new FormControl('', Validators.required));
+ } else {
+ this.clientChargeForm.removeControl('feeOnMonthDay');
+ }
+ if (chargeTimeType.value === 'Monthly Fee') {
+ this.clientChargeForm.addControl('feeInterval', new FormControl(data.feeInterval, Validators.required));
+ } else {
+ this.clientChargeForm.removeControl('feeInterval');
+ }
+ this.clientChargeForm.patchValue({
+ 'amount': data.amount,
+ 'chargeCalculationType': data.chargeCalculationType.id,
+ 'chargeTimeType': data.chargeTimeType.id
+ });
+ });
+ });
+ }
+
+ /**
+ * Creates the Clients Charge form.
+ */
+ createClientsChargeForm() {
+ this.clientChargeForm = this.formBuilder.group({
+ 'chargeId': ['', Validators.required],
+ 'amount': ['', Validators.required],
+ 'chargeCalculationType': [{ value: '', disabled: true }],
+ 'chargeTimeType': [{ value: '', disabled: true }]
+ });
+ }
+
+ /**
+ * Submits Client charge.
+ */
+ submit() {
+ const clientCharge = this.clientChargeForm.value;
+ clientCharge.locale = 'en';
+ if (!clientCharge.feeInterval) {
+ clientCharge.feeInterval = this.chargeDetails.feeInterval;
+ }
+ if (this.chargeDetails.dueDateNotRequired !== true) {
+ if (this.chargeDetails.chargeTimeTypeAnnualOrMonth === true) {
+ const monthDayFormat = 'MMMM-dd'; // TODO: Update once language and date settings are setup
+ clientCharge.monthDayFormat = monthDayFormat;
+ if (clientCharge.feeOnMonthDay) {
+ const prevDate = this.clientChargeForm.value.feeOnMonthDay;
+ clientCharge.feeOnMonthDay = this.datePipe.transform(prevDate, monthDayFormat);
+ }
+ } else {
+ const dateFormat = 'yyyy-MM-dd';
+ clientCharge.dateFormat = dateFormat;
+ if (clientCharge.dueDate) {
+ const prevDate = this.clientChargeForm.value.dueDate;
+ clientCharge.dueDate = this.datePipe.transform(prevDate, dateFormat);
+ }
+ }
+ }
+ this.clientsService.createClientCharge(this.clientId, clientCharge).subscribe( () => {
+ this.router.navigate(['../../'], { relativeTo: this.route });
+ });
+ }
+
+}
diff --git a/src/app/clients/clients-view/client-actions/client-actions.component.html b/src/app/clients/clients-view/client-actions/client-actions.component.html
index eb133ad6e..59bd16425 100644
--- a/src/app/clients/clients-view/client-actions/client-actions.component.html
+++ b/src/app/clients/clients-view/client-actions/client-actions.component.html
@@ -11,3 +11,4 @@
+
diff --git a/src/app/clients/clients-view/client-actions/client-actions.component.ts b/src/app/clients/clients-view/client-actions/client-actions.component.ts
index 3f580130c..1dc978be4 100644
--- a/src/app/clients/clients-view/client-actions/client-actions.component.ts
+++ b/src/app/clients/clients-view/client-actions/client-actions.component.ts
@@ -26,6 +26,7 @@ export class ClientActionsComponent {
'Reject Transfer': boolean
'Reactivate': boolean
'Undo Rejection': boolean
+ 'Add Charge': boolean
} = {
'Assign Staff': false,
'Close': false,
@@ -38,7 +39,8 @@ export class ClientActionsComponent {
'Accept Transfer': false,
'Reject Transfer': false,
'Reactivate': false,
- 'Undo Rejection': false
+ 'Undo Rejection': false,
+ 'Add Charge': false
};
/**
diff --git a/src/app/clients/clients-view/clients-view.component.html b/src/app/clients/clients-view/clients-view.component.html
index 555907eb7..f3d9c5ac0 100644
--- a/src/app/clients/clients-view/clients-view.component.html
+++ b/src/app/clients/clients-view/clients-view.component.html
@@ -46,6 +46,7 @@
+
diff --git a/src/app/clients/clients-view/clients-view.component.ts b/src/app/clients/clients-view/clients-view.component.ts
index ecc4a7aa4..a58808ae4 100644
--- a/src/app/clients/clients-view/clients-view.component.ts
+++ b/src/app/clients/clients-view/clients-view.component.ts
@@ -68,6 +68,7 @@ export class ClientsViewComponent implements OnInit {
case 'Reject Transfer':
case 'Reactivate':
case 'Undo Rejection':
+ case 'Add Charge':
this.router.navigate([`actions/${name}`], { relativeTo: this.route });
break;
case 'Unassign Staff':
diff --git a/src/app/clients/clients.module.ts b/src/app/clients/clients.module.ts
index 94f5ea0fc..f0f9580e1 100644
--- a/src/app/clients/clients.module.ts
+++ b/src/app/clients/clients.module.ts
@@ -41,6 +41,7 @@ import { RejectClientTransferComponent } from './clients-view/client-actions/rej
import { AcceptClientTransferComponent } from './clients-view/client-actions/accept-client-transfer/accept-client-transfer.component';
import { ReactivateClientComponent } from './clients-view/client-actions/reactivate-client/reactivate-client.component';
import { UndoClientRejectionComponent } from './clients-view/client-actions/undo-client-rejection/undo-client-rejection.component';
+import { AddClientChargeComponent } from './clients-view/client-actions/add-client-charge/add-client-charge.component';
/**
@@ -87,7 +88,8 @@ import { UndoClientRejectionComponent } from './clients-view/client-actions/undo
RejectClientTransferComponent,
AcceptClientTransferComponent,
ReactivateClientComponent,
- UndoClientRejectionComponent
+ UndoClientRejectionComponent,
+ AddClientChargeComponent
],
entryComponents: [
UploadDocumentDialogComponent,
diff --git a/src/app/clients/clients.service.ts b/src/app/clients/clients.service.ts
index a4a0b0b7a..405b06f00 100644
--- a/src/app/clients/clients.service.ts
+++ b/src/app/clients/clients.service.ts
@@ -224,6 +224,19 @@ export class ClientsService {
return this.http.get(`/clients/${clientId}/transferproposaldate`);
}
+ getClientChargeTemplate(clientId: any): Observable {
+ return this.http.get(`/clients/${clientId}/charges/template`);
+ }
+
+ getChargeAndTemplate(chargeId: any): Observable {
+ const httpParams = new HttpParams().set('template', 'true');
+ return this.http.get(`/charges/${chargeId}`, { params: httpParams });
+ }
+
+ createClientCharge(clientId: any, charge: any) {
+ return this.http.post(`/clients/${clientId}/charges`, charge);
+ }
+
/**
* @returns {Observable} Offices data
*/
diff --git a/src/app/clients/common-resolvers/client-actions.resolver.ts b/src/app/clients/common-resolvers/client-actions.resolver.ts
index 4f40bb28a..0faadeaa7 100644
--- a/src/app/clients/common-resolvers/client-actions.resolver.ts
+++ b/src/app/clients/common-resolvers/client-actions.resolver.ts
@@ -45,6 +45,8 @@ export class ClientActionsResolver implements Resolve