From bdf72164b1dce54b65c3b60886eec77e5c96f93b Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Wed, 19 Jul 2023 11:30:48 +0200 Subject: [PATCH 01/10] Feature/break down emergency fund by cash and assets (#2159) * Break down emergency fund in cash and assets * Update changelog --- CHANGELOG.md | 6 +++ .../interfaces/portfolio-order.interface.ts | 3 +- .../transaction-point-symbol.interface.ts | 3 +- .../src/app/portfolio/portfolio-calculator.ts | 3 ++ .../src/app/portfolio/portfolio.controller.ts | 2 + .../src/app/portfolio/portfolio.service.ts | 42 ++++++++++--------- .../portfolio-summary.component.html | 28 ++++++++++++- .../portfolio/fire/fire-page.component.ts | 2 +- .../portfolio-position.interface.ts | 5 ++- .../interfaces/portfolio-summary.interface.ts | 7 +++- .../interfaces/timeline-position.interface.ts | 3 +- 11 files changed, 77 insertions(+), 27 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a02baea1b..3d86f2c54 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,12 @@ 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 + +### Added + +- Broken down the emergency fund by cash and assets + ## 1.290.0 - 2023-07-16 ### Added diff --git a/apps/api/src/app/portfolio/interfaces/portfolio-order.interface.ts b/apps/api/src/app/portfolio/interfaces/portfolio-order.interface.ts index 2466e81af..cc3a97752 100644 --- a/apps/api/src/app/portfolio/interfaces/portfolio-order.interface.ts +++ b/apps/api/src/app/portfolio/interfaces/portfolio-order.interface.ts @@ -1,4 +1,4 @@ -import { DataSource, Type as TypeOfOrder } from '@prisma/client'; +import { DataSource, Tag, Type as TypeOfOrder } from '@prisma/client'; import Big from 'big.js'; export interface PortfolioOrder { @@ -9,6 +9,7 @@ export interface PortfolioOrder { name: string; quantity: Big; symbol: string; + tags?: Tag[]; type: TypeOfOrder; unitPrice: Big; } diff --git a/apps/api/src/app/portfolio/interfaces/transaction-point-symbol.interface.ts b/apps/api/src/app/portfolio/interfaces/transaction-point-symbol.interface.ts index cc199119e..5350adccc 100644 --- a/apps/api/src/app/portfolio/interfaces/transaction-point-symbol.interface.ts +++ b/apps/api/src/app/portfolio/interfaces/transaction-point-symbol.interface.ts @@ -1,4 +1,4 @@ -import { DataSource } from '@prisma/client'; +import { DataSource, Tag } from '@prisma/client'; import Big from 'big.js'; export interface TransactionPointSymbol { @@ -9,5 +9,6 @@ export interface TransactionPointSymbol { investment: Big; quantity: Big; symbol: string; + tags?: Tag[]; transactionCount: number; } diff --git a/apps/api/src/app/portfolio/portfolio-calculator.ts b/apps/api/src/app/portfolio/portfolio-calculator.ts index 9addb29dd..cf6d1b156 100644 --- a/apps/api/src/app/portfolio/portfolio-calculator.ts +++ b/apps/api/src/app/portfolio/portfolio-calculator.ts @@ -114,6 +114,7 @@ export class PortfolioCalculator { firstBuyDate: oldAccumulatedSymbol.firstBuyDate, quantity: newQuantity, symbol: order.symbol, + tags: order.tags, transactionCount: oldAccumulatedSymbol.transactionCount + 1 }; } else { @@ -125,6 +126,7 @@ export class PortfolioCalculator { investment: unitPrice.mul(order.quantity).mul(factor), quantity: order.quantity.mul(factor), symbol: order.symbol, + tags: order.tags, transactionCount: 1 }; } @@ -492,6 +494,7 @@ export class PortfolioCalculator { : null, quantity: item.quantity, symbol: item.symbol, + tags: item.tags, transactionCount: item.transactionCount }); diff --git a/apps/api/src/app/portfolio/portfolio.controller.ts b/apps/api/src/app/portfolio/portfolio.controller.ts index 0d9afea51..6a8102501 100644 --- a/apps/api/src/app/portfolio/portfolio.controller.ts +++ b/apps/api/src/app/portfolio/portfolio.controller.ts @@ -161,10 +161,12 @@ export class PortfolioController { 'emergencyFund', 'excludedAccountsAndActivities', 'fees', + 'fireWealth', 'items', 'liabilities', 'netWorth', 'totalBuy', + 'totalInvestment', 'totalSell' ]); } diff --git a/apps/api/src/app/portfolio/portfolio.service.ts b/apps/api/src/app/portfolio/portfolio.service.ts index 4bc1c7b15..29cdbe66f 100644 --- a/apps/api/src/app/portfolio/portfolio.service.ts +++ b/apps/api/src/app/portfolio/portfolio.service.ts @@ -583,6 +583,7 @@ export class PortfolioService { quantity: item.quantity.toNumber(), sectors: symbolProfile.sectors, symbol: item.symbol, + tags: item.tags, transactionCount: item.transactionCount, url: symbolProfile.url, valueInBaseCurrency: value.toNumber() @@ -628,7 +629,7 @@ export class PortfolioService { const emergencyFundInCash = emergencyFund .minus( this.getEmergencyFundPositionsValueInBaseCurrency({ - activities: orders + holdings }) ) .toNumber(); @@ -656,7 +657,7 @@ export class PortfolioService { balanceInBaseCurrency: cashDetails.balanceInBaseCurrency, emergencyFundPositionsValueInBaseCurrency: this.getEmergencyFundPositionsValueInBaseCurrency({ - activities: orders + holdings }) }); @@ -742,6 +743,7 @@ export class PortfolioService { name: order.SymbolProfile?.name, quantity: new Big(order.quantity), symbol: order.SymbolProfile.symbol, + tags: order.tags, type: order.type, unitPrice: new Big(order.unitPrice) })); @@ -1392,13 +1394,13 @@ export class PortfolioService { } private getEmergencyFundPositionsValueInBaseCurrency({ - activities + holdings }: { - activities: Activity[]; + holdings: PortfolioDetails['holdings']; }) { - const emergencyFundOrders = activities.filter((activity) => { + const emergencyFundHoldings = Object.values(holdings).filter(({ tags }) => { return ( - activity.tags?.some(({ id }) => { + tags?.some(({ id }) => { return id === EMERGENCY_FUND_TAG_ID; }) ?? false ); @@ -1406,18 +1408,9 @@ export class PortfolioService { let valueInBaseCurrencyOfEmergencyFundPositions = new Big(0); - for (const order of emergencyFundOrders) { - if (order.type === 'BUY') { - valueInBaseCurrencyOfEmergencyFundPositions = - valueInBaseCurrencyOfEmergencyFundPositions.plus( - order.valueInBaseCurrency - ); - } else if (order.type === 'SELL') { - valueInBaseCurrencyOfEmergencyFundPositions = - valueInBaseCurrencyOfEmergencyFundPositions.minus( - order.valueInBaseCurrency - ); - } + for (const { value } of emergencyFundHoldings) { + valueInBaseCurrencyOfEmergencyFundPositions = + valueInBaseCurrencyOfEmergencyFundPositions.plus(value); } return valueInBaseCurrencyOfEmergencyFundPositions.toNumber(); @@ -1476,6 +1469,7 @@ export class PortfolioService { quantity: 0, sectors: [], symbol: currency, + tags: [], transactionCount: 0, valueInBaseCurrency: balance }; @@ -1687,7 +1681,16 @@ export class PortfolioService { totalBuy, totalSell, committedFunds: committedFunds.toNumber(), - emergencyFund: emergencyFund.toNumber(), + emergencyFund: { + assets: emergencyFundPositionsValueInBaseCurrency, + cash: emergencyFund + .minus(emergencyFundPositionsValueInBaseCurrency) + .toNumber(), + total: emergencyFund.toNumber() + }, + fireWealth: new Big(performanceInformation.performance.currentValue) + .minus(emergencyFundPositionsValueInBaseCurrency) + .toNumber(), ordersCount: activities.filter(({ type }) => { return type === 'BUY' || type === 'SELL'; }).length @@ -1739,6 +1742,7 @@ export class PortfolioService { name: order.SymbolProfile?.name, quantity: new Big(order.quantity), symbol: order.SymbolProfile.symbol, + tags: order.tags, type: order.type, unitPrice: new Big( this.exchangeRateDataService.toCurrency( 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 3ceadb048..81c25bf75 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 @@ -163,7 +163,33 @@ [isCurrency]="true" [locale]="locale" [unit]="baseCurrency" - [value]="isLoading ? undefined : summary?.emergencyFund" + [value]="isLoading ? undefined : summary?.emergencyFund?.total" + > + + +
+
Cash
+
+ +
+
+
+
Assets
+
+
diff --git a/apps/client/src/app/pages/portfolio/fire/fire-page.component.ts b/apps/client/src/app/pages/portfolio/fire/fire-page.component.ts index f5d796f54..ab632b2e8 100644 --- a/apps/client/src/app/pages/portfolio/fire/fire-page.component.ts +++ b/apps/client/src/app/pages/portfolio/fire/fire-page.component.ts @@ -51,7 +51,7 @@ export class FirePageComponent implements OnDestroy, OnInit { return; } - this.fireWealth = new Big(summary.currentValue); + this.fireWealth = new Big(summary.fireWealth); this.withdrawalRatePerYear = this.fireWealth.mul(4).div(100); this.withdrawalRatePerMonth = this.withdrawalRatePerYear.div(12); diff --git a/libs/common/src/lib/interfaces/portfolio-position.interface.ts b/libs/common/src/lib/interfaces/portfolio-position.interface.ts index 81ac0b7ad..a398c8c90 100644 --- a/libs/common/src/lib/interfaces/portfolio-position.interface.ts +++ b/libs/common/src/lib/interfaces/portfolio-position.interface.ts @@ -1,4 +1,4 @@ -import { AssetClass, AssetSubClass, DataSource } from '@prisma/client'; +import { AssetClass, AssetSubClass, DataSource, Tag } from '@prisma/client'; import { Market, MarketState } from '../types'; import { Country } from './country.interface'; @@ -26,8 +26,9 @@ export interface PortfolioPosition { netPerformancePercent: number; quantity: number; sectors: Sector[]; - transactionCount: number; symbol: string; + tags?: Tag[]; + transactionCount: number; type?: string; url?: string; valueInBaseCurrency?: number; diff --git a/libs/common/src/lib/interfaces/portfolio-summary.interface.ts b/libs/common/src/lib/interfaces/portfolio-summary.interface.ts index c520da9fb..95ce2958a 100644 --- a/libs/common/src/lib/interfaces/portfolio-summary.interface.ts +++ b/libs/common/src/lib/interfaces/portfolio-summary.interface.ts @@ -5,9 +5,14 @@ export interface PortfolioSummary extends PortfolioPerformance { cash: number; committedFunds: number; dividend: number; - emergencyFund: number; + emergencyFund: { + assets: number; + cash: number; + total: number; + }; excludedAccountsAndActivities: number; fees: number; + fireWealth: number; firstOrderDate: Date; items: number; liabilities: number; diff --git a/libs/common/src/lib/interfaces/timeline-position.interface.ts b/libs/common/src/lib/interfaces/timeline-position.interface.ts index beb13a352..de4c3ff19 100644 --- a/libs/common/src/lib/interfaces/timeline-position.interface.ts +++ b/libs/common/src/lib/interfaces/timeline-position.interface.ts @@ -1,4 +1,4 @@ -import { DataSource } from '@prisma/client'; +import { DataSource, Tag } from '@prisma/client'; import Big from 'big.js'; export interface TimelinePosition { @@ -15,5 +15,6 @@ export interface TimelinePosition { netPerformancePercentage: Big; quantity: Big; symbol: string; + tags?: Tag[]; transactionCount: number; } From d5b3c52602d0c3226c1ded45fcf4266c053b73f1 Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Thu, 20 Jul 2023 20:28:56 +0200 Subject: [PATCH 02/10] Refactor value to valueInBaseCurrency (#2164) --- apps/api/src/app/portfolio/portfolio.service.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/api/src/app/portfolio/portfolio.service.ts b/apps/api/src/app/portfolio/portfolio.service.ts index 29cdbe66f..4f96d2716 100644 --- a/apps/api/src/app/portfolio/portfolio.service.ts +++ b/apps/api/src/app/portfolio/portfolio.service.ts @@ -1408,9 +1408,9 @@ export class PortfolioService { let valueInBaseCurrencyOfEmergencyFundPositions = new Big(0); - for (const { value } of emergencyFundHoldings) { + for (const { valueInBaseCurrency } of emergencyFundHoldings) { valueInBaseCurrencyOfEmergencyFundPositions = - valueInBaseCurrencyOfEmergencyFundPositions.plus(value); + valueInBaseCurrencyOfEmergencyFundPositions.plus(valueInBaseCurrency); } return valueInBaseCurrencyOfEmergencyFundPositions.toNumber(); From cd67ce82fabd6ce0a70761836bb9b68d15464339 Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Fri, 21 Jul 2023 11:40:49 +0200 Subject: [PATCH 03/10] Feature/rename queries to presets in market data table of admin control (#2165) * Rename queries to presets * Update changelog --- CHANGELOG.md | 4 + apps/api/src/app/admin/admin.controller.ts | 6 +- apps/api/src/app/admin/admin.service.ts | 16 +- .../admin-market-data.component.ts | 6 +- apps/client/src/app/services/data.service.ts | 6 +- apps/client/src/locales/messages.de.xlf | 150 ++++++++++++++++-- apps/client/src/locales/messages.es.xlf | 150 ++++++++++++++++-- apps/client/src/locales/messages.fr.xlf | 150 ++++++++++++++++-- apps/client/src/locales/messages.it.xlf | 150 ++++++++++++++++-- apps/client/src/locales/messages.nl.xlf | 150 ++++++++++++++++-- apps/client/src/locales/messages.pt.xlf | 150 ++++++++++++++++-- apps/client/src/locales/messages.xlf | 149 +++++++++++++++-- .../src/lib/interfaces/filter.interface.ts | 2 +- libs/common/src/lib/types/index.ts | 4 +- .../src/lib/types/market-data-preset.type.ts | 1 + .../src/lib/types/market-data-query.type.ts | 1 - libs/ui/src/lib/i18n.ts | 2 +- 17 files changed, 970 insertions(+), 127 deletions(-) create mode 100644 libs/common/src/lib/types/market-data-preset.type.ts delete mode 100644 libs/common/src/lib/types/market-data-query.type.ts diff --git a/CHANGELOG.md b/CHANGELOG.md index 3d86f2c54..0b470c122 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Broken down the emergency fund by cash and assets +### Changed + +- Renamed queries to presets in the historical market data table of the admin control panel + ## 1.290.0 - 2023-07-16 ### Added diff --git a/apps/api/src/app/admin/admin.controller.ts b/apps/api/src/app/admin/admin.controller.ts index 6077c19f8..54d36d8c5 100644 --- a/apps/api/src/app/admin/admin.controller.ts +++ b/apps/api/src/app/admin/admin.controller.ts @@ -16,7 +16,7 @@ import { } from '@ghostfolio/common/interfaces'; import { hasPermission, permissions } from '@ghostfolio/common/permissions'; import type { - MarketDataQuery, + MarketDataPreset, RequestWithUser } from '@ghostfolio/common/types'; import { @@ -252,7 +252,7 @@ export class AdminController { @UseGuards(AuthGuard('jwt')) public async getMarketData( @Query('assetSubClasses') filterByAssetSubClasses?: string, - @Query('queryId') queryId?: MarketDataQuery, + @Query('presetId') presetId?: MarketDataPreset, @Query('skip') skip?: number, @Query('sortColumn') sortColumn?: string, @Query('sortDirection') sortDirection?: Prisma.SortOrder, @@ -283,7 +283,7 @@ export class AdminController { return this.adminService.getMarketData({ filters, - queryId, + presetId, sortColumn, sortDirection, skip: isNaN(skip) ? undefined : skip, diff --git a/apps/api/src/app/admin/admin.service.ts b/apps/api/src/app/admin/admin.service.ts index 003f930b2..996914c4e 100644 --- a/apps/api/src/app/admin/admin.service.ts +++ b/apps/api/src/app/admin/admin.service.ts @@ -17,7 +17,7 @@ import { Filter, UniqueAsset } from '@ghostfolio/common/interfaces'; -import { MarketDataQuery } from '@ghostfolio/common/types'; +import { MarketDataPreset } from '@ghostfolio/common/types'; import { BadRequestException, Injectable } from '@nestjs/common'; import { AssetSubClass, Prisma, Property, SymbolProfile } from '@prisma/client'; import { differenceInDays } from 'date-fns'; @@ -104,14 +104,14 @@ export class AdminService { public async getMarketData({ filters, - queryId, + presetId, sortColumn, sortDirection, skip, take = Number.MAX_SAFE_INTEGER }: { filters?: Filter[]; - queryId?: MarketDataQuery; + presetId?: MarketDataPreset; skip?: number; sortColumn?: string; sortDirection?: Prisma.SortOrder; @@ -122,8 +122,8 @@ export class AdminService { const where: Prisma.SymbolProfileWhereInput = {}; if ( - queryId === 'ETF_WITHOUT_COUNTRIES' || - queryId === 'ETF_WITHOUT_SECTORS' + presetId === 'ETF_WITHOUT_COUNTRIES' || + presetId === 'ETF_WITHOUT_SECTORS' ) { filters = [{ id: 'ETF', type: 'ASSET_SUB_CLASS' }]; } @@ -221,12 +221,12 @@ export class AdminService { } ); - if (queryId) { - if (queryId === 'ETF_WITHOUT_COUNTRIES') { + if (presetId) { + if (presetId === 'ETF_WITHOUT_COUNTRIES') { marketData = marketData.filter(({ countriesCount }) => { return countriesCount === 0; }); - } else if (queryId === 'ETF_WITHOUT_SECTORS') { + } else if (presetId === 'ETF_WITHOUT_SECTORS') { marketData = marketData.filter(({ sectorsCount }) => { return sectorsCount === 0; }); diff --git a/apps/client/src/app/components/admin-market-data/admin-market-data.component.ts b/apps/client/src/app/components/admin-market-data/admin-market-data.component.ts index 716b5ff3d..df2b84003 100644 --- a/apps/client/src/app/components/admin-market-data/admin-market-data.component.ts +++ b/apps/client/src/app/components/admin-market-data/admin-market-data.component.ts @@ -63,12 +63,12 @@ export class AdminMarketDataComponent { id: 'ETF_WITHOUT_COUNTRIES', label: $localize`ETFs without Countries`, - type: 'QUERY_ID' + type: 'PRESET_ID' }, { id: 'ETF_WITHOUT_SECTORS', label: $localize`ETFs without Sectors`, - type: 'QUERY_ID' + type: 'PRESET_ID' } ]); public currentDataSource: DataSource; @@ -252,7 +252,7 @@ export class AdminMarketDataComponent this.pageSize = this.activeFilters.length === 1 && - this.activeFilters[0].type === 'QUERY_ID' + this.activeFilters[0].type === 'PRESET_ID' ? undefined : DEFAULT_PAGE_SIZE; diff --git a/apps/client/src/app/services/data.service.ts b/apps/client/src/app/services/data.service.ts index c29529590..3e769dda6 100644 --- a/apps/client/src/app/services/data.service.ts +++ b/apps/client/src/app/services/data.service.ts @@ -57,7 +57,7 @@ export class DataService { ACCOUNT: filtersByAccount, ASSET_CLASS: filtersByAssetClass, ASSET_SUB_CLASS: filtersByAssetSubClass, - QUERY_ID: filtersByQueryId, + PRESET_ID: filtersByPresetId, TAG: filtersByTag } = groupBy(filters, (filter) => { return filter.type; @@ -96,8 +96,8 @@ export class DataService { ); } - if (filtersByQueryId) { - params = params.append('queryId', filtersByQueryId[0].id); + if (filtersByPresetId) { + params = params.append('presetId', filtersByPresetId[0].id); } if (filtersByTag) { diff --git a/apps/client/src/locales/messages.de.xlf b/apps/client/src/locales/messages.de.xlf index a74016261..c3f0c9bb1 100644 --- a/apps/client/src/locales/messages.de.xlf +++ b/apps/client/src/locales/messages.de.xlf @@ -888,6 +888,10 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html 176 + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 176 + About @@ -1030,7 +1034,7 @@ Sicherheits-Token apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 10 + 11 apps/client/src/app/pages/register/show-access-token-dialog/show-access-token-dialog.html @@ -1042,7 +1046,7 @@ oder apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 19 + 31 apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html @@ -1062,7 +1066,7 @@ Einloggen mit Internet Identity apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 30 + 42 @@ -1070,7 +1074,7 @@ Einloggen mit Google apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 40 + 52 @@ -1078,7 +1082,7 @@ Eingeloggt bleiben apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 49 + 61 @@ -1090,7 +1094,7 @@ apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 59 + 71 @@ -1210,7 +1214,7 @@ Kaufkraft apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 171 + 197 @@ -1218,7 +1222,7 @@ Gesamtvermögen apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 218 + 244 @@ -1226,7 +1230,7 @@ Performance pro Jahr apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 230,232 + 256,258 @@ -1234,7 +1238,7 @@ Dividenden apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 248 + 274 apps/client/src/app/components/position/position-detail-dialog/position-detail-dialog.html @@ -1768,6 +1772,10 @@ Cash Bargeld + + apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html + 171 + apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html 15 @@ -2858,7 +2866,7 @@ Von der Analyse ausgenommen apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 183 + 209 @@ -4134,7 +4142,7 @@ Verbindlichkeiten apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 198 + 224 apps/client/src/app/pages/features/features-page.html @@ -4408,6 +4416,10 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html 60 + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 60 + Origin @@ -4508,6 +4520,10 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html 65 + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 65 + Region @@ -4608,6 +4624,10 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html 70 + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 70 + Available in @@ -4708,6 +4728,10 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html 75,77 + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 75,77 + ✅ Yes @@ -4808,6 +4832,14 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html 97 + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 97 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 104 + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html 104 @@ -5000,6 +5032,14 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html 118 + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 118 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 129 + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html 129 @@ -5192,6 +5232,14 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html 143 + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 143 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 150 + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html 150 @@ -5384,6 +5432,14 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html 162 + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 162 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 169 + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html 169 @@ -5580,6 +5636,14 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html 99 + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 99 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 122 + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html 122 @@ -5772,6 +5836,14 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html 133 + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 133 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 145 + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html 145 @@ -5964,6 +6036,14 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html 152 + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 152 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 164 + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html 164 @@ -6156,6 +6236,10 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html 171 + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 171 + ❌ No @@ -6256,6 +6340,10 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html 106,107 + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 106,107 + Self-Hosting @@ -6356,6 +6444,10 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html 111,113 + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 111,113 + Use anonymously @@ -6456,6 +6548,10 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html 138,140 + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 138,140 + Free Plan @@ -6556,6 +6652,10 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html 157,159 + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 157,159 + Notes @@ -6656,6 +6756,10 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html 188 + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 188 + Effortlessly track, analyze, and visualize your wealth with Ghostfolio. @@ -6756,6 +6860,10 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html 212,215 + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 212,215 + Personal Finance Tools @@ -6856,6 +6964,10 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html 284 + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 284 + Guides @@ -6933,9 +7045,17 @@ 70 - - Query - Suchanfrage + + Assets + Anlagevermögen + + apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html + 184 + + + + Preset + Filtervorlage libs/ui/src/lib/i18n.ts 19 diff --git a/apps/client/src/locales/messages.es.xlf b/apps/client/src/locales/messages.es.xlf index 25a0a9a07..f1c7d62e1 100644 --- a/apps/client/src/locales/messages.es.xlf +++ b/apps/client/src/locales/messages.es.xlf @@ -889,6 +889,10 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html 176 + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 176 + About @@ -1031,7 +1035,7 @@ Token de seguridad apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 10 + 11 apps/client/src/app/pages/register/show-access-token-dialog/show-access-token-dialog.html @@ -1043,7 +1047,7 @@ o apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 19 + 31 apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html @@ -1063,7 +1067,7 @@ Iniciar sesión con Internet Identity apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 30 + 42 @@ -1071,7 +1075,7 @@ Iniciar sesión con Google apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 40 + 52 @@ -1079,7 +1083,7 @@ Seguir conectado apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 49 + 61 @@ -1091,7 +1095,7 @@ apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 59 + 71 @@ -1211,7 +1215,7 @@ Capacidad de compra apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 171 + 197 @@ -1219,7 +1223,7 @@ Patrimonio neto apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 218 + 244 @@ -1227,7 +1231,7 @@ Rendimiento anualizado apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 230,232 + 256,258 @@ -1235,7 +1239,7 @@ Dividendo apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 248 + 274 apps/client/src/app/components/position/position-detail-dialog/position-detail-dialog.html @@ -1769,6 +1773,10 @@ Cash Efectivo + + apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html + 171 + apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html 15 @@ -2859,7 +2867,7 @@ Excluido del análisis apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 183 + 209 @@ -4135,7 +4143,7 @@ Liabilities apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 198 + 224 apps/client/src/app/pages/features/features-page.html @@ -4409,6 +4417,10 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html 60 + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 60 + Origin @@ -4509,6 +4521,10 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html 65 + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 65 + Region @@ -4609,6 +4625,10 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html 70 + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 70 + Available in @@ -4709,6 +4729,10 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html 75,77 + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 75,77 + ✅ Yes @@ -4809,6 +4833,14 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html 97 + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 97 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 104 + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html 104 @@ -5001,6 +5033,14 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html 118 + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 118 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 129 + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html 129 @@ -5193,6 +5233,14 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html 143 + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 143 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 150 + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html 150 @@ -5385,6 +5433,14 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html 162 + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 162 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 169 + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html 169 @@ -5581,6 +5637,14 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html 99 + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 99 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 122 + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html 122 @@ -5773,6 +5837,14 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html 133 + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 133 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 145 + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html 145 @@ -5965,6 +6037,14 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html 152 + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 152 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 164 + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html 164 @@ -6157,6 +6237,10 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html 171 + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 171 + ❌ No @@ -6257,6 +6341,10 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html 106,107 + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 106,107 + Self-Hosting @@ -6357,6 +6445,10 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html 111,113 + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 111,113 + Use anonymously @@ -6457,6 +6549,10 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html 138,140 + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 138,140 + Free Plan @@ -6557,6 +6653,10 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html 157,159 + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 157,159 + Notes @@ -6657,6 +6757,10 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html 188 + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 188 + Effortlessly track, analyze, and visualize your wealth with Ghostfolio. @@ -6757,6 +6861,10 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html 212,215 + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 212,215 + Personal Finance Tools @@ -6857,6 +6965,10 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html 284 + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 284 + Guides @@ -6934,9 +7046,17 @@ 70 - - Query - Query + + Assets + Assets + + apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html + 184 + + + + Preset + Preset libs/ui/src/lib/i18n.ts 19 diff --git a/apps/client/src/locales/messages.fr.xlf b/apps/client/src/locales/messages.fr.xlf index de37f9afc..734ff1835 100644 --- a/apps/client/src/locales/messages.fr.xlf +++ b/apps/client/src/locales/messages.fr.xlf @@ -1180,6 +1180,10 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html 176 + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 176 + About @@ -1266,7 +1270,7 @@ apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 59 + 71 @@ -1386,7 +1390,7 @@ Jeton de Sécurité apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 10 + 11 apps/client/src/app/pages/register/show-access-token-dialog/show-access-token-dialog.html @@ -1398,7 +1402,7 @@ ou apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 19 + 31 apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html @@ -1418,7 +1422,7 @@ Se connecter avec Internet Identity apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 30 + 42 @@ -1426,7 +1430,7 @@ Se connecter avec Google apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 40 + 52 @@ -1434,7 +1438,7 @@ Rester connecté apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 49 + 61 @@ -1554,7 +1558,7 @@ Pouvoir d'Achat apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 171 + 197 @@ -1562,7 +1566,7 @@ Exclus de l'Analyse apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 183 + 209 @@ -1570,7 +1574,7 @@ Fortune apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 218 + 244 @@ -1578,7 +1582,7 @@ Performance annualisée apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 230,232 + 256,258 @@ -1586,7 +1590,7 @@ Dividende apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 248 + 274 apps/client/src/app/components/position/position-detail-dialog/position-detail-dialog.html @@ -2140,6 +2144,10 @@ Cash Cash + + apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html + 171 + apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html 15 @@ -4134,7 +4142,7 @@ Dettes apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 198 + 224 apps/client/src/app/pages/features/features-page.html @@ -4408,6 +4416,10 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html 60 + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 60 + Origin @@ -4508,6 +4520,10 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html 65 + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 65 + Region @@ -4608,6 +4624,10 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html 70 + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 70 + Available in @@ -4708,6 +4728,10 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html 75,77 + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 75,77 + ✅ Yes @@ -4808,6 +4832,14 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html 97 + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 97 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 104 + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html 104 @@ -5000,6 +5032,14 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html 118 + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 118 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 129 + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html 129 @@ -5192,6 +5232,14 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html 143 + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 143 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 150 + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html 150 @@ -5384,6 +5432,14 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html 162 + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 162 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 169 + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html 169 @@ -5580,6 +5636,14 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html 99 + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 99 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 122 + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html 122 @@ -5772,6 +5836,14 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html 133 + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 133 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 145 + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html 145 @@ -5964,6 +6036,14 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html 152 + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 152 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 164 + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html 164 @@ -6156,6 +6236,10 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html 171 + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 171 + ❌ No @@ -6256,6 +6340,10 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html 106,107 + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 106,107 + Self-Hosting @@ -6356,6 +6444,10 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html 111,113 + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 111,113 + Use anonymously @@ -6456,6 +6548,10 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html 138,140 + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 138,140 + Free Plan @@ -6556,6 +6652,10 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html 157,159 + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 157,159 + Notes @@ -6656,6 +6756,10 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html 188 + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 188 + Effortlessly track, analyze, and visualize your wealth with Ghostfolio. @@ -6756,6 +6860,10 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html 212,215 + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 212,215 + Personal Finance Tools @@ -6856,6 +6964,10 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html 284 + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 284 + Guides @@ -6933,9 +7045,17 @@ 70 - - Query - Query + + Assets + Assets + + apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html + 184 + + + + Preset + Preset libs/ui/src/lib/i18n.ts 19 diff --git a/apps/client/src/locales/messages.it.xlf b/apps/client/src/locales/messages.it.xlf index e09f17795..2286a61f9 100644 --- a/apps/client/src/locales/messages.it.xlf +++ b/apps/client/src/locales/messages.it.xlf @@ -889,6 +889,10 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html 176 + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 176 + About @@ -1031,7 +1035,7 @@ Token di sicurezza apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 10 + 11 apps/client/src/app/pages/register/show-access-token-dialog/show-access-token-dialog.html @@ -1043,7 +1047,7 @@ oppure apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 19 + 31 apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html @@ -1063,7 +1067,7 @@ Accedi con Internet Identity apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 30 + 42 @@ -1071,7 +1075,7 @@ Accedi con Google apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 40 + 52 @@ -1079,7 +1083,7 @@ Rimani connesso apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 49 + 61 @@ -1091,7 +1095,7 @@ apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 59 + 71 @@ -1211,7 +1215,7 @@ Potere d'acquisto apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 171 + 197 @@ -1219,7 +1223,7 @@ Patrimonio netto apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 218 + 244 @@ -1227,7 +1231,7 @@ Prestazioni annualizzate apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 230,232 + 256,258 @@ -1235,7 +1239,7 @@ Dividendo apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 248 + 274 apps/client/src/app/components/position/position-detail-dialog/position-detail-dialog.html @@ -1769,6 +1773,10 @@ Cash Contanti + + apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html + 171 + apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html 15 @@ -2851,7 +2859,7 @@ Escluso dall'analisi apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 183 + 209 @@ -4135,7 +4143,7 @@ Liabilities apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 198 + 224 apps/client/src/app/pages/features/features-page.html @@ -4409,6 +4417,10 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html 60 + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 60 + Origin @@ -4509,6 +4521,10 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html 65 + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 65 + Region @@ -4609,6 +4625,10 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html 70 + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 70 + Available in @@ -4709,6 +4729,10 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html 75,77 + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 75,77 + ✅ Yes @@ -4809,6 +4833,14 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html 97 + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 97 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 104 + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html 104 @@ -5001,6 +5033,14 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html 118 + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 118 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 129 + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html 129 @@ -5193,6 +5233,14 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html 143 + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 143 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 150 + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html 150 @@ -5385,6 +5433,14 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html 162 + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 162 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 169 + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html 169 @@ -5581,6 +5637,14 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html 99 + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 99 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 122 + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html 122 @@ -5773,6 +5837,14 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html 133 + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 133 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 145 + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html 145 @@ -5965,6 +6037,14 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html 152 + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 152 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 164 + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html 164 @@ -6157,6 +6237,10 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html 171 + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 171 + ❌ No @@ -6257,6 +6341,10 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html 106,107 + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 106,107 + Self-Hosting @@ -6357,6 +6445,10 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html 111,113 + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 111,113 + Use anonymously @@ -6457,6 +6549,10 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html 138,140 + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 138,140 + Free Plan @@ -6557,6 +6653,10 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html 157,159 + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 157,159 + Notes @@ -6657,6 +6757,10 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html 188 + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 188 + Effortlessly track, analyze, and visualize your wealth with Ghostfolio. @@ -6757,6 +6861,10 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html 212,215 + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 212,215 + Personal Finance Tools @@ -6857,6 +6965,10 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html 284 + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 284 + Guides @@ -6934,9 +7046,17 @@ 70 - - Query - Query + + Assets + Assets + + apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html + 184 + + + + Preset + Preset libs/ui/src/lib/i18n.ts 19 diff --git a/apps/client/src/locales/messages.nl.xlf b/apps/client/src/locales/messages.nl.xlf index df6abc18b..b58da7468 100644 --- a/apps/client/src/locales/messages.nl.xlf +++ b/apps/client/src/locales/messages.nl.xlf @@ -888,6 +888,10 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html 176 + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 176 + About @@ -1030,7 +1034,7 @@ Beveiligingstoken apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 10 + 11 apps/client/src/app/pages/register/show-access-token-dialog/show-access-token-dialog.html @@ -1042,7 +1046,7 @@ of apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 19 + 31 apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html @@ -1062,7 +1066,7 @@ Aanmelden met Internet Identity apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 30 + 42 @@ -1070,7 +1074,7 @@ Aanmelden met Google apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 40 + 52 @@ -1078,7 +1082,7 @@ Aangemeld blijven apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 49 + 61 @@ -1090,7 +1094,7 @@ apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 59 + 71 @@ -1210,7 +1214,7 @@ Koopkracht apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 171 + 197 @@ -1218,7 +1222,7 @@ Netto Waarde apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 218 + 244 @@ -1226,7 +1230,7 @@ Jaarlijks rendement apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 230,232 + 256,258 @@ -1234,7 +1238,7 @@ Dividend apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 248 + 274 apps/client/src/app/components/position/position-detail-dialog/position-detail-dialog.html @@ -1768,6 +1772,10 @@ Cash Contant geld + + apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html + 171 + apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html 15 @@ -2858,7 +2866,7 @@ Uitgesloten van analyse apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 183 + 209 @@ -4134,7 +4142,7 @@ Liabilities apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 198 + 224 apps/client/src/app/pages/features/features-page.html @@ -4408,6 +4416,10 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html 60 + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 60 + Origin @@ -4508,6 +4520,10 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html 65 + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 65 + Region @@ -4608,6 +4624,10 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html 70 + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 70 + Available in @@ -4708,6 +4728,10 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html 75,77 + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 75,77 + ✅ Yes @@ -4808,6 +4832,14 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html 97 + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 97 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 104 + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html 104 @@ -5000,6 +5032,14 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html 118 + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 118 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 129 + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html 129 @@ -5192,6 +5232,14 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html 143 + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 143 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 150 + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html 150 @@ -5384,6 +5432,14 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html 162 + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 162 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 169 + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html 169 @@ -5580,6 +5636,14 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html 99 + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 99 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 122 + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html 122 @@ -5772,6 +5836,14 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html 133 + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 133 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 145 + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html 145 @@ -5964,6 +6036,14 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html 152 + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 152 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 164 + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html 164 @@ -6156,6 +6236,10 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html 171 + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 171 + ❌ No @@ -6256,6 +6340,10 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html 106,107 + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 106,107 + Self-Hosting @@ -6356,6 +6444,10 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html 111,113 + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 111,113 + Use anonymously @@ -6456,6 +6548,10 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html 138,140 + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 138,140 + Free Plan @@ -6556,6 +6652,10 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html 157,159 + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 157,159 + Notes @@ -6656,6 +6756,10 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html 188 + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 188 + Effortlessly track, analyze, and visualize your wealth with Ghostfolio. @@ -6756,6 +6860,10 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html 212,215 + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 212,215 + Personal Finance Tools @@ -6856,6 +6964,10 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html 284 + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 284 + Guides @@ -6933,9 +7045,17 @@ 70 - - Query - Query + + Assets + Assets + + apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html + 184 + + + + Preset + Preset libs/ui/src/lib/i18n.ts 19 diff --git a/apps/client/src/locales/messages.pt.xlf b/apps/client/src/locales/messages.pt.xlf index 9755caac8..d61c88809 100644 --- a/apps/client/src/locales/messages.pt.xlf +++ b/apps/client/src/locales/messages.pt.xlf @@ -1060,6 +1060,10 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html 176 + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 176 + About @@ -1146,7 +1150,7 @@ apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 59 + 71 @@ -1282,7 +1286,7 @@ Token de Segurança apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 10 + 11 apps/client/src/app/pages/register/show-access-token-dialog/show-access-token-dialog.html @@ -1294,7 +1298,7 @@ ou apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 19 + 31 apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html @@ -1314,7 +1318,7 @@ Iniciar sessão com Internet Identity apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 30 + 42 @@ -1322,7 +1326,7 @@ Iniciar sessão com Google apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 40 + 52 @@ -1330,7 +1334,7 @@ Manter sessão iniciada apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 49 + 61 @@ -1450,7 +1454,7 @@ Poder de Compra apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 171 + 197 @@ -1458,7 +1462,7 @@ Excluído da Análise apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 183 + 209 @@ -1466,7 +1470,7 @@ Valor Líquido apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 218 + 244 @@ -1474,7 +1478,7 @@ Desempenho Anual apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 230,232 + 256,258 @@ -1482,7 +1486,7 @@ Dividendo apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 248 + 274 apps/client/src/app/components/position/position-detail-dialog/position-detail-dialog.html @@ -2104,6 +2108,10 @@ Cash Dinheiro + + apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html + 171 + apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html 15 @@ -4134,7 +4142,7 @@ Liabilities apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 198 + 224 apps/client/src/app/pages/features/features-page.html @@ -4408,6 +4416,10 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html 60 + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 60 + Origin @@ -4508,6 +4520,10 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html 65 + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 65 + Region @@ -4608,6 +4624,10 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html 70 + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 70 + Available in @@ -4708,6 +4728,10 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html 75,77 + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 75,77 + ✅ Yes @@ -4808,6 +4832,14 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html 97 + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 97 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 104 + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html 104 @@ -5000,6 +5032,14 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html 118 + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 118 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 129 + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html 129 @@ -5192,6 +5232,14 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html 143 + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 143 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 150 + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html 150 @@ -5384,6 +5432,14 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html 162 + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 162 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 169 + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html 169 @@ -5580,6 +5636,14 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html 99 + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 99 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 122 + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html 122 @@ -5772,6 +5836,14 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html 133 + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 133 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 145 + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html 145 @@ -5964,6 +6036,14 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html 152 + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 152 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 164 + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html 164 @@ -6156,6 +6236,10 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html 171 + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 171 + ❌ No @@ -6256,6 +6340,10 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html 106,107 + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 106,107 + Self-Hosting @@ -6356,6 +6444,10 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html 111,113 + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 111,113 + Use anonymously @@ -6456,6 +6548,10 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html 138,140 + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 138,140 + Free Plan @@ -6556,6 +6652,10 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html 157,159 + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 157,159 + Notes @@ -6656,6 +6756,10 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html 188 + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 188 + Effortlessly track, analyze, and visualize your wealth with Ghostfolio. @@ -6756,6 +6860,10 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html 212,215 + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 212,215 + Personal Finance Tools @@ -6856,6 +6964,10 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html 284 + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 284 + Guides @@ -6933,9 +7045,17 @@ 70 - - Query - Query + + Assets + Assets + + apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html + 184 + + + + Preset + Preset libs/ui/src/lib/i18n.ts 19 diff --git a/apps/client/src/locales/messages.xlf b/apps/client/src/locales/messages.xlf index 717a9c62a..0b84474c5 100644 --- a/apps/client/src/locales/messages.xlf +++ b/apps/client/src/locales/messages.xlf @@ -824,6 +824,10 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html 176 + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 176 + About @@ -953,7 +957,7 @@ Security Token apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 10 + 11 apps/client/src/app/pages/register/show-access-token-dialog/show-access-token-dialog.html @@ -964,7 +968,7 @@ or apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 19 + 31 apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html @@ -983,21 +987,21 @@ Sign in with Internet Identity apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 30 + 42 Sign in with Google apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 40 + 52 Stay signed in apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 49 + 61 @@ -1008,7 +1012,7 @@ apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 59 + 71 @@ -1114,28 +1118,28 @@ Buying Power apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 171 + 197 Net Worth apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 218 + 244 Annualized Performance apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 230,232 + 256,258 Dividend apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 248 + 274 apps/client/src/app/components/position/position-detail-dialog/position-detail-dialog.html @@ -1621,6 +1625,10 @@ Cash + + apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html + 171 + apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html 15 @@ -2595,7 +2603,7 @@ Excluded from Analysis apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 183 + 209 @@ -3747,7 +3755,7 @@ Liabilities apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 198 + 224 apps/client/src/app/pages/features/features-page.html @@ -3979,6 +3987,10 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html 106,107 + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 106,107 + Personal Finance Tools @@ -4085,6 +4097,10 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html 284 + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 284 + Region @@ -4184,6 +4200,10 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html 70 + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 70 + Guides @@ -4290,6 +4310,10 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html 212,215 + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 212,215 + Glossary @@ -4396,6 +4420,14 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html 97 + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 97 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 104 + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html 104 @@ -4588,6 +4620,14 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html 118 + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 118 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 129 + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html 129 @@ -4780,6 +4820,14 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html 143 + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 143 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 150 + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html 150 @@ -4972,6 +5020,14 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html 162 + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 162 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 169 + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html 169 @@ -5167,6 +5223,10 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html 65 + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 65 + Available in @@ -5266,6 +5326,10 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html 75,77 + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 75,77 + Discover Open Source Alternatives for Personal Finance Tools @@ -5372,6 +5436,10 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html 60 + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 60 + ❌ No @@ -5471,6 +5539,10 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html 99 + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 99 + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html 122 @@ -5567,6 +5639,14 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html 122 + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 122 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 133 + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html 133 @@ -5759,6 +5839,14 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html 145 + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 145 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 152 + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html 152 @@ -5951,6 +6039,14 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html 164 + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 164 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 171 + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html 171 @@ -6146,6 +6242,10 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html 157,159 + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 157,159 + Use anonymously @@ -6245,6 +6345,10 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html 138,140 + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 138,140 + Notes @@ -6344,6 +6448,10 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html 188 + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 188 + Self-Hosting @@ -6443,6 +6551,10 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html 111,113 + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 111,113 + Mortgages, personal loans, credit cards @@ -6497,13 +6609,20 @@ 70 - - Query + + Preset libs/ui/src/lib/i18n.ts 19 + + Assets + + apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html + 184 + + - \ No newline at end of file + diff --git a/libs/common/src/lib/interfaces/filter.interface.ts b/libs/common/src/lib/interfaces/filter.interface.ts index f6c83a230..a6bc17c4f 100644 --- a/libs/common/src/lib/interfaces/filter.interface.ts +++ b/libs/common/src/lib/interfaces/filter.interface.ts @@ -5,7 +5,7 @@ export interface Filter { | 'ACCOUNT' | 'ASSET_CLASS' | 'ASSET_SUB_CLASS' - | 'QUERY_ID' + | 'PRESET_ID' | 'SYMBOL' | 'TAG'; } diff --git a/libs/common/src/lib/types/index.ts b/libs/common/src/lib/types/index.ts index 79566bcfd..063bea05d 100644 --- a/libs/common/src/lib/types/index.ts +++ b/libs/common/src/lib/types/index.ts @@ -5,7 +5,7 @@ import type { ColorScheme } from './color-scheme.type'; import type { DateRange } from './date-range.type'; import type { Granularity } from './granularity.type'; import type { GroupBy } from './group-by.type'; -import type { MarketDataQuery } from './market-data-query.type'; +import type { MarketDataPreset } from './market-data-preset.type'; import type { MarketState } from './market-state.type'; import type { Market } from './market.type'; import type { OrderWithAccount } from './order-with-account.type'; @@ -24,7 +24,7 @@ export type { Granularity, GroupBy, Market, - MarketDataQuery, + MarketDataPreset, MarketState, OrderWithAccount, RequestWithUser, diff --git a/libs/common/src/lib/types/market-data-preset.type.ts b/libs/common/src/lib/types/market-data-preset.type.ts new file mode 100644 index 000000000..351f863dd --- /dev/null +++ b/libs/common/src/lib/types/market-data-preset.type.ts @@ -0,0 +1 @@ +export type MarketDataPreset = 'ETF_WITHOUT_COUNTRIES' | 'ETF_WITHOUT_SECTORS'; diff --git a/libs/common/src/lib/types/market-data-query.type.ts b/libs/common/src/lib/types/market-data-query.type.ts deleted file mode 100644 index fa14af61c..000000000 --- a/libs/common/src/lib/types/market-data-query.type.ts +++ /dev/null @@ -1 +0,0 @@ -export type MarketDataQuery = 'ETF_WITHOUT_COUNTRIES' | 'ETF_WITHOUT_SECTORS'; diff --git a/libs/ui/src/lib/i18n.ts b/libs/ui/src/lib/i18n.ts index cd8794979..cf36e99bf 100644 --- a/libs/ui/src/lib/i18n.ts +++ b/libs/ui/src/lib/i18n.ts @@ -16,7 +16,7 @@ const locales = { MONTH: $localize`Month`, MONTHS: $localize`Months`, OTHER: $localize`Other`, - QUERY_ID: $localize`Query`, + PRESET_ID: $localize`Preset`, RETIREMENT_PROVISION: $localize`Retirement Provision`, SATELLITE: $localize`Satellite`, SECURITIES: $localize`Securities`, From ea101dd3bdd53cf7ad893438ada67a0b25ca0d68 Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Sun, 23 Jul 2023 14:13:02 +0200 Subject: [PATCH 04/10] Refactor value to valueInBaseCurrency (#2167) * Revert value to valueInBaseCurrency refactoring --- .../allocations/allocations-page.component.ts | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/apps/client/src/app/pages/portfolio/allocations/allocations-page.component.ts b/apps/client/src/app/pages/portfolio/allocations/allocations-page.component.ts index 6d2ada8b0..8696d6ac2 100644 --- a/apps/client/src/app/pages/portfolio/allocations/allocations-page.component.ts +++ b/apps/client/src/app/pages/portfolio/allocations/allocations-page.component.ts @@ -65,13 +65,8 @@ export class AllocationsPageComponent implements OnDestroy, OnInit { public positions: { [symbol: string]: Pick< PortfolioPosition, - | 'assetClass' - | 'assetSubClass' - | 'currency' - | 'exchange' - | 'name' - | 'valueInBaseCurrency' - > & { etfProvider: string }; + 'assetClass' | 'assetSubClass' | 'currency' | 'exchange' | 'name' + > & { etfProvider: string; value: number }; }; public sectors: { [name: string]: { name: string; value: number }; @@ -296,7 +291,7 @@ export class AllocationsPageComponent implements OnDestroy, OnInit { } this.positions[symbol] = { - valueInBaseCurrency: value, + value, assetClass: position.assetClass, assetSubClass: position.assetSubClass, currency: position.currency, From c9353d0a39353d807b53fa3aa906a4875b26ba96 Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Sun, 23 Jul 2023 15:55:58 +0200 Subject: [PATCH 05/10] Support account balance time series (#2166) * Initial setup * Support account balance in export * Handle account balance update * Add schema migration * Update changelog --- CHANGELOG.md | 1 + apps/api/src/app/account/account.module.ts | 2 + apps/api/src/app/account/account.service.ts | 76 ++++++++++++++----- apps/api/src/app/export/export.module.ts | 6 +- apps/api/src/app/export/export.service.ts | 68 +++++++++-------- apps/api/src/app/order/order.module.ts | 3 +- .../api/src/app/portfolio/portfolio.module.ts | 2 + .../account-balance/account-balance.module.ts | 10 +++ .../account-balance.service.ts | 16 ++++ .../exchange-rate-data.service.ts | 10 ++- .../migration.sql | 27 +++++++ prisma/schema.prisma | 30 +++++--- 12 files changed, 189 insertions(+), 62 deletions(-) create mode 100644 apps/api/src/services/account-balance/account-balance.module.ts create mode 100644 apps/api/src/services/account-balance/account-balance.service.ts create mode 100644 prisma/migrations/20230723104112_added_account_balances_to_account/migration.sql diff --git a/CHANGELOG.md b/CHANGELOG.md index 0b470c122..59dc50f23 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 ### Added - Broken down the emergency fund by cash and assets +- Added support for account balance time series ### Changed diff --git a/apps/api/src/app/account/account.module.ts b/apps/api/src/app/account/account.module.ts index f37ed34ee..26ace47c2 100644 --- a/apps/api/src/app/account/account.module.ts +++ b/apps/api/src/app/account/account.module.ts @@ -1,6 +1,7 @@ import { PortfolioModule } from '@ghostfolio/api/app/portfolio/portfolio.module'; import { RedisCacheModule } from '@ghostfolio/api/app/redis-cache/redis-cache.module'; import { UserModule } from '@ghostfolio/api/app/user/user.module'; +import { AccountBalanceModule } from '@ghostfolio/api/services/account-balance/account-balance.module'; import { ConfigurationModule } from '@ghostfolio/api/services/configuration/configuration.module'; import { DataProviderModule } from '@ghostfolio/api/services/data-provider/data-provider.module'; import { ExchangeRateDataModule } from '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.module'; @@ -15,6 +16,7 @@ import { AccountService } from './account.service'; controllers: [AccountController], exports: [AccountService], imports: [ + AccountBalanceModule, ConfigurationModule, DataProviderModule, ExchangeRateDataModule, diff --git a/apps/api/src/app/account/account.service.ts b/apps/api/src/app/account/account.service.ts index c6da815e4..dc049108c 100644 --- a/apps/api/src/app/account/account.service.ts +++ b/apps/api/src/app/account/account.service.ts @@ -1,3 +1,4 @@ +import { AccountBalanceService } from '@ghostfolio/api/services/account-balance/account-balance.service'; import { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.service'; import { PrismaService } from '@ghostfolio/api/services/prisma/prisma.service'; import { Filter } from '@ghostfolio/common/interfaces'; @@ -11,16 +12,21 @@ import { CashDetails } from './interfaces/cash-details.interface'; @Injectable() export class AccountService { public constructor( + private readonly accountBalanceService: AccountBalanceService, private readonly exchangeRateDataService: ExchangeRateDataService, private readonly prismaService: PrismaService ) {} - public async account( - accountWhereUniqueInput: Prisma.AccountWhereUniqueInput - ): Promise { - return this.prismaService.account.findUnique({ - where: accountWhereUniqueInput + public async account({ + id_userId + }: Prisma.AccountWhereUniqueInput): Promise { + const { id, userId } = id_userId; + + const [account] = await this.accounts({ + where: { id, userId } }); + + return account; } public async accountWithOrders( @@ -50,9 +56,11 @@ export class AccountService { Platform?: Platform; })[] > { - const { include, skip, take, cursor, where, orderBy } = params; + const { include = {}, skip, take, cursor, where, orderBy } = params; - return this.prismaService.account.findMany({ + include.balances = { orderBy: { date: 'desc' }, take: 1 }; + + const accounts = await this.prismaService.account.findMany({ cursor, include, orderBy, @@ -60,15 +68,36 @@ export class AccountService { take, where }); + + return accounts.map((account) => { + account = { ...account, balance: account.balances[0]?.value ?? 0 }; + + delete account.balances; + + return account; + }); } public async createAccount( data: Prisma.AccountCreateInput, aUserId: string ): Promise { - return this.prismaService.account.create({ + const account = await this.prismaService.account.create({ data }); + + await this.prismaService.accountBalance.create({ + data: { + Account: { + connect: { + id_userId: { id: account.id, userId: aUserId } + } + }, + value: data.balance + } + }); + + return account; } public async deleteAccount( @@ -167,6 +196,18 @@ export class AccountService { aUserId: string ): Promise { const { data, where } = params; + + await this.prismaService.accountBalance.create({ + data: { + Account: { + connect: { + id_userId: where.id_userId + } + }, + value: data.balance + } + }); + return this.prismaService.account.update({ data, where @@ -202,16 +243,17 @@ export class AccountService { ); if (amountInCurrencyOfAccount) { - await this.prismaService.account.update({ - data: { - balance: new Big(balance).plus(amountInCurrencyOfAccount).toNumber() - }, - where: { - id_userId: { - userId, - id: accountId + await this.accountBalanceService.createAccountBalance({ + date, + Account: { + connect: { + id_userId: { + userId, + id: accountId + } } - } + }, + value: new Big(balance).plus(amountInCurrencyOfAccount).toNumber() }); } } diff --git a/apps/api/src/app/export/export.module.ts b/apps/api/src/app/export/export.module.ts index 186e8dc59..ca4588925 100644 --- a/apps/api/src/app/export/export.module.ts +++ b/apps/api/src/app/export/export.module.ts @@ -1,8 +1,9 @@ +import { AccountModule } from '@ghostfolio/api/app/account/account.module'; +import { OrderModule } from '@ghostfolio/api/app/order/order.module'; import { RedisCacheModule } from '@ghostfolio/api/app/redis-cache/redis-cache.module'; import { ConfigurationModule } from '@ghostfolio/api/services/configuration/configuration.module'; import { DataGatheringModule } from '@ghostfolio/api/services/data-gathering/data-gathering.module'; import { DataProviderModule } from '@ghostfolio/api/services/data-provider/data-provider.module'; -import { PrismaModule } from '@ghostfolio/api/services/prisma/prisma.module'; import { Module } from '@nestjs/common'; import { ExportController } from './export.controller'; @@ -10,10 +11,11 @@ import { ExportService } from './export.service'; @Module({ imports: [ + AccountModule, ConfigurationModule, DataGatheringModule, DataProviderModule, - PrismaModule, + OrderModule, RedisCacheModule ], controllers: [ExportController], diff --git a/apps/api/src/app/export/export.service.ts b/apps/api/src/app/export/export.service.ts index eaeea0f07..abeaf389d 100644 --- a/apps/api/src/app/export/export.service.ts +++ b/apps/api/src/app/export/export.service.ts @@ -1,11 +1,15 @@ +import { AccountService } from '@ghostfolio/api/app/account/account.service'; +import { OrderService } from '@ghostfolio/api/app/order/order.service'; import { environment } from '@ghostfolio/api/environments/environment'; -import { PrismaService } from '@ghostfolio/api/services/prisma/prisma.service'; import { Export } from '@ghostfolio/common/interfaces'; import { Injectable } from '@nestjs/common'; @Injectable() export class ExportService { - public constructor(private readonly prismaService: PrismaService) {} + public constructor( + private readonly accountService: AccountService, + private readonly orderService: OrderService + ) {} public async export({ activityIds, @@ -14,36 +18,40 @@ export class ExportService { activityIds?: string[]; userId: string; }): Promise { - const accounts = await this.prismaService.account.findMany({ - orderBy: { - name: 'asc' - }, - select: { - accountType: true, - balance: true, - comment: true, - currency: true, - id: true, - isExcluded: true, - name: true, - platformId: true - }, - where: { userId } - }); + const accounts = ( + await this.accountService.accounts({ + orderBy: { + name: 'asc' + }, + where: { userId } + }) + ).map( + ({ + accountType, + balance, + comment, + currency, + id, + isExcluded, + name, + platformId + }) => { + return { + accountType, + balance, + comment, + currency, + id, + isExcluded, + name, + platformId + }; + } + ); - let activities = await this.prismaService.order.findMany({ + let activities = await this.orderService.orders({ + include: { SymbolProfile: true }, orderBy: { date: 'desc' }, - select: { - accountId: true, - comment: true, - date: true, - fee: true, - id: true, - quantity: true, - SymbolProfile: true, - type: true, - unitPrice: true - }, where: { userId } }); diff --git a/apps/api/src/app/order/order.module.ts b/apps/api/src/app/order/order.module.ts index c8742f9d2..8f033058d 100644 --- a/apps/api/src/app/order/order.module.ts +++ b/apps/api/src/app/order/order.module.ts @@ -2,6 +2,7 @@ import { AccountService } from '@ghostfolio/api/app/account/account.service'; import { CacheModule } from '@ghostfolio/api/app/cache/cache.module'; import { RedisCacheModule } from '@ghostfolio/api/app/redis-cache/redis-cache.module'; import { UserModule } from '@ghostfolio/api/app/user/user.module'; +import { AccountBalanceService } from '@ghostfolio/api/services/account-balance/account-balance.service'; import { ApiModule } from '@ghostfolio/api/services/api/api.module'; import { ConfigurationModule } from '@ghostfolio/api/services/configuration/configuration.module'; import { DataGatheringModule } from '@ghostfolio/api/services/data-gathering/data-gathering.module'; @@ -31,6 +32,6 @@ import { OrderService } from './order.service'; SymbolProfileModule, UserModule ], - providers: [AccountService, OrderService] + providers: [AccountBalanceService, AccountService, OrderService] }) export class OrderModule {} diff --git a/apps/api/src/app/portfolio/portfolio.module.ts b/apps/api/src/app/portfolio/portfolio.module.ts index fa11476ac..3b4ee5d76 100644 --- a/apps/api/src/app/portfolio/portfolio.module.ts +++ b/apps/api/src/app/portfolio/portfolio.module.ts @@ -2,6 +2,7 @@ import { AccessModule } from '@ghostfolio/api/app/access/access.module'; import { AccountService } from '@ghostfolio/api/app/account/account.service'; import { OrderModule } from '@ghostfolio/api/app/order/order.module'; import { UserModule } from '@ghostfolio/api/app/user/user.module'; +import { AccountBalanceService } from '@ghostfolio/api/services/account-balance/account-balance.service'; import { ApiModule } from '@ghostfolio/api/services/api/api.module'; import { ConfigurationModule } from '@ghostfolio/api/services/configuration/configuration.module'; import { DataGatheringModule } from '@ghostfolio/api/services/data-gathering/data-gathering.module'; @@ -36,6 +37,7 @@ import { RulesService } from './rules.service'; UserModule ], providers: [ + AccountBalanceService, AccountService, CurrentRateService, PortfolioService, diff --git a/apps/api/src/services/account-balance/account-balance.module.ts b/apps/api/src/services/account-balance/account-balance.module.ts new file mode 100644 index 000000000..53c695b5f --- /dev/null +++ b/apps/api/src/services/account-balance/account-balance.module.ts @@ -0,0 +1,10 @@ +import { AccountBalanceService } from '@ghostfolio/api/services/account-balance/account-balance.service'; +import { PrismaModule } from '@ghostfolio/api/services/prisma/prisma.module'; +import { Module } from '@nestjs/common'; + +@Module({ + exports: [AccountBalanceService], + imports: [PrismaModule], + providers: [AccountBalanceService] +}) +export class AccountBalanceModule {} diff --git a/apps/api/src/services/account-balance/account-balance.service.ts b/apps/api/src/services/account-balance/account-balance.service.ts new file mode 100644 index 000000000..9cd2d31ac --- /dev/null +++ b/apps/api/src/services/account-balance/account-balance.service.ts @@ -0,0 +1,16 @@ +import { PrismaService } from '@ghostfolio/api/services/prisma/prisma.service'; +import { Injectable } from '@nestjs/common'; +import { AccountBalance, Prisma } from '@prisma/client'; + +@Injectable() +export class AccountBalanceService { + public constructor(private readonly prismaService: PrismaService) {} + + public async createAccountBalance( + data: Prisma.AccountBalanceCreateInput + ): Promise { + return this.prismaService.accountBalance.create({ + data + }); + } +} diff --git a/apps/api/src/services/exchange-rate-data/exchange-rate-data.service.ts b/apps/api/src/services/exchange-rate-data/exchange-rate-data.service.ts index 9e1daa224..d94037530 100644 --- a/apps/api/src/services/exchange-rate-data/exchange-rate-data.service.ts +++ b/apps/api/src/services/exchange-rate-data/exchange-rate-data.service.ts @@ -125,9 +125,11 @@ export class ExchangeRateDataService { return 0; } - let factor = 1; + let factor: number; - if (aFromCurrency !== aToCurrency) { + if (aFromCurrency === aToCurrency) { + factor = 1; + } else { if (this.exchangeRates[`${aFromCurrency}${aToCurrency}`]) { factor = this.exchangeRates[`${aFromCurrency}${aToCurrency}`]; } else { @@ -171,7 +173,9 @@ export class ExchangeRateDataService { let factor: number; - if (aFromCurrency !== aToCurrency) { + if (aFromCurrency === aToCurrency) { + factor = 1; + } else { const dataSource = this.dataProviderService.getDataSourceForExchangeRates(); const symbol = `${aFromCurrency}${aToCurrency}`; diff --git a/prisma/migrations/20230723104112_added_account_balances_to_account/migration.sql b/prisma/migrations/20230723104112_added_account_balances_to_account/migration.sql new file mode 100644 index 000000000..d13327514 --- /dev/null +++ b/prisma/migrations/20230723104112_added_account_balances_to_account/migration.sql @@ -0,0 +1,27 @@ +-- CreateTable +CREATE TABLE "AccountBalance" ( + "accountId" TEXT NOT NULL, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "date" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "id" TEXT NOT NULL, + "updatedAt" TIMESTAMP(3) NOT NULL, + "userId" TEXT NOT NULL, + "value" DOUBLE PRECISION NOT NULL, + + CONSTRAINT "AccountBalance_pkey" PRIMARY KEY ("id") +); + +-- AddForeignKey +ALTER TABLE "AccountBalance" ADD CONSTRAINT "AccountBalance_accountId_userId_fkey" FOREIGN KEY ("accountId", "userId") REFERENCES "Account"("id", "userId") ON DELETE CASCADE ON UPDATE CASCADE; + +-- Migrate current account balance to time series (AccountBalance[]) +INSERT INTO "AccountBalance" ("accountId", "createdAt", "date", "id", "updatedAt", "userId", "value") +SELECT + "id", + "updatedAt", + "updatedAt", + "id", + "updatedAt", + "userId", + "balance" +FROM "Account"; diff --git a/prisma/schema.prisma b/prisma/schema.prisma index f46272a54..b8e6064a2 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -21,25 +21,37 @@ model Access { } model Account { - accountType AccountType @default(SECURITIES) - balance Float @default(0) + accountType AccountType @default(SECURITIES) + balance Float @default(0) + balances AccountBalance[] comment String? - createdAt DateTime @default(now()) + createdAt DateTime @default(now()) currency String? - id String @default(uuid()) - isDefault Boolean @default(false) - isExcluded Boolean @default(false) + id String @default(uuid()) + isDefault Boolean @default(false) + isExcluded Boolean @default(false) name String? platformId String? - updatedAt DateTime @updatedAt + updatedAt DateTime @updatedAt userId String - Platform Platform? @relation(fields: [platformId], references: [id]) - User User @relation(fields: [userId], references: [id]) + Platform Platform? @relation(fields: [platformId], references: [id]) + User User @relation(fields: [userId], references: [id]) Order Order[] @@id([id, userId]) } +model AccountBalance { + accountId String + createdAt DateTime @default(now()) + date DateTime @default(now()) + id String @id @default(uuid()) + updatedAt DateTime @updatedAt + userId String + value Float + Account Account @relation(fields: [accountId, userId], onDelete: Cascade, references: [id, userId]) +} + model Analytics { activityCount Int @default(0) country String? From 16b9fbe00ee17b4adba9d6117cc006df0c8da38b Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Sun, 23 Jul 2023 16:06:45 +0200 Subject: [PATCH 06/10] Release 1.291.0 (#2168) --- CHANGELOG.md | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 59dc50f23..24bf6d441 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 +## 1.291.0 - 2023-07-23 ### Added diff --git a/package.json b/package.json index 13ca27fcc..6c886addc 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "ghostfolio", - "version": "1.290.0", + "version": "1.291.0", "homepage": "https://ghostfol.io", "license": "AGPL-3.0", "scripts": { From 622bb8b0cf426811a5a319abbd8d9a8899babe22 Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Mon, 24 Jul 2023 20:04:34 +0200 Subject: [PATCH 07/10] Feature/add allocations by market chart (#2171) * Add allocations by (advanced) market * Fix public page * Update changelog --- CHANGELOG.md | 10 ++ .../src/app/portfolio/portfolio.controller.ts | 3 + .../src/app/portfolio/portfolio.service.ts | 57 +++++++- .../countries/asia-pacific-markets.json | 1 + .../src/assets/countries/europe-markets.json | 19 +++ .../allocations/allocations-page.component.ts | 133 ++++++++++++++--- .../allocations/allocations-page.html | 30 +++- .../app/pages/public/public-page.component.ts | 18 +-- apps/client/src/locales/messages.de.xlf | 136 ++++++++++-------- apps/client/src/locales/messages.es.xlf | 136 ++++++++++-------- apps/client/src/locales/messages.fr.xlf | 136 ++++++++++-------- apps/client/src/locales/messages.it.xlf | 136 ++++++++++-------- apps/client/src/locales/messages.nl.xlf | 136 ++++++++++-------- apps/client/src/locales/messages.pt.xlf | 136 ++++++++++-------- apps/client/src/locales/messages.xlf | 133 +++++++++-------- .../portfolio-position.interface.ts | 3 +- libs/common/src/lib/types/index.ts | 2 + .../src/lib/types/market-advanced.type.ts | 7 + libs/ui/src/lib/i18n.ts | 2 + .../portfolio-proportion-chart.component.ts | 107 +++++++------- 20 files changed, 861 insertions(+), 480 deletions(-) create mode 100644 apps/api/src/assets/countries/asia-pacific-markets.json create mode 100644 apps/api/src/assets/countries/europe-markets.json create mode 100644 libs/common/src/lib/types/market-advanced.type.ts diff --git a/CHANGELOG.md b/CHANGELOG.md index 24bf6d441..9764963fb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,16 @@ 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 + +### Added + +- Introduced the allocations by market chart on the allocations page + +### Fixed + +- Fixed an issue in the public page + ## 1.291.0 - 2023-07-23 ### Added diff --git a/apps/api/src/app/portfolio/portfolio.controller.ts b/apps/api/src/app/portfolio/portfolio.controller.ts index 6a8102501..93af43edb 100644 --- a/apps/api/src/app/portfolio/portfolio.controller.ts +++ b/apps/api/src/app/portfolio/portfolio.controller.ts @@ -179,6 +179,9 @@ export class PortfolioController { countries: hasDetails ? portfolioPosition.countries : [], currency: hasDetails ? portfolioPosition.currency : undefined, markets: hasDetails ? portfolioPosition.markets : undefined, + marketsAdvanced: hasDetails + ? portfolioPosition.marketsAdvanced + : undefined, sectors: hasDetails ? portfolioPosition.sectors : [] }; } diff --git a/apps/api/src/app/portfolio/portfolio.service.ts b/apps/api/src/app/portfolio/portfolio.service.ts index 4f96d2716..859a2dd1c 100644 --- a/apps/api/src/app/portfolio/portfolio.service.ts +++ b/apps/api/src/app/portfolio/portfolio.service.ts @@ -42,7 +42,6 @@ import type { AccountWithValue, DateRange, GroupBy, - Market, OrderWithAccount, RequestWithUser, UserWithSettings @@ -84,8 +83,10 @@ import { import { PortfolioCalculator } from './portfolio-calculator'; import { RulesService } from './rules.service'; +const asiaPacificMarkets = require('../../assets/countries/asia-pacific-markets.json'); const developedMarkets = require('../../assets/countries/developed-markets.json'); const emergingMarkets = require('../../assets/countries/emerging-markets.json'); +const europeMarkets = require('../../assets/countries/europe-markets.json'); @Injectable() export class PortfolioService { @@ -538,11 +539,19 @@ export class PortfolioService { const symbolProfile = symbolProfileMap[item.symbol]; const dataProviderResponse = dataProviderResponses[item.symbol]; - const markets: { [key in Market]: number } = { + const markets: PortfolioPosition['markets'] = { developedMarkets: 0, emergingMarkets: 0, otherMarkets: 0 }; + const marketsAdvanced: PortfolioPosition['marketsAdvanced'] = { + asiaPacific: 0, + emergingMarkets: 0, + europe: 0, + japan: 0, + northAmerica: 0, + otherMarkets: 0 + }; for (const country of symbolProfile.countries) { if (developedMarkets.includes(country.code)) { @@ -558,10 +567,39 @@ export class PortfolioService { .plus(country.weight) .toNumber(); } + + if (country.code === 'JP') { + marketsAdvanced.japan = new Big(marketsAdvanced.japan) + .plus(country.weight) + .toNumber(); + } else if (country.code === 'CA' || country.code === 'US') { + marketsAdvanced.northAmerica = new Big(marketsAdvanced.northAmerica) + .plus(country.weight) + .toNumber(); + } else if (asiaPacificMarkets.includes(country.code)) { + marketsAdvanced.asiaPacific = new Big(marketsAdvanced.asiaPacific) + .plus(country.weight) + .toNumber(); + } else if (emergingMarkets.includes(country.code)) { + marketsAdvanced.emergingMarkets = new Big( + marketsAdvanced.emergingMarkets + ) + .plus(country.weight) + .toNumber(); + } else if (europeMarkets.includes(country.code)) { + marketsAdvanced.europe = new Big(marketsAdvanced.europe) + .plus(country.weight) + .toNumber(); + } else { + marketsAdvanced.otherMarkets = new Big(marketsAdvanced.otherMarkets) + .plus(country.weight) + .toNumber(); + } } holdings[item.symbol] = { markets, + marketsAdvanced, allocationInPercentage: filteredValueInBaseCurrency.eq(0) ? 0 : value.div(filteredValueInBaseCurrency).toNumber(), @@ -1497,7 +1535,13 @@ export class PortfolioService { ); } - private getLiabilities(activities: OrderWithAccount[]) { + private getLiabilities({ + activities, + userCurrency + }: { + activities: OrderWithAccount[]; + userCurrency: string; + }) { return activities .filter(({ type }) => { return type === TypeOfOrder.LIABILITY; @@ -1506,7 +1550,7 @@ export class PortfolioService { return this.exchangeRateDataService.toCurrency( new Big(quantity).mul(unitPrice).toNumber(), SymbolProfile.currency, - this.request.user.Settings.settings.baseCurrency + userCurrency ); }) .reduce( @@ -1616,7 +1660,10 @@ export class PortfolioService { const fees = this.getFees({ activities, userCurrency }).toNumber(); const firstOrderDate = activities[0]?.date; const items = this.getItems(activities).toNumber(); - const liabilities = this.getLiabilities(activities).toNumber(); + const liabilities = this.getLiabilities({ + activities, + userCurrency + }).toNumber(); const totalBuy = this.getTotalByType(activities, userCurrency, 'BUY'); const totalSell = this.getTotalByType(activities, userCurrency, 'SELL'); diff --git a/apps/api/src/assets/countries/asia-pacific-markets.json b/apps/api/src/assets/countries/asia-pacific-markets.json new file mode 100644 index 000000000..adbb0750e --- /dev/null +++ b/apps/api/src/assets/countries/asia-pacific-markets.json @@ -0,0 +1 @@ +["AU", "HK", "NZ", "SG"] diff --git a/apps/api/src/assets/countries/europe-markets.json b/apps/api/src/assets/countries/europe-markets.json new file mode 100644 index 000000000..26eb2176c --- /dev/null +++ b/apps/api/src/assets/countries/europe-markets.json @@ -0,0 +1,19 @@ +[ + "AT", + "BE", + "CH", + "DE", + "DK", + "ES", + "FI", + "FR", + "GB", + "IE", + "IL", + "IT", + "LU", + "NL", + "NO", + "PT", + "SE" +] diff --git a/apps/client/src/app/pages/portfolio/allocations/allocations-page.component.ts b/apps/client/src/app/pages/portfolio/allocations/allocations-page.component.ts index 8696d6ac2..7266032a5 100644 --- a/apps/client/src/app/pages/portfolio/allocations/allocations-page.component.ts +++ b/apps/client/src/app/pages/portfolio/allocations/allocations-page.component.ts @@ -18,7 +18,7 @@ import { User } from '@ghostfolio/common/interfaces'; import { hasPermission, permissions } from '@ghostfolio/common/permissions'; -import { Market } from '@ghostfolio/common/types'; +import { Market, MarketAdvanced } from '@ghostfolio/common/types'; import { translate } from '@ghostfolio/ui/i18n'; import { Account, AssetClass, DataSource, Platform } from '@prisma/client'; import { isNumber } from 'lodash'; @@ -54,6 +54,13 @@ export class AllocationsPageComponent implements OnDestroy, OnInit { public markets: { [key in Market]: { name: string; value: number }; }; + public marketsAdvanced: { + [key in MarketAdvanced]: { + id: MarketAdvanced; + name: string; + value: number; + }; + }; public placeholder = ''; public platforms: { [id: string]: Pick & { @@ -235,6 +242,38 @@ export class AllocationsPageComponent implements OnDestroy, OnInit { value: undefined } }; + this.marketsAdvanced = { + asiaPacific: { + id: 'asiaPacific', + name: translate('Asia-Pacific'), + value: 0 + }, + emergingMarkets: { + id: 'emergingMarkets', + name: translate('Emerging Markets'), + value: 0 + }, + europe: { + id: 'europe', + name: translate('Europe'), + value: 0 + }, + japan: { + id: 'japan', + name: translate('Japan'), + value: 0 + }, + northAmerica: { + id: 'northAmerica', + name: translate('North America'), + value: 0 + }, + otherMarkets: { + id: 'otherMarkets', + name: translate('Other Markets'), + value: 0 + } + }; this.platforms = {}; this.portfolioDetails = { accounts: {}, @@ -318,45 +357,96 @@ export class AllocationsPageComponent implements OnDestroy, OnInit { } this.markets.developedMarkets.value += - position.markets.developedMarkets * position.valueInBaseCurrency; + position.markets.developedMarkets * + (isNumber(position.valueInBaseCurrency) + ? position.valueInBaseCurrency + : position.valueInPercentage); this.markets.emergingMarkets.value += - position.markets.emergingMarkets * position.valueInBaseCurrency; + position.markets.emergingMarkets * + (isNumber(position.valueInBaseCurrency) + ? position.valueInBaseCurrency + : position.valueInPercentage); this.markets.otherMarkets.value += - position.markets.otherMarkets * position.valueInBaseCurrency; + position.markets.otherMarkets * + (isNumber(position.valueInBaseCurrency) + ? position.valueInBaseCurrency + : position.valueInPercentage); + + this.marketsAdvanced.asiaPacific.value += + position.marketsAdvanced.asiaPacific * + (isNumber(position.valueInBaseCurrency) + ? position.valueInBaseCurrency + : position.valueInPercentage); + this.marketsAdvanced.emergingMarkets.value += + position.marketsAdvanced.emergingMarkets * + (isNumber(position.valueInBaseCurrency) + ? position.valueInBaseCurrency + : position.valueInPercentage); + this.marketsAdvanced.europe.value += + position.marketsAdvanced.europe * + (isNumber(position.valueInBaseCurrency) + ? position.valueInBaseCurrency + : position.valueInPercentage); + this.marketsAdvanced.japan.value += + position.marketsAdvanced.japan * + (isNumber(position.valueInBaseCurrency) + ? position.valueInBaseCurrency + : position.valueInPercentage); + this.marketsAdvanced.northAmerica.value += + position.marketsAdvanced.northAmerica * + (isNumber(position.valueInBaseCurrency) + ? position.valueInBaseCurrency + : position.valueInPercentage); for (const country of position.countries) { const { code, continent, name, weight } = country; if (this.continents[continent]?.value) { this.continents[continent].value += - weight * position.valueInBaseCurrency; + weight * + (isNumber(position.valueInBaseCurrency) + ? position.valueInBaseCurrency + : position.valueInPercentage); } else { this.continents[continent] = { name: continent, value: weight * - this.portfolioDetails.holdings[symbol].valueInBaseCurrency + (isNumber(position.valueInBaseCurrency) + ? this.portfolioDetails.holdings[symbol].valueInBaseCurrency + : this.portfolioDetails.holdings[symbol].valueInPercentage) }; } if (this.countries[code]?.value) { this.countries[code].value += - weight * position.valueInBaseCurrency; + weight * + (isNumber(position.valueInBaseCurrency) + ? position.valueInBaseCurrency + : position.valueInPercentage); } else { this.countries[code] = { name, value: weight * - this.portfolioDetails.holdings[symbol].valueInBaseCurrency + (isNumber(position.valueInBaseCurrency) + ? this.portfolioDetails.holdings[symbol].valueInBaseCurrency + : this.portfolioDetails.holdings[symbol].valueInPercentage) }; } } } else { - this.continents[UNKNOWN_KEY].value += - this.portfolioDetails.holdings[symbol].valueInBaseCurrency; - - this.countries[UNKNOWN_KEY].value += - this.portfolioDetails.holdings[symbol].valueInBaseCurrency; + this.continents[UNKNOWN_KEY].value += isNumber( + position.valueInBaseCurrency + ) + ? this.portfolioDetails.holdings[symbol].valueInBaseCurrency + : this.portfolioDetails.holdings[symbol].valueInPercentage; + + this.countries[UNKNOWN_KEY].value += isNumber( + position.valueInBaseCurrency + ) + ? this.portfolioDetails.holdings[symbol].valueInBaseCurrency + : this.portfolioDetails.holdings[symbol].valueInPercentage; } if (position.sectors.length > 0) { @@ -364,19 +454,28 @@ export class AllocationsPageComponent implements OnDestroy, OnInit { const { name, weight } = sector; if (this.sectors[name]?.value) { - this.sectors[name].value += weight * position.valueInBaseCurrency; + this.sectors[name].value += + weight * + (isNumber(position.valueInBaseCurrency) + ? position.valueInBaseCurrency + : position.valueInPercentage); } else { this.sectors[name] = { name, value: weight * - this.portfolioDetails.holdings[symbol].valueInBaseCurrency + (isNumber(position.valueInBaseCurrency) + ? this.portfolioDetails.holdings[symbol].valueInBaseCurrency + : this.portfolioDetails.holdings[symbol].valueInPercentage) }; } } } else { - this.sectors[UNKNOWN_KEY].value += - this.portfolioDetails.holdings[symbol].valueInBaseCurrency; + this.sectors[UNKNOWN_KEY].value += isNumber( + position.valueInBaseCurrency + ) + ? this.portfolioDetails.holdings[symbol].valueInBaseCurrency + : this.portfolioDetails.holdings[symbol].valueInPercentage; } } diff --git a/apps/client/src/app/pages/portfolio/allocations/allocations-page.html b/apps/client/src/app/pages/portfolio/allocations/allocations-page.html index ab78c1930..90a5dd3c9 100644 --- a/apps/client/src/app/pages/portfolio/allocations/allocations-page.html +++ b/apps/client/src/app/pages/portfolio/allocations/allocations-page.html @@ -174,7 +174,7 @@ By CountryBy Market @@ -250,6 +248,30 @@
+
+ + + By Country + + + + + +
diff --git a/apps/client/src/app/pages/public/public-page.component.ts b/apps/client/src/app/pages/public/public-page.component.ts index 54ff0cf15..bb3333902 100644 --- a/apps/client/src/app/pages/public/public-page.component.ts +++ b/apps/client/src/app/pages/public/public-page.component.ts @@ -33,19 +33,11 @@ export class PublicPageComponent implements OnInit { }; public portfolioPublicDetails: PortfolioPublicDetails; public positions: { - [symbol: string]: Pick< - PortfolioPosition, - 'currency' | 'name' | 'valueInBaseCurrency' - >; + [symbol: string]: Pick & { + value: number; + }; }; - public positionsArray: Pick< - PortfolioPosition, - | 'currency' - | 'name' - | 'netPerformancePercent' - | 'symbol' - | 'valueInBaseCurrency' - >[]; + public positionsArray: PortfolioPublicDetails['holdings'][string][]; public sectors: { [name: string]: { name: string; value: number }; }; @@ -142,7 +134,7 @@ export class PublicPageComponent implements OnInit { const value = position.allocationInPercentage; this.positions[symbol] = { - valueInBaseCurrency: value, + value, currency: position.currency, name: position.name }; diff --git a/apps/client/src/locales/messages.de.xlf b/apps/client/src/locales/messages.de.xlf index c3f0c9bb1..a44079f7f 100644 --- a/apps/client/src/locales/messages.de.xlf +++ b/apps/client/src/locales/messages.de.xlf @@ -1954,7 +1954,7 @@ Nach Konto apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 256 + 278 @@ -2002,7 +2002,7 @@ Nach Land apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 177 + 255 @@ -2010,7 +2010,7 @@ Regionen apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 203 + 201 apps/client/src/app/pages/public/public-page.html @@ -2150,7 +2150,7 @@ Verkauf libs/ui/src/lib/i18n.ts - 33 + 35 @@ -2650,7 +2650,7 @@ Entwickelte Länder apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 226 + 224 apps/client/src/app/pages/public/public-page.html @@ -2662,7 +2662,7 @@ Schwellenländer apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 235 + 233 apps/client/src/app/pages/public/public-page.html @@ -2674,7 +2674,7 @@ Andere Länder apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 244 + 242 apps/client/src/app/pages/public/public-page.html @@ -2782,7 +2782,7 @@ Filtern nach Konto oder Tag... apps/client/src/app/pages/portfolio/allocations/allocations-page.component.ts - 139 + 141 apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts @@ -2946,7 +2946,7 @@ Anlageklasse libs/ui/src/lib/i18n.ts - 5 + 6 @@ -2954,7 +2954,7 @@ Symbol libs/ui/src/lib/i18n.ts - 23 + 25 @@ -2962,7 +2962,7 @@ Tag libs/ui/src/lib/i18n.ts - 24 + 26 @@ -2970,7 +2970,7 @@ Bargeld libs/ui/src/lib/i18n.ts - 36 + 38 @@ -2978,7 +2978,7 @@ Rohstoff libs/ui/src/lib/i18n.ts - 37 + 39 @@ -2986,7 +2986,7 @@ Beteiligungskapital libs/ui/src/lib/i18n.ts - 38 + 40 @@ -2994,7 +2994,7 @@ Feste Einkünfte libs/ui/src/lib/i18n.ts - 39 + 41 @@ -3002,7 +3002,7 @@ Immobilien libs/ui/src/lib/i18n.ts - 40 + 42 @@ -3010,7 +3010,7 @@ Anleihe libs/ui/src/lib/i18n.ts - 43 + 45 @@ -3018,7 +3018,7 @@ Kryptowährung libs/ui/src/lib/i18n.ts - 44 + 46 @@ -3026,7 +3026,7 @@ ETF libs/ui/src/lib/i18n.ts - 45 + 47 @@ -3034,7 +3034,7 @@ Investmentfonds libs/ui/src/lib/i18n.ts - 46 + 48 @@ -3042,7 +3042,7 @@ Edelmetall libs/ui/src/lib/i18n.ts - 47 + 49 @@ -3050,7 +3050,7 @@ Privates Beteiligungskapital libs/ui/src/lib/i18n.ts - 48 + 50 @@ -3058,7 +3058,7 @@ Aktie libs/ui/src/lib/i18n.ts - 49 + 51 @@ -3066,7 +3066,7 @@ Notfallfonds libs/ui/src/lib/i18n.ts - 11 + 12 @@ -3074,11 +3074,11 @@ Andere libs/ui/src/lib/i18n.ts - 18 + 20 libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 373 + 384 @@ -3086,11 +3086,11 @@ Keine Daten verfügbar libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 375 + 386 libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 388 + 399 @@ -3098,7 +3098,7 @@ Nordamerika libs/ui/src/lib/i18n.ts - 55 + 57 @@ -3106,7 +3106,7 @@ Afrika libs/ui/src/lib/i18n.ts - 52 + 54 @@ -3114,7 +3114,7 @@ Asien libs/ui/src/lib/i18n.ts - 53 + 55 @@ -3122,7 +3122,7 @@ Europa libs/ui/src/lib/i18n.ts - 54 + 56 @@ -3130,7 +3130,7 @@ Ozeanien libs/ui/src/lib/i18n.ts - 56 + 58 @@ -3138,7 +3138,7 @@ Südamerika libs/ui/src/lib/i18n.ts - 57 + 59 @@ -3242,7 +3242,7 @@ libs/ui/src/lib/i18n.ts - 30 + 32 @@ -3250,7 +3250,7 @@ Anlageunterklasse libs/ui/src/lib/i18n.ts - 6 + 7 @@ -3286,7 +3286,7 @@ Wertschriften libs/ui/src/lib/i18n.ts - 22 + 24 @@ -3382,7 +3382,7 @@ Kern libs/ui/src/lib/i18n.ts - 7 + 8 @@ -3390,7 +3390,7 @@ Zuwendung libs/ui/src/lib/i18n.ts - 12 + 13 @@ -3398,7 +3398,7 @@ Höheres Risiko libs/ui/src/lib/i18n.ts - 13 + 14 @@ -3406,7 +3406,7 @@ Geringeres Risiko libs/ui/src/lib/i18n.ts - 15 + 17 @@ -3414,7 +3414,7 @@ Altersvorsorge libs/ui/src/lib/i18n.ts - 20 + 22 @@ -3422,7 +3422,7 @@ Satellit libs/ui/src/lib/i18n.ts - 21 + 23 @@ -3726,7 +3726,7 @@ Einfacher Wechsel zu Ghostfolio Premium libs/ui/src/lib/i18n.ts - 9 + 10 @@ -3750,7 +3750,7 @@ Einfacher Wechsel zu Ghostfolio Premium oder Ghostfolio Open Source libs/ui/src/lib/i18n.ts - 8 + 9 @@ -3758,7 +3758,7 @@ Einfacher Wechsel zu Ghostfolio Open Source oder Ghostfolio Basic libs/ui/src/lib/i18n.ts - 10 + 11 @@ -3870,7 +3870,7 @@ Nach ETF-Anbieter apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 276 + 298 @@ -3990,7 +3990,7 @@ Diese Aktivität existiert bereits. libs/ui/src/lib/i18n.ts - 14 + 15 @@ -4102,7 +4102,7 @@ Monate libs/ui/src/lib/i18n.ts - 17 + 19 @@ -4110,7 +4110,7 @@ Jahre libs/ui/src/lib/i18n.ts - 26 + 28 @@ -4118,7 +4118,7 @@ Monat libs/ui/src/lib/i18n.ts - 16 + 18 @@ -4126,7 +4126,7 @@ Jahr libs/ui/src/lib/i18n.ts - 25 + 27 @@ -4282,7 +4282,7 @@ Verbindlichkeit libs/ui/src/lib/i18n.ts - 32 + 34 @@ -7018,7 +7018,7 @@ Kauf libs/ui/src/lib/i18n.ts - 29 + 31 @@ -7026,7 +7026,7 @@ Wertsache libs/ui/src/lib/i18n.ts - 31 + 33 @@ -7058,7 +7058,31 @@ Filtervorlage libs/ui/src/lib/i18n.ts - 19 + 21 + + + + By Market + Nach Markt + + apps/client/src/app/pages/portfolio/allocations/allocations-page.html + 177 + + + + Asia-Pacific + Asien-Pazifik + + libs/ui/src/lib/i18n.ts + 5 + + + + Japan + Japan + + libs/ui/src/lib/i18n.ts + 16 diff --git a/apps/client/src/locales/messages.es.xlf b/apps/client/src/locales/messages.es.xlf index f1c7d62e1..998b89260 100644 --- a/apps/client/src/locales/messages.es.xlf +++ b/apps/client/src/locales/messages.es.xlf @@ -1955,7 +1955,7 @@ Por cuenta apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 256 + 278 @@ -2003,7 +2003,7 @@ Por país apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 177 + 255 @@ -2011,7 +2011,7 @@ Regiones apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 203 + 201 apps/client/src/app/pages/public/public-page.html @@ -2151,7 +2151,7 @@ Venta libs/ui/src/lib/i18n.ts - 33 + 35 @@ -2571,7 +2571,7 @@ Mercados desarrollados apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 226 + 224 apps/client/src/app/pages/public/public-page.html @@ -2619,7 +2619,7 @@ Otros mercados apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 244 + 242 apps/client/src/app/pages/public/public-page.html @@ -2631,7 +2631,7 @@ Mercados emergentes apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 235 + 233 apps/client/src/app/pages/public/public-page.html @@ -2775,7 +2775,7 @@ Filtrar por cuenta o etiqueta... apps/client/src/app/pages/portfolio/allocations/allocations-page.component.ts - 139 + 141 apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts @@ -2947,7 +2947,7 @@ Tipo de activo libs/ui/src/lib/i18n.ts - 5 + 6 @@ -2955,7 +2955,7 @@ Símbolo libs/ui/src/lib/i18n.ts - 23 + 25 @@ -2963,7 +2963,7 @@ Etiqueta libs/ui/src/lib/i18n.ts - 24 + 26 @@ -2971,7 +2971,7 @@ Efectivo libs/ui/src/lib/i18n.ts - 36 + 38 @@ -2979,7 +2979,7 @@ Bien libs/ui/src/lib/i18n.ts - 37 + 39 @@ -2987,7 +2987,7 @@ Capital libs/ui/src/lib/i18n.ts - 38 + 40 @@ -2995,7 +2995,7 @@ Renta fija libs/ui/src/lib/i18n.ts - 39 + 41 @@ -3003,7 +3003,7 @@ Propiedad inmobiliaria libs/ui/src/lib/i18n.ts - 40 + 42 @@ -3011,7 +3011,7 @@ Bono libs/ui/src/lib/i18n.ts - 43 + 45 @@ -3019,7 +3019,7 @@ Criptomoneda libs/ui/src/lib/i18n.ts - 44 + 46 @@ -3027,7 +3027,7 @@ ETF libs/ui/src/lib/i18n.ts - 45 + 47 @@ -3035,7 +3035,7 @@ Fondo de inversión libs/ui/src/lib/i18n.ts - 46 + 48 @@ -3043,7 +3043,7 @@ Metal precioso libs/ui/src/lib/i18n.ts - 47 + 49 @@ -3051,7 +3051,7 @@ Capital riesgo libs/ui/src/lib/i18n.ts - 48 + 50 @@ -3059,7 +3059,7 @@ Acción libs/ui/src/lib/i18n.ts - 49 + 51 @@ -3067,7 +3067,7 @@ Fondo de emergencia libs/ui/src/lib/i18n.ts - 11 + 12 @@ -3075,11 +3075,11 @@ Otros libs/ui/src/lib/i18n.ts - 18 + 20 libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 373 + 384 @@ -3087,11 +3087,11 @@ Sin datos disponibles libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 375 + 386 libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 388 + 399 @@ -3099,7 +3099,7 @@ América del Norte libs/ui/src/lib/i18n.ts - 55 + 57 @@ -3107,7 +3107,7 @@ África libs/ui/src/lib/i18n.ts - 52 + 54 @@ -3115,7 +3115,7 @@ Asia libs/ui/src/lib/i18n.ts - 53 + 55 @@ -3123,7 +3123,7 @@ Europa libs/ui/src/lib/i18n.ts - 54 + 56 @@ -3131,7 +3131,7 @@ Oceanía libs/ui/src/lib/i18n.ts - 56 + 58 @@ -3139,7 +3139,7 @@ América del Sur libs/ui/src/lib/i18n.ts - 57 + 59 @@ -3235,7 +3235,7 @@ libs/ui/src/lib/i18n.ts - 30 + 32 @@ -3251,7 +3251,7 @@ Subtipo de activo libs/ui/src/lib/i18n.ts - 6 + 7 @@ -3287,7 +3287,7 @@ Securities libs/ui/src/lib/i18n.ts - 22 + 24 @@ -3383,7 +3383,7 @@ Core libs/ui/src/lib/i18n.ts - 7 + 8 @@ -3391,7 +3391,7 @@ Grant libs/ui/src/lib/i18n.ts - 12 + 13 @@ -3399,7 +3399,7 @@ Higher Risk libs/ui/src/lib/i18n.ts - 13 + 14 @@ -3407,7 +3407,7 @@ Lower Risk libs/ui/src/lib/i18n.ts - 15 + 17 @@ -3415,7 +3415,7 @@ Retirement Provision libs/ui/src/lib/i18n.ts - 20 + 22 @@ -3423,7 +3423,7 @@ Satellite libs/ui/src/lib/i18n.ts - 21 + 23 @@ -3727,7 +3727,7 @@ Switch to Ghostfolio Premium easily libs/ui/src/lib/i18n.ts - 9 + 10 @@ -3751,7 +3751,7 @@ Switch to Ghostfolio Premium or Ghostfolio Open Source easily libs/ui/src/lib/i18n.ts - 8 + 9 @@ -3759,7 +3759,7 @@ Switch to Ghostfolio Open Source or Ghostfolio Basic easily libs/ui/src/lib/i18n.ts - 10 + 11 @@ -3871,7 +3871,7 @@ By ETF Provider apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 276 + 298 @@ -3991,7 +3991,7 @@ This activity already exists. libs/ui/src/lib/i18n.ts - 14 + 15 @@ -4103,7 +4103,7 @@ Months libs/ui/src/lib/i18n.ts - 17 + 19 @@ -4111,7 +4111,7 @@ Years libs/ui/src/lib/i18n.ts - 26 + 28 @@ -4119,7 +4119,7 @@ Month libs/ui/src/lib/i18n.ts - 16 + 18 @@ -4127,7 +4127,7 @@ Year libs/ui/src/lib/i18n.ts - 25 + 27 @@ -4283,7 +4283,7 @@ Liability libs/ui/src/lib/i18n.ts - 32 + 34 @@ -7019,7 +7019,7 @@ Buy libs/ui/src/lib/i18n.ts - 29 + 31 @@ -7027,7 +7027,7 @@ Valuable libs/ui/src/lib/i18n.ts - 31 + 33 @@ -7059,7 +7059,31 @@ Preset libs/ui/src/lib/i18n.ts - 19 + 21 + + + + By Market + By Market + + apps/client/src/app/pages/portfolio/allocations/allocations-page.html + 177 + + + + Asia-Pacific + Asia-Pacific + + libs/ui/src/lib/i18n.ts + 5 + + + + Japan + Japan + + libs/ui/src/lib/i18n.ts + 16 diff --git a/apps/client/src/locales/messages.fr.xlf b/apps/client/src/locales/messages.fr.xlf index 734ff1835..7f745a6b3 100644 --- a/apps/client/src/locales/messages.fr.xlf +++ b/apps/client/src/locales/messages.fr.xlf @@ -2398,7 +2398,7 @@ Vente libs/ui/src/lib/i18n.ts - 33 + 35 @@ -2526,7 +2526,7 @@ Filtrer par compte ou étiquette... apps/client/src/app/pages/portfolio/allocations/allocations-page.component.ts - 139 + 141 apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts @@ -2558,7 +2558,7 @@ Par Compte apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 256 + 278 @@ -2606,7 +2606,7 @@ Par Pays apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 177 + 255 @@ -2614,7 +2614,7 @@ Régions apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 203 + 201 apps/client/src/app/pages/public/public-page.html @@ -2626,7 +2626,7 @@ Marchés Développés apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 226 + 224 apps/client/src/app/pages/public/public-page.html @@ -2638,7 +2638,7 @@ Marchés Émergents apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 235 + 233 apps/client/src/app/pages/public/public-page.html @@ -2650,7 +2650,7 @@ Autres marchés apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 244 + 242 apps/client/src/app/pages/public/public-page.html @@ -2678,7 +2678,7 @@ libs/ui/src/lib/i18n.ts - 30 + 32 @@ -3118,7 +3118,7 @@ Classe d'Actifs libs/ui/src/lib/i18n.ts - 5 + 6 @@ -3126,7 +3126,7 @@ Sous-classe d'Actifs libs/ui/src/lib/i18n.ts - 6 + 7 @@ -3134,7 +3134,7 @@ Fonds d'Urgence libs/ui/src/lib/i18n.ts - 11 + 12 @@ -3142,11 +3142,11 @@ Autre libs/ui/src/lib/i18n.ts - 18 + 20 libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 373 + 384 @@ -3154,7 +3154,7 @@ Titres libs/ui/src/lib/i18n.ts - 22 + 24 @@ -3162,7 +3162,7 @@ Symbole libs/ui/src/lib/i18n.ts - 23 + 25 @@ -3170,7 +3170,7 @@ Étiquette libs/ui/src/lib/i18n.ts - 24 + 26 @@ -3178,7 +3178,7 @@ Cash libs/ui/src/lib/i18n.ts - 36 + 38 @@ -3186,7 +3186,7 @@ Marchandise libs/ui/src/lib/i18n.ts - 37 + 39 @@ -3194,7 +3194,7 @@ Capital libs/ui/src/lib/i18n.ts - 38 + 40 @@ -3202,7 +3202,7 @@ Revenu Fixe libs/ui/src/lib/i18n.ts - 39 + 41 @@ -3210,7 +3210,7 @@ Immobilier libs/ui/src/lib/i18n.ts - 40 + 42 @@ -3218,7 +3218,7 @@ Obligation libs/ui/src/lib/i18n.ts - 43 + 45 @@ -3226,7 +3226,7 @@ Cryptomonnaie libs/ui/src/lib/i18n.ts - 44 + 46 @@ -3234,7 +3234,7 @@ ETF libs/ui/src/lib/i18n.ts - 45 + 47 @@ -3242,7 +3242,7 @@ SICAV libs/ui/src/lib/i18n.ts - 46 + 48 @@ -3250,7 +3250,7 @@ Métal Précieux libs/ui/src/lib/i18n.ts - 47 + 49 @@ -3258,7 +3258,7 @@ Capital Propre libs/ui/src/lib/i18n.ts - 48 + 50 @@ -3266,7 +3266,7 @@ Action libs/ui/src/lib/i18n.ts - 49 + 51 @@ -3274,7 +3274,7 @@ Afrique libs/ui/src/lib/i18n.ts - 52 + 54 @@ -3282,7 +3282,7 @@ Asie libs/ui/src/lib/i18n.ts - 53 + 55 @@ -3290,7 +3290,7 @@ Europe libs/ui/src/lib/i18n.ts - 54 + 56 @@ -3298,7 +3298,7 @@ Amérique du Nord libs/ui/src/lib/i18n.ts - 55 + 57 @@ -3306,7 +3306,7 @@ Océanie libs/ui/src/lib/i18n.ts - 56 + 58 @@ -3314,7 +3314,7 @@ Amérique du Sud libs/ui/src/lib/i18n.ts - 57 + 59 @@ -3330,11 +3330,11 @@ Pas de données disponibles libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 375 + 386 libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 388 + 399 @@ -3382,7 +3382,7 @@ Core libs/ui/src/lib/i18n.ts - 7 + 8 @@ -3390,7 +3390,7 @@ Donner libs/ui/src/lib/i18n.ts - 12 + 13 @@ -3398,7 +3398,7 @@ Risque élevé libs/ui/src/lib/i18n.ts - 13 + 14 @@ -3406,7 +3406,7 @@ Risque faible libs/ui/src/lib/i18n.ts - 15 + 17 @@ -3414,7 +3414,7 @@ Réserve pour retraite libs/ui/src/lib/i18n.ts - 20 + 22 @@ -3422,7 +3422,7 @@ Satellite libs/ui/src/lib/i18n.ts - 21 + 23 @@ -3726,7 +3726,7 @@ Passez à Ghostfolio Premium facilement libs/ui/src/lib/i18n.ts - 9 + 10 @@ -3750,7 +3750,7 @@ Passez à Ghostfolio Premium ou Ghostfolio Open Source facilement libs/ui/src/lib/i18n.ts - 8 + 9 @@ -3758,7 +3758,7 @@ Passez à Ghostfolio Open Source ou Ghostfolio Basic facilement libs/ui/src/lib/i18n.ts - 10 + 11 @@ -3870,7 +3870,7 @@ Par Émetteur d'ETF apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 276 + 298 @@ -3990,7 +3990,7 @@ Cette activité existe déjà. libs/ui/src/lib/i18n.ts - 14 + 15 @@ -4102,7 +4102,7 @@ Mois libs/ui/src/lib/i18n.ts - 17 + 19 @@ -4110,7 +4110,7 @@ Années libs/ui/src/lib/i18n.ts - 26 + 28 @@ -4118,7 +4118,7 @@ Mois libs/ui/src/lib/i18n.ts - 16 + 18 @@ -4126,7 +4126,7 @@ Année libs/ui/src/lib/i18n.ts - 25 + 27 @@ -4282,7 +4282,7 @@ Dette libs/ui/src/lib/i18n.ts - 32 + 34 @@ -7018,7 +7018,7 @@ Buy libs/ui/src/lib/i18n.ts - 29 + 31 @@ -7026,7 +7026,7 @@ Valuable libs/ui/src/lib/i18n.ts - 31 + 33 @@ -7058,7 +7058,31 @@ Preset libs/ui/src/lib/i18n.ts - 19 + 21 + + + + By Market + By Market + + apps/client/src/app/pages/portfolio/allocations/allocations-page.html + 177 + + + + Asia-Pacific + Asia-Pacific + + libs/ui/src/lib/i18n.ts + 5 + + + + Japan + Japan + + libs/ui/src/lib/i18n.ts + 16 diff --git a/apps/client/src/locales/messages.it.xlf b/apps/client/src/locales/messages.it.xlf index 2286a61f9..4c5f6b1a9 100644 --- a/apps/client/src/locales/messages.it.xlf +++ b/apps/client/src/locales/messages.it.xlf @@ -1955,7 +1955,7 @@ Per account apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 256 + 278 @@ -2003,7 +2003,7 @@ Per paese apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 177 + 255 @@ -2011,7 +2011,7 @@ Regioni apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 203 + 201 apps/client/src/app/pages/public/public-page.html @@ -2151,7 +2151,7 @@ Vendi libs/ui/src/lib/i18n.ts - 33 + 35 @@ -2571,7 +2571,7 @@ Mercati sviluppati apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 226 + 224 apps/client/src/app/pages/public/public-page.html @@ -2619,7 +2619,7 @@ Altri mercati apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 244 + 242 apps/client/src/app/pages/public/public-page.html @@ -2631,7 +2631,7 @@ Mercati emergenti apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 235 + 233 apps/client/src/app/pages/public/public-page.html @@ -2775,7 +2775,7 @@ Filtra per account o tag... apps/client/src/app/pages/portfolio/allocations/allocations-page.component.ts - 139 + 141 apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts @@ -2947,7 +2947,7 @@ Asset Class libs/ui/src/lib/i18n.ts - 5 + 6 @@ -2955,7 +2955,7 @@ Symbol libs/ui/src/lib/i18n.ts - 23 + 25 @@ -2963,7 +2963,7 @@ Tag libs/ui/src/lib/i18n.ts - 24 + 26 @@ -2971,7 +2971,7 @@ Cash libs/ui/src/lib/i18n.ts - 36 + 38 @@ -2979,7 +2979,7 @@ Commodity libs/ui/src/lib/i18n.ts - 37 + 39 @@ -2987,7 +2987,7 @@ Equity libs/ui/src/lib/i18n.ts - 38 + 40 @@ -2995,7 +2995,7 @@ Fixed Income libs/ui/src/lib/i18n.ts - 39 + 41 @@ -3003,7 +3003,7 @@ Real Estate libs/ui/src/lib/i18n.ts - 40 + 42 @@ -3011,7 +3011,7 @@ Bond libs/ui/src/lib/i18n.ts - 43 + 45 @@ -3019,7 +3019,7 @@ Cryptocurrency libs/ui/src/lib/i18n.ts - 44 + 46 @@ -3027,7 +3027,7 @@ ETF libs/ui/src/lib/i18n.ts - 45 + 47 @@ -3035,7 +3035,7 @@ Mutual Fund libs/ui/src/lib/i18n.ts - 46 + 48 @@ -3043,7 +3043,7 @@ Precious Metal libs/ui/src/lib/i18n.ts - 47 + 49 @@ -3051,7 +3051,7 @@ Private Equity libs/ui/src/lib/i18n.ts - 48 + 50 @@ -3059,7 +3059,7 @@ Stock libs/ui/src/lib/i18n.ts - 49 + 51 @@ -3067,7 +3067,7 @@ Emergency Fund libs/ui/src/lib/i18n.ts - 11 + 12 @@ -3075,11 +3075,11 @@ Other libs/ui/src/lib/i18n.ts - 18 + 20 libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 373 + 384 @@ -3087,11 +3087,11 @@ No data available libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 375 + 386 libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 388 + 399 @@ -3099,7 +3099,7 @@ North America libs/ui/src/lib/i18n.ts - 55 + 57 @@ -3107,7 +3107,7 @@ Africa libs/ui/src/lib/i18n.ts - 52 + 54 @@ -3115,7 +3115,7 @@ Asia libs/ui/src/lib/i18n.ts - 53 + 55 @@ -3123,7 +3123,7 @@ Europe libs/ui/src/lib/i18n.ts - 54 + 56 @@ -3131,7 +3131,7 @@ Oceania libs/ui/src/lib/i18n.ts - 56 + 58 @@ -3139,7 +3139,7 @@ South America libs/ui/src/lib/i18n.ts - 57 + 59 @@ -3235,7 +3235,7 @@ libs/ui/src/lib/i18n.ts - 30 + 32 @@ -3251,7 +3251,7 @@ Sub-asset class libs/ui/src/lib/i18n.ts - 6 + 7 @@ -3287,7 +3287,7 @@ Securities libs/ui/src/lib/i18n.ts - 22 + 24 @@ -3383,7 +3383,7 @@ Core libs/ui/src/lib/i18n.ts - 7 + 8 @@ -3391,7 +3391,7 @@ Grant libs/ui/src/lib/i18n.ts - 12 + 13 @@ -3399,7 +3399,7 @@ Higher Risk libs/ui/src/lib/i18n.ts - 13 + 14 @@ -3407,7 +3407,7 @@ Lower Risk libs/ui/src/lib/i18n.ts - 15 + 17 @@ -3415,7 +3415,7 @@ Retirement Provision libs/ui/src/lib/i18n.ts - 20 + 22 @@ -3423,7 +3423,7 @@ Satellite libs/ui/src/lib/i18n.ts - 21 + 23 @@ -3727,7 +3727,7 @@ Switch to Ghostfolio Premium easily libs/ui/src/lib/i18n.ts - 9 + 10 @@ -3751,7 +3751,7 @@ Switch to Ghostfolio Premium or Ghostfolio Open Source easily libs/ui/src/lib/i18n.ts - 8 + 9 @@ -3759,7 +3759,7 @@ Switch to Ghostfolio Open Source or Ghostfolio Basic easily libs/ui/src/lib/i18n.ts - 10 + 11 @@ -3871,7 +3871,7 @@ By ETF Provider apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 276 + 298 @@ -3991,7 +3991,7 @@ This activity already exists. libs/ui/src/lib/i18n.ts - 14 + 15 @@ -4103,7 +4103,7 @@ Months libs/ui/src/lib/i18n.ts - 17 + 19 @@ -4111,7 +4111,7 @@ Years libs/ui/src/lib/i18n.ts - 26 + 28 @@ -4119,7 +4119,7 @@ Month libs/ui/src/lib/i18n.ts - 16 + 18 @@ -4127,7 +4127,7 @@ Year libs/ui/src/lib/i18n.ts - 25 + 27 @@ -4283,7 +4283,7 @@ Liability libs/ui/src/lib/i18n.ts - 32 + 34 @@ -7019,7 +7019,7 @@ Buy libs/ui/src/lib/i18n.ts - 29 + 31 @@ -7027,7 +7027,7 @@ Valuable libs/ui/src/lib/i18n.ts - 31 + 33 @@ -7059,7 +7059,31 @@ Preset libs/ui/src/lib/i18n.ts - 19 + 21 + + + + By Market + By Market + + apps/client/src/app/pages/portfolio/allocations/allocations-page.html + 177 + + + + Asia-Pacific + Asia-Pacific + + libs/ui/src/lib/i18n.ts + 5 + + + + Japan + Japan + + libs/ui/src/lib/i18n.ts + 16 diff --git a/apps/client/src/locales/messages.nl.xlf b/apps/client/src/locales/messages.nl.xlf index b58da7468..50d64b9d0 100644 --- a/apps/client/src/locales/messages.nl.xlf +++ b/apps/client/src/locales/messages.nl.xlf @@ -1954,7 +1954,7 @@ Per rekening apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 256 + 278 @@ -2002,7 +2002,7 @@ Per land apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 177 + 255 @@ -2010,7 +2010,7 @@ Regio's apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 203 + 201 apps/client/src/app/pages/public/public-page.html @@ -2150,7 +2150,7 @@ Verkopen libs/ui/src/lib/i18n.ts - 33 + 35 @@ -2570,7 +2570,7 @@ Ontwikkelde markten apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 226 + 224 apps/client/src/app/pages/public/public-page.html @@ -2618,7 +2618,7 @@ Andere markten apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 244 + 242 apps/client/src/app/pages/public/public-page.html @@ -2630,7 +2630,7 @@ Opkomende markten apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 235 + 233 apps/client/src/app/pages/public/public-page.html @@ -2774,7 +2774,7 @@ Filter op account of tag... apps/client/src/app/pages/portfolio/allocations/allocations-page.component.ts - 139 + 141 apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts @@ -2946,7 +2946,7 @@ Activaklasse libs/ui/src/lib/i18n.ts - 5 + 6 @@ -2954,7 +2954,7 @@ Symbool libs/ui/src/lib/i18n.ts - 23 + 25 @@ -2962,7 +2962,7 @@ Label libs/ui/src/lib/i18n.ts - 24 + 26 @@ -2970,7 +2970,7 @@ Contant geld libs/ui/src/lib/i18n.ts - 36 + 38 @@ -2978,7 +2978,7 @@ Commodity libs/ui/src/lib/i18n.ts - 37 + 39 @@ -2986,7 +2986,7 @@ Equity libs/ui/src/lib/i18n.ts - 38 + 40 @@ -2994,7 +2994,7 @@ Vast inkomen libs/ui/src/lib/i18n.ts - 39 + 41 @@ -3002,7 +3002,7 @@ Vastgoed libs/ui/src/lib/i18n.ts - 40 + 42 @@ -3010,7 +3010,7 @@ Obligatie libs/ui/src/lib/i18n.ts - 43 + 45 @@ -3018,7 +3018,7 @@ Cryptovaluta libs/ui/src/lib/i18n.ts - 44 + 46 @@ -3026,7 +3026,7 @@ ETF libs/ui/src/lib/i18n.ts - 45 + 47 @@ -3034,7 +3034,7 @@ Beleggingsfonds libs/ui/src/lib/i18n.ts - 46 + 48 @@ -3042,7 +3042,7 @@ Edel metaal libs/ui/src/lib/i18n.ts - 47 + 49 @@ -3050,7 +3050,7 @@ Private equity libs/ui/src/lib/i18n.ts - 48 + 50 @@ -3058,7 +3058,7 @@ Aandeel libs/ui/src/lib/i18n.ts - 49 + 51 @@ -3066,7 +3066,7 @@ Noodfonds libs/ui/src/lib/i18n.ts - 11 + 12 @@ -3074,11 +3074,11 @@ Anders libs/ui/src/lib/i18n.ts - 18 + 20 libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 373 + 384 @@ -3086,11 +3086,11 @@ Geen gegevens beschikbaar libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 375 + 386 libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 388 + 399 @@ -3098,7 +3098,7 @@ Noord Amerika libs/ui/src/lib/i18n.ts - 55 + 57 @@ -3106,7 +3106,7 @@ Afrika libs/ui/src/lib/i18n.ts - 52 + 54 @@ -3114,7 +3114,7 @@ Azië libs/ui/src/lib/i18n.ts - 53 + 55 @@ -3122,7 +3122,7 @@ Europa libs/ui/src/lib/i18n.ts - 54 + 56 @@ -3130,7 +3130,7 @@ Oceanië libs/ui/src/lib/i18n.ts - 56 + 58 @@ -3138,7 +3138,7 @@ Zuid Amerika libs/ui/src/lib/i18n.ts - 57 + 59 @@ -3234,7 +3234,7 @@ libs/ui/src/lib/i18n.ts - 30 + 32 @@ -3250,7 +3250,7 @@ Activa Subklasse libs/ui/src/lib/i18n.ts - 6 + 7 @@ -3286,7 +3286,7 @@ Effecten libs/ui/src/lib/i18n.ts - 22 + 24 @@ -3382,7 +3382,7 @@ Core libs/ui/src/lib/i18n.ts - 7 + 8 @@ -3390,7 +3390,7 @@ Grant libs/ui/src/lib/i18n.ts - 12 + 13 @@ -3398,7 +3398,7 @@ Higher Risk libs/ui/src/lib/i18n.ts - 13 + 14 @@ -3406,7 +3406,7 @@ Lower Risk libs/ui/src/lib/i18n.ts - 15 + 17 @@ -3414,7 +3414,7 @@ Retirement Provision libs/ui/src/lib/i18n.ts - 20 + 22 @@ -3422,7 +3422,7 @@ Satellite libs/ui/src/lib/i18n.ts - 21 + 23 @@ -3726,7 +3726,7 @@ Switch to Ghostfolio Premium easily libs/ui/src/lib/i18n.ts - 9 + 10 @@ -3750,7 +3750,7 @@ Switch to Ghostfolio Premium or Ghostfolio Open Source easily libs/ui/src/lib/i18n.ts - 8 + 9 @@ -3758,7 +3758,7 @@ Switch to Ghostfolio Open Source or Ghostfolio Basic easily libs/ui/src/lib/i18n.ts - 10 + 11 @@ -3870,7 +3870,7 @@ By ETF Provider apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 276 + 298 @@ -3990,7 +3990,7 @@ This activity already exists. libs/ui/src/lib/i18n.ts - 14 + 15 @@ -4102,7 +4102,7 @@ Months libs/ui/src/lib/i18n.ts - 17 + 19 @@ -4110,7 +4110,7 @@ Years libs/ui/src/lib/i18n.ts - 26 + 28 @@ -4118,7 +4118,7 @@ Month libs/ui/src/lib/i18n.ts - 16 + 18 @@ -4126,7 +4126,7 @@ Year libs/ui/src/lib/i18n.ts - 25 + 27 @@ -4282,7 +4282,7 @@ Liability libs/ui/src/lib/i18n.ts - 32 + 34 @@ -7018,7 +7018,7 @@ Buy libs/ui/src/lib/i18n.ts - 29 + 31 @@ -7026,7 +7026,7 @@ Valuable libs/ui/src/lib/i18n.ts - 31 + 33 @@ -7058,7 +7058,31 @@ Preset libs/ui/src/lib/i18n.ts - 19 + 21 + + + + By Market + By Market + + apps/client/src/app/pages/portfolio/allocations/allocations-page.html + 177 + + + + Asia-Pacific + Asia-Pacific + + libs/ui/src/lib/i18n.ts + 5 + + + + Japan + Japan + + libs/ui/src/lib/i18n.ts + 16 diff --git a/apps/client/src/locales/messages.pt.xlf b/apps/client/src/locales/messages.pt.xlf index d61c88809..66cfd40fb 100644 --- a/apps/client/src/locales/messages.pt.xlf +++ b/apps/client/src/locales/messages.pt.xlf @@ -2322,7 +2322,7 @@ Venda libs/ui/src/lib/i18n.ts - 33 + 35 @@ -2446,7 +2446,7 @@ Filtrar por conta ou marcador... apps/client/src/app/pages/portfolio/allocations/allocations-page.component.ts - 139 + 141 apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts @@ -2478,7 +2478,7 @@ Por Conta apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 256 + 278 @@ -2526,7 +2526,7 @@ Por País apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 177 + 255 @@ -2534,7 +2534,7 @@ Regiões apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 203 + 201 apps/client/src/app/pages/public/public-page.html @@ -2546,7 +2546,7 @@ Mercados Desenvoldidos apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 226 + 224 apps/client/src/app/pages/public/public-page.html @@ -2558,7 +2558,7 @@ Mercados Emergentes apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 235 + 233 apps/client/src/app/pages/public/public-page.html @@ -2570,7 +2570,7 @@ Outros Mercados apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 244 + 242 apps/client/src/app/pages/public/public-page.html @@ -2990,7 +2990,7 @@ Classe de Ativo libs/ui/src/lib/i18n.ts - 5 + 6 @@ -2998,7 +2998,7 @@ Fundo de Emergência libs/ui/src/lib/i18n.ts - 11 + 12 @@ -3006,11 +3006,11 @@ Outro libs/ui/src/lib/i18n.ts - 18 + 20 libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 373 + 384 @@ -3018,7 +3018,7 @@ Símbolo libs/ui/src/lib/i18n.ts - 23 + 25 @@ -3026,7 +3026,7 @@ Marcador libs/ui/src/lib/i18n.ts - 24 + 26 @@ -3034,7 +3034,7 @@ Dinheiro libs/ui/src/lib/i18n.ts - 36 + 38 @@ -3042,7 +3042,7 @@ Matéria-prima libs/ui/src/lib/i18n.ts - 37 + 39 @@ -3050,7 +3050,7 @@ Ações libs/ui/src/lib/i18n.ts - 38 + 40 @@ -3058,7 +3058,7 @@ Rendimento Fixo libs/ui/src/lib/i18n.ts - 39 + 41 @@ -3066,7 +3066,7 @@ Imobiliário libs/ui/src/lib/i18n.ts - 40 + 42 @@ -3074,7 +3074,7 @@ Obrigação libs/ui/src/lib/i18n.ts - 43 + 45 @@ -3082,7 +3082,7 @@ Criptomoedas libs/ui/src/lib/i18n.ts - 44 + 46 @@ -3090,7 +3090,7 @@ ETF libs/ui/src/lib/i18n.ts - 45 + 47 @@ -3098,7 +3098,7 @@ Fundo de Investimento libs/ui/src/lib/i18n.ts - 46 + 48 @@ -3106,7 +3106,7 @@ Metal Precioso libs/ui/src/lib/i18n.ts - 47 + 49 @@ -3114,7 +3114,7 @@ Private Equity libs/ui/src/lib/i18n.ts - 48 + 50 @@ -3122,7 +3122,7 @@ Ação libs/ui/src/lib/i18n.ts - 49 + 51 @@ -3130,7 +3130,7 @@ África libs/ui/src/lib/i18n.ts - 52 + 54 @@ -3138,7 +3138,7 @@ Ásia libs/ui/src/lib/i18n.ts - 53 + 55 @@ -3146,7 +3146,7 @@ Europa libs/ui/src/lib/i18n.ts - 54 + 56 @@ -3154,7 +3154,7 @@ América do Norte libs/ui/src/lib/i18n.ts - 55 + 57 @@ -3162,7 +3162,7 @@ Oceânia libs/ui/src/lib/i18n.ts - 56 + 58 @@ -3170,7 +3170,7 @@ América do Sul libs/ui/src/lib/i18n.ts - 57 + 59 @@ -3186,11 +3186,11 @@ Sem dados disponíveis libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 375 + 386 libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 388 + 399 @@ -3310,7 +3310,7 @@ libs/ui/src/lib/i18n.ts - 30 + 32 @@ -3326,7 +3326,7 @@ Subclasse de Ativos libs/ui/src/lib/i18n.ts - 6 + 7 @@ -3334,7 +3334,7 @@ Títulos libs/ui/src/lib/i18n.ts - 22 + 24 @@ -3382,7 +3382,7 @@ Núcleo libs/ui/src/lib/i18n.ts - 7 + 8 @@ -3390,7 +3390,7 @@ Conceder libs/ui/src/lib/i18n.ts - 12 + 13 @@ -3398,7 +3398,7 @@ Risco mais Elevado libs/ui/src/lib/i18n.ts - 13 + 14 @@ -3406,7 +3406,7 @@ Risco menos Elevado libs/ui/src/lib/i18n.ts - 15 + 17 @@ -3414,7 +3414,7 @@ Provisão de Reforma libs/ui/src/lib/i18n.ts - 20 + 22 @@ -3422,7 +3422,7 @@ Satélite libs/ui/src/lib/i18n.ts - 21 + 23 @@ -3726,7 +3726,7 @@ Mude para o Ghostfolio Premium facilmente libs/ui/src/lib/i18n.ts - 9 + 10 @@ -3750,7 +3750,7 @@ Mude para o Ghostfolio Premium ou Ghostfolio Open Source facilmente libs/ui/src/lib/i18n.ts - 8 + 9 @@ -3758,7 +3758,7 @@ Mude para o Ghostfolio Open Source ou Ghostfolio Basic facilmente libs/ui/src/lib/i18n.ts - 10 + 11 @@ -3870,7 +3870,7 @@ Por Prestador de ETF apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 276 + 298 @@ -3990,7 +3990,7 @@ Essa atividade já existe. libs/ui/src/lib/i18n.ts - 14 + 15 @@ -4102,7 +4102,7 @@ Meses libs/ui/src/lib/i18n.ts - 17 + 19 @@ -4110,7 +4110,7 @@ Anos libs/ui/src/lib/i18n.ts - 26 + 28 @@ -4118,7 +4118,7 @@ Mês libs/ui/src/lib/i18n.ts - 16 + 18 @@ -4126,7 +4126,7 @@ Ano libs/ui/src/lib/i18n.ts - 25 + 27 @@ -4282,7 +4282,7 @@ Liability libs/ui/src/lib/i18n.ts - 32 + 34 @@ -7018,7 +7018,7 @@ Buy libs/ui/src/lib/i18n.ts - 29 + 31 @@ -7026,7 +7026,7 @@ Valuable libs/ui/src/lib/i18n.ts - 31 + 33 @@ -7058,7 +7058,31 @@ Preset libs/ui/src/lib/i18n.ts - 19 + 21 + + + + By Market + By Market + + apps/client/src/app/pages/portfolio/allocations/allocations-page.html + 177 + + + + Asia-Pacific + Asia-Pacific + + libs/ui/src/lib/i18n.ts + 5 + + + + Japan + Japan + + libs/ui/src/lib/i18n.ts + 16 diff --git a/apps/client/src/locales/messages.xlf b/apps/client/src/locales/messages.xlf index 0b84474c5..c591ef78d 100644 --- a/apps/client/src/locales/messages.xlf +++ b/apps/client/src/locales/messages.xlf @@ -1792,7 +1792,7 @@ By Account apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 256 + 278 @@ -1834,14 +1834,14 @@ By Country apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 177 + 255 Regions apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 203 + 201 apps/client/src/app/pages/public/public-page.html @@ -1967,7 +1967,7 @@ Sell libs/ui/src/lib/i18n.ts - 33 + 35 @@ -2344,7 +2344,7 @@ Developed Markets apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 226 + 224 apps/client/src/app/pages/public/public-page.html @@ -2388,7 +2388,7 @@ Other Markets apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 244 + 242 apps/client/src/app/pages/public/public-page.html @@ -2399,7 +2399,7 @@ Emerging Markets apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 235 + 233 apps/client/src/app/pages/public/public-page.html @@ -2528,7 +2528,7 @@ Filter by account or tag... apps/client/src/app/pages/portfolio/allocations/allocations-page.component.ts - 139 + 141 apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts @@ -2673,35 +2673,35 @@ Precious Metal libs/ui/src/lib/i18n.ts - 47 + 49 Tag libs/ui/src/lib/i18n.ts - 24 + 26 Equity libs/ui/src/lib/i18n.ts - 38 + 40 Real Estate libs/ui/src/lib/i18n.ts - 40 + 42 Cryptocurrency libs/ui/src/lib/i18n.ts - 44 + 46 @@ -2715,141 +2715,141 @@ Stock libs/ui/src/lib/i18n.ts - 49 + 51 Private Equity libs/ui/src/lib/i18n.ts - 48 + 50 Asset Class libs/ui/src/lib/i18n.ts - 5 + 6 Mutual Fund libs/ui/src/lib/i18n.ts - 46 + 48 Cash libs/ui/src/lib/i18n.ts - 36 + 38 Symbol libs/ui/src/lib/i18n.ts - 23 + 25 Commodity libs/ui/src/lib/i18n.ts - 37 + 39 Bond libs/ui/src/lib/i18n.ts - 43 + 45 ETF libs/ui/src/lib/i18n.ts - 45 + 47 Fixed Income libs/ui/src/lib/i18n.ts - 39 + 41 No data available libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 375 + 386 libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 388 + 399 Emergency Fund libs/ui/src/lib/i18n.ts - 11 + 12 Other libs/ui/src/lib/i18n.ts - 18 + 20 libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 373 + 384 North America libs/ui/src/lib/i18n.ts - 55 + 57 Africa libs/ui/src/lib/i18n.ts - 52 + 54 Oceania libs/ui/src/lib/i18n.ts - 56 + 58 Asia libs/ui/src/lib/i18n.ts - 53 + 55 South America libs/ui/src/lib/i18n.ts - 57 + 59 Europe libs/ui/src/lib/i18n.ts - 54 + 56 @@ -2940,7 +2940,7 @@ Asset Sub Class libs/ui/src/lib/i18n.ts - 6 + 7 @@ -2951,7 +2951,7 @@ libs/ui/src/lib/i18n.ts - 30 + 32 @@ -2965,7 +2965,7 @@ Securities libs/ui/src/lib/i18n.ts - 22 + 24 @@ -3062,42 +3062,42 @@ Higher Risk libs/ui/src/lib/i18n.ts - 13 + 14 Lower Risk libs/ui/src/lib/i18n.ts - 15 + 17 Grant libs/ui/src/lib/i18n.ts - 12 + 13 Core libs/ui/src/lib/i18n.ts - 7 + 8 Satellite libs/ui/src/lib/i18n.ts - 21 + 23 Retirement Provision libs/ui/src/lib/i18n.ts - 20 + 22 @@ -3366,7 +3366,7 @@ Switch to Ghostfolio Premium easily libs/ui/src/lib/i18n.ts - 9 + 10 @@ -3388,14 +3388,14 @@ Switch to Ghostfolio Open Source or Ghostfolio Basic easily libs/ui/src/lib/i18n.ts - 10 + 11 Switch to Ghostfolio Premium or Ghostfolio Open Source easily libs/ui/src/lib/i18n.ts - 8 + 9 @@ -3487,7 +3487,7 @@ By ETF Provider apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 276 + 298 @@ -3614,7 +3614,7 @@ This activity already exists. libs/ui/src/lib/i18n.ts - 14 + 15 @@ -3706,14 +3706,14 @@ Months libs/ui/src/lib/i18n.ts - 17 + 19 Years libs/ui/src/lib/i18n.ts - 26 + 28 @@ -3727,14 +3727,14 @@ Year libs/ui/src/lib/i18n.ts - 25 + 27 Month libs/ui/src/lib/i18n.ts - 16 + 18 @@ -3865,7 +3865,7 @@ Liability libs/ui/src/lib/i18n.ts - 32 + 34 @@ -6567,14 +6567,14 @@ Buy libs/ui/src/lib/i18n.ts - 29 + 31 Valuable libs/ui/src/lib/i18n.ts - 31 + 33 @@ -6613,7 +6613,7 @@ Preset libs/ui/src/lib/i18n.ts - 19 + 21 @@ -6623,6 +6623,27 @@ 184 + + By Market + + apps/client/src/app/pages/portfolio/allocations/allocations-page.html + 177 + + + + Asia-Pacific + + libs/ui/src/lib/i18n.ts + 5 + + + + Japan + + libs/ui/src/lib/i18n.ts + 16 + + diff --git a/libs/common/src/lib/interfaces/portfolio-position.interface.ts b/libs/common/src/lib/interfaces/portfolio-position.interface.ts index a398c8c90..76334ea0b 100644 --- a/libs/common/src/lib/interfaces/portfolio-position.interface.ts +++ b/libs/common/src/lib/interfaces/portfolio-position.interface.ts @@ -1,6 +1,6 @@ import { AssetClass, AssetSubClass, DataSource, Tag } from '@prisma/client'; -import { Market, MarketState } from '../types'; +import { Market, MarketAdvanced, MarketState } from '../types'; import { Country } from './country.interface'; import { Sector } from './sector.interface'; @@ -20,6 +20,7 @@ export interface PortfolioPosition { marketChangePercent?: number; marketPrice: number; markets?: { [key in Market]: number }; + marketsAdvanced?: { [key in MarketAdvanced]: number }; marketState: MarketState; name: string; netPerformance: number; diff --git a/libs/common/src/lib/types/index.ts b/libs/common/src/lib/types/index.ts index 063bea05d..2af65d404 100644 --- a/libs/common/src/lib/types/index.ts +++ b/libs/common/src/lib/types/index.ts @@ -5,6 +5,7 @@ import type { ColorScheme } from './color-scheme.type'; import type { DateRange } from './date-range.type'; import type { Granularity } from './granularity.type'; import type { GroupBy } from './group-by.type'; +import type { MarketAdvanced } from './market-advanced.type'; import type { MarketDataPreset } from './market-data-preset.type'; import type { MarketState } from './market-state.type'; import type { Market } from './market.type'; @@ -24,6 +25,7 @@ export type { Granularity, GroupBy, Market, + MarketAdvanced, MarketDataPreset, MarketState, OrderWithAccount, diff --git a/libs/common/src/lib/types/market-advanced.type.ts b/libs/common/src/lib/types/market-advanced.type.ts new file mode 100644 index 000000000..0d30a8ea1 --- /dev/null +++ b/libs/common/src/lib/types/market-advanced.type.ts @@ -0,0 +1,7 @@ +export type MarketAdvanced = + | 'asiaPacific' + | 'emergingMarkets' + | 'europe' + | 'japan' + | 'northAmerica' + | 'otherMarkets'; diff --git a/libs/ui/src/lib/i18n.ts b/libs/ui/src/lib/i18n.ts index cf36e99bf..fc622c074 100644 --- a/libs/ui/src/lib/i18n.ts +++ b/libs/ui/src/lib/i18n.ts @@ -2,6 +2,7 @@ import '@angular/localize/init'; const locales = { ACCOUNT: $localize`Account`, + 'Asia-Pacific': $localize`Asia-Pacific`, ASSET_CLASS: $localize`Asset Class`, ASSET_SUB_CLASS: $localize`Asset Sub Class`, CORE: $localize`Core`, @@ -12,6 +13,7 @@ const locales = { GRANT: $localize`Grant`, HIGHER_RISK: $localize`Higher Risk`, IMPORT_ACTIVITY_ERROR_IS_DUPLICATE: $localize`This activity already exists.`, + Japan: $localize`Japan`, LOWER_RISK: $localize`Lower Risk`, MONTH: $localize`Month`, MONTHS: $localize`Months`, diff --git a/libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts b/libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts index ec0a63eea..dfb2a2c92 100644 --- a/libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts +++ b/libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts @@ -90,7 +90,7 @@ export class PortfolioProportionChartComponent [symbol: string]: { color?: string; name: string; - subCategory: { [symbol: string]: { value: Big } }; + subCategory?: { [symbol: string]: { value: Big } }; value: Big; }; } = {}; @@ -99,65 +99,76 @@ export class PortfolioProportionChartComponent [UNKNOWN_KEY]: `rgba(${getTextColor(this.colorScheme)}, 0.12)` }; - Object.keys(this.positions).forEach((symbol) => { - if (this.positions[symbol][this.keys[0]]?.toUpperCase()) { - if (chartData[this.positions[symbol][this.keys[0]].toUpperCase()]) { - chartData[this.positions[symbol][this.keys[0]].toUpperCase()].value = + if (this.keys.length > 0) { + Object.keys(this.positions).forEach((symbol) => { + if (this.positions[symbol][this.keys[0]]?.toUpperCase()) { + if (chartData[this.positions[symbol][this.keys[0]].toUpperCase()]) { chartData[ this.positions[symbol][this.keys[0]].toUpperCase() + ].value = chartData[ + this.positions[symbol][this.keys[0]].toUpperCase() ].value.plus(this.positions[symbol].value); - if ( - chartData[this.positions[symbol][this.keys[0]].toUpperCase()] - .subCategory[this.positions[symbol][this.keys[1]]] - ) { - chartData[ - this.positions[symbol][this.keys[0]].toUpperCase() - ].subCategory[this.positions[symbol][this.keys[1]]].value = + if ( + chartData[this.positions[symbol][this.keys[0]].toUpperCase()] + .subCategory[this.positions[symbol][this.keys[1]]] + ) { + chartData[ + this.positions[symbol][this.keys[0]].toUpperCase() + ].subCategory[this.positions[symbol][this.keys[1]]].value = + chartData[ + this.positions[symbol][this.keys[0]].toUpperCase() + ].subCategory[this.positions[symbol][this.keys[1]]].value.plus( + this.positions[symbol].value + ); + } else { chartData[ this.positions[symbol][this.keys[0]].toUpperCase() - ].subCategory[this.positions[symbol][this.keys[1]]].value.plus( - this.positions[symbol].value - ); + ].subCategory[ + this.positions[symbol][this.keys[1]] ?? UNKNOWN_KEY + ] = { value: new Big(this.positions[symbol].value) }; + } } else { - chartData[ - this.positions[symbol][this.keys[0]].toUpperCase() - ].subCategory[this.positions[symbol][this.keys[1]] ?? UNKNOWN_KEY] = - { value: new Big(this.positions[symbol].value) }; + chartData[this.positions[symbol][this.keys[0]].toUpperCase()] = { + name: this.positions[symbol][this.keys[0]], + subCategory: {}, + value: new Big(this.positions[symbol].value ?? 0) + }; + + if (this.positions[symbol][this.keys[1]]) { + chartData[ + this.positions[symbol][this.keys[0]].toUpperCase() + ].subCategory = { + [this.positions[symbol][this.keys[1]]]: { + value: new Big(this.positions[symbol].value) + } + }; + } } } else { - chartData[this.positions[symbol][this.keys[0]].toUpperCase()] = { - name: this.positions[symbol][this.keys[0]], - subCategory: {}, - value: new Big(this.positions[symbol].value ?? 0) - }; - - if (this.positions[symbol][this.keys[1]]) { - chartData[ - this.positions[symbol][this.keys[0]].toUpperCase() - ].subCategory = { - [this.positions[symbol][this.keys[1]]]: { - value: new Big(this.positions[symbol].value) - } + if (chartData[UNKNOWN_KEY]) { + chartData[UNKNOWN_KEY].value = chartData[UNKNOWN_KEY].value.plus( + this.positions[symbol].value + ); + } else { + chartData[UNKNOWN_KEY] = { + name: this.positions[symbol].name, + subCategory: this.keys[1] + ? { [this.keys[1]]: { value: new Big(0) } } + : undefined, + value: new Big(this.positions[symbol].value) }; } } - } else { - if (chartData[UNKNOWN_KEY]) { - chartData[UNKNOWN_KEY].value = chartData[UNKNOWN_KEY].value.plus( - this.positions[symbol].value - ); - } else { - chartData[UNKNOWN_KEY] = { - name: this.positions[symbol].name, - subCategory: this.keys[1] - ? { [this.keys[1]]: { value: new Big(0) } } - : undefined, - value: new Big(this.positions[symbol].value) - }; - } - } - }); + }); + } else { + Object.keys(this.positions).forEach((symbol) => { + chartData[symbol] = { + name: this.positions[symbol].name, + value: new Big(this.positions[symbol].value) + }; + }); + } let chartDataSorted = Object.entries(chartData) .sort((a, b) => { From 0866587cabfeae55a21298bde2a29bf2fdfb7443 Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Mon, 24 Jul 2023 20:12:07 +0200 Subject: [PATCH 08/10] Increase frequency (#2169) --- apps/api/src/app/user/user.service.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/api/src/app/user/user.service.ts b/apps/api/src/app/user/user.service.ts index d5a3e2e00..19ead8bd7 100644 --- a/apps/api/src/app/user/user.service.ts +++ b/apps/api/src/app/user/user.service.ts @@ -166,7 +166,7 @@ export class UserService { this.subscriptionService.getSubscription(Subscription); if ( - Analytics?.activityCount % 10 === 0 && + Analytics?.activityCount % 5 === 0 && user.subscription?.type === 'Basic' ) { currentPermissions.push(permissions.enableSubscriptionInterstitial); From ca7bf27c20869b34a95f7fdfd25f43d305c769f0 Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Mon, 24 Jul 2023 20:16:14 +0200 Subject: [PATCH 09/10] Feature/upgrade yahoo finance2 to version 2.4.3 (#2174) * Upgrade yahoo-finance2 to version 2.4.3 * Update changelog --- CHANGELOG.md | 4 ++++ package.json | 2 +- yarn.lock | 8 ++++---- 3 files changed, 9 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9764963fb..45aae62e5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Introduced the allocations by market chart on the allocations page +### Changed + +- Upgraded `yahoo-finance2` from version `2.4.2` to `2.4.3` + ### Fixed - Fixed an issue in the public page diff --git a/package.json b/package.json index 6c886addc..8bdee7879 100644 --- a/package.json +++ b/package.json @@ -127,7 +127,7 @@ "svgmap": "2.6.0", "twitter-api-v2": "1.14.2", "uuid": "9.0.0", - "yahoo-finance2": "2.4.2", + "yahoo-finance2": "2.4.3", "zone.js": "0.12.0" }, "devDependencies": { diff --git a/yarn.lock b/yarn.lock index 742b3f63f..ae2408f57 100644 --- a/yarn.lock +++ b/yarn.lock @@ -17558,10 +17558,10 @@ y18n@^5.0.5: resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== -yahoo-finance2@2.4.2: - version "2.4.2" - resolved "https://registry.yarnpkg.com/yahoo-finance2/-/yahoo-finance2-2.4.2.tgz#b21ae13e20e9c9cb081011fb8a2d74b5d74cf210" - integrity sha512-Ze9UeW3vM/4thklQMbZNpvBWXf4Eys86QV2n2L21WqHJLvF2dedzVPGJJvRrslElI5UW4ry1x8QAUVfyPQm1TA== +yahoo-finance2@2.4.3: + version "2.4.3" + resolved "https://registry.yarnpkg.com/yahoo-finance2/-/yahoo-finance2-2.4.3.tgz#be4099182dc0a2e2908779e04d7b802688c15f0e" + integrity sha512-LVcl+h4XBMe3N/l8BOZdDFoK7AGMiblSBE00dU9t2zB0Zfxa6QQMESnUkJ1m35RWBr8QXFJyJnToPt+qKiEQXQ== dependencies: "@types/tough-cookie" "^4.0.2" ajv "8.10.0" From af008aa74feda4601335457493cf341ac1bb26f0 Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Mon, 24 Jul 2023 20:17:46 +0200 Subject: [PATCH 10/10] Release 1.292.0 (#2175) --- CHANGELOG.md | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 45aae62e5..1be362416 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 +## 1.292.0 - 2023-07-24 ### Added diff --git a/package.json b/package.json index 8bdee7879..eea40d16d 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "ghostfolio", - "version": "1.291.0", + "version": "1.292.0", "homepage": "https://ghostfol.io", "license": "AGPL-3.0", "scripts": {