diff --git a/apps/api/src/app/portfolio/portfolio.service.ts b/apps/api/src/app/portfolio/portfolio.service.ts index b9ffd3df3..99c9360f0 100644 --- a/apps/api/src/app/portfolio/portfolio.service.ts +++ b/apps/api/src/app/portfolio/portfolio.service.ts @@ -1139,10 +1139,26 @@ export class PortfolioService { { filters, user } ); - const accountBalanceItems: HistoricalDataItem[] = - accountBalances.balances.map(({ date, valueInBaseCurrency }) => { - return { date: format(date, DATE_FORMAT), value: valueInBaseCurrency }; - }); + let accountBalanceItems: HistoricalDataItem[] = Object.values( + // Reduce the array to a map with unique dates as keys + accountBalances.balances.reduce( + ( + map: { [date: string]: HistoricalDataItem }, + { date, valueInBaseCurrency } + ) => { + const formattedDate = format(date, DATE_FORMAT); + + // Store the item in the map, overwriting if the date already exists + map[formattedDate] = { + date: formattedDate, + value: valueInBaseCurrency + }; + + return map; + }, + {} + ) + ); const { portfolioOrders, transactionPoints } = await this.getTransactionPoints({ @@ -1221,6 +1237,10 @@ export class PortfolioService { ).div(100); } + accountBalanceItems = accountBalanceItems.filter(({ date }) => { + return !isBefore(parseDate(date), startDate); + }); + const mergedHistoricalDataItems = this.mergeHistoricalDataItems( accountBalanceItems, items @@ -2016,17 +2036,28 @@ export class PortfolioService { } private mergeHistoricalDataItems( - array1: HistoricalDataItem[], - array2: HistoricalDataItem[] + accountBalanceItems: HistoricalDataItem[], + performanceChartItems: HistoricalDataItem[] ): HistoricalDataItem[] { const historicalDataItemsMap: { [date: string]: HistoricalDataItem } = {}; + let latestAccountBalance = 0; + + for (const item of accountBalanceItems.concat(performanceChartItems)) { + const isAccountBalanceItem = accountBalanceItems.includes(item); + + const totalAccountBalance = isAccountBalanceItem + ? item.value + : latestAccountBalance; - for (const item of array1.concat(array2)) { historicalDataItemsMap[item.date] = { ...item, - netWorth: (historicalDataItemsMap[item.date]?.value ?? 0) + item.value, - totalAccountBalance: 0 // TODO: if from array1, then take value, otherwise 0 + totalAccountBalance, + netWorth: (isAccountBalanceItem ? 0 : item.value) + totalAccountBalance }; + + if (isAccountBalanceItem) { + latestAccountBalance = item.value; + } } // Convert to an array and sort by date in ascending order