Browse Source

Refactoring

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

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

@ -33,7 +33,6 @@ import {
} from '@ghostfolio/common/calculation-helper'; } from '@ghostfolio/common/calculation-helper';
import { import {
DEFAULT_CURRENCY, DEFAULT_CURRENCY,
DEFAULT_LANGUAGE_CODE,
TAG_ID_EMERGENCY_FUND, TAG_ID_EMERGENCY_FUND,
TAG_ID_EXCLUDE_FROM_ANALYSIS, TAG_ID_EXCLUDE_FROM_ANALYSIS,
UNKNOWN_KEY UNKNOWN_KEY
@ -1235,26 +1234,66 @@ export class PortfolioService {
const categories: PortfolioReportResponse['xRay']['categories'] = [ const categories: PortfolioReportResponse['xRay']['categories'] = [
{ {
key: 'accountClusterRisk', key: 'liquidity',
name: this.i18nService.getTranslation({ name: this.i18nService.getTranslation({
id: 'rule.accountClusterRisk.category', id: 'rule.liquidity.category',
languageCode: userSettings.language || DEFAULT_LANGUAGE_CODE languageCode: userSettings.language
}),
rules: await this.rulesService.evaluate(
[
new BuyingPower(
this.exchangeRateDataService,
this.i18nService,
summary.cash,
userSettings.language
)
],
userSettings
)
},
{
key: 'emergencyFund',
name: this.i18nService.getTranslation({
id: 'rule.emergencyFund.category',
languageCode: userSettings.language
}),
rules: await this.rulesService.evaluate(
[
new EmergencyFundSetup(
this.exchangeRateDataService,
this.i18nService,
userSettings.language,
this.getTotalEmergencyFund({
userSettings,
emergencyFundHoldingsValueInBaseCurrency:
this.getEmergencyFundHoldingsValueInBaseCurrency({ holdings })
}).toNumber()
)
],
userSettings
)
},
{
key: 'currencyClusterRisk',
name: this.i18nService.getTranslation({
id: 'rule.currencyClusterRisk.category',
languageCode: userSettings.language
}), }),
rules: rules:
summary.activityCount > 0 summary.activityCount > 0
? await this.rulesService.evaluate( ? await this.rulesService.evaluate(
[ [
new AccountClusterRiskCurrentInvestment( new CurrencyClusterRiskBaseCurrencyCurrentInvestment(
this.exchangeRateDataService, this.exchangeRateDataService,
this.i18nService, this.i18nService,
userSettings.language, Object.values(holdings),
accounts userSettings.language
), ),
new AccountClusterRiskSingleAccount( new CurrencyClusterRiskCurrentInvestment(
this.exchangeRateDataService, this.exchangeRateDataService,
this.i18nService, this.i18nService,
userSettings.language, Object.values(holdings),
accounts userSettings.language
) )
], ],
userSettings userSettings
@ -1265,7 +1304,7 @@ export class PortfolioService {
key: 'assetClassClusterRisk', key: 'assetClassClusterRisk',
name: this.i18nService.getTranslation({ name: this.i18nService.getTranslation({
id: 'rule.assetClassClusterRisk.category', id: 'rule.assetClassClusterRisk.category',
languageCode: userSettings.language || DEFAULT_LANGUAGE_CODE languageCode: userSettings.language
}), }),
rules: rules:
summary.activityCount > 0 summary.activityCount > 0
@ -1289,26 +1328,26 @@ export class PortfolioService {
: undefined : undefined
}, },
{ {
key: 'currencyClusterRisk', key: 'accountClusterRisk',
name: this.i18nService.getTranslation({ name: this.i18nService.getTranslation({
id: 'rule.currencyClusterRisk.category', id: 'rule.accountClusterRisk.category',
languageCode: userSettings.language || DEFAULT_LANGUAGE_CODE languageCode: userSettings.language
}), }),
rules: rules:
summary.activityCount > 0 summary.activityCount > 0
? await this.rulesService.evaluate( ? await this.rulesService.evaluate(
[ [
new CurrencyClusterRiskBaseCurrencyCurrentInvestment( new AccountClusterRiskCurrentInvestment(
this.exchangeRateDataService, this.exchangeRateDataService,
this.i18nService, this.i18nService,
Object.values(holdings), userSettings.language,
userSettings.language accounts
), ),
new CurrencyClusterRiskCurrentInvestment( new AccountClusterRiskSingleAccount(
this.exchangeRateDataService, this.exchangeRateDataService,
this.i18nService, this.i18nService,
Object.values(holdings), userSettings.language,
userSettings.language accounts
) )
], ],
userSettings userSettings
@ -1319,7 +1358,7 @@ export class PortfolioService {
key: 'economicMarketClusterRisk', key: 'economicMarketClusterRisk',
name: this.i18nService.getTranslation({ name: this.i18nService.getTranslation({
id: 'rule.economicMarketClusterRisk.category', id: 'rule.economicMarketClusterRisk.category',
languageCode: userSettings.language || DEFAULT_LANGUAGE_CODE languageCode: userSettings.language
}), }),
rules: rules:
summary.activityCount > 0 summary.activityCount > 0
@ -1344,70 +1383,11 @@ export class PortfolioService {
) )
: undefined : undefined
}, },
{
key: 'emergencyFund',
name: this.i18nService.getTranslation({
id: 'rule.emergencyFund.category',
languageCode: userSettings.language || DEFAULT_LANGUAGE_CODE
}),
rules: await this.rulesService.evaluate(
[
new EmergencyFundSetup(
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(
this.exchangeRateDataService,
this.i18nService,
userSettings.language,
summary.committedFunds,
summary.fees
)
],
userSettings
)
},
{
key: 'liquidity',
name: this.i18nService.getTranslation({
id: 'rule.liquidity.category',
languageCode: userSettings.language || DEFAULT_LANGUAGE_CODE
}),
rules: await this.rulesService.evaluate(
[
new BuyingPower(
this.exchangeRateDataService,
this.i18nService,
summary.cash,
userSettings.language
)
],
userSettings
)
},
{ {
key: 'regionalMarketClusterRisk', key: 'regionalMarketClusterRisk',
name: this.i18nService.getTranslation({ name: this.i18nService.getTranslation({
id: 'rule.regionalMarketClusterRisk.category', id: 'rule.regionalMarketClusterRisk.category',
languageCode: userSettings.language || DEFAULT_LANGUAGE_CODE languageCode: userSettings.language
}), }),
rules: rules:
summary.activityCount > 0 summary.activityCount > 0
@ -1452,6 +1432,25 @@ export class PortfolioService {
userSettings userSettings
) )
: undefined : 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) { public onCustomizeRule(rule: PortfolioReportRule) {
const dialogRef = this.dialog.open(GfRuleSettingsDialogComponent, { const dialogRef = this.dialog.open(GfRuleSettingsDialogComponent, {
data: { data: {
categoryName: this.categoryName,
rule, rule,
categoryName: this.categoryName,
settings: this.settings settings: this.settings
} as IRuleSettingsDialogParams, } as IRuleSettingsDialogParams,
width: this.deviceType === 'mobile' ? '100vw' : '50rem' width: this.deviceType === 'mobile' ? '100vw' : '50rem'

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

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

Loading…
Cancel
Save