From 1a9c11ba0e1a9670679d896b823ab785553f4d67 Mon Sep 17 00:00:00 2001
From: Dhaneshwari Tendle
<110600266+dhaneshwaritendle@users.noreply.github.com>
Date: Sat, 19 Oct 2024 13:55:02 +0530
Subject: [PATCH] Revert " modified: apps/api/src/helper/object.helper.ts"
---
CHANGELOG.md | 33 +--
Dockerfile | 1 -
.../api/src/app/account/create-account.dto.ts | 2 +-
.../api/src/app/account/update-account.dto.ts | 2 +-
apps/api/src/app/admin/queue/queue.service.ts | 4 +-
apps/api/src/app/auth/auth.controller.ts | 11 +-
apps/api/src/app/auth/google.strategy.ts | 8 +-
apps/api/src/app/auth/web-auth.service.ts | 11 +-
.../calculator/portfolio-calculator.ts | 8 +-
...io-calculator-dynamic-buy-and-sell.spec.ts | 252 ------------------
...ulator-novn-buy-and-sell-partially.spec.ts | 56 ++--
apps/api/src/app/portfolio/rules.service.ts | 7 +-
apps/api/src/app/user/user.service.ts | 46 +---
...orm-data-source-in-response.interceptor.ts | 2 +-
apps/api/src/models/rule.ts | 10 +-
.../current-investment.ts | 16 +-
.../account-cluster-risk/single-account.ts | 6 +-
.../base-currency-current-investment.ts | 6 +-
.../current-investment.ts | 16 +-
.../emergency-fund/emergency-fund-setup.ts | 6 +-
.../fees/fee-ratio-initial-investment.ts | 16 +-
.../configuration/configuration.service.ts | 22 +-
.../yahoo-finance.service.spec.ts | 4 +
.../yahoo-finance/yahoo-finance.service.ts | 2 +
.../eod-historical-data.service.ts | 6 +-
.../google-sheets/google-sheets.service.ts | 2 +-
.../interfaces/environment.interface.ts | 4 -
.../data-gathering.processor.ts | 12 +-
.../portfolio-snapshot.module.ts | 14 +-
.../portfolio-snapshot.processor.ts | 10 +-
.../portfolio-snapshot.service.ts | 4 +-
.../benchmark-comparator.component.ts | 7 +-
.../home-market/home-market.component.ts | 3 +
.../components/home-market/home-market.html | 10 +
.../home-market/home-market.module.ts | 4 +-
.../investment-chart.component.ts | 7 +-
.../interfaces/interfaces.ts | 2 -
.../rule-settings-dialog.component.ts | 14 +-
.../rule-settings-dialog.html | 90 ++-----
.../app/components/rule/rule.component.html | 2 +-
.../src/app/components/rule/rule.component.ts | 15 +-
.../app/components/rules/rules.component.html | 1 -
.../app/components/rules/rules.component.ts | 4 +-
.../faq/self-hosting/self-hosting-page.html | 56 +---
.../portfolio/fire/fire-page.component.ts | 5 -
.../app/pages/portfolio/fire/fire-page.html | 5 -
apps/client/src/locales/messages.ca.xlf | 50 ++--
apps/client/src/locales/messages.de.xlf | 50 ++--
apps/client/src/locales/messages.es.xlf | 50 ++--
apps/client/src/locales/messages.fr.xlf | 50 ++--
apps/client/src/locales/messages.it.xlf | 50 ++--
apps/client/src/locales/messages.nl.xlf | 50 ++--
apps/client/src/locales/messages.pl.xlf | 50 ++--
apps/client/src/locales/messages.pt.xlf | 50 ++--
apps/client/src/locales/messages.tr.xlf | 50 ++--
apps/client/src/locales/messages.xlf | 50 ++--
apps/client/src/locales/messages.zh.xlf | 50 ++--
libs/common/src/lib/chart-helper.ts | 2 +-
libs/common/src/lib/config.ts | 15 +-
.../portfolio-report-rule.interface.ts | 14 +-
libs/common/src/lib/personal-finance-tools.ts | 28 --
.../lib/types/x-ray-rules-settings.type.ts | 6 +-
.../lib/benchmark/benchmark.component.html | 15 --
.../src/lib/benchmark/benchmark.component.ts | 5 -
.../src/lib/carousel/carousel.component.scss | 2 +-
libs/ui/src/lib/i18n.ts | 1 -
.../lib/line-chart/line-chart.component.ts | 7 +-
.../treemap-chart/treemap-chart.component.ts | 34 +--
package.json | 2 +-
prisma/schema.prisma | 4 +-
.../ok-novn-buy-and-sell-partially.json | 8 +-
tsconfig.base.json | 4 +-
72 files changed, 505 insertions(+), 1016 deletions(-)
delete mode 100644 apps/api/src/app/portfolio/calculator/twr/portfolio-calculator-dynamic-buy-and-sell.spec.ts
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 6b0c1cf71..d83247b12 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -7,49 +7,18 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
## Unreleased
-### Fixed
-
-- Fixed an issue in the carousel component for the testimonial section on the landing page
-
-## 2.116.0 - 2024-10-17
-
-### Added
-
-- Extended the content of the _Self-Hosting_ section by the benchmarks concept for _Compare with..._ on the Frequently Asked Questions (FAQ) page
-- Extended the content of the _Self-Hosting_ section by the benchmarks concept for _Markets_ on the Frequently Asked Questions (FAQ) page
-- Set the permissions (`chmod 0700`) on `entrypoint.sh` in the `Dockerfile`
-
-### Changed
-
-- Improved the empty state in the benchmarks of the markets overview
-- Disabled the text hover effect in the chart of the holdings tab on the home page (experimental)
-- Improved the usability to customize the rule thresholds in the _X-ray_ section by introducing units (experimental)
-- Switched to adjusted market prices (splits and dividends) in the get historical functionality of the _EOD Historical Data_ service
-- Improved the language localization for German (`de`)
-
-### Fixed
-
-- Fixed the usage of the environment variable `PROCESSOR_PORTFOLIO_SNAPSHOT_COMPUTATION_CONCURRENCY`
-
-## 2.115.0 - 2024-10-14
-
### Added
- Added the name to the tooltip of the chart of the holdings tab on the home page (experimental)
### Changed
+- Improved the portfolio unit tests to work with exported activity files
### Fixed
- Considered the language of the user settings on login with _Security Token_
-### Todo
-
-- Rename the environment variable from `PROCESSOR_CONCURRENCY_GATHER_ASSET_PROFILE` to `PROCESSOR_GATHER_ASSET_PROFILE_CONCURRENCY`
-- Rename the environment variable from `PROCESSOR_CONCURRENCY_GATHER_HISTORICAL_MARKET_DATA` to `PROCESSOR_GATHER_HISTORICAL_MARKET_DATA_CONCURRENCY`
-- Rename the environment variable from `PROCESSOR_CONCURRENCY_PORTFOLIO_SNAPSHOT` to `PROCESSOR_PORTFOLIO_SNAPSHOT_COMPUTATION_CONCURRENCY`
-
## 2.114.0 - 2024-10-10
### Added
diff --git a/Dockerfile b/Dockerfile
index 0e5c0d275..e6c38f273 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -61,7 +61,6 @@ RUN apt-get update && apt-get install -y --no-install-suggests \
COPY --chown=node:node --from=builder /ghostfolio/dist/apps /ghostfolio/apps
COPY --chown=node:node ./docker/entrypoint.sh /ghostfolio/entrypoint.sh
-RUN chmod 0700 /ghostfolio/entrypoint.sh
WORKDIR /ghostfolio/apps/api
EXPOSE ${PORT:-3333}
USER node
diff --git a/apps/api/src/app/account/create-account.dto.ts b/apps/api/src/app/account/create-account.dto.ts
index b331d4ec7..f3c88316f 100644
--- a/apps/api/src/app/account/create-account.dto.ts
+++ b/apps/api/src/app/account/create-account.dto.ts
@@ -36,6 +36,6 @@ export class CreateAccountDto {
name: string;
@IsString()
- @ValidateIf((_object, value) => value !== null)
+ @ValidateIf((object, value) => value !== null)
platformId: string | null;
}
diff --git a/apps/api/src/app/account/update-account.dto.ts b/apps/api/src/app/account/update-account.dto.ts
index 3a721d873..6b87af71b 100644
--- a/apps/api/src/app/account/update-account.dto.ts
+++ b/apps/api/src/app/account/update-account.dto.ts
@@ -35,6 +35,6 @@ export class UpdateAccountDto {
name: string;
@IsString()
- @ValidateIf((_object, value) => value !== null)
+ @ValidateIf((object, value) => value !== null)
platformId: string | null;
}
diff --git a/apps/api/src/app/admin/queue/queue.service.ts b/apps/api/src/app/admin/queue/queue.service.ts
index b0058e81f..7e4f0adb7 100644
--- a/apps/api/src/app/admin/queue/queue.service.ts
+++ b/apps/api/src/app/admin/queue/queue.service.ts
@@ -1,6 +1,6 @@
import {
DATA_GATHERING_QUEUE,
- PORTFOLIO_SNAPSHOT_COMPUTATION_QUEUE,
+ PORTFOLIO_SNAPSHOT_QUEUE,
QUEUE_JOB_STATUS_LIST
} from '@ghostfolio/common/config';
import { AdminJobs } from '@ghostfolio/common/interfaces';
@@ -14,7 +14,7 @@ export class QueueService {
public constructor(
@InjectQueue(DATA_GATHERING_QUEUE)
private readonly dataGatheringQueue: Queue,
- @InjectQueue(PORTFOLIO_SNAPSHOT_COMPUTATION_QUEUE)
+ @InjectQueue(PORTFOLIO_SNAPSHOT_QUEUE)
private readonly portfolioSnapshotQueue: Queue
) {}
diff --git a/apps/api/src/app/auth/auth.controller.ts b/apps/api/src/app/auth/auth.controller.ts
index 5019bef21..c81c7e224 100644
--- a/apps/api/src/app/auth/auth.controller.ts
+++ b/apps/api/src/app/auth/auth.controller.ts
@@ -14,12 +14,12 @@ import {
Req,
Res,
UseGuards,
- Version,
- VERSION_NEUTRAL
+ VERSION_NEUTRAL,
+ Version
} from '@nestjs/common';
import { AuthGuard } from '@nestjs/passport';
import { Request, Response } from 'express';
-import { getReasonPhrase, StatusCodes } from 'http-status-codes';
+import { StatusCodes, getReasonPhrase } from 'http-status-codes';
import { AuthService } from './auth.service';
import {
@@ -130,7 +130,10 @@ export class AuthController {
public async verifyAttestation(
@Body() body: { deviceName: string; credential: AttestationCredentialJSON }
) {
- return this.webAuthService.verifyAttestation(body.credential);
+ return this.webAuthService.verifyAttestation(
+ body.deviceName,
+ body.credential
+ );
}
@Post('webauthn/generate-assertion-options')
diff --git a/apps/api/src/app/auth/google.strategy.ts b/apps/api/src/app/auth/google.strategy.ts
index 02f82a7a8..ea6772680 100644
--- a/apps/api/src/app/auth/google.strategy.ts
+++ b/apps/api/src/app/auth/google.strategy.ts
@@ -11,7 +11,7 @@ import { AuthService } from './auth.service';
export class GoogleStrategy extends PassportStrategy(Strategy, 'google') {
public constructor(
private readonly authService: AuthService,
- configurationService: ConfigurationService
+ private readonly configurationService: ConfigurationService
) {
super({
callbackURL: `${configurationService.get(
@@ -25,9 +25,9 @@ export class GoogleStrategy extends PassportStrategy(Strategy, 'google') {
}
public async validate(
- _request: any,
- _token: string,
- _refreshToken: string,
+ request: any,
+ token: string,
+ refreshToken: string,
profile: Profile,
done: Function
) {
diff --git a/apps/api/src/app/auth/web-auth.service.ts b/apps/api/src/app/auth/web-auth.service.ts
index 2f8dd1018..961bbe9a7 100644
--- a/apps/api/src/app/auth/web-auth.service.ts
+++ b/apps/api/src/app/auth/web-auth.service.ts
@@ -13,16 +13,16 @@ import {
import { REQUEST } from '@nestjs/core';
import { JwtService } from '@nestjs/jwt';
import {
- generateAuthenticationOptions,
GenerateAuthenticationOptionsOpts,
- generateRegistrationOptions,
GenerateRegistrationOptionsOpts,
VerifiedAuthenticationResponse,
VerifiedRegistrationResponse,
- verifyAuthenticationResponse,
VerifyAuthenticationResponseOpts,
- verifyRegistrationResponse,
- VerifyRegistrationResponseOpts
+ VerifyRegistrationResponseOpts,
+ generateAuthenticationOptions,
+ generateRegistrationOptions,
+ verifyAuthenticationResponse,
+ verifyRegistrationResponse
} from '@simplewebauthn/server';
import {
@@ -80,6 +80,7 @@ export class WebAuthService {
}
public async verifyAttestation(
+ deviceName: string,
credential: AttestationCredentialJSON
): Promise {
const user = this.request.user;
diff --git a/apps/api/src/app/portfolio/calculator/portfolio-calculator.ts b/apps/api/src/app/portfolio/calculator/portfolio-calculator.ts
index dec0e6387..3d39b80b5 100644
--- a/apps/api/src/app/portfolio/calculator/portfolio-calculator.ts
+++ b/apps/api/src/app/portfolio/calculator/portfolio-calculator.ts
@@ -15,8 +15,8 @@ import { getIntervalFromDateRange } from '@ghostfolio/common/calculation-helper'
import {
PORTFOLIO_SNAPSHOT_PROCESS_JOB_NAME,
PORTFOLIO_SNAPSHOT_PROCESS_JOB_OPTIONS,
- PORTFOLIO_SNAPSHOT_COMPUTATION_QUEUE_PRIORITY_HIGH,
- PORTFOLIO_SNAPSHOT_COMPUTATION_QUEUE_PRIORITY_LOW
+ PORTFOLIO_SNAPSHOT_QUEUE_PRIORITY_HIGH,
+ PORTFOLIO_SNAPSHOT_QUEUE_PRIORITY_LOW
} from '@ghostfolio/common/config';
import {
DATE_FORMAT,
@@ -1080,7 +1080,7 @@ export abstract class PortfolioCalculator {
opts: {
...PORTFOLIO_SNAPSHOT_PROCESS_JOB_OPTIONS,
jobId,
- priority: PORTFOLIO_SNAPSHOT_COMPUTATION_QUEUE_PRIORITY_LOW
+ priority: PORTFOLIO_SNAPSHOT_QUEUE_PRIORITY_LOW
}
});
}
@@ -1096,7 +1096,7 @@ export abstract class PortfolioCalculator {
opts: {
...PORTFOLIO_SNAPSHOT_PROCESS_JOB_OPTIONS,
jobId,
- priority: PORTFOLIO_SNAPSHOT_COMPUTATION_QUEUE_PRIORITY_HIGH
+ priority: PORTFOLIO_SNAPSHOT_QUEUE_PRIORITY_HIGH
}
});
diff --git a/apps/api/src/app/portfolio/calculator/twr/portfolio-calculator-dynamic-buy-and-sell.spec.ts b/apps/api/src/app/portfolio/calculator/twr/portfolio-calculator-dynamic-buy-and-sell.spec.ts
deleted file mode 100644
index 529583fc0..000000000
--- a/apps/api/src/app/portfolio/calculator/twr/portfolio-calculator-dynamic-buy-and-sell.spec.ts
+++ /dev/null
@@ -1,252 +0,0 @@
-import { Activity } from '@ghostfolio/api/app/order/interfaces/activities.interface';
-import { userDummyData } from '@ghostfolio/api/app/portfolio/calculator/portfolio-calculator-test-utils';
-import {
- PerformanceCalculationType,
- PortfolioCalculatorFactory
-} from '@ghostfolio/api/app/portfolio/calculator/portfolio-calculator.factory';
-import { CurrentRateService } from '@ghostfolio/api/app/portfolio/current-rate.service';
-import { CurrentRateServiceMock } from '@ghostfolio/api/app/portfolio/current-rate.service.mock';
-import { RedisCacheService } from '@ghostfolio/api/app/redis-cache/redis-cache.service';
-import { RedisCacheServiceMock } from '@ghostfolio/api/app/redis-cache/redis-cache.service.mock';
-import { ConfigurationService } from '@ghostfolio/api/services/configuration/configuration.service';
-import { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.service';
-import { PortfolioSnapshotService } from '@ghostfolio/api/services/queues/portfolio-snapshot/portfolio-snapshot.service';
-import { PortfolioSnapshotServiceMock } from '@ghostfolio/api/services/queues/portfolio-snapshot/portfolio-snapshot.service.mock';
-import { parseDate } from '@ghostfolio/common/helper';
-
-import { Big } from 'big.js';
-import { existsSync, readFileSync } from 'fs';
-import { last } from 'lodash';
-import { join } from 'path';
-
-jest.mock('@ghostfolio/api/app/portfolio/current-rate.service', () => {
- return {
- // eslint-disable-next-line @typescript-eslint/naming-convention
- CurrentRateService: jest.fn().mockImplementation(() => {
- return CurrentRateServiceMock;
- })
- };
-});
-
-jest.mock(
- '@ghostfolio/api/services/queues/portfolio-snapshot/portfolio-snapshot.service',
- () => {
- return {
- // eslint-disable-next-line @typescript-eslint/naming-convention
- PortfolioSnapshotService: jest.fn().mockImplementation(() => {
- return PortfolioSnapshotServiceMock;
- })
- };
- }
-);
-
-jest.mock('@ghostfolio/api/app/redis-cache/redis-cache.service', () => {
- return {
- // eslint-disable-next-line @typescript-eslint/naming-convention
- RedisCacheService: jest.fn().mockImplementation(() => {
- return RedisCacheServiceMock;
- })
- };
-});
-
-describe('PortfolioCalculator', () => {
- let configurationService: ConfigurationService;
- let currentRateService: CurrentRateService;
- let exchangeRateDataService: ExchangeRateDataService;
- let portfolioCalculatorFactory: PortfolioCalculatorFactory;
- let portfolioSnapshotService: PortfolioSnapshotService;
- let redisCacheService: RedisCacheService;
-
- beforeEach(() => {
- configurationService = new ConfigurationService();
-
- currentRateService = new CurrentRateService(null, null, null, null);
-
- exchangeRateDataService = new ExchangeRateDataService(
- null,
- null,
- null,
- null
- );
-
- portfolioSnapshotService = new PortfolioSnapshotService(null);
-
- redisCacheService = new RedisCacheService(null, null);
-
- portfolioCalculatorFactory = new PortfolioCalculatorFactory(
- configurationService,
- currentRateService,
- exchangeRateDataService,
- portfolioSnapshotService,
- redisCacheService
- );
- });
-
- //read from activities json
- let activities: any[];
-
- beforeAll(() => {
- const jsonFilePath = join(
- __dirname,
- '../../../../../../../test/import/ok-novn-buy-and-sell.json'
- );
-
- if (!existsSync(jsonFilePath))
- throw new Error('JSON file not found at: ' + jsonFilePath);
-
- const jsonData = readFileSync(jsonFilePath, 'utf8');
- activities = JSON.parse(jsonData).activities;
- });
-
- describe('get current positions', () => {
- it.only('with NOVN.SW buy and sell', async () => {
- jest.useFakeTimers().setSystemTime(parseDate('2022-04-11').getTime());
-
- //map activity with json
- const mappedactivities: Activity[] = activities.map((activity) => ({
- ...activity,
- date: new Date(activity.date),
- SymbolProfile: {
- currency: activity.currency || 'CHF',
- dataSource: activity.dataSource || 'YAHOO',
- name: activity.name || 'Default Name', // provide a default name if missing
- symbol: activity.symbol || 'UNKNOWN' // provide a default symbol if missing
- }
- }));
-
- const portfolioCalculator = portfolioCalculatorFactory.createCalculator({
- activities: mappedactivities,
- calculationType: PerformanceCalculationType.TWR,
- currency: 'CHF',
- userId: userDummyData.id
- });
-
- const portfolioSnapshot = await portfolioCalculator.computeSnapshot();
-
- const investments = portfolioCalculator.getInvestments();
-
- const investmentsByMonth = portfolioCalculator.getInvestmentsByGroup({
- data: portfolioSnapshot.historicalData,
- groupBy: 'month'
- });
-
- expect(portfolioSnapshot.historicalData[0]).toEqual({
- date: '2022-03-06',
- investmentValueWithCurrencyEffect: 0,
- netPerformance: 0,
- netPerformanceInPercentage: 0,
- netPerformanceInPercentageWithCurrencyEffect: 0,
- netPerformanceWithCurrencyEffect: 0,
- netWorth: 0,
- totalAccountBalance: 0,
- totalInvestment: 0,
- totalInvestmentValueWithCurrencyEffect: 0,
- value: 0,
- valueWithCurrencyEffect: 0
- });
-
- expect(portfolioSnapshot.historicalData[1]).toEqual({
- date: '2022-03-07',
- investmentValueWithCurrencyEffect: 151.6,
- netPerformance: 0,
- netPerformanceInPercentage: 0,
- netPerformanceInPercentageWithCurrencyEffect: 0,
- netPerformanceWithCurrencyEffect: 0,
- netWorth: 151.6,
- totalAccountBalance: 0,
- totalInvestment: 151.6,
- totalInvestmentValueWithCurrencyEffect: 151.6,
- value: 151.6,
- valueWithCurrencyEffect: 151.6
- });
-
- expect(
- portfolioSnapshot.historicalData[
- portfolioSnapshot.historicalData.length - 1
- ]
- ).toEqual({
- date: '2022-04-11',
- investmentValueWithCurrencyEffect: 0,
- netPerformance: 19.86,
- netPerformanceInPercentage: 0.13100263852242744,
- netPerformanceInPercentageWithCurrencyEffect: 0.13100263852242744,
- netPerformanceWithCurrencyEffect: 19.86,
- netWorth: 0,
- totalAccountBalance: 0,
- totalInvestment: 0,
- totalInvestmentValueWithCurrencyEffect: 0,
- value: 0,
- valueWithCurrencyEffect: 0
- });
-
- expect(portfolioSnapshot).toMatchObject({
- currentValueInBaseCurrency: new Big('0'),
- errors: [],
- hasErrors: false,
- positions: [
- {
- averagePrice: new Big('0'),
- currency: 'CHF',
- dataSource: 'YAHOO',
- dividend: new Big('0'),
- dividendInBaseCurrency: new Big('0'),
- fee: new Big('0'),
- feeInBaseCurrency: new Big('0'),
- firstBuyDate: '2022-03-07',
- grossPerformance: new Big('19.86'),
- grossPerformancePercentage: new Big('0.13100263852242744063'),
- grossPerformancePercentageWithCurrencyEffect: new Big(
- '0.13100263852242744063'
- ),
- grossPerformanceWithCurrencyEffect: new Big('19.86'),
- investment: new Big('0'),
- investmentWithCurrencyEffect: new Big('0'),
- netPerformance: new Big('19.86'),
- netPerformancePercentage: new Big('0.13100263852242744063'),
- netPerformancePercentageWithCurrencyEffectMap: {
- max: new Big('0.13100263852242744063')
- },
- netPerformanceWithCurrencyEffectMap: {
- max: new Big('19.86')
- },
- marketPrice: 87.8,
- marketPriceInBaseCurrency: 87.8,
- quantity: new Big('0'),
- symbol: 'NOVN.SW',
- tags: [],
- timeWeightedInvestment: new Big('151.6'),
- timeWeightedInvestmentWithCurrencyEffect: new Big('151.6'),
- transactionCount: 2,
- valueInBaseCurrency: new Big('0')
- }
- ],
- totalFeesWithCurrencyEffect: new Big('0'),
- totalInterestWithCurrencyEffect: new Big('0'),
- totalInvestment: new Big('0'),
- totalInvestmentWithCurrencyEffect: new Big('0'),
- totalLiabilitiesWithCurrencyEffect: new Big('0'),
- totalValuablesWithCurrencyEffect: new Big('0')
- });
-
- expect(last(portfolioSnapshot.historicalData)).toMatchObject(
- expect.objectContaining({
- netPerformance: 19.86,
- netPerformanceInPercentage: 0.13100263852242744063,
- netPerformanceInPercentageWithCurrencyEffect: 0.13100263852242744063,
- netPerformanceWithCurrencyEffect: 19.86,
- totalInvestmentValueWithCurrencyEffect: 0
- })
- );
-
- expect(investments).toEqual([
- { date: '2022-03-07', investment: new Big('151.6') },
- { date: '2022-04-08', investment: new Big('0') }
- ]);
-
- expect(investmentsByMonth).toEqual([
- { date: '2022-03-01', investment: 151.6 },
- { date: '2022-04-01', investment: -151.6 }
- ]);
- });
- });
-});
diff --git a/apps/api/src/app/portfolio/calculator/twr/portfolio-calculator-novn-buy-and-sell-partially.spec.ts b/apps/api/src/app/portfolio/calculator/twr/portfolio-calculator-novn-buy-and-sell-partially.spec.ts
index f9f99ee45..30eb79754 100644
--- a/apps/api/src/app/portfolio/calculator/twr/portfolio-calculator-novn-buy-and-sell-partially.spec.ts
+++ b/apps/api/src/app/portfolio/calculator/twr/portfolio-calculator-novn-buy-and-sell-partially.spec.ts
@@ -1,8 +1,6 @@
-import { CreateOrderDto } from '@ghostfolio/api/app/order/create-order.dto';
import { Activity } from '@ghostfolio/api/app/order/interfaces/activities.interface';
import {
activityDummyData,
- loadActivityExportFile,
symbolProfileDummyData,
userDummyData
} from '@ghostfolio/api/app/portfolio/calculator/portfolio-calculator-test-utils';
@@ -22,7 +20,6 @@ import { parseDate } from '@ghostfolio/common/helper';
import { Big } from 'big.js';
import { last } from 'lodash';
-import { join } from 'path';
jest.mock('@ghostfolio/api/app/portfolio/current-rate.service', () => {
return {
@@ -55,8 +52,6 @@ jest.mock('@ghostfolio/api/app/redis-cache/redis-cache.service', () => {
});
describe('PortfolioCalculator', () => {
- let activityDtos: CreateOrderDto[];
-
let configurationService: ConfigurationService;
let currentRateService: CurrentRateService;
let exchangeRateDataService: ExchangeRateDataService;
@@ -64,15 +59,6 @@ describe('PortfolioCalculator', () => {
let portfolioSnapshotService: PortfolioSnapshotService;
let redisCacheService: RedisCacheService;
- beforeAll(() => {
- activityDtos = loadActivityExportFile(
- join(
- __dirname,
- '../../../../../../../test/import/ok-novn-buy-and-sell-partially.json'
- )
- );
- });
-
beforeEach(() => {
configurationService = new ConfigurationService();
@@ -102,18 +88,38 @@ describe('PortfolioCalculator', () => {
it.only('with NOVN.SW buy and sell partially', async () => {
jest.useFakeTimers().setSystemTime(parseDate('2022-04-11').getTime());
- const activities: Activity[] = activityDtos.map((activity) => ({
- ...activityDummyData,
- ...activity,
- date: parseDate(activity.date),
- SymbolProfile: {
- ...symbolProfileDummyData,
- currency: activity.currency,
- dataSource: activity.dataSource,
- name: 'Novartis AG',
- symbol: activity.symbol
+ const activities: Activity[] = [
+ {
+ ...activityDummyData,
+ date: new Date('2022-03-07'),
+ fee: 1.3,
+ quantity: 2,
+ SymbolProfile: {
+ ...symbolProfileDummyData,
+ currency: 'CHF',
+ dataSource: 'YAHOO',
+ name: 'Novartis AG',
+ symbol: 'NOVN.SW'
+ },
+ type: 'BUY',
+ unitPrice: 75.8
+ },
+ {
+ ...activityDummyData,
+ date: new Date('2022-04-08'),
+ fee: 2.95,
+ quantity: 1,
+ SymbolProfile: {
+ ...symbolProfileDummyData,
+ currency: 'CHF',
+ dataSource: 'YAHOO',
+ name: 'Novartis AG',
+ symbol: 'NOVN.SW'
+ },
+ type: 'SELL',
+ unitPrice: 85.73
}
- }));
+ ];
const portfolioCalculator = portfolioCalculatorFactory.createCalculator({
activities,
diff --git a/apps/api/src/app/portfolio/rules.service.ts b/apps/api/src/app/portfolio/rules.service.ts
index 5f0aa64d5..fd9d794b2 100644
--- a/apps/api/src/app/portfolio/rules.service.ts
+++ b/apps/api/src/app/portfolio/rules.service.ts
@@ -24,10 +24,13 @@ export class RulesService {
return {
evaluation,
value,
- configuration: rule.getConfiguration(),
isActive: true,
key: rule.getKey(),
- name: rule.getName()
+ name: rule.getName(),
+ settings: {
+ thresholdMax: settings['thresholdMax'],
+ thresholdMin: settings['thresholdMin']
+ }
};
} else {
return {
diff --git a/apps/api/src/app/user/user.service.ts b/apps/api/src/app/user/user.service.ts
index e8a437be6..0f76b9540 100644
--- a/apps/api/src/app/user/user.service.ts
+++ b/apps/api/src/app/user/user.service.ts
@@ -2,12 +2,6 @@ import { OrderService } from '@ghostfolio/api/app/order/order.service';
import { SubscriptionService } from '@ghostfolio/api/app/subscription/subscription.service';
import { environment } from '@ghostfolio/api/environments/environment';
import { PortfolioChangedEvent } from '@ghostfolio/api/events/portfolio-changed.event';
-import { AccountClusterRiskCurrentInvestment } from '@ghostfolio/api/models/rules/account-cluster-risk/current-investment';
-import { AccountClusterRiskSingleAccount } from '@ghostfolio/api/models/rules/account-cluster-risk/single-account';
-import { CurrencyClusterRiskBaseCurrencyCurrentInvestment } from '@ghostfolio/api/models/rules/currency-cluster-risk/base-currency-current-investment';
-import { CurrencyClusterRiskCurrentInvestment } from '@ghostfolio/api/models/rules/currency-cluster-risk/current-investment';
-import { EmergencyFundSetup } from '@ghostfolio/api/models/rules/emergency-fund/emergency-fund-setup';
-import { FeeRatioInitialInvestment } from '@ghostfolio/api/models/rules/fees/fee-ratio-initial-investment';
import { ConfigurationService } from '@ghostfolio/api/services/configuration/configuration.service';
import { I18nService } from '@ghostfolio/api/services/i18n/i18n.service';
import { PrismaService } from '@ghostfolio/api/services/prisma/prisma.service';
@@ -206,35 +200,17 @@ export class UserService {
(user.Settings.settings as UserSettings).viewMode = 'DEFAULT';
}
- (user.Settings.settings as UserSettings).xRayRules = {
- AccountClusterRiskCurrentInvestment:
- new AccountClusterRiskCurrentInvestment(undefined, {}).getSettings(
- user.Settings.settings
- ),
- AccountClusterRiskSingleAccount: new AccountClusterRiskSingleAccount(
- undefined,
- {}
- ).getSettings(user.Settings.settings),
- CurrencyClusterRiskBaseCurrencyCurrentInvestment:
- new CurrencyClusterRiskBaseCurrencyCurrentInvestment(
- undefined,
- undefined
- ).getSettings(user.Settings.settings),
- CurrencyClusterRiskCurrentInvestment:
- new CurrencyClusterRiskCurrentInvestment(
- undefined,
- undefined
- ).getSettings(user.Settings.settings),
- EmergencyFundSetup: new EmergencyFundSetup(
- undefined,
- undefined
- ).getSettings(user.Settings.settings),
- FeeRatioInitialInvestment: new FeeRatioInitialInvestment(
- undefined,
- undefined,
- undefined
- ).getSettings(user.Settings.settings)
- };
+ // Set default values for X-ray rules
+ if (!(user.Settings.settings as UserSettings).xRayRules) {
+ (user.Settings.settings as UserSettings).xRayRules = {
+ AccountClusterRiskCurrentInvestment: { isActive: true },
+ AccountClusterRiskSingleAccount: { isActive: true },
+ CurrencyClusterRiskBaseCurrencyCurrentInvestment: { isActive: true },
+ CurrencyClusterRiskCurrentInvestment: { isActive: true },
+ EmergencyFundSetup: { isActive: true },
+ FeeRatioInitialInvestment: { isActive: true }
+ };
+ }
let currentPermissions = getPermissions(user.role);
diff --git a/apps/api/src/interceptors/transform-data-source-in-response/transform-data-source-in-response.interceptor.ts b/apps/api/src/interceptors/transform-data-source-in-response/transform-data-source-in-response.interceptor.ts
index f5034927c..aff42f002 100644
--- a/apps/api/src/interceptors/transform-data-source-in-response/transform-data-source-in-response.interceptor.ts
+++ b/apps/api/src/interceptors/transform-data-source-in-response/transform-data-source-in-response.interceptor.ts
@@ -21,7 +21,7 @@ export class TransformDataSourceInResponseInterceptor
) {}
public intercept(
- _context: ExecutionContext,
+ context: ExecutionContext,
next: CallHandler
): Observable {
return next.handle().pipe(
diff --git a/apps/api/src/models/rule.ts b/apps/api/src/models/rule.ts
index 187527fbb..a1e0d9bee 100644
--- a/apps/api/src/models/rule.ts
+++ b/apps/api/src/models/rule.ts
@@ -1,11 +1,7 @@
import { RuleSettings } from '@ghostfolio/api/models/interfaces/rule-settings.interface';
import { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.service';
import { groupBy } from '@ghostfolio/common/helper';
-import {
- PortfolioPosition,
- PortfolioReportRule,
- UserSettings
-} from '@ghostfolio/common/interfaces';
+import { PortfolioPosition, UserSettings } from '@ghostfolio/common/interfaces';
import { Big } from 'big.js';
@@ -69,9 +65,5 @@ export abstract class Rule implements RuleInterface {
public abstract evaluate(aRuleSettings: T): EvaluationResult;
- public abstract getConfiguration(): Partial<
- PortfolioReportRule['configuration']
- >;
-
public abstract getSettings(aUserSettings: UserSettings): T;
}
diff --git a/apps/api/src/models/rules/account-cluster-risk/current-investment.ts b/apps/api/src/models/rules/account-cluster-risk/current-investment.ts
index 564af935d..13680270e 100644
--- a/apps/api/src/models/rules/account-cluster-risk/current-investment.ts
+++ b/apps/api/src/models/rules/account-cluster-risk/current-investment.ts
@@ -76,23 +76,11 @@ export class AccountClusterRiskCurrentInvestment extends Rule {
};
}
- public getConfiguration() {
- return {
- threshold: {
- max: 1,
- min: 0,
- step: 0.01,
- unit: '%'
- },
- thresholdMax: true
- };
- }
-
public getSettings({ baseCurrency, xRayRules }: UserSettings): Settings {
return {
baseCurrency,
- isActive: xRayRules?.[this.getKey()].isActive ?? true,
- thresholdMax: xRayRules?.[this.getKey()]?.thresholdMax ?? 0.5
+ isActive: xRayRules[this.getKey()].isActive,
+ thresholdMax: xRayRules[this.getKey()]?.thresholdMax ?? 0.5
};
}
}
diff --git a/apps/api/src/models/rules/account-cluster-risk/single-account.ts b/apps/api/src/models/rules/account-cluster-risk/single-account.ts
index ef549e579..feaaf4e38 100644
--- a/apps/api/src/models/rules/account-cluster-risk/single-account.ts
+++ b/apps/api/src/models/rules/account-cluster-risk/single-account.ts
@@ -34,13 +34,9 @@ export class AccountClusterRiskSingleAccount extends Rule {
};
}
- public getConfiguration() {
- return undefined;
- }
-
public getSettings({ xRayRules }: UserSettings): RuleSettings {
return {
- isActive: xRayRules?.[this.getKey()].isActive ?? true
+ isActive: xRayRules[this.getKey()].isActive
};
}
}
diff --git a/apps/api/src/models/rules/currency-cluster-risk/base-currency-current-investment.ts b/apps/api/src/models/rules/currency-cluster-risk/base-currency-current-investment.ts
index 573795799..39ee8b88d 100644
--- a/apps/api/src/models/rules/currency-cluster-risk/base-currency-current-investment.ts
+++ b/apps/api/src/models/rules/currency-cluster-risk/base-currency-current-investment.ts
@@ -61,14 +61,10 @@ export class CurrencyClusterRiskBaseCurrencyCurrentInvestment extends Rule {
};
}
- public getConfiguration() {
- return {
- threshold: {
- max: 1,
- min: 0,
- step: 0.01,
- unit: '%'
- },
- thresholdMax: true
- };
- }
-
public getSettings({ baseCurrency, xRayRules }: UserSettings): Settings {
return {
baseCurrency,
- isActive: xRayRules?.[this.getKey()].isActive ?? true,
- thresholdMax: xRayRules?.[this.getKey()]?.thresholdMax ?? 0.5
+ isActive: xRayRules[this.getKey()].isActive,
+ thresholdMax: xRayRules[this.getKey()]?.thresholdMax ?? 0.5
};
}
}
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 d13f2ffc5..819b8bd7b 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
@@ -32,14 +32,10 @@ export class EmergencyFundSetup extends Rule {
};
}
- public getConfiguration() {
- return undefined;
- }
-
public getSettings({ baseCurrency, xRayRules }: UserSettings): Settings {
return {
baseCurrency,
- isActive: xRayRules?.[this.getKey()].isActive ?? true
+ isActive: xRayRules[this.getKey()].isActive
};
}
}
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 fa9d7e7bc..9b1961ed6 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
@@ -43,23 +43,11 @@ export class FeeRatioInitialInvestment extends Rule {
};
}
- public getConfiguration() {
- return {
- threshold: {
- max: 0.1,
- min: 0,
- step: 0.0025,
- unit: '%'
- },
- thresholdMax: true
- };
- }
-
public getSettings({ baseCurrency, xRayRules }: UserSettings): Settings {
return {
baseCurrency,
- isActive: xRayRules?.[this.getKey()].isActive ?? true,
- thresholdMax: xRayRules?.[this.getKey()]?.thresholdMax ?? 0.01
+ isActive: xRayRules[this.getKey()].isActive,
+ thresholdMax: xRayRules[this.getKey()]?.thresholdMax ?? 0.01
};
}
}
diff --git a/apps/api/src/services/configuration/configuration.service.ts b/apps/api/src/services/configuration/configuration.service.ts
index 10810deb5..cca393a2a 100644
--- a/apps/api/src/services/configuration/configuration.service.ts
+++ b/apps/api/src/services/configuration/configuration.service.ts
@@ -1,10 +1,9 @@
import { Environment } from '@ghostfolio/api/services/interfaces/environment.interface';
import {
CACHE_TTL_NO_CACHE,
- DEFAULT_PROCESSOR_GATHER_ASSET_PROFILE_CONCURRENCY,
- DEFAULT_PROCESSOR_GATHER_HISTORICAL_MARKET_DATA_CONCURRENCY,
- DEFAULT_PROCESSOR_PORTFOLIO_SNAPSHOT_COMPUTATION_CONCURRENCY,
- DEFAULT_PROCESSOR_PORTFOLIO_SNAPSHOT_COMPUTATION_TIMEOUT,
+ DEFAULT_PROCESSOR_CONCURRENCY_GATHER_ASSET_PROFILE,
+ DEFAULT_PROCESSOR_CONCURRENCY_GATHER_HISTORICAL_MARKET_DATA,
+ DEFAULT_PROCESSOR_CONCURRENCY_PORTFOLIO_SNAPSHOT,
DEFAULT_ROOT_URL
} from '@ghostfolio/common/config';
@@ -51,17 +50,14 @@ export class ConfigurationService {
MAX_ACTIVITIES_TO_IMPORT: num({ default: Number.MAX_SAFE_INTEGER }),
MAX_CHART_ITEMS: num({ default: 365 }),
PORT: port({ default: 3333 }),
- PROCESSOR_GATHER_ASSET_PROFILE_CONCURRENCY: num({
- default: DEFAULT_PROCESSOR_GATHER_ASSET_PROFILE_CONCURRENCY
+ PROCESSOR_CONCURRENCY_GATHER_ASSET_PROFILE: num({
+ default: DEFAULT_PROCESSOR_CONCURRENCY_GATHER_ASSET_PROFILE
}),
- PROCESSOR_GATHER_HISTORICAL_MARKET_DATA_CONCURRENCY: num({
- default: DEFAULT_PROCESSOR_GATHER_HISTORICAL_MARKET_DATA_CONCURRENCY
+ PROCESSOR_CONCURRENCY_GATHER_HISTORICAL_MARKET_DATA: num({
+ default: DEFAULT_PROCESSOR_CONCURRENCY_GATHER_HISTORICAL_MARKET_DATA
}),
- PROCESSOR_PORTFOLIO_SNAPSHOT_COMPUTATION_CONCURRENCY: num({
- default: DEFAULT_PROCESSOR_PORTFOLIO_SNAPSHOT_COMPUTATION_CONCURRENCY
- }),
- PROCESSOR_PORTFOLIO_SNAPSHOT_COMPUTATION_TIMEOUT: num({
- default: DEFAULT_PROCESSOR_PORTFOLIO_SNAPSHOT_COMPUTATION_TIMEOUT
+ PROCESSOR_CONCURRENCY_PORTFOLIO_SNAPSHOT: num({
+ default: DEFAULT_PROCESSOR_CONCURRENCY_PORTFOLIO_SNAPSHOT
}),
REDIS_DB: num({ default: 0 }),
REDIS_HOST: str({ default: 'localhost' }),
diff --git a/apps/api/src/services/data-provider/data-enhancer/yahoo-finance/yahoo-finance.service.spec.ts b/apps/api/src/services/data-provider/data-enhancer/yahoo-finance/yahoo-finance.service.spec.ts
index 8a8ab1f08..951a623d0 100644
--- a/apps/api/src/services/data-provider/data-enhancer/yahoo-finance/yahoo-finance.service.spec.ts
+++ b/apps/api/src/services/data-provider/data-enhancer/yahoo-finance/yahoo-finance.service.spec.ts
@@ -1,3 +1,4 @@
+import { ConfigurationService } from '@ghostfolio/api/services/configuration/configuration.service';
import { CryptocurrencyService } from '@ghostfolio/api/services/cryptocurrency/cryptocurrency.service';
import { YahooFinanceDataEnhancerService } from './yahoo-finance.service';
@@ -25,13 +26,16 @@ jest.mock(
);
describe('YahooFinanceDataEnhancerService', () => {
+ let configurationService: ConfigurationService;
let cryptocurrencyService: CryptocurrencyService;
let yahooFinanceDataEnhancerService: YahooFinanceDataEnhancerService;
beforeAll(async () => {
+ configurationService = new ConfigurationService();
cryptocurrencyService = new CryptocurrencyService();
yahooFinanceDataEnhancerService = new YahooFinanceDataEnhancerService(
+ configurationService,
cryptocurrencyService
);
});
diff --git a/apps/api/src/services/data-provider/data-enhancer/yahoo-finance/yahoo-finance.service.ts b/apps/api/src/services/data-provider/data-enhancer/yahoo-finance/yahoo-finance.service.ts
index 6090b4f98..1b1335b7e 100644
--- a/apps/api/src/services/data-provider/data-enhancer/yahoo-finance/yahoo-finance.service.ts
+++ b/apps/api/src/services/data-provider/data-enhancer/yahoo-finance/yahoo-finance.service.ts
@@ -1,3 +1,4 @@
+import { ConfigurationService } from '@ghostfolio/api/services/configuration/configuration.service';
import { CryptocurrencyService } from '@ghostfolio/api/services/cryptocurrency/cryptocurrency.service';
import { DataEnhancerInterface } from '@ghostfolio/api/services/data-provider/interfaces/data-enhancer.interface';
import {
@@ -23,6 +24,7 @@ import type { Price } from 'yahoo-finance2/dist/esm/src/modules/quoteSummary-ifa
@Injectable()
export class YahooFinanceDataEnhancerService implements DataEnhancerInterface {
public constructor(
+ private readonly configurationService: ConfigurationService,
private readonly cryptocurrencyService: CryptocurrencyService
) {}
diff --git a/apps/api/src/services/data-provider/eod-historical-data/eod-historical-data.service.ts b/apps/api/src/services/data-provider/eod-historical-data/eod-historical-data.service.ts
index 78325d447..3a840340e 100644
--- a/apps/api/src/services/data-provider/eod-historical-data/eod-historical-data.service.ts
+++ b/apps/api/src/services/data-provider/eod-historical-data/eod-historical-data.service.ts
@@ -163,10 +163,10 @@ export class EodHistoricalDataService implements DataProviderInterface {
).json();
return response.reduce(
- (result, { adjusted_close, date }) => {
- if (isNumber(adjusted_close)) {
+ (result, { close, date }) => {
+ if (isNumber(close)) {
result[this.convertFromEodSymbol(symbol)][date] = {
- marketPrice: adjusted_close
+ marketPrice: close
};
} else {
Logger.error(
diff --git a/apps/api/src/services/data-provider/google-sheets/google-sheets.service.ts b/apps/api/src/services/data-provider/google-sheets/google-sheets.service.ts
index 9f2344233..966069f22 100644
--- a/apps/api/src/services/data-provider/google-sheets/google-sheets.service.ts
+++ b/apps/api/src/services/data-provider/google-sheets/google-sheets.service.ts
@@ -76,7 +76,7 @@ export class GoogleSheetsService implements DataProviderInterface {
} = {};
rows
- .filter((_row, index) => {
+ .filter((row, index) => {
return index >= 1;
})
.forEach((row) => {
diff --git a/apps/api/src/services/interfaces/environment.interface.ts b/apps/api/src/services/interfaces/environment.interface.ts
index 8d6dd34de..d07937787 100644
--- a/apps/api/src/services/interfaces/environment.interface.ts
+++ b/apps/api/src/services/interfaces/environment.interface.ts
@@ -30,10 +30,6 @@ export interface Environment extends CleanedEnvAccessors {
MAX_ACTIVITIES_TO_IMPORT: number;
MAX_CHART_ITEMS: number;
PORT: number;
- PROCESSOR_GATHER_ASSET_PROFILE_CONCURRENCY: number;
- PROCESSOR_GATHER_HISTORICAL_MARKET_DATA_CONCURRENCY: number;
- PROCESSOR_PORTFOLIO_SNAPSHOT_COMPUTATION_CONCURRENCY: number;
- PROCESSOR_PORTFOLIO_SNAPSHOT_COMPUTATION_TIMEOUT: number;
REDIS_DB: number;
REDIS_HOST: string;
REDIS_PASSWORD: string;
diff --git a/apps/api/src/services/queues/data-gathering/data-gathering.processor.ts b/apps/api/src/services/queues/data-gathering/data-gathering.processor.ts
index 5d0d1e131..2745aa288 100644
--- a/apps/api/src/services/queues/data-gathering/data-gathering.processor.ts
+++ b/apps/api/src/services/queues/data-gathering/data-gathering.processor.ts
@@ -3,8 +3,8 @@ import { IDataGatheringItem } from '@ghostfolio/api/services/interfaces/interfac
import { MarketDataService } from '@ghostfolio/api/services/market-data/market-data.service';
import {
DATA_GATHERING_QUEUE,
- DEFAULT_PROCESSOR_GATHER_ASSET_PROFILE_CONCURRENCY,
- DEFAULT_PROCESSOR_GATHER_HISTORICAL_MARKET_DATA_CONCURRENCY,
+ DEFAULT_PROCESSOR_CONCURRENCY_GATHER_ASSET_PROFILE,
+ DEFAULT_PROCESSOR_CONCURRENCY_GATHER_HISTORICAL_MARKET_DATA,
GATHER_ASSET_PROFILE_PROCESS,
GATHER_HISTORICAL_MARKET_DATA_PROCESS_JOB_NAME
} from '@ghostfolio/common/config';
@@ -38,8 +38,8 @@ export class DataGatheringProcessor {
@Process({
concurrency: parseInt(
- process.env.PROCESSOR_GATHER_ASSET_PROFILE_CONCURRENCY ??
- DEFAULT_PROCESSOR_GATHER_ASSET_PROFILE_CONCURRENCY.toString(),
+ process.env.PROCESSOR_CONCURRENCY_GATHER_ASSET_PROFILE ??
+ DEFAULT_PROCESSOR_CONCURRENCY_GATHER_ASSET_PROFILE.toString(),
10
),
name: GATHER_ASSET_PROFILE_PROCESS
@@ -69,8 +69,8 @@ export class DataGatheringProcessor {
@Process({
concurrency: parseInt(
- process.env.PROCESSOR_GATHER_HISTORICAL_MARKET_DATA_CONCURRENCY ??
- DEFAULT_PROCESSOR_GATHER_HISTORICAL_MARKET_DATA_CONCURRENCY.toString(),
+ process.env.PROCESSOR_CONCURRENCY_GATHER_HISTORICAL_MARKET_DATA ??
+ DEFAULT_PROCESSOR_CONCURRENCY_GATHER_HISTORICAL_MARKET_DATA.toString(),
10
),
name: GATHER_HISTORICAL_MARKET_DATA_PROCESS_JOB_NAME
diff --git a/apps/api/src/services/queues/portfolio-snapshot/portfolio-snapshot.module.ts b/apps/api/src/services/queues/portfolio-snapshot/portfolio-snapshot.module.ts
index 958636334..620feda53 100644
--- a/apps/api/src/services/queues/portfolio-snapshot/portfolio-snapshot.module.ts
+++ b/apps/api/src/services/queues/portfolio-snapshot/portfolio-snapshot.module.ts
@@ -8,10 +8,7 @@ import { DataProviderModule } from '@ghostfolio/api/services/data-provider/data-
import { ExchangeRateDataModule } from '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.module';
import { MarketDataModule } from '@ghostfolio/api/services/market-data/market-data.module';
import { PortfolioSnapshotService } from '@ghostfolio/api/services/queues/portfolio-snapshot/portfolio-snapshot.service';
-import {
- DEFAULT_PROCESSOR_PORTFOLIO_SNAPSHOT_COMPUTATION_TIMEOUT,
- PORTFOLIO_SNAPSHOT_COMPUTATION_QUEUE
-} from '@ghostfolio/common/config';
+import { PORTFOLIO_SNAPSHOT_QUEUE } from '@ghostfolio/common/config';
import { BullModule } from '@nestjs/bull';
import { Module } from '@nestjs/common';
@@ -23,14 +20,7 @@ import { PortfolioSnapshotProcessor } from './portfolio-snapshot.processor';
imports: [
AccountBalanceModule,
BullModule.registerQueue({
- name: PORTFOLIO_SNAPSHOT_COMPUTATION_QUEUE,
- settings: {
- lockDuration: parseInt(
- process.env.PROCESSOR_PORTFOLIO_SNAPSHOT_COMPUTATION_TIMEOUT ??
- DEFAULT_PROCESSOR_PORTFOLIO_SNAPSHOT_COMPUTATION_TIMEOUT.toString(),
- 10
- )
- }
+ name: PORTFOLIO_SNAPSHOT_QUEUE
}),
ConfigurationModule,
DataProviderModule,
diff --git a/apps/api/src/services/queues/portfolio-snapshot/portfolio-snapshot.processor.ts b/apps/api/src/services/queues/portfolio-snapshot/portfolio-snapshot.processor.ts
index c586a51b3..7c89e9c23 100644
--- a/apps/api/src/services/queues/portfolio-snapshot/portfolio-snapshot.processor.ts
+++ b/apps/api/src/services/queues/portfolio-snapshot/portfolio-snapshot.processor.ts
@@ -9,9 +9,9 @@ import { RedisCacheService } from '@ghostfolio/api/app/redis-cache/redis-cache.s
import { ConfigurationService } from '@ghostfolio/api/services/configuration/configuration.service';
import {
CACHE_TTL_INFINITE,
- DEFAULT_PROCESSOR_PORTFOLIO_SNAPSHOT_COMPUTATION_CONCURRENCY,
+ DEFAULT_PROCESSOR_CONCURRENCY_PORTFOLIO_SNAPSHOT,
PORTFOLIO_SNAPSHOT_PROCESS_JOB_NAME,
- PORTFOLIO_SNAPSHOT_COMPUTATION_QUEUE
+ PORTFOLIO_SNAPSHOT_QUEUE
} from '@ghostfolio/common/config';
import { Process, Processor } from '@nestjs/bull';
@@ -22,7 +22,7 @@ import { addMilliseconds } from 'date-fns';
import { IPortfolioSnapshotQueueJob } from './interfaces/portfolio-snapshot-queue-job.interface';
@Injectable()
-@Processor(PORTFOLIO_SNAPSHOT_COMPUTATION_QUEUE)
+@Processor(PORTFOLIO_SNAPSHOT_QUEUE)
export class PortfolioSnapshotProcessor {
public constructor(
private readonly accountBalanceService: AccountBalanceService,
@@ -34,8 +34,8 @@ export class PortfolioSnapshotProcessor {
@Process({
concurrency: parseInt(
- process.env.PROCESSOR_PORTFOLIO_SNAPSHOT_COMPUTATION_CONCURRENCY ??
- DEFAULT_PROCESSOR_PORTFOLIO_SNAPSHOT_COMPUTATION_CONCURRENCY.toString(),
+ process.env.PROCESSOR_CONCURRENCY_PORTFOLIO_SNAPSHOT ??
+ DEFAULT_PROCESSOR_CONCURRENCY_PORTFOLIO_SNAPSHOT.toString(),
10
),
name: PORTFOLIO_SNAPSHOT_PROCESS_JOB_NAME
diff --git a/apps/api/src/services/queues/portfolio-snapshot/portfolio-snapshot.service.ts b/apps/api/src/services/queues/portfolio-snapshot/portfolio-snapshot.service.ts
index 9dba9275e..27ebdee53 100644
--- a/apps/api/src/services/queues/portfolio-snapshot/portfolio-snapshot.service.ts
+++ b/apps/api/src/services/queues/portfolio-snapshot/portfolio-snapshot.service.ts
@@ -1,4 +1,4 @@
-import { PORTFOLIO_SNAPSHOT_COMPUTATION_QUEUE } from '@ghostfolio/common/config';
+import { PORTFOLIO_SNAPSHOT_QUEUE } from '@ghostfolio/common/config';
import { InjectQueue } from '@nestjs/bull';
import { Injectable } from '@nestjs/common';
@@ -9,7 +9,7 @@ import { IPortfolioSnapshotQueueJob } from './interfaces/portfolio-snapshot-queu
@Injectable()
export class PortfolioSnapshotService {
public constructor(
- @InjectQueue(PORTFOLIO_SNAPSHOT_COMPUTATION_QUEUE)
+ @InjectQueue(PORTFOLIO_SNAPSHOT_QUEUE)
private readonly portfolioSnapshotQueue: Queue
) {}
diff --git a/apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts b/apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts
index dc80b4058..a59515969 100644
--- a/apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts
+++ b/apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts
@@ -29,13 +29,12 @@ import { SymbolProfile } from '@prisma/client';
import {
Chart,
ChartData,
- LinearScale,
LineController,
LineElement,
+ LinearScale,
PointElement,
TimeScale,
- Tooltip,
- TooltipPosition
+ Tooltip
} from 'chart.js';
import 'chartjs-adapter-date-fns';
import annotationPlugin from 'chartjs-plugin-annotation';
@@ -75,7 +74,7 @@ export class BenchmarkComparatorComponent implements OnChanges, OnDestroy {
Tooltip
);
- Tooltip.positioners['top'] = (_elements, position: TooltipPosition) =>
+ Tooltip.positioners['top'] = (elements, position) =>
getTooltipPositionerMapTop(this.chart, position);
}
diff --git a/apps/client/src/app/components/home-market/home-market.component.ts b/apps/client/src/app/components/home-market/home-market.component.ts
index 3480eaeb7..3a42a9ebc 100644
--- a/apps/client/src/app/components/home-market/home-market.component.ts
+++ b/apps/client/src/app/components/home-market/home-market.component.ts
@@ -29,6 +29,7 @@ export class HomeMarketComponent implements OnDestroy, OnInit {
public hasPermissionToAccessFearAndGreedIndex: boolean;
public historicalDataItems: HistoricalDataItem[];
public info: InfoItem;
+ public isLoading = true;
public readonly numberOfDays = 365;
public user: User;
@@ -42,6 +43,7 @@ export class HomeMarketComponent implements OnDestroy, OnInit {
) {
this.deviceType = this.deviceService.getDeviceInfo().deviceType;
this.info = this.dataService.fetchInfo();
+ this.isLoading = true;
this.userService.stateChanged
.pipe(takeUntil(this.unsubscribeSubject))
@@ -87,6 +89,7 @@ export class HomeMarketComponent implements OnDestroy, OnInit {
.pipe(takeUntil(this.unsubscribeSubject))
.subscribe(({ benchmarks }) => {
this.benchmarks = benchmarks;
+ this.isLoading = false;
this.changeDetectorRef.markForCheck();
});
diff --git a/apps/client/src/app/components/home-market/home-market.html b/apps/client/src/app/components/home-market/home-market.html
index 2fcdb5716..c362fdd18 100644
--- a/apps/client/src/app/components/home-market/home-market.html
+++ b/apps/client/src/app/components/home-market/home-market.html
@@ -36,6 +36,16 @@
[locale]="user?.settings?.locale || undefined"
[user]="user"
/>
+ @if (isLoading) {
+
+ }
diff --git a/apps/client/src/app/components/home-market/home-market.module.ts b/apps/client/src/app/components/home-market/home-market.module.ts
index b8e6582a5..bc35b4bef 100644
--- a/apps/client/src/app/components/home-market/home-market.module.ts
+++ b/apps/client/src/app/components/home-market/home-market.module.ts
@@ -4,6 +4,7 @@ import { GfLineChartComponent } from '@ghostfolio/ui/line-chart';
import { CommonModule } from '@angular/common';
import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core';
+import { NgxSkeletonLoaderModule } from 'ngx-skeleton-loader';
import { HomeMarketComponent } from './home-market.component';
@@ -14,7 +15,8 @@ import { HomeMarketComponent } from './home-market.component';
CommonModule,
GfBenchmarkComponent,
GfFearAndGreedIndexModule,
- GfLineChartComponent
+ GfLineChartComponent,
+ NgxSkeletonLoaderModule
],
schemas: [CUSTOM_ELEMENTS_SCHEMA]
})
diff --git a/apps/client/src/app/components/investment-chart/investment-chart.component.ts b/apps/client/src/app/components/investment-chart/investment-chart.component.ts
index e84032060..15a4a6f9a 100644
--- a/apps/client/src/app/components/investment-chart/investment-chart.component.ts
+++ b/apps/client/src/app/components/investment-chart/investment-chart.component.ts
@@ -29,13 +29,12 @@ import {
BarElement,
Chart,
ChartData,
- LinearScale,
LineController,
LineElement,
+ LinearScale,
PointElement,
TimeScale,
- Tooltip,
- TooltipPosition
+ Tooltip
} from 'chart.js';
import 'chartjs-adapter-date-fns';
import annotationPlugin from 'chartjs-plugin-annotation';
@@ -80,7 +79,7 @@ export class InvestmentChartComponent implements OnChanges, OnDestroy {
Tooltip
);
- Tooltip.positioners['top'] = (_elements, position: TooltipPosition) =>
+ Tooltip.positioners['top'] = (elements, position) =>
getTooltipPositionerMapTop(this.chart, position);
}
diff --git a/apps/client/src/app/components/rule/rule-settings-dialog/interfaces/interfaces.ts b/apps/client/src/app/components/rule/rule-settings-dialog/interfaces/interfaces.ts
index 7eee7e52d..a409ab503 100644
--- a/apps/client/src/app/components/rule/rule-settings-dialog/interfaces/interfaces.ts
+++ b/apps/client/src/app/components/rule/rule-settings-dialog/interfaces/interfaces.ts
@@ -1,7 +1,5 @@
import { PortfolioReportRule } from '@ghostfolio/common/interfaces';
-import { XRayRulesSettings } from '@ghostfolio/common/types';
export interface IRuleSettingsDialogParams {
rule: PortfolioReportRule;
- settings: XRayRulesSettings['AccountClusterRiskCurrentInvestment'];
}
diff --git a/apps/client/src/app/components/rule/rule-settings-dialog/rule-settings-dialog.component.ts b/apps/client/src/app/components/rule/rule-settings-dialog/rule-settings-dialog.component.ts
index 7aa228776..265d3c941 100644
--- a/apps/client/src/app/components/rule/rule-settings-dialog/rule-settings-dialog.component.ts
+++ b/apps/client/src/app/components/rule/rule-settings-dialog/rule-settings-dialog.component.ts
@@ -1,4 +1,4 @@
-import { XRayRulesSettings } from '@ghostfolio/common/types';
+import { PortfolioReportRule } from '@ghostfolio/common/interfaces';
import { CommonModule } from '@angular/common';
import { Component, Inject } from '@angular/core';
@@ -9,7 +9,8 @@ import {
MatDialogModule,
MatDialogRef
} from '@angular/material/dialog';
-import { MatSliderModule } from '@angular/material/slider';
+import { MatFormFieldModule } from '@angular/material/form-field';
+import { MatInputModule } from '@angular/material/input';
import { IRuleSettingsDialogParams } from './interfaces/interfaces';
@@ -19,7 +20,8 @@ import { IRuleSettingsDialogParams } from './interfaces/interfaces';
FormsModule,
MatButtonModule,
MatDialogModule,
- MatSliderModule
+ MatFormFieldModule,
+ MatInputModule
],
selector: 'gf-rule-settings-dialog',
standalone: true,
@@ -27,10 +29,12 @@ import { IRuleSettingsDialogParams } from './interfaces/interfaces';
templateUrl: './rule-settings-dialog.html'
})
export class GfRuleSettingsDialogComponent {
- public settings: XRayRulesSettings['AccountClusterRiskCurrentInvestment'];
+ public settings: PortfolioReportRule['settings'];
public constructor(
@Inject(MAT_DIALOG_DATA) public data: IRuleSettingsDialogParams,
public dialogRef: MatDialogRef
- ) {}
+ ) {
+ this.settings = this.data.rule.settings;
+ }
}
diff --git a/apps/client/src/app/components/rule/rule-settings-dialog/rule-settings-dialog.html b/apps/client/src/app/components/rule/rule-settings-dialog/rule-settings-dialog.html
index 8806dae6a..ef86549f6 100644
--- a/apps/client/src/app/components/rule/rule-settings-dialog/rule-settings-dialog.html
+++ b/apps/client/src/app/components/rule/rule-settings-dialog/rule-settings-dialog.html
@@ -1,85 +1,37 @@
{{ data.rule.name }}
+ type="number"
+ [(ngModel)]="settings.thresholdMax"
+ />
+
-
diff --git a/apps/client/src/app/components/rule/rule.component.html b/apps/client/src/app/components/rule/rule.component.html
index 7cea512e3..5491933c0 100644
--- a/apps/client/src/app/components/rule/rule.component.html
+++ b/apps/client/src/app/components/rule/rule.component.html
@@ -62,7 +62,7 @@
- @if (rule?.isActive && rule?.configuration) {
+ @if (rule?.isActive && !isEmpty(rule.settings)) {
Customize...
diff --git a/apps/client/src/app/components/rule/rule.component.ts b/apps/client/src/app/components/rule/rule.component.ts
index f51ce805f..6e6c368f0 100644
--- a/apps/client/src/app/components/rule/rule.component.ts
+++ b/apps/client/src/app/components/rule/rule.component.ts
@@ -1,7 +1,5 @@
import { UpdateUserSettingDto } from '@ghostfolio/api/app/user/update-user-setting.dto';
-import { RuleSettings } from '@ghostfolio/api/models/interfaces/rule-settings.interface';
import { PortfolioReportRule } from '@ghostfolio/common/interfaces';
-import { XRayRulesSettings } from '@ghostfolio/common/types';
import {
ChangeDetectionStrategy,
@@ -12,6 +10,7 @@ import {
Output
} from '@angular/core';
import { MatDialog } from '@angular/material/dialog';
+import { isEmpty } from 'lodash';
import { DeviceDetectorService } from 'ngx-device-detector';
import { Subject, takeUntil } from 'rxjs';
@@ -28,10 +27,11 @@ export class RuleComponent implements OnInit {
@Input() hasPermissionToUpdateUserSettings: boolean;
@Input() isLoading: boolean;
@Input() rule: PortfolioReportRule;
- @Input() settings: XRayRulesSettings['AccountClusterRiskCurrentInvestment'];
@Output() ruleUpdated = new EventEmitter();
+ public isEmpty = isEmpty;
+
private deviceType: string;
private unsubscribeSubject = new Subject();
@@ -46,17 +46,16 @@ export class RuleComponent implements OnInit {
public onCustomizeRule(rule: PortfolioReportRule) {
const dialogRef = this.dialog.open(GfRuleSettingsDialogComponent, {
- data: {
- rule,
- settings: this.settings
- } as IRuleSettingsDialogParams,
+ data: {
+ rule
+ },
width: this.deviceType === 'mobile' ? '100vw' : '50rem'
});
dialogRef
.afterClosed()
.pipe(takeUntil(this.unsubscribeSubject))
- .subscribe((settings: RuleSettings) => {
+ .subscribe((settings: PortfolioReportRule['settings']) => {
if (settings) {
this.ruleUpdated.emit({
xRayRules: {
diff --git a/apps/client/src/app/components/rules/rules.component.html b/apps/client/src/app/components/rules/rules.component.html
index 28343673d..31e61bfc2 100644
--- a/apps/client/src/app/components/rules/rules.component.html
+++ b/apps/client/src/app/components/rules/rules.component.html
@@ -12,7 +12,6 @@
hasPermissionToUpdateUserSettings
"
[rule]="rule"
- [settings]="settings?.[rule.key]"
(ruleUpdated)="onRuleUpdated($event)"
/>
}
diff --git a/apps/client/src/app/components/rules/rules.component.ts b/apps/client/src/app/components/rules/rules.component.ts
index fb2ef1cdb..b8493e7be 100644
--- a/apps/client/src/app/components/rules/rules.component.ts
+++ b/apps/client/src/app/components/rules/rules.component.ts
@@ -1,6 +1,5 @@
import { UpdateUserSettingDto } from '@ghostfolio/api/app/user/update-user-setting.dto';
import { PortfolioReportRule } from '@ghostfolio/common/interfaces';
-import { XRayRulesSettings } from '@ghostfolio/common/types';
import {
ChangeDetectionStrategy,
@@ -20,10 +19,11 @@ export class RulesComponent {
@Input() hasPermissionToUpdateUserSettings: boolean;
@Input() isLoading: boolean;
@Input() rules: PortfolioReportRule[];
- @Input() settings: XRayRulesSettings;
@Output() rulesUpdated = new EventEmitter();
+ public constructor() {}
+
public onRuleUpdated(event: UpdateUserSettingDto) {
this.rulesUpdated.emit(event);
}
diff --git a/apps/client/src/app/pages/faq/self-hosting/self-hosting-page.html b/apps/client/src/app/pages/faq/self-hosting/self-hosting-page.html
index 7538678c3..96da35ca9 100644
--- a/apps/client/src/app/pages/faq/self-hosting/self-hosting-page.html
+++ b/apps/client/src/app/pages/faq/self-hosting/self-hosting-page.html
@@ -51,8 +51,8 @@
manually enter it.
- - Open the Admin Control panel
- - Navigate to the Market Data section
+ - Go to the Admin Control panel
+ - Go to the Market Data section
- Click on the + button
- Switch to Add Currency
- Insert e.g.
EUR
for Euro
@@ -78,8 +78,8 @@
do the following:
- - Open the Admin Control panel
- - Navigate to the Market Data section
+ - Go to the Admin Control panel
+ - Go to the Market Data section
- Select Filter by Currencies
- Find the entry USDEUR
-
@@ -105,8 +105,8 @@
- - Open the Admin Control panel
- - Navigate to the Settings section
+ - Go to the Admin Control panel
+ - Go to the Settings section
- Click on the Add Platform button
@@ -117,8 +117,8 @@
- - Open the Admin Control panel
- - Navigate to the Settings section
+ - Go to the Admin Control panel
+ - Go to the Settings section
- Click on the Add Tag button
@@ -133,24 +133,6 @@
providers are considered experimental.
-
-
- How do I set up a benchmark?
-
-
-
- To compare your performance with benchmarks (see
- Compare with...) like Bitcoin, Gold, or the
- S&P 500, follow these steps.
-
-
- - Open the Admin Control panel
- - Navigate to the Market Data section
- - Choose an asset profile
- - In the dialog, check the Benchmark box
-
-
-
How do I add a custom asset?
@@ -161,8 +143,8 @@
provider, you can create a custom asset as follows.
- - Open the Admin Control panel
- - Navigate to the Market Data section
+ - Go to the Admin Control panel
+ - Go to the Market Data section
- Create an asset profile
- Select Add Manually and enter a unique symbol
- Edit your asset profile
@@ -170,24 +152,6 @@
-
-
- How do I set up Markets?
-
-
- The Markets list is derived from your Benchmarks.
-
- - Open the Admin Control panel
- - Navigate to the Market Data section
- - Choose an asset profile
- - In the dialog, check the Benchmark box
-
-
- Please note: Data is cached, meaning changes may take a few minutes
- to appear.
-
-
-
Which devices are supported?
diff --git a/apps/client/src/app/pages/portfolio/fire/fire-page.component.ts b/apps/client/src/app/pages/portfolio/fire/fire-page.component.ts
index 54f65b531..10a2eb604 100644
--- a/apps/client/src/app/pages/portfolio/fire/fire-page.component.ts
+++ b/apps/client/src/app/pages/portfolio/fire/fire-page.component.ts
@@ -138,11 +138,6 @@ export class FirePageComponent implements OnDestroy, OnInit {
.putUserSetting(event)
.pipe(takeUntil(this.unsubscribeSubject))
.subscribe(() => {
- this.userService
- .get(true)
- .pipe(takeUntil(this.unsubscribeSubject))
- .subscribe();
-
this.initializePortfolioReport();
});
}
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 c4a521a8c..b0fade836 100644
--- a/apps/client/src/app/pages/portfolio/fire/fire-page.html
+++ b/apps/client/src/app/pages/portfolio/fire/fire-page.html
@@ -132,7 +132,6 @@
"
[isLoading]="isLoadingPortfolioReport"
[rules]="emergencyFundRules"
- [settings]="user?.settings?.xRayRules"
(rulesUpdated)="onRulesUpdated($event)"
/>
@@ -151,7 +150,6 @@
"
[isLoading]="isLoadingPortfolioReport"
[rules]="currencyClusterRiskRules"
- [settings]="user?.settings?.xRayRules"
(rulesUpdated)="onRulesUpdated($event)"
/>
@@ -170,7 +168,6 @@
"
[isLoading]="isLoadingPortfolioReport"
[rules]="accountClusterRiskRules"
- [settings]="user?.settings?.xRayRules"
(rulesUpdated)="onRulesUpdated($event)"
/>
@@ -189,7 +186,6 @@
"
[isLoading]="isLoadingPortfolioReport"
[rules]="feeRules"
- [settings]="user?.settings?.xRayRules"
(rulesUpdated)="onRulesUpdated($event)"
/>
@@ -204,7 +200,6 @@
"
[isLoading]="isLoadingPortfolioReport"
[rules]="inactiveRules"
- [settings]="user?.settings?.xRayRules"
(rulesUpdated)="onRulesUpdated($event)"
/>
diff --git a/apps/client/src/locales/messages.ca.xlf b/apps/client/src/locales/messages.ca.xlf
index 24dc124a7..06f8a5647 100644
--- a/apps/client/src/locales/messages.ca.xlf
+++ b/apps/client/src/locales/messages.ca.xlf
@@ -1471,7 +1471,7 @@
apps/client/src/app/components/rule/rule-settings-dialog/rule-settings-dialog.html
- 53
+ 35
apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html
@@ -2303,7 +2303,7 @@
Portfolio
apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts
- 117
+ 116
apps/client/src/app/pages/portfolio/portfolio-page-routing.module.ts
@@ -2319,7 +2319,7 @@
Punt de Referència
apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts
- 129
+ 128
@@ -2579,7 +2579,7 @@
apps/client/src/app/pages/portfolio/fire/fire-page.html
- 179
+ 176
@@ -2635,7 +2635,7 @@
Gestionar Activitats
apps/client/src/app/components/home-holdings/home-holdings.html
- 65
+ 62
@@ -2767,7 +2767,7 @@
Total Amount
apps/client/src/app/components/investment-chart/investment-chart.component.ts
- 142
+ 141
@@ -2775,7 +2775,7 @@
Savings Rate
apps/client/src/app/components/investment-chart/investment-chart.component.ts
- 214
+ 213
@@ -3163,7 +3163,7 @@
libs/ui/src/lib/assistant/assistant.component.ts
- 210
+ 217
@@ -3175,7 +3175,7 @@
libs/ui/src/lib/assistant/assistant.component.ts
- 220
+ 227
@@ -3187,7 +3187,7 @@
libs/ui/src/lib/assistant/assistant.component.ts
- 224
+ 231
@@ -3199,7 +3199,7 @@
libs/ui/src/lib/assistant/assistant.component.ts
- 246
+ 253
@@ -3211,7 +3211,7 @@
libs/ui/src/lib/assistant/assistant.component.ts
- 249
+ 256
@@ -5199,7 +5199,7 @@
Currency Cluster Risks
apps/client/src/app/pages/portfolio/fire/fire-page.html
- 141
+ 140
@@ -5207,7 +5207,7 @@
Account Cluster Risks
apps/client/src/app/pages/portfolio/fire/fire-page.html
- 160
+ 158
@@ -5995,7 +5995,7 @@
Find holding...
libs/ui/src/lib/assistant/assistant.component.ts
- 139
+ 140
@@ -6003,7 +6003,7 @@
Week to date
libs/ui/src/lib/assistant/assistant.component.ts
- 212
+ 219
@@ -6011,7 +6011,7 @@
WTD
libs/ui/src/lib/assistant/assistant.component.ts
- 212
+ 219
@@ -6019,7 +6019,7 @@
Month to date
libs/ui/src/lib/assistant/assistant.component.ts
- 216
+ 223
@@ -6027,7 +6027,7 @@
MTD
libs/ui/src/lib/assistant/assistant.component.ts
- 216
+ 223
@@ -6035,7 +6035,7 @@
Year to date
libs/ui/src/lib/assistant/assistant.component.ts
- 220
+ 227
@@ -6043,7 +6043,7 @@
year
libs/ui/src/lib/assistant/assistant.component.ts
- 224
+ 231
@@ -6051,7 +6051,7 @@
years
libs/ui/src/lib/assistant/assistant.component.ts
- 246
+ 253
@@ -6991,7 +6991,7 @@
Inactive
apps/client/src/app/pages/portfolio/fire/fire-page.html
- 198
+ 194
@@ -7063,7 +7063,7 @@
Threshold Max
apps/client/src/app/components/rule/rule-settings-dialog/rule-settings-dialog.html
- 29
+ 22
@@ -7071,7 +7071,7 @@
Close
apps/client/src/app/components/rule/rule-settings-dialog/rule-settings-dialog.html
- 47
+ 33
diff --git a/apps/client/src/locales/messages.de.xlf b/apps/client/src/locales/messages.de.xlf
index 00eb0e87a..62302249d 100644
--- a/apps/client/src/locales/messages.de.xlf
+++ b/apps/client/src/locales/messages.de.xlf
@@ -554,7 +554,7 @@
apps/client/src/app/components/rule/rule-settings-dialog/rule-settings-dialog.html
- 53
+ 35
apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html
@@ -1058,7 +1058,7 @@
Aktivitäten verwalten
apps/client/src/app/components/home-holdings/home-holdings.html
- 65
+ 62
@@ -1414,7 +1414,7 @@
libs/ui/src/lib/assistant/assistant.component.ts
- 210
+ 217
@@ -1426,7 +1426,7 @@
libs/ui/src/lib/assistant/assistant.component.ts
- 220
+ 227
@@ -1438,7 +1438,7 @@
libs/ui/src/lib/assistant/assistant.component.ts
- 224
+ 231
@@ -1450,7 +1450,7 @@
libs/ui/src/lib/assistant/assistant.component.ts
- 246
+ 253
@@ -1462,7 +1462,7 @@
libs/ui/src/lib/assistant/assistant.component.ts
- 249
+ 256
@@ -2374,7 +2374,7 @@
Portfolio
apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts
- 117
+ 116
apps/client/src/app/pages/portfolio/portfolio-page-routing.module.ts
@@ -2898,7 +2898,7 @@
Benchmark
apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts
- 129
+ 128
@@ -2962,7 +2962,7 @@
Gesamtbetrag
apps/client/src/app/components/investment-chart/investment-chart.component.ts
- 142
+ 141
@@ -2978,7 +2978,7 @@
Sparrate
apps/client/src/app/components/investment-chart/investment-chart.component.ts
- 214
+ 213
@@ -3730,7 +3730,7 @@
apps/client/src/app/pages/portfolio/fire/fire-page.html
- 179
+ 176
@@ -5843,7 +5843,7 @@
Währungsklumpenrisiken
apps/client/src/app/pages/portfolio/fire/fire-page.html
- 141
+ 140
@@ -5851,7 +5851,7 @@
Kontoklumpenrisiken
apps/client/src/app/pages/portfolio/fire/fire-page.html
- 160
+ 158
@@ -5943,7 +5943,7 @@
Finde Position...
libs/ui/src/lib/assistant/assistant.component.ts
- 139
+ 140
@@ -6311,7 +6311,7 @@
Seit Wochenbeginn
libs/ui/src/lib/assistant/assistant.component.ts
- 212
+ 219
@@ -6319,7 +6319,7 @@
WTD
libs/ui/src/lib/assistant/assistant.component.ts
- 212
+ 219
@@ -6327,7 +6327,7 @@
Seit Monatsbeginn
libs/ui/src/lib/assistant/assistant.component.ts
- 216
+ 223
@@ -6335,7 +6335,7 @@
MTD
libs/ui/src/lib/assistant/assistant.component.ts
- 216
+ 223
@@ -6343,7 +6343,7 @@
Seit Jahresbeginn
libs/ui/src/lib/assistant/assistant.component.ts
- 220
+ 227
@@ -6387,7 +6387,7 @@
Jahr
libs/ui/src/lib/assistant/assistant.component.ts
- 224
+ 231
@@ -6395,7 +6395,7 @@
Jahre
libs/ui/src/lib/assistant/assistant.component.ts
- 246
+ 253
@@ -6991,7 +6991,7 @@
Inaktiv
apps/client/src/app/pages/portfolio/fire/fire-page.html
- 198
+ 194
@@ -7063,7 +7063,7 @@
Threshold Max
apps/client/src/app/components/rule/rule-settings-dialog/rule-settings-dialog.html
- 29
+ 22
@@ -7071,7 +7071,7 @@
Schliessen
apps/client/src/app/components/rule/rule-settings-dialog/rule-settings-dialog.html
- 47
+ 33
diff --git a/apps/client/src/locales/messages.es.xlf b/apps/client/src/locales/messages.es.xlf
index 9d788c1b4..1e897f596 100644
--- a/apps/client/src/locales/messages.es.xlf
+++ b/apps/client/src/locales/messages.es.xlf
@@ -555,7 +555,7 @@
apps/client/src/app/components/rule/rule-settings-dialog/rule-settings-dialog.html
- 53
+ 35
apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html
@@ -1059,7 +1059,7 @@
Gestión de las operaciones
apps/client/src/app/components/home-holdings/home-holdings.html
- 65
+ 62
@@ -1415,7 +1415,7 @@
libs/ui/src/lib/assistant/assistant.component.ts
- 210
+ 217
@@ -1427,7 +1427,7 @@
libs/ui/src/lib/assistant/assistant.component.ts
- 220
+ 227
@@ -1439,7 +1439,7 @@
libs/ui/src/lib/assistant/assistant.component.ts
- 224
+ 231
@@ -1451,7 +1451,7 @@
libs/ui/src/lib/assistant/assistant.component.ts
- 246
+ 253
@@ -1463,7 +1463,7 @@
libs/ui/src/lib/assistant/assistant.component.ts
- 249
+ 256
@@ -2375,7 +2375,7 @@
Cartera
apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts
- 117
+ 116
apps/client/src/app/pages/portfolio/portfolio-page-routing.module.ts
@@ -2891,7 +2891,7 @@
Benchmark
apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts
- 129
+ 128
@@ -2963,7 +2963,7 @@
Importe total
apps/client/src/app/components/investment-chart/investment-chart.component.ts
- 142
+ 141
@@ -2979,7 +2979,7 @@
Tasa de ahorro
apps/client/src/app/components/investment-chart/investment-chart.component.ts
- 214
+ 213
@@ -3731,7 +3731,7 @@
apps/client/src/app/pages/portfolio/fire/fire-page.html
- 179
+ 176
@@ -5844,7 +5844,7 @@
Currency Cluster Risks
apps/client/src/app/pages/portfolio/fire/fire-page.html
- 141
+ 140
@@ -5852,7 +5852,7 @@
Account Cluster Risks
apps/client/src/app/pages/portfolio/fire/fire-page.html
- 160
+ 158
@@ -5944,7 +5944,7 @@
Find holding...
libs/ui/src/lib/assistant/assistant.component.ts
- 139
+ 140
@@ -6312,7 +6312,7 @@
Week to date
libs/ui/src/lib/assistant/assistant.component.ts
- 212
+ 219
@@ -6320,7 +6320,7 @@
WTD
libs/ui/src/lib/assistant/assistant.component.ts
- 212
+ 219
@@ -6328,7 +6328,7 @@
Month to date
libs/ui/src/lib/assistant/assistant.component.ts
- 216
+ 223
@@ -6336,7 +6336,7 @@
MTD
libs/ui/src/lib/assistant/assistant.component.ts
- 216
+ 223
@@ -6344,7 +6344,7 @@
Year to date
libs/ui/src/lib/assistant/assistant.component.ts
- 220
+ 227
@@ -6388,7 +6388,7 @@
año
libs/ui/src/lib/assistant/assistant.component.ts
- 224
+ 231
@@ -6396,7 +6396,7 @@
años
libs/ui/src/lib/assistant/assistant.component.ts
- 246
+ 253
@@ -6992,7 +6992,7 @@
Inactive
apps/client/src/app/pages/portfolio/fire/fire-page.html
- 198
+ 194
@@ -7064,7 +7064,7 @@
Threshold Max
apps/client/src/app/components/rule/rule-settings-dialog/rule-settings-dialog.html
- 29
+ 22
@@ -7072,7 +7072,7 @@
Close
apps/client/src/app/components/rule/rule-settings-dialog/rule-settings-dialog.html
- 47
+ 33
diff --git a/apps/client/src/locales/messages.fr.xlf b/apps/client/src/locales/messages.fr.xlf
index 88afcb818..aa366fcc4 100644
--- a/apps/client/src/locales/messages.fr.xlf
+++ b/apps/client/src/locales/messages.fr.xlf
@@ -614,7 +614,7 @@
apps/client/src/app/components/rule/rule-settings-dialog/rule-settings-dialog.html
- 53
+ 35
apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html
@@ -1142,7 +1142,7 @@
Portefeuille
apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts
- 117
+ 116
apps/client/src/app/pages/portfolio/portfolio-page-routing.module.ts
@@ -1158,7 +1158,7 @@
Référence
apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts
- 129
+ 128
@@ -1378,7 +1378,7 @@
Gérer les Activités
apps/client/src/app/components/home-holdings/home-holdings.html
- 65
+ 62
@@ -1426,7 +1426,7 @@
Montant Total
apps/client/src/app/components/investment-chart/investment-chart.component.ts
- 142
+ 141
@@ -1434,7 +1434,7 @@
Taux d’Épargne
apps/client/src/app/components/investment-chart/investment-chart.component.ts
- 214
+ 213
@@ -1726,7 +1726,7 @@
libs/ui/src/lib/assistant/assistant.component.ts
- 210
+ 217
@@ -1738,7 +1738,7 @@
libs/ui/src/lib/assistant/assistant.component.ts
- 220
+ 227
@@ -1750,7 +1750,7 @@
libs/ui/src/lib/assistant/assistant.component.ts
- 224
+ 231
@@ -1762,7 +1762,7 @@
libs/ui/src/lib/assistant/assistant.component.ts
- 246
+ 253
@@ -1774,7 +1774,7 @@
libs/ui/src/lib/assistant/assistant.component.ts
- 249
+ 256
@@ -3730,7 +3730,7 @@
apps/client/src/app/pages/portfolio/fire/fire-page.html
- 179
+ 176
@@ -5843,7 +5843,7 @@
Risques de change
apps/client/src/app/pages/portfolio/fire/fire-page.html
- 141
+ 140
@@ -5851,7 +5851,7 @@
Risques liés aux regroupements de comptes
apps/client/src/app/pages/portfolio/fire/fire-page.html
- 160
+ 158
@@ -5943,7 +5943,7 @@
Chercher un actif...
libs/ui/src/lib/assistant/assistant.component.ts
- 139
+ 140
@@ -6311,7 +6311,7 @@
Week to date
libs/ui/src/lib/assistant/assistant.component.ts
- 212
+ 219
@@ -6319,7 +6319,7 @@
WTD
libs/ui/src/lib/assistant/assistant.component.ts
- 212
+ 219
@@ -6327,7 +6327,7 @@
Month to date
libs/ui/src/lib/assistant/assistant.component.ts
- 216
+ 223
@@ -6335,7 +6335,7 @@
MTD
libs/ui/src/lib/assistant/assistant.component.ts
- 216
+ 223
@@ -6343,7 +6343,7 @@
Year to date
libs/ui/src/lib/assistant/assistant.component.ts
- 220
+ 227
@@ -6387,7 +6387,7 @@
année
libs/ui/src/lib/assistant/assistant.component.ts
- 224
+ 231
@@ -6395,7 +6395,7 @@
années
libs/ui/src/lib/assistant/assistant.component.ts
- 246
+ 253
@@ -6991,7 +6991,7 @@
Inactif
apps/client/src/app/pages/portfolio/fire/fire-page.html
- 198
+ 194
@@ -7063,7 +7063,7 @@
Threshold Max
apps/client/src/app/components/rule/rule-settings-dialog/rule-settings-dialog.html
- 29
+ 22
@@ -7071,7 +7071,7 @@
Close
apps/client/src/app/components/rule/rule-settings-dialog/rule-settings-dialog.html
- 47
+ 33
diff --git a/apps/client/src/locales/messages.it.xlf b/apps/client/src/locales/messages.it.xlf
index 08c7e8b26..a9d6df210 100644
--- a/apps/client/src/locales/messages.it.xlf
+++ b/apps/client/src/locales/messages.it.xlf
@@ -555,7 +555,7 @@
apps/client/src/app/components/rule/rule-settings-dialog/rule-settings-dialog.html
- 53
+ 35
apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html
@@ -1059,7 +1059,7 @@
Gestione delle attività
apps/client/src/app/components/home-holdings/home-holdings.html
- 65
+ 62
@@ -1415,7 +1415,7 @@
libs/ui/src/lib/assistant/assistant.component.ts
- 210
+ 217
@@ -1427,7 +1427,7 @@
libs/ui/src/lib/assistant/assistant.component.ts
- 220
+ 227
@@ -1439,7 +1439,7 @@
libs/ui/src/lib/assistant/assistant.component.ts
- 224
+ 231
@@ -1451,7 +1451,7 @@
libs/ui/src/lib/assistant/assistant.component.ts
- 246
+ 253
@@ -1463,7 +1463,7 @@
libs/ui/src/lib/assistant/assistant.component.ts
- 249
+ 256
@@ -2375,7 +2375,7 @@
Portafoglio
apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts
- 117
+ 116
apps/client/src/app/pages/portfolio/portfolio-page-routing.module.ts
@@ -2891,7 +2891,7 @@
Benchmark
apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts
- 129
+ 128
@@ -2963,7 +2963,7 @@
Importo totale
apps/client/src/app/components/investment-chart/investment-chart.component.ts
- 142
+ 141
@@ -2979,7 +2979,7 @@
Tasso di risparmio
apps/client/src/app/components/investment-chart/investment-chart.component.ts
- 214
+ 213
@@ -3731,7 +3731,7 @@
apps/client/src/app/pages/portfolio/fire/fire-page.html
- 179
+ 176
@@ -5844,7 +5844,7 @@
Currency Cluster Risks
apps/client/src/app/pages/portfolio/fire/fire-page.html
- 141
+ 140
@@ -5852,7 +5852,7 @@
Account Cluster Risks
apps/client/src/app/pages/portfolio/fire/fire-page.html
- 160
+ 158
@@ -5944,7 +5944,7 @@
Trova possedimenti...
libs/ui/src/lib/assistant/assistant.component.ts
- 139
+ 140
@@ -6312,7 +6312,7 @@
Da inizio settimana
libs/ui/src/lib/assistant/assistant.component.ts
- 212
+ 219
@@ -6320,7 +6320,7 @@
WTD
libs/ui/src/lib/assistant/assistant.component.ts
- 212
+ 219
@@ -6328,7 +6328,7 @@
Da inizio mese
libs/ui/src/lib/assistant/assistant.component.ts
- 216
+ 223
@@ -6336,7 +6336,7 @@
MTD
libs/ui/src/lib/assistant/assistant.component.ts
- 216
+ 223
@@ -6344,7 +6344,7 @@
Da inizio anno
libs/ui/src/lib/assistant/assistant.component.ts
- 220
+ 227
@@ -6388,7 +6388,7 @@
anno
libs/ui/src/lib/assistant/assistant.component.ts
- 224
+ 231
@@ -6396,7 +6396,7 @@
anni
libs/ui/src/lib/assistant/assistant.component.ts
- 246
+ 253
@@ -6992,7 +6992,7 @@
Inattivo
apps/client/src/app/pages/portfolio/fire/fire-page.html
- 198
+ 194
@@ -7064,7 +7064,7 @@
Threshold Max
apps/client/src/app/components/rule/rule-settings-dialog/rule-settings-dialog.html
- 29
+ 22
@@ -7072,7 +7072,7 @@
Close
apps/client/src/app/components/rule/rule-settings-dialog/rule-settings-dialog.html
- 47
+ 33
diff --git a/apps/client/src/locales/messages.nl.xlf b/apps/client/src/locales/messages.nl.xlf
index 0d5d9ced0..441455ef8 100644
--- a/apps/client/src/locales/messages.nl.xlf
+++ b/apps/client/src/locales/messages.nl.xlf
@@ -554,7 +554,7 @@
apps/client/src/app/components/rule/rule-settings-dialog/rule-settings-dialog.html
- 53
+ 35
apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html
@@ -1058,7 +1058,7 @@
Activiteiten beheren
apps/client/src/app/components/home-holdings/home-holdings.html
- 65
+ 62
@@ -1414,7 +1414,7 @@
libs/ui/src/lib/assistant/assistant.component.ts
- 210
+ 217
@@ -1426,7 +1426,7 @@
libs/ui/src/lib/assistant/assistant.component.ts
- 220
+ 227
@@ -1438,7 +1438,7 @@
libs/ui/src/lib/assistant/assistant.component.ts
- 224
+ 231
@@ -1450,7 +1450,7 @@
libs/ui/src/lib/assistant/assistant.component.ts
- 246
+ 253
@@ -1462,7 +1462,7 @@
libs/ui/src/lib/assistant/assistant.component.ts
- 249
+ 256
@@ -2374,7 +2374,7 @@
Portefeuille
apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts
- 117
+ 116
apps/client/src/app/pages/portfolio/portfolio-page-routing.module.ts
@@ -2890,7 +2890,7 @@
Benchmark
apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts
- 129
+ 128
@@ -2962,7 +2962,7 @@
Totaalbedrag
apps/client/src/app/components/investment-chart/investment-chart.component.ts
- 142
+ 141
@@ -2978,7 +2978,7 @@
Spaarrente
apps/client/src/app/components/investment-chart/investment-chart.component.ts
- 214
+ 213
@@ -3730,7 +3730,7 @@
apps/client/src/app/pages/portfolio/fire/fire-page.html
- 179
+ 176
@@ -5843,7 +5843,7 @@
Currency Cluster Risks
apps/client/src/app/pages/portfolio/fire/fire-page.html
- 141
+ 140
@@ -5851,7 +5851,7 @@
Account Cluster Risks
apps/client/src/app/pages/portfolio/fire/fire-page.html
- 160
+ 158
@@ -5943,7 +5943,7 @@
Find holding...
libs/ui/src/lib/assistant/assistant.component.ts
- 139
+ 140
@@ -6311,7 +6311,7 @@
Week to date
libs/ui/src/lib/assistant/assistant.component.ts
- 212
+ 219
@@ -6319,7 +6319,7 @@
WTD
libs/ui/src/lib/assistant/assistant.component.ts
- 212
+ 219
@@ -6327,7 +6327,7 @@
Month to date
libs/ui/src/lib/assistant/assistant.component.ts
- 216
+ 223
@@ -6335,7 +6335,7 @@
MTD
libs/ui/src/lib/assistant/assistant.component.ts
- 216
+ 223
@@ -6343,7 +6343,7 @@
Year to date
libs/ui/src/lib/assistant/assistant.component.ts
- 220
+ 227
@@ -6387,7 +6387,7 @@
year
libs/ui/src/lib/assistant/assistant.component.ts
- 224
+ 231
@@ -6395,7 +6395,7 @@
years
libs/ui/src/lib/assistant/assistant.component.ts
- 246
+ 253
@@ -6991,7 +6991,7 @@
Inactive
apps/client/src/app/pages/portfolio/fire/fire-page.html
- 198
+ 194
@@ -7063,7 +7063,7 @@
Threshold Max
apps/client/src/app/components/rule/rule-settings-dialog/rule-settings-dialog.html
- 29
+ 22
@@ -7071,7 +7071,7 @@
Close
apps/client/src/app/components/rule/rule-settings-dialog/rule-settings-dialog.html
- 47
+ 33
diff --git a/apps/client/src/locales/messages.pl.xlf b/apps/client/src/locales/messages.pl.xlf
index 04e410baf..e68b07f45 100644
--- a/apps/client/src/locales/messages.pl.xlf
+++ b/apps/client/src/locales/messages.pl.xlf
@@ -1363,7 +1363,7 @@
apps/client/src/app/components/rule/rule-settings-dialog/rule-settings-dialog.html
- 53
+ 35
apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html
@@ -2131,7 +2131,7 @@
Portfel
apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts
- 117
+ 116
apps/client/src/app/pages/portfolio/portfolio-page-routing.module.ts
@@ -2147,7 +2147,7 @@
Poziom Odniesienia (Benchmark)
apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts
- 129
+ 128
@@ -2283,7 +2283,7 @@
Zarządzaj Aktywnościami
apps/client/src/app/components/home-holdings/home-holdings.html
- 65
+ 62
@@ -2415,7 +2415,7 @@
Całkowita Kwota
apps/client/src/app/components/investment-chart/investment-chart.component.ts
- 142
+ 141
@@ -2423,7 +2423,7 @@
Stopa Oszczędności
apps/client/src/app/components/investment-chart/investment-chart.component.ts
- 214
+ 213
@@ -2551,7 +2551,7 @@
apps/client/src/app/pages/portfolio/fire/fire-page.html
- 179
+ 176
@@ -2915,7 +2915,7 @@
libs/ui/src/lib/assistant/assistant.component.ts
- 210
+ 217
@@ -2927,7 +2927,7 @@
libs/ui/src/lib/assistant/assistant.component.ts
- 220
+ 227
@@ -2939,7 +2939,7 @@
libs/ui/src/lib/assistant/assistant.component.ts
- 224
+ 231
@@ -2951,7 +2951,7 @@
libs/ui/src/lib/assistant/assistant.component.ts
- 246
+ 253
@@ -2963,7 +2963,7 @@
libs/ui/src/lib/assistant/assistant.component.ts
- 249
+ 256
@@ -4727,7 +4727,7 @@
Currency Cluster Risks
apps/client/src/app/pages/portfolio/fire/fire-page.html
- 141
+ 140
@@ -4735,7 +4735,7 @@
Account Cluster Risks
apps/client/src/app/pages/portfolio/fire/fire-page.html
- 160
+ 158
@@ -5511,7 +5511,7 @@
Znajdź portfel akcji...
libs/ui/src/lib/assistant/assistant.component.ts
- 139
+ 140
@@ -6311,7 +6311,7 @@
Week to date
libs/ui/src/lib/assistant/assistant.component.ts
- 212
+ 219
@@ -6319,7 +6319,7 @@
WTD
libs/ui/src/lib/assistant/assistant.component.ts
- 212
+ 219
@@ -6327,7 +6327,7 @@
Month to date
libs/ui/src/lib/assistant/assistant.component.ts
- 216
+ 223
@@ -6335,7 +6335,7 @@
MTD
libs/ui/src/lib/assistant/assistant.component.ts
- 216
+ 223
@@ -6343,7 +6343,7 @@
Year to date
libs/ui/src/lib/assistant/assistant.component.ts
- 220
+ 227
@@ -6387,7 +6387,7 @@
year
libs/ui/src/lib/assistant/assistant.component.ts
- 224
+ 231
@@ -6395,7 +6395,7 @@
years
libs/ui/src/lib/assistant/assistant.component.ts
- 246
+ 253
@@ -6991,7 +6991,7 @@
Nieaktywny
apps/client/src/app/pages/portfolio/fire/fire-page.html
- 198
+ 194
@@ -7063,7 +7063,7 @@
Threshold Max
apps/client/src/app/components/rule/rule-settings-dialog/rule-settings-dialog.html
- 29
+ 22
@@ -7071,7 +7071,7 @@
Close
apps/client/src/app/components/rule/rule-settings-dialog/rule-settings-dialog.html
- 47
+ 33
diff --git a/apps/client/src/locales/messages.pt.xlf b/apps/client/src/locales/messages.pt.xlf
index 97b7805e3..8bb514d06 100644
--- a/apps/client/src/locales/messages.pt.xlf
+++ b/apps/client/src/locales/messages.pt.xlf
@@ -614,7 +614,7 @@
apps/client/src/app/components/rule/rule-settings-dialog/rule-settings-dialog.html
- 53
+ 35
apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html
@@ -1006,7 +1006,7 @@
Portefólio
apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts
- 117
+ 116
apps/client/src/app/pages/portfolio/portfolio-page-routing.module.ts
@@ -1022,7 +1022,7 @@
Referência
apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts
- 129
+ 128
@@ -1242,7 +1242,7 @@
Gerir Atividades
apps/client/src/app/components/home-holdings/home-holdings.html
- 65
+ 62
@@ -1298,7 +1298,7 @@
Valor Total
apps/client/src/app/components/investment-chart/investment-chart.component.ts
- 142
+ 141
@@ -1306,7 +1306,7 @@
Taxa de Poupança
apps/client/src/app/components/investment-chart/investment-chart.component.ts
- 214
+ 213
@@ -1706,7 +1706,7 @@
libs/ui/src/lib/assistant/assistant.component.ts
- 210
+ 217
@@ -1718,7 +1718,7 @@
libs/ui/src/lib/assistant/assistant.component.ts
- 220
+ 227
@@ -1730,7 +1730,7 @@
libs/ui/src/lib/assistant/assistant.component.ts
- 224
+ 231
@@ -1742,7 +1742,7 @@
libs/ui/src/lib/assistant/assistant.component.ts
- 246
+ 253
@@ -1754,7 +1754,7 @@
libs/ui/src/lib/assistant/assistant.component.ts
- 249
+ 256
@@ -3730,7 +3730,7 @@
apps/client/src/app/pages/portfolio/fire/fire-page.html
- 179
+ 176
@@ -5843,7 +5843,7 @@
Currency Cluster Risks
apps/client/src/app/pages/portfolio/fire/fire-page.html
- 141
+ 140
@@ -5851,7 +5851,7 @@
Account Cluster Risks
apps/client/src/app/pages/portfolio/fire/fire-page.html
- 160
+ 158
@@ -5943,7 +5943,7 @@
Find holding...
libs/ui/src/lib/assistant/assistant.component.ts
- 139
+ 140
@@ -6311,7 +6311,7 @@
Week to date
libs/ui/src/lib/assistant/assistant.component.ts
- 212
+ 219
@@ -6319,7 +6319,7 @@
WTD
libs/ui/src/lib/assistant/assistant.component.ts
- 212
+ 219
@@ -6327,7 +6327,7 @@
Month to date
libs/ui/src/lib/assistant/assistant.component.ts
- 216
+ 223
@@ -6335,7 +6335,7 @@
MTD
libs/ui/src/lib/assistant/assistant.component.ts
- 216
+ 223
@@ -6343,7 +6343,7 @@
Year to date
libs/ui/src/lib/assistant/assistant.component.ts
- 220
+ 227
@@ -6387,7 +6387,7 @@
year
libs/ui/src/lib/assistant/assistant.component.ts
- 224
+ 231
@@ -6395,7 +6395,7 @@
years
libs/ui/src/lib/assistant/assistant.component.ts
- 246
+ 253
@@ -6991,7 +6991,7 @@
Inactive
apps/client/src/app/pages/portfolio/fire/fire-page.html
- 198
+ 194
@@ -7063,7 +7063,7 @@
Threshold Max
apps/client/src/app/components/rule/rule-settings-dialog/rule-settings-dialog.html
- 29
+ 22
@@ -7071,7 +7071,7 @@
Close
apps/client/src/app/components/rule/rule-settings-dialog/rule-settings-dialog.html
- 47
+ 33
diff --git a/apps/client/src/locales/messages.tr.xlf b/apps/client/src/locales/messages.tr.xlf
index 204282131..e5292e342 100644
--- a/apps/client/src/locales/messages.tr.xlf
+++ b/apps/client/src/locales/messages.tr.xlf
@@ -1327,7 +1327,7 @@
apps/client/src/app/components/rule/rule-settings-dialog/rule-settings-dialog.html
- 53
+ 35
apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html
@@ -1995,7 +1995,7 @@
Portföy
apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts
- 117
+ 116
apps/client/src/app/pages/portfolio/portfolio-page-routing.module.ts
@@ -2011,7 +2011,7 @@
Karşılaştırma Ölçütü
apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts
- 129
+ 128
@@ -2135,7 +2135,7 @@
İşlemleri Yönet
apps/client/src/app/components/home-holdings/home-holdings.html
- 65
+ 62
@@ -2267,7 +2267,7 @@
Toplam Tutar
apps/client/src/app/components/investment-chart/investment-chart.component.ts
- 142
+ 141
@@ -2275,7 +2275,7 @@
Tasarruf Oranı
apps/client/src/app/components/investment-chart/investment-chart.component.ts
- 214
+ 213
@@ -2591,7 +2591,7 @@
apps/client/src/app/pages/portfolio/fire/fire-page.html
- 179
+ 176
@@ -2759,7 +2759,7 @@
libs/ui/src/lib/assistant/assistant.component.ts
- 210
+ 217
@@ -2771,7 +2771,7 @@
libs/ui/src/lib/assistant/assistant.component.ts
- 220
+ 227
@@ -2783,7 +2783,7 @@
libs/ui/src/lib/assistant/assistant.component.ts
- 224
+ 231
@@ -2795,7 +2795,7 @@
libs/ui/src/lib/assistant/assistant.component.ts
- 246
+ 253
@@ -2807,7 +2807,7 @@
libs/ui/src/lib/assistant/assistant.component.ts
- 249
+ 256
@@ -5843,7 +5843,7 @@
Kur Kümelenme Riskleri (Currency Cluster Risks)
apps/client/src/app/pages/portfolio/fire/fire-page.html
- 141
+ 140
@@ -5851,7 +5851,7 @@
Hesap Kümelenme Riski (Account Cluster Risks)
apps/client/src/app/pages/portfolio/fire/fire-page.html
- 160
+ 158
@@ -5943,7 +5943,7 @@
Sahip olunan varlıkları bul...
libs/ui/src/lib/assistant/assistant.component.ts
- 139
+ 140
@@ -6311,7 +6311,7 @@
Week to date
libs/ui/src/lib/assistant/assistant.component.ts
- 212
+ 219
@@ -6319,7 +6319,7 @@
WTD
libs/ui/src/lib/assistant/assistant.component.ts
- 212
+ 219
@@ -6327,7 +6327,7 @@
Month to date
libs/ui/src/lib/assistant/assistant.component.ts
- 216
+ 223
@@ -6335,7 +6335,7 @@
MTD
libs/ui/src/lib/assistant/assistant.component.ts
- 216
+ 223
@@ -6343,7 +6343,7 @@
Year to date
libs/ui/src/lib/assistant/assistant.component.ts
- 220
+ 227
@@ -6387,7 +6387,7 @@
year
libs/ui/src/lib/assistant/assistant.component.ts
- 224
+ 231
@@ -6395,7 +6395,7 @@
years
libs/ui/src/lib/assistant/assistant.component.ts
- 246
+ 253
@@ -6991,7 +6991,7 @@
Inactive
apps/client/src/app/pages/portfolio/fire/fire-page.html
- 198
+ 194
@@ -7063,7 +7063,7 @@
Threshold Max
apps/client/src/app/components/rule/rule-settings-dialog/rule-settings-dialog.html
- 29
+ 22
@@ -7071,7 +7071,7 @@
Close
apps/client/src/app/components/rule/rule-settings-dialog/rule-settings-dialog.html
- 47
+ 33
diff --git a/apps/client/src/locales/messages.xlf b/apps/client/src/locales/messages.xlf
index 23cfaf65c..849b1053e 100644
--- a/apps/client/src/locales/messages.xlf
+++ b/apps/client/src/locales/messages.xlf
@@ -1312,7 +1312,7 @@
apps/client/src/app/components/rule/rule-settings-dialog/rule-settings-dialog.html
- 53
+ 35
apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html
@@ -2013,7 +2013,7 @@
Portfolio
apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts
- 117
+ 116
apps/client/src/app/pages/portfolio/portfolio-page-routing.module.ts
@@ -2028,7 +2028,7 @@
Benchmark
apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts
- 129
+ 128
@@ -2151,7 +2151,7 @@
Manage Activities
apps/client/src/app/components/home-holdings/home-holdings.html
- 65
+ 62
@@ -2268,14 +2268,14 @@
Total Amount
apps/client/src/app/components/investment-chart/investment-chart.component.ts
- 142
+ 141
Savings Rate
apps/client/src/app/components/investment-chart/investment-chart.component.ts
- 214
+ 213
@@ -2392,7 +2392,7 @@
apps/client/src/app/pages/portfolio/fire/fire-page.html
- 179
+ 176
@@ -2723,7 +2723,7 @@
libs/ui/src/lib/assistant/assistant.component.ts
- 210
+ 217
@@ -2734,7 +2734,7 @@
libs/ui/src/lib/assistant/assistant.component.ts
- 220
+ 227
@@ -2745,7 +2745,7 @@
libs/ui/src/lib/assistant/assistant.component.ts
- 224
+ 231
@@ -2756,7 +2756,7 @@
libs/ui/src/lib/assistant/assistant.component.ts
- 246
+ 253
@@ -2767,7 +2767,7 @@
libs/ui/src/lib/assistant/assistant.component.ts
- 249
+ 256
@@ -4337,14 +4337,14 @@
Currency Cluster Risks
apps/client/src/app/pages/portfolio/fire/fire-page.html
- 141
+ 140
Account Cluster Risks
apps/client/src/app/pages/portfolio/fire/fire-page.html
- 160
+ 158
@@ -5071,7 +5071,7 @@
Find holding...
libs/ui/src/lib/assistant/assistant.component.ts
- 139
+ 140
@@ -5734,35 +5734,35 @@
Year to date
libs/ui/src/lib/assistant/assistant.component.ts
- 220
+ 227
Week to date
libs/ui/src/lib/assistant/assistant.component.ts
- 212
+ 219
Month to date
libs/ui/src/lib/assistant/assistant.component.ts
- 216
+ 223
MTD
libs/ui/src/lib/assistant/assistant.component.ts
- 216
+ 223
WTD
libs/ui/src/lib/assistant/assistant.component.ts
- 212
+ 219
@@ -5801,14 +5801,14 @@
year
libs/ui/src/lib/assistant/assistant.component.ts
- 224
+ 231
years
libs/ui/src/lib/assistant/assistant.component.ts
- 246
+ 253
@@ -6331,7 +6331,7 @@
Inactive
apps/client/src/app/pages/portfolio/fire/fire-page.html
- 198
+ 194
@@ -6359,7 +6359,7 @@
Threshold Max
apps/client/src/app/components/rule/rule-settings-dialog/rule-settings-dialog.html
- 29
+ 22
@@ -6408,7 +6408,7 @@
Close
apps/client/src/app/components/rule/rule-settings-dialog/rule-settings-dialog.html
- 47
+ 33
diff --git a/apps/client/src/locales/messages.zh.xlf b/apps/client/src/locales/messages.zh.xlf
index 97c8c71ab..22aa783d6 100644
--- a/apps/client/src/locales/messages.zh.xlf
+++ b/apps/client/src/locales/messages.zh.xlf
@@ -1372,7 +1372,7 @@
apps/client/src/app/components/rule/rule-settings-dialog/rule-settings-dialog.html
- 53
+ 35
apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html
@@ -2148,7 +2148,7 @@
文件夹
apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts
- 117
+ 116
apps/client/src/app/pages/portfolio/portfolio-page-routing.module.ts
@@ -2164,7 +2164,7 @@
基准
apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts
- 129
+ 128
@@ -2300,7 +2300,7 @@
管理活动
apps/client/src/app/components/home-holdings/home-holdings.html
- 65
+ 62
@@ -2432,7 +2432,7 @@
总金额
apps/client/src/app/components/investment-chart/investment-chart.component.ts
- 142
+ 141
@@ -2440,7 +2440,7 @@
储蓄率
apps/client/src/app/components/investment-chart/investment-chart.component.ts
- 214
+ 213
@@ -2568,7 +2568,7 @@
apps/client/src/app/pages/portfolio/fire/fire-page.html
- 179
+ 176
@@ -2932,7 +2932,7 @@
libs/ui/src/lib/assistant/assistant.component.ts
- 210
+ 217
@@ -2944,7 +2944,7 @@
libs/ui/src/lib/assistant/assistant.component.ts
- 220
+ 227
@@ -2956,7 +2956,7 @@
libs/ui/src/lib/assistant/assistant.component.ts
- 224
+ 231
@@ -2968,7 +2968,7 @@
libs/ui/src/lib/assistant/assistant.component.ts
- 246
+ 253
@@ -2980,7 +2980,7 @@
libs/ui/src/lib/assistant/assistant.component.ts
- 249
+ 256
@@ -4744,7 +4744,7 @@
货币集群风险
apps/client/src/app/pages/portfolio/fire/fire-page.html
- 141
+ 140
@@ -4752,7 +4752,7 @@
账户集群风险
apps/client/src/app/pages/portfolio/fire/fire-page.html
- 160
+ 158
@@ -5560,7 +5560,7 @@
查找持有...
libs/ui/src/lib/assistant/assistant.component.ts
- 139
+ 140
@@ -6312,7 +6312,7 @@
今年迄今为止
libs/ui/src/lib/assistant/assistant.component.ts
- 220
+ 227
@@ -6320,7 +6320,7 @@
本周至今
libs/ui/src/lib/assistant/assistant.component.ts
- 212
+ 219
@@ -6328,7 +6328,7 @@
本月至今
libs/ui/src/lib/assistant/assistant.component.ts
- 216
+ 223
@@ -6336,7 +6336,7 @@
最大输运量
libs/ui/src/lib/assistant/assistant.component.ts
- 216
+ 223
@@ -6344,7 +6344,7 @@
世界贸易组织
libs/ui/src/lib/assistant/assistant.component.ts
- 212
+ 219
@@ -6388,7 +6388,7 @@
年
libs/ui/src/lib/assistant/assistant.component.ts
- 224
+ 231
@@ -6396,7 +6396,7 @@
年
libs/ui/src/lib/assistant/assistant.component.ts
- 246
+ 253
@@ -6992,7 +6992,7 @@
Inactive
apps/client/src/app/pages/portfolio/fire/fire-page.html
- 198
+ 194
@@ -7064,7 +7064,7 @@
Threshold Max
apps/client/src/app/components/rule/rule-settings-dialog/rule-settings-dialog.html
- 29
+ 22
@@ -7072,7 +7072,7 @@
Close
apps/client/src/app/components/rule/rule-settings-dialog/rule-settings-dialog.html
- 47
+ 33
diff --git a/libs/common/src/lib/chart-helper.ts b/libs/common/src/lib/chart-helper.ts
index 4181ebbbf..5b65d4a87 100644
--- a/libs/common/src/lib/chart-helper.ts
+++ b/libs/common/src/lib/chart-helper.ts
@@ -103,7 +103,7 @@ export function getVerticalHoverLinePlugin(
colorScheme?: ColorScheme
) {
return {
- afterDatasetsDraw: (chart, _, options) => {
+ afterDatasetsDraw: (chart, x, options) => {
const active = chart.getActiveElements();
if (!active || active.length === 0) {
diff --git a/libs/common/src/lib/config.ts b/libs/common/src/lib/config.ts
index 4580ef4df..19ec965fa 100644
--- a/libs/common/src/lib/config.ts
+++ b/libs/common/src/lib/config.ts
@@ -40,20 +40,17 @@ export const DATA_GATHERING_QUEUE_PRIORITY_MEDIUM = Math.round(
DATA_GATHERING_QUEUE_PRIORITY_LOW / 2
);
-export const PORTFOLIO_SNAPSHOT_COMPUTATION_QUEUE =
- 'PORTFOLIO_SNAPSHOT_COMPUTATION_QUEUE';
-export const PORTFOLIO_SNAPSHOT_COMPUTATION_QUEUE_PRIORITY_HIGH = 1;
-export const PORTFOLIO_SNAPSHOT_COMPUTATION_QUEUE_PRIORITY_LOW =
- Number.MAX_SAFE_INTEGER;
+export const PORTFOLIO_SNAPSHOT_QUEUE = 'PORTFOLIO_SNAPSHOT_QUEUE';
+export const PORTFOLIO_SNAPSHOT_QUEUE_PRIORITY_HIGH = 1;
+export const PORTFOLIO_SNAPSHOT_QUEUE_PRIORITY_LOW = Number.MAX_SAFE_INTEGER;
export const DEFAULT_CURRENCY = 'USD';
export const DEFAULT_DATE_FORMAT_MONTH_YEAR = 'MMM yyyy';
export const DEFAULT_LANGUAGE_CODE = 'en';
export const DEFAULT_PAGE_SIZE = 50;
-export const DEFAULT_PROCESSOR_GATHER_ASSET_PROFILE_CONCURRENCY = 1;
-export const DEFAULT_PROCESSOR_GATHER_HISTORICAL_MARKET_DATA_CONCURRENCY = 1;
-export const DEFAULT_PROCESSOR_PORTFOLIO_SNAPSHOT_COMPUTATION_CONCURRENCY = 1;
-export const DEFAULT_PROCESSOR_PORTFOLIO_SNAPSHOT_COMPUTATION_TIMEOUT = 30000;
+export const DEFAULT_PROCESSOR_CONCURRENCY_GATHER_ASSET_PROFILE = 1;
+export const DEFAULT_PROCESSOR_CONCURRENCY_GATHER_HISTORICAL_MARKET_DATA = 1;
+export const DEFAULT_PROCESSOR_CONCURRENCY_PORTFOLIO_SNAPSHOT = 1;
export const DEFAULT_ROOT_URL = 'https://localhost:4200';
// USX is handled separately
diff --git a/libs/common/src/lib/interfaces/portfolio-report-rule.interface.ts b/libs/common/src/lib/interfaces/portfolio-report-rule.interface.ts
index 0296606b8..29cbb4a8f 100644
--- a/libs/common/src/lib/interfaces/portfolio-report-rule.interface.ts
+++ b/libs/common/src/lib/interfaces/portfolio-report-rule.interface.ts
@@ -1,17 +1,11 @@
export interface PortfolioReportRule {
- configuration?: {
- threshold?: {
- max: number;
- min: number;
- step: number;
- unit?: string;
- };
- thresholdMax?: boolean;
- thresholdMin?: boolean;
- };
evaluation?: string;
isActive: boolean;
key: string;
name: string;
+ settings?: {
+ thresholdMax?: number;
+ thresholdMin?: number;
+ };
value?: boolean;
}
diff --git a/libs/common/src/lib/personal-finance-tools.ts b/libs/common/src/lib/personal-finance-tools.ts
index 1ec5fbbc2..b5aeed19d 100644
--- a/libs/common/src/lib/personal-finance-tools.ts
+++ b/libs/common/src/lib/personal-finance-tools.ts
@@ -115,7 +115,6 @@ export const personalFinanceTools: Product[] = [
},
{
founded: 2022,
- isArchived: true,
key: 'capmon',
name: 'CapMon.org',
origin: 'Germany',
@@ -251,17 +250,6 @@ export const personalFinanceTools: Product[] = [
pricingPerYear: '€69.99',
slogan: 'Personal finances, simplified'
},
- {
- founded: 2021,
- hasFreePlan: true,
- hasSelfHostingAbility: false,
- key: 'firekit',
- languages: ['English', 'українська мова'],
- name: 'FIREkit',
- origin: 'Ukraine',
- pricingPerYear: '$40',
- slogan: 'A simple solution to track your wealth online'
- },
{
hasFreePlan: true,
hasSelfHostingAbility: false,
@@ -304,7 +292,6 @@ export const personalFinanceTools: Product[] = [
{
hasFreePlan: true,
hasSelfHostingAbility: false,
- isArchived: true,
key: 'intuit-mint',
name: 'Intuit Mint',
note: 'Intuit Mint was discontinued in 2023',
@@ -350,15 +337,6 @@ export const personalFinanceTools: Product[] = [
pricingPerYear: '$150',
slogan: 'The Time Machine for your Net Worth'
},
- {
- founded: 2021,
- hasFreePlan: false,
- key: 'leafs',
- languages: ['Deutsch', 'English'],
- name: 'Leafs',
- origin: 'Switzerland',
- slogan: 'Sustainability insights for wealth managers'
- },
{
founded: 2018,
hasFreePlan: false,
@@ -415,7 +393,6 @@ export const personalFinanceTools: Product[] = [
{
founded: 1991,
hasSelfHostingAbility: true,
- isArchived: true,
key: 'microsoft-money',
name: 'Microsoft Money',
note: 'Microsoft Money was discontinued in 2010',
@@ -523,7 +500,6 @@ export const personalFinanceTools: Product[] = [
},
{
hasFreePlan: true,
- isArchived: true,
key: 'portfoloo',
name: 'Portfoloo',
note: 'Portfoloo was discontinued',
@@ -562,7 +538,6 @@ export const personalFinanceTools: Product[] = [
{
founded: 2019,
hasSelfHostingAbility: false,
- isArchived: true,
key: 'sarmaaya.pk',
name: 'Sarmaaya.pk Portfolio Tracking',
note: 'Sarmaaya.pk Portfolio Tracking was discontinued in 2024',
@@ -599,7 +574,6 @@ export const personalFinanceTools: Product[] = [
},
{
hasFreePlan: true,
- isArchived: true,
key: 'sharesmaster',
name: 'SharesMaster',
note: 'SharesMaster was discontinued',
@@ -640,7 +614,6 @@ export const personalFinanceTools: Product[] = [
},
{
founded: 2008,
- isArchived: true,
key: 'stockmarketeye',
name: 'StockMarketEye',
origin: 'France',
@@ -753,7 +726,6 @@ export const personalFinanceTools: Product[] = [
founded: 2021,
hasFreePlan: true,
hasSelfHostingAbility: false,
- isArchived: true,
key: 'yeekatee',
languages: ['Deutsch', 'English', 'Español', 'Français', 'Italiano'],
name: 'yeekatee',
diff --git a/libs/common/src/lib/types/x-ray-rules-settings.type.ts b/libs/common/src/lib/types/x-ray-rules-settings.type.ts
index fddd708cc..a55487f0b 100644
--- a/libs/common/src/lib/types/x-ray-rules-settings.type.ts
+++ b/libs/common/src/lib/types/x-ray-rules-settings.type.ts
@@ -1,3 +1,5 @@
+import { PortfolioReportRule } from '@ghostfolio/common/interfaces';
+
export type XRayRulesSettings = {
AccountClusterRiskCurrentInvestment?: RuleSettings;
AccountClusterRiskSingleAccount?: RuleSettings;
@@ -7,8 +9,6 @@ export type XRayRulesSettings = {
FeeRatioInitialInvestment?: RuleSettings;
};
-interface RuleSettings {
+interface RuleSettings extends Pick {
isActive: boolean;
- thresholdMax?: number;
- thresholdMin?: number;
}
diff --git a/libs/ui/src/lib/benchmark/benchmark.component.html b/libs/ui/src/lib/benchmark/benchmark.component.html
index 8867e1c9e..ec92554de 100644
--- a/libs/ui/src/lib/benchmark/benchmark.component.html
+++ b/libs/ui/src/lib/benchmark/benchmark.component.html
@@ -122,18 +122,3 @@
"
>
-
-@if (isLoading) {
-
-} @else if (benchmarks?.length === 0) {
-
- No data available
-
-}
diff --git a/libs/ui/src/lib/benchmark/benchmark.component.ts b/libs/ui/src/lib/benchmark/benchmark.component.ts
index 22bc9a128..764d65c2c 100644
--- a/libs/ui/src/lib/benchmark/benchmark.component.ts
+++ b/libs/ui/src/lib/benchmark/benchmark.component.ts
@@ -49,7 +49,6 @@ export class GfBenchmarkComponent implements OnChanges, OnDestroy {
@Input() user: User;
public displayedColumns = ['name', 'date', 'change', 'marketCondition'];
- public isLoading = true;
public resolveMarketCondition = resolveMarketCondition;
public translate = translate;
@@ -77,10 +76,6 @@ export class GfBenchmarkComponent implements OnChanges, OnDestroy {
}
public ngOnChanges() {
- if (this.benchmarks) {
- this.isLoading = false;
- }
-
if (this.user?.settings?.isExperimentalFeatures) {
this.displayedColumns = [
'name',
diff --git a/libs/ui/src/lib/carousel/carousel.component.scss b/libs/ui/src/lib/carousel/carousel.component.scss
index 05ab9ff93..546c92194 100644
--- a/libs/ui/src/lib/carousel/carousel.component.scss
+++ b/libs/ui/src/lib/carousel/carousel.component.scss
@@ -3,7 +3,7 @@
position: relative;
::ng-deep {
- [gfCarouselItem] {
+ [gf-carousel-item] {
flex-shrink: 0;
width: 100%;
}
diff --git a/libs/ui/src/lib/i18n.ts b/libs/ui/src/lib/i18n.ts
index 46a8cd0fa..a98cbd704 100644
--- a/libs/ui/src/lib/i18n.ts
+++ b/libs/ui/src/lib/i18n.ts
@@ -88,7 +88,6 @@ const locales = {
'South Africa': $localize`South Africa`,
Switzerland: $localize`Switzerland`,
Thailand: $localize`Thailand`,
- Ukraine: $localize`Ukraine`,
'United States': $localize`United States`,
// Fear and Greed Index
diff --git a/libs/ui/src/lib/line-chart/line-chart.component.ts b/libs/ui/src/lib/line-chart/line-chart.component.ts
index e48ead9d9..4098e1d5b 100644
--- a/libs/ui/src/lib/line-chart/line-chart.component.ts
+++ b/libs/ui/src/lib/line-chart/line-chart.component.ts
@@ -27,13 +27,12 @@ import {
import {
Chart,
Filler,
- LinearScale,
LineController,
LineElement,
+ LinearScale,
PointElement,
TimeScale,
- Tooltip,
- TooltipPosition
+ Tooltip
} from 'chart.js';
import 'chartjs-adapter-date-fns';
import { NgxSkeletonLoaderModule } from 'ngx-skeleton-loader';
@@ -86,7 +85,7 @@ export class GfLineChartComponent
Tooltip
);
- Tooltip.positioners['top'] = (_elements, position: TooltipPosition) =>
+ Tooltip.positioners['top'] = (elements, position) =>
getTooltipPositionerMapTop(this.chart, position);
}
diff --git a/libs/ui/src/lib/treemap-chart/treemap-chart.component.ts b/libs/ui/src/lib/treemap-chart/treemap-chart.component.ts
index 7f74a81e1..0e694f6dc 100644
--- a/libs/ui/src/lib/treemap-chart/treemap-chart.component.ts
+++ b/libs/ui/src/lib/treemap-chart/treemap-chart.component.ts
@@ -87,11 +87,11 @@ export class GfTreemapChartComponent
const { endDate, startDate } = getIntervalFromDateRange(this.dateRange);
- const data: ChartConfiguration['data'] = {
+ const data: ChartConfiguration['data'] = {
datasets: [
{
backgroundColor(ctx) {
- let annualizedNetPerformancePercentWithCurrencyEffect =
+ const annualizedNetPerformancePercentWithCurrencyEffect =
getAnnualizedPerformancePercent({
daysInMarket: differenceInDays(
endDate,
@@ -105,12 +105,6 @@ export class GfTreemapChartComponent
)
}).toNumber();
- // Round to 2 decimal places
- annualizedNetPerformancePercentWithCurrencyEffect =
- Math.round(
- annualizedNetPerformancePercentWithCurrencyEffect * 100
- ) / 100;
-
if (
annualizedNetPerformancePercentWithCurrencyEffect >
0.03 * GfTreemapChartComponent.HEAT_MULTIPLIER
@@ -129,11 +123,8 @@ export class GfTreemapChartComponent
} else if (annualizedNetPerformancePercentWithCurrencyEffect > 0) {
return green[3];
} else if (
- Math.abs(annualizedNetPerformancePercentWithCurrencyEffect) === 0
+ annualizedNetPerformancePercentWithCurrencyEffect === 0
) {
- annualizedNetPerformancePercentWithCurrencyEffect = Math.abs(
- annualizedNetPerformancePercentWithCurrencyEffect
- );
return gray[3];
} else if (
annualizedNetPerformancePercentWithCurrencyEffect >
@@ -160,35 +151,36 @@ export class GfTreemapChartComponent
align: 'left',
color: ['white'],
display: true,
- font: [{ size: 16 }, { lineHeight: 1.5, size: 14 }],
+ font: [{ size: 14 }, { size: 11 }, { lineHeight: 2, size: 14 }],
formatter(ctx) {
const netPerformancePercentWithCurrencyEffect =
ctx.raw._data.netPerformancePercentWithCurrencyEffect;
return [
+ ctx.raw._data.name,
ctx.raw._data.symbol,
`${netPerformancePercentWithCurrencyEffect > 0 ? '+' : ''}${(ctx.raw._data.netPerformancePercentWithCurrencyEffect * 100).toFixed(2)}%`
];
},
- hoverColor: 'white',
position: 'top'
},
spacing: 1,
tree: this.holdings
}
]
- } as any;
+ };
if (this.chartCanvas) {
if (this.chart) {
this.chart.data = data;
- this.chart.options.plugins.tooltip =
- this.getTooltipPluginConfiguration() as unknown;
+ this.chart.options.plugins.tooltip = (
+ this.getTooltipPluginConfiguration()
+ );
this.chart.update();
} else {
this.chart = new Chart(this.chartCanvas.nativeElement, {
data,
- options: {
+ options: {
animation: false,
onClick: (event, activeElements) => {
try {
@@ -217,7 +209,7 @@ export class GfTreemapChartComponent
plugins: {
tooltip: this.getTooltipPluginConfiguration()
}
- } as unknown,
+ },
type: 'treemap'
});
}
@@ -239,7 +231,7 @@ export class GfTreemapChartComponent
const symbol = context.raw._data.symbol;
if (context.raw._data.valueInBaseCurrency !== null) {
- const value = context.raw._data.valueInBaseCurrency as number;
+ const value = context.raw._data.valueInBaseCurrency;
return [
`${name ?? symbol}`,
@@ -250,7 +242,7 @@ export class GfTreemapChartComponent
];
} else {
const percentage =
- (context.raw._data.allocationInPercentage as number) * 100;
+ context.raw._data.allocationInPercentage * 100;
return [`${name ?? symbol}`, `${percentage.toFixed(2)}%`];
}
diff --git a/package.json b/package.json
index 3e405ef31..e283d6a23 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "ghostfolio",
- "version": "2.116.0",
+ "version": "2.114.0",
"homepage": "https://ghostfol.io",
"license": "AGPL-3.0",
"repository": "https://github.com/ghostfolio/ghostfolio",
diff --git a/prisma/schema.prisma b/prisma/schema.prisma
index 9fa550762..0ae1df65a 100644
--- a/prisma/schema.prisma
+++ b/prisma/schema.prisma
@@ -193,9 +193,9 @@ model SymbolProfileOverrides {
holdings Json? @default("[]")
name String?
sectors Json? @default("[]")
+ url String?
symbolProfileId String @id
updatedAt DateTime @updatedAt
- url String?
SymbolProfile SymbolProfile @relation(fields: [symbolProfileId], onDelete: Cascade, references: [id])
}
@@ -239,7 +239,7 @@ model User {
Order Order[]
Settings Settings?
Subscription Subscription[]
- Tag Tag[]
+ Tag Tag[]
@@index([accessToken])
@@index([createdAt])
diff --git a/test/import/ok-novn-buy-and-sell-partially.json b/test/import/ok-novn-buy-and-sell-partially.json
index 06cbc75ea..c184b4ba4 100644
--- a/test/import/ok-novn-buy-and-sell-partially.json
+++ b/test/import/ok-novn-buy-and-sell-partially.json
@@ -5,23 +5,23 @@
},
"activities": [
{
- "fee": 1.3,
+ "fee": 0,
"quantity": 1,
"type": "SELL",
"unitPrice": 85.73,
"currency": "CHF",
"dataSource": "YAHOO",
- "date": "2022-04-08T00:00:00.000Z",
+ "date": "2022-04-07T22:00:00.000Z",
"symbol": "NOVN.SW"
},
{
- "fee": 2.95,
+ "fee": 0,
"quantity": 2,
"type": "BUY",
"unitPrice": 75.8,
"currency": "CHF",
"dataSource": "YAHOO",
- "date": "2022-03-07T00:00:00.000Z",
+ "date": "2022-03-06T23:00:00.000Z",
"symbol": "NOVN.SW"
}
]
diff --git a/tsconfig.base.json b/tsconfig.base.json
index 34ed5d559..e977a9596 100644
--- a/tsconfig.base.json
+++ b/tsconfig.base.json
@@ -31,8 +31,8 @@
"noImplicitThis": false,
"noImplicitOverride": false,
"noPropertyAccessFromIndexSignature": false,
- "noUnusedLocals": true,
- "noUnusedParameters": true,
+ "noUnusedLocals": false,
+ "noUnusedParameters": false,
"allowUnreachableCode": true
},
"exclude": ["node_modules", "tmp"]