From d9cb1c124bb10fca262490fb4d14d26c41990afa Mon Sep 17 00:00:00 2001
From: Thomas <4159106+dtslvr@users.noreply.github.com>
Date: Sat, 30 Sep 2023 07:07:05 +0200
Subject: [PATCH] Various improvements
---
.../src/app/portfolio/portfolio.service.ts | 71 ++++++++++---------
.../emergency-fund/emergency-fund-setup.ts | 15 ++--
.../fees/fee-ratio-initial-investment.ts | 4 +-
.../app/pages/portfolio/fire/fire-page.html | 16 ++---
4 files changed, 60 insertions(+), 46 deletions(-)
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