Browse Source

Feature/localize asset class cluster risks (Equity and Fixed Income) (#5033)

* Localize asset class cluster risks

* Update changelog
pull/5037/head
Tobias Kugel 5 days ago
committed by GitHub
parent
commit
f0eb0dc7fc
No known key found for this signature in database GPG Key ID: B5690EEEBB952194
  1. 5
      CHANGELOG.md
  2. 4
      apps/api/src/app/portfolio/portfolio.service.ts
  3. 4
      apps/api/src/app/user/user.service.ts
  4. 46
      apps/api/src/models/rules/asset-class-cluster-risk/equity.ts
  5. 46
      apps/api/src/models/rules/asset-class-cluster-risk/fixed-income.ts
  6. 29
      apps/client/src/app/pages/i18n/i18n-page.html

5
CHANGELOG.md

@ -7,6 +7,11 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
## Unreleased
### Added
- Set up the language localization for the static portfolio analysis rule: _Asset Class Cluster Risks_ (Equity)
- Set up the language localization for the static portfolio analysis rule: _Asset Class Cluster Risks_ (Fixed Income)
### Changed
- Changed `node main` to `exec node main` in the `entrypoint.sh` file to improve the container signal handling

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

@ -1280,10 +1280,14 @@ export class PortfolioService {
[
new AssetClassClusterRiskEquity(
this.exchangeRateDataService,
this.i18nService,
userSettings.language,
Object.values(holdings)
),
new AssetClassClusterRiskFixedIncome(
this.exchangeRateDataService,
this.i18nService,
userSettings.language,
Object.values(holdings)
)
],

4
apps/api/src/app/user/user.service.ts

@ -272,10 +272,14 @@ export class UserService {
{}
).getSettings(user.Settings.settings),
AssetClassClusterRiskEquity: new AssetClassClusterRiskEquity(
undefined,
undefined,
undefined,
undefined
).getSettings(user.Settings.settings),
AssetClassClusterRiskFixedIncome: new AssetClassClusterRiskFixedIncome(
undefined,
undefined,
undefined,
undefined
).getSettings(user.Settings.settings),

46
apps/api/src/models/rules/asset-class-cluster-risk/equity.ts

@ -1,6 +1,7 @@
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 { I18nService } from '@ghostfolio/api/services/i18n/i18n.service';
import { PortfolioPosition, UserSettings } from '@ghostfolio/common/interfaces';
export class AssetClassClusterRiskEquity extends Rule<Settings> {
@ -8,9 +9,12 @@ export class AssetClassClusterRiskEquity extends Rule<Settings> {
public constructor(
protected exchangeRateDataService: ExchangeRateDataService,
private i18nService: I18nService,
languageCode: string,
holdings: PortfolioPosition[]
) {
super(exchangeRateDataService, {
languageCode,
key: AssetClassClusterRiskEquity.name
});
@ -40,26 +44,39 @@ export class AssetClassClusterRiskEquity extends Rule<Settings> {
if (equityValueRatio > ruleSettings.thresholdMax) {
return {
evaluation: `The equity contribution of your current investment (${(equityValueRatio * 100).toPrecision(3)}%) exceeds ${(
ruleSettings.thresholdMax * 100
).toPrecision(3)}%`,
evaluation: this.i18nService.getTranslation({
id: 'rule.assetClassClusterRiskEquity.false.max',
languageCode: this.getLanguageCode(),
placeholders: {
equityValueRatio: (equityValueRatio * 100).toPrecision(3),
thresholdMax: (ruleSettings.thresholdMax * 100).toPrecision(3)
}
}),
value: false
};
} else if (equityValueRatio < ruleSettings.thresholdMin) {
return {
evaluation: `The equity contribution of your current investment (${(equityValueRatio * 100).toPrecision(3)}%) is below ${(
ruleSettings.thresholdMin * 100
).toPrecision(3)}%`,
evaluation: this.i18nService.getTranslation({
id: 'rule.assetClassClusterRiskEquity.false.min',
languageCode: this.getLanguageCode(),
placeholders: {
equityValueRatio: (equityValueRatio * 100).toPrecision(3),
thresholdMin: (ruleSettings.thresholdMin * 100).toPrecision(3)
}
}),
value: false
};
}
return {
evaluation: `The equity contribution of your current investment (${(equityValueRatio * 100).toPrecision(3)}%) is within the range of ${(
ruleSettings.thresholdMin * 100
).toPrecision(
3
)}% and ${(ruleSettings.thresholdMax * 100).toPrecision(3)}%`,
evaluation: this.i18nService.getTranslation({
id: 'rule.assetClassClusterRiskEquity.true',
languageCode: this.getLanguageCode(),
placeholders: {
equityValueRatio: (equityValueRatio * 100).toPrecision(3),
thresholdMax: (ruleSettings.thresholdMax * 100).toPrecision(3),
thresholdMin: (ruleSettings.thresholdMin * 100).toPrecision(3)
}
}),
value: true
};
}
@ -78,7 +95,10 @@ export class AssetClassClusterRiskEquity extends Rule<Settings> {
}
public getName() {
return 'Equity';
return this.i18nService.getTranslation({
id: 'rule.assetClassClusterRiskEquity',
languageCode: this.getLanguageCode()
});
}
public getSettings({ baseCurrency, xRayRules }: UserSettings): Settings {

46
apps/api/src/models/rules/asset-class-cluster-risk/fixed-income.ts

@ -1,6 +1,7 @@
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 { I18nService } from '@ghostfolio/api/services/i18n/i18n.service';
import { PortfolioPosition, UserSettings } from '@ghostfolio/common/interfaces';
export class AssetClassClusterRiskFixedIncome extends Rule<Settings> {
@ -8,9 +9,12 @@ export class AssetClassClusterRiskFixedIncome extends Rule<Settings> {
public constructor(
protected exchangeRateDataService: ExchangeRateDataService,
private i18nService: I18nService,
languageCode: string,
holdings: PortfolioPosition[]
) {
super(exchangeRateDataService, {
languageCode,
key: AssetClassClusterRiskFixedIncome.name
});
@ -40,26 +44,39 @@ export class AssetClassClusterRiskFixedIncome extends Rule<Settings> {
if (fixedIncomeValueRatio > ruleSettings.thresholdMax) {
return {
evaluation: `The fixed income contribution of your current investment (${(fixedIncomeValueRatio * 100).toPrecision(3)}%) exceeds ${(
ruleSettings.thresholdMax * 100
).toPrecision(3)}%`,
evaluation: this.i18nService.getTranslation({
id: 'rule.assetClassClusterRiskFixedIncome.false.max',
languageCode: this.getLanguageCode(),
placeholders: {
fixedIncomeValueRatio: (fixedIncomeValueRatio * 100).toPrecision(3),
thresholdMax: (ruleSettings.thresholdMax * 100).toPrecision(3)
}
}),
value: false
};
} else if (fixedIncomeValueRatio < ruleSettings.thresholdMin) {
return {
evaluation: `The fixed income contribution of your current investment (${(fixedIncomeValueRatio * 100).toPrecision(3)}%) is below ${(
ruleSettings.thresholdMin * 100
).toPrecision(3)}%`,
evaluation: this.i18nService.getTranslation({
id: 'rule.assetClassClusterRiskFixedIncome.false.min',
languageCode: this.getLanguageCode(),
placeholders: {
fixedIncomeValueRatio: (fixedIncomeValueRatio * 100).toPrecision(3),
thresholdMin: (ruleSettings.thresholdMin * 100).toPrecision(3)
}
}),
value: false
};
}
return {
evaluation: `The fixed income contribution of your current investment (${(fixedIncomeValueRatio * 100).toPrecision(3)}%) is within the range of ${(
ruleSettings.thresholdMin * 100
).toPrecision(
3
)}% and ${(ruleSettings.thresholdMax * 100).toPrecision(3)}%`,
evaluation: this.i18nService.getTranslation({
id: 'rule.assetClassClusterRiskFixedIncome.true',
languageCode: this.getLanguageCode(),
placeholders: {
fixedIncomeValueRatio: (fixedIncomeValueRatio * 100).toPrecision(3),
thresholdMax: (ruleSettings.thresholdMax * 100).toPrecision(3),
thresholdMin: (ruleSettings.thresholdMin * 100).toPrecision(3)
}
}),
value: true
};
}
@ -78,7 +95,10 @@ export class AssetClassClusterRiskFixedIncome extends Rule<Settings> {
}
public getName() {
return 'Fixed Income';
return this.i18nService.getTranslation({
id: 'rule.assetClassClusterRiskFixedIncome',
languageCode: this.getLanguageCode()
});
}
public getSettings({ baseCurrency, xRayRules }: UserSettings): Settings {

29
apps/client/src/app/pages/i18n/i18n-page.html

@ -28,6 +28,35 @@
<li i18n="@@rule.accountClusterRiskSingleAccount.true">
Your net worth is managed by $&#123;accountsLength&#125; accounts
</li>
<li i18n="@@rule.assetClassClusterRiskEquity">Equity</li>
<li i18n="@@rule.assetClassClusterRiskEquity.false.max">
The equity contribution of your current investment
($&#123;equityValueRatio&#125;%) exceeds $&#123;thresholdMax&#125;%
</li>
<li i18n="@@rule.assetClassClusterRiskEquity.false.min">
The equity contribution of your current investment
($&#123;equityValueRatio&#125;%) is below $&#123;thresholdMin&#125;%
</li>
<li i18n="@@rule.assetClassClusterRiskEquity.true">
The equity contribution of your current investment
($&#123;equityValueRatio&#125;%) is within the range of
$&#123;thresholdMin&#125;% and $&#123;thresholdMax&#125;%
</li>
<li i18n="@@rule.assetClassClusterRiskFixedIncome">Fixed Income</li>
<li i18n="@@rule.assetClassClusterRiskFixedIncome.false.max">
The fixed income contribution of your current investment
($&#123;fixedIncomeValueRatio&#125;%) exceeds $&#123;thresholdMax&#125;%
</li>
<li i18n="@@rule.assetClassClusterRiskFixedIncome.false.min">
The fixed income contribution of your current investment
($&#123;fixedIncomeValueRatio&#125;%) is below
$&#123;thresholdMin&#125;%
</li>
<li i18n="@@rule.assetClassClusterRiskFixedIncome.true">
The fixed income contribution of your current investment
($&#123;fixedIncomeValueRatio&#125;%) is within the range of
$&#123;thresholdMin&#125;% and $&#123;thresholdMax&#125;%
</li>
<li i18n="@@rule.emergencyFundSetup">Emergency Fund: Set up</li>
<li i18n="@@rule.emergencyFundSetup.false">
No emergency fund has been set up

Loading…
Cancel
Save