Browse Source

Refactoring

pull/5454/head
Thomas Kaul 4 months ago
parent
commit
7fac744d8a
  1. 153
      apps/api/src/app/portfolio/portfolio.service.ts
  2. 2
      apps/client/src/app/components/rule/rule.component.ts
  3. 12
      apps/client/src/app/pages/portfolio/x-ray/x-ray-page.component.ts

153
apps/api/src/app/portfolio/portfolio.service.ts

@ -33,7 +33,6 @@ import {
} from '@ghostfolio/common/calculation-helper';
import {
DEFAULT_CURRENCY,
DEFAULT_LANGUAGE_CODE,
TAG_ID_EMERGENCY_FUND,
TAG_ID_EXCLUDE_FROM_ANALYSIS,
UNKNOWN_KEY
@ -1235,64 +1234,50 @@ export class PortfolioService {
const categories: PortfolioReportResponse['xRay']['categories'] = [
{
key: 'accountClusterRisk',
key: 'liquidity',
name: this.i18nService.getTranslation({
id: 'rule.accountClusterRisk.category',
languageCode: userSettings.language || DEFAULT_LANGUAGE_CODE
id: 'rule.liquidity.category',
languageCode: userSettings.language
}),
rules:
summary.activityCount > 0
? await this.rulesService.evaluate(
rules: await this.rulesService.evaluate(
[
new AccountClusterRiskCurrentInvestment(
this.exchangeRateDataService,
this.i18nService,
userSettings.language,
accounts
),
new AccountClusterRiskSingleAccount(
new BuyingPower(
this.exchangeRateDataService,
this.i18nService,
userSettings.language,
accounts
summary.cash,
userSettings.language
)
],
userSettings
)
: undefined
},
{
key: 'assetClassClusterRisk',
key: 'emergencyFund',
name: this.i18nService.getTranslation({
id: 'rule.assetClassClusterRisk.category',
languageCode: userSettings.language || DEFAULT_LANGUAGE_CODE
id: 'rule.emergencyFund.category',
languageCode: userSettings.language
}),
rules:
summary.activityCount > 0
? await this.rulesService.evaluate(
rules: await this.rulesService.evaluate(
[
new AssetClassClusterRiskEquity(
this.exchangeRateDataService,
this.i18nService,
userSettings.language,
Object.values(holdings)
),
new AssetClassClusterRiskFixedIncome(
new EmergencyFundSetup(
this.exchangeRateDataService,
this.i18nService,
userSettings.language,
Object.values(holdings)
this.getTotalEmergencyFund({
userSettings,
emergencyFundHoldingsValueInBaseCurrency:
this.getEmergencyFundHoldingsValueInBaseCurrency({ holdings })
}).toNumber()
)
],
userSettings
)
: undefined
},
{
key: 'currencyClusterRisk',
name: this.i18nService.getTranslation({
id: 'rule.currencyClusterRisk.category',
languageCode: userSettings.language || DEFAULT_LANGUAGE_CODE
languageCode: userSettings.language
}),
rules:
summary.activityCount > 0
@ -1316,28 +1301,26 @@ export class PortfolioService {
: undefined
},
{
key: 'economicMarketClusterRisk',
key: 'assetClassClusterRisk',
name: this.i18nService.getTranslation({
id: 'rule.economicMarketClusterRisk.category',
languageCode: userSettings.language || DEFAULT_LANGUAGE_CODE
id: 'rule.assetClassClusterRisk.category',
languageCode: userSettings.language
}),
rules:
summary.activityCount > 0
? await this.rulesService.evaluate(
[
new EconomicMarketClusterRiskDevelopedMarkets(
new AssetClassClusterRiskEquity(
this.exchangeRateDataService,
this.i18nService,
marketsTotalInBaseCurrency,
markets.developedMarkets.valueInBaseCurrency,
userSettings.language
userSettings.language,
Object.values(holdings)
),
new EconomicMarketClusterRiskEmergingMarkets(
new AssetClassClusterRiskFixedIncome(
this.exchangeRateDataService,
this.i18nService,
marketsTotalInBaseCurrency,
markets.emergingMarkets.valueInBaseCurrency,
userSettings.language
userSettings.language,
Object.values(holdings)
)
],
userSettings
@ -1345,69 +1328,66 @@ export class PortfolioService {
: undefined
},
{
key: 'emergencyFund',
key: 'accountClusterRisk',
name: this.i18nService.getTranslation({
id: 'rule.emergencyFund.category',
languageCode: userSettings.language || DEFAULT_LANGUAGE_CODE
id: 'rule.accountClusterRisk.category',
languageCode: userSettings.language
}),
rules: await this.rulesService.evaluate(
rules:
summary.activityCount > 0
? await this.rulesService.evaluate(
[
new EmergencyFundSetup(
new AccountClusterRiskCurrentInvestment(
this.exchangeRateDataService,
this.i18nService,
userSettings.language,
this.getTotalEmergencyFund({
userSettings,
emergencyFundHoldingsValueInBaseCurrency:
this.getEmergencyFundHoldingsValueInBaseCurrency({ holdings })
}).toNumber()
)
],
userSettings
)
},
{
key: 'fees',
name: this.i18nService.getTranslation({
id: 'rule.fees.category',
languageCode: userSettings.language || DEFAULT_LANGUAGE_CODE
}),
rules: await this.rulesService.evaluate(
[
new FeeRatioInitialInvestment(
accounts
),
new AccountClusterRiskSingleAccount(
this.exchangeRateDataService,
this.i18nService,
userSettings.language,
summary.committedFunds,
summary.fees
accounts
)
],
userSettings
)
: undefined
},
{
key: 'liquidity',
key: 'economicMarketClusterRisk',
name: this.i18nService.getTranslation({
id: 'rule.liquidity.category',
languageCode: userSettings.language || DEFAULT_LANGUAGE_CODE
id: 'rule.economicMarketClusterRisk.category',
languageCode: userSettings.language
}),
rules: await this.rulesService.evaluate(
rules:
summary.activityCount > 0
? await this.rulesService.evaluate(
[
new BuyingPower(
new EconomicMarketClusterRiskDevelopedMarkets(
this.exchangeRateDataService,
this.i18nService,
summary.cash,
marketsTotalInBaseCurrency,
markets.developedMarkets.valueInBaseCurrency,
userSettings.language
),
new EconomicMarketClusterRiskEmergingMarkets(
this.exchangeRateDataService,
this.i18nService,
marketsTotalInBaseCurrency,
markets.emergingMarkets.valueInBaseCurrency,
userSettings.language
)
],
userSettings
)
: undefined
},
{
key: 'regionalMarketClusterRisk',
name: this.i18nService.getTranslation({
id: 'rule.regionalMarketClusterRisk.category',
languageCode: userSettings.language || DEFAULT_LANGUAGE_CODE
languageCode: userSettings.language
}),
rules:
summary.activityCount > 0
@ -1452,6 +1432,25 @@ export class PortfolioService {
userSettings
)
: undefined
},
{
key: 'fees',
name: this.i18nService.getTranslation({
id: 'rule.fees.category',
languageCode: userSettings.language
}),
rules: await this.rulesService.evaluate(
[
new FeeRatioInitialInvestment(
this.exchangeRateDataService,
this.i18nService,
userSettings.language,
summary.committedFunds,
summary.fees
)
],
userSettings
)
}
];

2
apps/client/src/app/components/rule/rule.component.ts

@ -69,8 +69,8 @@ export class RuleComponent implements OnInit {
public onCustomizeRule(rule: PortfolioReportRule) {
const dialogRef = this.dialog.open(GfRuleSettingsDialogComponent, {
data: {
categoryName: this.categoryName,
rule,
categoryName: this.categoryName,
settings: this.settings
} as IRuleSettingsDialogParams,
width: this.deviceType === 'mobile' ? '100vw' : '50rem'

12
apps/client/src/app/pages/portfolio/x-ray/x-ray-page.component.ts

@ -114,9 +114,9 @@ export class GfXRayPageComponent {
.fetchPortfolioReport()
.pipe(takeUntil(this.unsubscribeSubject))
.subscribe(({ xRay: { categories, statistics } }) => {
this.categories = categories;
this.inactiveRules = this.mergeInactiveRules(categories);
this.statistics = statistics;
this.categories = categories;
this.isLoading = false;
@ -127,10 +127,12 @@ export class GfXRayPageComponent {
private mergeInactiveRules(
categories: PortfolioReportResponse['xRay']['categories']
): PortfolioReportRule[] {
const inactiveRules = categories.flatMap(
(category) => category.rules?.filter(({ isActive }) => !isActive) ?? []
return categories.flatMap(({ rules }) => {
return (
rules?.filter(({ isActive }) => {
return !isActive;
}) ?? []
);
return inactiveRules;
});
}
}

Loading…
Cancel
Save