|
|
@ -154,7 +154,10 @@ export class PortfolioService { |
|
|
|
public async getDetails( |
|
|
|
aImpersonationId: string, |
|
|
|
aDateRange: DateRange = 'max' |
|
|
|
): Promise<{ [symbol: string]: PortfolioPosition }> { |
|
|
|
): Promise<{ |
|
|
|
details: { [symbol: string]: PortfolioPosition }; |
|
|
|
hasErrors: boolean; |
|
|
|
}> { |
|
|
|
const userId = await this.getUserId(aImpersonationId); |
|
|
|
|
|
|
|
const userCurrency = this.request.user.Settings.currency; |
|
|
@ -168,7 +171,7 @@ export class PortfolioService { |
|
|
|
}); |
|
|
|
|
|
|
|
if (transactionPoints?.length <= 0) { |
|
|
|
return {}; |
|
|
|
return { details: {}, hasErrors: false }; |
|
|
|
} |
|
|
|
|
|
|
|
portfolioCalculator.setTransactionPoints(transactionPoints); |
|
|
@ -179,16 +182,12 @@ export class PortfolioService { |
|
|
|
startDate |
|
|
|
); |
|
|
|
|
|
|
|
if (currentPositions.hasErrors) { |
|
|
|
throw new Error('Missing information'); |
|
|
|
} |
|
|
|
|
|
|
|
const cashDetails = await this.accountService.getCashDetails( |
|
|
|
userId, |
|
|
|
userCurrency |
|
|
|
); |
|
|
|
|
|
|
|
const result: { [symbol: string]: PortfolioPosition } = {}; |
|
|
|
const details: { [symbol: string]: PortfolioPosition } = {}; |
|
|
|
const totalInvestment = currentPositions.totalInvestment.plus( |
|
|
|
cashDetails.balance |
|
|
|
); |
|
|
@ -218,7 +217,7 @@ export class PortfolioService { |
|
|
|
const value = item.quantity.mul(item.marketPrice); |
|
|
|
const symbolProfile = symbolProfileMap[item.symbol]; |
|
|
|
const dataProviderResponse = dataProviderResponses[item.symbol]; |
|
|
|
result[item.symbol] = { |
|
|
|
details[item.symbol] = { |
|
|
|
accounts, |
|
|
|
allocationCurrent: value.div(totalValue).toNumber(), |
|
|
|
allocationInvestment: item.investment.div(totalInvestment).toNumber(), |
|
|
@ -226,8 +225,9 @@ export class PortfolioService { |
|
|
|
countries: symbolProfile.countries, |
|
|
|
currency: item.currency, |
|
|
|
exchange: dataProviderResponse.exchange, |
|
|
|
grossPerformance: item.grossPerformance.toNumber(), |
|
|
|
grossPerformancePercent: item.grossPerformancePercentage.toNumber(), |
|
|
|
grossPerformance: item.grossPerformance?.toNumber() ?? 0, |
|
|
|
grossPerformancePercent: |
|
|
|
item.grossPerformancePercentage?.toNumber() ?? 0, |
|
|
|
investment: item.investment.toNumber(), |
|
|
|
marketPrice: item.marketPrice, |
|
|
|
marketState: dataProviderResponse.marketState, |
|
|
@ -241,13 +241,13 @@ export class PortfolioService { |
|
|
|
} |
|
|
|
|
|
|
|
// TODO: Add a cash position for each currency
|
|
|
|
result[ghostfolioCashSymbol] = await this.getCashPosition({ |
|
|
|
details[ghostfolioCashSymbol] = await this.getCashPosition({ |
|
|
|
cashDetails, |
|
|
|
investment: totalInvestment, |
|
|
|
value: totalValue |
|
|
|
}); |
|
|
|
|
|
|
|
return result; |
|
|
|
return { details, hasErrors: currentPositions.hasErrors }; |
|
|
|
} |
|
|
|
|
|
|
|
public async getPosition( |
|
|
|