Feature/improve allocations by etf holding for impersonation mode (#3534)
* Improve allocations by ETF holding for impersonation mode * Update changelog
This commit is contained in:
@@ -9,6 +9,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|||||||
|
|
||||||
### Changed
|
### Changed
|
||||||
|
|
||||||
|
- Improved the allocations by ETF holding on the allocations page for the impersonation mode (experimental)
|
||||||
- Improved the detection of REST APIs (`JSON`) used via the scraper configuration
|
- Improved the detection of REST APIs (`JSON`) used via the scraper configuration
|
||||||
|
|
||||||
## 2.92.0 - 2024-06-30
|
## 2.92.0 - 2024-06-30
|
||||||
|
@@ -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,
|
||||||
|
@@ -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
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
@@ -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 (
|
if (this.topHoldingsMap[name]?.value) {
|
||||||
!this.hasImpersonationId &&
|
this.topHoldingsMap[name].value += isNumber(valueInBaseCurrency)
|
||||||
!this.user.settings.isRestrictedView
|
? valueInBaseCurrency
|
||||||
) {
|
: allocationInPercentage *
|
||||||
if (this.topHoldingsMap[name]?.value) {
|
this.portfolioDetails.holdings[symbol].valueInPercentage;
|
||||||
this.topHoldingsMap[name].value +=
|
} else {
|
||||||
valueInBaseCurrency *
|
this.topHoldingsMap[name] = {
|
||||||
(isNumber(position.valueInBaseCurrency)
|
name,
|
||||||
? position.valueInBaseCurrency
|
value: isNumber(valueInBaseCurrency)
|
||||||
: position.valueInPercentage);
|
? valueInBaseCurrency
|
||||||
} else {
|
: allocationInPercentage *
|
||||||
this.topHoldingsMap[name] = {
|
this.portfolioDetails.holdings[symbol].valueInPercentage
|
||||||
name,
|
};
|
||||||
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) {
|
||||||
|
Reference in New Issue
Block a user