From 50f2f50dc23c4c09a234cd51696affcc89236056 Mon Sep 17 00:00:00 2001 From: Dan Date: Wed, 17 Apr 2024 15:42:12 +0200 Subject: [PATCH] Readded Stake Handling --- apps/api/src/app/import/import.service.ts | 7 ++++++- .../app/portfolio/calculator/portfolio-calculator.ts | 7 ++++++- .../portfolio/calculator/twr/portfolio-calculator.ts | 12 +++++++++++- apps/api/src/helper/portfolio.helper.ts | 1 + 4 files changed, 24 insertions(+), 3 deletions(-) diff --git a/apps/api/src/app/import/import.service.ts b/apps/api/src/app/import/import.service.ts index 26df9d069..f6f80ec56 100644 --- a/apps/api/src/app/import/import.service.ts +++ b/apps/api/src/app/import/import.service.ts @@ -604,7 +604,12 @@ export class ImportService { )?.[symbol] }; - if (type === 'BUY' || type === 'DIVIDEND' || type === 'SELL') { + if ( + type === 'BUY' || + type === 'DIVIDEND' || + type === 'SELL' || + type === 'STAKE' + ) { if (!assetProfile?.name) { throw new Error( `activities.${index}.symbol ("${symbol}") is not valid for the specified data source ("${dataSource}")` diff --git a/apps/api/src/app/portfolio/calculator/portfolio-calculator.ts b/apps/api/src/app/portfolio/calculator/portfolio-calculator.ts index 1d2eadfbf..47db8cba9 100644 --- a/apps/api/src/app/portfolio/calculator/portfolio-calculator.ts +++ b/apps/api/src/app/portfolio/calculator/portfolio-calculator.ts @@ -450,7 +450,12 @@ export abstract class PortfolioCalculator { await this.currentRateService.getValues({ dataGatheringItems, dateQuery: { - in: dates + in: [ + ...dates, + ...this.transactionPoints.map(({ date }) => + resetHours(parseDate(date)) + ) + ] } }); diff --git a/apps/api/src/app/portfolio/calculator/twr/portfolio-calculator.ts b/apps/api/src/app/portfolio/calculator/twr/portfolio-calculator.ts index e71b8be28..c443babc3 100644 --- a/apps/api/src/app/portfolio/calculator/twr/portfolio-calculator.ts +++ b/apps/api/src/app/portfolio/calculator/twr/portfolio-calculator.ts @@ -189,6 +189,7 @@ export class TWRPortfolioCalculator extends PortfolioCalculator { } = {}; let totalDividend = new Big(0); + let totalStakeRewards = new Big(0); let totalDividendInBaseCurrency = new Big(0); let totalInterest = new Big(0); let totalInterestInBaseCurrency = new Big(0); @@ -421,6 +422,10 @@ export class TWRPortfolioCalculator extends PortfolioCalculator { ); } + if (order.type === 'STAKE') { + order.unitPrice = marketSymbolMap[order.date]?.[symbol]; + } + if (order.unitPrice) { order.unitPriceInBaseCurrency = order.unitPrice.mul( currentExchangeRate ?? 1 @@ -568,6 +573,8 @@ export class TWRPortfolioCalculator extends PortfolioCalculator { totalLiabilitiesInBaseCurrency = totalLiabilitiesInBaseCurrency.plus( liabilities.mul(exchangeRateAtOrderDate ?? 1) ); + } else if (order.type === 'STAKE') { + totalStakeRewards = totalStakeRewards.plus(order.quantity); } const valueOfInvestment = totalUnits.mul(order.unitPriceInBaseCurrency); @@ -647,7 +654,10 @@ export class TWRPortfolioCalculator extends PortfolioCalculator { grossPerformanceWithCurrencyEffect; } - if (i > indexOfStartOrder && ['BUY', 'SELL'].includes(order.type)) { + if ( + i > indexOfStartOrder && + ['BUY', 'SELL', 'STAKE'].includes(order.type) + ) { // Only consider periods with an investment for the calculation of // the time weighted investment if (valueOfInvestmentBeforeTransaction.gt(0)) { diff --git a/apps/api/src/helper/portfolio.helper.ts b/apps/api/src/helper/portfolio.helper.ts index 21b111395..bd9c34a3d 100644 --- a/apps/api/src/helper/portfolio.helper.ts +++ b/apps/api/src/helper/portfolio.helper.ts @@ -18,6 +18,7 @@ export function getFactor(activityType: ActivityType) { switch (activityType) { case 'BUY': + case 'STAKE': factor = 1; break; case 'SELL':