diff --git a/CHANGELOG.md b/CHANGELOG.md index b7000313..d90589ac 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## Unreleased +### Added + +- Added a new static portfolio analysis rule: Emergency fund setup + ### Changed - Set up the _Inter_ font family diff --git a/apps/api/src/app/portfolio/portfolio.service.ts b/apps/api/src/app/portfolio/portfolio.service.ts index e9d0b279..b9d6cef1 100644 --- a/apps/api/src/app/portfolio/portfolio.service.ts +++ b/apps/api/src/app/portfolio/portfolio.service.ts @@ -10,6 +10,7 @@ import { AccountClusterRiskCurrentInvestment } from '@ghostfolio/api/models/rule import { AccountClusterRiskSingleAccount } from '@ghostfolio/api/models/rules/account-cluster-risk/single-account'; import { CurrencyClusterRiskBaseCurrencyCurrentInvestment } from '@ghostfolio/api/models/rules/currency-cluster-risk/base-currency-current-investment'; import { CurrencyClusterRiskCurrentInvestment } from '@ghostfolio/api/models/rules/currency-cluster-risk/current-investment'; +import { EmergencyFundSetup } from '@ghostfolio/api/models/rules/emergency-fund/emergency-fund-setup'; import { FeeRatioInitialInvestment } from '@ghostfolio/api/models/rules/fees/fee-ratio-initial-investment'; import { DataProviderService } from '@ghostfolio/api/services/data-provider/data-provider.service'; import { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.service'; @@ -1214,12 +1215,6 @@ export class PortfolioService { userId }); - if (isEmpty(orders)) { - return { - rules: {} - }; - } - const portfolioCalculator = new PortfolioCalculator({ currency: userCurrency, currentRateService: this.currentRateService, @@ -1228,7 +1223,9 @@ export class PortfolioService { portfolioCalculator.setTransactionPoints(transactionPoints); - const portfolioStart = parseDate(transactionPoints[0].date); + const portfolioStart = parseDate( + transactionPoints[0]?.date ?? format(new Date(), DATE_FORMAT) + ); const currentPositions = await portfolioCalculator.getCurrentPositions(portfolioStart); @@ -1249,33 +1246,48 @@ export class PortfolioService { userId }); + const userSettings = this.request.user.Settings.settings; + return { rules: { - accountClusterRisk: await this.rulesService.evaluate( - [ - new AccountClusterRiskCurrentInvestment( - this.exchangeRateDataService, - accounts + accountClusterRisk: isEmpty(orders) + ? undefined + : await this.rulesService.evaluate( + [ + new AccountClusterRiskCurrentInvestment( + this.exchangeRateDataService, + accounts + ), + new AccountClusterRiskSingleAccount( + this.exchangeRateDataService, + accounts + ) + ], + userSettings ), - new AccountClusterRiskSingleAccount( + currencyClusterRisk: isEmpty(orders) + ? undefined + : await this.rulesService.evaluate( + [ + new CurrencyClusterRiskBaseCurrencyCurrentInvestment( + this.exchangeRateDataService, + positions + ), + new CurrencyClusterRiskCurrentInvestment( + this.exchangeRateDataService, + positions + ) + ], + userSettings + ), + emergencyFund: await this.rulesService.evaluate( + [ + new EmergencyFundSetup( this.exchangeRateDataService, - accounts + userSettings.emergencyFund ) ], - this.request.user.Settings.settings - ), - currencyClusterRisk: await this.rulesService.evaluate( - [ - new CurrencyClusterRiskBaseCurrencyCurrentInvestment( - this.exchangeRateDataService, - positions - ), - new CurrencyClusterRiskCurrentInvestment( - this.exchangeRateDataService, - positions - ) - ], - this.request.user.Settings.settings + userSettings ), fees: await this.rulesService.evaluate( [ @@ -1285,7 +1297,7 @@ export class PortfolioService { this.getFees({ userCurrency, activities: orders }).toNumber() ) ], - this.request.user.Settings.settings + userSettings ) } }; diff --git a/apps/api/src/models/rules/account-cluster-risk/current-investment.ts b/apps/api/src/models/rules/account-cluster-risk/current-investment.ts index d0cdbb58..23d3307d 100644 --- a/apps/api/src/models/rules/account-cluster-risk/current-investment.ts +++ b/apps/api/src/models/rules/account-cluster-risk/current-investment.ts @@ -1,4 +1,5 @@ import { RuleSettings } from '@ghostfolio/api/models/interfaces/rule-settings.interface'; +import { Rule } from '@ghostfolio/api/models/rule'; import { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.service'; import { PortfolioDetails, @@ -6,16 +7,18 @@ import { UserSettings } from '@ghostfolio/common/interfaces'; -import { Rule } from '../../rule'; - export class AccountClusterRiskCurrentInvestment extends Rule { + private accounts: PortfolioDetails['accounts']; + public constructor( protected exchangeRateDataService: ExchangeRateDataService, - private accounts: PortfolioDetails['accounts'] + accounts: PortfolioDetails['accounts'] ) { super(exchangeRateDataService, { name: 'Investment' }); + + this.accounts = accounts; } public evaluate(ruleSettings: Settings) { diff --git a/apps/api/src/models/rules/account-cluster-risk/single-account.ts b/apps/api/src/models/rules/account-cluster-risk/single-account.ts index 3be323d7..b5028228 100644 --- a/apps/api/src/models/rules/account-cluster-risk/single-account.ts +++ b/apps/api/src/models/rules/account-cluster-risk/single-account.ts @@ -1,17 +1,20 @@ import { RuleSettings } from '@ghostfolio/api/models/interfaces/rule-settings.interface'; +import { Rule } from '@ghostfolio/api/models/rule'; import { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.service'; import { PortfolioDetails, UserSettings } from '@ghostfolio/common/interfaces'; -import { Rule } from '../../rule'; - export class AccountClusterRiskSingleAccount extends Rule { + private accounts: PortfolioDetails['accounts']; + public constructor( protected exchangeRateDataService: ExchangeRateDataService, - private accounts: PortfolioDetails['accounts'] + accounts: PortfolioDetails['accounts'] ) { super(exchangeRateDataService, { name: 'Single Account' }); + + this.accounts = accounts; } public evaluate() { diff --git a/apps/api/src/models/rules/currency-cluster-risk/base-currency-current-investment.ts b/apps/api/src/models/rules/currency-cluster-risk/base-currency-current-investment.ts index 2facb880..a23a208c 100644 --- a/apps/api/src/models/rules/currency-cluster-risk/base-currency-current-investment.ts +++ b/apps/api/src/models/rules/currency-cluster-risk/base-currency-current-investment.ts @@ -1,17 +1,20 @@ import { RuleSettings } from '@ghostfolio/api/models/interfaces/rule-settings.interface'; +import { Rule } from '@ghostfolio/api/models/rule'; import { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.service'; import { TimelinePosition, UserSettings } from '@ghostfolio/common/interfaces'; -import { Rule } from '../../rule'; - export class CurrencyClusterRiskBaseCurrencyCurrentInvestment extends Rule { + private positions: TimelinePosition[]; + public constructor( protected exchangeRateDataService: ExchangeRateDataService, - private positions: TimelinePosition[] + positions: TimelinePosition[] ) { super(exchangeRateDataService, { name: 'Investment: Base Currency' }); + + this.positions = positions; } public evaluate(ruleSettings: Settings) { diff --git a/apps/api/src/models/rules/currency-cluster-risk/current-investment.ts b/apps/api/src/models/rules/currency-cluster-risk/current-investment.ts index 2d69865f..bd6e060e 100644 --- a/apps/api/src/models/rules/currency-cluster-risk/current-investment.ts +++ b/apps/api/src/models/rules/currency-cluster-risk/current-investment.ts @@ -1,17 +1,20 @@ import { RuleSettings } from '@ghostfolio/api/models/interfaces/rule-settings.interface'; +import { Rule } from '@ghostfolio/api/models/rule'; import { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.service'; import { TimelinePosition, UserSettings } from '@ghostfolio/common/interfaces'; -import { Rule } from '../../rule'; - export class CurrencyClusterRiskCurrentInvestment extends Rule { + private positions: TimelinePosition[]; + public constructor( protected exchangeRateDataService: ExchangeRateDataService, - private positions: TimelinePosition[] + positions: TimelinePosition[] ) { super(exchangeRateDataService, { name: 'Investment' }); + + this.positions = positions; } public evaluate(ruleSettings: Settings) { diff --git a/apps/api/src/models/rules/emergency-fund/emergency-fund-setup.ts b/apps/api/src/models/rules/emergency-fund/emergency-fund-setup.ts new file mode 100644 index 00000000..b6248ab5 --- /dev/null +++ b/apps/api/src/models/rules/emergency-fund/emergency-fund-setup.ts @@ -0,0 +1,46 @@ +import { RuleSettings } from '@ghostfolio/api/models/interfaces/rule-settings.interface'; +import { Rule } from '@ghostfolio/api/models/rule'; +import { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.service'; +import { UserSettings } from '@ghostfolio/common/interfaces'; + +export class EmergencyFundSetup extends Rule { + private emergencyFund: number; + + public constructor( + protected exchangeRateDataService: ExchangeRateDataService, + emergencyFund: number + ) { + super(exchangeRateDataService, { + name: 'Emergency Fund: Set up' + }); + + this.emergencyFund = emergencyFund; + } + + public evaluate(ruleSettings: Settings) { + if (this.emergencyFund > ruleSettings.threshold) { + return { + evaluation: 'An emergency fund has been set up', + value: true + }; + } + + return { + evaluation: 'No emergency fund has been set up', + value: false + }; + } + + public getSettings(aUserSettings: UserSettings): Settings { + return { + baseCurrency: aUserSettings.baseCurrency, + isActive: true, + threshold: 0 + }; + } +} + +interface Settings extends RuleSettings { + baseCurrency: string; + threshold: number; +} diff --git a/apps/api/src/models/rules/fees/fee-ratio-initial-investment.ts b/apps/api/src/models/rules/fees/fee-ratio-initial-investment.ts index dfe375c4..0ba70d23 100644 --- a/apps/api/src/models/rules/fees/fee-ratio-initial-investment.ts +++ b/apps/api/src/models/rules/fees/fee-ratio-initial-investment.ts @@ -1,22 +1,29 @@ import { RuleSettings } from '@ghostfolio/api/models/interfaces/rule-settings.interface'; +import { Rule } from '@ghostfolio/api/models/rule'; import { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.service'; import { UserSettings } from '@ghostfolio/common/interfaces'; -import { Rule } from '../../rule'; - export class FeeRatioInitialInvestment extends Rule { + private fees: number; + private totalInvestment: number; + public constructor( protected exchangeRateDataService: ExchangeRateDataService, - private totalInvestment: number, - private fees: number + totalInvestment: number, + fees: number ) { super(exchangeRateDataService, { - name: 'Investment' + name: 'Fee Ratio' }); + + this.fees = fees; + this.totalInvestment = totalInvestment; } public evaluate(ruleSettings: Settings) { - const feeRatio = this.fees / this.totalInvestment; + const feeRatio = this.totalInvestment + ? this.fees / this.totalInvestment + : 0; if (feeRatio > ruleSettings.threshold) { return { 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 58d0b370..909ca774 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 @@ -18,6 +18,7 @@ export class FirePageComponent implements OnDestroy, OnInit { public accountClusterRiskRules: PortfolioReportRule[]; public currencyClusterRiskRules: PortfolioReportRule[]; public deviceType: string; + public emergencyFundRules: PortfolioReportRule[]; public feeRules: PortfolioReportRule[]; public fireWealth: Big; public hasImpersonationId: boolean; @@ -67,6 +68,8 @@ export class FirePageComponent implements OnDestroy, OnInit { portfolioReport.rules['accountClusterRisk'] || null; this.currencyClusterRiskRules = portfolioReport.rules['currencyClusterRisk'] || null; + this.emergencyFundRules = + portfolioReport.rules['emergencyFund'] || null; this.feeRules = portfolioReport.rules['fees'] || null; this.changeDetectorRef.markForCheck(); diff --git a/apps/client/src/app/pages/portfolio/fire/fire-page.html b/apps/client/src/app/pages/portfolio/fire/fire-page.html index 793eadc7..2e852257 100644 --- a/apps/client/src/app/pages/portfolio/fire/fire-page.html +++ b/apps/client/src/app/pages/portfolio/fire/fire-page.html @@ -96,8 +96,10 @@

