From 7c39ed2a6329fc42205949d7f472023585e06161 Mon Sep 17 00:00:00 2001 From: Suraj Date: Sun, 20 Sep 2026 15:24:21 +0530 Subject: [PATCH] fix: resolve portfolio calculator fallback bug by gap-filling missing end date market prices --- .../calculator/portfolio-calculator.ts | 28 +++++++++++++++++-- 1 file changed, 26 insertions(+), 2 deletions(-) diff --git a/apps/api/src/app/portfolio/calculator/portfolio-calculator.ts b/apps/api/src/app/portfolio/calculator/portfolio-calculator.ts index debfa7d23f..d98ce82ab3 100644 --- a/apps/api/src/app/portfolio/calculator/portfolio-calculator.ts +++ b/apps/api/src/app/portfolio/calculator/portfolio-calculator.ts @@ -325,6 +325,10 @@ export abstract class PortfolioCalculator { [date: string]: { [assetProfileIdentifier: string]: Big }; } = {}; + const latestMarketPriceMap: { + [assetProfileIdentifier: string]: { date: string; price: Big }; + } = {}; + for (const marketSymbol of marketSymbols) { const date = format(marketSymbol.date, DATE_FORMAT); @@ -333,13 +337,33 @@ export abstract class PortfolioCalculator { } if (marketSymbol.marketPrice) { - marketSymbolMap[date][getAssetProfileIdentifier(marketSymbol)] = - new Big(marketSymbol.marketPrice); + const identifier = getAssetProfileIdentifier(marketSymbol); + const price = new Big(marketSymbol.marketPrice); + + marketSymbolMap[date][identifier] = price; + + if ( + !latestMarketPriceMap[identifier] || + latestMarketPriceMap[identifier].date < date + ) { + latestMarketPriceMap[identifier] = { date, price }; + } } } const endDateString = format(this.endDate, DATE_FORMAT); + if (!marketSymbolMap[endDateString]) { + marketSymbolMap[endDateString] = {}; + } + + for (const identifier of Object.keys(latestMarketPriceMap)) { + if (!marketSymbolMap[endDateString][identifier]) { + marketSymbolMap[endDateString][identifier] = + latestMarketPriceMap[identifier].price; + } + } + const daysInMarket = differenceInDays(this.endDate, this.startDate); const chartDateMap = this.getChartDateMap({