From 87955c4b4f10875bfb4bf066277303c686e6ee92 Mon Sep 17 00:00:00 2001 From: Thomas <4159106+dtslvr@users.noreply.github.com> Date: Sun, 16 Jul 2023 10:44:30 +0200 Subject: [PATCH] Break down emergency fund in cash and assets --- .../interfaces/portfolio-order.interface.ts | 3 +- .../transaction-point-symbol.interface.ts | 3 +- .../src/app/portfolio/portfolio-calculator.ts | 3 ++ .../src/app/portfolio/portfolio.service.ts | 35 +++++++++---------- .../portfolio-position.interface.ts | 3 +- .../interfaces/portfolio-summary.interface.ts | 2 ++ .../interfaces/timeline-position.interface.ts | 3 +- 7 files changed, 30 insertions(+), 22 deletions(-) diff --git a/apps/api/src/app/portfolio/interfaces/portfolio-order.interface.ts b/apps/api/src/app/portfolio/interfaces/portfolio-order.interface.ts index 2466e81af..cc3a97752 100644 --- a/apps/api/src/app/portfolio/interfaces/portfolio-order.interface.ts +++ b/apps/api/src/app/portfolio/interfaces/portfolio-order.interface.ts @@ -1,4 +1,4 @@ -import { DataSource, Type as TypeOfOrder } from '@prisma/client'; +import { DataSource, Tag, Type as TypeOfOrder } from '@prisma/client'; import Big from 'big.js'; export interface PortfolioOrder { @@ -9,6 +9,7 @@ export interface PortfolioOrder { name: string; quantity: Big; symbol: string; + tags?: Tag[]; type: TypeOfOrder; unitPrice: Big; } diff --git a/apps/api/src/app/portfolio/interfaces/transaction-point-symbol.interface.ts b/apps/api/src/app/portfolio/interfaces/transaction-point-symbol.interface.ts index cc199119e..5350adccc 100644 --- a/apps/api/src/app/portfolio/interfaces/transaction-point-symbol.interface.ts +++ b/apps/api/src/app/portfolio/interfaces/transaction-point-symbol.interface.ts @@ -1,4 +1,4 @@ -import { DataSource } from '@prisma/client'; +import { DataSource, Tag } from '@prisma/client'; import Big from 'big.js'; export interface TransactionPointSymbol { @@ -9,5 +9,6 @@ export interface TransactionPointSymbol { investment: Big; quantity: Big; symbol: string; + tags?: Tag[]; transactionCount: number; } diff --git a/apps/api/src/app/portfolio/portfolio-calculator.ts b/apps/api/src/app/portfolio/portfolio-calculator.ts index 9addb29dd..cf6d1b156 100644 --- a/apps/api/src/app/portfolio/portfolio-calculator.ts +++ b/apps/api/src/app/portfolio/portfolio-calculator.ts @@ -114,6 +114,7 @@ export class PortfolioCalculator { firstBuyDate: oldAccumulatedSymbol.firstBuyDate, quantity: newQuantity, symbol: order.symbol, + tags: order.tags, transactionCount: oldAccumulatedSymbol.transactionCount + 1 }; } else { @@ -125,6 +126,7 @@ export class PortfolioCalculator { investment: unitPrice.mul(order.quantity).mul(factor), quantity: order.quantity.mul(factor), symbol: order.symbol, + tags: order.tags, transactionCount: 1 }; } @@ -492,6 +494,7 @@ export class PortfolioCalculator { : null, quantity: item.quantity, symbol: item.symbol, + tags: item.tags, transactionCount: item.transactionCount }); diff --git a/apps/api/src/app/portfolio/portfolio.service.ts b/apps/api/src/app/portfolio/portfolio.service.ts index 7d13728d2..8d2d3d684 100644 --- a/apps/api/src/app/portfolio/portfolio.service.ts +++ b/apps/api/src/app/portfolio/portfolio.service.ts @@ -583,6 +583,7 @@ export class PortfolioService { quantity: item.quantity.toNumber(), sectors: symbolProfile.sectors, symbol: item.symbol, + tags: item.tags, transactionCount: item.transactionCount, url: symbolProfile.url, value: value.toNumber() @@ -628,7 +629,7 @@ export class PortfolioService { const emergencyFundInCash = emergencyFund .minus( this.getEmergencyFundPositionsValueInBaseCurrency({ - activities: orders + holdings }) ) .toNumber(); @@ -656,7 +657,7 @@ export class PortfolioService { balanceInBaseCurrency: cashDetails.balanceInBaseCurrency, emergencyFundPositionsValueInBaseCurrency: this.getEmergencyFundPositionsValueInBaseCurrency({ - activities: orders + holdings }) }); @@ -742,6 +743,7 @@ export class PortfolioService { name: order.SymbolProfile?.name, quantity: new Big(order.quantity), symbol: order.SymbolProfile.symbol, + tags: order.tags, type: order.type, unitPrice: new Big(order.unitPrice) })); @@ -1390,13 +1392,13 @@ export class PortfolioService { } private getEmergencyFundPositionsValueInBaseCurrency({ - activities + holdings }: { - activities: Activity[]; + holdings: PortfolioDetails['holdings']; }) { - const emergencyFundOrders = activities.filter((activity) => { + const emergencyFundHoldings = Object.values(holdings).filter(({ tags }) => { return ( - activity.tags?.some(({ id }) => { + tags?.some(({ id }) => { return id === EMERGENCY_FUND_TAG_ID; }) ?? false ); @@ -1404,18 +1406,9 @@ export class PortfolioService { let valueInBaseCurrencyOfEmergencyFundPositions = new Big(0); - for (const order of emergencyFundOrders) { - if (order.type === 'BUY') { - valueInBaseCurrencyOfEmergencyFundPositions = - valueInBaseCurrencyOfEmergencyFundPositions.plus( - order.valueInBaseCurrency - ); - } else if (order.type === 'SELL') { - valueInBaseCurrencyOfEmergencyFundPositions = - valueInBaseCurrencyOfEmergencyFundPositions.minus( - order.valueInBaseCurrency - ); - } + for (const { value } of emergencyFundHoldings) { + valueInBaseCurrencyOfEmergencyFundPositions = + valueInBaseCurrencyOfEmergencyFundPositions.plus(value); } return valueInBaseCurrencyOfEmergencyFundPositions.toNumber(); @@ -1474,6 +1467,7 @@ export class PortfolioService { quantity: 0, sectors: [], symbol: currency, + tags: [], transactionCount: 0, value: balance }; @@ -1686,6 +1680,10 @@ export class PortfolioService { totalSell, committedFunds: committedFunds.toNumber(), emergencyFund: emergencyFund.toNumber(), + emergencyFundinAssets: emergencyFundPositionsValueInBaseCurrency, + emergencyFundInCash: emergencyFund + .minus(emergencyFundPositionsValueInBaseCurrency) + .toNumber(), ordersCount: activities.filter(({ type }) => { return type === 'BUY' || type === 'SELL'; }).length @@ -1737,6 +1735,7 @@ export class PortfolioService { name: order.SymbolProfile?.name, quantity: new Big(order.quantity), symbol: order.SymbolProfile.symbol, + tags: order.tags, type: order.type, unitPrice: new Big( this.exchangeRateDataService.toCurrency( diff --git a/libs/common/src/lib/interfaces/portfolio-position.interface.ts b/libs/common/src/lib/interfaces/portfolio-position.interface.ts index 2b7c6c486..2c72d3083 100644 --- a/libs/common/src/lib/interfaces/portfolio-position.interface.ts +++ b/libs/common/src/lib/interfaces/portfolio-position.interface.ts @@ -1,4 +1,4 @@ -import { AssetClass, AssetSubClass, DataSource } from '@prisma/client'; +import { AssetClass, AssetSubClass, DataSource, Tag } from '@prisma/client'; import { Market, MarketState } from '../types'; import { Country } from './country.interface'; @@ -28,6 +28,7 @@ export interface PortfolioPosition { sectors: Sector[]; transactionCount: number; symbol: string; + tags?: Tag[]; type?: string; url?: string; value?: number; diff --git a/libs/common/src/lib/interfaces/portfolio-summary.interface.ts b/libs/common/src/lib/interfaces/portfolio-summary.interface.ts index c520da9fb..49e261502 100644 --- a/libs/common/src/lib/interfaces/portfolio-summary.interface.ts +++ b/libs/common/src/lib/interfaces/portfolio-summary.interface.ts @@ -6,6 +6,8 @@ export interface PortfolioSummary extends PortfolioPerformance { committedFunds: number; dividend: number; emergencyFund: number; + emergencyFundInCash: number; + emergencyFundinAssets: number; excludedAccountsAndActivities: number; fees: number; firstOrderDate: Date; diff --git a/libs/common/src/lib/interfaces/timeline-position.interface.ts b/libs/common/src/lib/interfaces/timeline-position.interface.ts index beb13a352..de4c3ff19 100644 --- a/libs/common/src/lib/interfaces/timeline-position.interface.ts +++ b/libs/common/src/lib/interfaces/timeline-position.interface.ts @@ -1,4 +1,4 @@ -import { DataSource } from '@prisma/client'; +import { DataSource, Tag } from '@prisma/client'; import Big from 'big.js'; export interface TimelinePosition { @@ -15,5 +15,6 @@ export interface TimelinePosition { netPerformancePercentage: Big; quantity: Big; symbol: string; + tags?: Tag[]; transactionCount: number; }