X-ray

- Ghostfolio X-ray uses static analysis to identify potential issues and - risks in your portfolio. + Ghostfolio X-ray uses static analysis to identify potential issues + and risks in your portfolio. It will be highly configurable in the future: activate / deactivate rules and customize the thresholds to match your personal investment @@ -106,7 +108,20 @@

- Currency Cluster RisksEmergency Fund +

+ +
+
+

+ Currency Cluster Risks

- Account Cluster RisksAccount Cluster Risks

- FeesFeesapps/client/src/app/pages/features/features-page.html 89 + + apps/client/src/app/pages/portfolio/fire/fire-page.html + 150 + Buying Power @@ -1590,6 +1594,10 @@ apps/client/src/app/pages/blog/2023/09/ghostfolio-2/ghostfolio-2-page.html 273 + + apps/client/src/app/pages/blog/2023/09/hacktoberfest-2023/hacktoberfest-2023-page.html + 181 + apps/client/src/app/pages/blog/blog-page.html 5 @@ -3734,6 +3742,10 @@ apps/client/src/app/components/position/position-detail-dialog/position-detail-dialog.html 148 + + apps/client/src/app/pages/portfolio/fire/fire-page.html + 137 + Portfolio Allocations @@ -8130,6 +8142,10 @@ apps/client/src/app/pages/blog/2023/09/ghostfolio-2/ghostfolio-2-page.component.ts 14 + + apps/client/src/app/pages/blog/2023/09/hacktoberfest-2023/hacktoberfest-2023-page.component.ts + 13 + apps/client/src/app/pages/landing/landing-page.component.ts 25 @@ -9927,6 +9943,30 @@ 312 + + Ghostfolio X-ray uses static analysis to identify potential issues and risks in your portfolio. + Ghostfolio X-ray nutzt statische Analysen, um potenzielle Probleme und Risiken in deinem Portfolio zu identifizieren. + + apps/client/src/app/pages/portfolio/fire/fire-page.html + 100,101 + + + + Currency Cluster Risks + Währungsklumpenrisiken + + apps/client/src/app/pages/portfolio/fire/fire-page.html + 111 + + + + Account Cluster Risks + Kontoklumpenrisiken + + apps/client/src/app/pages/portfolio/fire/fire-page.html + 124 + + diff --git a/apps/client/src/locales/messages.es.xlf b/apps/client/src/locales/messages.es.xlf index 0cc0dcf6..bbb2d41a 100644 --- a/apps/client/src/locales/messages.es.xlf +++ b/apps/client/src/locales/messages.es.xlf @@ -1272,6 +1272,10 @@ apps/client/src/app/pages/features/features-page.html 89 + + apps/client/src/app/pages/portfolio/fire/fire-page.html + 150 + Buying Power @@ -1588,6 +1592,10 @@ apps/client/src/app/pages/blog/2023/09/ghostfolio-2/ghostfolio-2-page.html 273 + + apps/client/src/app/pages/blog/2023/09/hacktoberfest-2023/hacktoberfest-2023-page.html + 181 + apps/client/src/app/pages/blog/blog-page.html 5 @@ -3732,6 +3740,10 @@ apps/client/src/app/components/position/position-detail-dialog/position-detail-dialog.html 148 + + apps/client/src/app/pages/portfolio/fire/fire-page.html + 137 + Portfolio Allocations @@ -8128,6 +8140,10 @@ apps/client/src/app/pages/blog/2023/09/ghostfolio-2/ghostfolio-2-page.component.ts 14 + + apps/client/src/app/pages/blog/2023/09/hacktoberfest-2023/hacktoberfest-2023-page.component.ts + 13 + apps/client/src/app/pages/landing/landing-page.component.ts 25 @@ -9925,6 +9941,30 @@ 312 + + Ghostfolio X-ray uses static analysis to identify potential issues and risks in your portfolio. + Ghostfolio X-ray uses static analysis to identify potential issues and risks in your portfolio. + + apps/client/src/app/pages/portfolio/fire/fire-page.html + 100,101 + + + + Currency Cluster Risks + Currency Cluster Risks + + apps/client/src/app/pages/portfolio/fire/fire-page.html + 111 + + + + Account Cluster Risks + Account Cluster Risks + + apps/client/src/app/pages/portfolio/fire/fire-page.html + 124 + + diff --git a/apps/client/src/locales/messages.fr.xlf b/apps/client/src/locales/messages.fr.xlf index cf651180..bdba67fa 100644 --- a/apps/client/src/locales/messages.fr.xlf +++ b/apps/client/src/locales/messages.fr.xlf @@ -1603,6 +1603,10 @@ apps/client/src/app/pages/features/features-page.html 89 + + apps/client/src/app/pages/portfolio/fire/fire-page.html + 150 + Buying Power @@ -2339,6 +2343,10 @@ apps/client/src/app/pages/blog/2023/09/ghostfolio-2/ghostfolio-2-page.html 273 + + apps/client/src/app/pages/blog/2023/09/hacktoberfest-2023/hacktoberfest-2023-page.html + 181 + apps/client/src/app/pages/blog/blog-page.html 5 @@ -3731,6 +3739,10 @@ apps/client/src/app/components/position/position-detail-dialog/position-detail-dialog.html 148 + + apps/client/src/app/pages/portfolio/fire/fire-page.html + 137 + Portfolio Allocations @@ -8127,6 +8139,10 @@ apps/client/src/app/pages/blog/2023/09/ghostfolio-2/ghostfolio-2-page.component.ts 14 + + apps/client/src/app/pages/blog/2023/09/hacktoberfest-2023/hacktoberfest-2023-page.component.ts + 13 + apps/client/src/app/pages/landing/landing-page.component.ts 25 @@ -9924,6 +9940,30 @@ 312 + + Ghostfolio X-ray uses static analysis to identify potential issues and risks in your portfolio. + Ghostfolio X-ray uses static analysis to identify potential issues and risks in your portfolio. + + apps/client/src/app/pages/portfolio/fire/fire-page.html + 100,101 + + + + Currency Cluster Risks + Currency Cluster Risks + + apps/client/src/app/pages/portfolio/fire/fire-page.html + 111 + + + + Account Cluster Risks + Account Cluster Risks + + apps/client/src/app/pages/portfolio/fire/fire-page.html + 124 + + diff --git a/apps/client/src/locales/messages.it.xlf b/apps/client/src/locales/messages.it.xlf index 9123d838..ae8834f0 100644 --- a/apps/client/src/locales/messages.it.xlf +++ b/apps/client/src/locales/messages.it.xlf @@ -1272,6 +1272,10 @@ apps/client/src/app/pages/features/features-page.html 89 + + apps/client/src/app/pages/portfolio/fire/fire-page.html + 150 + Buying Power @@ -1588,6 +1592,10 @@ apps/client/src/app/pages/blog/2023/09/ghostfolio-2/ghostfolio-2-page.html 273 + + apps/client/src/app/pages/blog/2023/09/hacktoberfest-2023/hacktoberfest-2023-page.html + 181 + apps/client/src/app/pages/blog/blog-page.html 5 @@ -3732,6 +3740,10 @@ apps/client/src/app/components/position/position-detail-dialog/position-detail-dialog.html 148 + + apps/client/src/app/pages/portfolio/fire/fire-page.html + 137 + Portfolio Allocations @@ -8128,6 +8140,10 @@ apps/client/src/app/pages/blog/2023/09/ghostfolio-2/ghostfolio-2-page.component.ts 14 + + apps/client/src/app/pages/blog/2023/09/hacktoberfest-2023/hacktoberfest-2023-page.component.ts + 13 + apps/client/src/app/pages/landing/landing-page.component.ts 25 @@ -9925,6 +9941,30 @@ 312 + + Ghostfolio X-ray uses static analysis to identify potential issues and risks in your portfolio. + Ghostfolio X-ray uses static analysis to identify potential issues and risks in your portfolio. + + apps/client/src/app/pages/portfolio/fire/fire-page.html + 100,101 + + + + Currency Cluster Risks + Currency Cluster Risks + + apps/client/src/app/pages/portfolio/fire/fire-page.html + 111 + + + + Account Cluster Risks + Account Cluster Risks + + apps/client/src/app/pages/portfolio/fire/fire-page.html + 124 + + diff --git a/apps/client/src/locales/messages.nl.xlf b/apps/client/src/locales/messages.nl.xlf index 5a4e2549..f69216f6 100644 --- a/apps/client/src/locales/messages.nl.xlf +++ b/apps/client/src/locales/messages.nl.xlf @@ -1271,6 +1271,10 @@ apps/client/src/app/pages/features/features-page.html 89 + + apps/client/src/app/pages/portfolio/fire/fire-page.html + 150 + Buying Power @@ -1587,6 +1591,10 @@ apps/client/src/app/pages/blog/2023/09/ghostfolio-2/ghostfolio-2-page.html 273 + + apps/client/src/app/pages/blog/2023/09/hacktoberfest-2023/hacktoberfest-2023-page.html + 181 + apps/client/src/app/pages/blog/blog-page.html 5 @@ -3731,6 +3739,10 @@ apps/client/src/app/components/position/position-detail-dialog/position-detail-dialog.html 148 + + apps/client/src/app/pages/portfolio/fire/fire-page.html + 137 + Portfolio Allocations @@ -8127,6 +8139,10 @@ apps/client/src/app/pages/blog/2023/09/ghostfolio-2/ghostfolio-2-page.component.ts 14 + + apps/client/src/app/pages/blog/2023/09/hacktoberfest-2023/hacktoberfest-2023-page.component.ts + 13 + apps/client/src/app/pages/landing/landing-page.component.ts 25 @@ -9924,6 +9940,30 @@ 312 + + Ghostfolio X-ray uses static analysis to identify potential issues and risks in your portfolio. + Ghostfolio X-ray uses static analysis to identify potential issues and risks in your portfolio. + + apps/client/src/app/pages/portfolio/fire/fire-page.html + 100,101 + + + + Currency Cluster Risks + Currency Cluster Risks + + apps/client/src/app/pages/portfolio/fire/fire-page.html + 111 + + + + Account Cluster Risks + Account Cluster Risks + + apps/client/src/app/pages/portfolio/fire/fire-page.html + 124 + + diff --git a/apps/client/src/locales/messages.pt.xlf b/apps/client/src/locales/messages.pt.xlf index e8d3b4cc..19a8df17 100644 --- a/apps/client/src/locales/messages.pt.xlf +++ b/apps/client/src/locales/messages.pt.xlf @@ -1499,6 +1499,10 @@ apps/client/src/app/pages/features/features-page.html 89 + + apps/client/src/app/pages/portfolio/fire/fire-page.html + 150 + Buying Power @@ -2263,6 +2267,10 @@ apps/client/src/app/pages/blog/2023/09/ghostfolio-2/ghostfolio-2-page.html 273 + + apps/client/src/app/pages/blog/2023/09/hacktoberfest-2023/hacktoberfest-2023-page.html + 181 + apps/client/src/app/pages/blog/blog-page.html 5 @@ -3731,6 +3739,10 @@ apps/client/src/app/components/position/position-detail-dialog/position-detail-dialog.html 148 + + apps/client/src/app/pages/portfolio/fire/fire-page.html + 137 + Portfolio Allocations @@ -8127,6 +8139,10 @@ apps/client/src/app/pages/blog/2023/09/ghostfolio-2/ghostfolio-2-page.component.ts 14 + + apps/client/src/app/pages/blog/2023/09/hacktoberfest-2023/hacktoberfest-2023-page.component.ts + 13 + apps/client/src/app/pages/landing/landing-page.component.ts 25 @@ -9924,6 +9940,30 @@ 312 + + Ghostfolio X-ray uses static analysis to identify potential issues and risks in your portfolio. + Ghostfolio X-ray uses static analysis to identify potential issues and risks in your portfolio. + + apps/client/src/app/pages/portfolio/fire/fire-page.html + 100,101 + + + + Currency Cluster Risks + Currency Cluster Risks + + apps/client/src/app/pages/portfolio/fire/fire-page.html + 111 + + + + Account Cluster Risks + Account Cluster Risks + + apps/client/src/app/pages/portfolio/fire/fire-page.html + 124 + + diff --git a/apps/client/src/locales/messages.tr.xlf b/apps/client/src/locales/messages.tr.xlf index fafe4282..61cdc097 100644 --- a/apps/client/src/locales/messages.tr.xlf +++ b/apps/client/src/locales/messages.tr.xlf @@ -64,6 +64,10 @@ apps/client/src/app/pages/blog/2023/09/ghostfolio-2/ghostfolio-2-page.component.ts 14 + + apps/client/src/app/pages/blog/2023/09/hacktoberfest-2023/hacktoberfest-2023-page.component.ts + 13 + apps/client/src/app/pages/landing/landing-page.component.ts 25 @@ -804,6 +808,10 @@ apps/client/src/app/pages/blog/2023/09/ghostfolio-2/ghostfolio-2-page.html 273 + + apps/client/src/app/pages/blog/2023/09/hacktoberfest-2023/hacktoberfest-2023-page.html + 181 + apps/client/src/app/pages/blog/blog-page.html 5 @@ -2671,6 +2679,10 @@ apps/client/src/app/pages/features/features-page.html 89 + + apps/client/src/app/pages/portfolio/fire/fire-page.html + 150 + Cash @@ -2823,6 +2835,10 @@ apps/client/src/app/components/position/position-detail-dialog/position-detail-dialog.html 148 + + apps/client/src/app/pages/portfolio/fire/fire-page.html + 137 + First Buy Date @@ -9924,6 +9940,30 @@ 312 + + Ghostfolio X-ray uses static analysis to identify potential issues and risks in your portfolio. + Ghostfolio X-ray uses static analysis to identify potential issues and risks in your portfolio. + + apps/client/src/app/pages/portfolio/fire/fire-page.html + 100,101 + + + + Currency Cluster Risks + Currency Cluster Risks + + apps/client/src/app/pages/portfolio/fire/fire-page.html + 111 + + + + Account Cluster Risks + Account Cluster Risks + + apps/client/src/app/pages/portfolio/fire/fire-page.html + 124 + + diff --git a/apps/client/src/locales/messages.xlf b/apps/client/src/locales/messages.xlf index 383ee964..956a2ad8 100644 --- a/apps/client/src/locales/messages.xlf +++ b/apps/client/src/locales/messages.xlf @@ -64,6 +64,10 @@ apps/client/src/app/pages/blog/2023/09/ghostfolio-2/ghostfolio-2-page.component.ts 14 + + apps/client/src/app/pages/blog/2023/09/hacktoberfest-2023/hacktoberfest-2023-page.component.ts + 13 + apps/client/src/app/pages/landing/landing-page.component.ts 25 @@ -791,6 +795,10 @@ apps/client/src/app/pages/blog/2023/09/ghostfolio-2/ghostfolio-2-page.html 273 + + apps/client/src/app/pages/blog/2023/09/hacktoberfest-2023/hacktoberfest-2023-page.html + 181 + apps/client/src/app/pages/blog/blog-page.html 5 @@ -2504,6 +2512,10 @@ apps/client/src/app/pages/features/features-page.html 89 + + apps/client/src/app/pages/portfolio/fire/fire-page.html + 150 + Cash @@ -2641,6 +2653,10 @@ apps/client/src/app/components/position/position-detail-dialog/position-detail-dialog.html 148 + + apps/client/src/app/pages/portfolio/fire/fire-page.html + 137 + First Buy Date @@ -9370,6 +9386,27 @@ 11,13 + + Ghostfolio X-ray uses static analysis to identify potential issues and risks in your portfolio. + + apps/client/src/app/pages/portfolio/fire/fire-page.html + 100,101 + + + + Currency Cluster Risks + + apps/client/src/app/pages/portfolio/fire/fire-page.html + 111 + + + + Account Cluster Risks + + apps/client/src/app/pages/portfolio/fire/fire-page.html + 124 + +