diff --git a/apps/api/src/app/portfolio/portfolio.service.ts b/apps/api/src/app/portfolio/portfolio.service.ts index b0739f5f9..198e3471b 100644 --- a/apps/api/src/app/portfolio/portfolio.service.ts +++ b/apps/api/src/app/portfolio/portfolio.service.ts @@ -72,6 +72,7 @@ import { Order, Platform, Prisma, + SymbolProfile, Tag } from '@prisma/client'; import { Big } from 'big.js'; @@ -160,7 +161,11 @@ export class PortfolioService { this.accountService.accounts({ where, include: { - activities: true, + activities: { + include: { + SymbolProfile: true + } + }, platform: true }, orderBy: { name: 'asc' } @@ -175,38 +180,71 @@ export class PortfolioService { const userCurrency = this.request.user.Settings.settings.baseCurrency; - return accounts.map((account) => { + const accountsWithValue = accounts.map((account) => { let transactionCount = 0; + let valueInBaseCurrency = + details.accounts[account.id]?.valueInBaseCurrency ?? 0; - for (const { isDraft } of account.activities) { - if (!isDraft) { - transactionCount += 1; + if (filterByDataSource && filterBySymbol) { + const holding = details.holdings[filterBySymbol]; + + const activities = ( + account.activities as (Order & { + SymbolProfile: SymbolProfile; + })[] + ).filter((activity) => { + return ( + activity.SymbolProfile.dataSource === filterByDataSource && + activity.SymbolProfile.symbol === filterBySymbol + ); + }); + + let quantity = new Big(0); + for (const activity of activities) { + quantity = quantity.plus( + new Big(getFactor(activity.type)).mul(activity.quantity) + ); } - } - const valueInBaseCurrency = - details.accounts[account.id]?.valueInBaseCurrency ?? 0; + valueInBaseCurrency = quantity.mul(holding.marketPrice ?? 0).toNumber(); + transactionCount = activities.length; + } else { + for (const { isDraft } of account.activities) { + if (!isDraft) { + transactionCount += 1; + } + } + } const result = { ...account, - transactionCount, - valueInBaseCurrency, + allocationInPercentage: 0, balanceInBaseCurrency: this.exchangeRateDataService.toCurrency( account.balance, account.currency, userCurrency ), + transactionCount, value: this.exchangeRateDataService.toCurrency( valueInBaseCurrency, userCurrency, account.currency - ) + ), + valueInBaseCurrency }; delete result.activities; return result; }); + + if (filterByDataSource && filterBySymbol) { + return accountsWithValue.filter((account) => { + return account.transactionCount > 0; + }); + } + + return accountsWithValue; } public async getAccountsWithAggregations({ @@ -237,6 +275,14 @@ export class PortfolioService { transactionCount += account.transactionCount; } + for (const account of accounts) { + account.allocationInPercentage = totalValueInBaseCurrency.gt(0) + ? new Big(account.valueInBaseCurrency) + .div(totalValueInBaseCurrency) + .toNumber() + : 0; + } + return { accounts, transactionCount, diff --git a/apps/client/src/app/components/accounts-table/accounts-table.component.html b/apps/client/src/app/components/accounts-table/accounts-table.component.html index 7e2ac92db..1230a4b3e 100644 --- a/apps/client/src/app/components/accounts-table/accounts-table.component.html +++ b/apps/client/src/app/components/accounts-table/accounts-table.component.html @@ -231,6 +231,43 @@ + + + Allocation + + + + + + + + +