From 11593da32f3d38af39be6813c87e2e3c6df37ea3 Mon Sep 17 00:00:00 2001 From: "Oussema.exe" Date: Sun, 26 Apr 2020 19:58:33 +0100 Subject: [PATCH] feat: add create tax component (#568) Fixes: #198 --- .../create-tax-component.component.html | 96 +++++++++++++ .../create-tax-component.component.scss | 3 + .../create-tax-component.component.spec.ts | 25 ++++ .../create-tax-component.component.ts | 128 ++++++++++++++++++ .../manage-tax-components.component.html | 2 +- .../tax-component-template.resolver.ts | 30 ++++ src/app/products/products-routing.module.ts | 13 +- src/app/products/products.module.ts | 4 +- src/app/products/products.service.ts | 15 ++ 9 files changed, 313 insertions(+), 3 deletions(-) create mode 100644 src/app/products/manage-tax-components/create-tax-component/create-tax-component.component.html create mode 100644 src/app/products/manage-tax-components/create-tax-component/create-tax-component.component.scss create mode 100644 src/app/products/manage-tax-components/create-tax-component/create-tax-component.component.spec.ts create mode 100644 src/app/products/manage-tax-components/create-tax-component/create-tax-component.component.ts create mode 100644 src/app/products/manage-tax-components/tax-component-template.resolver.ts diff --git a/src/app/products/manage-tax-components/create-tax-component/create-tax-component.component.html b/src/app/products/manage-tax-components/create-tax-component/create-tax-component.component.html new file mode 100644 index 000000000..0888cfd7b --- /dev/null +++ b/src/app/products/manage-tax-components/create-tax-component/create-tax-component.component.html @@ -0,0 +1,96 @@ +
+ + + +
+ + + +
+ + + Name + + + Name is required + + + + + Percentage + + + Percentage is required + + + Percentage should be larger than 0 and at most 100 + + + + + Debit Account Type + + + {{ debitAccountType.value }} + + + + + + Debit Account + + + {{ debitAccount.name }} + + + + Debit account is required + + + + + Credit Account Type + + + {{ creditAccountType.value }} + + + + + + Credit Account + + + {{ creditAccount.name }} + + + + Credit account is required + + + + + Start date + + + + + Start date is required + + + +
+ +
+ + + + + + +
+ +
+ +
diff --git a/src/app/products/manage-tax-components/create-tax-component/create-tax-component.component.scss b/src/app/products/manage-tax-components/create-tax-component/create-tax-component.component.scss new file mode 100644 index 000000000..d774f68da --- /dev/null +++ b/src/app/products/manage-tax-components/create-tax-component/create-tax-component.component.scss @@ -0,0 +1,3 @@ +.container { + max-width: 37rem; +} diff --git a/src/app/products/manage-tax-components/create-tax-component/create-tax-component.component.spec.ts b/src/app/products/manage-tax-components/create-tax-component/create-tax-component.component.spec.ts new file mode 100644 index 000000000..5734f144f --- /dev/null +++ b/src/app/products/manage-tax-components/create-tax-component/create-tax-component.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { CreateTaxComponentComponent } from './create-tax-component.component'; + +describe('CreateTaxComponentComponent', () => { + let component: CreateTaxComponentComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ CreateTaxComponentComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(CreateTaxComponentComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/products/manage-tax-components/create-tax-component/create-tax-component.component.ts b/src/app/products/manage-tax-components/create-tax-component/create-tax-component.component.ts new file mode 100644 index 000000000..b05d7fbc0 --- /dev/null +++ b/src/app/products/manage-tax-components/create-tax-component/create-tax-component.component.ts @@ -0,0 +1,128 @@ +/** 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 { ProductsService } from '../../products.service'; + +/** + * Create Tax Component component. + */ +@Component({ + selector: 'mifosx-create-tax-component', + templateUrl: './create-tax-component.component.html', + styleUrls: ['./create-tax-component.component.scss'] +}) +export class CreateTaxComponentComponent implements OnInit { + + /** Minimum start date allowed. */ + minDate = new Date(); + /** Maximum start date allowed. */ + maxDate = new Date(new Date().setFullYear(new Date().getFullYear() + 10)); + /** Tax Component form. */ + taxComponentForm: FormGroup; + /** Tax Component template data. */ + taxComponentTemplateData: any; + /** Credit Account Type data. */ + creditAccountTypeData: any; + /** Credit Account data. */ + creditAccountData: any; + /** Debit Account Type data. */ + debitAccountTypeData: any; + /** Debit Account data. */ + debitAccountData: any; + + /** + * Retrieves the tax Component template data from `resolve`. + * @param {FormBuilder} formBuilder Form Builder. + * @param {ProductsService} productsService Products 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 productsService: ProductsService, + private route: ActivatedRoute, + private router: Router, + private datePipe: DatePipe) { + this.route.data.subscribe(( data: { taxComponentTemplate: any }) => { + this.taxComponentTemplateData = data.taxComponentTemplate; + }); + } + + /** + * Creates the tax Component form + */ + ngOnInit() { + this.createTaxComponentForm(); + this.setConditionalControls(); + } + + /** + * Creates the tax Component form + */ + createTaxComponentForm() { + this.creditAccountTypeData = this.debitAccountTypeData = this.taxComponentTemplateData.glAccountTypeOptions; + this.taxComponentForm = this.formBuilder.group({ + 'name': ['', Validators.required], + 'percentage': ['', [Validators.required, Validators.pattern('^(0*[1-9][0-9]*(\\.[0-9]+)?|0+\\.[0-9]*[1-9][0-9]*)$'), Validators.max(100)]], + 'creditAccountType': [''], + 'debitAccountType': [''], + 'startDate': ['', Validators.required], + }); + } + + /** + * Sets the conditional controls of the tax Component form + */ + setConditionalControls() { + this.taxComponentForm.get('debitAccountType').valueChanges.subscribe(debitAccountTypeId => { + this.debitAccountData = this.getAccountsData(debitAccountTypeId); + this.taxComponentForm.addControl('debitAcountId', new FormControl('', Validators.required)); + }); + this.taxComponentForm.get('creditAccountType').valueChanges.subscribe(creditAccountTypeId => { + this.creditAccountData = this.getAccountsData(creditAccountTypeId); + this.taxComponentForm.addControl('creditAcountId', new FormControl('', Validators.required)); + }); + } + + /** + * @param {number} accountTypeId Account type ID of account type. + * @returns {any} Accounts data + */ + getAccountsData(accountTypeId: number) { + switch (accountTypeId) { + case 1: + return this.taxComponentTemplateData.glAccountOptions.assetAccountOptions; + case 2: + return this.taxComponentTemplateData.glAccountOptions.liabilityAccountOptions; + case 3: + return this.taxComponentTemplateData.glAccountOptions.equityAccountOptions; + case 4: + return this.taxComponentTemplateData.glAccountOptions.incomeAccountOptions; + case 5: + return this.taxComponentTemplateData.glAccountOptions.expenseAccountOptions; + } + } + + /** + * Submits the tax Component form and creates the tax Component, + * if successful redirects to Tax Components. + */ + submit() { + const prevStartDate: Date = this.taxComponentForm.value.startDate; + // TODO: Update once language and date settings are setup + const dateFormat = 'yyyy-MM-dd'; + this.taxComponentForm.patchValue({ + startDate: this.datePipe.transform(prevStartDate, dateFormat) + }); + const taxComponent = this.taxComponentForm.value; + taxComponent.locale = 'en'; + taxComponent.dateFormat = dateFormat; + this.productsService.createTaxComponent(taxComponent).subscribe((response: any) => { + this.router.navigate(['../', response.resourceId], { relativeTo: this.route }); + }); + } +} diff --git a/src/app/products/manage-tax-components/manage-tax-components.component.html b/src/app/products/manage-tax-components/manage-tax-components.component.html index 6fba8ffe2..cad53b36d 100644 --- a/src/app/products/manage-tax-components/manage-tax-components.component.html +++ b/src/app/products/manage-tax-components/manage-tax-components.component.html @@ -1,5 +1,5 @@
- diff --git a/src/app/products/manage-tax-components/tax-component-template.resolver.ts b/src/app/products/manage-tax-components/tax-component-template.resolver.ts new file mode 100644 index 000000000..835a1ba88 --- /dev/null +++ b/src/app/products/manage-tax-components/tax-component-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 { ProductsService } from '../products.service'; + +/** + * Tax Component template data resolver. + */ +@Injectable() +export class TaxComponentTemplateResolver implements Resolve { + + /** + * @param {ProductsService} productsService Products service. + */ + constructor(private productsService: ProductsService) {} + + /** + * Returns the tax components template data. + * @returns {Observable} + */ + resolve(): Observable { + return this.productsService.getTaxComponentTemplate(); + } + +} diff --git a/src/app/products/products-routing.module.ts b/src/app/products/products-routing.module.ts index 8e4315845..05d8d6b56 100644 --- a/src/app/products/products-routing.module.ts +++ b/src/app/products/products-routing.module.ts @@ -36,6 +36,7 @@ import { EditFloatingRateComponent } from './floating-rates/edit-floating-rate/e import { ManageTaxComponentsComponent } from './manage-tax-components/manage-tax-components.component'; import { ManageTaxGroupsComponent } from './manage-tax-groups/manage-tax-groups.component'; import { ViewTaxComponentComponent } from './manage-tax-components/view-tax-component/view-tax-component.component'; +import { CreateTaxComponentComponent } from './manage-tax-components/create-tax-component/create-tax-component.component'; /** Custom Resolvers */ import { LoanProductsResolver } from './loan-products/loan-products.resolver'; @@ -61,6 +62,7 @@ import { FloatingRateResolver } from './floating-rates/floating-rate.resolver'; import { ManageTaxComponentsResolver } from './manage-tax-components/manage-tax-components.resolver'; import { ManageTaxGroupsResolver } from './manage-tax-groups/manage-tax-groups.resolver'; import { TaxComponentResolver } from './manage-tax-components/tax-component.resolver'; +import { TaxComponentTemplateResolver } from './manage-tax-components/tax-component-template.resolver'; /** Products Routes */ const routes: Routes = [ @@ -218,6 +220,14 @@ const routes: Routes = [ taxComponents: ManageTaxComponentsResolver } }, + { + path: 'create', + component: CreateTaxComponentComponent, + data: { title: extract('Create Tax Component'), breadcrumb: 'Create' }, + resolve: { + taxComponentTemplate: TaxComponentTemplateResolver + } + }, { path: ':id', data: { title: extract('View Tax Component'), routeParamBreadcrumb: 'id' }, @@ -376,7 +386,8 @@ const routes: Routes = [ ManageTaxGroupsResolver, TaxComponentResolver, FloatingRateResolver, - FloatingRatesResolver + FloatingRatesResolver, + TaxComponentTemplateResolver ] }) export class ProductsRoutingModule { } diff --git a/src/app/products/products.module.ts b/src/app/products/products.module.ts index 95bc4c3e7..47105ead2 100644 --- a/src/app/products/products.module.ts +++ b/src/app/products/products.module.ts @@ -67,6 +67,7 @@ import { CreateFloatingRateComponent } from './floating-rates/create-floating-ra import { ViewFloatingRateComponent } from './floating-rates/view-floating-rate/view-floating-rate.component'; import { EditFloatingRateComponent } from './floating-rates/edit-floating-rate/edit-floating-rate.component'; import { FloatingRatePeriodDialogComponent } from './floating-rates/floating-rate-period-dialog/floating-rate-period-dialog.component'; +import { CreateTaxComponentComponent } from './manage-tax-components/create-tax-component/create-tax-component.component'; /** * Products Module @@ -139,7 +140,8 @@ import { FloatingRatePeriodDialogComponent } from './floating-rates/floating-rat FixedDepositProductPreviewStepComponent, DepositProductIncentiveFormDialogComponent, ManageTaxGroupsComponent, - ViewTaxComponentComponent + ViewTaxComponentComponent, + CreateTaxComponentComponent ], entryComponents: [ FloatingRatePeriodDialogComponent diff --git a/src/app/products/products.service.ts b/src/app/products/products.service.ts index be46e0df1..d411e8b56 100644 --- a/src/app/products/products.service.ts +++ b/src/app/products/products.service.ts @@ -150,6 +150,21 @@ export class ProductsService { return this.http.get(`/taxes/component/${taxComponentId}`); } + /** + * @returns {Observable} Tax Components Template data. + */ + getTaxComponentTemplate(): Observable { + return this.http.get('/taxes/component/template'); + } + + /** + * @param {any} taxComponent Tax Component to be created. + * @returns {Observable} + */ + createTaxComponent(taxComponent: any): Observable { + return this.http.post('/taxes/component', taxComponent); + } + /** * @returns {Observable} Tax Groups data */