From e1e0af30632cef640e6edd5453aed81fbcba501a Mon Sep 17 00:00:00 2001 From: Ashutosh Sharma <45865775+spider0061@users.noreply.github.com> Date: Mon, 3 Aug 2020 20:37:51 +0530 Subject: [PATCH] feat: add view fixed deposit product component (#572) add view fixed deposit product component. fixes : #465 --- ...eposit-product-preview-step.component.html | 2 +- .../fixed-deposit-product.resolver.ts | 31 ++ .../fixed-deposit-products.component.html | 2 +- .../view-fixed-deposit-product.component.html | 494 ++++++++++++++++++ .../view-fixed-deposit-product.component.scss | 49 ++ ...ew-fixed-deposit-product.component.spec.ts | 25 + .../view-fixed-deposit-product.component.ts | 51 ++ src/app/products/products-routing.module.ts | 19 +- src/app/products/products.module.ts | 4 +- src/app/products/products.service.ts | 8 + 10 files changed, 681 insertions(+), 4 deletions(-) create mode 100644 src/app/products/fixed-deposit-products/fixed-deposit-product.resolver.ts create mode 100644 src/app/products/fixed-deposit-products/view-fixed-deposit-product/view-fixed-deposit-product.component.html create mode 100644 src/app/products/fixed-deposit-products/view-fixed-deposit-product/view-fixed-deposit-product.component.scss create mode 100644 src/app/products/fixed-deposit-products/view-fixed-deposit-product/view-fixed-deposit-product.component.spec.ts create mode 100644 src/app/products/fixed-deposit-products/view-fixed-deposit-product/view-fixed-deposit-product.component.ts diff --git a/src/app/products/fixed-deposit-products/fixed-deposit-product-stepper/fixed-deposit-product-preview-step/fixed-deposit-product-preview-step.component.html b/src/app/products/fixed-deposit-products/fixed-deposit-product-stepper/fixed-deposit-product-preview-step/fixed-deposit-product-preview-step.component.html index ff86222c0..edd1bac99 100644 --- a/src/app/products/fixed-deposit-products/fixed-deposit-product-stepper/fixed-deposit-product-preview-step/fixed-deposit-product-preview-step.component.html +++ b/src/app/products/fixed-deposit-products/fixed-deposit-product-stepper/fixed-deposit-product-preview-step/fixed-deposit-product-preview-step.component.html @@ -86,7 +86,7 @@
- Minimum Deposit Term: + Maximum Deposit Term: {{ fixedDepositProduct.maxDepositTerm + ' ' + (fixedDepositProduct.maxDepositTermTypeId | find:fixedDepositProductsTemplate.periodFrequencyTypeOptions:'id':'value') }}
diff --git a/src/app/products/fixed-deposit-products/fixed-deposit-product.resolver.ts b/src/app/products/fixed-deposit-products/fixed-deposit-product.resolver.ts new file mode 100644 index 000000000..531a94a11 --- /dev/null +++ b/src/app/products/fixed-deposit-products/fixed-deposit-product.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'; + +/** + * Fixed Deposit Product data resolver. + */ +@Injectable() +export class FixedDepositProductResolver implements Resolve { + + /** + * @param {ProductsService} productsService Products service. + */ + constructor(private productsService: ProductsService) { } + + /** + * Returns the fixed deposit product data. + * @returns {Observable} + */ + resolve(route: ActivatedRouteSnapshot): Observable { + const fixedDepositProductId = route.paramMap.get('id'); + return this.productsService.getFixedDepositProduct(fixedDepositProductId); + } + +} diff --git a/src/app/products/fixed-deposit-products/fixed-deposit-products.component.html b/src/app/products/fixed-deposit-products/fixed-deposit-products.component.html index b39d34ddd..ebe9ba35c 100644 --- a/src/app/products/fixed-deposit-products/fixed-deposit-products.component.html +++ b/src/app/products/fixed-deposit-products/fixed-deposit-products.component.html @@ -29,7 +29,7 @@ - + diff --git a/src/app/products/fixed-deposit-products/view-fixed-deposit-product/view-fixed-deposit-product.component.html b/src/app/products/fixed-deposit-products/view-fixed-deposit-product/view-fixed-deposit-product.component.html new file mode 100644 index 000000000..ea624d748 --- /dev/null +++ b/src/app/products/fixed-deposit-products/view-fixed-deposit-product/view-fixed-deposit-product.component.html @@ -0,0 +1,494 @@ +
+ +
+ +
+ + + + + +
+ +

{{ fixedDepositProductData.name }}

+ + + +

Details

+ + + +
+ Short Name: + {{ fixedDepositProductData.shortName }} +
+ +
+ Description: + {{ fixedDepositProductData.description }} +
+ +

Currency

+ + + +
+ Currency: + {{ fixedDepositProductData.currency.name }} +
+ +
+ Decimal Places: + {{ fixedDepositProductData.currency.decimalPlaces }} +
+ +
+ Currency in Multiples Of: + {{ fixedDepositProductData.currency.inMultiplesOf | number}} +
+ +

Terms

+ + + +
+ Deposit Amount: + {{ fixedDepositProductData.depositAmount + ' (Min: ' + (fixedDepositProductData.minDepositAmount ? fixedDepositProductData.minDepositAmount : fixedDepositProductData.depositAmount) + ', Max: ' + (fixedDepositProductData.maxDepositAmount ? fixedDepositProductData.maxDepositAmount : fixedDepositProductData.depositAmount) + ')' }} +
+ +
+ Interest Compounding Period: + {{ fixedDepositProductData.interestCompoundingPeriodType.value }} +
+ +
+ Interest Posting Period: + {{ fixedDepositProductData.interestPostingPeriodType.value }} +
+ +
+ Interest Calculated Using: + {{ fixedDepositProductData.interestCalculationType.value }} +
+ +
+ Days in Years: + {{ fixedDepositProductData.interestCalculationDaysInYearType.value }} +
+ +

Settings

+ + + +
+ Lock-in Period: + + {{ fixedDepositProductData.lockinPeriodFrequency }} {{ fixedDepositProductData.lockinPeriodFrequencyType.value }} +
+ + + +
+ Maximum Deposit Term: + {{ fixedDepositProductData.maxDepositTerm }} + {{ fixedDepositProductData.maxDepositTermType.value }} +
+ +
+ Deposit Term In multiple of: + {{ fixedDepositProductData.inMultiplesOfDepositTerm }} + - + {{ fixedDepositProductData.inMultiplesOfDepositTermType.value }} +
+ +
+ Apply Penal Interest (less): + {{ fixedDepositProductData.preClosurePenalApplicable ? 'Yes' : 'No' }} +
+ +
+ Penal Interest (%): + {{fixedDepositProductData.preClosurePenalInterest}}     %     On +    + {{fixedDepositProductData.preClosurePenalInterestOnType.value}} +
+ +
+ Balance Required For Interest Calculation: + {{ fixedDepositProductData.minBalanceForInterestCalculation | number }} +
+ +
+ Is withhold tax Applicable: + {{ fixedDepositProductData.withHoldTax ? 'Yes' : 'No' }} +
+ +
+ Withhold Tax group: + {{ fixedDepositProductData.taxGroup.name }} +
+ +
+ +

Interest Rate Chart

+ + + +
+ +
+ Name: + {{ fixedDepositProductData.activeChart.name }} +
+ +
+ Valid from Date: + {{ fixedDepositProductData.activeChart.fromDate | date }} +
+ +
+ End Date: + {{ fixedDepositProductData.activeChart.endDate | date }} +
+ +
+ Description: + {{ fixedDepositProductData.activeChart.description }} +
+ +
+ Primary Grouping by Amount: + {{ fixedDepositProductData.activeChart.isPrimaryGroupingByAmount ? 'Yes' : 'No' }} +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Period +
+ {{ chartSlab.fromPeriod }} - {{ chartSlab.toPeriod }} {{ chartSlab.periodType.value }} +
+
+   +
+
Amount Range +
+ {{ chartSlab.amountRangeFrom }} - {{ chartSlab.amountRangeTo }} +
+ +
+   +
+
Interest + {{ chartSlab.annualInterestRate }} + Description + {{ chartSlab.description }} + Actions + + +
+ + +

+ Incentives +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Entity Type + {{ incentive.entityType | find:fixedDepositProductsTemplate.chartTemplate.entityTypeOptions:'id':'value' }} + Attribute Name + {{ incentive.attributeName | find:fixedDepositProductsTemplate.chartTemplate.attributeNameOptions:'id':'value' }} + Condition Type + {{ incentive.conditionType | find:fixedDepositProductsTemplate.chartTemplate.conditionTypeOptions:'id':'value' }} + Attribute Value + {{ incentive.attributeValue | find:fixedDepositProductsTemplate.chartTemplate.genderOptions:'id':'name' }} + {{ incentive.attributeValue }} + {{ incentive.attributeValue | find:fixedDepositProductsTemplate.chartTemplate.clientTypeOptions:'id':'name' }} + {{ incentive.attributeValue | find:fixedDepositProductsTemplate.chartTemplate.clientClassificationOptions:'id':'name' }} + Incentive Type + {{ incentive.incentiveType | find:fixedDepositProductsTemplate.chartTemplate.incentiveTypeOptions:'id':'value'}} + Amount + {{ incentive.amount }} +
+ +
+
+
+ + + +
+ +
+ +
+ +

Charges

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Name + {{ charge.name }} + Type + {{ charge.chargeCalculationType.value }} + Amount + {{ charge.amount | number }} + Collected On + {{ charge.chargeTimeType.value }} +
+ +
+ +

Accounting

+ + + +
+ Type: + {{ fixedDepositProductData.accountingRule.value }} +
+ +
+ +

Assets

+ +
+ Saving reference: + {{ fixedDepositProductData.accountingMappings.savingsReferenceAccount.name }} +
+ +

Liabilities

+ +
+ Saving control: + {{ fixedDepositProductData.accountingMappings.savingsControlAccount.name }} + Savings transfers in suspense: + {{ fixedDepositProductData.accountingMappings.transfersInSuspenseAccount.name }} +
+ +

Expenses

+ +
+ Interest on savings: + {{ fixedDepositProductData.accountingMappings.interestOnSavingsAccount.name }} +
+ +

Income

+ +
+ Income from fees: + {{ fixedDepositProductData.accountingMappings.incomeFromFeeAccount.name }} + Income from penalties: + {{ fixedDepositProductData.accountingMappings.incomeFromPenaltyAccount.name }} +
+ +
+ +

Advanced Accounting Rules

+ + + +
+ +
+

Configure Fund Sources for Payment Channels

+ + + + + + + + + + + + + + + + +
Payment Type + {{ paymentFundSource.paymentType.name }} + Fund Source + {{ paymentFundSource.fundSourceAccount.name }} +
+ +
+ +
+ +

Fees to Specific Income Accounts

+ + + + + + + + + + + + + + + + +
Fees + {{ feesIncome.charge.name }} + Income Account + {{ feesIncome.incomeAccount.name }} +
+ +
+ +
+ +

Penalties to Specific Income Accounts

+ + + + + + + + + + + + + + + + +
Penalty + {{ penaltyIncome.charge.name }} + Income Account + {{ penaltyIncome.incomeAccount.name }} +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
diff --git a/src/app/products/fixed-deposit-products/view-fixed-deposit-product/view-fixed-deposit-product.component.scss b/src/app/products/fixed-deposit-products/view-fixed-deposit-product/view-fixed-deposit-product.component.scss new file mode 100644 index 000000000..385fa6847 --- /dev/null +++ b/src/app/products/fixed-deposit-products/view-fixed-deposit-product/view-fixed-deposit-product.component.scss @@ -0,0 +1,49 @@ +table { + width: 100%; +} + +.mat-elevation-z1 { + margin: 1em 0 1.5em 0; +} + +h2, h3, h4 { + margin: 0; + font-weight: 500; +} + +span { + margin: 0.5em 0; +} + +.mat-card .mat-divider-horizontal.mat-divider-inset { + margin: 0 0 0.5em 0; +} + +.margin-t { + margin-top: 1em; +} + +table { + width: 100%; + + tr.incentives-row { + height: 0; + + > td { + padding: 0; + } + + .incentives { + overflow: hidden; + } + + .mat-card { + border-radius: 0; + + > h4 { + font-weight: 500; + margin: 0.5em 0 0; + } + } + } +} diff --git a/src/app/products/fixed-deposit-products/view-fixed-deposit-product/view-fixed-deposit-product.component.spec.ts b/src/app/products/fixed-deposit-products/view-fixed-deposit-product/view-fixed-deposit-product.component.spec.ts new file mode 100644 index 000000000..98d17b6c5 --- /dev/null +++ b/src/app/products/fixed-deposit-products/view-fixed-deposit-product/view-fixed-deposit-product.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { ViewFixedDepositProductComponent } from './view-fixed-deposit-product.component'; + +describe('ViewFixedDepositProductComponent', () => { + let component: ViewFixedDepositProductComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ ViewFixedDepositProductComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(ViewFixedDepositProductComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/products/fixed-deposit-products/view-fixed-deposit-product/view-fixed-deposit-product.component.ts b/src/app/products/fixed-deposit-products/view-fixed-deposit-product/view-fixed-deposit-product.component.ts new file mode 100644 index 000000000..d9aea21c7 --- /dev/null +++ b/src/app/products/fixed-deposit-products/view-fixed-deposit-product/view-fixed-deposit-product.component.ts @@ -0,0 +1,51 @@ +/** Angular Imports */ +import { Component, OnInit } from '@angular/core'; +import { ActivatedRoute } from '@angular/router'; +import { MatTable } from '@angular/material/table'; +import { MatDialog } from '@angular/material'; +import { trigger, state, transition, animate, style } from '@angular/animations'; + +/** + * Fixed Deposit Product component. + */ +@Component({ + selector: 'mifosx-view-fixed-deposit-product', + templateUrl: './view-fixed-deposit-product.component.html', + styleUrls: ['./view-fixed-deposit-product.component.scss'], + animations: [ + trigger('expandChartSlab', [ + state('collapsed', style({height: '0px', minHeight: '0'})), + state('expanded', style({height: '*'})), + transition('expanded <=> collapsed', animate('225ms cubic-bezier(0.4, 0.0, 0.2, 1)')) + ]) + ] +}) + +export class ViewFixedDepositProductComponent implements OnInit { + + /** Fixed Deposit Product data. */ + fixedDepositProductData: any; + fixedDepositProductsTemplate: any; + + chartSlabsIncentivesDisplayedColumns: string[] = ['incentives']; + chartSlabsDisplayedColumns: string[] = ['period', 'amountRange', 'annualInterestRate', 'description', 'actions']; + incentivesDisplayedColumns: string[] = ['entityType', 'attributeName', 'conditionType', 'attributeValue', 'incentiveType', 'amount']; + chargesDisplayedColumns: string[] = ['name', 'type', 'amount', 'collectedon']; + paymentFundSourceDisplayedColumns: string[] = ['paymentTypeId', 'fundSourceAccountId']; + feesPenaltyIncomeDisplayedColumns: string[] = ['chargeId', 'incomeAccountId']; + + /** + * Retrieves the fixed deposit product data from `resolve`. + * @param {ActivatedRoute} route Activated Route. + */ + constructor(private route: ActivatedRoute) { + this.route.data.subscribe((data: { fixedDepositProduct: any, fixedDepositProductsTemplate: any }) => { + this.fixedDepositProductData = data.fixedDepositProduct; + this.fixedDepositProductsTemplate = data.fixedDepositProductsTemplate; + }); + } + + ngOnInit() { + } + +} diff --git a/src/app/products/products-routing.module.ts b/src/app/products/products-routing.module.ts index ccb0e21e8..13c85cede 100644 --- a/src/app/products/products-routing.module.ts +++ b/src/app/products/products-routing.module.ts @@ -44,6 +44,7 @@ import { ViewTaxGroupComponent } from './manage-tax-groups/view-tax-group/view-t import { ShareProductsDividendsComponent } from './share-products/dividends-share-product/dividends.components'; import { CreateRecurringDepositProductComponent } from './recurring-deposit-products/create-recurring-deposit-product/create-recurring-deposit-product.component'; import { CreateDividendComponent } from './share-products/create-dividend/create-dividend.component'; +import { ViewFixedDepositProductComponent } from './fixed-deposit-products/view-fixed-deposit-product/view-fixed-deposit-product.component'; /** Custom Resolvers */ import { LoanProductsResolver } from './loan-products/loan-products.resolver'; @@ -81,6 +82,7 @@ import { EditRecurringDepositProductComponent } from './recurring-deposit-produc import { RecurringDepositProductAndTemplateResolver } from './recurring-deposit-products/edit-recurring-deposit-product/recurring-deposit-product-and-template.resolver'; import { ViewDividendComponent } from './share-products/view-dividend/view-dividend.component'; import { ViewDividendDataResolver } from './share-products/view-dividend/view-dividend-data.resolver'; +import { FixedDepositProductResolver } from './fixed-deposit-products/fixed-deposit-product.resolver'; /** Products Routes */ const routes: Routes = [ @@ -387,6 +389,20 @@ const routes: Routes = [ resolve: { fixedDepositProductsTemplate: FixedDepositProductsTemplateResolver } + }, + { + path: ':id', + data: { title: extract('View Fixed Deposit Product'), routeParamBreadcrumb: 'id' }, + children: [ + { + path: '', + component: ViewFixedDepositProductComponent, + resolve: { + fixedDepositProduct: FixedDepositProductResolver, + fixedDepositProductsTemplate: FixedDepositProductsTemplateResolver + } + } + ] } ] }, @@ -531,7 +547,8 @@ const routes: Routes = [ DividendsResolver, RecurringDepositProductsTemplateResolver, RecurringDepositProductAndTemplateResolver, - ViewDividendDataResolver + ViewDividendDataResolver, + FixedDepositProductResolver ] }) export class ProductsRoutingModule { } diff --git a/src/app/products/products.module.ts b/src/app/products/products.module.ts index a0626fcae..2e0d33b0b 100644 --- a/src/app/products/products.module.ts +++ b/src/app/products/products.module.ts @@ -89,6 +89,7 @@ import { RecurringDepositProductTermsStepComponent } from './recurring-deposit-p import { EditRecurringDepositProductComponent } from './recurring-deposit-products/edit-recurring-deposit-product/edit-recurring-deposit-product.component'; import { CreateDividendComponent } from './share-products/create-dividend/create-dividend.component'; import { ViewDividendComponent } from './share-products/view-dividend/view-dividend.component'; +import { ViewFixedDepositProductComponent } from './fixed-deposit-products/view-fixed-deposit-product/view-fixed-deposit-product.component'; /** * Products Module @@ -181,7 +182,8 @@ import { ViewDividendComponent } from './share-products/view-dividend/view-divid RecurringDepositProductTermsStepComponent, EditRecurringDepositProductComponent, CreateDividendComponent, - ViewDividendComponent + ViewDividendComponent, + ViewFixedDepositProductComponent ], entryComponents: [ DepositProductIncentiveFormDialogComponent, diff --git a/src/app/products/products.service.ts b/src/app/products/products.service.ts index 545d5e015..e92763873 100644 --- a/src/app/products/products.service.ts +++ b/src/app/products/products.service.ts @@ -190,6 +190,14 @@ export class ProductsService { return this.http.get('/fixeddepositproducts/template'); } + /** + * @param {string} fixedDepositProductId fixed deposit product ID of fixed deposit product. + * @returns {Observable} Fixed deposit product. + */ + getFixedDepositProduct(fixedDepositProductId: string): Observable { + return this.http.get(`/fixeddepositproducts/${fixedDepositProductId}`); + } + /** * @returns {Observable} Tax Components data */