diff --git a/apps/api/src/app/portfolio/portfolio.service.ts b/apps/api/src/app/portfolio/portfolio.service.ts index 775abd44c..c2c16964c 100644 --- a/apps/api/src/app/portfolio/portfolio.service.ts +++ b/apps/api/src/app/portfolio/portfolio.service.ts @@ -1215,12 +1215,6 @@ export class PortfolioService { userId }); - if (isEmpty(orders)) { - return { - rules: {} - }; - } - const portfolioCalculator = new PortfolioCalculator({ currency: userCurrency, currentRateService: this.currentRateService, @@ -1229,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); @@ -1250,37 +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( - this.exchangeRateDataService, - accounts - ) - ], - this.request.user.Settings.settings - ), - currencyClusterRisk: await this.rulesService.evaluate( - [ - new CurrencyClusterRiskBaseCurrencyCurrentInvestment( - this.exchangeRateDataService, - positions + currencyClusterRisk: isEmpty(orders) + ? undefined + : await this.rulesService.evaluate( + [ + new CurrencyClusterRiskBaseCurrencyCurrentInvestment( + this.exchangeRateDataService, + positions + ), + new CurrencyClusterRiskCurrentInvestment( + this.exchangeRateDataService, + positions + ) + ], + userSettings ), - new CurrencyClusterRiskCurrentInvestment( + emergencyFund: await this.rulesService.evaluate( + [ + new EmergencyFundSetup( this.exchangeRateDataService, - positions + userSettings.emergencyFund ) ], - this.request.user.Settings.settings - ), - emergencyFund: await this.rulesService.evaluate( - [new EmergencyFundSetup(this.exchangeRateDataService)], - this.request.user.Settings.settings + userSettings ), fees: await this.rulesService.evaluate( [ @@ -1290,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/emergency-fund/emergency-fund-setup.ts b/apps/api/src/models/rules/emergency-fund/emergency-fund-setup.ts index f00880297..b6248ab51 100644 --- a/apps/api/src/models/rules/emergency-fund/emergency-fund-setup.ts +++ b/apps/api/src/models/rules/emergency-fund/emergency-fund-setup.ts @@ -4,24 +4,29 @@ import { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate- import { UserSettings } from '@ghostfolio/common/interfaces'; export class EmergencyFundSetup extends Rule { + private emergencyFund: number; + public constructor( - protected exchangeRateDataService: ExchangeRateDataService + protected exchangeRateDataService: ExchangeRateDataService, + emergencyFund: number ) { super(exchangeRateDataService, { name: 'Emergency Fund: Set up' }); + + this.emergencyFund = emergencyFund; } public evaluate(ruleSettings: Settings) { - if (ruleSettings.threshold > 0) { + if (this.emergencyFund > ruleSettings.threshold) { return { - evaluation: `You have set up an emergency fund`, + evaluation: 'An emergency fund has been set up', value: true }; } return { - evaluation: `You have not set up an emergency fund yet`, + evaluation: 'No emergency fund has been set up', value: false }; } @@ -30,7 +35,7 @@ export class EmergencyFundSetup extends Rule { return { baseCurrency: aUserSettings.baseCurrency, isActive: true, - threshold: aUserSettings.emergencyFund + threshold: 0 }; } } 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 f160b1cd4..0ba70d23c 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 @@ -21,7 +21,9 @@ export class FeeRatioInitialInvestment extends Rule { } 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.html b/apps/client/src/app/pages/portfolio/fire/fire-page.html index e8cfef2de..2e8522570 100644 --- a/apps/client/src/app/pages/portfolio/fire/fire-page.html +++ b/apps/client/src/app/pages/portfolio/fire/fire-page.html @@ -108,7 +108,7 @@

- Currency Cluster RisksEmergency Fund

- Account Cluster RisksCurrency Cluster Risks

- FeesAccount Cluster Risks

- Emergency FundFees