diff --git a/apps/api/src/app/portfolio/portfolio-calculator.ts b/apps/api/src/app/portfolio/portfolio-calculator.ts index b165ed5c6..b26fbcacf 100644 --- a/apps/api/src/app/portfolio/portfolio-calculator.ts +++ b/apps/api/src/app/portfolio/portfolio-calculator.ts @@ -1609,42 +1609,89 @@ export class PortfolioCalculator { .div(previousOrder.unitPrice) .minus(1); } else if ( - order.type === 'STAKE' && - marketSymbolMap[order.date] && - ((marketSymbolMap[previousOrder.date][ - previousOrder.symbol - ]?.toNumber() && - previousOrder.type === 'STAKE') || - (previousOrder.type !== 'STAKE' && - previousOrder.unitPrice.toNumber())) + this.needsStakeHandling(order, marketSymbolMap, previousOrder) ) { - let previousUnitPrice = - previousOrder.type === 'STAKE' - ? marketSymbolMap[previousOrder.date][previousOrder.symbol] - : previousOrder.unitPrice; - netPerformanceValuesPercentage[order.date] = marketSymbolMap[ - order.date - ][order.symbol] - ? marketSymbolMap[order.date][order.symbol] - .div(previousUnitPrice) - .minus(1) - : new Big(0); + this.stakeHandling( + previousOrder, + marketSymbolMap, + netPerformanceValuesPercentage, + order + ); } else if (previousOrder.unitPrice.toNumber()) { netPerformanceValuesPercentage[order.date] = new Big(-1); } else if ( - previousOrder.type === 'STAKE' && - marketSymbolMap[previousOrder.date] && - marketSymbolMap[previousOrder.date][previousOrder.symbol]?.toNumber() + this.ispreviousOrderStakeAndHasInformation( + previousOrder, + marketSymbolMap + ) ) { - netPerformanceValuesPercentage[order.date] = order.unitPrice - .div(marketSymbolMap[previousOrder.date][previousOrder.symbol]) - .minus(1); + this.handleIfPreviousOrderIsStake( + netPerformanceValuesPercentage, + order, + marketSymbolMap, + previousOrder + ); } else { netPerformanceValuesPercentage[order.date] = new Big(0); } } } + private handleIfPreviousOrderIsStake( + netPerformanceValuesPercentage: { [date: string]: Big }, + order: PortfolioOrderItem, + marketSymbolMap: { [date: string]: { [symbol: string]: Big } }, + previousOrder: PortfolioOrderItem + ) { + netPerformanceValuesPercentage[order.date] = order.unitPrice + .div(marketSymbolMap[previousOrder.date][previousOrder.symbol]) + .minus(1); + } + + private stakeHandling( + previousOrder: PortfolioOrderItem, + marketSymbolMap: { [date: string]: { [symbol: string]: Big } }, + netPerformanceValuesPercentage: { [date: string]: Big }, + order: PortfolioOrderItem + ) { + let previousUnitPrice = + previousOrder.type === 'STAKE' + ? marketSymbolMap[previousOrder.date][previousOrder.symbol] + : previousOrder.unitPrice; + netPerformanceValuesPercentage[order.date] = marketSymbolMap[order.date][ + order.symbol + ] + ? marketSymbolMap[order.date][order.symbol] + .div(previousUnitPrice) + .minus(1) + : new Big(0); + } + + private ispreviousOrderStakeAndHasInformation( + previousOrder: PortfolioOrderItem, + marketSymbolMap: { [date: string]: { [symbol: string]: Big } } + ) { + return ( + previousOrder.type === 'STAKE' && + marketSymbolMap[previousOrder.date] && + marketSymbolMap[previousOrder.date][previousOrder.symbol]?.toNumber() + ); + } + + private needsStakeHandling( + order: PortfolioOrderItem, + marketSymbolMap: { [date: string]: { [symbol: string]: Big } }, + previousOrder: PortfolioOrderItem + ) { + return ( + order.type === 'STAKE' && + marketSymbolMap[order.date] && + ((marketSymbolMap[previousOrder.date][previousOrder.symbol]?.toNumber() && + previousOrder.type === 'STAKE') || + (previousOrder.type !== 'STAKE' && previousOrder.unitPrice.toNumber())) + ); + } + private handleLoggingOfInvestmentMetrics( totalInvestment: Big, order: PortfolioOrderItem,