diff --git a/CHANGELOG.md b/CHANGELOG.md index 6a17c63fc..097a519b8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -18,6 +18,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Fixed +- Fixed the public page - Improved the loading indicator of the portfolio evolution chart ## 1.206.2 - 20.10.2022 diff --git a/apps/api/src/app/portfolio/portfolio.controller.ts b/apps/api/src/app/portfolio/portfolio.controller.ts index ef0b586e5..16f916cf5 100644 --- a/apps/api/src/app/portfolio/portfolio.controller.ts +++ b/apps/api/src/app/portfolio/portfolio.controller.ts @@ -10,7 +10,6 @@ import { TransformDataSourceInResponseInterceptor } from '@ghostfolio/api/interc import { ApiService } from '@ghostfolio/api/services/api/api.service'; import { ConfigurationService } from '@ghostfolio/api/services/configuration.service'; import { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate-data.service'; -import { parseDate } from '@ghostfolio/common/helper'; import { PortfolioDetails, PortfolioInvestments, @@ -240,7 +239,8 @@ export class PortfolioController { ): Promise { const performanceInformation = await this.portfolioService.getPerformance({ dateRange, - impersonationId + impersonationId, + userId: this.request.user.id }); if ( @@ -331,7 +331,7 @@ export class PortfolioController { dateRange: 'max', filters: [{ id: 'EQUITY', type: 'ASSET_CLASS' }], impersonationId: access.userId, - userId: access.userId + userId: user.id }); const portfolioPublicDetails: PortfolioPublicDetails = { diff --git a/apps/api/src/app/portfolio/portfolio.service.ts b/apps/api/src/app/portfolio/portfolio.service.ts index a34d1e385..06722cefd 100644 --- a/apps/api/src/app/portfolio/portfolio.service.ts +++ b/apps/api/src/app/portfolio/portfolio.service.ts @@ -3,7 +3,6 @@ import { CashDetails } from '@ghostfolio/api/app/account/interfaces/cash-details import { OrderService } from '@ghostfolio/api/app/order/order.service'; import { CurrentRateService } from '@ghostfolio/api/app/portfolio/current-rate.service'; import { PortfolioOrder } from '@ghostfolio/api/app/portfolio/interfaces/portfolio-order.interface'; -import { TimelineSpecification } from '@ghostfolio/api/app/portfolio/interfaces/timeline-specification.interface'; import { TransactionPoint } from '@ghostfolio/api/app/portfolio/interfaces/transaction-point.interface'; import { UserService } from '@ghostfolio/api/app/user/user.service'; import { AccountClusterRiskCurrentInvestment } from '@ghostfolio/api/models/rules/account-cluster-risk/current-investment'; @@ -36,7 +35,8 @@ import { PortfolioSummary, Position, TimelinePosition, - UserSettings + UserSettings, + UserWithSettings } from '@ghostfolio/common/interfaces'; import { InvestmentItem } from '@ghostfolio/common/interfaces/investment-item.interface'; import type { @@ -67,11 +67,9 @@ import { isAfter, isBefore, max, - parse, parseISO, set, setDayOfYear, - startOfDay, subDays, subYears } from 'date-fns'; @@ -130,9 +128,9 @@ export class PortfolioService { }), this.getDetails({ filters, - userId, withExcludedAccounts, - impersonationId: userId + impersonationId: userId, + userId: this.request.user.id }) ]); @@ -304,12 +302,16 @@ export class PortfolioService { public async getChart({ dateRange = 'max', - impersonationId + impersonationId, + userCurrency, + userId }: { dateRange?: DateRange; impersonationId: string; + userCurrency: string; + userId: string; }): Promise { - const userId = await this.getUserId(impersonationId, this.request.user.id); + userId = await this.getUserId(impersonationId, userId); const { portfolioOrders, transactionPoints } = await this.getTransactionPoints({ @@ -317,7 +319,7 @@ export class PortfolioService { }); const portfolioCalculator = new PortfolioCalculator({ - currency: this.request.user.Settings.settings.baseCurrency, + currency: userCurrency, currentRateService: this.currentRateService, orders: portfolioOrders }); @@ -355,28 +357,24 @@ export class PortfolioService { public async getDetails({ impersonationId, - userId, dateRange = 'max', filters, + userId, withExcludedAccounts = false }: { impersonationId: string; - userId: string; dateRange?: DateRange; filters?: Filter[]; + userId: string; withExcludedAccounts?: boolean; }): Promise { - // TODO userId = await this.getUserId(impersonationId, userId); const user = await this.userService.user({ id: userId }); + const userCurrency = this.getUserCurrency(user); const emergencyFund = new Big( (user.Settings?.settings as UserSettings)?.emergencyFund ?? 0 ); - const userCurrency = - user.Settings?.settings.baseCurrency ?? - this.request.user?.Settings?.settings.baseCurrency ?? - this.baseCurrency; const { orders, portfolioOrders, transactionPoints } = await this.getTransactionPoints({ @@ -540,7 +538,11 @@ export class PortfolioService { withExcludedAccounts }); - const summary = await this.getSummary({ impersonationId }); + const summary = await this.getSummary({ + impersonationId, + userCurrency, + userId + }); return { accounts, @@ -560,8 +562,9 @@ export class PortfolioService { aImpersonationId: string, aSymbol: string ): Promise { - const userCurrency = this.request.user.Settings.settings.baseCurrency; const userId = await this.getUserId(aImpersonationId, this.request.user.id); + const user = await this.userService.user({ id: userId }); + const userCurrency = this.getUserCurrency(user); const orders = ( await this.orderService.getOrders({ @@ -883,12 +886,16 @@ export class PortfolioService { public async getPerformance({ dateRange = 'max', - impersonationId + impersonationId, + userId }: { dateRange?: DateRange; impersonationId: string; + userId: string; }): Promise { - const userId = await this.getUserId(impersonationId, this.request.user.id); + userId = await this.getUserId(impersonationId, userId); + const user = await this.userService.user({ id: userId }); + const userCurrency = this.getUserCurrency(user); const { portfolioOrders, transactionPoints } = await this.getTransactionPoints({ @@ -896,7 +903,7 @@ export class PortfolioService { }); const portfolioCalculator = new PortfolioCalculator({ - currency: this.request.user.Settings.settings.baseCurrency, + currency: userCurrency, currentRateService: this.currentRateService, orders: portfolioOrders }); @@ -947,7 +954,9 @@ export class PortfolioService { const historicalDataContainer = await this.getChart({ dateRange, - impersonationId + impersonationId, + userCurrency, + userId }); const itemOfToday = historicalDataContainer.items.find((item) => { @@ -995,8 +1004,9 @@ export class PortfolioService { } public async getReport(impersonationId: string): Promise { - const currency = this.request.user.Settings.settings.baseCurrency; const userId = await this.getUserId(impersonationId, this.request.user.id); + const user = await this.userService.user({ id: userId }); + const userCurrency = this.getUserCurrency(user); const { orders, portfolioOrders, transactionPoints } = await this.getTransactionPoints({ @@ -1010,7 +1020,7 @@ export class PortfolioService { } const portfolioCalculator = new PortfolioCalculator({ - currency, + currency: userCurrency, currentRateService: this.currentRateService, orders: portfolioOrders }); @@ -1030,7 +1040,7 @@ export class PortfolioService { orders, portfolioItemsNow, userId, - userCurrency: currency + userCurrency }); return { rules: { @@ -1077,7 +1087,7 @@ export class PortfolioService { new FeeRatioInitialInvestment( this.exchangeRateDataService, currentPositions.totalInvestment.toNumber(), - this.getFees(orders).toNumber() + this.getFees({ orders, userCurrency }).toNumber() ) ], this.request.user.Settings.settings @@ -1180,7 +1190,15 @@ export class PortfolioService { return cashPositions; } - private getDividend(orders: OrderWithAccount[], date = new Date(0)) { + private getDividend({ + date = new Date(0), + orders, + userCurrency + }: { + date?: Date; + orders: OrderWithAccount[]; + userCurrency: string; + }) { return orders .filter((order) => { // Filter out all orders before given date and type dividend @@ -1193,7 +1211,7 @@ export class PortfolioService { return this.exchangeRateDataService.toCurrency( new Big(order.quantity).mul(order.unitPrice).toNumber(), order.SymbolProfile.currency, - this.request.user.Settings.settings.baseCurrency + userCurrency ); }) .reduce( @@ -1202,7 +1220,15 @@ export class PortfolioService { ); } - private getFees(orders: OrderWithAccount[], date = new Date(0)) { + private getFees({ + date = new Date(0), + orders, + userCurrency + }: { + date?: Date; + orders: OrderWithAccount[]; + userCurrency: string; + }) { return orders .filter((order) => { // Filter out all orders before given date @@ -1212,7 +1238,7 @@ export class PortfolioService { return this.exchangeRateDataService.toCurrency( order.fee, order.SymbolProfile.currency, - this.request.user.Settings.settings.baseCurrency + userCurrency ); }) .reduce( @@ -1262,16 +1288,20 @@ export class PortfolioService { } private async getSummary({ - impersonationId + impersonationId, + userCurrency, + userId }: { impersonationId: string; + userCurrency: string; + userId: string; }): Promise { - const userCurrency = this.request.user.Settings.settings.baseCurrency; - const userId = await this.getUserId(impersonationId, this.request.user.id); + userId = await this.getUserId(impersonationId, userId); const user = await this.userService.user({ id: userId }); const performanceInformation = await this.getPerformance({ - impersonationId + impersonationId, + userId }); const { balanceInBaseCurrency } = await this.accountService.getCashDetails({ @@ -1293,11 +1323,11 @@ export class PortfolioService { return account?.isExcluded ?? false; }); - const dividend = this.getDividend(orders).toNumber(); + const dividend = this.getDividend({ orders, userCurrency }).toNumber(); const emergencyFund = new Big( (user.Settings?.settings as UserSettings)?.emergencyFund ?? 0 ); - const fees = this.getFees(orders).toNumber(); + const fees = this.getFees({ orders, userCurrency }).toNumber(); const firstOrderDate = orders[0]?.date; const items = this.getItems(orders).toNumber(); @@ -1565,4 +1595,12 @@ export class PortfolioService { }) .reduce((previous, current) => previous + current, 0); } + + private getUserCurrency(aUser: UserWithSettings) { + return ( + aUser.Settings?.settings.baseCurrency ?? + this.request.user?.Settings?.settings.baseCurrency ?? + this.baseCurrency + ); + } }