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) { -
-
Dividend
-
- -
-
- } 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",