From 07220c20be390bf49b792d374b718d4331b9c500 Mon Sep 17 00:00:00 2001
From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com>
Date: Tue, 6 Oct 2026 20:50:16 +0200
Subject: [PATCH 01/11] Feature/move total return from experimental to general
availability (#7990)
* Move total return from experimental to general availability
* Update changelog
---
CHANGELOG.md | 4 +
README.md | 2 +-
.../src/app/endpoints/mcp/mcp.controller.ts | 2 +-
.../calculator/portfolio-calculator.ts | 140 +++++----------
...calculator-googl-buy-with-dividend.spec.ts | 166 ++++++++++++++++++
...-calculator-googl-fee-and-dividend.spec.ts | 134 ++++++++++++--
...-calculator-msft-buy-with-dividend.spec.ts | 42 ++---
.../calculator/roai/portfolio-calculator.ts | 42 +----
.../holding-performance.interface.ts | 3 +
.../interfaces/holding-valuation.interface.ts | 1 +
.../src/app/portfolio/portfolio.controller.ts | 2 +
.../app/portfolio/portfolio.service.spec.ts | 3 +-
.../src/app/portfolio/portfolio.service.ts | 6 +-
.../portfolio-summary.component.html | 69 ++++----
.../portfolio-summary.component.ts | 30 ----
.../pages/faq/overview/faq-overview-page.html | 4 +-
.../analysis/analysis-page.component.ts | 35 +---
.../portfolio/analysis/analysis-page.html | 84 ++++-----
18 files changed, 451 insertions(+), 318 deletions(-)
create mode 100644 apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-googl-buy-with-dividend.spec.ts
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 117e8e5125..f9ef57d192 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -7,6 +7,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
## Unreleased
+### Changed
+
+- Moved the performance calculation including dividends (total return) from experimental to general availability
+
### Fixed
- Fixed the visibility of the asset class, asset sub class, fee and quantity fields of a valuable in the create activity dialog
diff --git a/README.md b/README.md
index 7c88d99919..95bf3a5ea3 100644
--- a/README.md
+++ b/README.md
@@ -47,7 +47,7 @@ Ghostfolio is for you if you are...
- ✅ Create, update and delete transactions
- ✅ Multi account management
-- ✅ Portfolio performance: Return on Average Investment (ROAI) for `Today`, `WTD`, `MTD`, `YTD`, `1Y`, `5Y`, `Max`
+- ✅ Portfolio performance: Return on Average Investment (ROAI) including dividends (total return) for `Today`, `WTD`, `MTD`, `YTD`, `1Y`, `5Y`, `Max`
- ✅ Various charts
- ✅ Static analysis to identify potential risks in your portfolio
- ✅ Import and export transactions
diff --git a/apps/api/src/app/endpoints/mcp/mcp.controller.ts b/apps/api/src/app/endpoints/mcp/mcp.controller.ts
index 742080498b..71aaeecccd 100644
--- a/apps/api/src/app/endpoints/mcp/mcp.controller.ts
+++ b/apps/api/src/app/endpoints/mcp/mcp.controller.ts
@@ -79,7 +79,7 @@ export class GhostfolioMcpController {
},
description: `Gives the performance of the portfolio in the date range with these columns: ${PortfolioTableService.getPerformanceTableColumnNames().join(
', '
- )}. The asset performance excludes the effect of the exchange rates, the currency performance is that effect, and the net performance is the sum of both in the base currency of the user. Each performance is the return on average investment (ROAI) and excludes the dividends. The accounts and the activities which are excluded from analysis are not part of the performance. The parameters limit the performance to the holdings of the accounts, of the asset classes or of the asset profile.`,
+ )}. The asset performance excludes the effect of the exchange rates, the currency performance is that effect, and the net performance is the sum of both in the base currency of the user. Each performance is the return on average investment (ROAI) and includes the dividends (total return). The accounts and the activities which are excluded from analysis are not part of the performance. The parameters limit the performance to the holdings of the accounts, of the asset classes or of the asset profile.`,
name: 'get-performance',
parameters: GET_PERFORMANCE_PARAMETERS
})
diff --git a/apps/api/src/app/portfolio/calculator/portfolio-calculator.ts b/apps/api/src/app/portfolio/calculator/portfolio-calculator.ts
index b9cb622713..9b94545fd8 100644
--- a/apps/api/src/app/portfolio/calculator/portfolio-calculator.ts
+++ b/apps/api/src/app/portfolio/calculator/portfolio-calculator.ts
@@ -223,19 +223,15 @@ export abstract class PortfolioCalculator {
): PortfolioSnapshot;
protected abstract calculatePerformancePercentages({
- accumulatedValuesByDate,
- holdings
+ accumulatedValuesByDate
}: {
accumulatedValuesByDate: { [date: string]: AccumulatedValues };
- holdings: PortfolioSnapshotHolding[];
}): { [date: string]: PerformancePercentages };
protected abstract calculatePerformancePercentagesForDateRange({
- historicalDataItems,
- holdings
+ historicalDataItems
}: {
historicalDataItems: HistoricalDataItem[];
- holdings: PortfolioSnapshotHolding[];
}): { [date: string]: PerformancePercentages };
@LogPerformance
@@ -381,6 +377,7 @@ export abstract class PortfolioCalculator {
averageInvestmentValuesWithCurrencyEffect: { [date: string]: Big };
currentValues: { [date: string]: Big };
currentValuesWithCurrencyEffect: { [date: string]: Big };
+ dividendValuesWithCurrencyEffect: { [date: string]: Big };
investmentValuesAccumulated: { [date: string]: Big };
investmentValuesAccumulatedWithCurrencyEffect: { [date: string]: Big };
investmentValuesWithCurrencyEffect: { [date: string]: Big };
@@ -416,6 +413,7 @@ export abstract class PortfolioCalculator {
averageInvestmentWithCurrencyEffect,
currentValues,
currentValuesWithCurrencyEffect,
+ dividendValuesWithCurrencyEffect,
dividendYieldPercent,
dividendYieldPercentWithCurrencyEffect,
grossPerformance,
@@ -463,6 +461,7 @@ export abstract class PortfolioCalculator {
averageInvestmentValuesWithCurrencyEffect: {},
currentValues: {},
currentValuesWithCurrencyEffect: {},
+ dividendValuesWithCurrencyEffect: {},
investmentValuesAccumulated: {},
investmentValuesAccumulatedWithCurrencyEffect: {},
investmentValuesWithCurrencyEffect: {},
@@ -475,6 +474,7 @@ export abstract class PortfolioCalculator {
averageInvestmentValuesWithCurrencyEffect,
currentValues,
currentValuesWithCurrencyEffect,
+ dividendValuesWithCurrencyEffect,
investmentValuesAccumulated,
investmentValuesAccumulatedWithCurrencyEffect,
investmentValuesWithCurrencyEffect,
@@ -558,13 +558,6 @@ export abstract class PortfolioCalculator {
}
}
- const totalDividendValueWithCurrencyEffectByDate =
- this.getTotalDividendValueWithCurrencyEffectByDate({
- chartDates,
- exchangeRatesByCurrency,
- holdings: positions
- });
-
const assetProfileIdentifiers = Object.keys(valuesByAssetProfileIdentifier);
for (const dateString of chartDates) {
@@ -579,6 +572,10 @@ export abstract class PortfolioCalculator {
assetProfileValues.currentValuesWithCurrencyEffect?.[dateString] ??
new Big(0);
+ const dividendValueWithCurrencyEffect =
+ assetProfileValues.dividendValuesWithCurrencyEffect?.[dateString] ??
+ new Big(0);
+
const investmentValueAccumulated =
assetProfileValues.investmentValuesAccumulated?.[dateString] ??
new Big(0);
@@ -641,8 +638,10 @@ export abstract class PortfolioCalculator {
accumulatedValuesByDate[dateString]
?.totalCurrentValueWithCurrencyEffect ?? new Big(0)
).add(currentValueWithCurrencyEffect),
- totalDividendValueWithCurrencyEffect:
- totalDividendValueWithCurrencyEffectByDate[dateString],
+ totalDividendValueWithCurrencyEffect: (
+ accumulatedValuesByDate[dateString]
+ ?.totalDividendValueWithCurrencyEffect ?? new Big(0)
+ ).add(dividendValueWithCurrencyEffect),
totalInvestmentValue: (
accumulatedValuesByDate[dateString]?.totalInvestmentValue ??
new Big(0)
@@ -677,8 +676,7 @@ export abstract class PortfolioCalculator {
});
const performancePercentagesByDate = this.calculatePerformancePercentages({
- accumulatedValuesByDate,
- holdings: positionsIncludedInHoldings
+ accumulatedValuesByDate
});
const historicalData: HistoricalDataItem[] = Object.entries(
@@ -880,12 +878,6 @@ export abstract class PortfolioCalculator {
return this.dataProviderInfos;
}
- public async getDividendInBaseCurrency() {
- await this.snapshotPromise;
-
- return this.getDividendInBaseCurrencyOfHoldings(this.snapshot.positions);
- }
-
protected getDividendInBaseCurrencyOfHoldings(
holdings: PortfolioSnapshotHolding[]
) {
@@ -904,6 +896,7 @@ export abstract class PortfolioCalculator {
averageInvestmentWithCurrencyEffect: new Big(0),
currentValues: {},
currentValuesWithCurrencyEffect: {},
+ dividendValuesWithCurrencyEffect: {},
dividendYieldPercent: new Big(0),
dividendYieldPercentWithCurrencyEffect: new Big(0),
grossPerformance: new Big(0),
@@ -969,6 +962,10 @@ export abstract class PortfolioCalculator {
const currentExchangeRate = exchangeRates[format(new Date(), DATE_FORMAT)];
const currentValues: { [date: string]: Big } = {};
const currentValuesWithCurrencyEffect: { [date: string]: Big } = {};
+ const dividendValuesWithCurrencyEffect: { [date: string]: Big } = {};
+ let dividends = new Big(0);
+ let dividendsAtStartDateWithCurrencyEffect = new Big(0);
+ let dividendsWithCurrencyEffect = new Big(0);
let fees = new Big(0);
let feesAtStartDate = new Big(0);
let feesAtStartDateWithCurrencyEffect = new Big(0);
@@ -1211,14 +1208,26 @@ export abstract class PortfolioCalculator {
);
}
+ if (activity.type === 'DIVIDEND') {
+ const dividend = activity.quantity.mul(activity.unitPrice);
+
+ dividends = dividends.plus(dividend.mul(currentExchangeRate ?? 1));
+
+ dividendsWithCurrencyEffect = dividendsWithCurrencyEffect.plus(
+ dividend.mul(exchangeRateAtActivityDate ?? 1)
+ );
+ }
+
const newGrossPerformance = valueOfInvestment
.minus(totalInvestment)
- .plus(grossPerformanceFromSells);
+ .plus(grossPerformanceFromSells)
+ .plus(dividends);
const newGrossPerformanceWithCurrencyEffect =
valueOfInvestmentWithCurrencyEffect
.minus(totalInvestmentWithCurrencyEffect)
- .plus(grossPerformanceFromSellsWithCurrencyEffect);
+ .plus(grossPerformanceFromSellsWithCurrencyEffect)
+ .plus(dividendsWithCurrencyEffect);
grossPerformance = newGrossPerformance;
@@ -1226,6 +1235,7 @@ export abstract class PortfolioCalculator {
newGrossPerformanceWithCurrencyEffect;
if (activity.itemType === 'start') {
+ dividendsAtStartDateWithCurrencyEffect = dividendsWithCurrencyEffect;
feesAtStartDate = fees;
feesAtStartDateWithCurrencyEffect = feesWithCurrencyEffect;
grossPerformanceAtStartDate = grossPerformance;
@@ -1240,6 +1250,11 @@ export abstract class PortfolioCalculator {
currentValuesWithCurrencyEffect[activity.date] =
valueOfInvestmentWithCurrencyEffect;
+ dividendValuesWithCurrencyEffect[activity.date] =
+ dividendsWithCurrencyEffect.minus(
+ dividendsAtStartDateWithCurrencyEffect
+ );
+
netPerformanceValues[activity.date] = grossPerformance
.minus(grossPerformanceAtStartDate)
.minus(fees.minus(feesAtStartDate));
@@ -1313,6 +1328,7 @@ export abstract class PortfolioCalculator {
return {
currentValues,
currentValuesWithCurrencyEffect,
+ dividendValuesWithCurrencyEffect,
initialValue,
investmentValuesAccumulated,
investmentValuesAccumulatedWithCurrencyEffect,
@@ -1422,8 +1438,7 @@ export abstract class PortfolioCalculator {
const performancePercentagesByDate =
this.calculatePerformancePercentagesForDateRange({
- historicalDataItems: historicalDataItemsOfDateRange,
- holdings: this.snapshot.positions
+ historicalDataItems: historicalDataItemsOfDateRange
});
const chart = historicalDataItemsOfDateRange.map((historicalDataItem) => {
@@ -1785,77 +1800,6 @@ export abstract class PortfolioCalculator {
return chartDateMap;
}
- private getTotalDividendValueWithCurrencyEffectByDate({
- chartDates,
- exchangeRatesByCurrency,
- holdings
- }: {
- chartDates: string[];
- exchangeRatesByCurrency: {
- [currencyPair: string]: { [dateString: string]: number };
- };
- holdings: PortfolioCalculatorHolding[];
- }): { [date: string]: Big } {
- // Take the dividend from the same holdings as the portfolio summary, so
- // that the response shows one dividend only
- const assetProfileIdentifiersIncludedInHoldings = new Set(
- holdings
- .filter(({ includeInHoldings }) => {
- return includeInHoldings;
- })
- .map(({ dataSource, symbol }) => {
- return getAssetProfileIdentifier({ dataSource, symbol });
- })
- );
-
- const dividendActivities = this.activities.filter(
- ({ assetProfile, type }) => {
- return (
- type === 'DIVIDEND' &&
- assetProfileIdentifiersIncludedInHoldings.has(
- getAssetProfileIdentifier(assetProfile)
- )
- );
- }
- );
-
- const totalDividendValueWithCurrencyEffectByDate: { [date: string]: Big } =
- {};
-
- let index = 0;
- let totalDividendValueWithCurrencyEffect = new Big(0);
-
- // The activities and the chart dates are sorted by date, so one pass over
- // both gives the dividends received up to each chart date
- for (const chartDate of chartDates) {
- while (
- index < dividendActivities.length &&
- dividendActivities[index].date <= chartDate
- ) {
- const { assetProfile, date, quantity, unitPrice } =
- dividendActivities[index];
-
- totalDividendValueWithCurrencyEffect =
- totalDividendValueWithCurrencyEffect.plus(
- quantity
- .mul(unitPrice)
- .mul(
- exchangeRatesByCurrency[
- `${assetProfile.currency}${this.currency}`
- ]?.[date] ?? 1
- )
- );
-
- index++;
- }
-
- totalDividendValueWithCurrencyEffectByDate[chartDate] =
- totalDividendValueWithCurrencyEffect;
- }
-
- return totalDividendValueWithCurrencyEffectByDate;
- }
-
@LogPerformance
private async initialize(attempt = 1) {
const startTimeTotal = performance.now();
diff --git a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-googl-buy-with-dividend.spec.ts b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-googl-buy-with-dividend.spec.ts
new file mode 100644
index 0000000000..46dbe493bf
--- /dev/null
+++ b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-googl-buy-with-dividend.spec.ts
@@ -0,0 +1,166 @@
+import {
+ activityDummyData,
+ assetProfileDummyData,
+ userDummyData
+} from '@ghostfolio/api/app/portfolio/calculator/portfolio-calculator-test-utils';
+import { PortfolioCalculatorFactory } from '@ghostfolio/api/app/portfolio/calculator/portfolio-calculator.factory';
+import { CurrentRateService } from '@ghostfolio/api/app/portfolio/current-rate.service';
+import { CurrentRateServiceMock } from '@ghostfolio/api/app/portfolio/current-rate.service.mock';
+import { RedisCacheService } from '@ghostfolio/api/app/redis-cache/redis-cache.service';
+import { RedisCacheServiceMock } from '@ghostfolio/api/app/redis-cache/redis-cache.service.mock';
+import { ConfigurationService } from '@ghostfolio/api/services/configuration/configuration.service';
+import { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.service';
+import { ExchangeRateDataServiceMock } from '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.service.mock';
+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 { Activity } from '@ghostfolio/common/interfaces';
+import { PerformanceCalculationType } from '@ghostfolio/common/types/performance-calculation-type.type';
+
+import { Big } from 'big.js';
+
+jest.mock('@ghostfolio/api/app/portfolio/current-rate.service', () => {
+ return {
+ CurrentRateService: jest.fn().mockImplementation(() => {
+ return CurrentRateServiceMock;
+ })
+ };
+});
+
+jest.mock(
+ '@ghostfolio/api/services/queues/portfolio-snapshot/portfolio-snapshot.service',
+ () => {
+ return {
+ PortfolioSnapshotService: jest.fn().mockImplementation(() => {
+ return PortfolioSnapshotServiceMock;
+ })
+ };
+ }
+);
+
+jest.mock('@ghostfolio/api/app/redis-cache/redis-cache.service', () => {
+ return {
+ RedisCacheService: jest.fn().mockImplementation(() => {
+ return RedisCacheServiceMock;
+ })
+ };
+});
+
+jest.mock(
+ '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.service',
+ () => {
+ return {
+ ExchangeRateDataService: jest.fn().mockImplementation(() => {
+ return ExchangeRateDataServiceMock;
+ })
+ };
+ }
+);
+
+describe('PortfolioCalculator', () => {
+ let configurationService: ConfigurationService;
+ let currentRateService: CurrentRateService;
+ let exchangeRateDataService: ExchangeRateDataService;
+ let portfolioCalculatorFactory: PortfolioCalculatorFactory;
+ let portfolioSnapshotService: PortfolioSnapshotService;
+ let redisCacheService: RedisCacheService;
+
+ beforeEach(() => {
+ PortfolioSnapshotServiceMock.reset();
+ RedisCacheServiceMock.reset();
+
+ configurationService = new ConfigurationService();
+
+ currentRateService = new CurrentRateService(null, null, null);
+
+ exchangeRateDataService = new ExchangeRateDataService(
+ null,
+ null,
+ null,
+ null
+ );
+
+ portfolioSnapshotService = new PortfolioSnapshotService(null, null);
+
+ redisCacheService = new RedisCacheService(null, null);
+
+ portfolioCalculatorFactory = new PortfolioCalculatorFactory(
+ configurationService,
+ currentRateService,
+ exchangeRateDataService,
+ portfolioSnapshotService,
+ redisCacheService
+ );
+ });
+
+ describe('get current positions', () => {
+ it('with GOOGL buy and dividend', async () => {
+ jest.useFakeTimers().setSystemTime(parseDate('2023-07-10').getTime());
+
+ const activities: Activity[] = [
+ {
+ ...activityDummyData,
+ assetProfile: {
+ ...assetProfileDummyData,
+ currency: 'USD',
+ dataSource: 'YAHOO',
+ name: 'Alphabet Inc.',
+ symbol: 'GOOGL'
+ },
+ date: new Date('2023-01-03'),
+ feeInAssetProfileCurrency: 1,
+ feeInBaseCurrency: 0.9238,
+ quantity: 1,
+ type: 'BUY',
+ unitPriceInAssetProfileCurrency: 89.12
+ },
+ {
+ ...activityDummyData,
+ assetProfile: {
+ ...assetProfileDummyData,
+ currency: 'USD',
+ dataSource: 'YAHOO',
+ name: 'Alphabet Inc.',
+ symbol: 'GOOGL'
+ },
+ date: new Date('2023-01-03'),
+ feeInAssetProfileCurrency: 0,
+ feeInBaseCurrency: 0,
+ quantity: 1,
+ type: 'DIVIDEND',
+ unitPriceInAssetProfileCurrency: 5
+ }
+ ];
+
+ const portfolioCalculator = portfolioCalculatorFactory.createCalculator({
+ activities,
+ calculationType: PerformanceCalculationType.ROAI,
+ currency: 'CHF',
+ userId: userDummyData.id
+ });
+
+ const portfolioSnapshot = await portfolioCalculator.computeSnapshot();
+
+ // The asset performance takes the dividend at the current exchange rate
+ // (0.8854), the net performance at the exchange rate of the payment date
+ // (0.9238)
+ expect(portfolioSnapshot.positions).toMatchObject([
+ {
+ dividendInBaseCurrency: new Big('5').mul(0.9238),
+ grossPerformance: new Big('32.33').mul(0.8854),
+ grossPerformanceWithCurrencyEffect: new Big('25.394774'),
+ netPerformance: new Big('31.33').mul(0.8854),
+ netPerformanceWithCurrencyEffectMap: {
+ max: new Big('24.470974')
+ }
+ }
+ ]);
+
+ expect(portfolioSnapshot.historicalData.at(-1)).toMatchObject({
+ dividendInBaseCurrency: 4.619,
+ netPerformance: new Big('31.33').mul(0.8854).toNumber(),
+ netPerformanceWithCurrencyEffect: 24.470974
+ });
+ });
+ });
+});
diff --git a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-googl-fee-and-dividend.spec.ts b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-googl-fee-and-dividend.spec.ts
index ab9c24b4fb..18929a680c 100644
--- a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-googl-fee-and-dividend.spec.ts
+++ b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-googl-fee-and-dividend.spec.ts
@@ -122,8 +122,9 @@ describe('PortfolioCalculator', () => {
{
// The first activity of this asset profile is a fee, which is not an
// investment activity. Thus the holding is not included in the
- // holdings of the portfolio summary, and its dividend must not be
- // included in the chart
+ // holdings of the portfolio summary. But its fee and its dividend are
+ // part of the net performance, and thus its dividend is part of the
+ // dividend of the chart
...activityDummyData,
assetProfile: {
...assetProfileDummyData,
@@ -167,8 +168,10 @@ describe('PortfolioCalculator', () => {
const portfolioSnapshot = await portfolioCalculator.computeSnapshot();
- const dividendInBaseCurrency =
- await portfolioCalculator.getDividendInBaseCurrency();
+ const performanceByDateRange = await getPerformanceByDateRange({
+ portfolioCalculator,
+ dateRanges: ['max']
+ });
expect(
portfolioSnapshot.positions.map(({ symbol }) => {
@@ -176,12 +179,22 @@ describe('PortfolioCalculator', () => {
})
).toEqual(['MSFT']);
- // The chart and the portfolio summary must show the same dividend
- expect(dividendInBaseCurrency).toEqual(new Big('0.62'));
+ expect(portfolioSnapshot.historicalData.at(-1)).toMatchObject({
+ dividendInBaseCurrency: 5.62,
+ dividendInPercentageWithCurrencyEffect: 0.01882242615044544,
+ netPerformance: 18.87,
+ netPerformanceInPercentage: 0.06319914260834618
+ });
- expect(
- portfolioSnapshot.historicalData.at(-1).dividendInBaseCurrency
- ).toEqual(0.62);
+ // The portfolio summary takes the dividend of the date range max
+ expect(performanceByDateRange).toMatchObject({
+ max: {
+ dividendInBaseCurrency: 5.62,
+ dividendInPercentageWithCurrencyEffect: 0.01882242615044535,
+ netPerformance: 18.87,
+ netPerformanceInPercentage: 0.06319914260834586
+ }
+ });
});
it('with GOOGL dividend without investment', async () => {
@@ -221,8 +234,8 @@ describe('PortfolioCalculator', () => {
unitPriceInAssetProfileCurrency: 0.62
},
{
- // The holding has a dividend, but no average investment. Thus the
- // dividend percentage stays 0, like the dividend yield
+ // The holding has a dividend, but no average investment. Its dividend
+ // is part of the net performance, and thus of the dividend percentage
...activityDummyData,
assetProfile: {
...assetProfileDummyData,
@@ -261,13 +274,108 @@ describe('PortfolioCalculator', () => {
expect(portfolioSnapshot.historicalData.at(-1)).toMatchObject({
dividendInBaseCurrency: 5.62,
- dividendInPercentageWithCurrencyEffect: 0
+ dividendInPercentageWithCurrencyEffect: 0.01882242615044544,
+ netPerformance: 19.87,
+ netPerformanceInPercentage: 0.06654832875611226
});
expect(performanceByDateRange).toMatchObject({
max: {
dividendInBaseCurrency: 5.62,
- dividendInPercentageWithCurrencyEffect: 0
+ dividendInPercentageWithCurrencyEffect: 0.01882242615044535,
+ netPerformance: 19.87,
+ netPerformanceInPercentage: 0.06654832875611194
+ }
+ });
+ });
+
+ it('with dividend of a holding without market price', async () => {
+ jest.useFakeTimers().setSystemTime(parseDate('2023-07-10').getTime());
+
+ const activities: Activity[] = [
+ {
+ ...activityDummyData,
+ assetProfile: {
+ ...assetProfileDummyData,
+ currency: 'USD',
+ dataSource: 'YAHOO',
+ name: 'Microsoft Inc.',
+ symbol: 'MSFT'
+ },
+ date: new Date('2021-09-16'),
+ feeInAssetProfileCurrency: 19,
+ feeInBaseCurrency: 19,
+ quantity: 1,
+ type: 'BUY',
+ unitPriceInAssetProfileCurrency: 298.58
+ },
+ {
+ ...activityDummyData,
+ assetProfile: {
+ ...assetProfileDummyData,
+ currency: 'USD',
+ dataSource: 'YAHOO',
+ name: 'Microsoft Inc.',
+ symbol: 'MSFT'
+ },
+ date: new Date('2021-11-16'),
+ feeInAssetProfileCurrency: 0,
+ feeInBaseCurrency: 0,
+ quantity: 1,
+ type: 'DIVIDEND',
+ unitPriceInAssetProfileCurrency: 0.62
+ },
+ {
+ // The holding has no market price, thus it has no value. Its dividend
+ // is not part of the net performance (unlike the dividend in the
+ // scenario above), and thus not part of the dividend of the chart
+ ...activityDummyData,
+ assetProfile: {
+ ...assetProfileDummyData,
+ currency: 'USD',
+ dataSource: 'MANUAL',
+ name: 'Private Equity Fund',
+ symbol: '3b5ba4a5-4c8e-4bd5-9b4c-5e0d5e7cfc3f'
+ },
+ date: new Date('2023-07-10'),
+ feeInAssetProfileCurrency: 0,
+ feeInBaseCurrency: 0,
+ quantity: 1,
+ type: 'DIVIDEND',
+ unitPriceInAssetProfileCurrency: 5
+ }
+ ];
+
+ const portfolioCalculator = portfolioCalculatorFactory.createCalculator({
+ activities,
+ calculationType: PerformanceCalculationType.ROAI,
+ currency: 'USD',
+ usePortfolioSnapshotCache: false,
+ userId: userDummyData.id
+ });
+
+ const portfolioSnapshot = await portfolioCalculator.computeSnapshot();
+
+ const performanceByDateRange = await getPerformanceByDateRange({
+ portfolioCalculator,
+ dateRanges: ['max']
+ });
+
+ expect(portfolioSnapshot.hasErrors).toBe(false);
+
+ expect(portfolioSnapshot.historicalData.at(-1)).toMatchObject({
+ dividendInBaseCurrency: 0.62,
+ dividendInPercentageWithCurrencyEffect: 0.0020764954116149776,
+ netPerformance: 14.87,
+ netPerformanceInPercentage: 0.0498023980172818
+ });
+
+ expect(performanceByDateRange).toMatchObject({
+ max: {
+ dividendInBaseCurrency: 0.62,
+ dividendInPercentageWithCurrencyEffect: 0.002076495411614967,
+ netPerformance: 14.87,
+ netPerformanceInPercentage: 0.049802398017281556
}
});
});
diff --git a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-msft-buy-with-dividend.spec.ts b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-msft-buy-with-dividend.spec.ts
index 649542e325..0fdd0b3000 100644
--- a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-msft-buy-with-dividend.spec.ts
+++ b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-msft-buy-with-dividend.spec.ts
@@ -122,25 +122,25 @@ describe('PortfolioCalculator', () => {
'0.001144362748184'
),
fee: new Big('19'),
- grossPerformance: new Big('33.25'),
- grossPerformancePercentage: new Big('0.11136043941322258691'),
+ grossPerformance: new Big('33.87'),
+ grossPerformancePercentage: new Big('0.11343693482483756447'),
grossPerformancePercentageWithCurrencyEffect: new Big(
- '0.11136043941322258691'
+ '0.11343693482483756447'
),
- grossPerformanceWithCurrencyEffect: new Big('33.25'),
+ grossPerformanceWithCurrencyEffect: new Big('33.87'),
investment: new Big('298.58'),
investmentWithCurrencyEffect: new Big('298.58'),
marketPrice: 331.83,
marketPriceInBaseCurrency: 331.83,
- netPerformance: new Big('14.25'),
- netPerformancePercentage: new Big('0.04772590260566682296'),
+ netPerformance: new Big('14.87'),
+ netPerformancePercentage: new Big('0.04980239801728180052'),
netPerformancePercentageWithCurrencyEffectMap: {
- max: new Big('0.04772590260566682296')
+ max: new Big('0.04980239801728180052')
},
netPerformanceWithCurrencyEffectMap: {
'1d': new Big('-5.39'),
- '5y': new Big('14.25'),
- max: new Big('14.25'),
+ '5y': new Big('14.87'),
+ max: new Big('14.87'),
wtd: new Big('-5.39')
},
quantity: new Big('1'),
@@ -167,10 +167,10 @@ describe('PortfolioCalculator', () => {
date: '2023-07-10',
dividendInBaseCurrency: 0,
dividendInPercentageWithCurrencyEffect: 0,
- netPerformance: -5.390000000000001,
- netPerformanceInPercentage: -0.015983630864124312,
- netPerformanceInPercentageWithCurrencyEffect: -0.015983630864124312,
- netPerformanceWithCurrencyEffect: -5.390000000000001,
+ netPerformance: -5.390000000000002,
+ netPerformanceInPercentage: -0.015983630864124316,
+ netPerformanceInPercentageWithCurrencyEffect: -0.015983630864124316,
+ netPerformanceWithCurrencyEffect: -5.390000000000002,
totalInvestmentValueWithCurrencyEffect: 298.58,
valueWithCurrencyEffect: 331.83
},
@@ -178,10 +178,10 @@ describe('PortfolioCalculator', () => {
date: '2023-07-10',
dividendInBaseCurrency: 0.62,
dividendInPercentageWithCurrencyEffect: 0.002076495411614967,
- netPerformance: 14.25,
- netPerformanceInPercentage: 0.04772590260566659,
- netPerformanceInPercentageWithCurrencyEffect: 0.04772590260566659,
- netPerformanceWithCurrencyEffect: 14.25,
+ netPerformance: 14.87,
+ netPerformanceInPercentage: 0.049802398017281556,
+ netPerformanceInPercentageWithCurrencyEffect: 0.049802398017281556,
+ netPerformanceWithCurrencyEffect: 14.87,
totalInvestmentValueWithCurrencyEffect: 298.58,
valueWithCurrencyEffect: 331.83
},
@@ -189,10 +189,10 @@ describe('PortfolioCalculator', () => {
date: '2023-07-10',
dividendInBaseCurrency: 0,
dividendInPercentageWithCurrencyEffect: 0,
- netPerformance: -7.68,
- netPerformanceInPercentage: -0.022620835910577012,
- netPerformanceInPercentageWithCurrencyEffect: -0.022620835910577012,
- netPerformanceWithCurrencyEffect: -7.68,
+ netPerformance: -7.6800000000000015,
+ netPerformanceInPercentage: -0.022620835910577015,
+ netPerformanceInPercentageWithCurrencyEffect: -0.022620835910577015,
+ netPerformanceWithCurrencyEffect: -7.6800000000000015,
totalInvestmentValueWithCurrencyEffect: 298.58,
valueWithCurrencyEffect: 331.83
}
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 c0b7337350..a1e41b53a2 100644
--- a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator.ts
+++ b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator.ts
@@ -17,10 +17,7 @@ import {
AssetProfileIdentifier,
HistoricalDataItem
} from '@ghostfolio/common/interfaces';
-import {
- PortfolioSnapshot,
- PortfolioSnapshotHolding
-} from '@ghostfolio/common/models';
+import { PortfolioSnapshot } from '@ghostfolio/common/models';
import { DateRange } from '@ghostfolio/common/types';
import { PerformanceCalculationType } from '@ghostfolio/common/types/performance-calculation-type.type';
@@ -108,8 +105,6 @@ export class RoaiPortfolioCalculator extends PortfolioCalculator {
? differenceInDays(new Date(), dateOfFirstActivity)
: 0;
- // Take the dividend from the same source as the portfolio summary, so
- // that the response shows one dividend only
const totalDividendInBaseCurrency =
this.getDividendInBaseCurrencyOfHoldings(positions);
@@ -168,15 +163,10 @@ export class RoaiPortfolioCalculator extends PortfolioCalculator {
}
protected calculatePerformancePercentages({
- accumulatedValuesByDate,
- holdings
+ accumulatedValuesByDate
}: {
accumulatedValuesByDate: { [date: string]: AccumulatedValues };
- holdings: PortfolioSnapshotHolding[];
}): { [date: string]: PerformancePercentages } {
- const hasDividendWithoutAverageInvestment =
- this.hasDividendWithoutAverageInvestment(holdings);
-
const performancePercentagesByDate: {
[date: string]: PerformancePercentages;
} = {};
@@ -193,7 +183,6 @@ export class RoaiPortfolioCalculator extends PortfolioCalculator {
] of Object.entries(accumulatedValuesByDate)) {
performancePercentagesByDate[date] = {
dividendInPercentageWithCurrencyEffect:
- hasDividendWithoutAverageInvestment ||
totalAverageInvestmentValueWithCurrencyEffect.eq(0)
? 0
: totalDividendValueWithCurrencyEffect
@@ -217,15 +206,10 @@ export class RoaiPortfolioCalculator extends PortfolioCalculator {
}
protected calculatePerformancePercentagesForDateRange({
- historicalDataItems,
- holdings
+ historicalDataItems
}: {
historicalDataItems: HistoricalDataItem[];
- holdings: PortfolioSnapshotHolding[];
}): { [date: string]: PerformancePercentages } {
- const hasDividendWithoutAverageInvestment =
- this.hasDividendWithoutAverageInvestment(holdings);
-
const averageInvestmentValues: number[] = [];
const averageInvestmentValuesWithCurrencyEffect: number[] = [];
let grossPerformanceAtStartDate: number;
@@ -276,7 +260,6 @@ export class RoaiPortfolioCalculator extends PortfolioCalculator {
performancePercentagesByDate[historicalDataItem.date] = {
dividendInPercentageWithCurrencyEffect:
- !hasDividendWithoutAverageInvestment &&
averageInvestmentValueWithCurrencyEffect > 0
? historicalDataItem.dividendInBaseCurrency /
averageInvestmentValueWithCurrencyEffect
@@ -403,6 +386,7 @@ export class RoaiPortfolioCalculator extends PortfolioCalculator {
const {
currentValues,
currentValuesWithCurrencyEffect,
+ dividendValuesWithCurrencyEffect,
initialValue,
investmentValuesAccumulated,
investmentValuesAccumulatedWithCurrencyEffect,
@@ -736,6 +720,7 @@ export class RoaiPortfolioCalculator extends PortfolioCalculator {
averageInvestmentValuesWithCurrencyEffect,
currentValues,
currentValuesWithCurrencyEffect,
+ dividendValuesWithCurrencyEffect,
dividendYieldPercent,
dividendYieldPercentWithCurrencyEffect,
grossPerformancePercentage,
@@ -768,21 +753,4 @@ export class RoaiPortfolioCalculator extends PortfolioCalculator {
protected getPerformanceCalculationType() {
return PerformanceCalculationType.ROAI;
}
-
- private hasDividendWithoutAverageInvestment(
- holdings: PortfolioSnapshotHolding[]
- ) {
- // A holding with a dividend only (without a buy activity), and a holding
- // without a market price, gives a dividend but no average investment.
- // Such a holding makes the dividend percentage too high. Therefore the
- // dividend percentage stays 0 in this case, like the dividend yield.
- return holdings.some(
- ({ averageInvestmentWithCurrencyEffect, dividendInBaseCurrency }) => {
- return (
- !dividendInBaseCurrency.eq(0) &&
- averageInvestmentWithCurrencyEffect.eq(0)
- );
- }
- );
- }
}
diff --git a/apps/api/src/app/portfolio/interfaces/holding-performance.interface.ts b/apps/api/src/app/portfolio/interfaces/holding-performance.interface.ts
index 0c35ab96be..61da17e71a 100644
--- a/apps/api/src/app/portfolio/interfaces/holding-performance.interface.ts
+++ b/apps/api/src/app/portfolio/interfaces/holding-performance.interface.ts
@@ -17,6 +17,9 @@ export interface HoldingPerformance {
currentValuesWithCurrencyEffect: {
[date: string]: Big;
};
+ dividendValuesWithCurrencyEffect: {
+ [date: string]: Big;
+ };
dividendYieldPercent: Big;
dividendYieldPercentWithCurrencyEffect: Big;
grossPerformance: Big;
diff --git a/apps/api/src/app/portfolio/interfaces/holding-valuation.interface.ts b/apps/api/src/app/portfolio/interfaces/holding-valuation.interface.ts
index 9e13fb70b4..06ae50005d 100644
--- a/apps/api/src/app/portfolio/interfaces/holding-valuation.interface.ts
+++ b/apps/api/src/app/portfolio/interfaces/holding-valuation.interface.ts
@@ -5,6 +5,7 @@ import { HoldingValuationItem } from './holding-valuation-item.interface';
export interface HoldingValuation {
currentValues: { [date: string]: Big };
currentValuesWithCurrencyEffect: { [date: string]: Big };
+ dividendValuesWithCurrencyEffect: { [date: string]: Big };
initialValue?: Big;
investmentValuesAccumulated: { [date: string]: Big };
investmentValuesAccumulatedWithCurrencyEffect: { [date: string]: Big };
diff --git a/apps/api/src/app/portfolio/portfolio.controller.ts b/apps/api/src/app/portfolio/portfolio.controller.ts
index 45b7477e8b..588bb6df17 100644
--- a/apps/api/src/app/portfolio/portfolio.controller.ts
+++ b/apps/api/src/app/portfolio/portfolio.controller.ts
@@ -524,6 +524,7 @@ export class PortfolioController {
performanceInformation.chart = performanceInformation.chart.map(
({
date,
+ dividendInPercentageWithCurrencyEffect,
netPerformanceInPercentage,
netPerformanceInPercentageWithCurrencyEffect,
netWorth,
@@ -532,6 +533,7 @@ export class PortfolioController {
}) => {
return {
date,
+ dividendInPercentageWithCurrencyEffect,
netPerformanceInPercentage,
netPerformanceInPercentageWithCurrencyEffect,
netWorthInPercentage:
diff --git a/apps/api/src/app/portfolio/portfolio.service.spec.ts b/apps/api/src/app/portfolio/portfolio.service.spec.ts
index 623f006eb7..c1dcbf8f53 100644
--- a/apps/api/src/app/portfolio/portfolio.service.spec.ts
+++ b/apps/api/src/app/portfolio/portfolio.service.spec.ts
@@ -865,7 +865,6 @@ describe('PortfolioService', () => {
function createPortfolioCalculator() {
return {
- getDividendInBaseCurrency: jest.fn().mockResolvedValue(new Big(0)),
getFeesInBaseCurrency: jest.fn().mockResolvedValue(new Big(0)),
getInterestInBaseCurrency: jest.fn().mockResolvedValue(new Big(0)),
getLiabilitiesInBaseCurrency: jest.fn().mockResolvedValue(new Big(0)),
@@ -891,6 +890,7 @@ describe('PortfolioService', () => {
jest.spyOn(portfolioService, 'getPerformance').mockResolvedValue({
performance: {
currentValueInBaseCurrency: 3000,
+ dividendInBaseCurrency: 50,
netPerformance: 500,
netPerformancePercentage: 0.2,
netPerformancePercentageWithCurrencyEffect: 0.2,
@@ -926,6 +926,7 @@ describe('PortfolioService', () => {
});
expect(summary.cash).toBe(1000);
+ expect(summary.dividendInBaseCurrency).toBe(50);
expect(summary.emergencyFund.total).toBe(0);
expect(summary.excludedAccountsAndActivities).toBe(0);
expect(summary.totalAssetsInBaseCurrency).toBe(3000);
diff --git a/apps/api/src/app/portfolio/portfolio.service.ts b/apps/api/src/app/portfolio/portfolio.service.ts
index 17beb67793..00de213d08 100644
--- a/apps/api/src/app/portfolio/portfolio.service.ts
+++ b/apps/api/src/app/portfolio/portfolio.service.ts
@@ -2140,6 +2140,7 @@ export class PortfolioService {
const {
currentValueInBaseCurrency,
+ dividendInBaseCurrency,
dividendPercentageWithCurrencyEffect,
netPerformance,
netPerformancePercentage,
@@ -2154,9 +2155,6 @@ export class PortfolioService {
const dateOfFirstActivity = portfolioCalculator.getStartDate();
- const dividendInBaseCurrency =
- await portfolioCalculator.getDividendInBaseCurrency();
-
const fees = await portfolioCalculator.getFeesInBaseCurrency();
const interest = await portfolioCalculator.getInterestInBaseCurrency();
@@ -2237,6 +2235,7 @@ export class PortfolioService {
cash,
currentValueInBaseCurrency,
dateOfFirstActivity,
+ dividendInBaseCurrency,
dividendPercentageWithCurrencyEffect,
excludedAccountsAndActivities,
netPerformance,
@@ -2248,7 +2247,6 @@ export class PortfolioService {
activityCount: activities.filter(({ type }) => {
return ['BUY', 'SELL'].includes(type);
}).length,
- dividendInBaseCurrency: dividendInBaseCurrency.toNumber(),
// TODO: Remove the fallback to 0 with the next release, when each
// cached portfolio snapshot contains the dividend yield
dividendYieldPercent: dividendYieldPercent?.toNumber() ?? 0,
diff --git a/apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html b/apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
index 0a0beba910..3f84d81bf6 100644
--- a/apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
+++ b/apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
@@ -98,25 +98,20 @@
/>
- @if (user?.settings?.isExperimentalFeatures) {
-
-
Dividend
-
- @if (isNumber(summary?.dividendInBaseCurrency)) {
- +
- }
-
-
+
+
thereof Dividend
+
+
- }
+
Fees
@@ -147,7 +142,7 @@
[locale]="locale"
[precision]="precision"
[unit]="displayedCurrency"
- [value]="netPerformanceWithCurrencyEffect"
+ [value]="summary?.netPerformanceWithCurrencyEffect"
/>
@@ -160,7 +155,8 @@
) {
(ROAI)
}
@@ -173,7 +169,22 @@
[isLoading]="isLoading"
[isPercent]="true"
[locale]="locale"
- [value]="netPerformancePercentageWithCurrencyEffect"
+ [value]="summary?.netPerformancePercentageWithCurrencyEffect"
+ />
+
+
+
+
+ thereof Dividend Performance
+
+
+
@@ -506,20 +517,4 @@
/>
- @if (!user?.settings?.isExperimentalFeatures) {
-
- }
diff --git a/apps/client/src/app/components/portfolio-summary/portfolio-summary.component.ts b/apps/client/src/app/components/portfolio-summary/portfolio-summary.component.ts
index 6b10d7d271..6dea74eb5d 100644
--- a/apps/client/src/app/components/portfolio-summary/portfolio-summary.component.ts
+++ b/apps/client/src/app/components/portfolio-summary/portfolio-summary.component.ts
@@ -137,36 +137,6 @@ export class GfPortfolioSummaryComponent implements OnChanges {
);
}
- protected get netPerformancePercentageWithCurrencyEffect() {
- if (
- !this.user?.settings?.isExperimentalFeatures ||
- !isNumber(this.summary?.netPerformancePercentageWithCurrencyEffect)
- ) {
- return this.summary?.netPerformancePercentageWithCurrencyEffect;
- }
-
- // Include the dividends (total return)
- return (
- this.summary.netPerformancePercentageWithCurrencyEffect +
- (this.summary.dividendPercentageWithCurrencyEffect ?? 0)
- );
- }
-
- protected get netPerformanceWithCurrencyEffect() {
- if (
- !this.user?.settings?.isExperimentalFeatures ||
- !isNumber(this.summary?.netPerformanceWithCurrencyEffect)
- ) {
- return this.summary?.netPerformanceWithCurrencyEffect;
- }
-
- // Include the dividends (total return)
- return (
- this.summary.netPerformanceWithCurrencyEffect +
- this.summary.dividendInBaseCurrency
- );
- }
-
public ngOnChanges() {
if (this.summary) {
if (
diff --git a/apps/client/src/app/pages/faq/overview/faq-overview-page.html b/apps/client/src/app/pages/faq/overview/faq-overview-page.html
index 77c23789e6..66b416fbab 100644
--- a/apps/client/src/app/pages/faq/overview/faq-overview-page.html
+++ b/apps/client/src/app/pages/faq/overview/faq-overview-page.html
@@ -52,8 +52,8 @@
calculation method based on the average amount of capital invested
over time. ROAI aims to provide a more insightful view of investment
performance than simpler approaches, especially when contributions are
- made over time. Dividends are not part of the
- calculation.
diff --git a/apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts b/apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts
index a08c9d9d52..5629965006 100644
--- a/apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts
+++ b/apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts
@@ -133,36 +133,6 @@ export class GfAnalysisPageComponent implements OnInit {
addIcons({ copyOutline, ellipsisVertical });
}
- protected get netPerformancePercentageWithCurrencyEffect() {
- if (
- !this.user?.settings?.isExperimentalFeatures ||
- !isNumber(this.performance?.netPerformancePercentageWithCurrencyEffect)
- ) {
- return this.performance?.netPerformancePercentageWithCurrencyEffect;
- }
-
- // Include the dividends (total return)
- return (
- this.performance.netPerformancePercentageWithCurrencyEffect +
- (this.performance.dividendPercentageWithCurrencyEffect ?? 0)
- );
- }
-
- protected get netPerformanceWithCurrencyEffect() {
- if (
- !this.user?.settings?.isExperimentalFeatures ||
- !isNumber(this.performance?.netPerformanceWithCurrencyEffect)
- ) {
- return this.performance?.netPerformanceWithCurrencyEffect;
- }
-
- // Include the dividends (total return)
- return (
- this.performance.netPerformanceWithCurrencyEffect +
- this.performance.dividendInBaseCurrency
- );
- }
-
get savingsRate() {
if (!this.savingsRatePerMonth) {
return undefined;
@@ -363,6 +333,7 @@ export class GfAnalysisPageComponent implements OnInit {
index,
{
date,
+ dividendInPercentageWithCurrencyEffect,
netPerformanceInPercentageWithCurrencyEffect,
totalInvestmentValueWithCurrencyEffect,
valueInPercentage,
@@ -393,7 +364,9 @@ export class GfAnalysisPageComponent implements OnInit {
if (isNumber(netPerformanceInPercentageWithCurrencyEffect)) {
this.performanceDataItemsInPercentage.push({
date,
- value: netPerformanceInPercentageWithCurrencyEffect
+ value:
+ netPerformanceInPercentageWithCurrencyEffect -
+ (dividendInPercentageWithCurrencyEffect ?? 0)
});
}
}
diff --git a/apps/client/src/app/pages/portfolio/analysis/analysis-page.html b/apps/client/src/app/pages/portfolio/analysis/analysis-page.html
index e05d29c414..96dfe24c45 100644
--- a/apps/client/src/app/pages/portfolio/analysis/analysis-page.html
+++ b/apps/client/src/app/pages/portfolio/analysis/analysis-page.html
@@ -187,45 +187,6 @@
/>
- @if (user?.settings?.isExperimentalFeatures) {
-
-
- Absolute Dividend Performance
- @if (user?.subscription?.type === 'Basic') {
-
- }
-
-
-
-
-
-
-
- Dividend Performance
-
-
-
-
-
- }
@@ -299,7 +260,8 @@
) {
(ROAI)
}
@@ -312,7 +274,45 @@
[isLoading]="isLoadingInvestmentChart"
[isPercent]="true"
[locale]="user?.settings?.locale"
- [value]="netPerformancePercentageWithCurrencyEffect"
+ [value]="
+ performance?.netPerformancePercentageWithCurrencyEffect
+ "
+ />
+
+
+
+
+ thereof Dividend
+ @if (user?.subscription?.type === 'Basic') {
+
+ }
+
+
+
+
+
+
+
+ thereof Dividend Performance
+
+
+
From 9a20e1389843710be421f5effe6c45120840db2c Mon Sep 17 00:00:00 2001
From: "github-actions[bot]"
<41898282+github-actions[bot]@users.noreply.github.com>
Date: Tue, 6 Oct 2026 20:53:29 +0200
Subject: [PATCH 02/11] Task/update locales (#8045)
Co-authored-by: github-actions[bot]
---
apps/client/src/locales/messages.ca.xlf | 180 +++++++++++++-----------
apps/client/src/locales/messages.de.xlf | 180 +++++++++++++-----------
apps/client/src/locales/messages.es.xlf | 180 +++++++++++++-----------
apps/client/src/locales/messages.fr.xlf | 180 +++++++++++++-----------
apps/client/src/locales/messages.it.xlf | 180 +++++++++++++-----------
apps/client/src/locales/messages.ja.xlf | 180 +++++++++++++-----------
apps/client/src/locales/messages.ko.xlf | 180 +++++++++++++-----------
apps/client/src/locales/messages.nl.xlf | 180 +++++++++++++-----------
apps/client/src/locales/messages.pl.xlf | 180 +++++++++++++-----------
apps/client/src/locales/messages.pt.xlf | 180 +++++++++++++-----------
apps/client/src/locales/messages.tr.xlf | 180 +++++++++++++-----------
apps/client/src/locales/messages.uk.xlf | 180 +++++++++++++-----------
apps/client/src/locales/messages.xlf | 175 ++++++++++++-----------
apps/client/src/locales/messages.zh.xlf | 180 +++++++++++++-----------
14 files changed, 1341 insertions(+), 1174 deletions(-)
diff --git a/apps/client/src/locales/messages.ca.xlf b/apps/client/src/locales/messages.ca.xlf
index 8fa63a4dc4..ab4aee47a5 100644
--- a/apps/client/src/locales/messages.ca.xlf
+++ b/apps/client/src/locales/messages.ca.xlf
@@ -1039,7 +1039,7 @@
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 235
+ 233
libs/ui/src/lib/holdings-table/holdings-table.component.html
@@ -1207,7 +1207,7 @@
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 285
+ 283
@@ -1223,7 +1223,7 @@
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 299
+ 297
apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html
@@ -1243,7 +1243,7 @@
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 305
+ 303
apps/client/src/app/pages/public/public-page.html
@@ -1263,7 +1263,7 @@
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 317
+ 315
@@ -1459,7 +1459,7 @@
Està segur qeu vol eliminar aquest cupó?
apps/client/src/app/components/admin-overview/admin-overview.component.ts
- 227
+ 228
@@ -1467,7 +1467,7 @@
Està segur que vol eliminar aquest missatge del sistema?
apps/client/src/app/components/admin-overview/admin-overview.component.ts
- 240
+ 241
@@ -1475,7 +1475,7 @@
Està segur que vol depurar el cache?
apps/client/src/app/components/admin-overview/admin-overview.component.ts
- 270
+ 271
@@ -1483,7 +1483,7 @@
Si us plau, afegeixi el seu missatge del sistema:
apps/client/src/app/components/admin-overview/admin-overview.component.ts
- 290
+ 291
@@ -1499,7 +1499,7 @@
per Usuari
apps/client/src/app/components/admin-overview/admin-overview.component.ts
- 176
+ 177
@@ -1679,7 +1679,7 @@
La memòria cau s’ha buidat.
apps/client/src/app/components/admin-overview/admin-overview.component.ts
- 261
+ 262
@@ -1991,7 +1991,7 @@
Rendiment del Dividend
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 210
+ 208
@@ -1999,11 +1999,11 @@
Comissions
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 223
+ 221
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 121
+ 116
@@ -2015,7 +2015,7 @@
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 246
+ 244
@@ -2023,7 +2023,7 @@
Informar d’un Problema amb les Dades
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 480
+ 478
@@ -2391,11 +2391,11 @@
Rendiment net absolut
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 141
+ 136
apps/client/src/app/pages/portfolio/analysis/analysis-page.html
- 279
+ 240
@@ -2403,11 +2403,11 @@
Rendiment net
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 156
+ 151
apps/client/src/app/pages/portfolio/analysis/analysis-page.html
- 295
+ 256
@@ -2415,7 +2415,7 @@
Actius totals
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 184
+ 195
@@ -2423,7 +2423,7 @@
Poder adquisitiu
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 324
+ 335
@@ -2431,7 +2431,7 @@
Exclòs de l’anàlisi
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 356
+ 367
@@ -2439,7 +2439,7 @@
Passius
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 387
+ 398
apps/client/src/app/pages/features/features-page.html
@@ -2451,7 +2451,7 @@
Valor net
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 407
+ 418
@@ -2459,7 +2459,7 @@
Rendiment anualitzat
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 422
+ 433
@@ -2467,7 +2467,7 @@
Definiu l’import del vostre fons d’emergència.
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.ts
- 204
+ 174
@@ -3051,7 +3051,7 @@
Investments
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 246
+ 257
@@ -3311,7 +3311,7 @@
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 411
+ 409
apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html
@@ -3427,7 +3427,7 @@
Dades de mercat
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 431
+ 429
libs/common/src/lib/routes/routes.ts
@@ -3896,7 +3896,7 @@
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 215
+ 226
apps/client/src/app/pages/public/public-page.html
@@ -4664,11 +4664,11 @@
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 248
+ 246
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 376
+ 374
apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html
@@ -4747,6 +4747,18 @@
73
+
+ thereof Dividend Performance
+ thereof Dividend Performance
+
+ apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
+ 178
+
+
+ apps/client/src/app/pages/portfolio/analysis/analysis-page.html
+ 306
+
+
Update Cash Balance
Actualitzar el saldo d’efectiu
@@ -4867,14 +4879,6 @@
71
-
- Dividend Performance
- Dividend Performance
-
- apps/client/src/app/pages/portfolio/analysis/analysis-page.html
- 214
-
-
Choose or drop a file here
Trieu o deixeu anar un fitxer aquí
@@ -5164,15 +5168,7 @@
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 199
-
-
- apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 103
-
-
- apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 511
+ 197
apps/client/src/app/pages/features/features-page.html
@@ -5240,7 +5236,7 @@
Close Holding
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 467
+ 465
@@ -5264,7 +5260,7 @@
Rendiment absolut de la moneda
apps/client/src/app/pages/portfolio/analysis/analysis-page.html
- 233
+ 194
@@ -5272,7 +5268,7 @@
Rendiment de la moneda
apps/client/src/app/pages/portfolio/analysis/analysis-page.html
- 257
+ 218
@@ -5813,7 +5809,7 @@
Coupon has been created
apps/client/src/app/components/admin-overview/admin-overview.component.ts
- 209
+ 210
@@ -6085,7 +6081,7 @@
Realment voleu eliminar el saldo d’aquest compte?
libs/ui/src/lib/account-balances/account-balances.component.ts
- 127
+ 134
@@ -6409,7 +6405,7 @@
Dipòsit
libs/ui/src/lib/fire-calculator/fire-calculator.component.ts
- 444
+ 446
@@ -6421,11 +6417,11 @@
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 496
+ 507
libs/ui/src/lib/fire-calculator/fire-calculator.component.ts
- 454
+ 456
libs/ui/src/lib/i18n.ts
@@ -6437,7 +6433,7 @@
Estalvi
libs/ui/src/lib/fire-calculator/fire-calculator.component.ts
- 464
+ 466
@@ -6521,7 +6517,7 @@
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 259
+ 257
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
@@ -6553,7 +6549,7 @@
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 268
+ 266
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
@@ -6601,15 +6597,15 @@
Fons d’emergència
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 261
+ 272
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 339
+ 350
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 441
+ 452
apps/client/src/app/pages/features/features-page.html
@@ -6753,7 +6749,7 @@
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 337
+ 335
libs/ui/src/lib/i18n.ts
@@ -6885,7 +6881,7 @@
Efectiu
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 293
+ 304
@@ -6912,14 +6908,6 @@
78
-
- Absolute Dividend Performance
- Absolute Dividend Performance
-
- apps/client/src/app/pages/portfolio/analysis/analysis-page.html
- 195
-
-
Africa
Àfrica
@@ -7404,6 +7392,18 @@
15
+
+ thereof Dividend
+ thereof Dividend
+
+ apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
+ 102
+
+
+ apps/client/src/app/pages/portfolio/analysis/analysis-page.html
+ 287
+
+
Close
Close
@@ -7565,11 +7565,11 @@
has been copied to the clipboard
apps/client/src/app/components/admin-overview/admin-overview.component.ts
- 208
+ 209
libs/ui/src/lib/value/value.component.ts
- 202
+ 205
@@ -8015,7 +8015,7 @@
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.ts
- 202
+ 172
apps/client/src/app/components/rule/rule-settings-dialog/rule-settings-dialog.html
@@ -8095,7 +8095,7 @@
AI prompt has been copied to the clipboard
apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts
- 237
+ 207
@@ -8183,7 +8183,7 @@
Open Duck.ai
apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts
- 238
+ 208
@@ -8203,7 +8203,7 @@
libs/ui/src/lib/treemap-chart/treemap-chart.component.ts
- 423
+ 430
@@ -8243,11 +8243,11 @@
libs/ui/src/lib/treemap-chart/treemap-chart.component.ts
- 423
+ 430
libs/ui/src/lib/treemap-chart/treemap-chart.component.ts
- 436
+ 445
@@ -8565,7 +8565,7 @@
Demo user account has been synced.
apps/client/src/app/components/admin-overview/admin-overview.component.ts
- 314
+ 315
@@ -9040,7 +9040,7 @@
Manage Asset Profile
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 495
+ 493
@@ -9151,6 +9151,18 @@
181
+
+ Return on Average Investment (total return with dividends)
+ Return on Average Investment (total return with dividends)
+
+ apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
+ 159
+
+
+ apps/client/src/app/pages/portfolio/analysis/analysis-page.html
+ 264
+
+
No results found...
No results found...
diff --git a/apps/client/src/locales/messages.de.xlf b/apps/client/src/locales/messages.de.xlf
index fabe62f3f2..e370a737f6 100644
--- a/apps/client/src/locales/messages.de.xlf
+++ b/apps/client/src/locales/messages.de.xlf
@@ -566,7 +566,7 @@
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 235
+ 233
libs/ui/src/lib/holdings-table/holdings-table.component.html
@@ -590,7 +590,7 @@
Möchtest du diesen Gutscheincode wirklich löschen?
apps/client/src/app/components/admin-overview/admin-overview.component.ts
- 227
+ 228
@@ -598,7 +598,7 @@
Möchtest du den Cache wirklich leeren?
apps/client/src/app/components/admin-overview/admin-overview.component.ts
- 270
+ 271
@@ -606,7 +606,7 @@
Bitte gebe deine Systemmeldung ein:
apps/client/src/app/components/admin-overview/admin-overview.component.ts
- 290
+ 291
@@ -614,7 +614,7 @@
pro Benutzer
apps/client/src/app/components/admin-overview/admin-overview.component.ts
- 176
+ 177
@@ -1050,11 +1050,11 @@
Absolute Netto Performance
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 141
+ 136
apps/client/src/app/pages/portfolio/analysis/analysis-page.html
- 279
+ 240
@@ -1062,11 +1062,11 @@
Netto Performance
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 156
+ 151
apps/client/src/app/pages/portfolio/analysis/analysis-page.html
- 295
+ 256
@@ -1074,7 +1074,7 @@
Gesamtanlagevermögen
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 184
+ 195
@@ -1082,7 +1082,7 @@
Kaufkraft
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 324
+ 335
@@ -1090,7 +1090,7 @@
Gesamtvermögen
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 407
+ 418
@@ -1098,7 +1098,7 @@
Performance pro Jahr
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 422
+ 433
@@ -1106,7 +1106,7 @@
Bitte setze den Betrag deines Notfallfonds.
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.ts
- 204
+ 174
@@ -1122,7 +1122,7 @@
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 305
+ 303
apps/client/src/app/pages/public/public-page.html
@@ -1142,7 +1142,7 @@
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 317
+ 315
@@ -1166,7 +1166,7 @@
Datenfehler melden
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 480
+ 478
@@ -1578,7 +1578,7 @@
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 411
+ 409
apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html
@@ -2142,7 +2142,7 @@
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 215
+ 226
apps/client/src/app/pages/public/public-page.html
@@ -2326,11 +2326,11 @@
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 248
+ 246
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 376
+ 374
apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html
@@ -2730,7 +2730,7 @@
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 285
+ 283
@@ -2746,7 +2746,7 @@
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 299
+ 297
apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html
@@ -2826,7 +2826,7 @@
Einlage
libs/ui/src/lib/fire-calculator/fire-calculator.component.ts
- 444
+ 446
@@ -2838,11 +2838,11 @@
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 496
+ 507
libs/ui/src/lib/fire-calculator/fire-calculator.component.ts
- 454
+ 456
libs/ui/src/lib/i18n.ts
@@ -2854,7 +2854,7 @@
Ersparnisse
libs/ui/src/lib/fire-calculator/fire-calculator.component.ts
- 464
+ 466
@@ -2994,7 +2994,7 @@
Von der Analyse ausgenommen
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 356
+ 367
@@ -3130,7 +3130,7 @@
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 259
+ 257
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
@@ -3166,7 +3166,7 @@
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 337
+ 335
libs/ui/src/lib/i18n.ts
@@ -3198,7 +3198,7 @@
Bargeld
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 293
+ 304
@@ -3230,15 +3230,15 @@
Notfallfonds
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 261
+ 272
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 339
+ 350
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 441
+ 452
apps/client/src/app/pages/features/features-page.html
@@ -3301,14 +3301,6 @@
79
-
- Absolute Dividend Performance
- Absolute Dividendenperformance
-
- apps/client/src/app/pages/portfolio/analysis/analysis-page.html
- 195
-
-
Africa
Afrika
@@ -3494,15 +3486,7 @@
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 199
-
-
- apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 103
-
-
- apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 511
+ 197
apps/client/src/app/pages/features/features-page.html
@@ -3546,7 +3530,7 @@
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 268
+ 266
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
@@ -3594,7 +3578,7 @@
Marktdaten
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 431
+ 429
libs/common/src/lib/routes/routes.ts
@@ -3661,14 +3645,6 @@
71
-
- Dividend Performance
- Dividendenperformance
-
- apps/client/src/app/pages/portfolio/analysis/analysis-page.html
- 214
-
-
Yearly
Jährlich
@@ -3790,7 +3766,7 @@
Investitionen
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 246
+ 257
@@ -4066,11 +4042,11 @@
Gebühren
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 223
+ 221
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 121
+ 116
@@ -4298,7 +4274,7 @@
Der Cache wurde geleert.
apps/client/src/app/components/admin-overview/admin-overview.component.ts
- 261
+ 262
@@ -4353,6 +4329,18 @@
232
+
+ thereof Dividend Performance
+ thereof Dividend Performance
+
+ apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
+ 178
+
+
+ apps/client/src/app/pages/portfolio/analysis/analysis-page.html
+ 306
+
+
Update Cash Balance
Cash-Bestand aktualisieren
@@ -4546,7 +4534,7 @@
Verbindlichkeiten
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 387
+ 398
apps/client/src/app/pages/features/features-page.html
@@ -4814,7 +4802,7 @@
Gutschein wurde erstellt
apps/client/src/app/components/admin-overview/admin-overview.component.ts
- 209
+ 210
@@ -6456,7 +6444,7 @@
Möchtest du diese Systemmeldung wirklich löschen?
apps/client/src/app/components/admin-overview/admin-overview.component.ts
- 240
+ 241
@@ -6508,7 +6496,7 @@
Möchtest du diesen Cash-Bestand wirklich löschen?
libs/ui/src/lib/account-balances/account-balances.component.ts
- 127
+ 134
@@ -6624,7 +6612,7 @@
Position abschliessen
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 467
+ 465
@@ -6648,7 +6636,7 @@
Absolute Währungsperformance
apps/client/src/app/pages/portfolio/analysis/analysis-page.html
- 233
+ 194
@@ -6656,7 +6644,7 @@
Währungsperformance
apps/client/src/app/pages/portfolio/analysis/analysis-page.html
- 257
+ 218
@@ -6909,7 +6897,7 @@
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 246
+ 244
@@ -6917,7 +6905,7 @@
Dividendenrendite
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 210
+ 208
@@ -7428,6 +7416,18 @@
15
+
+ thereof Dividend
+ thereof Dividend
+
+ apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
+ 102
+
+
+ apps/client/src/app/pages/portfolio/analysis/analysis-page.html
+ 287
+
+
Close
Schliessen
@@ -7589,11 +7589,11 @@
wurde in die Zwischenablage kopiert
apps/client/src/app/components/admin-overview/admin-overview.component.ts
- 208
+ 209
libs/ui/src/lib/value/value.component.ts
- 202
+ 205
@@ -8039,7 +8039,7 @@
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.ts
- 202
+ 172
apps/client/src/app/components/rule/rule-settings-dialog/rule-settings-dialog.html
@@ -8119,7 +8119,7 @@
KI-Anweisung wurde in die Zwischenablage kopiert
apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts
- 237
+ 207
@@ -8207,7 +8207,7 @@
Öffne Duck.ai
apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts
- 238
+ 208
@@ -8227,7 +8227,7 @@
libs/ui/src/lib/treemap-chart/treemap-chart.component.ts
- 423
+ 430
@@ -8267,11 +8267,11 @@
libs/ui/src/lib/treemap-chart/treemap-chart.component.ts
- 423
+ 430
libs/ui/src/lib/treemap-chart/treemap-chart.component.ts
- 436
+ 445
@@ -8565,7 +8565,7 @@
Demo Benutzerkonto wurde synchronisiert.
apps/client/src/app/components/admin-overview/admin-overview.component.ts
- 314
+ 315
@@ -9040,7 +9040,7 @@
Anlageprofil verwalten
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 495
+ 493
@@ -9151,6 +9151,18 @@
181
+
+ Return on Average Investment (total return with dividends)
+ Return on Average Investment (total return with dividends)
+
+ apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
+ 159
+
+
+ apps/client/src/app/pages/portfolio/analysis/analysis-page.html
+ 264
+
+
No results found...
Keine Ergebnisse gefunden...
diff --git a/apps/client/src/locales/messages.es.xlf b/apps/client/src/locales/messages.es.xlf
index 5ca862e626..b38233ad0f 100644
--- a/apps/client/src/locales/messages.es.xlf
+++ b/apps/client/src/locales/messages.es.xlf
@@ -567,7 +567,7 @@
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 235
+ 233
libs/ui/src/lib/holdings-table/holdings-table.component.html
@@ -591,7 +591,7 @@
¿Seguro que quieres eliminar este cupón?
apps/client/src/app/components/admin-overview/admin-overview.component.ts
- 227
+ 228
@@ -599,7 +599,7 @@
¿Seguro que quieres limpiar la caché?
apps/client/src/app/components/admin-overview/admin-overview.component.ts
- 270
+ 271
@@ -607,7 +607,7 @@
Por favor, establece tu mensaje del sistema:
apps/client/src/app/components/admin-overview/admin-overview.component.ts
- 290
+ 291
@@ -615,7 +615,7 @@
por usuario
apps/client/src/app/components/admin-overview/admin-overview.component.ts
- 176
+ 177
@@ -1035,11 +1035,11 @@
Rendimiento neto absoluto
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 141
+ 136
apps/client/src/app/pages/portfolio/analysis/analysis-page.html
- 279
+ 240
@@ -1047,11 +1047,11 @@
Rendimiento neto
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 156
+ 151
apps/client/src/app/pages/portfolio/analysis/analysis-page.html
- 295
+ 256
@@ -1059,7 +1059,7 @@
Total de activos
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 184
+ 195
@@ -1067,7 +1067,7 @@
Poder adquisitivo
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 324
+ 335
@@ -1075,7 +1075,7 @@
Patrimonio neto
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 407
+ 418
@@ -1083,7 +1083,7 @@
Rendimiento anualizado
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 422
+ 433
@@ -1091,7 +1091,7 @@
Por favor, ingresa la cantidad de tu fondo de emergencia.
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.ts
- 204
+ 174
@@ -1107,7 +1107,7 @@
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 305
+ 303
apps/client/src/app/pages/public/public-page.html
@@ -1127,7 +1127,7 @@
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 317
+ 315
@@ -1151,7 +1151,7 @@
Reportar anomalía en los datos
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 480
+ 478
@@ -1563,7 +1563,7 @@
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 411
+ 409
apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html
@@ -2127,7 +2127,7 @@
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 215
+ 226
apps/client/src/app/pages/public/public-page.html
@@ -2311,11 +2311,11 @@
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 248
+ 246
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 376
+ 374
apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html
@@ -2759,7 +2759,7 @@
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 285
+ 283
@@ -2775,7 +2775,7 @@
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 299
+ 297
apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html
@@ -2803,7 +2803,7 @@
Ahorros
libs/ui/src/lib/fire-calculator/fire-calculator.component.ts
- 464
+ 466
@@ -2815,11 +2815,11 @@
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 496
+ 507
libs/ui/src/lib/fire-calculator/fire-calculator.component.ts
- 454
+ 456
libs/ui/src/lib/i18n.ts
@@ -2831,7 +2831,7 @@
Depósito
libs/ui/src/lib/fire-calculator/fire-calculator.component.ts
- 444
+ 446
@@ -2979,7 +2979,7 @@
Excluido del análisis
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 356
+ 367
@@ -3115,7 +3115,7 @@
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 259
+ 257
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
@@ -3151,7 +3151,7 @@
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 337
+ 335
libs/ui/src/lib/i18n.ts
@@ -3183,7 +3183,7 @@
Efectivo
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 293
+ 304
@@ -3215,15 +3215,15 @@
Fondo de emergencia
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 261
+ 272
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 339
+ 350
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 441
+ 452
apps/client/src/app/pages/features/features-page.html
@@ -3286,14 +3286,6 @@
79
-
- Absolute Dividend Performance
- Absolute Dividend Performance
-
- apps/client/src/app/pages/portfolio/analysis/analysis-page.html
- 195
-
-
Africa
África
@@ -3471,15 +3463,7 @@
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 199
-
-
- apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 103
-
-
- apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 511
+ 197
apps/client/src/app/pages/features/features-page.html
@@ -3531,7 +3515,7 @@
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 268
+ 266
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
@@ -3579,7 +3563,7 @@
Datos del mercado
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 431
+ 429
libs/common/src/lib/routes/routes.ts
@@ -3646,14 +3630,6 @@
71
-
- Dividend Performance
- Dividend Performance
-
- apps/client/src/app/pages/portfolio/analysis/analysis-page.html
- 214
-
-
Yearly
Anual
@@ -3775,7 +3751,7 @@
Inversiones
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 246
+ 257
@@ -4051,11 +4027,11 @@
Comisiones
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 223
+ 221
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 121
+ 116
@@ -4275,7 +4251,7 @@
Caché vaciada.
apps/client/src/app/components/admin-overview/admin-overview.component.ts
- 261
+ 262
@@ -4330,6 +4306,18 @@
232
+
+ thereof Dividend Performance
+ thereof Dividend Performance
+
+ apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
+ 178
+
+
+ apps/client/src/app/pages/portfolio/analysis/analysis-page.html
+ 306
+
+
Update Cash Balance
Actualizar saldo en efectivo
@@ -4523,7 +4511,7 @@
Pasivos
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 387
+ 398
apps/client/src/app/pages/features/features-page.html
@@ -4791,7 +4779,7 @@
El cupón ha sido creado
apps/client/src/app/components/admin-overview/admin-overview.component.ts
- 209
+ 210
@@ -6433,7 +6421,7 @@
¿Seguro que quieres eliminar este mensaje del sistema?
apps/client/src/app/components/admin-overview/admin-overview.component.ts
- 240
+ 241
@@ -6485,7 +6473,7 @@
¿Seguro que quieres eliminar el saldo de esta cuenta?
libs/ui/src/lib/account-balances/account-balances.component.ts
- 127
+ 134
@@ -6601,7 +6589,7 @@
Cerrar posición
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 467
+ 465
@@ -6625,7 +6613,7 @@
Rendimiento absoluto de las divisas
apps/client/src/app/pages/portfolio/analysis/analysis-page.html
- 233
+ 194
@@ -6633,7 +6621,7 @@
Rendimiento de la divisa
apps/client/src/app/pages/portfolio/analysis/analysis-page.html
- 257
+ 218
@@ -6886,7 +6874,7 @@
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 246
+ 244
@@ -6894,7 +6882,7 @@
Rendimiento por dividendo
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 210
+ 208
@@ -7405,6 +7393,18 @@
15
+
+ thereof Dividend
+ thereof Dividend
+
+ apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
+ 102
+
+
+ apps/client/src/app/pages/portfolio/analysis/analysis-page.html
+ 287
+
+
Close
Cerrar
@@ -7566,11 +7566,11 @@
ha sido copiado al portapapeles
apps/client/src/app/components/admin-overview/admin-overview.component.ts
- 208
+ 209
libs/ui/src/lib/value/value.component.ts
- 202
+ 205
@@ -8016,7 +8016,7 @@
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.ts
- 202
+ 172
apps/client/src/app/components/rule/rule-settings-dialog/rule-settings-dialog.html
@@ -8096,7 +8096,7 @@
El prompt para la IA ha sido copiado al portapapeles
apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts
- 237
+ 207
@@ -8184,7 +8184,7 @@
Abrir Duck.ai
apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts
- 238
+ 208
@@ -8204,7 +8204,7 @@
libs/ui/src/lib/treemap-chart/treemap-chart.component.ts
- 423
+ 430
@@ -8244,11 +8244,11 @@
libs/ui/src/lib/treemap-chart/treemap-chart.component.ts
- 423
+ 430
libs/ui/src/lib/treemap-chart/treemap-chart.component.ts
- 436
+ 445
@@ -8566,7 +8566,7 @@
La cuenta de usuario de demostración se ha sincronizado.
apps/client/src/app/components/admin-overview/admin-overview.component.ts
- 314
+ 315
@@ -9041,7 +9041,7 @@
Gestionar perfil de activo
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 495
+ 493
@@ -9152,6 +9152,18 @@
181
+
+ Return on Average Investment (total return with dividends)
+ Return on Average Investment (total return with dividends)
+
+ apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
+ 159
+
+
+ apps/client/src/app/pages/portfolio/analysis/analysis-page.html
+ 264
+
+
No results found...
No se encontraron resultados...
diff --git a/apps/client/src/locales/messages.fr.xlf b/apps/client/src/locales/messages.fr.xlf
index 2a01a5d5dc..9045567348 100644
--- a/apps/client/src/locales/messages.fr.xlf
+++ b/apps/client/src/locales/messages.fr.xlf
@@ -638,7 +638,7 @@
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 235
+ 233
libs/ui/src/lib/holdings-table/holdings-table.component.html
@@ -754,7 +754,7 @@
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 285
+ 283
@@ -770,7 +770,7 @@
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 299
+ 297
apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html
@@ -790,7 +790,7 @@
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 305
+ 303
apps/client/src/app/pages/public/public-page.html
@@ -810,7 +810,7 @@
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 317
+ 315
@@ -850,7 +850,7 @@
Voulez-vous vraiment supprimer ce code promotionnel ?
apps/client/src/app/components/admin-overview/admin-overview.component.ts
- 227
+ 228
@@ -858,7 +858,7 @@
Voulez-vous vraiment vider le cache ?
apps/client/src/app/components/admin-overview/admin-overview.component.ts
- 270
+ 271
@@ -866,7 +866,7 @@
Veuillez définir votre message système :
apps/client/src/app/components/admin-overview/admin-overview.component.ts
- 290
+ 291
@@ -874,7 +874,7 @@
par Utilisateur
apps/client/src/app/components/admin-overview/admin-overview.component.ts
- 176
+ 177
@@ -1366,11 +1366,11 @@
Performance Absolue Nette
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 141
+ 136
apps/client/src/app/pages/portfolio/analysis/analysis-page.html
- 279
+ 240
@@ -1378,11 +1378,11 @@
Performance nette
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 156
+ 151
apps/client/src/app/pages/portfolio/analysis/analysis-page.html
- 295
+ 256
@@ -1390,7 +1390,7 @@
Actifs Totaux
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 184
+ 195
@@ -1398,7 +1398,7 @@
Pouvoir d’Achat
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 324
+ 335
@@ -1406,7 +1406,7 @@
Exclus de l’Analyse
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 356
+ 367
@@ -1414,7 +1414,7 @@
Fortune
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 407
+ 418
@@ -1422,7 +1422,7 @@
Performance annualisée
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 422
+ 433
@@ -1430,7 +1430,7 @@
Veuillez entrer le montant de votre fonds d’urgence :
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.ts
- 204
+ 174
@@ -1478,7 +1478,7 @@
Signaler une Erreur de Données
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 480
+ 478
@@ -1970,7 +1970,7 @@
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 411
+ 409
apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html
@@ -2026,7 +2026,7 @@
Données du marché
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 431
+ 429
libs/common/src/lib/routes/routes.ts
@@ -2262,7 +2262,7 @@
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 215
+ 226
apps/client/src/app/pages/public/public-page.html
@@ -2378,11 +2378,11 @@
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 248
+ 246
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 376
+ 374
apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html
@@ -2754,15 +2754,7 @@
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 199
-
-
- apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 103
-
-
- apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 511
+ 197
apps/client/src/app/pages/features/features-page.html
@@ -2794,7 +2786,7 @@
Dépôt
libs/ui/src/lib/fire-calculator/fire-calculator.component.ts
- 444
+ 446
@@ -3246,11 +3238,11 @@
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 496
+ 507
libs/ui/src/lib/fire-calculator/fire-calculator.component.ts
- 454
+ 456
libs/ui/src/lib/i18n.ts
@@ -3262,7 +3254,7 @@
Épargne
libs/ui/src/lib/fire-calculator/fire-calculator.component.ts
- 464
+ 466
@@ -3338,7 +3330,7 @@
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 259
+ 257
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
@@ -3370,7 +3362,7 @@
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 268
+ 266
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
@@ -3386,15 +3378,15 @@
Fonds d’Urgence
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 261
+ 272
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 339
+ 350
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 441
+ 452
apps/client/src/app/pages/features/features-page.html
@@ -3442,7 +3434,7 @@
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 337
+ 335
libs/ui/src/lib/i18n.ts
@@ -3474,7 +3466,7 @@
Cash
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 293
+ 304
@@ -3501,14 +3493,6 @@
78
-
- Absolute Dividend Performance
- Absolute Dividend Performance
-
- apps/client/src/app/pages/portfolio/analysis/analysis-page.html
- 195
-
-
Africa
Afrique
@@ -3645,14 +3629,6 @@
71
-
- Dividend Performance
- Dividend Performance
-
- apps/client/src/app/pages/portfolio/analysis/analysis-page.html
- 214
-
-
Yearly
Annuel
@@ -3774,7 +3750,7 @@
Investments
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 246
+ 257
@@ -4050,11 +4026,11 @@
Frais
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 223
+ 221
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 121
+ 116
@@ -4274,7 +4250,7 @@
Cache has been flushed.
apps/client/src/app/components/admin-overview/admin-overview.component.ts
- 261
+ 262
@@ -4329,6 +4305,18 @@
232
+
+ thereof Dividend Performance
+ thereof Dividend Performance
+
+ apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
+ 178
+
+
+ apps/client/src/app/pages/portfolio/analysis/analysis-page.html
+ 306
+
+
Update Cash Balance
Mettre à jour le Solde
@@ -4522,7 +4510,7 @@
Dettes
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 387
+ 398
apps/client/src/app/pages/features/features-page.html
@@ -4790,7 +4778,7 @@
Coupon has been created
apps/client/src/app/components/admin-overview/admin-overview.component.ts
- 209
+ 210
@@ -6432,7 +6420,7 @@
Confirmer la suppresion de ce message système?
apps/client/src/app/components/admin-overview/admin-overview.component.ts
- 240
+ 241
@@ -6484,7 +6472,7 @@
Voulez-vous vraiment supprimer ce solde de compte ?
libs/ui/src/lib/account-balances/account-balances.component.ts
- 127
+ 134
@@ -6600,7 +6588,7 @@
Clôturer la Position
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 467
+ 465
@@ -6624,7 +6612,7 @@
Performance des devises en valeur absolue
apps/client/src/app/pages/portfolio/analysis/analysis-page.html
- 233
+ 194
@@ -6632,7 +6620,7 @@
Performance des devises
apps/client/src/app/pages/portfolio/analysis/analysis-page.html
- 257
+ 218
@@ -6885,7 +6873,7 @@
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 246
+ 244
@@ -6893,7 +6881,7 @@
Rendement en Dividende
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 210
+ 208
@@ -7404,6 +7392,18 @@
15
+
+ thereof Dividend
+ thereof Dividend
+
+ apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
+ 102
+
+
+ apps/client/src/app/pages/portfolio/analysis/analysis-page.html
+ 287
+
+
Close
Fermer
@@ -7565,11 +7565,11 @@
a été copié dans le presse-papiers
apps/client/src/app/components/admin-overview/admin-overview.component.ts
- 208
+ 209
libs/ui/src/lib/value/value.component.ts
- 202
+ 205
@@ -8015,7 +8015,7 @@
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.ts
- 202
+ 172
apps/client/src/app/components/rule/rule-settings-dialog/rule-settings-dialog.html
@@ -8095,7 +8095,7 @@
Le prompt IA a été copié dans le presse-papiers
apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts
- 237
+ 207
@@ -8183,7 +8183,7 @@
Ouvrir Duck.ai
apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts
- 238
+ 208
@@ -8203,7 +8203,7 @@
libs/ui/src/lib/treemap-chart/treemap-chart.component.ts
- 423
+ 430
@@ -8243,11 +8243,11 @@
libs/ui/src/lib/treemap-chart/treemap-chart.component.ts
- 423
+ 430
libs/ui/src/lib/treemap-chart/treemap-chart.component.ts
- 436
+ 445
@@ -8565,7 +8565,7 @@
Le compte utilisateur de démonstration a été synchronisé.
apps/client/src/app/components/admin-overview/admin-overview.component.ts
- 314
+ 315
@@ -9040,7 +9040,7 @@
Gérer le profil d’actif
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 495
+ 493
@@ -9151,6 +9151,18 @@
181
+
+ Return on Average Investment (total return with dividends)
+ Return on Average Investment (total return with dividends)
+
+ apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
+ 159
+
+
+ apps/client/src/app/pages/portfolio/analysis/analysis-page.html
+ 264
+
+
No results found...
Aucun résultat trouvé...
diff --git a/apps/client/src/locales/messages.it.xlf b/apps/client/src/locales/messages.it.xlf
index 5026711ec5..0d3e3e7fea 100644
--- a/apps/client/src/locales/messages.it.xlf
+++ b/apps/client/src/locales/messages.it.xlf
@@ -567,7 +567,7 @@
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 235
+ 233
libs/ui/src/lib/holdings-table/holdings-table.component.html
@@ -591,7 +591,7 @@
Vuoi davvero eliminare questo buono?
apps/client/src/app/components/admin-overview/admin-overview.component.ts
- 227
+ 228
@@ -599,7 +599,7 @@
Vuoi davvero svuotare la cache?
apps/client/src/app/components/admin-overview/admin-overview.component.ts
- 270
+ 271
@@ -607,7 +607,7 @@
Imposta il messaggio di sistema:
apps/client/src/app/components/admin-overview/admin-overview.component.ts
- 290
+ 291
@@ -615,7 +615,7 @@
per utente
apps/client/src/app/components/admin-overview/admin-overview.component.ts
- 176
+ 177
@@ -1035,11 +1035,11 @@
Prestazioni nette assolute
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 141
+ 136
apps/client/src/app/pages/portfolio/analysis/analysis-page.html
- 279
+ 240
@@ -1047,11 +1047,11 @@
Prestazioni nette
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 156
+ 151
apps/client/src/app/pages/portfolio/analysis/analysis-page.html
- 295
+ 256
@@ -1059,7 +1059,7 @@
Asset totali
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 184
+ 195
@@ -1067,7 +1067,7 @@
Potere d’acquisto
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 324
+ 335
@@ -1075,7 +1075,7 @@
Patrimonio netto
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 407
+ 418
@@ -1083,7 +1083,7 @@
Prestazioni annualizzate
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 422
+ 433
@@ -1091,7 +1091,7 @@
Inserisci l’importo del tuo fondo di emergenza:
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.ts
- 204
+ 174
@@ -1107,7 +1107,7 @@
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 305
+ 303
apps/client/src/app/pages/public/public-page.html
@@ -1127,7 +1127,7 @@
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 317
+ 315
@@ -1151,7 +1151,7 @@
Segnala un’anomalia dei dati
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 480
+ 478
@@ -1563,7 +1563,7 @@
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 411
+ 409
apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html
@@ -2127,7 +2127,7 @@
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 215
+ 226
apps/client/src/app/pages/public/public-page.html
@@ -2311,11 +2311,11 @@
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 248
+ 246
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 376
+ 374
apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html
@@ -2759,7 +2759,7 @@
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 285
+ 283
@@ -2775,7 +2775,7 @@
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 299
+ 297
apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html
@@ -2803,7 +2803,7 @@
Risparmio
libs/ui/src/lib/fire-calculator/fire-calculator.component.ts
- 464
+ 466
@@ -2815,11 +2815,11 @@
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 496
+ 507
libs/ui/src/lib/fire-calculator/fire-calculator.component.ts
- 454
+ 456
libs/ui/src/lib/i18n.ts
@@ -2831,7 +2831,7 @@
Deposito
libs/ui/src/lib/fire-calculator/fire-calculator.component.ts
- 444
+ 446
@@ -2979,7 +2979,7 @@
Escluso dall’analisi
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 356
+ 367
@@ -3115,7 +3115,7 @@
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 259
+ 257
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
@@ -3151,7 +3151,7 @@
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 337
+ 335
libs/ui/src/lib/i18n.ts
@@ -3183,7 +3183,7 @@
Contanti
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 293
+ 304
@@ -3215,15 +3215,15 @@
Fondo di emergenza
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 261
+ 272
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 339
+ 350
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 441
+ 452
apps/client/src/app/pages/features/features-page.html
@@ -3286,14 +3286,6 @@
79
-
- Absolute Dividend Performance
- Absolute Dividend Performance
-
- apps/client/src/app/pages/portfolio/analysis/analysis-page.html
- 195
-
-
Africa
Africa
@@ -3471,15 +3463,7 @@
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 199
-
-
- apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 103
-
-
- apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 511
+ 197
apps/client/src/app/pages/features/features-page.html
@@ -3531,7 +3515,7 @@
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 268
+ 266
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
@@ -3579,7 +3563,7 @@
Dati del mercato
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 431
+ 429
libs/common/src/lib/routes/routes.ts
@@ -3646,14 +3630,6 @@
71
-
- Dividend Performance
- Dividend Performance
-
- apps/client/src/app/pages/portfolio/analysis/analysis-page.html
- 214
-
-
Yearly
Annuale
@@ -3775,7 +3751,7 @@
Investments
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 246
+ 257
@@ -4051,11 +4027,11 @@
Commissioni
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 223
+ 221
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 121
+ 116
@@ -4275,7 +4251,7 @@
Cache has been flushed.
apps/client/src/app/components/admin-overview/admin-overview.component.ts
- 261
+ 262
@@ -4330,6 +4306,18 @@
232
+
+ thereof Dividend Performance
+ thereof Dividend Performance
+
+ apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
+ 178
+
+
+ apps/client/src/app/pages/portfolio/analysis/analysis-page.html
+ 306
+
+
Update Cash Balance
Aggiornamento del saldo di cassa
@@ -4523,7 +4511,7 @@
Passività
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 387
+ 398
apps/client/src/app/pages/features/features-page.html
@@ -4791,7 +4779,7 @@
Coupon has been created
apps/client/src/app/components/admin-overview/admin-overview.component.ts
- 209
+ 210
@@ -6433,7 +6421,7 @@
Confermi di voler cancellare questo messaggio di sistema?
apps/client/src/app/components/admin-overview/admin-overview.component.ts
- 240
+ 241
@@ -6485,7 +6473,7 @@
Vuoi veramente elimnare il saldo di questo conto?
libs/ui/src/lib/account-balances/account-balances.component.ts
- 127
+ 134
@@ -6601,7 +6589,7 @@
Close Holding
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 467
+ 465
@@ -6625,7 +6613,7 @@
Rendimento assoluto della Valuta
apps/client/src/app/pages/portfolio/analysis/analysis-page.html
- 233
+ 194
@@ -6633,7 +6621,7 @@
Rendimento della Valuta
apps/client/src/app/pages/portfolio/analysis/analysis-page.html
- 257
+ 218
@@ -6886,7 +6874,7 @@
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 246
+ 244
@@ -6894,7 +6882,7 @@
Rendimento da Dividendi
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 210
+ 208
@@ -7405,6 +7393,18 @@
15
+
+ thereof Dividend
+ thereof Dividend
+
+ apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
+ 102
+
+
+ apps/client/src/app/pages/portfolio/analysis/analysis-page.html
+ 287
+
+
Close
Chiudi
@@ -7566,11 +7566,11 @@
has been copied to the clipboard
apps/client/src/app/components/admin-overview/admin-overview.component.ts
- 208
+ 209
libs/ui/src/lib/value/value.component.ts
- 202
+ 205
@@ -8016,7 +8016,7 @@
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.ts
- 202
+ 172
apps/client/src/app/components/rule/rule-settings-dialog/rule-settings-dialog.html
@@ -8096,7 +8096,7 @@
L’AI prompt è stato copiato negli appunti
apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts
- 237
+ 207
@@ -8184,7 +8184,7 @@
Apri Duck.ai
apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts
- 238
+ 208
@@ -8204,7 +8204,7 @@
libs/ui/src/lib/treemap-chart/treemap-chart.component.ts
- 423
+ 430
@@ -8244,11 +8244,11 @@
libs/ui/src/lib/treemap-chart/treemap-chart.component.ts
- 423
+ 430
libs/ui/src/lib/treemap-chart/treemap-chart.component.ts
- 436
+ 445
@@ -8566,7 +8566,7 @@
L’account utente demo è stato sincronizzato.
apps/client/src/app/components/admin-overview/admin-overview.component.ts
- 314
+ 315
@@ -9041,7 +9041,7 @@
Gestisci profilo risorsa
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 495
+ 493
@@ -9152,6 +9152,18 @@
181
+
+ Return on Average Investment (total return with dividends)
+ Return on Average Investment (total return with dividends)
+
+ apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
+ 159
+
+
+ apps/client/src/app/pages/portfolio/analysis/analysis-page.html
+ 264
+
+
No results found...
No results found...
diff --git a/apps/client/src/locales/messages.ja.xlf b/apps/client/src/locales/messages.ja.xlf
index a21e0eaa88..cb3e8fa44e 100644
--- a/apps/client/src/locales/messages.ja.xlf
+++ b/apps/client/src/locales/messages.ja.xlf
@@ -928,7 +928,7 @@
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 235
+ 233
libs/ui/src/lib/holdings-table/holdings-table.component.html
@@ -1100,7 +1100,7 @@
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 285
+ 283
@@ -1116,7 +1116,7 @@
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 299
+ 297
apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html
@@ -1136,7 +1136,7 @@
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 305
+ 303
apps/client/src/app/pages/public/public-page.html
@@ -1156,7 +1156,7 @@
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 317
+ 315
@@ -1308,7 +1308,7 @@
このクーポンを削除してもよろしいですか?
apps/client/src/app/components/admin-overview/admin-overview.component.ts
- 227
+ 228
@@ -1316,7 +1316,7 @@
本当にこのシステムメッセージを削除しますか?
apps/client/src/app/components/admin-overview/admin-overview.component.ts
- 240
+ 241
@@ -1324,7 +1324,7 @@
キャッシュをクリアしてもよろしいですか?
apps/client/src/app/components/admin-overview/admin-overview.component.ts
- 270
+ 271
@@ -1332,7 +1332,7 @@
システムメッセージを設定してください:
apps/client/src/app/components/admin-overview/admin-overview.component.ts
- 290
+ 291
@@ -1348,7 +1348,7 @@
ユーザーあたり
apps/client/src/app/components/admin-overview/admin-overview.component.ts
- 176
+ 177
@@ -1544,7 +1544,7 @@
Cache has been flushed.
apps/client/src/app/components/admin-overview/admin-overview.component.ts
- 261
+ 262
@@ -2096,11 +2096,11 @@
手数料
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 223
+ 221
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 121
+ 116
@@ -2108,11 +2108,11 @@
実質純パフォーマンス
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 141
+ 136
apps/client/src/app/pages/portfolio/analysis/analysis-page.html
- 279
+ 240
@@ -2120,11 +2120,11 @@
純パフォーマンス
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 156
+ 151
apps/client/src/app/pages/portfolio/analysis/analysis-page.html
- 295
+ 256
@@ -2132,7 +2132,7 @@
総資産
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 184
+ 195
@@ -2140,7 +2140,7 @@
購買力
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 324
+ 335
@@ -2148,7 +2148,7 @@
分析から除外
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 356
+ 367
@@ -2156,7 +2156,7 @@
負債
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 387
+ 398
apps/client/src/app/pages/features/features-page.html
@@ -2168,7 +2168,7 @@
純資産(ネットワース)
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 407
+ 418
@@ -2176,7 +2176,7 @@
年率換算パフォーマンス
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 422
+ 433
@@ -2184,7 +2184,7 @@
緊急用資金の金額を設定してください。
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.ts
- 204
+ 174
@@ -2232,7 +2232,7 @@
データグリッチの報告
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 480
+ 478
@@ -2756,7 +2756,7 @@
Investments
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 246
+ 257
@@ -2992,7 +2992,7 @@
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 411
+ 409
apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html
@@ -3096,7 +3096,7 @@
マーケットデータ
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 431
+ 429
libs/common/src/lib/routes/routes.ts
@@ -3548,7 +3548,7 @@
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 215
+ 226
apps/client/src/app/pages/public/public-page.html
@@ -4308,11 +4308,11 @@
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 248
+ 246
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 376
+ 374
apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html
@@ -4391,6 +4391,18 @@
73
+
+ thereof Dividend Performance
+ thereof Dividend Performance
+
+ apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
+ 178
+
+
+ apps/client/src/app/pages/portfolio/analysis/analysis-page.html
+ 306
+
+
Update Cash Balance
現金残高を更新
@@ -4511,14 +4523,6 @@
71
-
- Dividend Performance
- Dividend Performance
-
- apps/client/src/app/pages/portfolio/analysis/analysis-page.html
- 214
-
-
Choose or drop a file here
ここでファイルを選択またはドロップ
@@ -4792,15 +4796,7 @@
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 199
-
-
- apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 103
-
-
- apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 511
+ 197
apps/client/src/app/pages/features/features-page.html
@@ -4832,7 +4828,7 @@
入金
libs/ui/src/lib/fire-calculator/fire-calculator.component.ts
- 444
+ 446
@@ -5377,7 +5373,7 @@
Coupon has been created
apps/client/src/app/components/admin-overview/admin-overview.component.ts
- 209
+ 210
@@ -5669,7 +5665,7 @@
この口座残高を本当に削除しますか?
libs/ui/src/lib/account-balances/account-balances.component.ts
- 127
+ 134
@@ -5877,11 +5873,11 @@
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 496
+ 507
libs/ui/src/lib/fire-calculator/fire-calculator.component.ts
- 454
+ 456
libs/ui/src/lib/i18n.ts
@@ -5893,7 +5889,7 @@
貯蓄
libs/ui/src/lib/fire-calculator/fire-calculator.component.ts
- 464
+ 466
@@ -5977,7 +5973,7 @@
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 259
+ 257
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
@@ -6009,7 +6005,7 @@
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 268
+ 266
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
@@ -6049,15 +6045,15 @@
緊急資金
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 261
+ 272
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 339
+ 350
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 441
+ 452
apps/client/src/app/pages/features/features-page.html
@@ -6193,7 +6189,7 @@
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 337
+ 335
libs/ui/src/lib/i18n.ts
@@ -6325,7 +6321,7 @@
現金
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 293
+ 304
@@ -6352,14 +6348,6 @@
78
-
- Absolute Dividend Performance
- Absolute Dividend Performance
-
- apps/client/src/app/pages/portfolio/analysis/analysis-page.html
- 195
-
-
Africa
アフリカ
@@ -6605,7 +6593,7 @@
絶対通貨パフォーマンス
apps/client/src/app/pages/portfolio/analysis/analysis-page.html
- 233
+ 194
@@ -6613,7 +6601,7 @@
Close Holding
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 467
+ 465
@@ -6657,7 +6645,7 @@
通貨パフォーマンス
apps/client/src/app/pages/portfolio/analysis/analysis-page.html
- 257
+ 218
@@ -6910,7 +6898,7 @@
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 246
+ 244
@@ -6918,7 +6906,7 @@
配当利回り
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 210
+ 208
@@ -7421,6 +7409,18 @@
92
+
+ thereof Dividend
+ thereof Dividend
+
+ apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
+ 102
+
+
+ apps/client/src/app/pages/portfolio/analysis/analysis-page.html
+ 287
+
+
Close
Close
@@ -7606,11 +7606,11 @@
has been copied to the clipboard
apps/client/src/app/components/admin-overview/admin-overview.component.ts
- 208
+ 209
libs/ui/src/lib/value/value.component.ts
- 202
+ 205
@@ -8040,7 +8040,7 @@
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.ts
- 202
+ 172
apps/client/src/app/components/rule/rule-settings-dialog/rule-settings-dialog.html
@@ -8120,7 +8120,7 @@
AI prompt has been copied to the clipboard
apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts
- 237
+ 207
@@ -8208,7 +8208,7 @@
Open Duck.ai
apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts
- 238
+ 208
@@ -8228,7 +8228,7 @@
libs/ui/src/lib/treemap-chart/treemap-chart.component.ts
- 423
+ 430
@@ -8268,11 +8268,11 @@
libs/ui/src/lib/treemap-chart/treemap-chart.component.ts
- 423
+ 430
libs/ui/src/lib/treemap-chart/treemap-chart.component.ts
- 436
+ 445
@@ -8574,7 +8574,7 @@
Demo user account has been synced.
apps/client/src/app/components/admin-overview/admin-overview.component.ts
- 314
+ 315
@@ -9041,7 +9041,7 @@
Manage Asset Profile
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 495
+ 493
@@ -9056,6 +9056,18 @@
106
+
+ Return on Average Investment (total return with dividends)
+ Return on Average Investment (total return with dividends)
+
+ apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
+ 159
+
+
+ apps/client/src/app/pages/portfolio/analysis/analysis-page.html
+ 264
+
+
No results found...
No results found...
diff --git a/apps/client/src/locales/messages.ko.xlf b/apps/client/src/locales/messages.ko.xlf
index 76e92c7862..ef9a62a737 100644
--- a/apps/client/src/locales/messages.ko.xlf
+++ b/apps/client/src/locales/messages.ko.xlf
@@ -928,7 +928,7 @@
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 235
+ 233
libs/ui/src/lib/holdings-table/holdings-table.component.html
@@ -1100,7 +1100,7 @@
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 285
+ 283
@@ -1116,7 +1116,7 @@
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 299
+ 297
apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html
@@ -1136,7 +1136,7 @@
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 305
+ 303
apps/client/src/app/pages/public/public-page.html
@@ -1156,7 +1156,7 @@
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 317
+ 315
@@ -1308,7 +1308,7 @@
이 쿠폰을 정말 삭제하시겠습니까?
apps/client/src/app/components/admin-overview/admin-overview.component.ts
- 227
+ 228
@@ -1316,7 +1316,7 @@
이 시스템 메시지를 정말 삭제하시겠습니까?
apps/client/src/app/components/admin-overview/admin-overview.component.ts
- 240
+ 241
@@ -1324,7 +1324,7 @@
정말로 캐시를 플러시하시겠습니까?
apps/client/src/app/components/admin-overview/admin-overview.component.ts
- 270
+ 271
@@ -1332,7 +1332,7 @@
시스템 메시지를 설정하십시오:
apps/client/src/app/components/admin-overview/admin-overview.component.ts
- 290
+ 291
@@ -1348,7 +1348,7 @@
사용자당
apps/client/src/app/components/admin-overview/admin-overview.component.ts
- 176
+ 177
@@ -1544,7 +1544,7 @@
Cache has been flushed.
apps/client/src/app/components/admin-overview/admin-overview.component.ts
- 261
+ 262
@@ -2096,11 +2096,11 @@
수수료
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 223
+ 221
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 121
+ 116
@@ -2108,11 +2108,11 @@
절대 순 성과
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 141
+ 136
apps/client/src/app/pages/portfolio/analysis/analysis-page.html
- 279
+ 240
@@ -2120,11 +2120,11 @@
순 성과
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 156
+ 151
apps/client/src/app/pages/portfolio/analysis/analysis-page.html
- 295
+ 256
@@ -2132,7 +2132,7 @@
총자산
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 184
+ 195
@@ -2140,7 +2140,7 @@
매수 가능 금액
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 324
+ 335
@@ -2148,7 +2148,7 @@
분석에서 제외됨
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 356
+ 367
@@ -2156,7 +2156,7 @@
부채
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 387
+ 398
apps/client/src/app/pages/features/features-page.html
@@ -2168,7 +2168,7 @@
순자산
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 407
+ 418
@@ -2176,7 +2176,7 @@
연환산 성과
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 422
+ 433
@@ -2184,7 +2184,7 @@
비상금 금액을 설정해 주세요.
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.ts
- 204
+ 174
@@ -2232,7 +2232,7 @@
데이터 결함 보고
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 480
+ 478
@@ -2756,7 +2756,7 @@
Investments
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 246
+ 257
@@ -2992,7 +2992,7 @@
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 411
+ 409
apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html
@@ -3096,7 +3096,7 @@
시장 데이터
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 431
+ 429
libs/common/src/lib/routes/routes.ts
@@ -3548,7 +3548,7 @@
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 215
+ 226
apps/client/src/app/pages/public/public-page.html
@@ -4300,11 +4300,11 @@
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 248
+ 246
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 376
+ 374
apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html
@@ -4383,6 +4383,18 @@
73
+
+ thereof Dividend Performance
+ thereof Dividend Performance
+
+ apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
+ 178
+
+
+ apps/client/src/app/pages/portfolio/analysis/analysis-page.html
+ 306
+
+
Update Cash Balance
현금 잔액 업데이트
@@ -4503,14 +4515,6 @@
71
-
- Dividend Performance
- Dividend Performance
-
- apps/client/src/app/pages/portfolio/analysis/analysis-page.html
- 214
-
-
Choose or drop a file here
여기에 파일을 선택하거나 드롭하세요.
@@ -4784,15 +4788,7 @@
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 199
-
-
- apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 103
-
-
- apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 511
+ 197
apps/client/src/app/pages/features/features-page.html
@@ -4824,7 +4820,7 @@
보증금
libs/ui/src/lib/fire-calculator/fire-calculator.component.ts
- 444
+ 446
@@ -5369,7 +5365,7 @@
Coupon has been created
apps/client/src/app/components/admin-overview/admin-overview.component.ts
- 209
+ 210
@@ -5661,7 +5657,7 @@
정말로 이 계좌 잔액을 삭제하시겠습니까?
libs/ui/src/lib/account-balances/account-balances.component.ts
- 127
+ 134
@@ -5869,11 +5865,11 @@
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 496
+ 507
libs/ui/src/lib/fire-calculator/fire-calculator.component.ts
- 454
+ 456
libs/ui/src/lib/i18n.ts
@@ -5885,7 +5881,7 @@
저금
libs/ui/src/lib/fire-calculator/fire-calculator.component.ts
- 464
+ 466
@@ -5969,7 +5965,7 @@
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 259
+ 257
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
@@ -6001,7 +5997,7 @@
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 268
+ 266
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
@@ -6041,15 +6037,15 @@
비상자금
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 261
+ 272
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 339
+ 350
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 441
+ 452
apps/client/src/app/pages/features/features-page.html
@@ -6193,7 +6189,7 @@
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 337
+ 335
libs/ui/src/lib/i18n.ts
@@ -6325,7 +6321,7 @@
현금
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 293
+ 304
@@ -6352,14 +6348,6 @@
78
-
- Absolute Dividend Performance
- Absolute Dividend Performance
-
- apps/client/src/app/pages/portfolio/analysis/analysis-page.html
- 195
-
-
Africa
아프리카
@@ -6605,7 +6593,7 @@
절대적인 통화 성과
apps/client/src/app/pages/portfolio/analysis/analysis-page.html
- 233
+ 194
@@ -6613,7 +6601,7 @@
보유 포지션 종료
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 467
+ 465
@@ -6657,7 +6645,7 @@
통화 성과
apps/client/src/app/pages/portfolio/analysis/analysis-page.html
- 257
+ 218
@@ -6910,7 +6898,7 @@
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 246
+ 244
@@ -6918,7 +6906,7 @@
배당수익률
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 210
+ 208
@@ -7421,6 +7409,18 @@
92
+
+ thereof Dividend
+ thereof Dividend
+
+ apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
+ 102
+
+
+ apps/client/src/app/pages/portfolio/analysis/analysis-page.html
+ 287
+
+
Close
닫다
@@ -7606,11 +7606,11 @@
가 클립보드에 복사되었습니다.
apps/client/src/app/components/admin-overview/admin-overview.component.ts
- 208
+ 209
libs/ui/src/lib/value/value.component.ts
- 202
+ 205
@@ -8040,7 +8040,7 @@
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.ts
- 202
+ 172
apps/client/src/app/components/rule/rule-settings-dialog/rule-settings-dialog.html
@@ -8120,7 +8120,7 @@
AI 프롬프트가 클립보드에 복사되었습니다.
apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts
- 237
+ 207
@@ -8208,7 +8208,7 @@
오픈 Duck.ai
apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts
- 238
+ 208
@@ -8228,7 +8228,7 @@
libs/ui/src/lib/treemap-chart/treemap-chart.component.ts
- 423
+ 430
@@ -8268,11 +8268,11 @@
libs/ui/src/lib/treemap-chart/treemap-chart.component.ts
- 423
+ 430
libs/ui/src/lib/treemap-chart/treemap-chart.component.ts
- 436
+ 445
@@ -8574,7 +8574,7 @@
데모 사용자 계정이 동기화되었습니다.
apps/client/src/app/components/admin-overview/admin-overview.component.ts
- 314
+ 315
@@ -9041,7 +9041,7 @@
자산 프로필 관리
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 495
+ 493
@@ -9056,6 +9056,18 @@
106
+
+ Return on Average Investment (total return with dividends)
+ Return on Average Investment (total return with dividends)
+
+ apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
+ 159
+
+
+ apps/client/src/app/pages/portfolio/analysis/analysis-page.html
+ 264
+
+
No results found...
검색된 결과가 없습니다...
diff --git a/apps/client/src/locales/messages.nl.xlf b/apps/client/src/locales/messages.nl.xlf
index 6d27beb310..bbb4c3c81f 100644
--- a/apps/client/src/locales/messages.nl.xlf
+++ b/apps/client/src/locales/messages.nl.xlf
@@ -566,7 +566,7 @@
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 235
+ 233
libs/ui/src/lib/holdings-table/holdings-table.component.html
@@ -590,7 +590,7 @@
Wil je deze coupon echt verwijderen?
apps/client/src/app/components/admin-overview/admin-overview.component.ts
- 227
+ 228
@@ -598,7 +598,7 @@
Wil je echt de cache legen?
apps/client/src/app/components/admin-overview/admin-overview.component.ts
- 270
+ 271
@@ -606,7 +606,7 @@
Stel je systeemboodschap in:
apps/client/src/app/components/admin-overview/admin-overview.component.ts
- 290
+ 291
@@ -614,7 +614,7 @@
per gebruiker
apps/client/src/app/components/admin-overview/admin-overview.component.ts
- 176
+ 177
@@ -1034,11 +1034,11 @@
Absoluut netto rendement
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 141
+ 136
apps/client/src/app/pages/portfolio/analysis/analysis-page.html
- 279
+ 240
@@ -1046,11 +1046,11 @@
Netto rendement
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 156
+ 151
apps/client/src/app/pages/portfolio/analysis/analysis-page.html
- 295
+ 256
@@ -1058,7 +1058,7 @@
Totaal Activa
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 184
+ 195
@@ -1066,7 +1066,7 @@
Koopkracht
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 324
+ 335
@@ -1074,7 +1074,7 @@
Netto waarde
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 407
+ 418
@@ -1082,7 +1082,7 @@
Rendement per jaar
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 422
+ 433
@@ -1090,7 +1090,7 @@
Voer het bedrag van je noodfonds in:
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.ts
- 204
+ 174
@@ -1106,7 +1106,7 @@
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 305
+ 303
apps/client/src/app/pages/public/public-page.html
@@ -1126,7 +1126,7 @@
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 317
+ 315
@@ -1150,7 +1150,7 @@
Gegevensstoring melden
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 480
+ 478
@@ -1562,7 +1562,7 @@
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 411
+ 409
apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html
@@ -2126,7 +2126,7 @@
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 215
+ 226
apps/client/src/app/pages/public/public-page.html
@@ -2310,11 +2310,11 @@
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 248
+ 246
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 376
+ 374
apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html
@@ -2758,7 +2758,7 @@
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 285
+ 283
@@ -2774,7 +2774,7 @@
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 299
+ 297
apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html
@@ -2802,7 +2802,7 @@
Besparingen
libs/ui/src/lib/fire-calculator/fire-calculator.component.ts
- 464
+ 466
@@ -2814,11 +2814,11 @@
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 496
+ 507
libs/ui/src/lib/fire-calculator/fire-calculator.component.ts
- 454
+ 456
libs/ui/src/lib/i18n.ts
@@ -2830,7 +2830,7 @@
Storting
libs/ui/src/lib/fire-calculator/fire-calculator.component.ts
- 444
+ 446
@@ -2978,7 +2978,7 @@
Uitgesloten van analyse
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 356
+ 367
@@ -3114,7 +3114,7 @@
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 259
+ 257
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
@@ -3150,7 +3150,7 @@
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 337
+ 335
libs/ui/src/lib/i18n.ts
@@ -3182,7 +3182,7 @@
Contant geld
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 293
+ 304
@@ -3214,15 +3214,15 @@
Noodfonds
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 261
+ 272
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 339
+ 350
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 441
+ 452
apps/client/src/app/pages/features/features-page.html
@@ -3285,14 +3285,6 @@
79
-
- Absolute Dividend Performance
- Absolute Dividend Performance
-
- apps/client/src/app/pages/portfolio/analysis/analysis-page.html
- 195
-
-
Africa
Afrika
@@ -3470,15 +3462,7 @@
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 199
-
-
- apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 103
-
-
- apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 511
+ 197
apps/client/src/app/pages/features/features-page.html
@@ -3530,7 +3514,7 @@
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 268
+ 266
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
@@ -3578,7 +3562,7 @@
Marktgegevens
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 431
+ 429
libs/common/src/lib/routes/routes.ts
@@ -3645,14 +3629,6 @@
71
-
- Dividend Performance
- Dividend Performance
-
- apps/client/src/app/pages/portfolio/analysis/analysis-page.html
- 214
-
-
Yearly
Jaarlijks
@@ -3774,7 +3750,7 @@
Investments
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 246
+ 257
@@ -4050,11 +4026,11 @@
Kosten
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 223
+ 221
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 121
+ 116
@@ -4274,7 +4250,7 @@
Cache has been flushed.
apps/client/src/app/components/admin-overview/admin-overview.component.ts
- 261
+ 262
@@ -4329,6 +4305,18 @@
232
+
+ thereof Dividend Performance
+ thereof Dividend Performance
+
+ apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
+ 178
+
+
+ apps/client/src/app/pages/portfolio/analysis/analysis-page.html
+ 306
+
+
Update Cash Balance
Saldo bijwerken
@@ -4522,7 +4510,7 @@
Verplichtingen
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 387
+ 398
apps/client/src/app/pages/features/features-page.html
@@ -4790,7 +4778,7 @@
Coupon has been created
apps/client/src/app/components/admin-overview/admin-overview.component.ts
- 209
+ 210
@@ -6432,7 +6420,7 @@
Wilt u dit systeembericht echt verwijderen?
apps/client/src/app/components/admin-overview/admin-overview.component.ts
- 240
+ 241
@@ -6484,7 +6472,7 @@
Wilt u dit rekeningsaldo echt verwijderen?
libs/ui/src/lib/account-balances/account-balances.component.ts
- 127
+ 134
@@ -6600,7 +6588,7 @@
Sluit Holding
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 467
+ 465
@@ -6624,7 +6612,7 @@
Absolute Valutaprestaties
apps/client/src/app/pages/portfolio/analysis/analysis-page.html
- 233
+ 194
@@ -6632,7 +6620,7 @@
Valutaprestaties
apps/client/src/app/pages/portfolio/analysis/analysis-page.html
- 257
+ 218
@@ -6885,7 +6873,7 @@
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 246
+ 244
@@ -6893,7 +6881,7 @@
Dividendrendement
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 210
+ 208
@@ -7404,6 +7392,18 @@
15
+
+ thereof Dividend
+ thereof Dividend
+
+ apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
+ 102
+
+
+ apps/client/src/app/pages/portfolio/analysis/analysis-page.html
+ 287
+
+
Close
Sluiten
@@ -7565,11 +7565,11 @@
is naar het klembord gekopieerd
apps/client/src/app/components/admin-overview/admin-overview.component.ts
- 208
+ 209
libs/ui/src/lib/value/value.component.ts
- 202
+ 205
@@ -8015,7 +8015,7 @@
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.ts
- 202
+ 172
apps/client/src/app/components/rule/rule-settings-dialog/rule-settings-dialog.html
@@ -8095,7 +8095,7 @@
AI-prompt is naar het klembord gekopieerd
apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts
- 237
+ 207
@@ -8183,7 +8183,7 @@
Open Duck.ai
apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts
- 238
+ 208
@@ -8203,7 +8203,7 @@
libs/ui/src/lib/treemap-chart/treemap-chart.component.ts
- 423
+ 430
@@ -8243,11 +8243,11 @@
libs/ui/src/lib/treemap-chart/treemap-chart.component.ts
- 423
+ 430
libs/ui/src/lib/treemap-chart/treemap-chart.component.ts
- 436
+ 445
@@ -8565,7 +8565,7 @@
Demo-gebruikersaccount is gesynchroniseerd.
apps/client/src/app/components/admin-overview/admin-overview.component.ts
- 314
+ 315
@@ -9040,7 +9040,7 @@
Beheer activaprofiel
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 495
+ 493
@@ -9151,6 +9151,18 @@
181
+
+ Return on Average Investment (total return with dividends)
+ Return on Average Investment (total return with dividends)
+
+ apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
+ 159
+
+
+ apps/client/src/app/pages/portfolio/analysis/analysis-page.html
+ 264
+
+
No results found...
Geen resultaten gevonden...
diff --git a/apps/client/src/locales/messages.pl.xlf b/apps/client/src/locales/messages.pl.xlf
index c077a7b867..ac3f201a7d 100644
--- a/apps/client/src/locales/messages.pl.xlf
+++ b/apps/client/src/locales/messages.pl.xlf
@@ -919,7 +919,7 @@
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 235
+ 233
libs/ui/src/lib/holdings-table/holdings-table.component.html
@@ -1067,7 +1067,7 @@
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 285
+ 283
@@ -1083,7 +1083,7 @@
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 299
+ 297
apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html
@@ -1103,7 +1103,7 @@
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 305
+ 303
apps/client/src/app/pages/public/public-page.html
@@ -1123,7 +1123,7 @@
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 317
+ 315
@@ -1275,7 +1275,7 @@
Czy naprawdę chcesz usunąć ten kupon?
apps/client/src/app/components/admin-overview/admin-overview.component.ts
- 227
+ 228
@@ -1283,7 +1283,7 @@
Czy naprawdę chcesz usunąć tę wiadomość systemową?
apps/client/src/app/components/admin-overview/admin-overview.component.ts
- 240
+ 241
@@ -1291,7 +1291,7 @@
Czy naprawdę chcesz wyczyścić pamięć podręczną?
apps/client/src/app/components/admin-overview/admin-overview.component.ts
- 270
+ 271
@@ -1299,7 +1299,7 @@
Proszę ustawić swoją wiadomość systemową:
apps/client/src/app/components/admin-overview/admin-overview.component.ts
- 290
+ 291
@@ -1315,7 +1315,7 @@
na Użytkownika
apps/client/src/app/components/admin-overview/admin-overview.component.ts
- 176
+ 177
@@ -1511,7 +1511,7 @@
Cache has been flushed.
apps/client/src/app/components/admin-overview/admin-overview.component.ts
- 261
+ 262
@@ -2063,11 +2063,11 @@
Opłaty
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 223
+ 221
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 121
+ 116
@@ -2075,11 +2075,11 @@
Bezwzględne Osiągi Netto
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 141
+ 136
apps/client/src/app/pages/portfolio/analysis/analysis-page.html
- 279
+ 240
@@ -2087,11 +2087,11 @@
Osiągi Netto
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 156
+ 151
apps/client/src/app/pages/portfolio/analysis/analysis-page.html
- 295
+ 256
@@ -2099,7 +2099,7 @@
Suma Aktywów
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 184
+ 195
@@ -2107,7 +2107,7 @@
Siła Nabywcza
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 324
+ 335
@@ -2115,7 +2115,7 @@
Wykluczone z Analizy
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 356
+ 367
@@ -2123,7 +2123,7 @@
Pasywa (Zobowiązania Finansowe)
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 387
+ 398
apps/client/src/app/pages/features/features-page.html
@@ -2135,7 +2135,7 @@
Wartość Netto
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 407
+ 418
@@ -2143,7 +2143,7 @@
Osiągi w Ujęciu Rocznym
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 422
+ 433
@@ -2151,7 +2151,7 @@
Wprowadź wysokość funduszu rezerwowego:
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.ts
- 204
+ 174
@@ -2199,7 +2199,7 @@
Zgłoś Błąd Danych
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 480
+ 478
@@ -2723,7 +2723,7 @@
Investments
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 246
+ 257
@@ -2959,7 +2959,7 @@
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 411
+ 409
apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html
@@ -3063,7 +3063,7 @@
Dane Rynkowe
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 431
+ 429
libs/common/src/lib/routes/routes.ts
@@ -3515,7 +3515,7 @@
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 215
+ 226
apps/client/src/app/pages/public/public-page.html
@@ -4267,11 +4267,11 @@
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 248
+ 246
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 376
+ 374
apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html
@@ -4350,6 +4350,18 @@
73
+
+ thereof Dividend Performance
+ thereof Dividend Performance
+
+ apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
+ 178
+
+
+ apps/client/src/app/pages/portfolio/analysis/analysis-page.html
+ 306
+
+
Update Cash Balance
Zaktualizuj Saldo Gotówkowe
@@ -4470,14 +4482,6 @@
71
-
- Dividend Performance
- Dividend Performance
-
- apps/client/src/app/pages/portfolio/analysis/analysis-page.html
- 214
-
-
Choose or drop a file here
Wybierz lub przeciągnij plik tutaj
@@ -4751,15 +4755,7 @@
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 199
-
-
- apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 103
-
-
- apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 511
+ 197
apps/client/src/app/pages/features/features-page.html
@@ -4791,7 +4787,7 @@
Depozyt
libs/ui/src/lib/fire-calculator/fire-calculator.component.ts
- 444
+ 446
@@ -5336,7 +5332,7 @@
Coupon has been created
apps/client/src/app/components/admin-overview/admin-overview.component.ts
- 209
+ 210
@@ -5792,11 +5788,11 @@
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 496
+ 507
libs/ui/src/lib/fire-calculator/fire-calculator.component.ts
- 454
+ 456
libs/ui/src/lib/i18n.ts
@@ -5808,7 +5804,7 @@
Oszczędności
libs/ui/src/lib/fire-calculator/fire-calculator.component.ts
- 464
+ 466
@@ -5892,7 +5888,7 @@
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 259
+ 257
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
@@ -5924,7 +5920,7 @@
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 268
+ 266
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
@@ -5964,15 +5960,15 @@
Fundusz Rezerwowy
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 261
+ 272
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 339
+ 350
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 441
+ 452
apps/client/src/app/pages/features/features-page.html
@@ -6116,7 +6112,7 @@
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 337
+ 335
libs/ui/src/lib/i18n.ts
@@ -6248,7 +6244,7 @@
Gotówka
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 293
+ 304
@@ -6275,14 +6271,6 @@
78
-
- Absolute Dividend Performance
- Absolute Dividend Performance
-
- apps/client/src/app/pages/portfolio/analysis/analysis-page.html
- 195
-
-
Africa
Afryka
@@ -6484,7 +6472,7 @@
Czy na pewno chcesz usunąć saldo tego konta?
libs/ui/src/lib/account-balances/account-balances.component.ts
- 127
+ 134
@@ -6600,7 +6588,7 @@
Zamknij pozycję
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 467
+ 465
@@ -6624,7 +6612,7 @@
Łączny wynik walut
apps/client/src/app/pages/portfolio/analysis/analysis-page.html
- 233
+ 194
@@ -6632,7 +6620,7 @@
Wynik walut
apps/client/src/app/pages/portfolio/analysis/analysis-page.html
- 257
+ 218
@@ -6885,7 +6873,7 @@
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 246
+ 244
@@ -6893,7 +6881,7 @@
Dochód z Dywidendy
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 210
+ 208
@@ -7404,6 +7392,18 @@
15
+
+ thereof Dividend
+ thereof Dividend
+
+ apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
+ 102
+
+
+ apps/client/src/app/pages/portfolio/analysis/analysis-page.html
+ 287
+
+
Close
Zamknij
@@ -7565,11 +7565,11 @@
has been copied to the clipboard
apps/client/src/app/components/admin-overview/admin-overview.component.ts
- 208
+ 209
libs/ui/src/lib/value/value.component.ts
- 202
+ 205
@@ -8015,7 +8015,7 @@
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.ts
- 202
+ 172
apps/client/src/app/components/rule/rule-settings-dialog/rule-settings-dialog.html
@@ -8095,7 +8095,7 @@
Prompt AI został skopiowany do schowka
apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts
- 237
+ 207
@@ -8183,7 +8183,7 @@
Otwórz Duck.ai
apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts
- 238
+ 208
@@ -8203,7 +8203,7 @@
libs/ui/src/lib/treemap-chart/treemap-chart.component.ts
- 423
+ 430
@@ -8243,11 +8243,11 @@
libs/ui/src/lib/treemap-chart/treemap-chart.component.ts
- 423
+ 430
libs/ui/src/lib/treemap-chart/treemap-chart.component.ts
- 436
+ 445
@@ -8565,7 +8565,7 @@
Konto użytkownika demonstracyjnego zostało zsynchronizowane.
apps/client/src/app/components/admin-overview/admin-overview.component.ts
- 314
+ 315
@@ -9040,7 +9040,7 @@
Zarządzaj profilem aktywów
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 495
+ 493
@@ -9151,6 +9151,18 @@
181
+
+ Return on Average Investment (total return with dividends)
+ Return on Average Investment (total return with dividends)
+
+ apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
+ 159
+
+
+ apps/client/src/app/pages/portfolio/analysis/analysis-page.html
+ 264
+
+
No results found...
Nie znaleziono wyników...
diff --git a/apps/client/src/locales/messages.pt.xlf b/apps/client/src/locales/messages.pt.xlf
index 30b412b8d7..7c0f1fd99c 100644
--- a/apps/client/src/locales/messages.pt.xlf
+++ b/apps/client/src/locales/messages.pt.xlf
@@ -638,7 +638,7 @@
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 235
+ 233
libs/ui/src/lib/holdings-table/holdings-table.component.html
@@ -706,7 +706,7 @@
Deseja realmente eliminar este cupão?
apps/client/src/app/components/admin-overview/admin-overview.component.ts
- 227
+ 228
@@ -714,7 +714,7 @@
Deseja realmente limpar a cache?
apps/client/src/app/components/admin-overview/admin-overview.component.ts
- 270
+ 271
@@ -722,7 +722,7 @@
Por favor, defina a sua mensagem do sistema:
apps/client/src/app/components/admin-overview/admin-overview.component.ts
- 290
+ 291
@@ -730,7 +730,7 @@
por Utilizador
apps/client/src/app/components/admin-overview/admin-overview.component.ts
- 176
+ 177
@@ -1058,7 +1058,7 @@
Depósito
libs/ui/src/lib/fire-calculator/fire-calculator.component.ts
- 444
+ 446
@@ -1206,11 +1206,11 @@
Desempenho Líquido Absoluto
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 141
+ 136
apps/client/src/app/pages/portfolio/analysis/analysis-page.html
- 279
+ 240
@@ -1218,11 +1218,11 @@
Desempenho Líquido
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 156
+ 151
apps/client/src/app/pages/portfolio/analysis/analysis-page.html
- 295
+ 256
@@ -1230,7 +1230,7 @@
Ativos Totais
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 184
+ 195
@@ -1238,7 +1238,7 @@
Poder de Compra
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 324
+ 335
@@ -1246,7 +1246,7 @@
Excluído da Análise
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 356
+ 367
@@ -1254,7 +1254,7 @@
Valor Líquido
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 407
+ 418
@@ -1262,7 +1262,7 @@
Desempenho Anual
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 422
+ 433
@@ -1270,7 +1270,7 @@
Por favor, insira o valor do seu fundo de emergência:
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.ts
- 204
+ 174
@@ -1330,7 +1330,7 @@
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 285
+ 283
@@ -1346,7 +1346,7 @@
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 299
+ 297
apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html
@@ -1366,7 +1366,7 @@
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 305
+ 303
apps/client/src/app/pages/public/public-page.html
@@ -1386,7 +1386,7 @@
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 317
+ 315
@@ -1410,7 +1410,7 @@
Dados do Relatório com Problema
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 480
+ 478
@@ -1950,7 +1950,7 @@
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 411
+ 409
apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html
@@ -2310,11 +2310,11 @@
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 248
+ 246
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 376
+ 374
apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html
@@ -2742,7 +2742,7 @@
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 215
+ 226
apps/client/src/app/pages/public/public-page.html
@@ -3106,11 +3106,11 @@
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 496
+ 507
libs/ui/src/lib/fire-calculator/fire-calculator.component.ts
- 454
+ 456
libs/ui/src/lib/i18n.ts
@@ -3122,7 +3122,7 @@
Poupanças
libs/ui/src/lib/fire-calculator/fire-calculator.component.ts
- 464
+ 466
@@ -3162,7 +3162,7 @@
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 259
+ 257
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
@@ -3182,15 +3182,15 @@
Fundo de Emergência
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 261
+ 272
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 339
+ 350
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 441
+ 452
apps/client/src/app/pages/features/features-page.html
@@ -3238,7 +3238,7 @@
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 337
+ 335
libs/ui/src/lib/i18n.ts
@@ -3270,7 +3270,7 @@
Dinheiro
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 293
+ 304
@@ -3297,14 +3297,6 @@
78
-
- Absolute Dividend Performance
- Absolute Dividend Performance
-
- apps/client/src/app/pages/portfolio/analysis/analysis-page.html
- 195
-
-
Africa
África
@@ -3478,7 +3470,7 @@
Dados de Mercado
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 431
+ 429
libs/common/src/lib/routes/routes.ts
@@ -3554,15 +3546,7 @@
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 199
-
-
- apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 103
-
-
- apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 511
+ 197
apps/client/src/app/pages/features/features-page.html
@@ -3614,7 +3598,7 @@
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 268
+ 266
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
@@ -3645,14 +3629,6 @@
71
-
- Dividend Performance
- Dividend Performance
-
- apps/client/src/app/pages/portfolio/analysis/analysis-page.html
- 214
-
-
Yearly
Anualmente
@@ -3774,7 +3750,7 @@
Investments
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 246
+ 257
@@ -4050,11 +4026,11 @@
Taxas
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 223
+ 221
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 121
+ 116
@@ -4274,7 +4250,7 @@
Cache has been flushed.
apps/client/src/app/components/admin-overview/admin-overview.component.ts
- 261
+ 262
@@ -4329,6 +4305,18 @@
232
+
+ thereof Dividend Performance
+ thereof Dividend Performance
+
+ apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
+ 178
+
+
+ apps/client/src/app/pages/portfolio/analysis/analysis-page.html
+ 306
+
+
Update Cash Balance
Atualizar saldo em Dinheiro
@@ -4522,7 +4510,7 @@
Responsabilidades
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 387
+ 398
apps/client/src/app/pages/features/features-page.html
@@ -4790,7 +4778,7 @@
Coupon has been created
apps/client/src/app/components/admin-overview/admin-overview.component.ts
- 209
+ 210
@@ -6432,7 +6420,7 @@
Você realmente deseja excluir esta mensagem do sistema?
apps/client/src/app/components/admin-overview/admin-overview.component.ts
- 240
+ 241
@@ -6484,7 +6472,7 @@
Você realmente deseja excluir o saldo desta conta?
libs/ui/src/lib/account-balances/account-balances.component.ts
- 127
+ 134
@@ -6600,7 +6588,7 @@
Close Holding
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 467
+ 465
@@ -6624,7 +6612,7 @@
Desempenho absoluto da moeda
apps/client/src/app/pages/portfolio/analysis/analysis-page.html
- 233
+ 194
@@ -6632,7 +6620,7 @@
Desempenho da moeda
apps/client/src/app/pages/portfolio/analysis/analysis-page.html
- 257
+ 218
@@ -6885,7 +6873,7 @@
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 246
+ 244
@@ -6893,7 +6881,7 @@
Rendimento de dividendos
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 210
+ 208
@@ -7404,6 +7392,18 @@
15
+
+ thereof Dividend
+ thereof Dividend
+
+ apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
+ 102
+
+
+ apps/client/src/app/pages/portfolio/analysis/analysis-page.html
+ 287
+
+
Close
Fechar
@@ -7565,11 +7565,11 @@
has been copied to the clipboard
apps/client/src/app/components/admin-overview/admin-overview.component.ts
- 208
+ 209
libs/ui/src/lib/value/value.component.ts
- 202
+ 205
@@ -8015,7 +8015,7 @@
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.ts
- 202
+ 172
apps/client/src/app/components/rule/rule-settings-dialog/rule-settings-dialog.html
@@ -8095,7 +8095,7 @@
AI prompt has been copied to the clipboard
apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts
- 237
+ 207
@@ -8183,7 +8183,7 @@
Open Duck.ai
apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts
- 238
+ 208
@@ -8203,7 +8203,7 @@
libs/ui/src/lib/treemap-chart/treemap-chart.component.ts
- 423
+ 430
@@ -8243,11 +8243,11 @@
libs/ui/src/lib/treemap-chart/treemap-chart.component.ts
- 423
+ 430
libs/ui/src/lib/treemap-chart/treemap-chart.component.ts
- 436
+ 445
@@ -8565,7 +8565,7 @@
Demo user account has been synced.
apps/client/src/app/components/admin-overview/admin-overview.component.ts
- 314
+ 315
@@ -9040,7 +9040,7 @@
Gerenciar perfil de ativos
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 495
+ 493
@@ -9151,6 +9151,18 @@
181
+
+ Return on Average Investment (total return with dividends)
+ Return on Average Investment (total return with dividends)
+
+ apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
+ 159
+
+
+ apps/client/src/app/pages/portfolio/analysis/analysis-page.html
+ 264
+
+
No results found...
Nenhum resultado encontrado...
diff --git a/apps/client/src/locales/messages.tr.xlf b/apps/client/src/locales/messages.tr.xlf
index dc518742c1..cd218919d0 100644
--- a/apps/client/src/locales/messages.tr.xlf
+++ b/apps/client/src/locales/messages.tr.xlf
@@ -863,7 +863,7 @@
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 235
+ 233
libs/ui/src/lib/holdings-table/holdings-table.component.html
@@ -979,7 +979,7 @@
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 285
+ 283
@@ -995,7 +995,7 @@
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 299
+ 297
apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html
@@ -1015,7 +1015,7 @@
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 305
+ 303
apps/client/src/app/pages/public/public-page.html
@@ -1035,7 +1035,7 @@
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 317
+ 315
@@ -1163,7 +1163,7 @@
Bu kuponu gerçekten silmek istiyor musunuz?
apps/client/src/app/components/admin-overview/admin-overview.component.ts
- 227
+ 228
@@ -1171,7 +1171,7 @@
Önbelleği temizlemeyi gerçekten istiyor musunuz?
apps/client/src/app/components/admin-overview/admin-overview.component.ts
- 270
+ 271
@@ -1179,7 +1179,7 @@
Lütfen sistem mesajınızı belirleyin:
apps/client/src/app/components/admin-overview/admin-overview.component.ts
- 290
+ 291
@@ -1187,7 +1187,7 @@
Kullanıcı başına
apps/client/src/app/components/admin-overview/admin-overview.component.ts
- 176
+ 177
@@ -1399,7 +1399,7 @@
Cache has been flushed.
apps/client/src/app/components/admin-overview/admin-overview.component.ts
- 261
+ 262
@@ -1903,11 +1903,11 @@
Toplam Net Performans
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 141
+ 136
apps/client/src/app/pages/portfolio/analysis/analysis-page.html
- 279
+ 240
@@ -1915,11 +1915,11 @@
Net Performans
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 156
+ 151
apps/client/src/app/pages/portfolio/analysis/analysis-page.html
- 295
+ 256
@@ -1927,7 +1927,7 @@
Toplam Varlıklar
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 184
+ 195
@@ -1935,7 +1935,7 @@
Alım Limiti
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 324
+ 335
@@ -1943,7 +1943,7 @@
Analize Dahil Edilmemiştir.
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 356
+ 367
@@ -1951,7 +1951,7 @@
Yükümlülükler
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 387
+ 398
apps/client/src/app/pages/features/features-page.html
@@ -1963,7 +1963,7 @@
Toplam Varlık
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 407
+ 418
@@ -1971,7 +1971,7 @@
Yıllıklandırılmış Performans
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 422
+ 433
@@ -1979,7 +1979,7 @@
Lütfen acil durum yedeği meblağını giriniz:
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.ts
- 204
+ 174
@@ -2027,11 +2027,11 @@
Komisyon
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 223
+ 221
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 121
+ 116
@@ -2039,7 +2039,7 @@
Rapor Veri Sorunu
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 480
+ 478
@@ -2463,7 +2463,7 @@
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 411
+ 409
apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html
@@ -2535,7 +2535,7 @@
Piyasa Verileri
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 431
+ 429
libs/common/src/lib/routes/routes.ts
@@ -2999,7 +2999,7 @@
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 215
+ 226
apps/client/src/app/pages/public/public-page.html
@@ -3523,11 +3523,11 @@
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 248
+ 246
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 376
+ 374
apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html
@@ -3582,6 +3582,18 @@
73
+
+ thereof Dividend Performance
+ thereof Dividend Performance
+
+ apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
+ 178
+
+
+ apps/client/src/app/pages/portfolio/analysis/analysis-page.html
+ 306
+
+
Update Cash Balance
Nakit Bakiyesini Güncelle
@@ -3702,14 +3714,6 @@
71
-
- Dividend Performance
- Dividend Performance
-
- apps/client/src/app/pages/portfolio/analysis/analysis-page.html
- 214
-
-
The following file formats are supported:
Aşağıdaki dosya formatları desteklenmektedir:
@@ -3991,15 +3995,7 @@
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 199
-
-
- apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 103
-
-
- apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 511
+ 197
apps/client/src/app/pages/features/features-page.html
@@ -4031,7 +4027,7 @@
Para Yatırma
libs/ui/src/lib/fire-calculator/fire-calculator.component.ts
- 444
+ 446
@@ -4588,7 +4584,7 @@
Coupon has been created
apps/client/src/app/components/admin-overview/admin-overview.component.ts
- 209
+ 210
@@ -5076,7 +5072,7 @@
Investments
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 246
+ 257
@@ -5328,11 +5324,11 @@
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 496
+ 507
libs/ui/src/lib/fire-calculator/fire-calculator.component.ts
- 454
+ 456
libs/ui/src/lib/i18n.ts
@@ -5344,7 +5340,7 @@
Tasarruflar
libs/ui/src/lib/fire-calculator/fire-calculator.component.ts
- 464
+ 466
@@ -5428,7 +5424,7 @@
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 259
+ 257
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
@@ -5460,7 +5456,7 @@
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 268
+ 266
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
@@ -5500,15 +5496,15 @@
Acil Durum Fonu
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 261
+ 272
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 339
+ 350
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 441
+ 452
apps/client/src/app/pages/features/features-page.html
@@ -5652,7 +5648,7 @@
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 337
+ 335
libs/ui/src/lib/i18n.ts
@@ -5768,7 +5764,7 @@
Nakit
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 293
+ 304
@@ -5795,14 +5791,6 @@
78
-
- Absolute Dividend Performance
- Absolute Dividend Performance
-
- apps/client/src/app/pages/portfolio/analysis/analysis-page.html
- 195
-
-
Africa
Afrika
@@ -6432,7 +6420,7 @@
Bu sistem mesajını silmeyi gerçekten istiyor musunuz?
apps/client/src/app/components/admin-overview/admin-overview.component.ts
- 240
+ 241
@@ -6484,7 +6472,7 @@
Bu nakit bakiyesini silmeyi gerçekten istiyor musunuz?
libs/ui/src/lib/account-balances/account-balances.component.ts
- 127
+ 134
@@ -6600,7 +6588,7 @@
Close Holding
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 467
+ 465
@@ -6624,7 +6612,7 @@
Mutlak Para Performansı
apps/client/src/app/pages/portfolio/analysis/analysis-page.html
- 233
+ 194
@@ -6632,7 +6620,7 @@
Para Performansı
apps/client/src/app/pages/portfolio/analysis/analysis-page.html
- 257
+ 218
@@ -6885,7 +6873,7 @@
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 246
+ 244
@@ -6893,7 +6881,7 @@
Temettü Getiri
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 210
+ 208
@@ -7404,6 +7392,18 @@
15
+
+ thereof Dividend
+ thereof Dividend
+
+ apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
+ 102
+
+
+ apps/client/src/app/pages/portfolio/analysis/analysis-page.html
+ 287
+
+
Close
Kapat
@@ -7565,11 +7565,11 @@
has been copied to the clipboard
apps/client/src/app/components/admin-overview/admin-overview.component.ts
- 208
+ 209
libs/ui/src/lib/value/value.component.ts
- 202
+ 205
@@ -8015,7 +8015,7 @@
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.ts
- 202
+ 172
apps/client/src/app/components/rule/rule-settings-dialog/rule-settings-dialog.html
@@ -8095,7 +8095,7 @@
Yapay zeka istemi panoya kopyalandı
apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts
- 237
+ 207
@@ -8183,7 +8183,7 @@
Duck.ai’yi aç
apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts
- 238
+ 208
@@ -8203,7 +8203,7 @@
libs/ui/src/lib/treemap-chart/treemap-chart.component.ts
- 423
+ 430
@@ -8243,11 +8243,11 @@
libs/ui/src/lib/treemap-chart/treemap-chart.component.ts
- 423
+ 430
libs/ui/src/lib/treemap-chart/treemap-chart.component.ts
- 436
+ 445
@@ -8565,7 +8565,7 @@
Demo kullanıcı hesabı senkronize edildi.
apps/client/src/app/components/admin-overview/admin-overview.component.ts
- 314
+ 315
@@ -9040,7 +9040,7 @@
Manage Asset Profile
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 495
+ 493
@@ -9151,6 +9151,18 @@
181
+
+ Return on Average Investment (total return with dividends)
+ Return on Average Investment (total return with dividends)
+
+ apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
+ 159
+
+
+ apps/client/src/app/pages/portfolio/analysis/analysis-page.html
+ 264
+
+
No results found...
No results found...
diff --git a/apps/client/src/locales/messages.uk.xlf b/apps/client/src/locales/messages.uk.xlf
index ede339d5d4..10d1c0afd2 100644
--- a/apps/client/src/locales/messages.uk.xlf
+++ b/apps/client/src/locales/messages.uk.xlf
@@ -1027,7 +1027,7 @@
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 235
+ 233
libs/ui/src/lib/holdings-table/holdings-table.component.html
@@ -1187,7 +1187,7 @@
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 285
+ 283
@@ -1203,7 +1203,7 @@
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 299
+ 297
apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html
@@ -1223,7 +1223,7 @@
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 305
+ 303
apps/client/src/app/pages/public/public-page.html
@@ -1243,7 +1243,7 @@
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 317
+ 315
@@ -1455,7 +1455,7 @@
Ви дійсно хочете видалити цей купон?
apps/client/src/app/components/admin-overview/admin-overview.component.ts
- 227
+ 228
@@ -1463,7 +1463,7 @@
Ви дійсно хочете видалити це системне повідомлення?
apps/client/src/app/components/admin-overview/admin-overview.component.ts
- 240
+ 241
@@ -1471,7 +1471,7 @@
Ви дійсно хочете очистити кеш?
apps/client/src/app/components/admin-overview/admin-overview.component.ts
- 270
+ 271
@@ -1479,7 +1479,7 @@
Будь ласка, встановіть ваше системне повідомлення:
apps/client/src/app/components/admin-overview/admin-overview.component.ts
- 290
+ 291
@@ -1495,7 +1495,7 @@
на користувача
apps/client/src/app/components/admin-overview/admin-overview.component.ts
- 176
+ 177
@@ -1667,7 +1667,7 @@
Cache has been flushed.
apps/client/src/app/components/admin-overview/admin-overview.component.ts
- 261
+ 262
@@ -2139,7 +2139,7 @@
Дохідність дивіденду
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 210
+ 208
@@ -2147,11 +2147,11 @@
Комісії
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 223
+ 221
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 121
+ 116
@@ -2163,7 +2163,7 @@
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 246
+ 244
@@ -2171,7 +2171,7 @@
Повідомити про збій даних
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 480
+ 478
@@ -2491,11 +2491,11 @@
Абсолютний чистий прибуток
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 141
+ 136
apps/client/src/app/pages/portfolio/analysis/analysis-page.html
- 279
+ 240
@@ -2503,11 +2503,11 @@
Чистий прибуток
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 156
+ 151
apps/client/src/app/pages/portfolio/analysis/analysis-page.html
- 295
+ 256
@@ -2515,7 +2515,7 @@
Загальні активи
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 184
+ 195
@@ -2523,7 +2523,7 @@
Купівельна спроможність
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 324
+ 335
@@ -2531,7 +2531,7 @@
Виключено з аналізу
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 356
+ 367
@@ -2539,7 +2539,7 @@
Зобов’язання
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 387
+ 398
apps/client/src/app/pages/features/features-page.html
@@ -2551,7 +2551,7 @@
Чиста вартість
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 407
+ 418
@@ -2559,7 +2559,7 @@
Річна доходність
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 422
+ 433
@@ -2587,7 +2587,7 @@
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.ts
- 202
+ 172
apps/client/src/app/components/rule/rule-settings-dialog/rule-settings-dialog.html
@@ -2615,7 +2615,7 @@
Будь ласка, встановіть суму вашого резервного фонду.
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.ts
- 204
+ 174
@@ -3359,7 +3359,7 @@
Інвестиції
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 246
+ 257
@@ -3607,7 +3607,7 @@
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 411
+ 409
apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html
@@ -3723,7 +3723,7 @@
Ринкові дані
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 431
+ 429
libs/common/src/lib/routes/routes.ts
@@ -4200,7 +4200,7 @@
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 215
+ 226
apps/client/src/app/pages/public/public-page.html
@@ -4968,11 +4968,11 @@
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 248
+ 246
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 376
+ 374
apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html
@@ -5051,6 +5051,18 @@
73
+
+ thereof Dividend Performance
+ thereof Dividend Performance
+
+ apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
+ 178
+
+
+ apps/client/src/app/pages/portfolio/analysis/analysis-page.html
+ 306
+
+
Update Cash Balance
Оновити баланс готівки
@@ -5207,14 +5219,6 @@
71
-
- Dividend Performance
- Dividend Performance
-
- apps/client/src/app/pages/portfolio/analysis/analysis-page.html
- 214
-
-
Choose or drop a file here
Виберіть або перетягніть файл сюди
@@ -5520,15 +5524,7 @@
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 199
-
-
- apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 103
-
-
- apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 511
+ 197
apps/client/src/app/pages/features/features-page.html
@@ -5596,7 +5592,7 @@
Закрити позицію
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 467
+ 465
@@ -5620,7 +5616,7 @@
Абсолютна прибутковість валюти
apps/client/src/app/pages/portfolio/analysis/analysis-page.html
- 233
+ 194
@@ -5628,7 +5624,7 @@
Прибутковість валюти
apps/client/src/app/pages/portfolio/analysis/analysis-page.html
- 257
+ 218
@@ -5980,11 +5976,11 @@
скопійовано в буфер обміну
apps/client/src/app/components/admin-overview/admin-overview.component.ts
- 208
+ 209
libs/ui/src/lib/value/value.component.ts
- 202
+ 205
@@ -6499,7 +6495,7 @@
Купон створено
apps/client/src/app/components/admin-overview/admin-overview.component.ts
- 209
+ 210
@@ -6919,7 +6915,7 @@
Ви дійсно хочете видалити цей рахунок?
libs/ui/src/lib/account-balances/account-balances.component.ts
- 127
+ 134
@@ -7243,7 +7239,7 @@
Депозит
libs/ui/src/lib/fire-calculator/fire-calculator.component.ts
- 444
+ 446
@@ -7255,11 +7251,11 @@
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 496
+ 507
libs/ui/src/lib/fire-calculator/fire-calculator.component.ts
- 454
+ 456
libs/ui/src/lib/i18n.ts
@@ -7271,7 +7267,7 @@
Заощадження
libs/ui/src/lib/fire-calculator/fire-calculator.component.ts
- 464
+ 466
@@ -7379,7 +7375,7 @@
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 259
+ 257
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
@@ -7411,7 +7407,7 @@
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 268
+ 266
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
@@ -7494,6 +7490,18 @@
16
+
+ thereof Dividend
+ thereof Dividend
+
+ apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
+ 102
+
+
+ apps/client/src/app/pages/portfolio/analysis/analysis-page.html
+ 287
+
+
Close
Закрити
@@ -7567,15 +7575,15 @@
Резервний фонд
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 261
+ 272
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 339
+ 350
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 441
+ 452
apps/client/src/app/pages/features/features-page.html
@@ -7727,7 +7735,7 @@
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 337
+ 335
libs/ui/src/lib/i18n.ts
@@ -7875,7 +7883,7 @@
Готівка
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 293
+ 304
@@ -7902,14 +7910,6 @@
78
-
- Absolute Dividend Performance
- Absolute Dividend Performance
-
- apps/client/src/app/pages/portfolio/analysis/analysis-page.html
- 195
-
-
Africa
Африка
@@ -8103,7 +8103,7 @@
Запит AI скопійовано в буфер обміну
apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts
- 237
+ 207
@@ -8183,7 +8183,7 @@
Відкрити Duck.ai
apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts
- 238
+ 208
@@ -8203,7 +8203,7 @@
libs/ui/src/lib/treemap-chart/treemap-chart.component.ts
- 423
+ 430
@@ -8243,11 +8243,11 @@
libs/ui/src/lib/treemap-chart/treemap-chart.component.ts
- 423
+ 430
libs/ui/src/lib/treemap-chart/treemap-chart.component.ts
- 436
+ 445
@@ -8565,7 +8565,7 @@
Обліковий запис демо-користувача синхронізовано.
apps/client/src/app/components/admin-overview/admin-overview.component.ts
- 314
+ 315
@@ -9040,7 +9040,7 @@
Керувати профілем активу
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 495
+ 493
@@ -9151,6 +9151,18 @@
181
+
+ Return on Average Investment (total return with dividends)
+ Return on Average Investment (total return with dividends)
+
+ apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
+ 159
+
+
+ apps/client/src/app/pages/portfolio/analysis/analysis-page.html
+ 264
+
+
No results found...
Результатів не знайдено...
diff --git a/apps/client/src/locales/messages.xlf b/apps/client/src/locales/messages.xlf
index 9250c9276d..a4be3e47d6 100644
--- a/apps/client/src/locales/messages.xlf
+++ b/apps/client/src/locales/messages.xlf
@@ -865,7 +865,7 @@
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 235
+ 233
libs/ui/src/lib/holdings-table/holdings-table.component.html
@@ -1019,7 +1019,7 @@
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 285
+ 283
@@ -1034,7 +1034,7 @@
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 299
+ 297
apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html
@@ -1053,7 +1053,7 @@
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 305
+ 303
apps/client/src/app/pages/public/public-page.html
@@ -1072,7 +1072,7 @@
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 317
+ 315
@@ -1209,28 +1209,28 @@
Do you really want to delete this coupon?
apps/client/src/app/components/admin-overview/admin-overview.component.ts
- 227
+ 228
Do you really want to delete this system message?
apps/client/src/app/components/admin-overview/admin-overview.component.ts
- 240
+ 241
Do you really want to flush the cache?
apps/client/src/app/components/admin-overview/admin-overview.component.ts
- 270
+ 271
Please set your system message:
apps/client/src/app/components/admin-overview/admin-overview.component.ts
- 290
+ 291
@@ -1244,7 +1244,7 @@
per User
apps/client/src/app/components/admin-overview/admin-overview.component.ts
- 176
+ 177
@@ -1418,7 +1418,7 @@
Cache has been flushed.
apps/client/src/app/components/admin-overview/admin-overview.component.ts
- 261
+ 262
@@ -1918,61 +1918,61 @@
Fees
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 223
+ 221
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 121
+ 116
Absolute Net Performance
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 141
+ 136
apps/client/src/app/pages/portfolio/analysis/analysis-page.html
- 279
+ 240
Net Performance
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 156
+ 151
apps/client/src/app/pages/portfolio/analysis/analysis-page.html
- 295
+ 256
Total Assets
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 184
+ 195
Buying Power
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 324
+ 335
Excluded from Analysis
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 356
+ 367
Liabilities
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 387
+ 398
apps/client/src/app/pages/features/features-page.html
@@ -1983,21 +1983,21 @@
Net Worth
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 407
+ 418
Annualized Performance
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 422
+ 433
Please set the amount of your emergency fund.
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.ts
- 204
+ 174
@@ -2041,7 +2041,7 @@
Report Data Glitch
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 480
+ 478
@@ -2516,7 +2516,7 @@
Investments
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 246
+ 257
@@ -2733,7 +2733,7 @@
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 411
+ 409
apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html
@@ -2827,7 +2827,7 @@
Market Data
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 431
+ 429
libs/common/src/lib/routes/routes.ts
@@ -3250,7 +3250,7 @@
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 215
+ 226
apps/client/src/app/pages/public/public-page.html
@@ -3927,11 +3927,11 @@
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 248
+ 246
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 376
+ 374
apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html
@@ -4003,6 +4003,17 @@
73
+
+ thereof Dividend Performance
+
+ apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
+ 178
+
+
+ apps/client/src/app/pages/portfolio/analysis/analysis-page.html
+ 306
+
+
Update Cash Balance
@@ -4111,13 +4122,6 @@
71
-
- Dividend Performance
-
- apps/client/src/app/pages/portfolio/analysis/analysis-page.html
- 214
-
-
Choose or drop a file here
@@ -4361,15 +4365,7 @@
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 199
-
-
- apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 103
-
-
- apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 511
+ 197
apps/client/src/app/pages/features/features-page.html
@@ -4399,7 +4395,7 @@
Deposit
libs/ui/src/lib/fire-calculator/fire-calculator.component.ts
- 444
+ 446
@@ -4886,7 +4882,7 @@
Coupon has been created
apps/client/src/app/components/admin-overview/admin-overview.component.ts
- 209
+ 210
@@ -5153,7 +5149,7 @@
Do you really want to delete this account balance?
libs/ui/src/lib/account-balances/account-balances.component.ts
- 127
+ 134
@@ -5338,11 +5334,11 @@
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 496
+ 507
libs/ui/src/lib/fire-calculator/fire-calculator.component.ts
- 454
+ 456
libs/ui/src/lib/i18n.ts
@@ -5353,7 +5349,7 @@
Savings
libs/ui/src/lib/fire-calculator/fire-calculator.component.ts
- 464
+ 466
@@ -5432,7 +5428,7 @@
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 259
+ 257
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
@@ -5463,7 +5459,7 @@
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 268
+ 266
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
@@ -5499,15 +5495,15 @@
Emergency Fund
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 261
+ 272
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 339
+ 350
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 441
+ 452
apps/client/src/app/pages/features/features-page.html
@@ -5630,7 +5626,7 @@
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 337
+ 335
libs/ui/src/lib/i18n.ts
@@ -5749,7 +5745,7 @@
Cash
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 293
+ 304
@@ -5773,13 +5769,6 @@
78
-
- Absolute Dividend Performance
-
- apps/client/src/app/pages/portfolio/analysis/analysis-page.html
- 195
-
-
Africa
@@ -5999,14 +5988,14 @@
Absolute Currency Performance
apps/client/src/app/pages/portfolio/analysis/analysis-page.html
- 233
+ 194
Close Holding
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 467
+ 465
@@ -6045,7 +6034,7 @@
Currency Performance
apps/client/src/app/pages/portfolio/analysis/analysis-page.html
- 257
+ 218
@@ -6272,14 +6261,14 @@
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 246
+ 244
Dividend Yield
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 210
+ 208
@@ -6734,6 +6723,17 @@
92
+
+ thereof Dividend
+
+ apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
+ 102
+
+
+ apps/client/src/app/pages/portfolio/analysis/analysis-page.html
+ 287
+
+
Close
@@ -6901,11 +6901,11 @@
has been copied to the clipboard
apps/client/src/app/components/admin-overview/admin-overview.component.ts
- 208
+ 209
libs/ui/src/lib/value/value.component.ts
- 202
+ 205
@@ -7292,7 +7292,7 @@
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.ts
- 202
+ 172
apps/client/src/app/components/rule/rule-settings-dialog/rule-settings-dialog.html
@@ -7365,7 +7365,7 @@
AI prompt has been copied to the clipboard
apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts
- 237
+ 207
@@ -7442,7 +7442,7 @@
Open Duck.ai
apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts
- 238
+ 208
@@ -7460,7 +7460,7 @@
libs/ui/src/lib/treemap-chart/treemap-chart.component.ts
- 423
+ 430
@@ -7497,11 +7497,11 @@
libs/ui/src/lib/treemap-chart/treemap-chart.component.ts
- 423
+ 430
libs/ui/src/lib/treemap-chart/treemap-chart.component.ts
- 436
+ 445
@@ -7769,7 +7769,7 @@
Demo user account has been synced.
apps/client/src/app/components/admin-overview/admin-overview.component.ts
- 314
+ 315
@@ -8183,7 +8183,7 @@
Manage Asset Profile
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 495
+ 493
@@ -8197,6 +8197,17 @@
106
+
+ Return on Average Investment (total return with dividends)
+
+ apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
+ 159
+
+
+ apps/client/src/app/pages/portfolio/analysis/analysis-page.html
+ 264
+
+
No results found...
diff --git a/apps/client/src/locales/messages.zh.xlf b/apps/client/src/locales/messages.zh.xlf
index 1f4cc36b00..ef14d59336 100644
--- a/apps/client/src/locales/messages.zh.xlf
+++ b/apps/client/src/locales/messages.zh.xlf
@@ -928,7 +928,7 @@
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 235
+ 233
libs/ui/src/lib/holdings-table/holdings-table.component.html
@@ -1076,7 +1076,7 @@
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 285
+ 283
@@ -1092,7 +1092,7 @@
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 299
+ 297
apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html
@@ -1112,7 +1112,7 @@
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 305
+ 303
apps/client/src/app/pages/public/public-page.html
@@ -1132,7 +1132,7 @@
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 317
+ 315
@@ -1284,7 +1284,7 @@
您确实要删除此优惠券吗?
apps/client/src/app/components/admin-overview/admin-overview.component.ts
- 227
+ 228
@@ -1292,7 +1292,7 @@
您真的要删除这条系统消息吗?
apps/client/src/app/components/admin-overview/admin-overview.component.ts
- 240
+ 241
@@ -1300,7 +1300,7 @@
您真的要刷新缓存吗?
apps/client/src/app/components/admin-overview/admin-overview.component.ts
- 270
+ 271
@@ -1308,7 +1308,7 @@
请设置您的系统消息:
apps/client/src/app/components/admin-overview/admin-overview.component.ts
- 290
+ 291
@@ -1324,7 +1324,7 @@
每位用户
apps/client/src/app/components/admin-overview/admin-overview.component.ts
- 176
+ 177
@@ -1520,7 +1520,7 @@
缓存已刷新。
apps/client/src/app/components/admin-overview/admin-overview.component.ts
- 261
+ 262
@@ -2072,11 +2072,11 @@
费用
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 223
+ 221
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 121
+ 116
@@ -2084,11 +2084,11 @@
绝对净绩效
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 141
+ 136
apps/client/src/app/pages/portfolio/analysis/analysis-page.html
- 279
+ 240
@@ -2096,11 +2096,11 @@
净绩效
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 156
+ 151
apps/client/src/app/pages/portfolio/analysis/analysis-page.html
- 295
+ 256
@@ -2108,7 +2108,7 @@
总资产
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 184
+ 195
@@ -2116,7 +2116,7 @@
购买力
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 324
+ 335
@@ -2124,7 +2124,7 @@
从分析中排除
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 356
+ 367
@@ -2132,7 +2132,7 @@
负债
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 387
+ 398
apps/client/src/app/pages/features/features-page.html
@@ -2144,7 +2144,7 @@
净值
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 407
+ 418
@@ -2152,7 +2152,7 @@
年化业绩
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 422
+ 433
@@ -2160,7 +2160,7 @@
请输入您的应急基金金额。
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.ts
- 204
+ 174
@@ -2208,7 +2208,7 @@
报告数据故障
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 480
+ 478
@@ -2732,7 +2732,7 @@
投资
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 246
+ 257
@@ -2968,7 +2968,7 @@
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 411
+ 409
apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html
@@ -3072,7 +3072,7 @@
市场数据
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 431
+ 429
libs/common/src/lib/routes/routes.ts
@@ -3524,7 +3524,7 @@
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 215
+ 226
apps/client/src/app/pages/public/public-page.html
@@ -4284,11 +4284,11 @@
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 248
+ 246
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 376
+ 374
apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html
@@ -4367,6 +4367,18 @@
73
+
+ thereof Dividend Performance
+ thereof Dividend Performance
+
+ apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
+ 178
+
+
+ apps/client/src/app/pages/portfolio/analysis/analysis-page.html
+ 306
+
+
Update Cash Balance
更新现金余额
@@ -4487,14 +4499,6 @@
71
-
- Dividend Performance
- Dividend Performance
-
- apps/client/src/app/pages/portfolio/analysis/analysis-page.html
- 214
-
-
Choose or drop a file here
在此处选择或放置文件
@@ -4768,15 +4772,7 @@
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 199
-
-
- apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 103
-
-
- apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 511
+ 197
apps/client/src/app/pages/features/features-page.html
@@ -4808,7 +4804,7 @@
存款
libs/ui/src/lib/fire-calculator/fire-calculator.component.ts
- 444
+ 446
@@ -5353,7 +5349,7 @@
优惠券 已创建
apps/client/src/app/components/admin-overview/admin-overview.component.ts
- 209
+ 210
@@ -5645,7 +5641,7 @@
您确实要删除该帐户余额吗?
libs/ui/src/lib/account-balances/account-balances.component.ts
- 127
+ 134
@@ -5853,11 +5849,11 @@
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 496
+ 507
libs/ui/src/lib/fire-calculator/fire-calculator.component.ts
- 454
+ 456
libs/ui/src/lib/i18n.ts
@@ -5869,7 +5865,7 @@
储蓄
libs/ui/src/lib/fire-calculator/fire-calculator.component.ts
- 464
+ 466
@@ -5953,7 +5949,7 @@
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 259
+ 257
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
@@ -5985,7 +5981,7 @@
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 268
+ 266
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
@@ -6025,15 +6021,15 @@
应急基金
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 261
+ 272
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 339
+ 350
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 441
+ 452
apps/client/src/app/pages/features/features-page.html
@@ -6169,7 +6165,7 @@
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 337
+ 335
libs/ui/src/lib/i18n.ts
@@ -6301,7 +6297,7 @@
现金
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 293
+ 304
@@ -6328,14 +6324,6 @@
78
-
- Absolute Dividend Performance
- Absolute Dividend Performance
-
- apps/client/src/app/pages/portfolio/analysis/analysis-page.html
- 195
-
-
Africa
非洲
@@ -6581,7 +6569,7 @@
绝对货币表现
apps/client/src/app/pages/portfolio/analysis/analysis-page.html
- 233
+ 194
@@ -6589,7 +6577,7 @@
关闭持仓
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 467
+ 465
@@ -6633,7 +6621,7 @@
货币表现
apps/client/src/app/pages/portfolio/analysis/analysis-page.html
- 257
+ 218
@@ -6886,7 +6874,7 @@
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 246
+ 244
@@ -6894,7 +6882,7 @@
股息收益率
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 210
+ 208
@@ -7405,6 +7393,18 @@
15
+
+ thereof Dividend
+ thereof Dividend
+
+ apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
+ 102
+
+
+ apps/client/src/app/pages/portfolio/analysis/analysis-page.html
+ 287
+
+
Close
关闭
@@ -7566,11 +7566,11 @@
已复制到剪贴板
apps/client/src/app/components/admin-overview/admin-overview.component.ts
- 208
+ 209
libs/ui/src/lib/value/value.component.ts
- 202
+ 205
@@ -8016,7 +8016,7 @@
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.ts
- 202
+ 172
apps/client/src/app/components/rule/rule-settings-dialog/rule-settings-dialog.html
@@ -8096,7 +8096,7 @@
AI 提示已复制到剪贴板
apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts
- 237
+ 207
@@ -8184,7 +8184,7 @@
打开 Duck.ai
apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts
- 238
+ 208
@@ -8204,7 +8204,7 @@
libs/ui/src/lib/treemap-chart/treemap-chart.component.ts
- 423
+ 430
@@ -8244,11 +8244,11 @@
libs/ui/src/lib/treemap-chart/treemap-chart.component.ts
- 423
+ 430
libs/ui/src/lib/treemap-chart/treemap-chart.component.ts
- 436
+ 445
@@ -8566,7 +8566,7 @@
演示用户账户已同步。
apps/client/src/app/components/admin-overview/admin-overview.component.ts
- 314
+ 315
@@ -9041,7 +9041,7 @@
管理资产概况
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 495
+ 493
@@ -9152,6 +9152,18 @@
181
+
+ Return on Average Investment (total return with dividends)
+ Return on Average Investment (total return with dividends)
+
+ apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
+ 159
+
+
+ apps/client/src/app/pages/portfolio/analysis/analysis-page.html
+ 264
+
+
No results found...
未找到结果...
From 63216e009b413f9865266203f33597e7a8e8bacb Mon Sep 17 00:00:00 2001
From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com>
Date: Tue, 6 Oct 2026 21:17:12 +0200
Subject: [PATCH 03/11] Task/improve language localization for DE (20261006)
(#8075)
* Update translations
* Update changelog
---
CHANGELOG.md | 1 +
apps/client/src/locales/messages.de.xlf | 6 +++---
2 files changed, 4 insertions(+), 3 deletions(-)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index f9ef57d192..fe920851eb 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -10,6 +10,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
### Changed
- Moved the performance calculation including dividends (total return) from experimental to general availability
+- Improved the language localization for German (`de`)
### Fixed
diff --git a/apps/client/src/locales/messages.de.xlf b/apps/client/src/locales/messages.de.xlf
index e370a737f6..8628f5fc7c 100644
--- a/apps/client/src/locales/messages.de.xlf
+++ b/apps/client/src/locales/messages.de.xlf
@@ -4331,7 +4331,7 @@
thereof Dividend Performance
- thereof Dividend Performance
+ davon Dividenden Performance
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
178
@@ -7418,7 +7418,7 @@
thereof Dividend
- thereof Dividend
+ davon Dividenden
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
102
@@ -9153,7 +9153,7 @@
Return on Average Investment (total return with dividends)
- Return on Average Investment (total return with dividends)
+ Rendite auf die durchschnittliche Investition (Gesamtrendite inklusive Dividenden)
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
159
From 6db9228b2acb5f5cd8a437d6180125db97355cd1 Mon Sep 17 00:00:00 2001
From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com>
Date: Tue, 6 Oct 2026 22:29:46 +0200
Subject: [PATCH 04/11] Bugfix/time weighted average investment in ROAI
calculator (#8074)
* Fix time weighted average investment
* Update changelog
---
CHANGELOG.md | 1 +
.../calculator/portfolio-calculator.ts | 15 ++
...ator-btcusd-buy-and-sell-partially.spec.ts | 79 +++++++-
...-calculator-googl-fee-and-dividend.spec.ts | 31 ++-
...-calculator-msft-buy-with-dividend.spec.ts | 19 +-
.../roai/portfolio-calculator.spec.ts | 185 +++++++++++++++++-
.../calculator/roai/portfolio-calculator.ts | 119 ++++++++---
7 files changed, 403 insertions(+), 46 deletions(-)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index fe920851eb..603da63dff 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -16,6 +16,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
- Fixed the visibility of the asset class, asset sub class, fee and quantity fields of a valuable in the create activity dialog
- Fixed the missing mapping for Aland Islands in the country weightings of the _Financial Modeling Prep_ service
+- Fixed the net performance percentage of date ranges in the portfolio performance calculation by weighting the average investment by the number of days between the chart dates
## 3.80.2 - 2026-10-06
diff --git a/apps/api/src/app/portfolio/calculator/portfolio-calculator.ts b/apps/api/src/app/portfolio/calculator/portfolio-calculator.ts
index 9b94545fd8..1154f897d1 100644
--- a/apps/api/src/app/portfolio/calculator/portfolio-calculator.ts
+++ b/apps/api/src/app/portfolio/calculator/portfolio-calculator.ts
@@ -362,6 +362,18 @@ export abstract class PortfolioCalculator {
return chartDate;
});
+ // The chart dates are the same for each holding and each date range. Thus
+ // calculate the number of days until the next chart date one time only.
+ const parsedChartDates = chartDates.map((chartDate) => {
+ return parseDate(chartDate);
+ });
+
+ const daysUntilNextChartDate = parsedChartDates
+ .slice(1)
+ .map((nextChartDate, index) => {
+ return differenceInDays(nextChartDate, parsedChartDates[index]);
+ });
+
const errors: ResponseError['errors'] = [];
let hasAnyHoldingPerformanceErrors = false;
@@ -438,6 +450,7 @@ export abstract class PortfolioCalculator {
totalLiabilitiesInBaseCurrency
} = this.getHoldingPerformance({
chartDates,
+ daysUntilNextChartDate,
marketSymbolMap,
dataSource: item.dataSource,
end: this.endDate,
@@ -935,6 +948,7 @@ export abstract class PortfolioCalculator {
protected abstract getHoldingPerformance({
chartDates,
dataSource,
+ daysUntilNextChartDate,
end,
exchangeRates,
marketSymbolMap,
@@ -942,6 +956,7 @@ export abstract class PortfolioCalculator {
symbol
}: {
chartDates: string[];
+ daysUntilNextChartDate: number[];
end: Date;
exchangeRates: { [dateString: string]: number };
marketSymbolMap: {
diff --git a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-btcusd-buy-and-sell-partially.spec.ts b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-btcusd-buy-and-sell-partially.spec.ts
index 15474a0236..0110f68f27 100644
--- a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-btcusd-buy-and-sell-partially.spec.ts
+++ b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-btcusd-buy-and-sell-partially.spec.ts
@@ -112,7 +112,7 @@ describe('PortfolioCalculator', () => {
const performanceByDateRange = await getPerformanceByDateRange({
portfolioCalculator,
- dateRanges: ['1d', 'max', 'ytd']
+ dateRanges: ['1d', '2017', 'max', 'ytd']
});
const investments = portfolioCalculator.getInvestments();
@@ -162,7 +162,8 @@ describe('PortfolioCalculator', () => {
netPerformancePercentage: new Big('42.41978276196153750666'),
netPerformancePercentageWithCurrencyEffectMap: {
'1d': new Big('-0.04016229506406263535'),
- max: new Big('41.72313811883729606471'),
+ '2017': new Big('43.14843430282283692638'),
+ max: new Big('41.65910103572163194783'),
ytd: new Big('-0.04016229506406263535')
},
netPerformanceWithCurrencyEffectMap: {
@@ -258,11 +259,20 @@ describe('PortfolioCalculator', () => {
totalInvestmentValueWithCurrencyEffect: 318.54266729999995,
valueWithCurrencyEffect: 13298.425356
},
+ '2017': {
+ date: '2017-12-31',
+ netPerformance: 26957.033439,
+ netPerformanceInPercentage: 44.109822737327406,
+ netPerformanceInPercentageWithCurrencyEffect: 43.14859823223876,
+ netPerformanceWithCurrencyEffect: 27081.23736,
+ totalInvestmentValueWithCurrencyEffect: 318.54266729999995,
+ valueWithCurrencyEffect: 13854.86868
+ },
max: {
date: '2018-01-01',
netPerformance: 26458.9121202,
- netPerformanceInPercentage: 42.50435329547954,
- netPerformanceInPercentageWithCurrencyEffect: 41.72313811883715,
+ netPerformanceInPercentage: 42.43911719562077,
+ netPerformanceInPercentageWithCurrencyEffect: 41.65910103572173,
netPerformanceWithCurrencyEffect: 26516.2087014,
totalInvestmentValueWithCurrencyEffect: 318.54266729999995,
valueWithCurrencyEffect: 13298.425356
@@ -278,5 +288,66 @@ describe('PortfolioCalculator', () => {
}
});
});
+
+ it.only('with BTCUSD buy and sell partially and fewer chart items', async () => {
+ jest.useFakeTimers().setSystemTime(parseDate('2018-01-01').getTime());
+
+ const environmentConfigurationService = new ConfigurationService();
+
+ // Fewer chart items give fewer chart dates, which must not change the
+ // average investment. The range 2017 starts with a gross performance
+ // and ends with the sell.
+ jest.spyOn(configurationService, 'get').mockImplementation((key) => {
+ return key === 'MAX_CHART_ITEMS'
+ ? 50
+ : environmentConfigurationService.get(key);
+ });
+
+ const { activities, userCurrency } = loadActivitiesFromExportFile(
+ 'btcusd-buy-and-sell-partially.json'
+ );
+
+ const portfolioCalculator = portfolioCalculatorFactory.createCalculator({
+ activities,
+ calculationType: PerformanceCalculationType.ROAI,
+ currency: userCurrency,
+ usePortfolioSnapshotCache: false,
+ userId: userDummyData.id
+ });
+
+ const portfolioSnapshot = await portfolioCalculator.computeSnapshot();
+
+ const performanceByDateRange = await getPerformanceByDateRange({
+ portfolioCalculator,
+ dateRanges: ['2017', 'max']
+ });
+
+ expect(
+ portfolioSnapshot.positions[0]
+ .netPerformancePercentageWithCurrencyEffectMap
+ ).toMatchObject({
+ '2017': new Big('43.14843430282283692638'),
+ max: new Big('41.65910103572163194783')
+ });
+
+ // Other weights give another rounding of the floating point numbers
+ expect(
+ performanceByDateRange['2017'].netPerformanceInPercentage
+ ).toBeCloseTo(44.109822737327406, 10);
+
+ expect(
+ performanceByDateRange['2017']
+ .netPerformanceInPercentageWithCurrencyEffect
+ ).toBeCloseTo(43.14859823223876, 10);
+
+ expect(performanceByDateRange.max.netPerformanceInPercentage).toBeCloseTo(
+ 42.43911719562077,
+ 10
+ );
+
+ expect(
+ performanceByDateRange.max.netPerformanceInPercentageWithCurrencyEffect
+ ).toBeCloseTo(41.65910103572173, 10);
+ });
});
});
diff --git a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-googl-fee-and-dividend.spec.ts b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-googl-fee-and-dividend.spec.ts
index 18929a680c..bb6385d18d 100644
--- a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-googl-fee-and-dividend.spec.ts
+++ b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-googl-fee-and-dividend.spec.ts
@@ -190,9 +190,12 @@ describe('PortfolioCalculator', () => {
expect(performanceByDateRange).toMatchObject({
max: {
dividendInBaseCurrency: 5.62,
- dividendInPercentageWithCurrencyEffect: 0.01882242615044535,
+ dividendInPercentageWithCurrencyEffect: expect.closeTo(
+ 0.01882242615044535,
+ 10
+ ),
netPerformance: 18.87,
- netPerformanceInPercentage: 0.06319914260834586
+ netPerformanceInPercentage: expect.closeTo(0.06319914260834586, 10)
}
});
});
@@ -282,9 +285,12 @@ describe('PortfolioCalculator', () => {
expect(performanceByDateRange).toMatchObject({
max: {
dividendInBaseCurrency: 5.62,
- dividendInPercentageWithCurrencyEffect: 0.01882242615044535,
+ dividendInPercentageWithCurrencyEffect: expect.closeTo(
+ 0.01882242615044535,
+ 10
+ ),
netPerformance: 19.87,
- netPerformanceInPercentage: 0.06654832875611194
+ netPerformanceInPercentage: expect.closeTo(0.06654832875611194, 10)
}
});
});
@@ -373,9 +379,12 @@ describe('PortfolioCalculator', () => {
expect(performanceByDateRange).toMatchObject({
max: {
dividendInBaseCurrency: 0.62,
- dividendInPercentageWithCurrencyEffect: 0.002076495411614967,
+ dividendInPercentageWithCurrencyEffect: expect.closeTo(
+ 0.002076495411614967,
+ 10
+ ),
netPerformance: 14.87,
- netPerformanceInPercentage: 0.049802398017281556
+ netPerformanceInPercentage: expect.closeTo(0.049802398017281556, 10)
}
});
});
@@ -458,11 +467,17 @@ describe('PortfolioCalculator', () => {
},
max: {
dividendInBaseCurrency: 1.3,
- dividendInPercentageWithCurrencyEffect: 0.004353941992095899
+ dividendInPercentageWithCurrencyEffect: expect.closeTo(
+ 0.004353941992095899,
+ 10
+ )
},
ytd: {
dividendInBaseCurrency: 0.68,
- dividendInPercentageWithCurrencyEffect: 0.002002886512915673
+ dividendInPercentageWithCurrencyEffect: expect.closeTo(
+ 0.002002886512915673,
+ 10
+ )
}
});
});
diff --git a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-msft-buy-with-dividend.spec.ts b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-msft-buy-with-dividend.spec.ts
index 0fdd0b3000..2b89ddd31b 100644
--- a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-msft-buy-with-dividend.spec.ts
+++ b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-msft-buy-with-dividend.spec.ts
@@ -177,10 +177,16 @@ describe('PortfolioCalculator', () => {
max: {
date: '2023-07-10',
dividendInBaseCurrency: 0.62,
- dividendInPercentageWithCurrencyEffect: 0.002076495411614967,
+ dividendInPercentageWithCurrencyEffect: expect.closeTo(
+ 0.002076495411614967,
+ 10
+ ),
netPerformance: 14.87,
- netPerformanceInPercentage: 0.049802398017281556,
- netPerformanceInPercentageWithCurrencyEffect: 0.049802398017281556,
+ netPerformanceInPercentage: expect.closeTo(0.049802398017281556, 10),
+ netPerformanceInPercentageWithCurrencyEffect: expect.closeTo(
+ 0.049802398017281556,
+ 10
+ ),
netPerformanceWithCurrencyEffect: 14.87,
totalInvestmentValueWithCurrencyEffect: 298.58,
valueWithCurrencyEffect: 331.83
@@ -190,8 +196,11 @@ describe('PortfolioCalculator', () => {
dividendInBaseCurrency: 0,
dividendInPercentageWithCurrencyEffect: 0,
netPerformance: -7.6800000000000015,
- netPerformanceInPercentage: -0.022620835910577015,
- netPerformanceInPercentageWithCurrencyEffect: -0.022620835910577015,
+ netPerformanceInPercentage: expect.closeTo(-0.022620835910577015, 10),
+ netPerformanceInPercentageWithCurrencyEffect: expect.closeTo(
+ -0.022620835910577015,
+ 10
+ ),
netPerformanceWithCurrencyEffect: -7.6800000000000015,
totalInvestmentValueWithCurrencyEffect: 298.58,
valueWithCurrencyEffect: 331.83
diff --git a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator.spec.ts b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator.spec.ts
index 99bee2c21d..5f8d9cdc44 100644
--- a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator.spec.ts
+++ b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator.spec.ts
@@ -1,3 +1,186 @@
+import { PortfolioCalculator } from '@ghostfolio/api/app/portfolio/calculator/portfolio-calculator';
+import { userDummyData } from '@ghostfolio/api/app/portfolio/calculator/portfolio-calculator-test-utils';
+import { PortfolioCalculatorFactory } from '@ghostfolio/api/app/portfolio/calculator/portfolio-calculator.factory';
+import { CurrentRateService } from '@ghostfolio/api/app/portfolio/current-rate.service';
+import { CurrentRateServiceMock } from '@ghostfolio/api/app/portfolio/current-rate.service.mock';
+import { RedisCacheService } from '@ghostfolio/api/app/redis-cache/redis-cache.service';
+import { RedisCacheServiceMock } from '@ghostfolio/api/app/redis-cache/redis-cache.service.mock';
+import { ConfigurationService } from '@ghostfolio/api/services/configuration/configuration.service';
+import { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.service';
+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 { HistoricalDataItem } from '@ghostfolio/common/interfaces';
+import { PerformanceCalculationType } from '@ghostfolio/common/types/performance-calculation-type.type';
+
+jest.mock('@ghostfolio/api/app/portfolio/current-rate.service', () => {
+ return {
+ CurrentRateService: jest.fn().mockImplementation(() => {
+ return CurrentRateServiceMock;
+ })
+ };
+});
+
+jest.mock(
+ '@ghostfolio/api/services/queues/portfolio-snapshot/portfolio-snapshot.service',
+ () => {
+ return {
+ PortfolioSnapshotService: jest.fn().mockImplementation(() => {
+ return PortfolioSnapshotServiceMock;
+ })
+ };
+ }
+);
+
+jest.mock('@ghostfolio/api/app/redis-cache/redis-cache.service', () => {
+ return {
+ RedisCacheService: jest.fn().mockImplementation(() => {
+ return RedisCacheServiceMock;
+ })
+ };
+});
+
+function getHistoricalDataItem({
+ date,
+ investment,
+ netPerformance
+}: {
+ date: string;
+ investment: number;
+ netPerformance: number;
+}): HistoricalDataItem {
+ return {
+ date,
+ netPerformance,
+ dividendInBaseCurrency: 0,
+ netPerformanceWithCurrencyEffect: netPerformance,
+ totalInvestment: investment,
+ totalInvestmentValueWithCurrencyEffect: investment,
+ value: investment + netPerformance,
+ valueWithCurrencyEffect: investment + netPerformance
+ };
+}
+
describe('PortfolioCalculator', () => {
- test.skip('Skip empty test', () => 1);
+ let configurationService: ConfigurationService;
+ let currentRateService: CurrentRateService;
+ let exchangeRateDataService: ExchangeRateDataService;
+ let portfolioCalculator: PortfolioCalculator;
+ let portfolioCalculatorFactory: PortfolioCalculatorFactory;
+ let portfolioSnapshotService: PortfolioSnapshotService;
+ let redisCacheService: RedisCacheService;
+
+ beforeEach(() => {
+ PortfolioSnapshotServiceMock.reset();
+ RedisCacheServiceMock.reset();
+
+ configurationService = new ConfigurationService();
+
+ currentRateService = new CurrentRateService(null, null, null);
+
+ exchangeRateDataService = new ExchangeRateDataService(
+ null,
+ null,
+ null,
+ null
+ );
+
+ portfolioSnapshotService = new PortfolioSnapshotService(null, null);
+
+ redisCacheService = new RedisCacheService(null, null);
+
+ portfolioCalculatorFactory = new PortfolioCalculatorFactory(
+ configurationService,
+ currentRateService,
+ exchangeRateDataService,
+ portfolioSnapshotService,
+ redisCacheService
+ );
+
+ portfolioCalculator = portfolioCalculatorFactory.createCalculator({
+ activities: [],
+ calculationType: PerformanceCalculationType.ROAI,
+ currency: 'USD',
+ userId: userDummyData.id
+ });
+ });
+
+ describe('calculate performance percentages for date range', () => {
+ it('with a buy followed by a gap between chart dates', () => {
+ const performancePercentagesByDate = portfolioCalculator[
+ 'calculatePerformancePercentagesForDateRange'
+ ]({
+ historicalDataItems: [
+ getHistoricalDataItem({
+ date: '2017-01-01',
+ investment: 100,
+ netPerformance: 0
+ }),
+ // Buy, followed by a gap of 21 days until the next chart date
+ getHistoricalDataItem({
+ date: '2017-01-02',
+ investment: 200,
+ netPerformance: 0
+ }),
+ // Sell
+ getHistoricalDataItem({
+ date: '2017-01-23',
+ investment: 100,
+ netPerformance: 44
+ })
+ ]
+ });
+
+ // The investment of each chart date applies to each day until the next
+ // chart date. The investment of the last chart date counts for this day
+ // only: (1 * 100 + 21 * 200 + 1 * 100) / 23 = 4400 / 23
+ expect(
+ performancePercentagesByDate['2017-01-23'].netPerformanceInPercentage
+ ).toBeCloseTo(0.23, 10);
+
+ expect(
+ performancePercentagesByDate['2017-01-23']
+ .netPerformanceInPercentageWithCurrencyEffect
+ ).toBeCloseTo(0.23, 10);
+ });
+
+ it('with an additional chart date of the same investment', () => {
+ const performancePercentagesByDate = portfolioCalculator[
+ 'calculatePerformancePercentagesForDateRange'
+ ]({
+ historicalDataItems: [
+ getHistoricalDataItem({
+ date: '2017-01-01',
+ investment: 100,
+ netPerformance: 0
+ }),
+ getHistoricalDataItem({
+ date: '2017-01-02',
+ investment: 200,
+ netPerformance: 0
+ }),
+ // An additional chart date splits the gap but must not change the
+ // average investment
+ getHistoricalDataItem({
+ date: '2017-01-12',
+ investment: 200,
+ netPerformance: 20
+ }),
+ getHistoricalDataItem({
+ date: '2017-01-23',
+ investment: 100,
+ netPerformance: 44
+ })
+ ]
+ });
+
+ expect(
+ performancePercentagesByDate['2017-01-23'].netPerformanceInPercentage
+ ).toBeCloseTo(0.23, 10);
+
+ expect(
+ performancePercentagesByDate['2017-01-23']
+ .netPerformanceInPercentageWithCurrencyEffect
+ ).toBeCloseTo(0.23, 10);
+ });
+ });
});
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 a1e41b53a2..0115b4a57c 100644
--- a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator.ts
+++ b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator.ts
@@ -29,7 +29,6 @@ import {
isBefore,
isThisYear
} from 'date-fns';
-import { sum } from 'lodash-es';
export class RoaiPortfolioCalculator extends PortfolioCalculator {
protected calculateOverallPerformance(
@@ -210,16 +209,21 @@ export class RoaiPortfolioCalculator extends PortfolioCalculator {
}: {
historicalDataItems: HistoricalDataItem[];
}): { [date: string]: PerformancePercentages } {
- const averageInvestmentValues: number[] = [];
- const averageInvestmentValuesWithCurrencyEffect: number[] = [];
let grossPerformanceAtStartDate: number;
let grossPerformanceWithCurrencyEffectAtStartDate: number;
+ let previousDate: Date;
+ let sumOfWeightedInvestments = 0;
+ let sumOfWeightedInvestmentsWithCurrencyEffect = 0;
+ let totalInvestmentDays = 0;
+ let totalInvestmentDaysWithCurrencyEffect = 0;
const performancePercentagesByDate: {
[date: string]: PerformancePercentages;
} = {};
for (const [index, historicalDataItem] of historicalDataItems.entries()) {
+ const date = parseDate(historicalDataItem.date);
+
// Take the values at the start date from the first day of the date
// range
if (index === 0) {
@@ -229,34 +233,53 @@ export class RoaiPortfolioCalculator extends PortfolioCalculator {
grossPerformanceWithCurrencyEffectAtStartDate =
historicalDataItem.valueWithCurrencyEffect -
historicalDataItem.totalInvestmentValueWithCurrencyEffect;
+ } else {
+ // The chart dates are not evenly spaced, and the investment changes on
+ // a chart date only. Thus the investment of the previous chart date
+ // applies to each day until this chart date.
+ const previousHistoricalDataItem = historicalDataItems[index - 1];
+
+ const daysSincePreviousChartDate = differenceInDays(date, previousDate);
+
+ if (previousHistoricalDataItem.totalInvestment > 0) {
+ sumOfWeightedInvestments +=
+ (previousHistoricalDataItem.totalInvestment +
+ grossPerformanceAtStartDate) *
+ daysSincePreviousChartDate;
+
+ totalInvestmentDays += daysSincePreviousChartDate;
+ }
+
+ if (
+ previousHistoricalDataItem.totalInvestmentValueWithCurrencyEffect > 0
+ ) {
+ sumOfWeightedInvestmentsWithCurrencyEffect +=
+ (previousHistoricalDataItem.totalInvestmentValueWithCurrencyEffect +
+ grossPerformanceWithCurrencyEffectAtStartDate) *
+ daysSincePreviousChartDate;
+
+ totalInvestmentDaysWithCurrencyEffect += daysSincePreviousChartDate;
+ }
}
// Add the gross performance at the start date of the range to the
// investment of each day. Thus the range starts with the value of its
// first day, and subsequent buy and sell activities stay included.
- if (historicalDataItem.totalInvestment > 0) {
- averageInvestmentValues.push(
- historicalDataItem.totalInvestment + grossPerformanceAtStartDate
- );
- }
-
- if (historicalDataItem.totalInvestmentValueWithCurrencyEffect > 0) {
- averageInvestmentValuesWithCurrencyEffect.push(
- historicalDataItem.totalInvestmentValueWithCurrencyEffect +
- grossPerformanceWithCurrencyEffectAtStartDate
- );
- }
-
- const averageInvestmentValue =
- averageInvestmentValues.length > 0
- ? sum(averageInvestmentValues) / averageInvestmentValues.length
- : 0;
+ const averageInvestmentValue = this.getAverageInvestment({
+ grossPerformanceAtStartDate,
+ sumOfWeightedInvestments,
+ totalInvestmentDays,
+ investment: historicalDataItem.totalInvestment
+ });
const averageInvestmentValueWithCurrencyEffect =
- averageInvestmentValuesWithCurrencyEffect.length > 0
- ? sum(averageInvestmentValuesWithCurrencyEffect) /
- averageInvestmentValuesWithCurrencyEffect.length
- : 0;
+ this.getAverageInvestment({
+ grossPerformanceAtStartDate:
+ grossPerformanceWithCurrencyEffectAtStartDate,
+ investment: historicalDataItem.totalInvestmentValueWithCurrencyEffect,
+ sumOfWeightedInvestments: sumOfWeightedInvestmentsWithCurrencyEffect,
+ totalInvestmentDays: totalInvestmentDaysWithCurrencyEffect
+ });
performancePercentagesByDate[historicalDataItem.date] = {
dividendInPercentageWithCurrencyEffect:
@@ -274,6 +297,8 @@ export class RoaiPortfolioCalculator extends PortfolioCalculator {
averageInvestmentValueWithCurrencyEffect
: 0
};
+
+ previousDate = date;
}
return performancePercentagesByDate;
@@ -282,6 +307,7 @@ export class RoaiPortfolioCalculator extends PortfolioCalculator {
protected getHoldingPerformance({
chartDates,
dataSource,
+ daysUntilNextChartDate,
end,
exchangeRates,
marketSymbolMap,
@@ -289,6 +315,7 @@ export class RoaiPortfolioCalculator extends PortfolioCalculator {
symbol
}: {
chartDates: string[];
+ daysUntilNextChartDate: number[];
end: Date;
exchangeRates: { [dateString: string]: number };
marketSymbolMap: {
@@ -642,17 +669,28 @@ export class RoaiPortfolioCalculator extends PortfolioCalculator {
break;
}
+ const isLastChartDateOfRange =
+ i === chartDates.length - 1 || chartDates[i + 1] > rangeEndDateString;
+
+ // The chart dates are not evenly spaced, and the investment changes
+ // on a chart date only. Thus the investment of a chart date applies to
+ // each day until the next chart date. The investment of the last chart
+ // date of the range counts for this day only.
+ const investmentDays = isLastChartDateOfRange
+ ? 1
+ : daysUntilNextChartDate[i];
+
if (
investmentValuesAccumulatedWithCurrencyEffect[date] instanceof Big &&
investmentValuesAccumulatedWithCurrencyEffect[date].gt(0)
) {
average = average.add(
- investmentValuesAccumulatedWithCurrencyEffect[date].add(
- grossPerformanceAtDateRangeStartWithCurrencyEffect
- )
+ investmentValuesAccumulatedWithCurrencyEffect[date]
+ .add(grossPerformanceAtDateRangeStartWithCurrencyEffect)
+ .mul(investmentDays)
);
- dayCount++;
+ dayCount += investmentDays;
}
}
@@ -753,4 +791,29 @@ export class RoaiPortfolioCalculator extends PortfolioCalculator {
protected getPerformanceCalculationType() {
return PerformanceCalculationType.ROAI;
}
+
+ private getAverageInvestment({
+ grossPerformanceAtStartDate,
+ investment,
+ sumOfWeightedInvestments,
+ totalInvestmentDays
+ }: {
+ grossPerformanceAtStartDate: number;
+ investment: number;
+ sumOfWeightedInvestments: number;
+ totalInvestmentDays: number;
+ }) {
+ // The investment of the current chart date counts for this day only
+ if (investment > 0) {
+ return (
+ (sumOfWeightedInvestments +
+ (investment + grossPerformanceAtStartDate)) /
+ (totalInvestmentDays + 1)
+ );
+ }
+
+ return totalInvestmentDays > 0
+ ? sumOfWeightedInvestments / totalInvestmentDays
+ : 0;
+ }
}
From a0b3d1f71a0a26e9e1eadc895948324e56e56d9a Mon Sep 17 00:00:00 2001
From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com>
Date: Wed, 7 Oct 2026 08:51:40 +0200
Subject: [PATCH 05/11] Bugfix/start date of calendar year date ranges in
portfolio performance (#8077)
* Fix start date of calendar year date ranges in portfolio performance
* Update changelog
---
CHANGELOG.md | 1 +
.../benchmarks/benchmarks.service.ts | 4 ++--
.../calculator/portfolio-calculator.ts | 7 ++++++-
...ator-btcusd-buy-and-sell-partially.spec.ts | 21 +++++++++++++++----
4 files changed, 26 insertions(+), 7 deletions(-)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 603da63dff..7512b27d80 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -17,6 +17,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
- Fixed the visibility of the asset class, asset sub class, fee and quantity fields of a valuable in the create activity dialog
- Fixed the missing mapping for Aland Islands in the country weightings of the _Financial Modeling Prep_ service
- Fixed the net performance percentage of date ranges in the portfolio performance calculation by weighting the average investment by the number of days between the chart dates
+- Fixed the start date of calendar year date ranges in the portfolio performance calculation
## 3.80.2 - 2026-10-06
diff --git a/apps/api/src/app/endpoints/benchmarks/benchmarks.service.ts b/apps/api/src/app/endpoints/benchmarks/benchmarks.service.ts
index 908db59b7f..d807b1bb6b 100644
--- a/apps/api/src/app/endpoints/benchmarks/benchmarks.service.ts
+++ b/apps/api/src/app/endpoints/benchmarks/benchmarks.service.ts
@@ -13,7 +13,7 @@ import {
import { DateRange } from '@ghostfolio/common/types';
import { Injectable, Logger } from '@nestjs/common';
-import { format, isSameDay } from 'date-fns';
+import { format, isSameDay, min } from 'date-fns';
import { isNumber } from 'lodash-es';
@Injectable()
@@ -96,8 +96,8 @@ export class BenchmarksService {
const exchangeRates =
await this.exchangeRateDataService.getExchangeRatesByCurrency({
- startDate,
currencies: [currentSymbolItem.currency],
+ startDate: min([baselineDate, startDate]),
targetCurrency: userCurrency
});
diff --git a/apps/api/src/app/portfolio/calculator/portfolio-calculator.ts b/apps/api/src/app/portfolio/calculator/portfolio-calculator.ts
index 1154f897d1..7a8bbcc741 100644
--- a/apps/api/src/app/portfolio/calculator/portfolio-calculator.ts
+++ b/apps/api/src/app/portfolio/calculator/portfolio-calculator.ts
@@ -64,6 +64,7 @@ import {
format,
isAfter,
isBefore,
+ isEqual,
isFuture,
isPast,
isWithinInterval,
@@ -1417,10 +1418,14 @@ export abstract class PortfolioCalculator {
let netPerformanceAtStartDate: number;
let netPerformanceWithCurrencyEffectAtStartDate: number;
+ const startDate = isEqual(start, endOfDay(start))
+ ? resetHours(start)
+ : start;
+
for (const historicalDataItem of historicalData) {
const date = resetHours(parseDate(historicalDataItem.date));
- if (!isBefore(date, start) && !isAfter(date, end)) {
+ if (!isBefore(date, startDate) && !isAfter(date, end)) {
// Take the values at the start date from the first day of the date
// range
if (historicalDataItemsOfDateRange.length === 0) {
diff --git a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-btcusd-buy-and-sell-partially.spec.ts b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-btcusd-buy-and-sell-partially.spec.ts
index 0110f68f27..0be9af1c00 100644
--- a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-btcusd-buy-and-sell-partially.spec.ts
+++ b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-btcusd-buy-and-sell-partially.spec.ts
@@ -13,6 +13,7 @@ import { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate-
import { ExchangeRateDataServiceMock } from '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.service.mock';
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 { getIntervalFromDateRange } from '@ghostfolio/common/calculation-helper';
import { parseDate } from '@ghostfolio/common/helper';
import { PerformanceCalculationType } from '@ghostfolio/common/types/performance-calculation-type.type';
@@ -168,6 +169,7 @@ describe('PortfolioCalculator', () => {
},
netPerformanceWithCurrencyEffectMap: {
'1d': new Big('-556.443324'),
+ '2017': new Big('27081.23736'),
max: new Big('26516.208701400000064086'),
ytd: new Big('-556.443324')
},
@@ -262,8 +264,8 @@ describe('PortfolioCalculator', () => {
'2017': {
date: '2017-12-31',
netPerformance: 26957.033439,
- netPerformanceInPercentage: 44.109822737327406,
- netPerformanceInPercentageWithCurrencyEffect: 43.14859823223876,
+ netPerformanceInPercentage: 44.10965416175681,
+ netPerformanceInPercentageWithCurrencyEffect: 43.148434302822835,
netPerformanceWithCurrencyEffect: 27081.23736,
totalInvestmentValueWithCurrencyEffect: 318.54266729999995,
valueWithCurrencyEffect: 13854.86868
@@ -287,6 +289,17 @@ describe('PortfolioCalculator', () => {
valueWithCurrencyEffect: 13298.425356
}
});
+
+ const { endDate, startDate } = getIntervalFromDateRange({
+ dateRange: '2017'
+ });
+
+ const { chart } = await portfolioCalculator.getPerformance({
+ end: endDate,
+ start: startDate
+ });
+
+ expect(chart[0].date).toBe('2016-12-31');
});
it.only('with BTCUSD buy and sell partially and fewer chart items', async () => {
@@ -333,12 +346,12 @@ describe('PortfolioCalculator', () => {
// Other weights give another rounding of the floating point numbers
expect(
performanceByDateRange['2017'].netPerformanceInPercentage
- ).toBeCloseTo(44.109822737327406, 10);
+ ).toBeCloseTo(44.10965416175681, 10);
expect(
performanceByDateRange['2017']
.netPerformanceInPercentageWithCurrencyEffect
- ).toBeCloseTo(43.14859823223876, 10);
+ ).toBeCloseTo(43.148434302822835, 10);
expect(performanceByDateRange.max.netPerformanceInPercentage).toBeCloseTo(
42.43911719562077,
From a53a057f4c04e5372b45452dd855be3b4ea6ee85 Mon Sep 17 00:00:00 2001
From: Kenrick Tandrian <60643640+KenTandrian@users.noreply.github.com>
Date: Wed, 7 Oct 2026 15:02:18 +0700
Subject: [PATCH 06/11] Task/widen input types in dialog header tables and
benchmark comparator (#8068)
Widen input types
---
.../benchmark-comparator.component.ts | 8 +++++++-
.../accounts-table/accounts-table.component.ts | 8 +++++++-
.../benchmark-detail-dialog.html | 2 +-
.../dialog-header/dialog-header.component.html | 6 +++---
.../lib/dialog-header/dialog-header.component.ts | 15 +++++++--------
.../holdings-table/holdings-table.component.ts | 8 +++++++-
6 files changed, 32 insertions(+), 15 deletions(-)
diff --git a/apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts b/apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts
index 72241f0454..6a00e1a35e 100644
--- a/apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts
+++ b/apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts
@@ -72,7 +72,13 @@ export class GfBenchmarkComparatorComponent implements OnChanges, OnDestroy {
public readonly benchmarks = input[]>();
public readonly colorScheme = input();
public readonly isLoading = input();
- public readonly locale = input(getLocale());
+
+ public readonly locale = input(getLocale(), {
+ transform: (value?: string) => {
+ return value ?? getLocale();
+ }
+ });
+
public readonly performanceDataItems = input.required();
public readonly user = input();
diff --git a/libs/ui/src/lib/accounts-table/accounts-table.component.ts b/libs/ui/src/lib/accounts-table/accounts-table.component.ts
index e986932906..30e56e7833 100644
--- a/libs/ui/src/lib/accounts-table/accounts-table.component.ts
+++ b/libs/ui/src/lib/accounts-table/accounts-table.component.ts
@@ -62,7 +62,13 @@ export class GfAccountsTableComponent {
public readonly hasPermissionToDeleteAccount = input();
public readonly hasPermissionToOpenDetails = input(true);
public readonly hasPermissionToUpdateAccount = input();
- public readonly locale = input(getLocale());
+
+ public readonly locale = input(getLocale(), {
+ transform: (value?: string) => {
+ return value ?? getLocale();
+ }
+ });
+
public readonly showActions = input();
public readonly showActivitiesCount = input(true);
public readonly showAllocationInPercentage = input();
diff --git a/libs/ui/src/lib/benchmark/benchmark-detail-dialog/benchmark-detail-dialog.html b/libs/ui/src/lib/benchmark/benchmark-detail-dialog/benchmark-detail-dialog.html
index 2ab60b9d2d..3ff7f03ab6 100644
--- a/libs/ui/src/lib/benchmark/benchmark-detail-dialog/benchmark-detail-dialog.html
+++ b/libs/ui/src/lib/benchmark/benchmark-detail-dialog/benchmark-detail-dialog.html
@@ -1,7 +1,7 @@
diff --git a/libs/ui/src/lib/dialog-header/dialog-header.component.html b/libs/ui/src/lib/dialog-header/dialog-header.component.html
index ed9fc41f4a..435af1b295 100644
--- a/libs/ui/src/lib/dialog-header/dialog-header.component.html
+++ b/libs/ui/src/lib/dialog-header/dialog-header.component.html
@@ -1,10 +1,10 @@
{{ title }} {{ title() }}
- @if (deviceType !== 'mobile') {
+ @if (deviceType() !== 'mobile') {
diff --git a/libs/ui/src/lib/dialog-header/dialog-header.component.ts b/libs/ui/src/lib/dialog-header/dialog-header.component.ts
index 4868b22b89..f16d66c4b5 100644
--- a/libs/ui/src/lib/dialog-header/dialog-header.component.ts
+++ b/libs/ui/src/lib/dialog-header/dialog-header.component.ts
@@ -1,9 +1,8 @@
import {
ChangeDetectionStrategy,
Component,
- EventEmitter,
- Input,
- Output
+ input,
+ output
} from '@angular/core';
import { MatButtonModule } from '@angular/material/button';
import { MatDialogModule } from '@angular/material/dialog';
@@ -20,17 +19,17 @@ import { close } from 'ionicons/icons';
templateUrl: './dialog-header.component.html'
})
export class GfDialogHeaderComponent {
- @Input() deviceType: string;
- @Input() position: 'center' | 'left' = 'left';
- @Input() title: string;
+ public readonly deviceType = input
();
+ public readonly position = input<'center' | 'left'>('left');
+ public readonly title = input.required();
- @Output() closeButtonClicked = new EventEmitter();
+ public readonly closeButtonClicked = output();
public constructor() {
addIcons({ close });
}
- public onClickCloseButton() {
+ protected onClickCloseButton() {
this.closeButtonClicked.emit();
}
}
diff --git a/libs/ui/src/lib/holdings-table/holdings-table.component.ts b/libs/ui/src/lib/holdings-table/holdings-table.component.ts
index 1894260b78..0be6e54f6e 100644
--- a/libs/ui/src/lib/holdings-table/holdings-table.component.ts
+++ b/libs/ui/src/lib/holdings-table/holdings-table.component.ts
@@ -54,7 +54,13 @@ export class GfHoldingsTableComponent {
public readonly hasPermissionToShowQuantities = input(true);
public readonly hasPermissionToShowValues = input(true);
public readonly holdings = input.required();
- public readonly locale = input(getLocale());
+
+ public readonly locale = input(getLocale(), {
+ transform: (value?: string) => {
+ return value ?? getLocale();
+ }
+ });
+
public readonly mode = input<'default' | 'simple'>('default');
public readonly pageSize = model(Number.MAX_SAFE_INTEGER);
From 817c6775ded30c5c2950ed70f6b980bd4eac4087 Mon Sep 17 00:00:00 2001
From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com>
Date: Wed, 7 Oct 2026 14:00:59 +0200
Subject: [PATCH 07/11] Task/refactor average investment of ROAI calculator
(#8078)
Refactor average investment calculation in ROAI calculator
---
...ator-btcusd-buy-and-sell-partially.spec.ts | 12 +-
.../calculator/roai/portfolio-calculator.ts | 226 ++++++++++--------
.../average-investment-item.interface.ts | 6 +
.../weighted-investment.interface.ts | 8 +
4 files changed, 140 insertions(+), 112 deletions(-)
create mode 100644 apps/api/src/app/portfolio/interfaces/average-investment-item.interface.ts
create mode 100644 apps/api/src/app/portfolio/interfaces/weighted-investment.interface.ts
diff --git a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-btcusd-buy-and-sell-partially.spec.ts b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-btcusd-buy-and-sell-partially.spec.ts
index 0be9af1c00..507dd731e2 100644
--- a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-btcusd-buy-and-sell-partially.spec.ts
+++ b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-btcusd-buy-and-sell-partially.spec.ts
@@ -264,7 +264,7 @@ describe('PortfolioCalculator', () => {
'2017': {
date: '2017-12-31',
netPerformance: 26957.033439,
- netPerformanceInPercentage: 44.10965416175681,
+ netPerformanceInPercentage: 44.10965416175668,
netPerformanceInPercentageWithCurrencyEffect: 43.148434302822835,
netPerformanceWithCurrencyEffect: 27081.23736,
totalInvestmentValueWithCurrencyEffect: 318.54266729999995,
@@ -273,8 +273,8 @@ describe('PortfolioCalculator', () => {
max: {
date: '2018-01-01',
netPerformance: 26458.9121202,
- netPerformanceInPercentage: 42.43911719562077,
- netPerformanceInPercentageWithCurrencyEffect: 41.65910103572173,
+ netPerformanceInPercentage: 42.439117195620575,
+ netPerformanceInPercentageWithCurrencyEffect: 41.65910103572163,
netPerformanceWithCurrencyEffect: 26516.2087014,
totalInvestmentValueWithCurrencyEffect: 318.54266729999995,
valueWithCurrencyEffect: 13298.425356
@@ -346,7 +346,7 @@ describe('PortfolioCalculator', () => {
// Other weights give another rounding of the floating point numbers
expect(
performanceByDateRange['2017'].netPerformanceInPercentage
- ).toBeCloseTo(44.10965416175681, 10);
+ ).toBeCloseTo(44.10965416175668, 10);
expect(
performanceByDateRange['2017']
@@ -354,13 +354,13 @@ describe('PortfolioCalculator', () => {
).toBeCloseTo(43.148434302822835, 10);
expect(performanceByDateRange.max.netPerformanceInPercentage).toBeCloseTo(
- 42.43911719562077,
+ 42.439117195620575,
10
);
expect(
performanceByDateRange.max.netPerformanceInPercentageWithCurrencyEffect
- ).toBeCloseTo(41.65910103572173, 10);
+ ).toBeCloseTo(41.65910103572163, 10);
});
});
});
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 0115b4a57c..7483250e1f 100644
--- a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator.ts
+++ b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator.ts
@@ -1,8 +1,10 @@
import { PortfolioCalculator } from '@ghostfolio/api/app/portfolio/calculator/portfolio-calculator';
import { AccumulatedValues } from '@ghostfolio/api/app/portfolio/interfaces/accumulated-values.interface';
+import { AverageInvestmentItem } from '@ghostfolio/api/app/portfolio/interfaces/average-investment-item.interface';
import { HoldingPerformance } from '@ghostfolio/api/app/portfolio/interfaces/holding-performance.interface';
import { PortfolioCalculatorActivityItem } from '@ghostfolio/api/app/portfolio/interfaces/portfolio-calculator-activity-item.interface';
import { PortfolioCalculatorHolding } from '@ghostfolio/api/app/portfolio/interfaces/portfolio-calculator-holding.interface';
+import { WeightedInvestment } from '@ghostfolio/api/app/portfolio/interfaces/weighted-investment.interface';
import { PerformancePercentages } from '@ghostfolio/api/app/portfolio/types/performance-percentages.type';
import {
getAnnualizedPerformancePercent,
@@ -29,6 +31,7 @@ import {
isBefore,
isThisYear
} from 'date-fns';
+import { sortedIndex } from 'lodash-es';
export class RoaiPortfolioCalculator extends PortfolioCalculator {
protected calculateOverallPerformance(
@@ -209,77 +212,60 @@ export class RoaiPortfolioCalculator extends PortfolioCalculator {
}: {
historicalDataItems: HistoricalDataItem[];
}): { [date: string]: PerformancePercentages } {
- let grossPerformanceAtStartDate: number;
- let grossPerformanceWithCurrencyEffectAtStartDate: number;
- let previousDate: Date;
- let sumOfWeightedInvestments = 0;
- let sumOfWeightedInvestmentsWithCurrencyEffect = 0;
- let totalInvestmentDays = 0;
- let totalInvestmentDaysWithCurrencyEffect = 0;
-
const performancePercentagesByDate: {
[date: string]: PerformancePercentages;
} = {};
- for (const [index, historicalDataItem] of historicalDataItems.entries()) {
- const date = parseDate(historicalDataItem.date);
-
- // Take the values at the start date from the first day of the date
- // range
- if (index === 0) {
- grossPerformanceAtStartDate =
- historicalDataItem.value - historicalDataItem.totalInvestment;
-
- grossPerformanceWithCurrencyEffectAtStartDate =
- historicalDataItem.valueWithCurrencyEffect -
- historicalDataItem.totalInvestmentValueWithCurrencyEffect;
- } else {
- // The chart dates are not evenly spaced, and the investment changes on
- // a chart date only. Thus the investment of the previous chart date
- // applies to each day until this chart date.
- const previousHistoricalDataItem = historicalDataItems[index - 1];
-
- const daysSincePreviousChartDate = differenceInDays(date, previousDate);
+ if (historicalDataItems.length === 0) {
+ return performancePercentagesByDate;
+ }
- if (previousHistoricalDataItem.totalInvestment > 0) {
- sumOfWeightedInvestments +=
- (previousHistoricalDataItem.totalInvestment +
- grossPerformanceAtStartDate) *
- daysSincePreviousChartDate;
+ const parsedDates = historicalDataItems.map(({ date }) => {
+ return parseDate(date);
+ });
- totalInvestmentDays += daysSincePreviousChartDate;
- }
+ const daysUntilNextItem = parsedDates.slice(1).map((nextDate, index) => {
+ return differenceInDays(nextDate, parsedDates[index]);
+ });
- if (
- previousHistoricalDataItem.totalInvestmentValueWithCurrencyEffect > 0
- ) {
- sumOfWeightedInvestmentsWithCurrencyEffect +=
- (previousHistoricalDataItem.totalInvestmentValueWithCurrencyEffect +
- grossPerformanceWithCurrencyEffectAtStartDate) *
- daysSincePreviousChartDate;
+ // Take the values at the start date from the first day of the date range
+ const [firstHistoricalDataItem] = historicalDataItems;
+
+ const weightedInvestments = this.getWeightedInvestments({
+ grossPerformanceAtStartDate: new Big(firstHistoricalDataItem.value).minus(
+ firstHistoricalDataItem.totalInvestment
+ ),
+ items: historicalDataItems.map(({ totalInvestment }, index) => {
+ return {
+ daysUntilNextItem: daysUntilNextItem[index],
+ investment: new Big(totalInvestment)
+ };
+ })
+ });
- totalInvestmentDaysWithCurrencyEffect += daysSincePreviousChartDate;
+ const weightedInvestmentsWithCurrencyEffect = this.getWeightedInvestments({
+ grossPerformanceAtStartDate: new Big(
+ firstHistoricalDataItem.valueWithCurrencyEffect
+ ).minus(firstHistoricalDataItem.totalInvestmentValueWithCurrencyEffect),
+ items: historicalDataItems.map(
+ ({ totalInvestmentValueWithCurrencyEffect }, index) => {
+ return {
+ daysUntilNextItem: daysUntilNextItem[index],
+ investment: new Big(totalInvestmentValueWithCurrencyEffect)
+ };
}
- }
+ )
+ });
- // Add the gross performance at the start date of the range to the
- // investment of each day. Thus the range starts with the value of its
- // first day, and subsequent buy and sell activities stay included.
- const averageInvestmentValue = this.getAverageInvestment({
- grossPerformanceAtStartDate,
- sumOfWeightedInvestments,
- totalInvestmentDays,
- investment: historicalDataItem.totalInvestment
- });
+ for (const [index, historicalDataItem] of historicalDataItems.entries()) {
+ const averageInvestmentValue = this.getAverageInvestment(
+ weightedInvestments[index]
+ ).toNumber();
const averageInvestmentValueWithCurrencyEffect =
- this.getAverageInvestment({
- grossPerformanceAtStartDate:
- grossPerformanceWithCurrencyEffectAtStartDate,
- investment: historicalDataItem.totalInvestmentValueWithCurrencyEffect,
- sumOfWeightedInvestments: sumOfWeightedInvestmentsWithCurrencyEffect,
- totalInvestmentDays: totalInvestmentDaysWithCurrencyEffect
- });
+ this.getAverageInvestment(
+ weightedInvestmentsWithCurrencyEffect[index]
+ ).toNumber();
performancePercentagesByDate[historicalDataItem.date] = {
dividendInPercentageWithCurrencyEffect:
@@ -297,8 +283,6 @@ export class RoaiPortfolioCalculator extends PortfolioCalculator {
averageInvestmentValueWithCurrencyEffect
: 0
};
-
- previousDate = date;
}
return performancePercentagesByDate;
@@ -657,46 +641,35 @@ export class RoaiPortfolioCalculator extends PortfolioCalculator {
investmentValuesAccumulatedAtStartDateWithCurrencyEffect
);
- let average = new Big(0);
- let dayCount = 0;
+ const averageInvestmentItems: AverageInvestmentItem[] = [];
- for (let i = chartDates.length - 1; i >= 0; i -= 1) {
+ for (
+ let i = sortedIndex(chartDates, rangeStartDateString);
+ i < chartDates.length;
+ i += 1
+ ) {
const date = chartDates[i];
if (date > rangeEndDateString) {
- continue;
- } else if (date < rangeStartDateString) {
break;
}
- const isLastChartDateOfRange =
- i === chartDates.length - 1 || chartDates[i + 1] > rangeEndDateString;
-
- // The chart dates are not evenly spaced, and the investment changes
- // on a chart date only. Thus the investment of a chart date applies to
- // each day until the next chart date. The investment of the last chart
- // date of the range counts for this day only.
- const investmentDays = isLastChartDateOfRange
- ? 1
- : daysUntilNextChartDate[i];
-
- if (
- investmentValuesAccumulatedWithCurrencyEffect[date] instanceof Big &&
- investmentValuesAccumulatedWithCurrencyEffect[date].gt(0)
- ) {
- average = average.add(
- investmentValuesAccumulatedWithCurrencyEffect[date]
- .add(grossPerformanceAtDateRangeStartWithCurrencyEffect)
- .mul(investmentDays)
- );
-
- dayCount += investmentDays;
- }
+ averageInvestmentItems.push({
+ daysUntilNextItem: daysUntilNextChartDate[i],
+ investment:
+ investmentValuesAccumulatedWithCurrencyEffect[date] ?? new Big(0)
+ });
}
- if (dayCount > 0) {
- average = average.div(dayCount);
- }
+ const weightedInvestment = this.getWeightedInvestments({
+ grossPerformanceAtStartDate:
+ grossPerformanceAtDateRangeStartWithCurrencyEffect,
+ items: averageInvestmentItems
+ }).at(-1);
+
+ const average = weightedInvestment
+ ? this.getAverageInvestment(weightedInvestment)
+ : new Big(0);
netPerformanceWithCurrencyEffectMap[dateRange] =
netPerformanceValuesWithCurrencyEffect[rangeEndDateString]?.minus(
@@ -797,23 +770,64 @@ export class RoaiPortfolioCalculator extends PortfolioCalculator {
investment,
sumOfWeightedInvestments,
totalInvestmentDays
+ }: WeightedInvestment) {
+ // The investment of the current item counts for this day only
+ if (investment.gt(0)) {
+ return sumOfWeightedInvestments
+ .add(investment.add(grossPerformanceAtStartDate))
+ .div(totalInvestmentDays + 1);
+ }
+
+ return totalInvestmentDays > 0
+ ? sumOfWeightedInvestments.div(totalInvestmentDays)
+ : new Big(0);
+ }
+
+ /**
+ * Returns the sum of the weighted investments and the number of investment
+ * days before each item of a date range. The chart dates are not evenly
+ * spaced, and the investment changes on a chart date only. Thus the
+ * investment of an item applies to each day until the next item.
+ *
+ * The gross performance at the start date of the range is added to each
+ * investment. Thus the range starts with the value of its first day, and
+ * subsequent buy and sell activities stay included.
+ */
+ private getWeightedInvestments({
+ grossPerformanceAtStartDate,
+ items
}: {
- grossPerformanceAtStartDate: number;
- investment: number;
- sumOfWeightedInvestments: number;
- totalInvestmentDays: number;
+ grossPerformanceAtStartDate: Big;
+ items: AverageInvestmentItem[];
}) {
- // The investment of the current chart date counts for this day only
- if (investment > 0) {
- return (
- (sumOfWeightedInvestments +
- (investment + grossPerformanceAtStartDate)) /
- (totalInvestmentDays + 1)
- );
+ const weightedInvestments: WeightedInvestment[] = [];
+
+ let sumOfWeightedInvestments = new Big(0);
+ let totalInvestmentDays = 0;
+
+ for (const [index, { investment }] of items.entries()) {
+ if (index > 0) {
+ const previousItem = items[index - 1];
+
+ if (previousItem.investment.gt(0)) {
+ sumOfWeightedInvestments = sumOfWeightedInvestments.add(
+ previousItem.investment
+ .add(grossPerformanceAtStartDate)
+ .mul(previousItem.daysUntilNextItem)
+ );
+
+ totalInvestmentDays += previousItem.daysUntilNextItem;
+ }
+ }
+
+ weightedInvestments.push({
+ grossPerformanceAtStartDate,
+ investment,
+ sumOfWeightedInvestments,
+ totalInvestmentDays
+ });
}
- return totalInvestmentDays > 0
- ? sumOfWeightedInvestments / totalInvestmentDays
- : 0;
+ return weightedInvestments;
}
}
diff --git a/apps/api/src/app/portfolio/interfaces/average-investment-item.interface.ts b/apps/api/src/app/portfolio/interfaces/average-investment-item.interface.ts
new file mode 100644
index 0000000000..fd7f32b37b
--- /dev/null
+++ b/apps/api/src/app/portfolio/interfaces/average-investment-item.interface.ts
@@ -0,0 +1,6 @@
+import { Big } from 'big.js';
+
+export interface AverageInvestmentItem {
+ daysUntilNextItem: number;
+ investment: Big;
+}
diff --git a/apps/api/src/app/portfolio/interfaces/weighted-investment.interface.ts b/apps/api/src/app/portfolio/interfaces/weighted-investment.interface.ts
new file mode 100644
index 0000000000..c3cb42cbc4
--- /dev/null
+++ b/apps/api/src/app/portfolio/interfaces/weighted-investment.interface.ts
@@ -0,0 +1,8 @@
+import { Big } from 'big.js';
+
+export interface WeightedInvestment {
+ grossPerformanceAtStartDate: Big;
+ investment: Big;
+ sumOfWeightedInvestments: Big;
+ totalInvestmentDays: number;
+}
From 578684b04eee364a18d6471e2b63bdfb19b1f861 Mon Sep 17 00:00:00 2001
From: Eren Emre Arik <75567227+erenemrearik@users.noreply.github.com>
Date: Wed, 7 Oct 2026 15:01:27 +0300
Subject: [PATCH 08/11] Task/improve language localization for TR (20261007)
(#8079)
---
CHANGELOG.md | 1 +
apps/client/src/locales/messages.tr.xlf | 242 ++++++++++++------------
2 files changed, 122 insertions(+), 121 deletions(-)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 7512b27d80..5746c01408 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -11,6 +11,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
- Moved the performance calculation including dividends (total return) from experimental to general availability
- Improved the language localization for German (`de`)
+- Improved the language localization for Turkish (`tr`)
### Fixed
diff --git a/apps/client/src/locales/messages.tr.xlf b/apps/client/src/locales/messages.tr.xlf
index cd218919d0..85ec353f13 100644
--- a/apps/client/src/locales/messages.tr.xlf
+++ b/apps/client/src/locales/messages.tr.xlf
@@ -57,7 +57,7 @@
features
- oezellikler
+ ozellikler
kebab-case
libs/common/src/lib/routes/routes.ts
@@ -608,7 +608,7 @@
Unknown
- Unknown
+ Bilinmiyor
libs/ui/src/lib/i18n.ts
89
@@ -660,7 +660,7 @@
and is driven by the efforts of its contributors
- and is driven by the efforts of its contributors
+ tarafından başlatıldı ve katkıda bulunanların emeğiyle geliştiriliyor
apps/client/src/app/pages/about/overview/about-overview-page.html
50
@@ -1056,7 +1056,7 @@
Technology
- Technology
+ Teknoloji
libs/ui/src/lib/i18n.ts
102
@@ -1064,7 +1064,7 @@
and we share aggregated key metrics of the platform’s performance
- and we share aggregated key metrics of the platform’s performance
+ ve platformun performansına ilişkin temel metrikleri toplu olarak paylaşıyoruz
apps/client/src/app/pages/about/overview/about-overview-page.html
33
@@ -1080,7 +1080,7 @@
Financial Advisor
- Financial Advisor
+ Finansal Danışman
libs/ui/src/lib/i18n.ts
110
@@ -1152,7 +1152,7 @@
Consumer Cyclical
- Consumer Cyclical
+ Döngüsel Tüketim
libs/ui/src/lib/i18n.ts
94
@@ -1676,7 +1676,7 @@
The source code is fully available as open source software (OSS) under the AGPL-3.0 license
- The source code is fully available as open source software (OSS) under the AGPL-3.0 license
+ Kaynak kodunun tamamı AGPL-3.0 lisansı altında açık kaynaklı yazılım (OSS) olarak erişime açıktır
apps/client/src/app/pages/about/overview/about-overview-page.html
16
@@ -1868,7 +1868,7 @@
Energy
- Energy
+ Enerji
libs/ui/src/lib/i18n.ts
96
@@ -2508,7 +2508,7 @@
Financial Planning
- Financial Planning
+ Finansal Planlama
libs/ui/src/lib/i18n.ts
111
@@ -3156,7 +3156,7 @@
Protect your assets . Refine your personal investment strategy .
- varlıklarınızı koruyun . Kişisel yatırım stratejinizi geliştirin .
+ Varlıklarınızı koruyun . Kişisel yatırım stratejinizi geliştirin .
apps/client/src/app/pages/landing/landing-page.html
128
@@ -3196,7 +3196,7 @@
Basic Materials
- Basic Materials
+ Temel Malzemeler
libs/ui/src/lib/i18n.ts
92
@@ -3664,7 +3664,7 @@
or start a discussion at
- or start a discussion at
+ ya da bir tartışma başlatmak için şu adresi ziyaret edin:
apps/client/src/app/pages/about/overview/about-overview-page.html
98
@@ -3892,7 +3892,7 @@
Exclude from Analysis
- Exclude from Analysis
+ Analiz Dışında Bırak
libs/ui/src/lib/i18n.ts
23
@@ -4549,7 +4549,7 @@
Website of Thomas Kaul
- Website of Thomas Kaul
+ Thomas Kaul’un web sitesi
apps/client/src/app/pages/about/overview/about-overview-page.html
45
@@ -4709,7 +4709,7 @@
Stock Tracking
- Stock Tracking
+ Hisse Senedi Takibi
libs/ui/src/lib/i18n.ts
114
@@ -4733,7 +4733,7 @@
Web
- Web
+ Web
libs/ui/src/lib/i18n.ts
123
@@ -4877,7 +4877,7 @@
Consumer Defensive
- Consumer Defensive
+ Temel Tüketim
libs/ui/src/lib/i18n.ts
95
@@ -4941,7 +4941,7 @@
Utilities
- Utilities
+ Kamu Hizmetleri
libs/ui/src/lib/i18n.ts
103
@@ -5029,7 +5029,7 @@
Contributors to Ghostfolio
- Contributors to Ghostfolio
+ Ghostfolio’ya katkıda bulunanlar
apps/client/src/app/pages/about/overview/about-overview-page.html
54
@@ -5817,7 +5817,7 @@
Communication Services
- Communication Services
+ İletişim Hizmetleri
libs/ui/src/lib/i18n.ts
93
@@ -5925,7 +5925,7 @@
Ghostfolio Status
- Ghostfolio Status
+ Ghostfolio Durumu
apps/client/src/app/pages/about/overview/about-overview-page.html
64
@@ -6177,7 +6177,7 @@
Industrials
- Industrials
+ Sanayi
libs/ui/src/lib/i18n.ts
99
@@ -6193,7 +6193,7 @@
Alternative Investment
- Alternative Investment
+ Alternatif Yatırım
libs/ui/src/lib/i18n.ts
52
@@ -6201,7 +6201,7 @@
Commodity
- Commodity
+ Emtia
libs/ui/src/lib/i18n.ts
53
@@ -6209,7 +6209,7 @@
Equity
- Equity
+ Hisse Senedi
libs/ui/src/lib/i18n.ts
54
@@ -6217,7 +6217,7 @@
Fixed Income
- Fixed Income
+ Sabit Getirili
libs/ui/src/lib/i18n.ts
55
@@ -6225,7 +6225,7 @@
Liquidity
- Liquidity
+ Likidite
libs/ui/src/lib/i18n.ts
56
@@ -6233,7 +6233,7 @@
Real Estate
- Real Estate
+ Gayrimenkul
libs/ui/src/lib/i18n.ts
57
@@ -6241,7 +6241,7 @@
Bond
- Bond
+ Tahvil
libs/ui/src/lib/i18n.ts
60
@@ -6249,7 +6249,7 @@
Cash
- Cash
+ Nakit
libs/ui/src/lib/i18n.ts
61
@@ -6257,7 +6257,7 @@
Collectible
- Collectible
+ Koleksiyon Ürünü
libs/ui/src/lib/i18n.ts
62
@@ -6265,7 +6265,7 @@
Commodity
- Commodity
+ Emtia
apps/client/src/app/pages/i18n/i18n-page.html
5
@@ -6273,7 +6273,7 @@
Cryptocurrency
- Cryptocurrency
+ Kripto Para
libs/ui/src/lib/i18n.ts
63
@@ -6281,7 +6281,7 @@
ETF
- ETF
+ ETF
libs/ui/src/lib/i18n.ts
64
@@ -6289,7 +6289,7 @@
Loan
- Loan
+ Kredi
libs/ui/src/lib/i18n.ts
65
@@ -6297,7 +6297,7 @@
Mutual Fund
- Mutual Fund
+ Yatırım Fonu
libs/ui/src/lib/i18n.ts
66
@@ -6305,7 +6305,7 @@
Precious Metal
- Precious Metal
+ Değerli Maden
libs/ui/src/lib/i18n.ts
67
@@ -6313,7 +6313,7 @@
Private Equity
- Private Equity
+ Özel Sermaye
libs/ui/src/lib/i18n.ts
68
@@ -6321,7 +6321,7 @@
Stock
- Stock
+ Hisse
libs/ui/src/lib/i18n.ts
69
@@ -6409,7 +6409,7 @@
Healthcare
- Healthcare
+ Sağlık
libs/ui/src/lib/i18n.ts
98
@@ -7482,7 +7482,7 @@
Tax Reporting
- Tax Reporting
+ Vergi Raporlama
libs/ui/src/lib/i18n.ts
115
@@ -7538,7 +7538,7 @@
send an e-mail to
- send an e-mail to
+ şu adrese e-posta gönderin:
apps/client/src/app/pages/about/overview/about-overview-page.html
91
@@ -7630,7 +7630,7 @@
Financial Services
- Financial Services
+ Finansal Hizmetler
libs/ui/src/lib/i18n.ts
97
@@ -7726,7 +7726,7 @@
Dividend Tracking
- Dividend Tracking
+ Temettü Takibi
libs/ui/src/lib/i18n.ts
107
@@ -7746,7 +7746,7 @@
Ghostfolio is a lightweight wealth management application for individuals to keep track of stocks, ETFs or cryptocurrencies and make solid, data-driven investment decisions.
- Ghostfolio is a lightweight wealth management application for individuals to keep track of stocks, ETFs or cryptocurrencies and make solid, data-driven investment decisions.
+ Ghostfolio, bireylerin hisse senetlerini, ETF’lerini veya kripto paralarını takip etmesini ve verilere dayalı sağlam yatırım kararları almasını sağlayan hafif bir varlık yönetimi uygulamasıdır.
apps/client/src/app/pages/about/overview/about-overview-page.html
10
@@ -7786,7 +7786,7 @@
Investment Research
- Investment Research
+ Yatırım Araştırması
libs/ui/src/lib/i18n.ts
112
@@ -8060,7 +8060,7 @@
Check the system status at
- Check the system status at
+ Sistem durumunu şu adresten kontrol edebilirsiniz:
apps/client/src/app/pages/about/overview/about-overview-page.html
59
@@ -8068,7 +8068,7 @@
Net Worth Tracking
- Net Worth Tracking
+ Toplam Varlık Takibi
libs/ui/src/lib/i18n.ts
113
@@ -8252,7 +8252,7 @@
The project has been initiated by
- The project has been initiated by
+ Proje
apps/client/src/app/pages/about/overview/about-overview-page.html
41
@@ -8554,7 +8554,7 @@
ETF Tracking
- ETF Tracking
+ ETF Takibi
libs/ui/src/lib/i18n.ts
108
@@ -8578,7 +8578,7 @@
Coverage
- Coverage
+ Karşılanma
apps/client/src/app/pages/i18n/i18n-page.html
147
@@ -8586,7 +8586,7 @@
The assets tagged as emergency fund exceed the emergency fund of ${emergencyFund} ${baseCurrency}
- The assets tagged as emergency fund exceed the emergency fund of ${emergencyFund} ${baseCurrency}
+ Acil durum fonu olarak etiketlenen varlıklar ${emergencyFund} ${baseCurrency} tutarındaki acil durum fonunu aşıyor
apps/client/src/app/pages/i18n/i18n-page.html
149
@@ -8594,7 +8594,7 @@
The emergency fund of ${emergencyFund} ${baseCurrency} is not covered
- The emergency fund of ${emergencyFund} ${baseCurrency} is not covered
+ ${emergencyFund} ${baseCurrency} tutarındaki acil durum fonu karşılanmıyor
apps/client/src/app/pages/i18n/i18n-page.html
153
@@ -8602,7 +8602,7 @@
No emergency fund amount has been set to determine the coverage
- No emergency fund amount has been set to determine the coverage
+ Karşılanma durumunu hesaplamak için bir acil durum fonu tutarı girilmedi
apps/client/src/app/pages/i18n/i18n-page.html
157
@@ -8610,7 +8610,7 @@
The emergency fund of ${emergencyFund} ${baseCurrency} is covered
- The emergency fund of ${emergencyFund} ${baseCurrency} is covered
+ ${emergencyFund} ${baseCurrency} tutarındaki acil durum fonu karşılanıyor
apps/client/src/app/pages/i18n/i18n-page.html
160
@@ -8618,7 +8618,7 @@
Setup
- Acil Durum Fonu: Kurulum
+ Kurulum
apps/client/src/app/pages/i18n/i18n-page.html
163
@@ -8642,7 +8642,7 @@
Fee Ratio
- Fee Ratio
+ Komisyon Oranı
apps/client/src/app/pages/i18n/i18n-page.html
170
@@ -8650,7 +8650,7 @@
The fees do exceed ${thresholdMax}% of the total investment volume (${feeRatio}%)
- The fees do exceed ${thresholdMax}% of the total investment volume (${feeRatio}%)
+ Komisyonlar toplam yatırım hacminin %${thresholdMax} değerini aşıyor (%${feeRatio})
apps/client/src/app/pages/i18n/i18n-page.html
172
@@ -8658,7 +8658,7 @@
The fees do not exceed ${thresholdMax}% of the total investment volume (${feeRatio}%)
- The fees do not exceed ${thresholdMax}% of the total investment volume (${feeRatio}%)
+ Komisyonlar toplam yatırım hacminin %${thresholdMax} değerini aşmıyor (%${feeRatio})
apps/client/src/app/pages/i18n/i18n-page.html
176
@@ -8706,7 +8706,7 @@
The net worth is managed by a single account
- Net değeriniz tek bir hesap tarafından yönetiliyor
+ Toplam varlık tek bir hesapta yönetiliyor
apps/client/src/app/pages/i18n/i18n-page.html
32
@@ -8714,7 +8714,7 @@
The net worth is managed by ${accountsLength} accounts
- Net değeriniz ${accountsLength} hesaplar tarafından yönetiliyor
+ Toplam varlık ${accountsLength} hesapta yönetiliyor
apps/client/src/app/pages/i18n/i18n-page.html
38
@@ -8760,7 +8760,7 @@
Post to Ghostfolio on X (formerly Twitter)
- Post to Ghostfolio on X (formerly Twitter)
+ X (eski adıyla Twitter) üzerinden Ghostfolio’ya yazın
apps/client/src/app/pages/about/overview/about-overview-page.html
85
@@ -8832,7 +8832,7 @@
new
- new
+ yeni
apps/client/src/app/pages/features/features-page.html
223
@@ -8848,7 +8848,7 @@
Over ${thresholdMax}% of the current investment is at ${maxAccountName} (${maxInvestmentRatio}%)
- Over ${thresholdMax}% of the current investment is at ${maxAccountName} (${maxInvestmentRatio}%)
+ Mevcut yatırımın %${thresholdMax} değerinden fazlası ${maxAccountName} hesabında (%${maxInvestmentRatio})
apps/client/src/app/pages/i18n/i18n-page.html
19
@@ -8856,7 +8856,7 @@
The major part of the current investment is at ${maxAccountName} (${maxInvestmentRatio}%) and does not exceed ${thresholdMax}%
- The major part of the current investment is at ${maxAccountName} (${maxInvestmentRatio}%) and does not exceed ${thresholdMax}%
+ Mevcut yatırımın büyük kısmı ${maxAccountName} hesabında (%${maxInvestmentRatio}) ve %${thresholdMax} değerini aşmıyor
apps/client/src/app/pages/i18n/i18n-page.html
26
@@ -8864,7 +8864,7 @@
Equity
- özsermaye
+ Hisse Senedi
apps/client/src/app/pages/i18n/i18n-page.html
43
@@ -8872,7 +8872,7 @@
The equity contribution of the current investment (${equityValueRatio}%) exceeds ${thresholdMax}%
- The equity contribution of the current investment (${equityValueRatio}%) exceeds ${thresholdMax}%
+ Mevcut yatırımdaki hisse senedi payı (%${equityValueRatio}) %${thresholdMax} değerini aşıyor
apps/client/src/app/pages/i18n/i18n-page.html
45
@@ -8880,7 +8880,7 @@
The equity contribution of the current investment (${equityValueRatio}%) is below ${thresholdMin}%
- The equity contribution of the current investment (${equityValueRatio}%) is below ${thresholdMin}%
+ Mevcut yatırımdaki hisse senedi payı (%${equityValueRatio}) %${thresholdMin} değerinin altında
apps/client/src/app/pages/i18n/i18n-page.html
49
@@ -8888,7 +8888,7 @@
The equity contribution of the current investment (${equityValueRatio}%) is within the range of ${thresholdMin}% and ${thresholdMax}%
- The equity contribution of the current investment (${equityValueRatio}%) is within the range of ${thresholdMin}% and ${thresholdMax}%
+ Mevcut yatırımdaki hisse senedi payı (%${equityValueRatio}) %${thresholdMin} ile %${thresholdMax} aralığında
apps/client/src/app/pages/i18n/i18n-page.html
53
@@ -8896,7 +8896,7 @@
Fixed Income
- Sabit Gelir
+ Sabit Getirili
apps/client/src/app/pages/i18n/i18n-page.html
57
@@ -8904,7 +8904,7 @@
The fixed income contribution of the current investment (${fixedIncomeValueRatio}%) exceeds ${thresholdMax}%
- The fixed income contribution of the current investment (${fixedIncomeValueRatio}%) exceeds ${thresholdMax}%
+ Mevcut yatırımdaki sabit getirili varlık payı (%${fixedIncomeValueRatio}) %${thresholdMax} değerini aşıyor
apps/client/src/app/pages/i18n/i18n-page.html
59
@@ -8912,7 +8912,7 @@
The fixed income contribution of the current investment (${fixedIncomeValueRatio}%) is below ${thresholdMin}%
- The fixed income contribution of the current investment (${fixedIncomeValueRatio}%) is below ${thresholdMin}%
+ Mevcut yatırımdaki sabit getirili varlık payı (%${fixedIncomeValueRatio}) %${thresholdMin} değerinin altında
apps/client/src/app/pages/i18n/i18n-page.html
63
@@ -8920,7 +8920,7 @@
The fixed income contribution of the current investment (${fixedIncomeValueRatio}%) is within the range of ${thresholdMin}% and ${thresholdMax}%
- The fixed income contribution of the current investment (${fixedIncomeValueRatio}%) is within the range of ${thresholdMin}% and ${thresholdMax}%
+ Mevcut yatırımdaki sabit getirili varlık payı (%${fixedIncomeValueRatio}) %${thresholdMin} ile %${thresholdMax} aralığında
apps/client/src/app/pages/i18n/i18n-page.html
68
@@ -8928,7 +8928,7 @@
Investment: Base Currency
- Yatırım: Baz Para Birimi
+ Yatırım: Temel Para Birimi
apps/client/src/app/pages/i18n/i18n-page.html
87
@@ -8936,7 +8936,7 @@
The major part of the current investment is not in the base currency (${baseCurrencyValueRatio}% in ${baseCurrency})
- The major part of the current investment is not in the base currency (${baseCurrencyValueRatio}% in ${baseCurrency})
+ Mevcut yatırımın büyük kısmı temel para biriminde değil (${baseCurrency} cinsinden %${baseCurrencyValueRatio})
apps/client/src/app/pages/i18n/i18n-page.html
90
@@ -8944,7 +8944,7 @@
The major part of the current investment is in the base currency (${baseCurrencyValueRatio}% in ${baseCurrency})
- The major part of the current investment is in the base currency (${baseCurrencyValueRatio}% in ${baseCurrency})
+ Mevcut yatırımın büyük kısmı temel para biriminde (${baseCurrency} cinsinden %${baseCurrencyValueRatio})
apps/client/src/app/pages/i18n/i18n-page.html
94
@@ -8960,7 +8960,7 @@
Over ${thresholdMax}% of the current investment is in ${currency} (${maxValueRatio}%)
- Over ${thresholdMax}% of the current investment is in ${currency} (${maxValueRatio}%)
+ Mevcut yatırımın %${thresholdMax} değerinden fazlası ${currency} cinsinden (%${maxValueRatio})
apps/client/src/app/pages/i18n/i18n-page.html
99
@@ -8968,7 +8968,7 @@
The major part of the current investment is in ${currency} (${maxValueRatio}%) and does not exceed ${thresholdMax}%
- The major part of the current investment is in ${currency} (${maxValueRatio}%) and does not exceed ${thresholdMax}%
+ Mevcut yatırımın büyük kısmı ${currency} cinsinden (%${maxValueRatio}) ve %${thresholdMax} değerini aşmıyor
apps/client/src/app/pages/i18n/i18n-page.html
103
@@ -9005,7 +9005,7 @@
If you encounter a bug, would like to suggest an improvement or a new feature , please join the Ghostfolio Slack community, post to @ghostfolio_
- If you encounter a bug, would like to suggest an improvement or a new feature , please join the Ghostfolio Slack community, post to @ghostfolio_
+ Bir hatayla karşılaşırsanız ya da bir iyileştirme veya yeni bir özellik önermek isterseniz Ghostfolio Slack topluluğuna katılın, @ghostfolio_ hesabına yazın
apps/client/src/app/pages/about/overview/about-overview-page.html
71
@@ -9013,7 +9013,7 @@
Stocks
- Stocks
+ Hisse Senetleri
apps/client/src/app/components/markets/markets.component.ts
57
@@ -9025,7 +9025,7 @@
Cryptocurrencies
- Cryptocurrencies
+ Kripto Paralar
apps/client/src/app/components/markets/markets.component.ts
58
@@ -9057,7 +9057,7 @@
Account Cluster Risks
- Account Cluster Risks
+ Hesap Yoğunlaşma Riskleri
apps/client/src/app/pages/i18n/i18n-page.html
16
@@ -9065,7 +9065,7 @@
Asset Class Cluster Risks
- Asset Class Cluster Risks
+ Varlık Sınıfı Yoğunlaşma Riskleri
apps/client/src/app/pages/i18n/i18n-page.html
41
@@ -9073,7 +9073,7 @@
Currency Cluster Risks
- Currency Cluster Risks
+ Para Birimi Yoğunlaşma Riskleri
apps/client/src/app/pages/i18n/i18n-page.html
85
@@ -9081,7 +9081,7 @@
Economic Market Cluster Risks
- Economic Market Cluster Risks
+ Ekonomik Piyasa Yoğunlaşma Riskleri
apps/client/src/app/pages/i18n/i18n-page.html
108
@@ -9089,7 +9089,7 @@
Emergency Fund
- Emergency Fund
+ Acil Durum Fonu
apps/client/src/app/pages/i18n/i18n-page.html
146
@@ -9097,7 +9097,7 @@
Fees
- Fees
+ Komisyon
apps/client/src/app/pages/i18n/i18n-page.html
179
@@ -9105,7 +9105,7 @@
Liquidity
- Liquidity
+ Likidite
apps/client/src/app/pages/i18n/i18n-page.html
72
@@ -9113,7 +9113,7 @@
Buying Power
- Buying Power
+ Alım Gücü
apps/client/src/app/pages/i18n/i18n-page.html
73
@@ -9121,7 +9121,7 @@
The buying power is below ${thresholdMin} ${baseCurrency}
- The buying power is below ${thresholdMin} ${baseCurrency}
+ Alım gücü ${thresholdMin} ${baseCurrency} tutarının altında
apps/client/src/app/pages/i18n/i18n-page.html
75
@@ -9129,7 +9129,7 @@
The buying power is 0 ${baseCurrency}
- The buying power is 0 ${baseCurrency}
+ Alım gücü 0 ${baseCurrency}
apps/client/src/app/pages/i18n/i18n-page.html
79
@@ -9137,7 +9137,7 @@
The buying power exceeds ${thresholdMin} ${baseCurrency}
- The buying power exceeds ${thresholdMin} ${baseCurrency}
+ Alım gücü ${thresholdMin} ${baseCurrency} tutarını aşıyor
apps/client/src/app/pages/i18n/i18n-page.html
82
@@ -9145,7 +9145,7 @@
Regional Market Cluster Risks
- Regional Market Cluster Risks
+ Bölgesel Piyasa Yoğunlaşma Riskleri
apps/client/src/app/pages/i18n/i18n-page.html
181
@@ -9173,7 +9173,7 @@
Developed Markets
- Developed Markets
+ Gelişmiş Piyasalar
apps/client/src/app/pages/i18n/i18n-page.html
111
@@ -9181,7 +9181,7 @@
The developed markets contribution of the current investment (${developedMarketsValueRatio}%) exceeds ${thresholdMax}%
- The developed markets contribution of the current investment (${developedMarketsValueRatio}%) exceeds ${thresholdMax}%
+ Mevcut yatırımdaki gelişmiş piyasalar payı (%${developedMarketsValueRatio}) %${thresholdMax} değerini aşıyor
apps/client/src/app/pages/i18n/i18n-page.html
114
@@ -9189,7 +9189,7 @@
The developed markets contribution of the current investment (${developedMarketsValueRatio}%) is below ${thresholdMin}%
- The developed markets contribution of the current investment (${developedMarketsValueRatio}%) is below ${thresholdMin}%
+ Mevcut yatırımdaki gelişmiş piyasalar payı (%${developedMarketsValueRatio}) %${thresholdMin} değerinin altında
apps/client/src/app/pages/i18n/i18n-page.html
119
@@ -9197,7 +9197,7 @@
The developed markets contribution of the current investment (${developedMarketsValueRatio}%) is within the range of ${thresholdMin}% and ${thresholdMax}%
- The developed markets contribution of the current investment (${developedMarketsValueRatio}%) is within the range of ${thresholdMin}% and ${thresholdMax}%
+ Mevcut yatırımdaki gelişmiş piyasalar payı (%${developedMarketsValueRatio}) %${thresholdMin} ile %${thresholdMax} aralığında
apps/client/src/app/pages/i18n/i18n-page.html
124
@@ -9205,7 +9205,7 @@
Emerging Markets
- Emerging Markets
+ Gelişmekte Olan Piyasalar
apps/client/src/app/pages/i18n/i18n-page.html
129
@@ -9213,7 +9213,7 @@
The emerging markets contribution of the current investment (${emergingMarketsValueRatio}%) exceeds ${thresholdMax}%
- The emerging markets contribution of the current investment (${emergingMarketsValueRatio}%) exceeds ${thresholdMax}%
+ Mevcut yatırımdaki gelişmekte olan piyasalar payı (%${emergingMarketsValueRatio}) %${thresholdMax} değerini aşıyor
apps/client/src/app/pages/i18n/i18n-page.html
132
@@ -9221,7 +9221,7 @@
The emerging markets contribution of the current investment (${emergingMarketsValueRatio}%) is below ${thresholdMin}%
- The emerging markets contribution of the current investment (${emergingMarketsValueRatio}%) is below ${thresholdMin}%
+ Mevcut yatırımdaki gelişmekte olan piyasalar payı (%${emergingMarketsValueRatio}) %${thresholdMin} değerinin altında
apps/client/src/app/pages/i18n/i18n-page.html
137
@@ -9229,7 +9229,7 @@
The emerging markets contribution of the current investment (${emergingMarketsValueRatio}%) is within the range of ${thresholdMin}% and ${thresholdMax}%
- The emerging markets contribution of the current investment (${emergingMarketsValueRatio}%) is within the range of ${thresholdMin}% and ${thresholdMax}%
+ Mevcut yatırımdaki gelişmekte olan piyasalar payı (%${emergingMarketsValueRatio}) %${thresholdMin} ile %${thresholdMax} aralığında
apps/client/src/app/pages/i18n/i18n-page.html
142
@@ -9237,7 +9237,7 @@
No accounts have been set up
- No accounts have been set up
+ Henüz hesap oluşturulmadı
apps/client/src/app/pages/i18n/i18n-page.html
23
@@ -9245,7 +9245,7 @@
The net worth is managed by 0 accounts
- Net değeriniz 0 hesap tarafından yönetiliyor
+ Toplam varlık hiçbir hesapta yönetilmiyor
apps/client/src/app/pages/i18n/i18n-page.html
35
@@ -9253,7 +9253,7 @@
Asia-Pacific
- Asya-Pasifik
+ Asya Pasifik
apps/client/src/app/pages/i18n/i18n-page.html
183
@@ -9261,7 +9261,7 @@
The Asia-Pacific market contribution of the current investment (${valueRatio}%) exceeds ${thresholdMax}%
- The Asia-Pacific market contribution of the current investment (${valueRatio}%) exceeds ${thresholdMax}%
+ Mevcut yatırımdaki Asya Pasifik piyasası payı (%${valueRatio}) %${thresholdMax} değerini aşıyor
apps/client/src/app/pages/i18n/i18n-page.html
185
@@ -9269,7 +9269,7 @@
The Asia-Pacific market contribution of the current investment (${valueRatio}%) is below ${thresholdMin}%
- The Asia-Pacific market contribution of the current investment (${valueRatio}%) is below ${thresholdMin}%
+ Mevcut yatırımdaki Asya Pasifik piyasası payı (%${valueRatio}) %${thresholdMin} değerinin altında
apps/client/src/app/pages/i18n/i18n-page.html
189
@@ -9277,7 +9277,7 @@
The Asia-Pacific market contribution of the current investment (${valueRatio}%) is within the range of ${thresholdMin}% and ${thresholdMax}%
- The Asia-Pacific market contribution of the current investment (${valueRatio}%) is within the range of ${thresholdMin}% and ${thresholdMax}%
+ Mevcut yatırımdaki Asya Pasifik piyasası payı (%${valueRatio}) %${thresholdMin} ile %${thresholdMax} aralığında
apps/client/src/app/pages/i18n/i18n-page.html
193
@@ -9293,7 +9293,7 @@
The Emerging Markets contribution of the current investment (${valueRatio}%) exceeds ${thresholdMax}%
- The Emerging Markets contribution of the current investment (${valueRatio}%) exceeds ${thresholdMax}%
+ Mevcut yatırımdaki Gelişmekte Olan Piyasalar payı (%${valueRatio}) %${thresholdMax} değerini aşıyor
apps/client/src/app/pages/i18n/i18n-page.html
201
@@ -9301,7 +9301,7 @@
The Emerging Markets contribution of the current investment (${valueRatio}%) is below ${thresholdMin}%
- The Emerging Markets contribution of the current investment (${valueRatio}%) is below ${thresholdMin}%
+ Mevcut yatırımdaki Gelişmekte Olan Piyasalar payı (%${valueRatio}) %${thresholdMin} değerinin altında
apps/client/src/app/pages/i18n/i18n-page.html
205
@@ -9309,7 +9309,7 @@
The Emerging Markets contribution of the current investment (${valueRatio}%) is within the range of ${thresholdMin}% and ${thresholdMax}%
- The Emerging Markets contribution of the current investment (${valueRatio}%) is within the range of ${thresholdMin}% and ${thresholdMax}%
+ Mevcut yatırımdaki Gelişmekte Olan Piyasalar payı (%${valueRatio}) %${thresholdMin} ile %${thresholdMax} aralığında
apps/client/src/app/pages/i18n/i18n-page.html
209
@@ -9325,7 +9325,7 @@
The Europe market contribution of the current investment (${valueRatio}%) exceeds ${thresholdMax}%
- The Europe market contribution of the current investment (${valueRatio}%) exceeds ${thresholdMax}%
+ Mevcut yatırımdaki Avrupa piyasası payı (%${valueRatio}) %${thresholdMax} değerini aşıyor
apps/client/src/app/pages/i18n/i18n-page.html
215
@@ -9333,7 +9333,7 @@
The Europe market contribution of the current investment (${valueRatio}%) is below ${thresholdMin}%
- The Europe market contribution of the current investment (${valueRatio}%) is below ${thresholdMin}%
+ Mevcut yatırımdaki Avrupa piyasası payı (%${valueRatio}) %${thresholdMin} değerinin altında
apps/client/src/app/pages/i18n/i18n-page.html
219
@@ -9341,7 +9341,7 @@
The Europe market contribution of the current investment (${valueRatio}%) is within the range of ${thresholdMin}% and ${thresholdMax}%
- The Europe market contribution of the current investment (${valueRatio}%) is within the range of ${thresholdMin}% and ${thresholdMax}%
+ Mevcut yatırımdaki Avrupa piyasası payı (%${valueRatio}) %${thresholdMin} ile %${thresholdMax} aralığında
apps/client/src/app/pages/i18n/i18n-page.html
223
@@ -9357,7 +9357,7 @@
The Japan market contribution of the current investment (${valueRatio}%) exceeds ${thresholdMax}%
- The Japan market contribution of the current investment (${valueRatio}%) exceeds ${thresholdMax}%
+ Mevcut yatırımdaki Japonya piyasası payı (%${valueRatio}) %${thresholdMax} değerini aşıyor
apps/client/src/app/pages/i18n/i18n-page.html
229
@@ -9365,7 +9365,7 @@
The Japan market contribution of the current investment (${valueRatio}%) is below ${thresholdMin}%
- The Japan market contribution of the current investment (${valueRatio}%) is below ${thresholdMin}%
+ Mevcut yatırımdaki Japonya piyasası payı (%${valueRatio}) %${thresholdMin} değerinin altında
apps/client/src/app/pages/i18n/i18n-page.html
233
@@ -9373,7 +9373,7 @@
The Japan market contribution of the current investment (${valueRatio}%) is within the range of ${thresholdMin}% and ${thresholdMax}%
- The Japan market contribution of the current investment (${valueRatio}%) is within the range of ${thresholdMin}% and ${thresholdMax}%
+ Mevcut yatırımdaki Japonya piyasası payı (%${valueRatio}) %${thresholdMin} ile %${thresholdMax} aralığında
apps/client/src/app/pages/i18n/i18n-page.html
237
@@ -9389,7 +9389,7 @@
The North America market contribution of the current investment (${valueRatio}%) exceeds ${thresholdMax}%
- The North America market contribution of the current investment (${valueRatio}%) exceeds ${thresholdMax}%
+ Mevcut yatırımdaki Kuzey Amerika piyasası payı (%${valueRatio}) %${thresholdMax} değerini aşıyor
apps/client/src/app/pages/i18n/i18n-page.html
243
@@ -9397,7 +9397,7 @@
The North America market contribution of the current investment (${valueRatio}%) is below ${thresholdMin}%
- The North America market contribution of the current investment (${valueRatio}%) is below ${thresholdMin}%
+ Mevcut yatırımdaki Kuzey Amerika piyasası payı (%${valueRatio}) %${thresholdMin} değerinin altında
apps/client/src/app/pages/i18n/i18n-page.html
247
@@ -9405,7 +9405,7 @@
The North America market contribution of the current investment (${valueRatio}%) is within the range of ${thresholdMin}% and ${thresholdMax}%
- The North America market contribution of the current investment (${valueRatio}%) is within the range of ${thresholdMin}% and ${thresholdMax}%
+ Mevcut yatırımdaki Kuzey Amerika piyasası payı (%${valueRatio}) %${thresholdMin} ile %${thresholdMax} aralığında
apps/client/src/app/pages/i18n/i18n-page.html
251
@@ -9489,7 +9489,7 @@
Ghostfolio is an independent & bootstrapped business
- Ghostfolio is an independent & bootstrapped business
+ Ghostfolio, dış yatırım almadan kendi kaynaklarıyla büyüyen bağımsız bir işletmedir
apps/client/src/app/pages/about/overview/about-overview-page.html
161
From 2254f7989c4bd0b13b1f236973f97e8173331c33 Mon Sep 17 00:00:00 2001
From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com>
Date: Wed, 7 Oct 2026 17:40:08 +0200
Subject: [PATCH 09/11] Bugfix/content security policy for Ghostfolio data
provider (#8082)
* Fix content security policy for Ghostfolio data provider
* Update changelog
---
CHANGELOG.md | 1 +
apps/api/src/helper/security-headers.helper.spec.ts | 6 ++++++
apps/api/src/helper/security-headers.helper.ts | 1 +
3 files changed, 8 insertions(+)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 5746c01408..59481e7c67 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -19,6 +19,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
- Fixed the missing mapping for Aland Islands in the country weightings of the _Financial Modeling Prep_ service
- Fixed the net performance percentage of date ranges in the portfolio performance calculation by weighting the average investment by the number of days between the chart dates
- Fixed the start date of calendar year date ranges in the portfolio performance calculation
+- Fixed an issue where the Content Security Policy in HTTP security headers blocked the status check of the Ghostfolio data provider when `ENABLE_FEATURE_SECURITY_HEADERS` was enabled (experimental)
## 3.80.2 - 2026-10-06
diff --git a/apps/api/src/helper/security-headers.helper.spec.ts b/apps/api/src/helper/security-headers.helper.spec.ts
index 1d5f0ac03f..231054e59e 100644
--- a/apps/api/src/helper/security-headers.helper.spec.ts
+++ b/apps/api/src/helper/security-headers.helper.spec.ts
@@ -52,6 +52,12 @@ describe('getHelmetOptions', () => {
);
});
+ it('should allow connections to ghostfol.io for the status check of the Ghostfolio data provider', () => {
+ expect(headers.get('content-security-policy')).toContain(
+ "connect-src 'self' https://ghostfol.io"
+ );
+ });
+
it('should not upgrade insecure requests', () => {
expect(headers.get('content-security-policy')).not.toContain(
'upgrade-insecure-requests'
diff --git a/apps/api/src/helper/security-headers.helper.ts b/apps/api/src/helper/security-headers.helper.ts
index f983bdc900..f9631ec292 100644
--- a/apps/api/src/helper/security-headers.helper.ts
+++ b/apps/api/src/helper/security-headers.helper.ts
@@ -25,6 +25,7 @@ export function getHelmetOptions({
return {
contentSecurityPolicy: {
directives: {
+ connectSrc: ["'self'", 'https://ghostfol.io'], // Allow connections to ghostfol.io for the status check of the Ghostfolio data provider
scriptSrc: ["'self'", "'unsafe-inline'"], // Allow inline scripts
scriptSrcAttr: ["'self'", "'unsafe-inline'"], // Allow inline event handlers
styleSrc: ["'self'", "'unsafe-inline'"], // Allow inline styles
From 035462af00d4ec745d9c5da93156f667ba4aa81d Mon Sep 17 00:00:00 2001
From: Kenrick Tandrian <60643640+KenTandrian@users.noreply.github.com>
Date: Wed, 7 Oct 2026 22:45:09 +0700
Subject: [PATCH 10/11] Task/widen input types in holdings and activities
tables and enable strictInputTypes (#8083)
Widen input types
---
apps/client/tsconfig.json | 2 +-
.../activities-table.component.ts | 32 ++++++++++++-------
libs/ui/src/lib/activities-table/index.ts | 1 +
.../activities-table/interfaces/interfaces.ts | 21 ++++++++++++
.../holdings-table.component.ts | 14 ++++----
libs/ui/src/lib/holdings-table/index.ts | 1 +
.../holdings-table/interfaces/interfaces.ts | 17 ++++++++++
7 files changed, 68 insertions(+), 20 deletions(-)
create mode 100644 libs/ui/src/lib/activities-table/interfaces/interfaces.ts
create mode 100644 libs/ui/src/lib/holdings-table/interfaces/interfaces.ts
diff --git a/apps/client/tsconfig.json b/apps/client/tsconfig.json
index 2899fc61c6..a6815ec125 100644
--- a/apps/client/tsconfig.json
+++ b/apps/client/tsconfig.json
@@ -21,7 +21,7 @@
"strictDomEventTypes": true,
"strictDomLocalRefTypes": true,
"strictInputAccessModifiers": true,
- "strictInputTypes": false,
+ "strictInputTypes": true,
"strictLiteralTypes": true,
"strictNullInputTypes": true,
"strictOutputEventTypes": true,
diff --git a/libs/ui/src/lib/activities-table/activities-table.component.ts b/libs/ui/src/lib/activities-table/activities-table.component.ts
index c8ee009508..8a7b59645a 100644
--- a/libs/ui/src/lib/activities-table/activities-table.component.ts
+++ b/libs/ui/src/lib/activities-table/activities-table.component.ts
@@ -71,6 +71,7 @@ import { GfActivityTypeComponent } from '../activity-type/activity-type.componen
import { GfEntityLogoComponent } from '../entity-logo/entity-logo.component';
import { GfNoActivitiesInfoComponent } from '../no-activities-info/no-activities-info.component';
import { GfValueComponent } from '../value/value.component';
+import { ActivitiesTableItem } from './interfaces/interfaces';
@Component({
changeDetection: ChangeDetectionStrategy.OnPush,
@@ -99,7 +100,11 @@ import { GfValueComponent } from '../value/value.component';
styleUrls: ['./activities-table.component.scss'],
templateUrl: './activities-table.component.html'
})
-export class GfActivitiesTableComponent implements AfterViewInit, OnInit {
+export class GfActivitiesTableComponent<
+ T extends ActivitiesTableItem = Activity
+>
+ implements AfterViewInit, OnInit
+{
@Input() public baseCurrency?: string;
@Input() public deviceType: string;
@Input() public hasActivities: boolean;
@@ -127,7 +132,7 @@ export class GfActivitiesTableComponent implements AfterViewInit, OnInit {
@Output() import = new EventEmitter();
@Output() importDividends = new EventEmitter();
@Output() pageChanged = new EventEmitter();
- @Output() selectedActivities = new EventEmitter();
+ @Output() selectedActivities = new EventEmitter();
@Output() sortChanged = new EventEmitter();
@Output() typesFilterChanged = new EventEmitter();
@@ -138,12 +143,12 @@ export class GfActivitiesTableComponent implements AfterViewInit, OnInit {
public hasErrors = false;
public isDraftActivity = isDraftActivity;
public isUUID = isUUID;
- public selectedRows = new SelectionModel(true, []);
+ public selectedRows = new SelectionModel(true, []);
public typesFilter = new FormControl([]);
public readonly activityTypes = input([]);
public readonly dataSource = input.required<
- MatTableDataSource | undefined
+ MatTableDataSource | undefined
>();
public readonly showAccountColumn = input(true);
public readonly showCheckbox = input(false);
@@ -158,11 +163,13 @@ export class GfActivitiesTableComponent implements AfterViewInit, OnInit {
{ clone: string[]; update: string[] }
>();
- for (const { id } of this.dataSource()?.data ?? []) {
- routerLinks.set(id, {
- clone: clone.routerLink(id),
- update: update.routerLink(id)
- });
+ for (const activity of this.dataSource()?.data ?? []) {
+ if (activity.id) {
+ routerLinks.set(activity.id, {
+ clone: clone.routerLink(activity.id),
+ update: update.routerLink(activity.id)
+ });
+ }
}
return routerLinks;
@@ -276,7 +283,7 @@ export class GfActivitiesTableComponent implements AfterViewInit, OnInit {
return numSelectedRows === numTotalRows;
}
- public canClickActivity(activity: Activity) {
+ public canClickActivity(activity: T) {
return (
this.hasPermissionToOpenDetails &&
isDraftActivity(activity) === false &&
@@ -302,7 +309,7 @@ export class GfActivitiesTableComponent implements AfterViewInit, OnInit {
this.pageChanged.emit(page);
}
- public onClickActivity(activity: Activity) {
+ public onClickActivity(activity: T) {
if (this.showCheckbox()) {
if (!activity.error) {
this.selectedRows.toggle(activity);
@@ -355,6 +362,9 @@ export class GfActivitiesTableComponent implements AfterViewInit, OnInit {
.map((activity) => {
return activity.id;
})
+ .filter((id): id is string => {
+ return !!id;
+ })
);
}
diff --git a/libs/ui/src/lib/activities-table/index.ts b/libs/ui/src/lib/activities-table/index.ts
index 82eee49b1c..dae66efe42 100644
--- a/libs/ui/src/lib/activities-table/index.ts
+++ b/libs/ui/src/lib/activities-table/index.ts
@@ -1 +1,2 @@
export * from './activities-table.component';
+export * from './interfaces/interfaces';
diff --git a/libs/ui/src/lib/activities-table/interfaces/interfaces.ts b/libs/ui/src/lib/activities-table/interfaces/interfaces.ts
new file mode 100644
index 0000000000..ac95331159
--- /dev/null
+++ b/libs/ui/src/lib/activities-table/interfaces/interfaces.ts
@@ -0,0 +1,21 @@
+import { Activity, EnhancedAssetProfile } from '@ghostfolio/common/interfaces';
+
+export interface ActivitiesTableItem
+ extends
+ Pick<
+ Activity,
+ | 'currency'
+ | 'date'
+ | 'fee'
+ | 'quantity'
+ | 'type'
+ | 'unitPrice'
+ | 'value'
+ | 'valueInBaseCurrency'
+ >,
+ Partial> {
+ assetProfile: Pick<
+ EnhancedAssetProfile,
+ 'currency' | 'dataSource' | 'name' | 'symbol'
+ >;
+}
diff --git a/libs/ui/src/lib/holdings-table/holdings-table.component.ts b/libs/ui/src/lib/holdings-table/holdings-table.component.ts
index 0be6e54f6e..3181cc1347 100644
--- a/libs/ui/src/lib/holdings-table/holdings-table.component.ts
+++ b/libs/ui/src/lib/holdings-table/holdings-table.component.ts
@@ -6,10 +6,7 @@ import {
getLowercase,
isCashPosition
} from '@ghostfolio/common/helper';
-import {
- AssetProfileIdentifier,
- PortfolioPosition
-} from '@ghostfolio/common/interfaces';
+import { AssetProfileIdentifier } from '@ghostfolio/common/interfaces';
import {
CUSTOM_ELEMENTS_SCHEMA,
@@ -31,6 +28,7 @@ import { NgxSkeletonLoaderModule } from 'ngx-skeleton-loader';
import { GfEntityLogoComponent } from '../entity-logo/entity-logo.component';
import { GfValueComponent } from '../value/value.component';
+import { HoldingsTableItem } from './interfaces/interfaces';
@Component({
changeDetection: ChangeDetectionStrategy.OnPush,
@@ -53,7 +51,7 @@ export class GfHoldingsTableComponent {
public readonly hasPermissionToOpenDetails = input(true);
public readonly hasPermissionToShowQuantities = input(true);
public readonly hasPermissionToShowValues = input(true);
- public readonly holdings = input.required();
+ public readonly holdings = input.required();
public readonly locale = input(getLocale(), {
transform: (value?: string) => {
@@ -69,7 +67,7 @@ export class GfHoldingsTableComponent {
protected readonly paginator = viewChild.required(MatPaginator);
protected readonly sort = viewChild.required(MatSort);
- protected readonly dataSource = new MatTableDataSource([]);
+ protected readonly dataSource = new MatTableDataSource([]);
protected readonly displayedColumns = computed(() => {
if (this.mode() === 'simple') {
@@ -134,13 +132,13 @@ export class GfHoldingsTableComponent {
});
}
- protected canShowDetails(holding: PortfolioPosition): boolean {
+ protected canShowDetails(holding: HoldingsTableItem): boolean {
return this.hasPermissionToOpenDetails() && canOpenHoldingDetail(holding);
}
protected getCountryCodeForCashPosition({
assetProfile
- }: PortfolioPosition): string {
+ }: HoldingsTableItem): string {
return isCashPosition(assetProfile)
? getCountryCodeFromCurrency(assetProfile.currency)
: '';
diff --git a/libs/ui/src/lib/holdings-table/index.ts b/libs/ui/src/lib/holdings-table/index.ts
index f2dd696ceb..75a3238b90 100644
--- a/libs/ui/src/lib/holdings-table/index.ts
+++ b/libs/ui/src/lib/holdings-table/index.ts
@@ -1 +1,2 @@
export * from './holdings-table.component';
+export * from './interfaces/interfaces';
diff --git a/libs/ui/src/lib/holdings-table/interfaces/interfaces.ts b/libs/ui/src/lib/holdings-table/interfaces/interfaces.ts
new file mode 100644
index 0000000000..56743b872d
--- /dev/null
+++ b/libs/ui/src/lib/holdings-table/interfaces/interfaces.ts
@@ -0,0 +1,17 @@
+import { PortfolioPosition } from '@ghostfolio/common/interfaces';
+
+export interface HoldingsTableItem
+ extends
+ Pick<
+ PortfolioPosition,
+ | 'allocationInPercentage'
+ | 'assetProfile'
+ | 'dateOfFirstActivity'
+ | 'netPerformancePercentWithCurrencyEffect'
+ >,
+ Partial<
+ Pick<
+ PortfolioPosition,
+ 'netPerformanceWithCurrencyEffect' | 'quantity' | 'valueInBaseCurrency'
+ >
+ > {}
From 920d0787541a8568920fc11f978aa01e5a52c581 Mon Sep 17 00:00:00 2001
From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com>
Date: Wed, 7 Oct 2026 17:47:38 +0200
Subject: [PATCH 11/11] Release 3.81.0 (#8085)
---
CHANGELOG.md | 2 +-
package-lock.json | 4 ++--
package.json | 2 +-
3 files changed, 4 insertions(+), 4 deletions(-)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 59481e7c67..3a08d82688 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -5,7 +5,7 @@ All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
-## Unreleased
+## 3.81.0 - 2026-10-07
### Changed
diff --git a/package-lock.json b/package-lock.json
index d6750eeebc..669fc8209f 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,12 +1,12 @@
{
"name": "ghostfolio",
- "version": "3.80.2",
+ "version": "3.81.0",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "ghostfolio",
- "version": "3.80.2",
+ "version": "3.81.0",
"hasInstallScript": true,
"license": "AGPL-3.0",
"dependencies": {
diff --git a/package.json b/package.json
index ce889e2716..357e211fd3 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "ghostfolio",
- "version": "3.80.2",
+ "version": "3.81.0",
"homepage": "https://ghostfol.io",
"license": "AGPL-3.0",
"repository": "https://github.com/ghostfolio/ghostfolio",