Browse Source

Fix emergency fund for user with impersonation id

pull/749/head
Thomas 3 years ago
parent
commit
892d64f7c2
  1. 48
      apps/api/src/app/portfolio/portfolio.service-new.ts
  2. 51
      apps/api/src/app/portfolio/portfolio.service.ts
  3. 2
      apps/api/src/app/user/user.service.ts

48
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 { TimelineSpecification } from '@ghostfolio/api/app/portfolio/interfaces/timeline-specification.interface';
import { TransactionPoint } from '@ghostfolio/api/app/portfolio/interfaces/transaction-point.interface'; import { TransactionPoint } from '@ghostfolio/api/app/portfolio/interfaces/transaction-point.interface';
import { UserSettings } from '@ghostfolio/api/app/user/interfaces/user-settings.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 { AccountClusterRiskCurrentInvestment } from '@ghostfolio/api/models/rules/account-cluster-risk/current-investment';
import { AccountClusterRiskInitialInvestment } from '@ghostfolio/api/models/rules/account-cluster-risk/initial-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'; import { AccountClusterRiskSingleAccount } from '@ghostfolio/api/models/rules/account-cluster-risk/single-account';
@ -81,7 +82,8 @@ export class PortfolioServiceNew {
private readonly orderService: OrderService, private readonly orderService: OrderService,
@Inject(REQUEST) private readonly request: RequestWithUser, @Inject(REQUEST) private readonly request: RequestWithUser,
private readonly rulesService: RulesService, private readonly rulesService: RulesService,
private readonly symbolProfileService: SymbolProfileService private readonly symbolProfileService: SymbolProfileService,
private readonly userService: UserService
) {} ) {}
public async getAccounts(aUserId: string): Promise<AccountWithValue[]> { public async getAccounts(aUserId: string): Promise<AccountWithValue[]> {
@ -301,9 +303,10 @@ export class PortfolioServiceNew {
): Promise<PortfolioDetails & { hasErrors: boolean }> { ): Promise<PortfolioDetails & { hasErrors: boolean }> {
const userId = await this.getUserId(aImpersonationId, aUserId); const userId = await this.getUserId(aImpersonationId, aUserId);
const user = await this.userService.user({ id: userId });
const emergencyFund = new Big( const emergencyFund = new Big(
(this.request.user?.Settings?.settings as UserSettings)?.emergencyFund ?? (user.Settings?.settings as UserSettings)?.emergencyFund ?? 0
0
); );
const userCurrency = this.request.user?.Settings?.currency ?? baseCurrency; const userCurrency = this.request.user?.Settings?.currency ?? baseCurrency;
@ -1012,24 +1015,27 @@ export class PortfolioServiceNew {
} }
} }
cashPositions[ASSET_SUB_CLASS_EMERGENCY_FUND] = { if (emergencyFund.gt(0)) {
...cashPositions[userCurrency], cashPositions[ASSET_SUB_CLASS_EMERGENCY_FUND] = {
assetSubClass: ASSET_SUB_CLASS_EMERGENCY_FUND, ...cashPositions[userCurrency],
investment: emergencyFund.toNumber(), assetSubClass: ASSET_SUB_CLASS_EMERGENCY_FUND,
name: ASSET_SUB_CLASS_EMERGENCY_FUND, investment: emergencyFund.toNumber(),
symbol: ASSET_SUB_CLASS_EMERGENCY_FUND, name: ASSET_SUB_CLASS_EMERGENCY_FUND,
value: emergencyFund.toNumber() symbol: ASSET_SUB_CLASS_EMERGENCY_FUND,
}; value: emergencyFund.toNumber()
cashPositions[userCurrency].investment = new Big( };
cashPositions[userCurrency].investment
) cashPositions[userCurrency].investment = new Big(
.minus(emergencyFund) cashPositions[userCurrency].investment
.toNumber(); )
cashPositions[userCurrency].value = new Big( .minus(emergencyFund)
cashPositions[userCurrency].value .toNumber();
) cashPositions[userCurrency].value = new Big(
.minus(emergencyFund) cashPositions[userCurrency].value
.toNumber(); )
.minus(emergencyFund)
.toNumber();
}
for (const symbol of Object.keys(cashPositions)) { for (const symbol of Object.keys(cashPositions)) {
// Calculate allocations for each currency // Calculate allocations for each currency

51
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 { TransactionPoint } from '@ghostfolio/api/app/portfolio/interfaces/transaction-point.interface';
import { PortfolioCalculator } from '@ghostfolio/api/app/portfolio/portfolio-calculator'; import { PortfolioCalculator } from '@ghostfolio/api/app/portfolio/portfolio-calculator';
import { UserSettings } from '@ghostfolio/api/app/user/interfaces/user-settings.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 { AccountClusterRiskCurrentInvestment } from '@ghostfolio/api/models/rules/account-cluster-risk/current-investment';
import { AccountClusterRiskInitialInvestment } from '@ghostfolio/api/models/rules/account-cluster-risk/initial-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'; 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 { EnhancedSymbolProfile } from '@ghostfolio/api/services/interfaces/symbol-profile.interface';
import { SymbolProfileService } from '@ghostfolio/api/services/symbol-profile.service'; import { SymbolProfileService } from '@ghostfolio/api/services/symbol-profile.service';
import { import {
ASSET_SUB_CLASS_EMERGENCY_FUND,
UNKNOWN_KEY, UNKNOWN_KEY,
baseCurrency, baseCurrency
ASSET_SUB_CLASS_EMERGENCY_FUND
} from '@ghostfolio/common/config'; } from '@ghostfolio/common/config';
import { DATE_FORMAT, parseDate } from '@ghostfolio/common/helper'; import { DATE_FORMAT, parseDate } from '@ghostfolio/common/helper';
import { import {
@ -80,7 +81,8 @@ export class PortfolioService {
private readonly orderService: OrderService, private readonly orderService: OrderService,
@Inject(REQUEST) private readonly request: RequestWithUser, @Inject(REQUEST) private readonly request: RequestWithUser,
private readonly rulesService: RulesService, private readonly rulesService: RulesService,
private readonly symbolProfileService: SymbolProfileService private readonly symbolProfileService: SymbolProfileService,
private readonly userService: UserService
) {} ) {}
public async getAccounts(aUserId: string): Promise<AccountWithValue[]> { public async getAccounts(aUserId: string): Promise<AccountWithValue[]> {
@ -292,9 +294,10 @@ export class PortfolioService {
): Promise<PortfolioDetails & { hasErrors: boolean }> { ): Promise<PortfolioDetails & { hasErrors: boolean }> {
const userId = await this.getUserId(aImpersonationId, aUserId); const userId = await this.getUserId(aImpersonationId, aUserId);
const user = await this.userService.user({ id: userId });
const emergencyFund = new Big( const emergencyFund = new Big(
(this.request.user?.Settings?.settings as UserSettings)?.emergencyFund ?? (user.Settings?.settings as UserSettings)?.emergencyFund ?? 0
0
); );
const userCurrency = this.request.user?.Settings?.currency ?? baseCurrency; const userCurrency = this.request.user?.Settings?.currency ?? baseCurrency;
const portfolioCalculator = new PortfolioCalculator( const portfolioCalculator = new PortfolioCalculator(
@ -976,25 +979,27 @@ export class PortfolioService {
} }
} }
cashPositions[ASSET_SUB_CLASS_EMERGENCY_FUND] = { if (emergencyFund.gt(0)) {
...cashPositions[userCurrency], cashPositions[ASSET_SUB_CLASS_EMERGENCY_FUND] = {
assetSubClass: ASSET_SUB_CLASS_EMERGENCY_FUND, ...cashPositions[userCurrency],
investment: emergencyFund.toNumber(), assetSubClass: ASSET_SUB_CLASS_EMERGENCY_FUND,
name: ASSET_SUB_CLASS_EMERGENCY_FUND, investment: emergencyFund.toNumber(),
symbol: ASSET_SUB_CLASS_EMERGENCY_FUND, name: ASSET_SUB_CLASS_EMERGENCY_FUND,
value: emergencyFund.toNumber() symbol: ASSET_SUB_CLASS_EMERGENCY_FUND,
}; value: emergencyFund.toNumber()
};
cashPositions[userCurrency].investment = new Big( cashPositions[userCurrency].investment = new Big(
cashPositions[userCurrency].investment cashPositions[userCurrency].investment
) )
.minus(emergencyFund) .minus(emergencyFund)
.toNumber(); .toNumber();
cashPositions[userCurrency].value = new Big( cashPositions[userCurrency].value = new Big(
cashPositions[userCurrency].value cashPositions[userCurrency].value
) )
.minus(emergencyFund) .minus(emergencyFund)
.toNumber(); .toNumber();
}
for (const symbol of Object.keys(cashPositions)) { for (const symbol of Object.keys(cashPositions)) {
// Calculate allocations for each currency // Calculate allocations for each currency

2
apps/api/src/app/user/user.service.ts

@ -15,7 +15,7 @@ import {
} from '@ghostfolio/common/permissions'; } from '@ghostfolio/common/permissions';
import { SubscriptionType } from '@ghostfolio/common/types/subscription.type'; import { SubscriptionType } from '@ghostfolio/common/types/subscription.type';
import { Injectable } from '@nestjs/common'; 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 { UserSettingsParams } from './interfaces/user-settings-params.interface';
import { UserSettings } from './interfaces/user-settings.interface'; import { UserSettings } from './interfaces/user-settings.interface';

Loading…
Cancel
Save