From 892d64f7c25ebbecef23193b4a91fe4ceee9f07f Mon Sep 17 00:00:00 2001 From: Thomas <4159106+dtslvr@users.noreply.github.com> Date: Sat, 12 Mar 2022 09:54:48 +0100 Subject: [PATCH] Fix emergency fund for user with impersonation id --- .../app/portfolio/portfolio.service-new.ts | 48 +++++++++-------- .../src/app/portfolio/portfolio.service.ts | 51 ++++++++++--------- apps/api/src/app/user/user.service.ts | 2 +- 3 files changed, 56 insertions(+), 45 deletions(-) diff --git a/apps/api/src/app/portfolio/portfolio.service-new.ts b/apps/api/src/app/portfolio/portfolio.service-new.ts index 85d94d314..6ab74730a 100644 --- a/apps/api/src/app/portfolio/portfolio.service-new.ts +++ b/apps/api/src/app/portfolio/portfolio.service-new.ts @@ -6,6 +6,7 @@ import { PortfolioOrder } from '@ghostfolio/api/app/portfolio/interfaces/portfol import { TimelineSpecification } from '@ghostfolio/api/app/portfolio/interfaces/timeline-specification.interface'; import { TransactionPoint } from '@ghostfolio/api/app/portfolio/interfaces/transaction-point.interface'; import { UserSettings } from '@ghostfolio/api/app/user/interfaces/user-settings.interface'; +import { UserService } from '@ghostfolio/api/app/user/user.service'; import { AccountClusterRiskCurrentInvestment } from '@ghostfolio/api/models/rules/account-cluster-risk/current-investment'; import { AccountClusterRiskInitialInvestment } from '@ghostfolio/api/models/rules/account-cluster-risk/initial-investment'; import { AccountClusterRiskSingleAccount } from '@ghostfolio/api/models/rules/account-cluster-risk/single-account'; @@ -81,7 +82,8 @@ export class PortfolioServiceNew { private readonly orderService: OrderService, @Inject(REQUEST) private readonly request: RequestWithUser, private readonly rulesService: RulesService, - private readonly symbolProfileService: SymbolProfileService + private readonly symbolProfileService: SymbolProfileService, + private readonly userService: UserService ) {} public async getAccounts(aUserId: string): Promise { @@ -301,9 +303,10 @@ export class PortfolioServiceNew { ): Promise { const userId = await this.getUserId(aImpersonationId, aUserId); + const user = await this.userService.user({ id: userId }); + const emergencyFund = new Big( - (this.request.user?.Settings?.settings as UserSettings)?.emergencyFund ?? - 0 + (user.Settings?.settings as UserSettings)?.emergencyFund ?? 0 ); const userCurrency = this.request.user?.Settings?.currency ?? baseCurrency; @@ -1012,24 +1015,27 @@ export class PortfolioServiceNew { } } - cashPositions[ASSET_SUB_CLASS_EMERGENCY_FUND] = { - ...cashPositions[userCurrency], - assetSubClass: ASSET_SUB_CLASS_EMERGENCY_FUND, - investment: emergencyFund.toNumber(), - name: ASSET_SUB_CLASS_EMERGENCY_FUND, - symbol: ASSET_SUB_CLASS_EMERGENCY_FUND, - value: emergencyFund.toNumber() - }; - cashPositions[userCurrency].investment = new Big( - cashPositions[userCurrency].investment - ) - .minus(emergencyFund) - .toNumber(); - cashPositions[userCurrency].value = new Big( - cashPositions[userCurrency].value - ) - .minus(emergencyFund) - .toNumber(); + if (emergencyFund.gt(0)) { + cashPositions[ASSET_SUB_CLASS_EMERGENCY_FUND] = { + ...cashPositions[userCurrency], + assetSubClass: ASSET_SUB_CLASS_EMERGENCY_FUND, + investment: emergencyFund.toNumber(), + name: ASSET_SUB_CLASS_EMERGENCY_FUND, + symbol: ASSET_SUB_CLASS_EMERGENCY_FUND, + value: emergencyFund.toNumber() + }; + + cashPositions[userCurrency].investment = new Big( + cashPositions[userCurrency].investment + ) + .minus(emergencyFund) + .toNumber(); + cashPositions[userCurrency].value = new Big( + cashPositions[userCurrency].value + ) + .minus(emergencyFund) + .toNumber(); + } for (const symbol of Object.keys(cashPositions)) { // Calculate allocations for each currency diff --git a/apps/api/src/app/portfolio/portfolio.service.ts b/apps/api/src/app/portfolio/portfolio.service.ts index 4ba2b5be1..68a46c48a 100644 --- a/apps/api/src/app/portfolio/portfolio.service.ts +++ b/apps/api/src/app/portfolio/portfolio.service.ts @@ -7,6 +7,7 @@ import { TimelineSpecification } from '@ghostfolio/api/app/portfolio/interfaces/ import { TransactionPoint } from '@ghostfolio/api/app/portfolio/interfaces/transaction-point.interface'; import { PortfolioCalculator } from '@ghostfolio/api/app/portfolio/portfolio-calculator'; import { UserSettings } from '@ghostfolio/api/app/user/interfaces/user-settings.interface'; +import { UserService } from '@ghostfolio/api/app/user/user.service'; import { AccountClusterRiskCurrentInvestment } from '@ghostfolio/api/models/rules/account-cluster-risk/current-investment'; import { AccountClusterRiskInitialInvestment } from '@ghostfolio/api/models/rules/account-cluster-risk/initial-investment'; import { AccountClusterRiskSingleAccount } from '@ghostfolio/api/models/rules/account-cluster-risk/single-account'; @@ -22,9 +23,9 @@ import { MarketState } from '@ghostfolio/api/services/interfaces/interfaces'; import { EnhancedSymbolProfile } from '@ghostfolio/api/services/interfaces/symbol-profile.interface'; import { SymbolProfileService } from '@ghostfolio/api/services/symbol-profile.service'; import { + ASSET_SUB_CLASS_EMERGENCY_FUND, UNKNOWN_KEY, - baseCurrency, - ASSET_SUB_CLASS_EMERGENCY_FUND + baseCurrency } from '@ghostfolio/common/config'; import { DATE_FORMAT, parseDate } from '@ghostfolio/common/helper'; import { @@ -80,7 +81,8 @@ export class PortfolioService { private readonly orderService: OrderService, @Inject(REQUEST) private readonly request: RequestWithUser, private readonly rulesService: RulesService, - private readonly symbolProfileService: SymbolProfileService + private readonly symbolProfileService: SymbolProfileService, + private readonly userService: UserService ) {} public async getAccounts(aUserId: string): Promise { @@ -292,9 +294,10 @@ export class PortfolioService { ): Promise { const userId = await this.getUserId(aImpersonationId, aUserId); + const user = await this.userService.user({ id: userId }); + const emergencyFund = new Big( - (this.request.user?.Settings?.settings as UserSettings)?.emergencyFund ?? - 0 + (user.Settings?.settings as UserSettings)?.emergencyFund ?? 0 ); const userCurrency = this.request.user?.Settings?.currency ?? baseCurrency; const portfolioCalculator = new PortfolioCalculator( @@ -976,25 +979,27 @@ export class PortfolioService { } } - cashPositions[ASSET_SUB_CLASS_EMERGENCY_FUND] = { - ...cashPositions[userCurrency], - assetSubClass: ASSET_SUB_CLASS_EMERGENCY_FUND, - investment: emergencyFund.toNumber(), - name: ASSET_SUB_CLASS_EMERGENCY_FUND, - symbol: ASSET_SUB_CLASS_EMERGENCY_FUND, - value: emergencyFund.toNumber() - }; + if (emergencyFund.gt(0)) { + cashPositions[ASSET_SUB_CLASS_EMERGENCY_FUND] = { + ...cashPositions[userCurrency], + assetSubClass: ASSET_SUB_CLASS_EMERGENCY_FUND, + investment: emergencyFund.toNumber(), + name: ASSET_SUB_CLASS_EMERGENCY_FUND, + symbol: ASSET_SUB_CLASS_EMERGENCY_FUND, + value: emergencyFund.toNumber() + }; - cashPositions[userCurrency].investment = new Big( - cashPositions[userCurrency].investment - ) - .minus(emergencyFund) - .toNumber(); - cashPositions[userCurrency].value = new Big( - cashPositions[userCurrency].value - ) - .minus(emergencyFund) - .toNumber(); + cashPositions[userCurrency].investment = new Big( + cashPositions[userCurrency].investment + ) + .minus(emergencyFund) + .toNumber(); + cashPositions[userCurrency].value = new Big( + cashPositions[userCurrency].value + ) + .minus(emergencyFund) + .toNumber(); + } for (const symbol of Object.keys(cashPositions)) { // Calculate allocations for each currency diff --git a/apps/api/src/app/user/user.service.ts b/apps/api/src/app/user/user.service.ts index 5a21e9303..43b3b52c7 100644 --- a/apps/api/src/app/user/user.service.ts +++ b/apps/api/src/app/user/user.service.ts @@ -15,7 +15,7 @@ import { } from '@ghostfolio/common/permissions'; import { SubscriptionType } from '@ghostfolio/common/types/subscription.type'; import { Injectable } from '@nestjs/common'; -import { Prisma, Provider, Role, User, ViewMode } from '@prisma/client'; +import { Prisma, Role, User, ViewMode } from '@prisma/client'; import { UserSettingsParams } from './interfaces/user-settings-params.interface'; import { UserSettings } from './interfaces/user-settings.interface';