From e92c6ca29829709a17aea17be6d7a133632c24f3 Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Thu, 16 Jul 2026 10:50:40 +0200 Subject: [PATCH] Include cash in portfolio performance --- .../src/app/portfolio/calculator/portfolio-calculator.ts | 9 +++++++++ .../calculator/roai/portfolio-calculator-cash.spec.ts | 1 + .../portfolio/calculator/roai/portfolio-calculator.ts | 1 + apps/api/src/app/portfolio/portfolio.service.ts | 2 ++ libs/common/src/lib/models/portfolio-snapshot.ts | 4 ++++ 5 files changed, 17 insertions(+) diff --git a/apps/api/src/app/portfolio/calculator/portfolio-calculator.ts b/apps/api/src/app/portfolio/calculator/portfolio-calculator.ts index 2082c3c2b..1bc9c2e02 100644 --- a/apps/api/src/app/portfolio/calculator/portfolio-calculator.ts +++ b/apps/api/src/app/portfolio/calculator/portfolio-calculator.ts @@ -193,6 +193,7 @@ export abstract class PortfolioCalculator { hasErrors: false, historicalData: [], positions: [], + totalCashInBaseCurrency: new Big(0), totalFeesWithCurrencyEffect: new Big(0), totalInterestWithCurrencyEffect: new Big(0), totalInvestment: new Big(0), @@ -205,6 +206,7 @@ export abstract class PortfolioCalculator { const dataGatheringItems: DataGatheringItem[] = []; let firstIndex = transactionPoints.length; let firstTransactionPoint: TransactionPoint = null; + let totalCashInBaseCurrency = new Big(0); let totalInterestWithCurrencyEffect = new Big(0); let totalLiabilitiesWithCurrencyEffect = new Big(0); @@ -447,6 +449,12 @@ export abstract class PortfolioCalculator { ) }); + if (item.assetSubClass === 'CASH') { + totalCashInBaseCurrency = totalCashInBaseCurrency.plus( + marketPriceInBaseCurrency.mul(item.quantity) + ); + } + totalInterestWithCurrencyEffect = totalInterestWithCurrencyEffect.plus( totalInterestInBaseCurrency ); @@ -661,6 +669,7 @@ export abstract class PortfolioCalculator { ...overall, errors, historicalData, + totalCashInBaseCurrency, totalInterestWithCurrencyEffect, totalLiabilitiesWithCurrencyEffect, hasErrors: hasAnySymbolMetricsErrors || overall.hasErrors, diff --git a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-cash.spec.ts b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-cash.spec.ts index 559fb0ed1..d5d5ef439 100644 --- a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-cash.spec.ts +++ b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-cash.spec.ts @@ -286,6 +286,7 @@ describe('PortfolioCalculator', () => { expect(portfolioSnapshot).toMatchObject({ currentValueInBaseCurrency: new Big(1820), hasErrors: false, + totalCashInBaseCurrency: new Big(1820), totalFeesWithCurrencyEffect: new Big(0), totalInterestWithCurrencyEffect: new Big(0), totalInvestment: new Big(1820), diff --git a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator.ts b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator.ts index daacdc60d..4348ca3a4 100644 --- a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator.ts +++ b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator.ts @@ -113,6 +113,7 @@ export class RoaiPortfolioCalculator extends PortfolioCalculator { createdAt: new Date(), errors: [], historicalData: [], + totalCashInBaseCurrency: new Big(0), totalLiabilitiesWithCurrencyEffect: new Big(0) }; } diff --git a/apps/api/src/app/portfolio/portfolio.service.ts b/apps/api/src/app/portfolio/portfolio.service.ts index 108e30618..f2bcad8f5 100644 --- a/apps/api/src/app/portfolio/portfolio.service.ts +++ b/apps/api/src/app/portfolio/portfolio.service.ts @@ -1887,6 +1887,7 @@ export class PortfolioService { const { currentValueInBaseCurrency, + totalCashInBaseCurrency, totalInvestment, totalInvestmentWithCurrencyEffect } = await portfolioCalculator.getSnapshot(); @@ -2015,6 +2016,7 @@ export class PortfolioService { fireWealth: { today: { valueInBaseCurrency: new Big(currentValueInBaseCurrency) + .minus(totalCashInBaseCurrency ?? 0) .minus(emergencyFundHoldingsValueInBaseCurrency) .toNumber() } diff --git a/libs/common/src/lib/models/portfolio-snapshot.ts b/libs/common/src/lib/models/portfolio-snapshot.ts index 6b13ca048..17e4bf97d 100644 --- a/libs/common/src/lib/models/portfolio-snapshot.ts +++ b/libs/common/src/lib/models/portfolio-snapshot.ts @@ -26,6 +26,10 @@ export class PortfolioSnapshot { @Type(() => TimelinePosition) positions: TimelinePosition[]; + @Transform(transformToBig, { toClassOnly: true }) + @Type(() => Big) + totalCashInBaseCurrency: Big; + @Transform(transformToBig, { toClassOnly: true }) @Type(() => Big) totalFeesWithCurrencyEffect: Big;