From 22428de9b109eb3599c87766daaa67d077730db5 Mon Sep 17 00:00:00 2001 From: Ramveer Date: Fri, 22 Jul 2022 13:37:21 +0530 Subject: [PATCH] feat: collateral module --- src/app/clients/clients-routing.module.ts | 11 +- .../add-client-collateral.component.html | 82 +++++++++++++ .../add-client-collateral.component.scss | 4 + .../add-client-collateral.component.spec.ts | 25 ++++ .../add-client-collateral.component.ts | 115 ++++++++++++++++++ .../client-actions.component.html | 1 + .../client-actions.component.ts | 6 +- .../clients-view/clients-view.component.html | 1 + .../clients-view/clients-view.component.ts | 1 + .../general-tab/general-tab.component.html | 49 ++++++++ .../general-tab/general-tab.component.ts | 7 +- src/app/clients/clients.module.ts | 4 +- src/app/clients/clients.service.ts | 14 +++ .../client-actions.resolver.ts | 7 +- .../client-collateral.resolver.ts | 31 +++++ .../collaterals/collaterals-routing.module.ts | 52 ++++++++ src/app/collaterals/collaterals.module.ts | 30 +++++ src/app/collaterals/collaterals.service.ts | 51 ++++++++ .../client-collateral.resolver.ts | 32 +++++ .../edit-collateral.component.html | 51 ++++++++ .../edit-collateral.component.scss | 4 + .../edit-collateral.component.spec.ts | 25 ++++ .../edit-collateral.component.ts | 86 +++++++++++++ .../view-collateral.component.html | 71 +++++++++++ .../view-collateral.component.scss | 36 ++++++ .../view-collateral.component.spec.ts | 25 ++++ .../view-collateral.component.ts | 52 ++++++++ .../create-loans-account.component.html | 2 +- .../create-loans-account.component.ts | 26 ++-- ...count-add-collateral-dialog.component.html | 31 +++-- ...account-add-collateral-dialog.component.ts | 32 ++++- .../loans-account-charges-step.component.html | 17 ++- .../loans-account-charges-step.component.ts | 49 ++++++-- .../loan-collateral-tab.component.html | 23 ++-- .../loan-collateral-tab.component.ts | 2 +- .../collaterals/collateral.resolver.ts | 31 +++++ .../collaterals-template.resolver.ts | 28 +++++ .../collaterals/collaterals.component.html | 56 +++++++++ .../collaterals/collaterals.component.scss | 24 ++++ .../collaterals/collaterals.component.spec.ts | 25 ++++ .../collaterals/collaterals.component.ts | 61 ++++++++++ .../collaterals/collaterals.resolver.ts | 28 +++++ .../create-collateral.component.html | 71 +++++++++++ .../create-collateral.component.scss | 0 .../create-collateral.component.spec.ts | 25 ++++ .../create-collateral.component.ts | 82 +++++++++++++ .../edit-collateral.component.html | 76 ++++++++++++ .../edit-collateral.component.scss | 0 .../edit-collateral.component.spec.ts | 25 ++++ .../edit-collateral.component.ts | 73 +++++++++++ .../view-collateral.component.html | 74 +++++++++++ .../view-collateral.component.scss | 11 ++ .../view-collateral.component.spec.ts | 25 ++++ .../view-collateral.component.ts | 60 +++++++++ src/app/products/products-routing.module.ts | 58 ++++++++- src/app/products/products.component.html | 8 ++ src/app/products/products.module.ts | 10 +- src/app/products/products.service.ts | 47 +++++++ 58 files changed, 1892 insertions(+), 61 deletions(-) create mode 100644 src/app/clients/clients-view/client-actions/add-client-collateral/add-client-collateral.component.html create mode 100644 src/app/clients/clients-view/client-actions/add-client-collateral/add-client-collateral.component.scss create mode 100644 src/app/clients/clients-view/client-actions/add-client-collateral/add-client-collateral.component.spec.ts create mode 100644 src/app/clients/clients-view/client-actions/add-client-collateral/add-client-collateral.component.ts create mode 100644 src/app/clients/common-resolvers/client-collateral.resolver.ts create mode 100644 src/app/collaterals/collaterals-routing.module.ts create mode 100644 src/app/collaterals/collaterals.module.ts create mode 100644 src/app/collaterals/collaterals.service.ts create mode 100644 src/app/collaterals/common-resolvers/client-collateral.resolver.ts create mode 100644 src/app/collaterals/edit-collateral/edit-collateral.component.html create mode 100644 src/app/collaterals/edit-collateral/edit-collateral.component.scss create mode 100644 src/app/collaterals/edit-collateral/edit-collateral.component.spec.ts create mode 100644 src/app/collaterals/edit-collateral/edit-collateral.component.ts create mode 100644 src/app/collaterals/view-collateral/view-collateral.component.html create mode 100644 src/app/collaterals/view-collateral/view-collateral.component.scss create mode 100644 src/app/collaterals/view-collateral/view-collateral.component.spec.ts create mode 100644 src/app/collaterals/view-collateral/view-collateral.component.ts create mode 100644 src/app/products/collaterals/collateral.resolver.ts create mode 100644 src/app/products/collaterals/collaterals-template.resolver.ts create mode 100644 src/app/products/collaterals/collaterals.component.html create mode 100644 src/app/products/collaterals/collaterals.component.scss create mode 100644 src/app/products/collaterals/collaterals.component.spec.ts create mode 100644 src/app/products/collaterals/collaterals.component.ts create mode 100644 src/app/products/collaterals/collaterals.resolver.ts create mode 100644 src/app/products/collaterals/create-collateral/create-collateral.component.html create mode 100644 src/app/products/collaterals/create-collateral/create-collateral.component.scss create mode 100644 src/app/products/collaterals/create-collateral/create-collateral.component.spec.ts create mode 100644 src/app/products/collaterals/create-collateral/create-collateral.component.ts create mode 100644 src/app/products/collaterals/edit-collateral/edit-collateral.component.html create mode 100644 src/app/products/collaterals/edit-collateral/edit-collateral.component.scss create mode 100644 src/app/products/collaterals/edit-collateral/edit-collateral.component.spec.ts create mode 100644 src/app/products/collaterals/edit-collateral/edit-collateral.component.ts create mode 100644 src/app/products/collaterals/view-collateral/view-collateral.component.html create mode 100644 src/app/products/collaterals/view-collateral/view-collateral.component.scss create mode 100644 src/app/products/collaterals/view-collateral/view-collateral.component.spec.ts create mode 100644 src/app/products/collaterals/view-collateral/view-collateral.component.ts diff --git a/src/app/clients/clients-routing.module.ts b/src/app/clients/clients-routing.module.ts index 3317cc645..3e60e4774 100644 --- a/src/app/clients/clients-routing.module.ts +++ b/src/app/clients/clients-routing.module.ts @@ -48,6 +48,7 @@ import { ClientActionsResolver } from './common-resolvers/client-actions.resolve import { ClientChargeViewResolver } from './common-resolvers/client-charge-view.resolver'; import { ClientTransactionPayResolver } from './common-resolvers/client-transaction-pay.resolver'; import { ClientDataAndTemplateResolver } from './common-resolvers/client-and-template.resolver'; +import { ClientCollateralResolver } from './common-resolvers/client-collateral.resolver'; const routes: Routes = [ Route.withShell([{ @@ -83,7 +84,8 @@ const routes: Routes = [ data: { title: extract('General'), breadcrumb: 'General', routeParamBreadcrumb: false }, resolve: { clientAccountsData: ClientAccountsResolver, - clientChargesData: ClientChargesResolver + clientChargesData: ClientChargesResolver, + clientCollateralData: ClientCollateralResolver } }, { @@ -234,6 +236,10 @@ const routes: Routes = [ path: 'loans-accounts', loadChildren: () => import('../loans/loans.module').then(m => m.LoansModule) }, + { + path: 'client-collateral', + loadChildren: () => import('../collaterals/collaterals.module').then(m => m.CollateralsModule) + }, { path: 'fixed-deposits-accounts', loadChildren: () => import('../deposits/fixed-deposits/fixed-deposits.module').then(m => m.FixedDepositsModule) @@ -285,7 +291,8 @@ const routes: Routes = [ ClientActionsResolver, ClientChargeViewResolver, ClientTransactionPayResolver, - ClientDataAndTemplateResolver + ClientDataAndTemplateResolver, + ClientCollateralResolver ] }) export class ClientsRoutingModule { } diff --git a/src/app/clients/clients-view/client-actions/add-client-collateral/add-client-collateral.component.html b/src/app/clients/clients-view/client-actions/add-client-collateral/add-client-collateral.component.html new file mode 100644 index 000000000..3b5718874 --- /dev/null +++ b/src/app/clients/clients-view/client-actions/add-client-collateral/add-client-collateral.component.html @@ -0,0 +1,82 @@ +
+ + + +
+ + + +
+ + Collateral + + + {{ clientCollateral.name }} + + + + Collateral is required + + + +
+ + + Name + + + + + Type/Quality + + + + + Unit Type + + + + + Base Price + + + + + Percentage To Base + + + + + Quantity + + + Quantity is required + + + + + Total + + + + + Total Collateral Value + + + +
+ +
+ +
+ + + + + + +
+ +
+ +
\ No newline at end of file diff --git a/src/app/clients/clients-view/client-actions/add-client-collateral/add-client-collateral.component.scss b/src/app/clients/clients-view/client-actions/add-client-collateral/add-client-collateral.component.scss new file mode 100644 index 000000000..f15e4c2b0 --- /dev/null +++ b/src/app/clients/clients-view/client-actions/add-client-collateral/add-client-collateral.component.scss @@ -0,0 +1,4 @@ +.container { + width: 37rem; + } + \ No newline at end of file diff --git a/src/app/clients/clients-view/client-actions/add-client-collateral/add-client-collateral.component.spec.ts b/src/app/clients/clients-view/client-actions/add-client-collateral/add-client-collateral.component.spec.ts new file mode 100644 index 000000000..fc1e7075d --- /dev/null +++ b/src/app/clients/clients-view/client-actions/add-client-collateral/add-client-collateral.component.spec.ts @@ -0,0 +1,25 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { AddClientCollateralComponent } from './add-client-collateral.component'; + +describe('AddClientCollateralComponent', () => { + let component: AddClientCollateralComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + declarations: [ AddClientCollateralComponent ] + }) + .compileComponents(); + }); + + beforeEach(() => { + fixture = TestBed.createComponent(AddClientCollateralComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/clients/clients-view/client-actions/add-client-collateral/add-client-collateral.component.ts b/src/app/clients/clients-view/client-actions/add-client-collateral/add-client-collateral.component.ts new file mode 100644 index 000000000..fbf8020c5 --- /dev/null +++ b/src/app/clients/clients-view/client-actions/add-client-collateral/add-client-collateral.component.ts @@ -0,0 +1,115 @@ +/** Angular Imports */ +import { Component, OnInit } from '@angular/core'; +import { FormBuilder, FormGroup, Validators } from '@angular/forms'; +import { ActivatedRoute, Router } from '@angular/router'; + +/** + * Custom Services + */ +import { ClientsService } from 'app/clients/clients.service'; +import { ProductsService } from 'app/products/products.service'; +import { SettingsService } from 'app/settings/settings.service'; + +@Component({ + selector: 'mifosx-add-client-collateral', + templateUrl: './add-client-collateral.component.html', + styleUrls: ['./add-client-collateral.component.scss'] +}) +export class AddClientCollateralComponent implements OnInit { + + /** Client Collateral Form */ + clientCollateralForm: FormGroup; + /** Client Collateral Options */ + clientCollateralOptions: any; + /** Client Id */ + clientId: any; + /** Collateral Details */ + collateralDetails: any; + + /** + * Retirives Collateral Form from `resolve` + * @param {FormBuilder} formBuilder Form bUilder. + * @param {ActivatedRoute} route Activated Route. + * @param {Router} router Router. + * @param {ProductsService} productsService Products Service + */ + constructor( + private formBuilder: FormBuilder, + private route: ActivatedRoute, + private router: Router, + private productsService: ProductsService, + private clientsService: ClientsService, + private settingsService: SettingsService, + ) { + this.route.data.subscribe((data: { clientActionData: any }) => { + this.clientCollateralOptions = data.clientActionData; + console.log(this.clientCollateralOptions); + }); + this.clientId = this.route.parent.snapshot.params['clientId']; + } + + ngOnInit(): void { + this.createClientCollateralForm(); + this.buildDependencies(); + } + + /** + * Subscribe to Form controls value changes + */ + buildDependencies() { + this.clientCollateralForm.controls.collateralId.valueChanges.subscribe(collateralId => { + this.productsService.getCollateral(collateralId).subscribe((data: any) => { + this.collateralDetails = data; + console.log(data); + this.clientCollateralForm.patchValue({ + 'name': data.name, + 'quality': data.quality, + 'unitType': data.unitType, + 'basePrice': this.collateralDetails.basePrice, + 'pctToBase': this.collateralDetails.pctToBase, + }); + }); + }); + this.clientCollateralForm.controls.quantity.valueChanges.subscribe((quantity: any) => { + this.clientCollateralForm.patchValue({ + 'totalValue': this.collateralDetails.basePrice * quantity, + 'totalCollateralValue': this.collateralDetails.basePrice * this.collateralDetails.pctToBase * quantity / 100 + }); + }); + } + + /** + * Creates the Clients Collaterals Form + */ + createClientCollateralForm() { + this.clientCollateralForm = this.formBuilder.group({ + 'collateralId': [ '', Validators.required ], + 'quantity': [ '', Validators.required ], + 'name': [{ value: '', disabled: true }], + 'quality': [{value: '', disabled: true}], + 'unitType': [{value: '', disabled: true}], + 'basePrice': [{value: '', disabled: true}], + 'pctToBase': [{value: '', disabled: true}], + 'totalValue': [{value: '', disabled: true}], + 'totalCollateralValue': [{value: '', disabled: true}], + }); + } + + /** + * Submits Client Collateral + */ + submit() { + const collateralId = this.clientCollateralForm.value.collateralId; + const quantity = this.clientCollateralForm.value.quantity; + const locale = this.settingsService.language.code; + const clientCollateral = { + collateralId, + quantity, + locale + }; + this.clientsService.createClientCollateral(this.clientId, clientCollateral).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 5ee27468f..8e4dc5c9d 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 @@ -15,3 +15,4 @@ + \ No newline at end of file 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 4654002b0..7be0762b4 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 @@ -29,7 +29,8 @@ export class ClientActionsComponent { 'Add Charge': boolean 'Take Survey': boolean 'Client Screen Reports': boolean, - 'Create Self Service User': boolean + 'Create Self Service User': boolean, + 'Create Collateral': boolean } = { 'Assign Staff': false, 'Close': false, @@ -46,7 +47,8 @@ export class ClientActionsComponent { 'Add Charge': false, 'Take Survey': false, 'Client Screen Reports': false, - 'Create Self Service User': false + 'Create Self Service User': false, + 'Create Collateral': false }; /** diff --git a/src/app/clients/clients-view/clients-view.component.html b/src/app/clients/clients-view/clients-view.component.html index 65ee287a4..d6673c054 100644 --- a/src/app/clients/clients-view/clients-view.component.html +++ b/src/app/clients/clients-view/clients-view.component.html @@ -97,6 +97,7 @@ + diff --git a/src/app/clients/clients-view/clients-view.component.ts b/src/app/clients/clients-view/clients-view.component.ts index 10b4b410e..3a32de974 100644 --- a/src/app/clients/clients-view/clients-view.component.ts +++ b/src/app/clients/clients-view/clients-view.component.ts @@ -72,6 +72,7 @@ export class ClientsViewComponent implements OnInit { case 'Reactivate': case 'Undo Rejection': case 'Add Charge': + case 'Create Collateral': case 'Create Self Service User': case 'Client Screen Reports': this.router.navigate([`actions/${name}`], { 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 59303de1f..bf09c0fd4 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 @@ -600,4 +600,53 @@ + +
+
+
+

Collateral Data

+
+
+
+
+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ID{{ element.collateralId }}Name{{ element.name }}Quantity{{ element.quantity }}Total Value{{ element.basePrice*element.quantity }}Total Collateral Value{{ element.pctToBase*element.basePrice*element.quantity/100 }}
+ 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 fb0e27f8d..994771133 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 @@ -29,6 +29,8 @@ export class GeneralTabComponent { closedSharesColumns: string[] = ['Account No', 'Share Account', 'Approved Shares', 'Pending For Approval Shares', 'Closed Date']; /** Upcoming Charges Columns */ upcomingChargesColumns: string[] = ['Name', 'Due as of', 'Due', 'Paid', 'Waived', 'Outstanding', 'Actions']; + /** Collaterals Column */ + collateralsColumns: string[] = ['ID', 'Name', 'Quantity', 'Total Value', 'Total Collateral Value']; /** Client Account Data */ clientAccountData: any; @@ -42,6 +44,8 @@ export class GeneralTabComponent { upcomingCharges: any; /** Client Summary Data */ clientSummary: any; + /** Collaterals Data */ + collaterals: any; /** Show Closed Loan Accounts */ showClosedLoanAccounts = false; @@ -67,12 +71,13 @@ export class GeneralTabComponent { private clientService: ClientsService, private router: Router ) { - this.route.data.subscribe((data: { clientAccountsData: any, clientChargesData: any, clientSummary: any }) => { + this.route.data.subscribe((data: { clientAccountsData: any, clientChargesData: any, clientSummary: any, clientCollateralData: any }) => { this.clientAccountData = data.clientAccountsData; this.savingAccounts = data.clientAccountsData.savingsAccounts; this.loanAccounts = data.clientAccountsData.loanAccounts; this.shareAccounts = data.clientAccountsData.shareAccounts; this.upcomingCharges = data.clientChargesData.pageItems; + this.collaterals = data.clientCollateralData; this.clientSummary = data.clientSummary ? data.clientSummary[0] : []; this.clientid = this.route.parent.snapshot.params['clientId']; }); diff --git a/src/app/clients/clients.module.ts b/src/app/clients/clients.module.ts index a86750f77..124a6c701 100644 --- a/src/app/clients/clients.module.ts +++ b/src/app/clients/clients.module.ts @@ -57,6 +57,7 @@ import { ClientAddressStepComponent } from './client-stepper/client-address-step import { ClientFamilyMemberDialogComponent } from './client-stepper/client-family-members-step/client-family-member-dialog/client-family-member-dialog.component'; import { CaptureImageDialogComponent } from './clients-view/custom-dialogs/capture-image-dialog/capture-image-dialog.component'; import { CreateSelfServiceUserComponent } from './clients-view/client-actions/create-self-service-user/create-self-service-user.component'; +import { AddClientCollateralComponent } from './clients-view/client-actions/add-client-collateral/add-client-collateral.component'; /** @@ -120,7 +121,8 @@ import { CreateSelfServiceUserComponent } from './clients-view/client-actions/cr ClientAddressStepComponent, ClientFamilyMemberDialogComponent, CaptureImageDialogComponent, - CreateSelfServiceUserComponent + CreateSelfServiceUserComponent, + AddClientCollateralComponent ], providers: [ ] diff --git a/src/app/clients/clients.service.ts b/src/app/clients/clients.service.ts index 8517aabc4..ea004235f 100644 --- a/src/app/clients/clients.service.ts +++ b/src/app/clients/clients.service.ts @@ -363,4 +363,18 @@ export class ClientsService { return this.http.post(`/users`, userData); } + /** + * @param clientId Client ID. + * @param collateralData Collateral Data + */ + createClientCollateral(clientId: any, collateralData: any) { + return this.http.post(`/clients/${clientId}/collaterals`, collateralData); + } + + /** + * @param clientId Client ID. + */ + getCollateralTemplate(clientId: any) { + return this.http.get(`/clients/${clientId}/collaterals/template`); + } } diff --git a/src/app/clients/common-resolvers/client-actions.resolver.ts b/src/app/clients/common-resolvers/client-actions.resolver.ts index 1e08c53af..671541a02 100644 --- a/src/app/clients/common-resolvers/client-actions.resolver.ts +++ b/src/app/clients/common-resolvers/client-actions.resolver.ts @@ -7,6 +7,7 @@ import { Observable } from 'rxjs'; /** Custom Services */ import { ClientsService } from '../clients.service'; +import { ProductsService } from 'app/products/products.service'; /** * Client Actions data resolver. @@ -16,8 +17,10 @@ export class ClientActionsResolver implements Resolve { /** * @param {ClientsService} clientsService Clients service. + * @param {ProductsService} productsService Products Service */ - constructor(private clientsService: ClientsService) { } + constructor(private clientsService: ClientsService, + private productsService: ProductsService) { } /** * Returns the clients actions data. @@ -42,6 +45,8 @@ export class ClientActionsResolver implements Resolve { return this.clientsService.getOffices(); case 'Add Charge': return this.clientsService.getClientChargeTemplate(clientId); + case 'Create Collateral': + return this.productsService.getCollaterals(); case 'Client Screen Reports': return this.clientsService.getClientReportTemplates(); case 'Assign Staff': diff --git a/src/app/clients/common-resolvers/client-collateral.resolver.ts b/src/app/clients/common-resolvers/client-collateral.resolver.ts new file mode 100644 index 000000000..fbd97dd97 --- /dev/null +++ b/src/app/clients/common-resolvers/client-collateral.resolver.ts @@ -0,0 +1,31 @@ +/** Angular Imports */ +import { Injectable } from '@angular/core'; +import { Resolve, ActivatedRouteSnapshot } from '@angular/router'; + +/** rxjs Imports */ +import { Observable } from 'rxjs'; + +/** Custom Services */ +import { ClientsService } from '../clients.service'; + +/** + * Client Charges data resolver. + */ +@Injectable() +export class ClientCollateralResolver implements Resolve { + + /** + * @param {ClientsService} clientsService Clients service. + */ + constructor(private clientsService: ClientsService) { } + + /** + * Returns the Client Collateral data. + * @returns {Observable} + */ + resolve(route: ActivatedRouteSnapshot): Observable { + const clientId = route.parent.paramMap.get('clientId'); + return this.clientsService.getCollateralTemplate(clientId); + } + +} diff --git a/src/app/collaterals/collaterals-routing.module.ts b/src/app/collaterals/collaterals-routing.module.ts new file mode 100644 index 000000000..aae114880 --- /dev/null +++ b/src/app/collaterals/collaterals-routing.module.ts @@ -0,0 +1,52 @@ +import { NgModule } from '@angular/core'; +import { RouterModule, Routes } from '@angular/router'; + +/** Translation Imports */ +import { extract } from '../core/i18n/i18n.service'; + +/** Custom Components */ +import { ViewCollateralComponent } from './view-collateral/view-collateral.component'; + +/** Custom Resolvers */ +import { ClientCollateralResolver } from './common-resolvers/client-collateral.resolver'; +import { EditCollateralComponent } from './edit-collateral/edit-collateral.component'; + +const routes: Routes = [ + { + path: '', + data: { title: extract('Collateral'), breadcrumb: 'Collateral', routeParamBreadcrumb: false }, + children: [ + { + path: ':collateralId', + data: { title: extract('Collateral View'), routeParamBreadcrumb: 'collateralId' }, + children: [ + { + path: '', + component: ViewCollateralComponent, + resolve: { + clientCollateralData: ClientCollateralResolver, + } + }, + { + path: 'edit', + data: { title: extract('edit'), routeParamBreadcrumb: 'edit' }, + component: EditCollateralComponent, + resolve: { + clientCollateralData: ClientCollateralResolver, + } + } + ] + } + ] + } +]; + +@NgModule({ + imports: [RouterModule.forChild(routes)], + exports: [RouterModule], + declarations: [], + providers: [ + ClientCollateralResolver, + ] +}) +export class CollateralsRoutingModule { } diff --git a/src/app/collaterals/collaterals.module.ts b/src/app/collaterals/collaterals.module.ts new file mode 100644 index 000000000..6eba6fe6b --- /dev/null +++ b/src/app/collaterals/collaterals.module.ts @@ -0,0 +1,30 @@ +/** Angular Imports */ +import { NgModule } from '@angular/core'; +import { CommonModule } from '@angular/common'; + +import { DirectivesModule } from '../directives/directives.module'; + +/** Custom Modules */ +import { SharedModule } from 'app/shared/shared.module'; +import { PipesModule } from '../pipes/pipes.module'; + +/** Custom Components */ +import { CollateralsRoutingModule } from './collaterals-routing.module'; +import { ViewCollateralComponent } from './view-collateral/view-collateral.component'; +import { EditCollateralComponent } from './edit-collateral/edit-collateral.component'; + + +@NgModule({ + declarations: [ + ViewCollateralComponent, + EditCollateralComponent + ], + imports: [ + CommonModule, + CollateralsRoutingModule, + SharedModule, + DirectivesModule, + PipesModule + ] +}) +export class CollateralsModule { } diff --git a/src/app/collaterals/collaterals.service.ts b/src/app/collaterals/collaterals.service.ts new file mode 100644 index 000000000..adc5c3e0d --- /dev/null +++ b/src/app/collaterals/collaterals.service.ts @@ -0,0 +1,51 @@ +/** Angular Imports */ +import { Injectable } from '@angular/core'; +import { HttpClient, HttpParams } from '@angular/common/http'; + +/** rxjs Imports */ +import { Observable } from 'rxjs'; +/** + * Collaterals service. + */ +@Injectable({ + providedIn: 'root' +}) +export class CollateralsService { + /** + * @param {HttpClient} http Http Client to send requests. + */ + constructor(private http: HttpClient) { } + + getFilteredClients(orderBy: string, sortOrder: string, orphansOnly: boolean, displayName: string, officeId?: any): Observable { + let httpParams = new HttpParams() + .set('displayName', displayName) + .set('orphansOnly', orphansOnly.toString()) + .set('sortOrder', sortOrder) + .set('orderBy', orderBy); + if (officeId) { + httpParams = httpParams.set('officeId', officeId); + } + return this.http.get('/clients', { params: httpParams }); + } + + /** + * @returns {Observable} Collaterals data + */ + getClientCollateral(clientId: any, clientCollateralId: any): Observable { + return this.http.get(`/clients/${clientId}/collaterals/${clientCollateralId}`); + } + + /** + * @returns {Observable} Collaterals data + */ + updateClientCollateral(clientId: any, clientCollateralId: any, clientCollateralData: any): Observable { + return this.http.put(`/clients/${clientId}/collaterals/${clientCollateralId}`, clientCollateralData); + } + + /** + * @returns {Observable} Delete Collaterals data + */ + deleteCollateral(clientId: any, clientCollateralId: any): Observable { + return this.http.delete(`/clients/${clientId}/collaterals/${clientCollateralId}`); + } +} diff --git a/src/app/collaterals/common-resolvers/client-collateral.resolver.ts b/src/app/collaterals/common-resolvers/client-collateral.resolver.ts new file mode 100644 index 000000000..973323600 --- /dev/null +++ b/src/app/collaterals/common-resolvers/client-collateral.resolver.ts @@ -0,0 +1,32 @@ +/** Angular Imports */ +import { Injectable } from '@angular/core'; +import { Resolve, ActivatedRouteSnapshot } from '@angular/router'; + +/** rxjs Imports */ +import { Observable } from 'rxjs'; + +/** Custom Services */ +import { CollateralsService } from '../collaterals.service'; + +/** + * Client Collateral data resolver. + */ +@Injectable() +export class ClientCollateralResolver implements Resolve { + + /** + * @param {CollateralsService} collateralsService Collaterals service. + */ + constructor(private collateralsService: CollateralsService) { } + + /** + * Returns the Client Collateral data. + * @returns {Observable} + */ + resolve(route: ActivatedRouteSnapshot): Observable { + const clientId = route.parent.paramMap.get('clientId'); + const collateralId = route.parent.paramMap.get('collateralId'); + return this.collateralsService.getClientCollateral(clientId, collateralId); + } + +} diff --git a/src/app/collaterals/edit-collateral/edit-collateral.component.html b/src/app/collaterals/edit-collateral/edit-collateral.component.html new file mode 100644 index 000000000..d457718b0 --- /dev/null +++ b/src/app/collaterals/edit-collateral/edit-collateral.component.html @@ -0,0 +1,51 @@ +
+ + + +
+ + + +
+ +
+ + + Name + + + + + Quantity + + + Quantity is required + + + + + Total + + + + + Total Collateral Value + + + +
+ +
+ +
+ + + + + + +
+ +
+ +
\ No newline at end of file diff --git a/src/app/collaterals/edit-collateral/edit-collateral.component.scss b/src/app/collaterals/edit-collateral/edit-collateral.component.scss new file mode 100644 index 000000000..f15e4c2b0 --- /dev/null +++ b/src/app/collaterals/edit-collateral/edit-collateral.component.scss @@ -0,0 +1,4 @@ +.container { + width: 37rem; + } + \ No newline at end of file diff --git a/src/app/collaterals/edit-collateral/edit-collateral.component.spec.ts b/src/app/collaterals/edit-collateral/edit-collateral.component.spec.ts new file mode 100644 index 000000000..66fbb5c31 --- /dev/null +++ b/src/app/collaterals/edit-collateral/edit-collateral.component.spec.ts @@ -0,0 +1,25 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { EditCollateralComponent } from './edit-collateral.component'; + +describe('EditCollateralComponent', () => { + let component: EditCollateralComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + declarations: [ EditCollateralComponent ] + }) + .compileComponents(); + }); + + beforeEach(() => { + fixture = TestBed.createComponent(EditCollateralComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/collaterals/edit-collateral/edit-collateral.component.ts b/src/app/collaterals/edit-collateral/edit-collateral.component.ts new file mode 100644 index 000000000..f3415c5ee --- /dev/null +++ b/src/app/collaterals/edit-collateral/edit-collateral.component.ts @@ -0,0 +1,86 @@ +/** Angular Imports */ +import { Component, OnInit } from '@angular/core'; +import { FormBuilder, FormGroup, Validators } from '@angular/forms'; +import { ActivatedRoute, Router } from '@angular/router'; + +/** Custom Services */ +import { SettingsService } from 'app/settings/settings.service'; +import { CollateralsService } from '../collaterals.service'; + +@Component({ + selector: 'mifosx-edit-collateral', + templateUrl: './edit-collateral.component.html', + styleUrls: ['./edit-collateral.component.scss'] +}) +export class EditCollateralComponent implements OnInit { + + + /** Client Collateral Form */ + clientCollateralForm: FormGroup; + /** Client Collateral Options */ + clientCollateralOptions: any; + /** Client Id */ + clientId: any; + /** Collateral Details */ + collateralDetails: any; + + /** + * Retirives Collateral Form from `resolve` + * @param {FormBuilder} formBuilder Form bUilder. + * @param {ActivatedRoute} route Activated Route. + * @param {Router} router Router. + * @param {SettingsService} settingsService Settings Service + * @param {CollateralsService} collateralService Collateral Service + */ + constructor( + private formBuilder: FormBuilder, + private route: ActivatedRoute, + private router: Router, + private settingsService: SettingsService, + private collateralService: CollateralsService + ) { + this.route.data.subscribe((data: { clientCollateralData: any }) => { + this.collateralDetails = data.clientCollateralData; + }); + this.clientId = this.route.parent.snapshot.params['clientId']; + } + + ngOnInit(): void { + this.createClientCollateralForm(); + } + + /** + * Creates the Edit Clients Collaterals Form + */ + createClientCollateralForm() { + this.clientCollateralForm = this.formBuilder.group({ + 'quantity': [ '', Validators.required ], + 'name': [{ value: '', disabled: true }], + 'total': [{value: '', disabled: true}], + 'totalCollateral': [{value: '', disabled: true}], + }); + this.clientCollateralForm.patchValue({ + 'name': this.collateralDetails.name, + 'quantity': this.collateralDetails.quantity, + 'total': this.collateralDetails.total, + 'totalCollateral': this.collateralDetails.totalCollateral, + }); + } + + /** + * Submits Updated Client Collateral + */ + submit() { + const collateralId = this.collateralDetails.id; + const quantity = this.clientCollateralForm.value.quantity; + const locale = this.settingsService.language.code; + const clientCollateralData = { + quantity, + locale + }; + this.collateralService.updateClientCollateral(this.clientId, collateralId, clientCollateralData).subscribe(() => { + this.router.navigate(['../'], {relativeTo: this.route}); + }); + } + +} diff --git a/src/app/collaterals/view-collateral/view-collateral.component.html b/src/app/collaterals/view-collateral/view-collateral.component.html new file mode 100644 index 000000000..97b4d8d5c --- /dev/null +++ b/src/app/collaterals/view-collateral/view-collateral.component.html @@ -0,0 +1,71 @@ +
+ + +
+ + + + \ + +
+ +

Client Collateral Details

+ +
+

+ Name: {{ clientCollateralData.name }}
+ Quantity: {{ clientCollateralData.quantity }}
+ Total Value: {{ clientCollateralData.total }}
+ Total Collateral Value: {{ clientCollateralData.totalCollateral }}
+

+ +
+ + +

Transaction Details

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ID + {{element.loanId}} + Last Repayment {{element.lastRepayment}} Remaining Amount {{element.remainingAmount}} Last Repayment Date {{element.lastRepaymentDate | dateFormat}}
+ +
+ + +
+ +
\ No newline at end of file diff --git a/src/app/collaterals/view-collateral/view-collateral.component.scss b/src/app/collaterals/view-collateral/view-collateral.component.scss new file mode 100644 index 000000000..8f89cfeed --- /dev/null +++ b/src/app/collaterals/view-collateral/view-collateral.component.scss @@ -0,0 +1,36 @@ +.client-collateral-card { + margin: 0 auto; + max-width: 80rem; + width: 90%; + padding: 0; +} +.tab-container { + padding: 1%; + margin: 1%; + h3 { + margin:1% auto; + } + .group-details-container { + border: 1px solid; + padding: 1%; + } + .action-button{ + margin-left: auto; + } + table { + width: 100%; + .account-action-button{ + min-width: 26px; + padding: 0 6px; + margin: 4px; + line-height: 25px; + } + tr.select-row:hover { + cursor: pointer; + } + } + i:hover { + cursor: pointer; + } + } + \ No newline at end of file diff --git a/src/app/collaterals/view-collateral/view-collateral.component.spec.ts b/src/app/collaterals/view-collateral/view-collateral.component.spec.ts new file mode 100644 index 000000000..ac97d75c7 --- /dev/null +++ b/src/app/collaterals/view-collateral/view-collateral.component.spec.ts @@ -0,0 +1,25 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { ViewCollateralComponent } from './view-collateral.component'; + +describe('ViewCollateralComponent', () => { + let component: ViewCollateralComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + declarations: [ ViewCollateralComponent ] + }) + .compileComponents(); + }); + + beforeEach(() => { + fixture = TestBed.createComponent(ViewCollateralComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/collaterals/view-collateral/view-collateral.component.ts b/src/app/collaterals/view-collateral/view-collateral.component.ts new file mode 100644 index 000000000..5ce8dfc6b --- /dev/null +++ b/src/app/collaterals/view-collateral/view-collateral.component.ts @@ -0,0 +1,52 @@ +import { Component, OnInit } from '@angular/core'; +import { ActivatedRoute, Router } from '@angular/router'; +import { CollateralsService } from '../collaterals.service'; +import { MatDialog } from '@angular/material/dialog'; + +/** Custom Components */ +import { DeleteDialogComponent } from '../../shared/delete-dialog/delete-dialog.component'; + + +@Component({ + selector: 'mifosx-view-collateral', + templateUrl: './view-collateral.component.html', + styleUrls: ['./view-collateral.component.scss'] +}) +export class ViewCollateralComponent implements OnInit { + + clientCollateralData: any; + + collateralColumns: string[] = ['ID', 'Last Repayment', 'Remaining Amount', 'Last Repayment Date']; + + constructor( + private route: ActivatedRoute, + private collateralsService: CollateralsService, + private router: Router, + private dialog: MatDialog + ) { + this.route.data.subscribe((data: {clientCollateralData: any}) => { + this.clientCollateralData = data.clientCollateralData; + }); + } + + ngOnInit(): void { + } + + /** + * Deletes the Collateral and redirects to CLients Page. + */ + deleteCollateral() { + const deleteCollateralDialogRef = this.dialog.open(DeleteDialogComponent, { + data: { deleteContext: `collateral ${this.clientCollateralData.id}` } + }); + deleteCollateralDialogRef.afterClosed().subscribe((response: any) => { + if (response.delete) { + this.collateralsService.deleteCollateral(this.clientCollateralData.clientId, this.clientCollateralData.id) + .subscribe(() => { + this.router.navigate(['../../'], { relativeTo: this.route }); + }); + } + }); + } + +} diff --git a/src/app/loans/create-loans-account/create-loans-account.component.html b/src/app/loans/create-loans-account/create-loans-account.component.html index 843b7151e..1ac7fadd5 100644 --- a/src/app/loans/create-loans-account/create-loans-account.component.html +++ b/src/app/loans/create-loans-account/create-loans-account.component.html @@ -47,7 +47,7 @@ + [loansAccountFormValid]="loansAccountFormValid" [loanPrincipal]="loanPrincipal"> diff --git a/src/app/loans/create-loans-account/create-loans-account.component.ts b/src/app/loans/create-loans-account/create-loans-account.component.ts index 337cf09ad..c1e6e8974 100644 --- a/src/app/loans/create-loans-account/create-loans-account.component.ts +++ b/src/app/loans/create-loans-account/create-loans-account.component.ts @@ -5,6 +5,7 @@ import { ActivatedRoute, Router } from '@angular/router'; /** Custom Services */ import { LoansService } from '../loans.service'; import { SettingsService } from 'app/settings/settings.service'; +import { ClientsService } from 'app/clients/clients.service'; /** Step Components */ import { LoansAccountDetailsStepComponent } from '../loans-account-stepper/loans-account-details-step/loans-account-details-step.component'; @@ -35,6 +36,8 @@ export class CreateLoansAccountComponent implements OnInit { collateralOptions: any; /** Multi Disburse Loan */ multiDisburseLoan: any; + /** Principal Amount */ + principal: any; /** * Sets loans account create form. @@ -43,12 +46,14 @@ export class CreateLoansAccountComponent implements OnInit { * @param {Dates} dateUtils Date Utils * @param {loansService} LoansService Loans Service * @param {SettingsService} settingsService Settings Service + * @param {ClientsService} clientService Client Service */ constructor(private route: ActivatedRoute, private router: Router, private dateUtils: Dates, private loansService: LoansService, - private settingsService: SettingsService + private settingsService: SettingsService, + private clientService: ClientsService ) { this.route.data.subscribe((data: { loansAccountTemplate: any }) => { this.loansAccountTemplate = data.loansAccountTemplate; @@ -64,8 +69,9 @@ export class CreateLoansAccountComponent implements OnInit { */ setTemplate($event: any) { this.loansAccountProductTemplate = $event; - this.loansService.getLoansCollateralTemplateResource(this.loansAccountProductTemplate.loanProductId).subscribe((response: any) => { - this.collateralOptions = response.loanCollateralOptions; + const clientId = this.loansAccountTemplate.clientId; + this.clientService.getCollateralTemplate(clientId).subscribe((response: any) => { + this.collateralOptions = response; }); const entityId = (this.loansAccountTemplate.clientId) ? this.loansAccountTemplate.clientId : this.loansAccountTemplate.group.id; const isGroup = (this.loansAccountTemplate.clientId) ? false : true; @@ -89,10 +95,16 @@ export class CreateLoansAccountComponent implements OnInit { get loansAccountFormValid() { return ( this.loansAccountDetailsForm.valid && - this.loansAccountTermsForm.valid + this.loansAccountTermsForm.valid && + this.loansAccountChargesStep.loansAccountCharges.isValid ); } + /** Gets principal Amount */ + get loanPrincipal() { + return this.loansAccountTermsStep.loansAccountTermsForm.value.principal; + } + /** Retrieves Data of all forms except Currency to submit the data */ get loansAccount() { return { @@ -116,9 +128,8 @@ export class CreateLoansAccountComponent implements OnInit { dueDate: charge.dueDate && this.dateUtils.formatDate(charge.dueDate, dateFormat), })), collateral: this.loansAccount.collateral.map((collateralEle: any) => ({ - type: collateralEle.type, - value: collateralEle.value, - description: collateralEle.description + clientCollateralId: collateralEle.type.collateralId, + quantity: collateralEle.value, })), disbursementData: this.loansAccount.disbursementData.map((item: any) => ({ expectedDisbursementDate: this.dateUtils.formatDate(item.expectedDisbursementDate, dateFormat), @@ -157,6 +168,7 @@ export class CreateLoansAccountComponent implements OnInit { if (!(this.multiDisburseLoan)) { delete loansAccountData.disbursementData; } + delete loansAccountData.isValid; this.loansService.createLoansAccount(loansAccountData).subscribe((response: any) => { this.router.navigate(['../', response.resourceId], { relativeTo: this.route }); diff --git a/src/app/loans/custom-dialog/loans-account-add-collateral-dialog/loans-account-add-collateral-dialog.component.html b/src/app/loans/custom-dialog/loans-account-add-collateral-dialog/loans-account-add-collateral-dialog.component.html index dfe35591e..fd0e49cff 100644 --- a/src/app/loans/custom-dialog/loans-account-add-collateral-dialog/loans-account-add-collateral-dialog.component.html +++ b/src/app/loans/custom-dialog/loans-account-add-collateral-dialog/loans-account-add-collateral-dialog.component.html @@ -3,31 +3,36 @@
- Collateral Type - - + Collateral + + {{ collateralType.name }} - Collateral Type is required + Collateral is required - Value - - - Value is required + Quantity + + + Quantity is required + + + Quantity can not be more than {{ maxQuantity }} - Description - - - Description is required - + Total Value + + + + + Total Collateral Value +
diff --git a/src/app/loans/custom-dialog/loans-account-add-collateral-dialog/loans-account-add-collateral-dialog.component.ts b/src/app/loans/custom-dialog/loans-account-add-collateral-dialog/loans-account-add-collateral-dialog.component.ts index 35f1ec886..4cf10de51 100644 --- a/src/app/loans/custom-dialog/loans-account-add-collateral-dialog/loans-account-add-collateral-dialog.component.ts +++ b/src/app/loans/custom-dialog/loans-account-add-collateral-dialog/loans-account-add-collateral-dialog.component.ts @@ -16,7 +16,12 @@ export class LoansAccountAddCollateralDialogComponent implements OnInit { }; addCollateralForm: FormGroup; + /** All Collateral Options */ collateralTypeData: any; + /** Selected Collateral */ + collateralData: any; + /** Maximum ALlowed Quantity of selected collateral */ + maxQuantity: any = 0; constructor(public dialogRef: MatDialogRef, @Inject(MAT_DIALOG_DATA) public data: any, @@ -26,14 +31,33 @@ export class LoansAccountAddCollateralDialogComponent implements OnInit { ngOnInit() { this.dialogRef.updateSize('400px'); - this.collateralTypeData = this.data.collateralTypeOptions; + this.collateralTypeData = this.data.collateralOptions; + this.buildDependencies(); } createAddCollateralForm() { this.addCollateralForm = this.formBuilder.group({ - 'type': ['', Validators.required], - 'value': ['', Validators.required], - 'description': ['', Validators.required] + 'collateral': ['', Validators.required], + 'quantity': ['', Validators.required], + 'totalValue': [{value: '', disabled: true}], + 'totalCollateralValue': [{value: '', disabled: true}], + }); + } + + /** + * Subscribe to Form controls value changes + */ + buildDependencies() { + this.addCollateralForm.controls.collateral.valueChanges.subscribe((collateral: any) => { + this.collateralData = collateral; + this.maxQuantity = collateral.quantity; + }); + + this.addCollateralForm.controls.quantity.valueChanges.subscribe((quantity: any) => { + this.addCollateralForm.patchValue({ + 'totalValue': this.collateralData.basePrice * quantity, + 'totalCollateralValue': this.collateralData.basePrice * this.collateralData.pctToBase * quantity / 100 + }); }); } diff --git a/src/app/loans/loans-account-stepper/loans-account-charges-step/loans-account-charges-step.component.html b/src/app/loans/loans-account-stepper/loans-account-charges-step/loans-account-charges-step.component.html index 2b367a5b9..2cfe85aab 100644 --- a/src/app/loans/loans-account-stepper/loans-account-charges-step/loans-account-charges-step.component.html +++ b/src/app/loans/loans-account-stepper/loans-account-charges-step/loans-account-charges-step.component.html @@ -135,18 +135,23 @@ - + - + - - - + + + + + + + + @@ -169,7 +174,7 @@    Previous - diff --git a/src/app/loans/loans-account-stepper/loans-account-charges-step/loans-account-charges-step.component.ts b/src/app/loans/loans-account-stepper/loans-account-charges-step/loans-account-charges-step.component.ts index 8d7235dd3..399f9002b 100644 --- a/src/app/loans/loans-account-stepper/loans-account-charges-step/loans-account-charges-step.component.ts +++ b/src/app/loans/loans-account-stepper/loans-account-charges-step/loans-account-charges-step.component.ts @@ -31,8 +31,10 @@ export class LoansAccountChargesStepComponent implements OnInit, OnChanges { @Input() loansAccountTemplate: any; // @Input() loansAccountFormValid: LoansAccountFormValid @Input() loansAccountFormValid: boolean; - // @Input collateralOptionsL Collateral Options + // @Input collateralOptions: Collateral Options @Input() collateralOptions: any; + // @Input loanPrincipal: Loan Principle + @Input() loanPrincipal: any; /** Charges Data */ chargeData: any; @@ -47,9 +49,13 @@ export class LoansAccountChargesStepComponent implements OnInit, OnChanges { /** Columns to be displayed in overdue charges table. */ overdueChargesDisplayedColumns: string[] = ['name', 'type', 'amount', 'collectedon']; /** Columns to be displayed in collateral table. */ - loanCollateralDisplayedColumns: string[] = ['type', 'value', 'description', 'action']; + loanCollateralDisplayedColumns: string[] = ['type', 'value', 'totalValue', 'totalCollateralValue', 'action']; /** Component is pristine if there has been no changes by user interaction */ pristine = true; + /** Check if value of collateral added is more than principal amount */ + isCollateralSufficient = false; + /** Total value of all collateral added to a loan */ + totalCollateralValue: any = 0; /** * Loans Account Charges Form Step @@ -207,33 +213,53 @@ export class LoansAccountChargesStepComponent implements OnInit, OnChanges { }); } - // TODO: Needs to be completed + /** + * Add a Collateral to the loan + */ addCollateral() { const addCollateralDialogRef = this.dialog.open(LoansAccountAddCollateralDialogComponent, { data: { collateralOptions: this.collateralOptions } }); + console.log(this.collateralOptions); addCollateralDialogRef.afterClosed().subscribe((response: any) => { - if (response.addCollateralForm) { + console.log(this.loanPrincipal); + if (response.data) { const collateralData = { - type: response.addCollateralForm.value.type, - value: response.addCollateralForm.value.value, - description: response.addCollateralForm.value.description + type: response.data.value.collateral, + value: response.data.value.quantity, }; - this.collateralDataSource = this.collateralDataSource.concat(collateralData); + this.totalCollateralValue += collateralData.type.pctToBase * collateralData.type.basePrice * collateralData.value / 100; + this.collateralDataSource = this.collateralDataSource.concat(collateralData); + this.collateralOptions = this.collateralOptions.filter( (user: any) => user.collateralId !== response.data.value.collateral.collateralId); + if (this.loanPrincipal < this.totalCollateralValue) { + this.isCollateralSufficient = true; + } else { + this.isCollateralSufficient = false; + } } }); } - + /** + * Delete a added collateral from loan + * @param id ID od the collateral to be deleted + */ deleteCollateral(id: any) { const deleteCollateralDialogRef = this.dialog.open(DeleteDialogComponent, { data: { deleteContext: `collateral` } }); deleteCollateralDialogRef.afterClosed().subscribe((response: any) => { if (response.delete) { - this.collateralDataSource.splice(this.collateralDataSource.indexOf(id), 1); + const removed: any = this.collateralDataSource.splice(id, 1); + this.collateralOptions = this.collateralOptions.concat(removed[0].type); + this.totalCollateralValue -= removed[0].type.pctToBase * removed[0].type.basePrice * removed[0].value / 100; this.collateralDataSource = this.collateralDataSource.concat([]); this.pristine = false; + if (this.loanPrincipal < this.totalCollateralValue) { + this.isCollateralSufficient = true; + } else { + this.isCollateralSufficient = false; + } } }); } @@ -244,7 +270,8 @@ export class LoansAccountChargesStepComponent implements OnInit, OnChanges { get loansAccountCharges() { return { charges: this.chargesDataSource, - collateral: this.collateralDataSource + collateral: this.collateralDataSource, + isValid: this.isCollateralSufficient }; } diff --git a/src/app/loans/loans-view/loan-collateral-tab/loan-collateral-tab.component.html b/src/app/loans/loans-view/loan-collateral-tab/loan-collateral-tab.component.html index 201e9ffd5..bd5245484 100644 --- a/src/app/loans/loans-view/loan-collateral-tab/loan-collateral-tab.component.html +++ b/src/app/loans/loans-view/loan-collateral-tab/loan-collateral-tab.component.html @@ -2,19 +2,24 @@
Type Name {{ ele.type.name }} Value Quantity {{ ele.value }} Description {{ ele.description }} Total Value {{ ele.type.basePrice*ele.value }} Total Collateral Value {{ ele.type.pctToBase*ele.type.basePrice*ele.value/100 }}
- - - + + + - - - + + + - - - + + + + + + + + diff --git a/src/app/loans/loans-view/loan-collateral-tab/loan-collateral-tab.component.ts b/src/app/loans/loans-view/loan-collateral-tab/loan-collateral-tab.component.ts index 889b33148..7c46490e5 100644 --- a/src/app/loans/loans-view/loan-collateral-tab/loan-collateral-tab.component.ts +++ b/src/app/loans/loans-view/loan-collateral-tab/loan-collateral-tab.component.ts @@ -11,7 +11,7 @@ export class LoanCollateralTabComponent implements OnInit { /** Loan Details */ loanDetails: any; /** Columns to be displayed in collateral table. */ - displayedColumns: string[] = ['type', 'value', 'description']; + displayedColumns: string[] = ['id', 'quantity', 'total', 'totalCollateral']; /** * Retrieves the loans data from `resolve`. diff --git a/src/app/products/collaterals/collateral.resolver.ts b/src/app/products/collaterals/collateral.resolver.ts new file mode 100644 index 000000000..02c0bbe48 --- /dev/null +++ b/src/app/products/collaterals/collateral.resolver.ts @@ -0,0 +1,31 @@ +/** Angular Imports */ +import { Injectable } from '@angular/core'; +import { Resolve, ActivatedRouteSnapshot } from '@angular/router'; + +/** rxjs Imports */ +import { Observable } from 'rxjs'; + +/** Custom Services */ +import { ProductsService } from '../products.service'; + +/** + * Charges data resolver. + */ +@Injectable() +export class CollateralResolver implements Resolve { + + /** + * @param {ProductsService} productsService Products service. + */ + constructor(private productsService: ProductsService) {} + + /** + * Returns the products data. + * @returns {Observable} + */ + resolve(route: ActivatedRouteSnapshot): Observable { + const collateralId = route.paramMap.get('id'); + return this.productsService.getCollateral(collateralId); + } + +} diff --git a/src/app/products/collaterals/collaterals-template.resolver.ts b/src/app/products/collaterals/collaterals-template.resolver.ts new file mode 100644 index 000000000..6d084ef48 --- /dev/null +++ b/src/app/products/collaterals/collaterals-template.resolver.ts @@ -0,0 +1,28 @@ +/** 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'; + +/** + * Collaterals Template Resolver + */ +@Injectable() +export class CollateralTemplateResolver implements Resolve { + /** + * @param {ProductsService} productsService products Service + */ + constructor(private productsService: ProductsService) {} + + /** + * Returns the product Data. + * @returns {Observable} + */ + resolve(): Observable { + return this.productsService.getCollateralTemplate(); + } +} diff --git a/src/app/products/collaterals/collaterals.component.html b/src/app/products/collaterals/collaterals.component.html new file mode 100644 index 000000000..fe0d66a98 --- /dev/null +++ b/src/app/products/collaterals/collaterals.component.html @@ -0,0 +1,56 @@ +
+ +
+ +
+ +
+ + Filter + + +
+ +
+ +
Type {{ ele.type.name }} ID {{ ele.clientCollateralId }} Value {{ ele.value }} Quantity {{ ele.quantity }} Description {{ ele.description }} Total Value {{ ele.total }} Total Collateral Value {{ ele.totalCollateral }}
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Name {{ collateral.name }} Quality/Type {{ collateral.quality }} Base Price {{ collateral.basePrice }} Base Percentage {{ collateral.pctToBase }} Unit Type {{ collateral.unitType }}
+ + + + + + + \ No newline at end of file diff --git a/src/app/products/collaterals/collaterals.component.scss b/src/app/products/collaterals/collaterals.component.scss new file mode 100644 index 000000000..d473215cc --- /dev/null +++ b/src/app/products/collaterals/collaterals.component.scss @@ -0,0 +1,24 @@ +table { + width: 100%; + + .select-row:hover { + cursor: pointer; + } + } + + .true { + color: #32cd32; + } + + .false { + color: #f44366; + } + + .ispenalty { + color: #32cd32; + } + + .nopenalty { + color: #f44366; + } + \ No newline at end of file diff --git a/src/app/products/collaterals/collaterals.component.spec.ts b/src/app/products/collaterals/collaterals.component.spec.ts new file mode 100644 index 000000000..203248b28 --- /dev/null +++ b/src/app/products/collaterals/collaterals.component.spec.ts @@ -0,0 +1,25 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { CollateralsComponent } from './collaterals.component'; + +describe('CollateralsComponent', () => { + let component: CollateralsComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + declarations: [ CollateralsComponent ] + }) + .compileComponents(); + }); + + beforeEach(() => { + fixture = TestBed.createComponent(CollateralsComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/products/collaterals/collaterals.component.ts b/src/app/products/collaterals/collaterals.component.ts new file mode 100644 index 000000000..3658fa850 --- /dev/null +++ b/src/app/products/collaterals/collaterals.component.ts @@ -0,0 +1,61 @@ +/** Angular Imports */ +import { Component, ViewChild, OnInit } from '@angular/core'; +import { MatPaginator } from '@angular/material/paginator'; +import { MatSort } from '@angular/material/sort'; +import { MatTableDataSource } from '@angular/material/table'; +import { ActivatedRoute } from '@angular/router'; + +@Component({ + selector: 'mifosx-collaterals', + templateUrl: './collaterals.component.html', + styleUrls: ['./collaterals.component.scss'] +}) +export class CollateralsComponent implements OnInit { + + /** Collateral Data */ + collateralData: any; + /** Columns to be displayed in the Collaterals Table */ + displayedColumns: string[] = ['name', 'quality', 'basePrice', 'basePercentage', 'unitType']; + /** DataSource for the Collateral Table */ + dataSource: MatTableDataSource; + + /** Paginator for the Collateral Table */ + @ViewChild(MatPaginator, { static: true }) paginator: MatPaginator; + /** Sorter for Collateral Table */ + @ViewChild(MatSort, { static: true }) sort: MatSort; + + /** + * Retrieves the Collaterals data from `resolve`. + * @param {ActivatedRoute} route Activated Route. + */ + constructor(private route: ActivatedRoute) { + this.route.data.subscribe(( data: { collaterals: any }) => { + this.collateralData = data.collaterals; + }); + } + + /** + * Filters data in collateral table based on passed value. + * @param {string} filterValue Value to filter data. + */ + applyFilter(filterValue: string) { + this.dataSource.filter = filterValue.trim().toLowerCase(); + } + + /** + * Sets the collateral table. + */ + ngOnInit() { + this.setCollaterals(); + } + + /** + * Initializes the data source, paginator and sorter for collateral table. + */ + setCollaterals() { + this.dataSource = new MatTableDataSource(this.collateralData); + this.dataSource.paginator = this.paginator; + this.dataSource.sort = this.sort; + } + +} diff --git a/src/app/products/collaterals/collaterals.resolver.ts b/src/app/products/collaterals/collaterals.resolver.ts new file mode 100644 index 000000000..6a4b3e300 --- /dev/null +++ b/src/app/products/collaterals/collaterals.resolver.ts @@ -0,0 +1,28 @@ +/** Angular Imports */ +import { Injectable } from '@angular/core'; +import { ActivatedRouteSnapshot, Resolve, RouterStateSnapshot } from '@angular/router'; + +/** rxjs Imports */ +import { Observable } from 'rxjs'; + +/** Custom Services */ +import { ProductsService } from '../products.service'; + +/** + * Collaterals data resolver + */ +@Injectable() +export class CollateralsResolver implements Resolve { + /** + * @param {ProductsService} productsService Products service + */ + constructor(private productsService: ProductsService) {} + + /** + * Returns the All Collaterals Data + * @returns {Observable} + */ + resolve(): Observable { + return this.productsService.getCollaterals(); + } +} diff --git a/src/app/products/collaterals/create-collateral/create-collateral.component.html b/src/app/products/collaterals/create-collateral/create-collateral.component.html new file mode 100644 index 000000000..b55bb8369 --- /dev/null +++ b/src/app/products/collaterals/create-collateral/create-collateral.component.html @@ -0,0 +1,71 @@ +
+ + + +
+ + + +
+ + + Name + + + Name is required + + + + Type/Quality + + + Quality is required + + + + Unit Type + + + Unit Type is required + + + + Base Price + + + Base Price is required + + + + Percentage to Base + + + Percentage to Base is required + + + + Currency + + + {{ currency.name }} + + + + Currency is required + + + +
+ +
+ + + + + + +
+ +
+ +
\ No newline at end of file diff --git a/src/app/products/collaterals/create-collateral/create-collateral.component.scss b/src/app/products/collaterals/create-collateral/create-collateral.component.scss new file mode 100644 index 000000000..e69de29bb diff --git a/src/app/products/collaterals/create-collateral/create-collateral.component.spec.ts b/src/app/products/collaterals/create-collateral/create-collateral.component.spec.ts new file mode 100644 index 000000000..99d7e5f30 --- /dev/null +++ b/src/app/products/collaterals/create-collateral/create-collateral.component.spec.ts @@ -0,0 +1,25 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { CreateCollateralComponent } from './create-collateral.component'; + +describe('CreateCollateralComponent', () => { + let component: CreateCollateralComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + declarations: [ CreateCollateralComponent ] + }) + .compileComponents(); + }); + + beforeEach(() => { + fixture = TestBed.createComponent(CreateCollateralComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/products/collaterals/create-collateral/create-collateral.component.ts b/src/app/products/collaterals/create-collateral/create-collateral.component.ts new file mode 100644 index 000000000..228957ccf --- /dev/null +++ b/src/app/products/collaterals/create-collateral/create-collateral.component.ts @@ -0,0 +1,82 @@ +/** Angular Imports */ +import { Component, OnInit } from '@angular/core'; +import { FormGroup, FormBuilder, FormControl, Validators } from '@angular/forms'; +import { Router, ActivatedRoute } from '@angular/router'; + +/** Custom Services */ +import { ProductsService } from '../../products.service'; +import { SettingsService } from 'app/settings/settings.service'; +import { Dates } from 'app/core/utils/dates'; + +/** + * Create Collateral component. + */ +@Component({ + selector: 'mifosx-create-collateral', + templateUrl: './create-collateral.component.html', + styleUrls: ['./create-collateral.component.scss'] +}) +export class CreateCollateralComponent implements OnInit { + + /** Collateral form */ + collateralForm: FormGroup; + /** Charges Template data */ + collateralTemplateData: any; + + /** + * Retrieves the collateral template data + * @param {FormBuilder} formBuilder Form Builder + * @param {ProductsService} productsService Products Service. + * @param {ActivatedRoute} route Activated Route. + * @param {Router} router Router for navigation. + * @param {SettingsService} settingsService Settings Service + */ + constructor(private formBuilder: FormBuilder, + private productsService: ProductsService, + private route: ActivatedRoute, + private router: Router, + private settingsService: SettingsService) { + this.route.data.subscribe((data: { collateralTemplate: any }) => { + this.collateralTemplateData = data.collateralTemplate; + }); + } + + /** + * Create and sets Collateral Form + */ + ngOnInit(): void { + this.createCollateralForm(); + } + + /** + * Create the Collateral Form + */ + createCollateralForm() { + this.collateralForm = this.formBuilder.group({ + 'name': ['', Validators.required], + 'unitType': ['', Validators.required], + 'basePrice': ['', Validators.required], + 'pctToBase': ['', Validators.required], + 'currency': ['', Validators.required], + 'quality': ['', Validators.required] + }); + } + + /** + * Submit a new collateral Product form + */ + submit() { + const collateralFormData = this.collateralForm.value; + const locale = this.settingsService.language.code; + const data = { + ...collateralFormData, + locale + }; + this.productsService.createCollateral(data).subscribe((response: any) => { + this.router.navigate(['../'], { relativeTo: this.route }); + }); + } + + + +} diff --git a/src/app/products/collaterals/edit-collateral/edit-collateral.component.html b/src/app/products/collaterals/edit-collateral/edit-collateral.component.html new file mode 100644 index 000000000..4c33da7a8 --- /dev/null +++ b/src/app/products/collaterals/edit-collateral/edit-collateral.component.html @@ -0,0 +1,76 @@ +
+ + + +
+ + + +
+ + + Name + + + Name is required + + + + + Type/Quality + + + Type/Quality is required + + + + + Unit Type + + + Unit Type is required + + + + + Base Price + + + Base Price is required + + + + + Percentage To Base + + + Percentage to Base is required + + + + + Currency + + + {{ currency.name }} + + + + Currency is required + + + +
+ +
+ + + + + + +
+ +
+ +
\ No newline at end of file diff --git a/src/app/products/collaterals/edit-collateral/edit-collateral.component.scss b/src/app/products/collaterals/edit-collateral/edit-collateral.component.scss new file mode 100644 index 000000000..e69de29bb diff --git a/src/app/products/collaterals/edit-collateral/edit-collateral.component.spec.ts b/src/app/products/collaterals/edit-collateral/edit-collateral.component.spec.ts new file mode 100644 index 000000000..66fbb5c31 --- /dev/null +++ b/src/app/products/collaterals/edit-collateral/edit-collateral.component.spec.ts @@ -0,0 +1,25 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { EditCollateralComponent } from './edit-collateral.component'; + +describe('EditCollateralComponent', () => { + let component: EditCollateralComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + declarations: [ EditCollateralComponent ] + }) + .compileComponents(); + }); + + beforeEach(() => { + fixture = TestBed.createComponent(EditCollateralComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/products/collaterals/edit-collateral/edit-collateral.component.ts b/src/app/products/collaterals/edit-collateral/edit-collateral.component.ts new file mode 100644 index 000000000..98732f3a0 --- /dev/null +++ b/src/app/products/collaterals/edit-collateral/edit-collateral.component.ts @@ -0,0 +1,73 @@ +/** Angular Imports */ +import { Component, OnInit } from '@angular/core'; +import { FormBuilder, FormGroup, Validators } from '@angular/forms'; +import { ActivatedRoute, Router } from '@angular/router'; + +/** Custom Services */ +import { ProductsService } from 'app/products/products.service'; +import { SettingsService } from 'app/settings/settings.service'; + +@Component({ + selector: 'mifosx-edit-collateral', + templateUrl: './edit-collateral.component.html', + styleUrls: ['./edit-collateral.component.scss'] +}) +export class EditCollateralComponent implements OnInit { + + /** Colalteral Data */ + collateralData: any; + /** Collateral Template */ + collateralTemplateData: any; + /** Collateral Form */ + collateralForm: FormGroup; + + /** + * Retrieves the Collateral Data from `resolve` + * @param {ProductsService} productsService Products Service. + * @param {FormBuilder} formBuilder Form Builder. + * @param {ActivatedRoute} route Activated Route. + * @param {Router} router Router for navigation. + * @param {SettingsService} settingsService Settings Service. + */ + constructor(private productsService: ProductsService, + private formBuilder: FormBuilder, + private route: ActivatedRoute, + private router: Router, + private settingsService: SettingsService) { + this.route.data.subscribe((data: { collateral: any, collateralTemplate: any }) => { + this.collateralData = data.collateral; + this.collateralTemplateData = data.collateralTemplate; + }); + } + + ngOnInit(): void { + this.editCollateralForm(); + } + + /** + * Edit Collateral Form + */ + editCollateralForm() { + this.collateralForm = this.formBuilder.group({ + 'name': [this.collateralData.name, Validators.required], + 'quality': [this.collateralData.quality, Validators.required], + 'unitType': [this.collateralData.unitType, Validators.required], + 'basePrice': [this.collateralData.basePrice, Validators.required], + 'pctToBase': [this.collateralData.pctToBase, Validators.required], + 'currency': [this.collateralData.currency, Validators.required], + }); + } + + /** + * Submits the updated Collateral Form + */ + submit() { + const collateral = this.collateralForm.value; + collateral.locale = this.settingsService.language.code; + this.productsService.updateCollateral(this.collateralData.id.toString(), collateral) + .subscribe((response: any) => { + this.router.navigate(['../'], { relativeTo: this.route }); + }); + } + +} diff --git a/src/app/products/collaterals/view-collateral/view-collateral.component.html b/src/app/products/collaterals/view-collateral/view-collateral.component.html new file mode 100644 index 000000000..4a10ec474 --- /dev/null +++ b/src/app/products/collaterals/view-collateral/view-collateral.component.html @@ -0,0 +1,74 @@ +
+ + +
+ +
+ + + + + +
+ +
+ Collateral Name +
+ +
+ {{ collateralData.name }} +
+ +
+ Quality/Type +
+ +
+ {{ collateralData.quality }} +
+ +
+ Base Price +
+ +
+ {{ collateralData.basePrice }} +
+ +
+ Base Percentage +
+ +
+ {{ collateralData.pctToBase }} +
+ +
+ Unit Type +
+ +
+ {{ collateralData.unitType }} +
+ +
+ Currency +
+ +
+ {{ collateralData.currency }} +
+ +
+ +
+ +
+ +
\ No newline at end of file diff --git a/src/app/products/collaterals/view-collateral/view-collateral.component.scss b/src/app/products/collaterals/view-collateral/view-collateral.component.scss new file mode 100644 index 000000000..39c48e14d --- /dev/null +++ b/src/app/products/collaterals/view-collateral/view-collateral.component.scss @@ -0,0 +1,11 @@ +.container { + max-width: 37rem; + + .content { + div { + margin: 1rem 0; + word-wrap: break-word; + } + } + } + \ No newline at end of file diff --git a/src/app/products/collaterals/view-collateral/view-collateral.component.spec.ts b/src/app/products/collaterals/view-collateral/view-collateral.component.spec.ts new file mode 100644 index 000000000..ac97d75c7 --- /dev/null +++ b/src/app/products/collaterals/view-collateral/view-collateral.component.spec.ts @@ -0,0 +1,25 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { ViewCollateralComponent } from './view-collateral.component'; + +describe('ViewCollateralComponent', () => { + let component: ViewCollateralComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + declarations: [ ViewCollateralComponent ] + }) + .compileComponents(); + }); + + beforeEach(() => { + fixture = TestBed.createComponent(ViewCollateralComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/products/collaterals/view-collateral/view-collateral.component.ts b/src/app/products/collaterals/view-collateral/view-collateral.component.ts new file mode 100644 index 000000000..da507c962 --- /dev/null +++ b/src/app/products/collaterals/view-collateral/view-collateral.component.ts @@ -0,0 +1,60 @@ +import { Component, OnInit } from '@angular/core'; +import { ActivatedRoute, Router } from '@angular/router'; +import { MatDialog } from '@angular/material/dialog'; + +/** Custom Services */ +import { ProductsService } from 'app/products/products.service'; + +/** Custom Components */ +import { DeleteDialogComponent } from '../../../shared/delete-dialog/delete-dialog.component'; + +/** + * View Collateral Component + */ +@Component({ + selector: 'mifosx-view-collateral', + templateUrl: './view-collateral.component.html', + styleUrls: ['./view-collateral.component.scss'] +}) +export class ViewCollateralComponent implements OnInit { + + /** Collateral Data */ + collateralData: any; + + /** + * Retrieves the Collateral Data from 'resolve. + * @param {ProductsService} productsService Products Service. + * @param {ActivatedRoute} route Activated Route. + * @param {Router} router Router for navigation. + * @param {MatDialog} dialog Dialog reference. + */ + constructor(private productsService: ProductsService, + private route: ActivatedRoute, + private router: Router, + private dialog: MatDialog) { + this.route.data.subscribe((data: { collateral: any }) => { + this.collateralData = data.collateral; + }); + } + + ngOnInit(): void { + } + + /** + * Deletes the collateral and redirects to collaterals + */ + deleteCollateral() { + const deleteCollateralDialogRef = this.dialog.open(DeleteDialogComponent, { + data: { deleteContext: `collateral ${this.collateralData.id}` } + }); + deleteCollateralDialogRef.afterClosed().subscribe((response: any) => { + if (response.delete) { + this.productsService.deleteCollateral(this.collateralData.id) + .subscribe(() => { + this.router.navigate(['/products/collaterals']); + }); + } + }); + } + +} diff --git a/src/app/products/products-routing.module.ts b/src/app/products/products-routing.module.ts index 3f984e57d..9ab3c244e 100644 --- a/src/app/products/products-routing.module.ts +++ b/src/app/products/products-routing.module.ts @@ -50,6 +50,10 @@ import { ViewDividendComponent } from './share-products/view-dividend/view-divid import { CreateTaxGroupComponent } from './manage-tax-groups/create-tax-group/create-tax-group.component'; import { EditTaxGroupComponent } from './manage-tax-groups/edit-tax-group/edit-tax-group.component'; import { CreateProductMixComponent } from './products-mix/create-product-mix/create-product-mix.component'; +import { CollateralsComponent } from './collaterals/collaterals.component'; +import { CreateCollateralComponent } from './collaterals/create-collateral/create-collateral.component'; +import { EditCollateralComponent } from './collaterals/edit-collateral/edit-collateral.component'; +import { ViewCollateralComponent } from './collaterals/view-collateral/view-collateral.component'; /** Custom Resolvers */ import { LoanProductsResolver } from './loan-products/loan-products.resolver'; @@ -94,6 +98,9 @@ import { EditProductMixComponent } from './products-mix/edit-product-mix/edit-pr import { ChargesTemplateAndResolver } from './charges/charges-template-and-resolver'; import { EditFixedDepositProductComponent } from './fixed-deposit-products/edit-fixed-deposit-product/edit-fixed-deposit-product.component'; import { FixedDepositProductAndTemplateResolver } from './fixed-deposit-products/edit-fixed-deposit-product/fixed-deposit-product-and-template.resolver'; +import { CollateralResolver } from './collaterals/collateral.resolver'; +import { CollateralsResolver } from './collaterals/collaterals.resolver'; +import { CollateralTemplateResolver } from './collaterals/collaterals-template.resolver'; /** Products Routes */ const routes: Routes = [ @@ -593,6 +600,52 @@ const routes: Routes = [ ] }, ] + }, + { + path: 'collaterals', + data: { title: extract('Collaterals'), breadcrumb: 'Collaterals' }, + children: [ + { + path: 'create', + component: CreateCollateralComponent, + data: { title: extract('Create Collateral'), breadcrumb: 'Create Collateral' }, + resolve: { + collateralTemplate: CollateralTemplateResolver + } + }, + { + path: '', + component: CollateralsComponent, + resolve: { + collaterals: CollateralsResolver + } + }, + { + path: ':id', + data: { title: extract('View Collateral'), routeParamBreadcrumb: 'id' }, + resolve: { + collateral: CollateralResolver + }, + children: [ + { + path: '', + component: ViewCollateralComponent, + resolve: { + collateral: CollateralResolver + }, + }, + { + path: 'edit', + component: EditCollateralComponent, + data: { title: extract('Edit Collateral'), breadcrumb: 'Edit', routeParamBreadcrumb: false }, + resolve: { + collateralTemplate: CollateralTemplateResolver, + collateral: CollateralResolver + } + }, + ] + }, + ] } ] } @@ -647,7 +700,10 @@ const routes: Routes = [ EditTaxGroupResolver, ProductsMixTemplateResolver, FixedDepositProductAndTemplateResolver, - FloatingRatesResolver + FloatingRatesResolver, + CollateralResolver, + CollateralsResolver, + CollateralTemplateResolver ] }) export class ProductsRoutingModule { } diff --git a/src/app/products/products.component.html b/src/app/products/products.component.html index 86b03a26e..efc2e578a 100644 --- a/src/app/products/products.component.html +++ b/src/app/products/products.component.html @@ -40,6 +40,14 @@

Define charges/penalties for loan products, savings and deposit products

+ + + + +

Collateral Management

+

Define collaterals for Collateral Management

+
+ diff --git a/src/app/products/products.module.ts b/src/app/products/products.module.ts index 4e0ca2d4b..049af78b6 100644 --- a/src/app/products/products.module.ts +++ b/src/app/products/products.module.ts @@ -93,6 +93,10 @@ import { CreateProductMixComponent } from './products-mix/create-product-mix/cre import { EditProductMixComponent } from './products-mix/edit-product-mix/edit-product-mix.component'; import { CreateChargeComponent } from './charges/create-charge/create-charge.component'; import { EditFixedDepositProductComponent } from './fixed-deposit-products/edit-fixed-deposit-product/edit-fixed-deposit-product.component'; +import { CollateralsComponent } from './collaterals/collaterals.component'; +import { CreateCollateralComponent } from './collaterals/create-collateral/create-collateral.component'; +import { EditCollateralComponent } from './collaterals/edit-collateral/edit-collateral.component'; +import { ViewCollateralComponent } from './collaterals/view-collateral/view-collateral.component'; /** * Products Module @@ -193,7 +197,11 @@ import { EditFixedDepositProductComponent } from './fixed-deposit-products/edit- EditProductMixComponent, ManageTaxGroupsComponent, CreateChargeComponent, - EditFixedDepositProductComponent + EditFixedDepositProductComponent, + CollateralsComponent, + CreateCollateralComponent, + EditCollateralComponent, + ViewCollateralComponent ], providers: [ ] }) diff --git a/src/app/products/products.service.ts b/src/app/products/products.service.ts index aa2ad6f36..7fb060fab 100644 --- a/src/app/products/products.service.ts +++ b/src/app/products/products.service.ts @@ -415,4 +415,51 @@ export class ProductsService { return this.http.put(`/recurringdepositproducts/${recurringDepositProductId}`, recurringDepositProduct); } + /** + * @returns {Observable} Collateral data. + */ + getCollaterals(): Observable { + return this.http.get('/collateral-management'); + } + + /** + * @returns {Observable} Collateral Template. + */ + getCollateralTemplate(): Observable { + return this.http.get('/collateral-management/template'); + } + + /** + * @param {string} collateralId Collateral ID of Collateral. + * @returns {Observable} Collateral. + */ + getCollateral(collateralId: string, template: boolean = false): Observable { + const httpParams = new HttpParams().set('template', template.toString()); + return this.http.get(`/collateral-management/${collateralId}`, { params: httpParams }); + } + + /** + * @param collateralId Collateral Id to be updated. + * @param collateral Collateral Data to be updated. + */ + updateCollateral(collateralId: string, collateral: any): Observable { + return this.http.put(`/collateral-management/${collateralId}`, collateral); + } + + /** + * @param {string} collateralId Collateral ID of Collateral to be deleted. + * @returns {Observable} + */ + deleteCollateral(collateralId: string): Observable { + return this.http.delete(`/collateral-management/${collateralId}`); + } + + /** + * @param {any} collateral Collateral to be created. + * @returns {Observable} + */ + createCollateral(collateral: any): Observable { + return this.http.post('/collateral-management', collateral); + } + }