Browse Source

Task/rename symbol metrics to holding performance (#7912)

Rename types of portfolio calculator to HoldingPerformance, PortfolioCalculatorHolding and PortfolioSnapshotHolding
pull/7914/head
Thomas Kaul 1 week ago
committed by GitHub
parent
commit
afbb37aed7
No known key found for this signature in database GPG Key ID: B5690EEEBB952194
  1. 23
      apps/api/src/app/portfolio/calculator/mwr/portfolio-calculator.ts
  2. 59
      apps/api/src/app/portfolio/calculator/portfolio-calculator.ts
  3. 6
      apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-cash.spec.ts
  4. 54
      apps/api/src/app/portfolio/calculator/roai/portfolio-calculator.ts
  5. 23
      apps/api/src/app/portfolio/calculator/roi/portfolio-calculator.ts
  6. 23
      apps/api/src/app/portfolio/calculator/twr/portfolio-calculator.ts
  7. 8
      apps/api/src/app/portfolio/interfaces/holding-performance.interface.ts
  8. 6
      apps/api/src/app/portfolio/interfaces/portfolio-calculator-holding.interface.ts
  9. 6
      apps/api/src/app/portfolio/interfaces/portfolio-calculator-position.interface.ts
  10. 6
      apps/api/src/app/portfolio/portfolio.service.ts
  11. 2
      libs/common/src/lib/interfaces/index.ts
  12. 4
      libs/common/src/lib/models/index.ts
  13. 2
      libs/common/src/lib/models/portfolio-snapshot-holding.ts
  14. 6
      libs/common/src/lib/models/portfolio-snapshot.ts

23
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;
}
}

59
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;
}

6
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<TimelinePosition>({
expect(position).toMatchObject<PortfolioSnapshotHolding>({
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<Partial<TimelinePosition>>({
expect(position).toMatchObject<Partial<PortfolioSnapshotHolding>>({
currency: 'CHF',
grossPerformance: new Big(0),
grossPerformanceWithCurrencyEffect: new Big(0),

54
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;
}
}

23
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;
}
}

23
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;
}
}

8
libs/common/src/lib/interfaces/symbol-metrics.interface.ts → 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;
}

6
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;
}

6
apps/api/src/app/portfolio/interfaces/portfolio-calculator-position.interface.ts

@ -1,6 +0,0 @@
import { TimelinePosition } from '@ghostfolio/common/models';
export interface PortfolioCalculatorPosition extends TimelinePosition {
includeInHoldings: boolean;
includeInPerformance: boolean;
}

6
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<string, TimelinePosition>;
portfolioItemsNow: Record<string, PortfolioSnapshotHolding>;
userCurrency: string;
userId: string;
withExcludedAccounts?: boolean;

2
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,

4
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 };

2
libs/common/src/lib/models/timeline-position.ts → 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 })

6
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)

Loading…
Cancel
Save