|
@ -1139,10 +1139,26 @@ export class PortfolioService { |
|
|
{ filters, user } |
|
|
{ filters, user } |
|
|
); |
|
|
); |
|
|
|
|
|
|
|
|
const accountBalanceItems: HistoricalDataItem[] = |
|
|
let accountBalanceItems: HistoricalDataItem[] = Object.values( |
|
|
accountBalances.balances.map(({ date, valueInBaseCurrency }) => { |
|
|
// Reduce the array to a map with unique dates as keys
|
|
|
return { date: format(date, DATE_FORMAT), value: valueInBaseCurrency }; |
|
|
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 } = |
|
|
const { portfolioOrders, transactionPoints } = |
|
|
await this.getTransactionPoints({ |
|
|
await this.getTransactionPoints({ |
|
@ -1221,6 +1237,10 @@ export class PortfolioService { |
|
|
).div(100); |
|
|
).div(100); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
accountBalanceItems = accountBalanceItems.filter(({ date }) => { |
|
|
|
|
|
return !isBefore(parseDate(date), startDate); |
|
|
|
|
|
}); |
|
|
|
|
|
|
|
|
const mergedHistoricalDataItems = this.mergeHistoricalDataItems( |
|
|
const mergedHistoricalDataItems = this.mergeHistoricalDataItems( |
|
|
accountBalanceItems, |
|
|
accountBalanceItems, |
|
|
items |
|
|
items |
|
@ -2016,17 +2036,28 @@ export class PortfolioService { |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
private mergeHistoricalDataItems( |
|
|
private mergeHistoricalDataItems( |
|
|
array1: HistoricalDataItem[], |
|
|
accountBalanceItems: HistoricalDataItem[], |
|
|
array2: HistoricalDataItem[] |
|
|
performanceChartItems: HistoricalDataItem[] |
|
|
): HistoricalDataItem[] { |
|
|
): HistoricalDataItem[] { |
|
|
const historicalDataItemsMap: { [date: string]: 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] = { |
|
|
historicalDataItemsMap[item.date] = { |
|
|
...item, |
|
|
...item, |
|
|
netWorth: (historicalDataItemsMap[item.date]?.value ?? 0) + item.value, |
|
|
totalAccountBalance, |
|
|
totalAccountBalance: 0 // TODO: if from array1, then take value, otherwise 0
|
|
|
netWorth: (isAccountBalanceItem ? 0 : item.value) + totalAccountBalance |
|
|
}; |
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
if (isAccountBalanceItem) { |
|
|
|
|
|
latestAccountBalance = item.value; |
|
|
|
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
// Convert to an array and sort by date in ascending order
|
|
|
// Convert to an array and sort by date in ascending order
|
|
|