diff --git a/apps/api/src/app/portfolio/calculator/mwr/portfolio-calculator.ts b/apps/api/src/app/portfolio/calculator/mwr/portfolio-calculator.ts index a57ac5d5bd..98e3fc9a4b 100644 --- a/apps/api/src/app/portfolio/calculator/mwr/portfolio-calculator.ts +++ b/apps/api/src/app/portfolio/calculator/mwr/portfolio-calculator.ts @@ -1,29 +1,28 @@ import { PortfolioCalculator } from '@ghostfolio/api/app/portfolio/calculator/portfolio-calculator'; -import { - AssetProfileIdentifier, - SymbolMetrics -} from '@ghostfolio/common/interfaces'; +import { HoldingPerformance } from '@ghostfolio/api/app/portfolio/interfaces/holding-performance.interface'; +import { PortfolioCalculatorHolding } from '@ghostfolio/api/app/portfolio/interfaces/portfolio-calculator-holding.interface'; +import { AssetProfileIdentifier } from '@ghostfolio/common/interfaces'; import { PortfolioSnapshot } from '@ghostfolio/common/models'; import { PerformanceCalculationType } from '@ghostfolio/common/types/performance-calculation-type.type'; export class MwrPortfolioCalculator extends PortfolioCalculator { - protected calculateOverallPerformance(): PortfolioSnapshot { + protected calculateOverallPerformance([]: PortfolioCalculatorHolding[]): PortfolioSnapshot { throw new Error('Method not implemented.'); } - protected getPerformanceCalculationType() { - return PerformanceCalculationType.MWR; - } - - protected getSymbolMetrics({}: { + protected getHoldingPerformance({}: { + chartDateMap: { [date: string]: boolean }; end: Date; exchangeRates: { [dateString: string]: number }; marketSymbolMap: { [date: string]: { [assetProfileIdentifier: string]: Big }; }; start: Date; - step?: number; - } & AssetProfileIdentifier): SymbolMetrics { + } & AssetProfileIdentifier): HoldingPerformance { throw new Error('Method not implemented.'); } + + protected getPerformanceCalculationType() { + return PerformanceCalculationType.MWR; + } } diff --git a/apps/api/src/app/portfolio/calculator/portfolio-calculator.ts b/apps/api/src/app/portfolio/calculator/portfolio-calculator.ts index d73ea60161..5f6e91b248 100644 --- a/apps/api/src/app/portfolio/calculator/portfolio-calculator.ts +++ b/apps/api/src/app/portfolio/calculator/portfolio-calculator.ts @@ -1,6 +1,7 @@ import { CurrentRateService } from '@ghostfolio/api/app/portfolio/current-rate.service'; import { PortfolioSnapshotComputationError } from '@ghostfolio/api/app/portfolio/errors/portfolio-snapshot-computation.error'; -import { PortfolioCalculatorPosition } from '@ghostfolio/api/app/portfolio/interfaces/portfolio-calculator-position.interface'; +import { HoldingPerformance } from '@ghostfolio/api/app/portfolio/interfaces/holding-performance.interface'; +import { PortfolioCalculatorHolding } from '@ghostfolio/api/app/portfolio/interfaces/portfolio-calculator-holding.interface'; import { PortfolioOrder } from '@ghostfolio/api/app/portfolio/interfaces/portfolio-order.interface'; import { PortfolioSnapshotValue } from '@ghostfolio/api/app/portfolio/interfaces/snapshot-value.interface'; import { TransactionPointSymbol } from '@ghostfolio/api/app/portfolio/interfaces/transaction-point-symbol.interface'; @@ -35,8 +36,7 @@ import { Filter, HistoricalDataItem, InvestmentItem, - ResponseError, - SymbolMetrics + ResponseError } from '@ghostfolio/common/interfaces'; import { PortfolioSnapshot } from '@ghostfolio/common/models'; import { GroupBy } from '@ghostfolio/common/types'; @@ -209,7 +209,7 @@ export abstract class PortfolioCalculator { } protected abstract calculateOverallPerformance( - positions: PortfolioCalculatorPosition[] + positions: PortfolioCalculatorHolding[] ): PortfolioSnapshot; @LogPerformance @@ -343,9 +343,9 @@ export abstract class PortfolioCalculator { } const errors: ResponseError['errors'] = []; - let hasAnySymbolMetricsErrors = false; + let hasAnyHoldingPerformanceErrors = false; - const positions: PortfolioCalculatorPosition[] = []; + const positions: PortfolioCalculatorHolding[] = []; const accumulatedValuesByDate: { [date: string]: { @@ -424,7 +424,7 @@ export abstract class PortfolioCalculator { totalInvestment, totalInvestmentWithCurrencyEffect, totalLiabilitiesInBaseCurrency - } = this.getSymbolMetrics({ + } = this.getHoldingPerformance({ chartDateMap, marketSymbolMap, dataSource: item.dataSource, @@ -435,7 +435,8 @@ export abstract class PortfolioCalculator { symbol: item.symbol }); - hasAnySymbolMetricsErrors = hasAnySymbolMetricsErrors || hasErrors; + hasAnyHoldingPerformanceErrors = + hasAnyHoldingPerformanceErrors || hasErrors; // Cash in the base currency cannot generate a currency effect and thus // contributes nothing but its balance to the performance calculation. It @@ -708,13 +709,11 @@ export abstract class PortfolioCalculator { totalCashInBaseCurrency, totalInterestWithCurrencyEffect, totalLiabilitiesWithCurrencyEffect, - hasErrors: hasAnySymbolMetricsErrors || overall.hasErrors, + hasErrors: hasAnyHoldingPerformanceErrors || overall.hasErrors, positions: positionsIncludedInHoldings }; } - protected abstract getPerformanceCalculationType(): PerformanceCalculationType; - public getDataProviderInfos() { return this.dataProviderInfos; } @@ -735,6 +734,24 @@ export abstract class PortfolioCalculator { return this.snapshot.totalFeesWithCurrencyEffect; } + protected abstract getHoldingPerformance({ + chartDateMap, + dataSource, + end, + exchangeRates, + marketSymbolMap, + start, + symbol + }: { + chartDateMap: { [date: string]: boolean }; + end: Date; + exchangeRates: { [dateString: string]: number }; + marketSymbolMap: { + [date: string]: { [assetProfileIdentifier: string]: Big }; + }; + start: Date; + } & AssetProfileIdentifier): HoldingPerformance; + public async getInterestInBaseCurrency() { await this.snapshotPromise; @@ -875,6 +892,8 @@ export abstract class PortfolioCalculator { return { chart }; } + protected abstract getPerformanceCalculationType(): PerformanceCalculationType; + public async getSnapshot() { await this.snapshotPromise; @@ -920,24 +939,6 @@ export abstract class PortfolioCalculator { return min(dates); } - protected abstract getSymbolMetrics({ - chartDateMap, - dataSource, - end, - exchangeRates, - marketSymbolMap, - start, - symbol - }: { - chartDateMap: { [date: string]: boolean }; - end: Date; - exchangeRates: { [dateString: string]: number }; - marketSymbolMap: { - [date: string]: { [assetProfileIdentifier: string]: Big }; - }; - start: Date; - } & AssetProfileIdentifier): SymbolMetrics; - public getTransactionPoints() { return this.transactionPoints; } diff --git a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-cash.spec.ts b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-cash.spec.ts index 3a49c91fcd..ebbc9342ee 100644 --- a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-cash.spec.ts +++ b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-cash.spec.ts @@ -19,7 +19,7 @@ import { ExchangeRateDataServiceMock } from '@ghostfolio/api/services/exchange-r import { PortfolioSnapshotService } from '@ghostfolio/api/services/queues/portfolio-snapshot/portfolio-snapshot.service'; import { PortfolioSnapshotServiceMock } from '@ghostfolio/api/services/queues/portfolio-snapshot/portfolio-snapshot.service.mock'; import { parseDate } from '@ghostfolio/common/helper'; -import { TimelinePosition } from '@ghostfolio/common/models'; +import { PortfolioSnapshotHolding } from '@ghostfolio/common/models'; import { PerformanceCalculationType } from '@ghostfolio/common/types/performance-calculation-type.type'; import { DataSource } from '@prisma/client'; @@ -250,7 +250,7 @@ describe('PortfolioCalculator', () => { * Total account balance: 2000 USD * 0.85 = 1700 CHF (using the exchange rate on 2024-12-31) * Value in base currency: 2000 USD * 0.91 = 1820 CHF */ - expect(position).toMatchObject({ + expect(position).toMatchObject({ activitiesCount: 2, averagePrice: new Big(1), currency: 'USD', @@ -422,7 +422,7 @@ describe('PortfolioCalculator', () => { * The holding itself keeps its investment and value so that it remains * visible in the holdings table */ - expect(position).toMatchObject>({ + expect(position).toMatchObject>({ currency: 'CHF', grossPerformance: new Big(0), grossPerformanceWithCurrencyEffect: new Big(0), diff --git a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator.ts b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator.ts index 51a7e80682..9ebf757f98 100644 --- a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator.ts +++ b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator.ts @@ -1,5 +1,6 @@ import { PortfolioCalculator } from '@ghostfolio/api/app/portfolio/calculator/portfolio-calculator'; -import { PortfolioCalculatorPosition } from '@ghostfolio/api/app/portfolio/interfaces/portfolio-calculator-position.interface'; +import { HoldingPerformance } from '@ghostfolio/api/app/portfolio/interfaces/holding-performance.interface'; +import { PortfolioCalculatorHolding } from '@ghostfolio/api/app/portfolio/interfaces/portfolio-calculator-holding.interface'; import { PortfolioOrderItem } from '@ghostfolio/api/app/portfolio/interfaces/portfolio-order-item.interface'; import { getFactor } from '@ghostfolio/api/helper/portfolio.helper'; import { getIntervalFromDateRange } from '@ghostfolio/common/calculation-helper'; @@ -8,10 +9,7 @@ import { getAssetProfileIdentifier, parseDate } from '@ghostfolio/common/helper'; -import { - AssetProfileIdentifier, - SymbolMetrics -} from '@ghostfolio/common/interfaces'; +import { AssetProfileIdentifier } from '@ghostfolio/common/interfaces'; import { PortfolioSnapshot } from '@ghostfolio/common/models'; import { DateRange } from '@ghostfolio/common/types'; import { PerformanceCalculationType } from '@ghostfolio/common/types/performance-calculation-type.type'; @@ -31,7 +29,7 @@ export class RoaiPortfolioCalculator extends PortfolioCalculator { private chartDates: string[]; protected calculateOverallPerformance( - positions: PortfolioCalculatorPosition[] + positions: PortfolioCalculatorHolding[] ): PortfolioSnapshot { let currentValueInBaseCurrency = new Big(0); let grossPerformance = new Big(0); @@ -127,11 +125,7 @@ export class RoaiPortfolioCalculator extends PortfolioCalculator { }; } - protected getPerformanceCalculationType() { - return PerformanceCalculationType.ROAI; - } - - protected getSymbolMetrics({ + protected getHoldingPerformance({ chartDateMap, dataSource, end, @@ -140,14 +134,14 @@ export class RoaiPortfolioCalculator extends PortfolioCalculator { start, symbol }: { - chartDateMap?: { [date: string]: boolean }; + chartDateMap: { [date: string]: boolean }; end: Date; exchangeRates: { [dateString: string]: number }; marketSymbolMap: { [date: string]: { [assetProfileIdentifier: string]: Big }; }; start: Date; - } & AssetProfileIdentifier): SymbolMetrics { + } & AssetProfileIdentifier): HoldingPerformance { const currentExchangeRate = exchangeRates[format(new Date(), DATE_FORMAT)]; const currentValues: { [date: string]: Big } = {}; const currentValuesWithCurrencyEffect: { [date: string]: Big } = {}; @@ -162,7 +156,6 @@ export class RoaiPortfolioCalculator extends PortfolioCalculator { let grossPerformanceFromSells = new Big(0); let grossPerformanceFromSellsWithCurrencyEffect = new Big(0); let initialValue: Big; - let initialValueWithCurrencyEffect: Big; let investmentAtStartDate: Big; let investmentAtStartDateWithCurrencyEffect: Big; const investmentValuesAccumulated: { [date: string]: Big } = {}; @@ -180,16 +173,13 @@ export class RoaiPortfolioCalculator extends PortfolioCalculator { [date: string]: Big; } = {}; - const totalAccountBalanceInBaseCurrency = new Big(0); let totalDividend = new Big(0); let totalDividendInBaseCurrency = new Big(0); - let totalInterest = new Big(0); let totalInterestInBaseCurrency = new Big(0); let totalInvestment = new Big(0); let totalInvestmentFromBuyTransactions = new Big(0); let totalInvestmentFromBuyTransactionsWithCurrencyEffect = new Big(0); let totalInvestmentWithCurrencyEffect = new Big(0); - let totalLiabilities = new Big(0); let totalLiabilitiesInBaseCurrency = new Big(0); let totalQuantity = new Big(0); let totalQuantityFromBuyTransactions = new Big(0); @@ -215,14 +205,11 @@ export class RoaiPortfolioCalculator extends PortfolioCalculator { return { currentValues: {}, currentValuesWithCurrencyEffect: {}, - feesWithCurrencyEffect: new Big(0), grossPerformance: new Big(0), grossPerformancePercentage: new Big(0), grossPerformancePercentageWithCurrencyEffect: new Big(0), grossPerformanceWithCurrencyEffect: new Big(0), hasErrors: false, - initialValue: new Big(0), - initialValueWithCurrencyEffect: new Big(0), investmentValuesAccumulated: {}, investmentValuesAccumulatedWithCurrencyEffect: {}, investmentValuesWithCurrencyEffect: {}, @@ -236,14 +223,11 @@ export class RoaiPortfolioCalculator extends PortfolioCalculator { timeWeightedInvestmentValues: {}, timeWeightedInvestmentValuesWithCurrencyEffect: {}, timeWeightedInvestmentWithCurrencyEffect: new Big(0), - totalAccountBalanceInBaseCurrency: new Big(0), totalDividend: new Big(0), totalDividendInBaseCurrency: new Big(0), - totalInterest: new Big(0), totalInterestInBaseCurrency: new Big(0), totalInvestment: new Big(0), totalInvestmentWithCurrencyEffect: new Big(0), - totalLiabilities: new Big(0), totalLiabilitiesInBaseCurrency: new Big(0) }; } @@ -264,14 +248,12 @@ export class RoaiPortfolioCalculator extends PortfolioCalculator { } else if (order.type === 'INTEREST') { const interest = order.quantity.mul(order.unitPrice); - totalInterest = totalInterest.plus(interest); totalInterestInBaseCurrency = totalInterestInBaseCurrency.plus( interest.mul(exchangeRateAtOrderDate ?? 1) ); } else if (order.type === 'LIABILITY') { const liabilities = order.quantity.mul(order.unitPrice); - totalLiabilities = totalLiabilities.plus(liabilities); totalLiabilitiesInBaseCurrency = totalLiabilitiesInBaseCurrency.plus( liabilities.mul(exchangeRateAtOrderDate ?? 1) ); @@ -319,20 +301,15 @@ export class RoaiPortfolioCalculator extends PortfolioCalculator { return { totalDividend, totalDividendInBaseCurrency, - totalInterest, totalInterestInBaseCurrency, - totalLiabilities, totalLiabilitiesInBaseCurrency, currentValues: {}, currentValuesWithCurrencyEffect: {}, - feesWithCurrencyEffect: new Big(0), grossPerformance: new Big(0), grossPerformancePercentage: new Big(0), grossPerformancePercentageWithCurrencyEffect: new Big(0), grossPerformanceWithCurrencyEffect: new Big(0), hasErrors: hasActivitiesWithQuantity, - initialValue: new Big(0), - initialValueWithCurrencyEffect: new Big(0), investmentValuesAccumulated: {}, investmentValuesAccumulatedWithCurrencyEffect: {}, investmentValuesWithCurrencyEffect: {}, @@ -346,7 +323,6 @@ export class RoaiPortfolioCalculator extends PortfolioCalculator { timeWeightedInvestmentValues: {}, timeWeightedInvestmentValuesWithCurrencyEffect: {}, timeWeightedInvestmentWithCurrencyEffect: new Big(0), - totalAccountBalanceInBaseCurrency: new Big(0), totalInvestment: new Big(0), totalInvestmentWithCurrencyEffect: new Big(0) }; @@ -607,14 +583,8 @@ export class RoaiPortfolioCalculator extends PortfolioCalculator { !valueOfInvestmentBeforeTransaction.eq(0) ) { initialValue = valueOfInvestmentBeforeTransaction; - - initialValueWithCurrencyEffect = - valueOfInvestmentBeforeTransactionWithCurrencyEffect; } else if (transactionInvestment.gt(0)) { initialValue = transactionInvestment; - - initialValueWithCurrencyEffect = - transactionInvestmentWithCurrencyEffect; } } @@ -1016,11 +986,8 @@ export class RoaiPortfolioCalculator extends PortfolioCalculator { return { currentValues, currentValuesWithCurrencyEffect, - feesWithCurrencyEffect, grossPerformancePercentage, grossPerformancePercentageWithCurrencyEffect, - initialValue, - initialValueWithCurrencyEffect, investmentValuesAccumulated, investmentValuesAccumulatedWithCurrencyEffect, investmentValuesWithCurrencyEffect, @@ -1031,14 +998,11 @@ export class RoaiPortfolioCalculator extends PortfolioCalculator { netPerformanceWithCurrencyEffectMap, timeWeightedInvestmentValues, timeWeightedInvestmentValuesWithCurrencyEffect, - totalAccountBalanceInBaseCurrency, totalDividend, totalDividendInBaseCurrency, - totalInterest, totalInterestInBaseCurrency, totalInvestment, totalInvestmentWithCurrencyEffect, - totalLiabilities, totalLiabilitiesInBaseCurrency, grossPerformance: totalGrossPerformance, grossPerformanceWithCurrencyEffect: @@ -1051,4 +1015,8 @@ export class RoaiPortfolioCalculator extends PortfolioCalculator { timeWeightedAverageInvestmentBetweenStartAndEndDateWithCurrencyEffect }; } + + protected getPerformanceCalculationType() { + return PerformanceCalculationType.ROAI; + } } diff --git a/apps/api/src/app/portfolio/calculator/roi/portfolio-calculator.ts b/apps/api/src/app/portfolio/calculator/roi/portfolio-calculator.ts index 3625ab96cc..b3fc92b123 100644 --- a/apps/api/src/app/portfolio/calculator/roi/portfolio-calculator.ts +++ b/apps/api/src/app/portfolio/calculator/roi/portfolio-calculator.ts @@ -1,29 +1,28 @@ import { PortfolioCalculator } from '@ghostfolio/api/app/portfolio/calculator/portfolio-calculator'; -import { - AssetProfileIdentifier, - SymbolMetrics -} from '@ghostfolio/common/interfaces'; +import { HoldingPerformance } from '@ghostfolio/api/app/portfolio/interfaces/holding-performance.interface'; +import { PortfolioCalculatorHolding } from '@ghostfolio/api/app/portfolio/interfaces/portfolio-calculator-holding.interface'; +import { AssetProfileIdentifier } from '@ghostfolio/common/interfaces'; import { PortfolioSnapshot } from '@ghostfolio/common/models'; import { PerformanceCalculationType } from '@ghostfolio/common/types/performance-calculation-type.type'; export class RoiPortfolioCalculator extends PortfolioCalculator { - protected calculateOverallPerformance(): PortfolioSnapshot { + protected calculateOverallPerformance([]: PortfolioCalculatorHolding[]): PortfolioSnapshot { throw new Error('Method not implemented.'); } - protected getPerformanceCalculationType() { - return PerformanceCalculationType.ROI; - } - - protected getSymbolMetrics({}: { + protected getHoldingPerformance({}: { + chartDateMap: { [date: string]: boolean }; end: Date; exchangeRates: { [dateString: string]: number }; marketSymbolMap: { [date: string]: { [assetProfileIdentifier: string]: Big }; }; start: Date; - step?: number; - } & AssetProfileIdentifier): SymbolMetrics { + } & AssetProfileIdentifier): HoldingPerformance { throw new Error('Method not implemented.'); } + + protected getPerformanceCalculationType() { + return PerformanceCalculationType.ROI; + } } diff --git a/apps/api/src/app/portfolio/calculator/twr/portfolio-calculator.ts b/apps/api/src/app/portfolio/calculator/twr/portfolio-calculator.ts index ad54ff34c4..fc13a5ec14 100644 --- a/apps/api/src/app/portfolio/calculator/twr/portfolio-calculator.ts +++ b/apps/api/src/app/portfolio/calculator/twr/portfolio-calculator.ts @@ -1,29 +1,28 @@ import { PortfolioCalculator } from '@ghostfolio/api/app/portfolio/calculator/portfolio-calculator'; -import { - AssetProfileIdentifier, - SymbolMetrics -} from '@ghostfolio/common/interfaces'; +import { HoldingPerformance } from '@ghostfolio/api/app/portfolio/interfaces/holding-performance.interface'; +import { PortfolioCalculatorHolding } from '@ghostfolio/api/app/portfolio/interfaces/portfolio-calculator-holding.interface'; +import { AssetProfileIdentifier } from '@ghostfolio/common/interfaces'; import { PortfolioSnapshot } from '@ghostfolio/common/models'; import { PerformanceCalculationType } from '@ghostfolio/common/types/performance-calculation-type.type'; export class TwrPortfolioCalculator extends PortfolioCalculator { - protected calculateOverallPerformance(): PortfolioSnapshot { + protected calculateOverallPerformance([]: PortfolioCalculatorHolding[]): PortfolioSnapshot { throw new Error('Method not implemented.'); } - protected getPerformanceCalculationType() { - return PerformanceCalculationType.TWR; - } - - protected getSymbolMetrics({}: { + protected getHoldingPerformance({}: { + chartDateMap: { [date: string]: boolean }; end: Date; exchangeRates: { [dateString: string]: number }; marketSymbolMap: { [date: string]: { [assetProfileIdentifier: string]: Big }; }; start: Date; - step?: number; - } & AssetProfileIdentifier): SymbolMetrics { + } & AssetProfileIdentifier): HoldingPerformance { throw new Error('Method not implemented.'); } + + protected getPerformanceCalculationType() { + return PerformanceCalculationType.TWR; + } } diff --git a/libs/common/src/lib/interfaces/symbol-metrics.interface.ts b/apps/api/src/app/portfolio/interfaces/holding-performance.interface.ts similarity index 86% rename from libs/common/src/lib/interfaces/symbol-metrics.interface.ts rename to apps/api/src/app/portfolio/interfaces/holding-performance.interface.ts index c2b70a4bc4..4a1e2077c8 100644 --- a/libs/common/src/lib/interfaces/symbol-metrics.interface.ts +++ b/apps/api/src/app/portfolio/interfaces/holding-performance.interface.ts @@ -2,21 +2,18 @@ import { DateRange } from '@ghostfolio/common/types'; import { Big } from 'big.js'; -export interface SymbolMetrics { +export interface HoldingPerformance { currentValues: { [date: string]: Big; }; currentValuesWithCurrencyEffect: { [date: string]: Big; }; - feesWithCurrencyEffect: Big; grossPerformance: Big; grossPerformancePercentage: Big; grossPerformancePercentageWithCurrencyEffect: Big; grossPerformanceWithCurrencyEffect: Big; hasErrors: boolean; - initialValue: Big; - initialValueWithCurrencyEffect: Big; investmentValuesAccumulated: { [date: string]: Big; }; @@ -42,13 +39,10 @@ export interface SymbolMetrics { [date: string]: Big; }; timeWeightedInvestmentWithCurrencyEffect: Big; - totalAccountBalanceInBaseCurrency: Big; totalDividend: Big; totalDividendInBaseCurrency: Big; - totalInterest: Big; totalInterestInBaseCurrency: Big; totalInvestment: Big; totalInvestmentWithCurrencyEffect: Big; - totalLiabilities: Big; totalLiabilitiesInBaseCurrency: Big; } diff --git a/apps/api/src/app/portfolio/interfaces/portfolio-calculator-holding.interface.ts b/apps/api/src/app/portfolio/interfaces/portfolio-calculator-holding.interface.ts new file mode 100644 index 0000000000..fe4a82566d --- /dev/null +++ b/apps/api/src/app/portfolio/interfaces/portfolio-calculator-holding.interface.ts @@ -0,0 +1,6 @@ +import { PortfolioSnapshotHolding } from '@ghostfolio/common/models'; + +export interface PortfolioCalculatorHolding extends PortfolioSnapshotHolding { + includeInHoldings: boolean; + includeInPerformance: boolean; +} diff --git a/apps/api/src/app/portfolio/interfaces/portfolio-calculator-position.interface.ts b/apps/api/src/app/portfolio/interfaces/portfolio-calculator-position.interface.ts deleted file mode 100644 index f0cf8a7742..0000000000 --- a/apps/api/src/app/portfolio/interfaces/portfolio-calculator-position.interface.ts +++ /dev/null @@ -1,6 +0,0 @@ -import { TimelinePosition } from '@ghostfolio/common/models'; - -export interface PortfolioCalculatorPosition extends TimelinePosition { - includeInHoldings: boolean; - includeInPerformance: boolean; -} diff --git a/apps/api/src/app/portfolio/portfolio.service.ts b/apps/api/src/app/portfolio/portfolio.service.ts index afe5745cd8..b33c33e497 100644 --- a/apps/api/src/app/portfolio/portfolio.service.ts +++ b/apps/api/src/app/portfolio/portfolio.service.ts @@ -66,7 +66,7 @@ import { PortfolioSummary, UserSettings } from '@ghostfolio/common/interfaces'; -import { TimelinePosition } from '@ghostfolio/common/models'; +import { PortfolioSnapshotHolding } from '@ghostfolio/common/models'; import { AccountWithBalance, AccountWithValue, @@ -689,7 +689,7 @@ export class PortfolioService { } const portfolioItemsNow: { - [assetProfileIdentifier: string]: TimelinePosition; + [assetProfileIdentifier: string]: PortfolioSnapshotHolding; } = {}; for (const position of positions) { @@ -2316,7 +2316,7 @@ export class PortfolioService { }: { activities: Activity[]; filters?: Filter[]; - portfolioItemsNow: Record; + portfolioItemsNow: Record; userCurrency: string; userId: string; withExcludedAccounts?: boolean; diff --git a/libs/common/src/lib/interfaces/index.ts b/libs/common/src/lib/interfaces/index.ts index 62a038df0a..c581b8e56e 100644 --- a/libs/common/src/lib/interfaces/index.ts +++ b/libs/common/src/lib/interfaces/index.ts @@ -92,7 +92,6 @@ import type { import type { Statistics } from './statistics.interface'; import type { SubscriptionOffer } from './subscription-offer.interface'; import type { SymbolItem } from './symbol-item.interface'; -import type { SymbolMetrics } from './symbol-metrics.interface'; import type { SystemMessage } from './system-message.interface'; import type { UserItem } from './user-item.interface'; import type { UserSettings } from './user-settings.interface'; @@ -188,7 +187,6 @@ export { Statistics, SubscriptionOffer, SymbolItem, - SymbolMetrics, SystemMessage, User, UserItem, diff --git a/libs/common/src/lib/models/index.ts b/libs/common/src/lib/models/index.ts index 0dd601a0e1..9527bcd072 100644 --- a/libs/common/src/lib/models/index.ts +++ b/libs/common/src/lib/models/index.ts @@ -1,4 +1,4 @@ import { PortfolioSnapshot } from './portfolio-snapshot'; -import { TimelinePosition } from './timeline-position'; +import { PortfolioSnapshotHolding } from './portfolio-snapshot-holding'; -export { PortfolioSnapshot, TimelinePosition }; +export { PortfolioSnapshot, PortfolioSnapshotHolding }; diff --git a/libs/common/src/lib/models/timeline-position.ts b/libs/common/src/lib/models/portfolio-snapshot-holding.ts similarity index 98% rename from libs/common/src/lib/models/timeline-position.ts rename to libs/common/src/lib/models/portfolio-snapshot-holding.ts index b16db49881..5d8dd67f85 100644 --- a/libs/common/src/lib/models/timeline-position.ts +++ b/libs/common/src/lib/models/portfolio-snapshot-holding.ts @@ -8,7 +8,7 @@ import { DataSource, Tag } from '@prisma/client'; import { Big } from 'big.js'; import { Transform, Type } from 'class-transformer'; -export class TimelinePosition { +export class PortfolioSnapshotHolding { activitiesCount: number; @Transform(transformToBig, { toClassOnly: true }) diff --git a/libs/common/src/lib/models/portfolio-snapshot.ts b/libs/common/src/lib/models/portfolio-snapshot.ts index 17e4bf97d8..802b470e43 100644 --- a/libs/common/src/lib/models/portfolio-snapshot.ts +++ b/libs/common/src/lib/models/portfolio-snapshot.ts @@ -3,7 +3,7 @@ import { AssetProfileIdentifier, HistoricalDataItem } from '@ghostfolio/common/interfaces'; -import { TimelinePosition } from '@ghostfolio/common/models'; +import { PortfolioSnapshotHolding } from '@ghostfolio/common/models'; import { Big } from 'big.js'; import { Transform, Type } from 'class-transformer'; @@ -23,8 +23,8 @@ export class PortfolioSnapshot { historicalData: HistoricalDataItem[]; - @Type(() => TimelinePosition) - positions: TimelinePosition[]; + @Type(() => PortfolioSnapshotHolding) + positions: PortfolioSnapshotHolding[]; @Transform(transformToBig, { toClassOnly: true }) @Type(() => Big)