diff --git a/apps/api/src/app/portfolio/portfolio.service.ts b/apps/api/src/app/portfolio/portfolio.service.ts index 2ccc34544..19d553b0c 100644 --- a/apps/api/src/app/portfolio/portfolio.service.ts +++ b/apps/api/src/app/portfolio/portfolio.service.ts @@ -209,7 +209,6 @@ export class PortfolioService { for (const position of currentPositions.positions) { portfolioItemsNow[position.symbol] = position; } - const accounts = this.getAccounts(orders, portfolioItemsNow, userCurrency); for (const item of currentPositions.positions) { const value = item.quantity.mul(item.marketPrice); @@ -244,6 +243,13 @@ export class PortfolioService { value: totalValue }); + const accounts = await this.getAccounts( + orders, + portfolioItemsNow, + userCurrency, + userId + ); + return { accounts, holdings, hasErrors: currentPositions.hasErrors }; } @@ -601,7 +607,12 @@ export class PortfolioService { for (const position of currentPositions.positions) { portfolioItemsNow[position.symbol] = position; } - const accounts = this.getAccounts(orders, portfolioItemsNow, baseCurrency); + const accounts = await this.getAccounts( + orders, + portfolioItemsNow, + baseCurrency, + userId + ); return { rules: { accountClusterRisk: await this.rulesService.evaluate( @@ -785,41 +796,67 @@ export class PortfolioService { }; } - private getAccounts( + private async getAccounts( orders: OrderWithAccount[], portfolioItemsNow: { [p: string]: TimelinePosition }, - userCurrency + userCurrency: Currency, + userId: string ) { const accounts: PortfolioDetails['accounts'] = {}; - for (const order of orders) { - let currentValueOfSymbol = this.exchangeRateDataService.toCurrency( - order.quantity * portfolioItemsNow[order.symbol].marketPrice, - order.currency, - userCurrency - ); - let originalValueOfSymbol = this.exchangeRateDataService.toCurrency( - order.quantity * order.unitPrice, - order.currency, - userCurrency - ); - if (order.type === 'SELL') { - currentValueOfSymbol *= -1; - originalValueOfSymbol *= -1; - } + const currentAccounts = await this.accountService.getAccounts(userId); + + for (const account of currentAccounts) { + const ordersByAccount = orders.filter(({ accountId }) => { + return accountId === account.id; + }); - if (accounts[order.Account?.name || UNKNOWN_KEY]?.current) { - accounts[order.Account?.name || UNKNOWN_KEY].current += - currentValueOfSymbol; - accounts[order.Account?.name || UNKNOWN_KEY].original += - originalValueOfSymbol; - } else { - accounts[order.Account?.name || UNKNOWN_KEY] = { - current: currentValueOfSymbol, - original: originalValueOfSymbol + if (ordersByAccount.length <= 0) { + // Add account without orders + const balance = this.exchangeRateDataService.toCurrency( + account.balance, + account.currency, + userCurrency + ); + accounts[account.name] = { + current: balance, + original: balance }; + + continue; + } + + for (const order of ordersByAccount) { + let currentValueOfSymbol = this.exchangeRateDataService.toCurrency( + order.quantity * portfolioItemsNow[order.symbol].marketPrice, + order.currency, + userCurrency + ); + let originalValueOfSymbol = this.exchangeRateDataService.toCurrency( + order.quantity * order.unitPrice, + order.currency, + userCurrency + ); + + if (order.type === 'SELL') { + currentValueOfSymbol *= -1; + originalValueOfSymbol *= -1; + } + + if (accounts[order.Account?.name || UNKNOWN_KEY]?.current) { + accounts[order.Account?.name || UNKNOWN_KEY].current += + currentValueOfSymbol; + accounts[order.Account?.name || UNKNOWN_KEY].original += + originalValueOfSymbol; + } else { + accounts[order.Account?.name || UNKNOWN_KEY] = { + current: currentValueOfSymbol, + original: originalValueOfSymbol + }; + } } } + return accounts; }