diff --git a/apps/api/src/app/portfolio/portfolio.controller.ts b/apps/api/src/app/portfolio/portfolio.controller.ts index 6a8102501..93af43edb 100644 --- a/apps/api/src/app/portfolio/portfolio.controller.ts +++ b/apps/api/src/app/portfolio/portfolio.controller.ts @@ -179,6 +179,9 @@ export class PortfolioController { countries: hasDetails ? portfolioPosition.countries : [], currency: hasDetails ? portfolioPosition.currency : undefined, markets: hasDetails ? portfolioPosition.markets : undefined, + marketsAdvanced: hasDetails + ? portfolioPosition.marketsAdvanced + : undefined, sectors: hasDetails ? portfolioPosition.sectors : [] }; } diff --git a/apps/api/src/app/portfolio/portfolio.service.ts b/apps/api/src/app/portfolio/portfolio.service.ts index e23a2ff46..859a2dd1c 100644 --- a/apps/api/src/app/portfolio/portfolio.service.ts +++ b/apps/api/src/app/portfolio/portfolio.service.ts @@ -1535,7 +1535,13 @@ export class PortfolioService { ); } - private getLiabilities(activities: OrderWithAccount[]) { + private getLiabilities({ + activities, + userCurrency + }: { + activities: OrderWithAccount[]; + userCurrency: string; + }) { return activities .filter(({ type }) => { return type === TypeOfOrder.LIABILITY; @@ -1544,7 +1550,7 @@ export class PortfolioService { return this.exchangeRateDataService.toCurrency( new Big(quantity).mul(unitPrice).toNumber(), SymbolProfile.currency, - this.request.user.Settings.settings.baseCurrency + userCurrency ); }) .reduce( @@ -1654,7 +1660,10 @@ export class PortfolioService { const fees = this.getFees({ activities, userCurrency }).toNumber(); const firstOrderDate = activities[0]?.date; const items = this.getItems(activities).toNumber(); - const liabilities = this.getLiabilities(activities).toNumber(); + const liabilities = this.getLiabilities({ + activities, + userCurrency + }).toNumber(); const totalBuy = this.getTotalByType(activities, userCurrency, 'BUY'); const totalSell = this.getTotalByType(activities, userCurrency, 'SELL'); diff --git a/apps/client/src/app/pages/portfolio/allocations/allocations-page.component.ts b/apps/client/src/app/pages/portfolio/allocations/allocations-page.component.ts index 2d1b0c412..7266032a5 100644 --- a/apps/client/src/app/pages/portfolio/allocations/allocations-page.component.ts +++ b/apps/client/src/app/pages/portfolio/allocations/allocations-page.component.ts @@ -357,58 +357,96 @@ export class AllocationsPageComponent implements OnDestroy, OnInit { } this.markets.developedMarkets.value += - position.markets.developedMarkets * position.valueInBaseCurrency; + position.markets.developedMarkets * + (isNumber(position.valueInBaseCurrency) + ? position.valueInBaseCurrency + : position.valueInPercentage); this.markets.emergingMarkets.value += - position.markets.emergingMarkets * position.valueInBaseCurrency; + position.markets.emergingMarkets * + (isNumber(position.valueInBaseCurrency) + ? position.valueInBaseCurrency + : position.valueInPercentage); this.markets.otherMarkets.value += - position.markets.otherMarkets * position.valueInBaseCurrency; + position.markets.otherMarkets * + (isNumber(position.valueInBaseCurrency) + ? position.valueInBaseCurrency + : position.valueInPercentage); this.marketsAdvanced.asiaPacific.value += - position.marketsAdvanced.asiaPacific * position.valueInBaseCurrency; + position.marketsAdvanced.asiaPacific * + (isNumber(position.valueInBaseCurrency) + ? position.valueInBaseCurrency + : position.valueInPercentage); this.marketsAdvanced.emergingMarkets.value += position.marketsAdvanced.emergingMarkets * - position.valueInBaseCurrency; + (isNumber(position.valueInBaseCurrency) + ? position.valueInBaseCurrency + : position.valueInPercentage); this.marketsAdvanced.europe.value += - position.marketsAdvanced.europe * position.valueInBaseCurrency; + position.marketsAdvanced.europe * + (isNumber(position.valueInBaseCurrency) + ? position.valueInBaseCurrency + : position.valueInPercentage); this.marketsAdvanced.japan.value += - position.marketsAdvanced.japan * position.valueInBaseCurrency; + position.marketsAdvanced.japan * + (isNumber(position.valueInBaseCurrency) + ? position.valueInBaseCurrency + : position.valueInPercentage); this.marketsAdvanced.northAmerica.value += position.marketsAdvanced.northAmerica * - position.valueInBaseCurrency; + (isNumber(position.valueInBaseCurrency) + ? position.valueInBaseCurrency + : position.valueInPercentage); for (const country of position.countries) { const { code, continent, name, weight } = country; if (this.continents[continent]?.value) { this.continents[continent].value += - weight * position.valueInBaseCurrency; + weight * + (isNumber(position.valueInBaseCurrency) + ? position.valueInBaseCurrency + : position.valueInPercentage); } else { this.continents[continent] = { name: continent, value: weight * - this.portfolioDetails.holdings[symbol].valueInBaseCurrency + (isNumber(position.valueInBaseCurrency) + ? this.portfolioDetails.holdings[symbol].valueInBaseCurrency + : this.portfolioDetails.holdings[symbol].valueInPercentage) }; } if (this.countries[code]?.value) { this.countries[code].value += - weight * position.valueInBaseCurrency; + weight * + (isNumber(position.valueInBaseCurrency) + ? position.valueInBaseCurrency + : position.valueInPercentage); } else { this.countries[code] = { name, value: weight * - this.portfolioDetails.holdings[symbol].valueInBaseCurrency + (isNumber(position.valueInBaseCurrency) + ? this.portfolioDetails.holdings[symbol].valueInBaseCurrency + : this.portfolioDetails.holdings[symbol].valueInPercentage) }; } } } else { - this.continents[UNKNOWN_KEY].value += - this.portfolioDetails.holdings[symbol].valueInBaseCurrency; - - this.countries[UNKNOWN_KEY].value += - this.portfolioDetails.holdings[symbol].valueInBaseCurrency; + this.continents[UNKNOWN_KEY].value += isNumber( + position.valueInBaseCurrency + ) + ? this.portfolioDetails.holdings[symbol].valueInBaseCurrency + : this.portfolioDetails.holdings[symbol].valueInPercentage; + + this.countries[UNKNOWN_KEY].value += isNumber( + position.valueInBaseCurrency + ) + ? this.portfolioDetails.holdings[symbol].valueInBaseCurrency + : this.portfolioDetails.holdings[symbol].valueInPercentage; } if (position.sectors.length > 0) { @@ -416,19 +454,28 @@ export class AllocationsPageComponent implements OnDestroy, OnInit { const { name, weight } = sector; if (this.sectors[name]?.value) { - this.sectors[name].value += weight * position.valueInBaseCurrency; + this.sectors[name].value += + weight * + (isNumber(position.valueInBaseCurrency) + ? position.valueInBaseCurrency + : position.valueInPercentage); } else { this.sectors[name] = { name, value: weight * - this.portfolioDetails.holdings[symbol].valueInBaseCurrency + (isNumber(position.valueInBaseCurrency) + ? this.portfolioDetails.holdings[symbol].valueInBaseCurrency + : this.portfolioDetails.holdings[symbol].valueInPercentage) }; } } } else { - this.sectors[UNKNOWN_KEY].value += - this.portfolioDetails.holdings[symbol].valueInBaseCurrency; + this.sectors[UNKNOWN_KEY].value += isNumber( + position.valueInBaseCurrency + ) + ? this.portfolioDetails.holdings[symbol].valueInBaseCurrency + : this.portfolioDetails.holdings[symbol].valueInPercentage; } }