Browse Source

Improve allocations by ETF holding for impersonation mode

pull/3534/head
Thomas Kaul 1 year ago
parent
commit
342c921a89
  1. 12
      apps/api/src/app/portfolio/portfolio.service.ts
  2. 3
      apps/api/src/services/symbol-profile/symbol-profile.service.ts
  3. 50
      apps/client/src/app/pages/portfolio/allocations/allocations-page.component.ts

12
apps/api/src/app/portfolio/portfolio.service.ts

@ -499,7 +499,17 @@ export class PortfolioService {
grossPerformancePercentageWithCurrencyEffect?.toNumber() ?? 0, grossPerformancePercentageWithCurrencyEffect?.toNumber() ?? 0,
grossPerformanceWithCurrencyEffect: grossPerformanceWithCurrencyEffect:
grossPerformanceWithCurrencyEffect?.toNumber() ?? 0, grossPerformanceWithCurrencyEffect?.toNumber() ?? 0,
holdings: assetProfile.holdings, holdings: assetProfile.holdings.map(
({ allocationInPercentage, name }) => {
return {
allocationInPercentage,
name,
valueInBaseCurrency: valueInBaseCurrency
.mul(allocationInPercentage)
.toNumber()
};
}
),
investment: investment.toNumber(), investment: investment.toNumber(),
marketState: dataProviderResponse?.marketState ?? 'delayed', marketState: dataProviderResponse?.marketState ?? 'delayed',
name: assetProfile.name, name: assetProfile.name,

3
apps/api/src/services/symbol-profile/symbol-profile.service.ts

@ -221,8 +221,9 @@ export class SymbolProfileService {
const { name, weight } = holding as Prisma.JsonObject; const { name, weight } = holding as Prisma.JsonObject;
return { return {
allocationInPercentage: weight as number,
name: (name as string) ?? UNKNOWN_KEY, name: (name as string) ?? UNKNOWN_KEY,
valueInBaseCurrency: weight as number valueInBaseCurrency: undefined
}; };
} }
); );

50
apps/client/src/app/pages/portfolio/allocations/allocations-page.component.ts

@ -454,30 +454,22 @@ export class AllocationsPageComponent implements OnDestroy, OnInit {
if (position.holdings.length > 0) { if (position.holdings.length > 0) {
for (const holding of position.holdings) { for (const holding of position.holdings) {
const { name, valueInBaseCurrency } = holding; const { allocationInPercentage, name, valueInBaseCurrency } =
holding;
if (
!this.hasImpersonationId && if (this.topHoldingsMap[name]?.value) {
!this.user.settings.isRestrictedView this.topHoldingsMap[name].value += isNumber(valueInBaseCurrency)
) { ? valueInBaseCurrency
if (this.topHoldingsMap[name]?.value) { : allocationInPercentage *
this.topHoldingsMap[name].value += this.portfolioDetails.holdings[symbol].valueInPercentage;
valueInBaseCurrency * } else {
(isNumber(position.valueInBaseCurrency) this.topHoldingsMap[name] = {
? position.valueInBaseCurrency name,
: position.valueInPercentage); value: isNumber(valueInBaseCurrency)
} else { ? valueInBaseCurrency
this.topHoldingsMap[name] = { : allocationInPercentage *
name, this.portfolioDetails.holdings[symbol].valueInPercentage
value: };
valueInBaseCurrency *
(isNumber(position.valueInBaseCurrency)
? this.portfolioDetails.holdings[symbol]
.valueInBaseCurrency
: this.portfolioDetails.holdings[symbol]
.valueInPercentage)
};
}
} }
} }
} }
@ -562,6 +554,14 @@ export class AllocationsPageComponent implements OnDestroy, OnInit {
this.topHoldings = Object.values(this.topHoldingsMap) this.topHoldings = Object.values(this.topHoldingsMap)
.map(({ name, value }) => { .map(({ name, value }) => {
if (this.hasImpersonationId || this.user.settings.isRestrictedView) {
return {
name,
allocationInPercentage: value,
valueInBaseCurrency: null
};
}
return { return {
name, name,
allocationInPercentage: allocationInPercentage:
@ -570,7 +570,7 @@ export class AllocationsPageComponent implements OnDestroy, OnInit {
}; };
}) })
.sort((a, b) => { .sort((a, b) => {
return b.valueInBaseCurrency - a.valueInBaseCurrency; return b.allocationInPercentage - a.allocationInPercentage;
}); });
if (this.topHoldings.length > MAX_TOP_HOLDINGS) { if (this.topHoldings.length > MAX_TOP_HOLDINGS) {

Loading…
Cancel
Save