Compare commits

..

28 Commits

Author SHA1 Message Date
ab59eb5c92 Release 2.75.0 (#3316) 2024-04-21 10:30:14 +02:00
1132dc9bdd Feature/add unique constraint to account balance database schema (#3315)
* Add accountId and date as unique constraint to AccountBalance schema

* Update changelog
2024-04-21 10:28:51 +02:00
2d70b18593 Remove links (#3306) 2024-04-21 10:08:22 +02:00
b6ea7d23fa Bugfix/add total value in base currency to redacted values (#3313)
* Add totalValueInBaseCurrency

* Update changelog
2024-04-21 08:33:38 +02:00
95382581f1 Release 2.74.0 (#3312) 2024-04-20 15:43:03 +02:00
551b83a6e3 Bugfix/fix gaps in portfolio performance charts (#3311)
* Fix gaps in charts

* Update changelog
2024-04-20 15:40:59 +02:00
895c4fe299 Improve style on mobile (#3310) 2024-04-20 12:54:23 +02:00
ccb1bf881e Feature/improve language localization for de 20240420 (#3309)
* Update translations

* Update changelog
2024-04-20 12:54:06 +02:00
7788b5a987 Improve messages (#3308) 2024-04-20 12:53:51 +02:00
47fd029e0c Clean up styles (#3305) 2024-04-20 12:15:21 +02:00
458ee159e1 Feature/upgrade nx to version 18.3.3 (#3307)
* Upgrade angular and Nx dependencies

* Update changelog
2024-04-20 12:14:50 +02:00
dfacbed66d Feature/add support to create account cash balances (#3260)
* Add support to create account cash balances

* Update changelog

---------

Co-authored-by: Thomas Kaul <4159106+dtslvr@users.noreply.github.com>
2024-04-20 11:00:00 +02:00
22d63c6102 Improve logging (#3304)
* Improve logging
2024-04-20 10:49:18 +02:00
212aa6a63b Feature/add date range support to portfolio holdings page (#3303)
* Add date range support

* Update changelog
2024-04-20 09:51:12 +02:00
bed9ae916c Migrate UI components to standalone (#3302) 2024-04-19 20:57:47 +02:00
b6ad362850 Feature/remove date range support in activities table on portfolio activities page (#3301)
* Remove date range support

* Update changelog
2024-04-19 20:44:28 +02:00
ab86dd5318 Add Home Assistant (#3291) 2024-04-19 20:43:52 +02:00
dba73d80a3 Improve logging (#3300) 2024-04-19 20:31:38 +02:00
92fb05320a Migrate UI components to standalone (#3296) 2024-04-19 18:31:35 +02:00
73d62bb51f Migrate UI components to standalone (#3290) 2024-04-18 20:46:12 +02:00
127b7d4f25 Make pre-commit executable by default (#3283) 2024-04-18 18:39:20 +02:00
e79d607ab8 Release 2.73.0 (#3287) 2024-04-17 17:42:28 +02:00
5f7d083f7c Feature/upgrade yahoo finance2 to version 2.11.2 (#3286)
* Upgrade yahoo-finance2 to version 2.11.2

* Update changelog
2024-04-17 17:40:58 +02:00
15857118fe Feature/let data gathering queue jobs fail by throwing errors (#3281)
* Let data gathering queue jobs fail by throwing errors

* Update changelog
2024-04-17 17:35:51 +02:00
ff91ed21df Upgrade @types/lodash to version 4.17.0 (#3227) 2024-04-15 19:25:46 +02:00
9241c04d5a Feature/add form validation against DTO for activity and account (#3230)
* Add form validation against DTO for activity and account

* Update changelog
2024-04-14 19:52:41 +02:00
5d4e2fba8c Feature/move wealth item and liability calculations to portfolio calculator (#3272)
* Move (wealth) item calculations to portfolio calculator

* Move liability calculations to portfolio calculator

* Update changelog
2024-04-14 08:12:32 +02:00
6c57609db8 Feature/move dividend fee and interest calculation to portfolio calculator (#3267)
* Move dividend, feee and interest calculation to portfolio calculator

* Update changelog
2024-04-13 11:07:18 +02:00
168 changed files with 3173 additions and 2116 deletions

View File

@ -5,6 +5,52 @@ All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
## 2.75.0 - 2024-04-21
### Added
- Added `accountId` and `date` as a unique constraint to the `AccountBalance` database schema
### Fixed
- Fixed an issue with `totalValueInBaseCurrency` in the value redaction interceptor for the impersonation mode
## 2.74.0 - 2024-04-20
### Added
- Added the date range support to the portfolio holdings page
- Added support to create an account balance
### Changed
- Removed the date range support in the activities table on the portfolio activities page (experimental)
- Improved the language localization for German (`de`)
- Upgraded `angular` from version `17.3.3` to `17.3.5`
- Upgraded `Nx` from version `18.2.3` to `18.3.3`
### Fixed
- Fixed gaps in the portfolio performance charts by considering `BUY` and `SELL` activities
## 2.73.0 - 2024-04-17
### Added
- Added a form validation against the DTO in the create or update account dialog
- Added a form validation against the DTO in the create or update activity dialog
### Changed
- Moved the dividend calculations into the portfolio calculator
- Moved the fee calculations into the portfolio calculator
- Moved the interest calculations into the portfolio calculator
- Moved the liability calculations into the portfolio calculator
- Moved the (wealth) item calculations into the portfolio calculator
- Let queue jobs for asset profile data gathering fail by throwing an error
- Let queue jobs for historical market data gathering fail by throwing an error
- Upgraded `yahoo-finance2` from version `2.11.1` to `2.11.2`
## 2.72.0 - 2024-04-13
### Added

View File

@ -13,8 +13,6 @@
[![Shield: Contributions Welcome](https://img.shields.io/badge/Contributions-Welcome-orange.svg)](#contributing)
[![Shield: License: AGPL v3](https://img.shields.io/badge/License-AGPL%20v3-blue.svg)](https://www.gnu.org/licenses/agpl-3.0)
New: [Ghostfolio 2.0](https://ghostfol.io/en/blog/2023/09/ghostfolio-2)
</div>
**Ghostfolio** is an open source wealth management software built with web technology. The application empowers busy people to keep track of stocks, ETFs or cryptocurrencies and make solid, data-driven investment decisions. The software is designed for personal use in continuous operation.
@ -144,7 +142,7 @@ docker compose --env-file ./.env -f docker/docker-compose.build.yml up -d
### Home Server Systems (Community)
Ghostfolio is available for various home server systems, including [CasaOS](https://github.com/bigbeartechworld/big-bear-casaos), [Runtipi](https://www.runtipi.io/docs/apps-available), [TrueCharts](https://truecharts.org/charts/stable/ghostfolio), [Umbrel](https://apps.umbrel.com/app/ghostfolio), and [Unraid](https://unraid.net/community/apps?q=ghostfolio).
Ghostfolio is available for various home server systems, including [CasaOS](https://github.com/bigbeartechworld/big-bear-casaos), Home Assistant, [Runtipi](https://www.runtipi.io/docs/apps-available), [TrueCharts](https://truecharts.org/charts/stable/ghostfolio), [Umbrel](https://apps.umbrel.com/app/ghostfolio), and [Unraid](https://unraid.net/community/apps?q=ghostfolio).
## Development

View File

@ -1,10 +1,14 @@
import { AccountService } from '@ghostfolio/api/app/account/account.service';
import { HasPermission } from '@ghostfolio/api/decorators/has-permission.decorator';
import { HasPermissionGuard } from '@ghostfolio/api/guards/has-permission.guard';
import { resetHours } from '@ghostfolio/common/helper';
import { permissions } from '@ghostfolio/common/permissions';
import type { RequestWithUser } from '@ghostfolio/common/types';
import {
Controller,
Body,
Post,
Delete,
HttpException,
Inject,
@ -14,17 +18,48 @@ import {
import { REQUEST } from '@nestjs/core';
import { AuthGuard } from '@nestjs/passport';
import { AccountBalance } from '@prisma/client';
import { parseISO } from 'date-fns';
import { StatusCodes, getReasonPhrase } from 'http-status-codes';
import { AccountBalanceService } from './account-balance.service';
import { CreateAccountBalanceDto } from './create-account-balance.dto';
@Controller('account-balance')
export class AccountBalanceController {
public constructor(
private readonly accountBalanceService: AccountBalanceService,
private readonly accountService: AccountService,
@Inject(REQUEST) private readonly request: RequestWithUser
) {}
@HasPermission(permissions.createAccountBalance)
@Post()
@UseGuards(AuthGuard('jwt'), HasPermissionGuard)
public async createAccountBalance(
@Body() data: CreateAccountBalanceDto
): Promise<AccountBalance> {
const account = await this.accountService.account({
id_userId: {
id: data.accountId,
userId: this.request.user.id
}
});
if (!account) {
throw new HttpException(
getReasonPhrase(StatusCodes.FORBIDDEN),
StatusCodes.FORBIDDEN
);
}
return this.accountBalanceService.createOrUpdateAccountBalance({
accountId: account.id,
balance: data.balance,
date: data.date,
userId: account.userId
});
}
@HasPermission(permissions.deleteAccountBalance)
@Delete(':id')
@UseGuards(AuthGuard('jwt'), HasPermissionGuard)

View File

@ -1,3 +1,4 @@
import { AccountService } from '@ghostfolio/api/app/account/account.service';
import { ExchangeRateDataModule } from '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.module';
import { PrismaModule } from '@ghostfolio/api/services/prisma/prisma.module';
@ -10,6 +11,6 @@ import { AccountBalanceService } from './account-balance.service';
controllers: [AccountBalanceController],
exports: [AccountBalanceService],
imports: [ExchangeRateDataModule, PrismaModule],
providers: [AccountBalanceService]
providers: [AccountBalanceService, AccountService]
})
export class AccountBalanceModule {}

View File

@ -1,10 +1,14 @@
import { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.service';
import { PrismaService } from '@ghostfolio/api/services/prisma/prisma.service';
import { resetHours } from '@ghostfolio/common/helper';
import { AccountBalancesResponse, Filter } from '@ghostfolio/common/interfaces';
import { UserWithSettings } from '@ghostfolio/common/types';
import { Injectable } from '@nestjs/common';
import { AccountBalance, Prisma } from '@prisma/client';
import { parseISO } from 'date-fns';
import { CreateAccountBalanceDto } from './create-account-balance.dto';
@Injectable()
export class AccountBalanceService {
@ -24,11 +28,36 @@ export class AccountBalanceService {
});
}
public async createAccountBalance(
data: Prisma.AccountBalanceCreateInput
): Promise<AccountBalance> {
return this.prismaService.accountBalance.create({
data
public async createOrUpdateAccountBalance({
accountId,
balance,
date,
userId
}: CreateAccountBalanceDto & {
userId: string;
}): Promise<AccountBalance> {
return this.prismaService.accountBalance.upsert({
create: {
Account: {
connect: {
id_userId: {
userId,
id: accountId
}
}
},
date: resetHours(parseISO(date)),
value: balance
},
update: {
value: balance
},
where: {
accountId_date: {
accountId,
date: resetHours(parseISO(date))
}
}
});
}

View File

@ -0,0 +1,12 @@
import { IsISO8601, IsNumber, IsUUID } from 'class-validator';
export class CreateAccountBalanceDto {
@IsUUID()
accountId: string;
@IsNumber()
balance: number;
@IsISO8601()
date: string;
}

View File

@ -6,6 +6,7 @@ import { Filter } from '@ghostfolio/common/interfaces';
import { Injectable } from '@nestjs/common';
import { Account, Order, Platform, Prisma } from '@prisma/client';
import { Big } from 'big.js';
import { parseISO } from 'date-fns';
import { groupBy } from 'lodash';
import { CashDetails } from './interfaces/cash-details.interface';
@ -242,17 +243,11 @@ export class AccountService {
);
if (amountInCurrencyOfAccount) {
await this.accountBalanceService.createAccountBalance({
date,
Account: {
connect: {
id_userId: {
userId,
id: accountId
}
}
},
value: new Big(balance).plus(amountInCurrencyOfAccount).toNumber()
await this.accountBalanceService.createOrUpdateAccountBalance({
accountId,
userId,
balance: new Big(balance).plus(amountInCurrencyOfAccount).toNumber(),
date: date.toISOString()
});
}
}

View File

@ -1,5 +1,5 @@
import { PortfolioCalculator } from '@ghostfolio/api/app/portfolio/calculator/portfolio-calculator';
import { CurrentPositions } from '@ghostfolio/api/app/portfolio/interfaces/current-positions.interface';
import { PortfolioSnapshot } from '@ghostfolio/api/app/portfolio/interfaces/portfolio-snapshot.interface';
import {
SymbolMetrics,
TimelinePosition,
@ -9,7 +9,7 @@ import {
export class MWRPortfolioCalculator extends PortfolioCalculator {
protected calculateOverallPerformance(
positions: TimelinePosition[]
): CurrentPositions {
): PortfolioSnapshot {
throw new Error('Method not implemented.');
}

View File

@ -1,6 +1,7 @@
import { Activity } from '@ghostfolio/api/app/order/interfaces/activities.interface';
import { CurrentRateService } from '@ghostfolio/api/app/portfolio/current-rate.service';
import { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.service';
import { DateRange } from '@ghostfolio/common/types';
import { Injectable } from '@nestjs/common';
@ -23,17 +24,20 @@ export class PortfolioCalculatorFactory {
public createCalculator({
activities,
calculationType,
currency
currency,
dateRange = 'max'
}: {
activities: Activity[];
calculationType: PerformanceCalculationType;
currency: string;
dateRange?: DateRange;
}): PortfolioCalculator {
switch (calculationType) {
case PerformanceCalculationType.MWR:
return new MWRPortfolioCalculator({
activities,
currency,
dateRange,
currentRateService: this.currentRateService,
exchangeRateDataService: this.exchangeRateDataService
});
@ -42,6 +46,7 @@ export class PortfolioCalculatorFactory {
activities,
currency,
currentRateService: this.currentRateService,
dateRange,
exchangeRateDataService: this.exchangeRateDataService
});
default:

View File

@ -1,7 +1,7 @@
import { Activity } from '@ghostfolio/api/app/order/interfaces/activities.interface';
import { CurrentRateService } from '@ghostfolio/api/app/portfolio/current-rate.service';
import { CurrentPositions } from '@ghostfolio/api/app/portfolio/interfaces/current-positions.interface';
import { PortfolioOrder } from '@ghostfolio/api/app/portfolio/interfaces/portfolio-order.interface';
import { PortfolioSnapshot } from '@ghostfolio/api/app/portfolio/interfaces/portfolio-snapshot.interface';
import { TransactionPointSymbol } from '@ghostfolio/api/app/portfolio/interfaces/transaction-point-symbol.interface';
import { TransactionPoint } from '@ghostfolio/api/app/portfolio/interfaces/transaction-point.interface';
import {
@ -11,7 +11,12 @@ import {
import { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.service';
import { IDataGatheringItem } from '@ghostfolio/api/services/interfaces/interfaces';
import { MAX_CHART_ITEMS } from '@ghostfolio/common/config';
import { DATE_FORMAT, parseDate, resetHours } from '@ghostfolio/common/helper';
import {
DATE_FORMAT,
getSum,
parseDate,
resetHours
} from '@ghostfolio/common/helper';
import {
DataProviderInfo,
HistoricalDataItem,
@ -44,18 +49,24 @@ export abstract class PortfolioCalculator {
private currency: string;
private currentRateService: CurrentRateService;
private dataProviderInfos: DataProviderInfo[];
private endDate: Date;
private exchangeRateDataService: ExchangeRateDataService;
private snapshot: PortfolioSnapshot;
private snapshotPromise: Promise<void>;
private startDate: Date;
private transactionPoints: TransactionPoint[];
public constructor({
activities,
currency,
currentRateService,
dateRange,
exchangeRateDataService
}: {
activities: Activity[];
currency: string;
currentRateService: CurrentRateService;
dateRange: DateRange;
exchangeRateDataService: ExchangeRateDataService;
}) {
this.currency = currency;
@ -79,12 +90,291 @@ export abstract class PortfolioCalculator {
return a.date?.localeCompare(b.date);
});
const { endDate, startDate } = getInterval(dateRange);
this.endDate = endDate;
this.startDate = startDate;
this.computeTransactionPoints();
this.snapshotPromise = this.initialize();
}
protected abstract calculateOverallPerformance(
positions: TimelinePosition[]
): CurrentPositions;
): PortfolioSnapshot;
public async computeSnapshot(
start: Date,
end?: Date
): Promise<PortfolioSnapshot> {
const lastTransactionPoint = last(this.transactionPoints);
let endDate = end;
if (!endDate) {
endDate = new Date(Date.now());
if (lastTransactionPoint) {
endDate = max([endDate, parseDate(lastTransactionPoint.date)]);
}
}
const transactionPoints = this.transactionPoints?.filter(({ date }) => {
return isBefore(parseDate(date), endDate);
});
if (!transactionPoints.length) {
return {
currentValueInBaseCurrency: new Big(0),
grossPerformance: new Big(0),
grossPerformancePercentage: new Big(0),
grossPerformancePercentageWithCurrencyEffect: new Big(0),
grossPerformanceWithCurrencyEffect: new Big(0),
hasErrors: false,
netPerformance: new Big(0),
netPerformancePercentage: new Big(0),
netPerformancePercentageWithCurrencyEffect: new Big(0),
netPerformanceWithCurrencyEffect: new Big(0),
positions: [],
totalFeesWithCurrencyEffect: new Big(0),
totalInterestWithCurrencyEffect: new Big(0),
totalInvestment: new Big(0),
totalInvestmentWithCurrencyEffect: new Big(0),
totalLiabilitiesWithCurrencyEffect: new Big(0),
totalValuablesWithCurrencyEffect: new Big(0)
};
}
const currencies: { [symbol: string]: string } = {};
const dataGatheringItems: IDataGatheringItem[] = [];
let dates: Date[] = [];
let firstIndex = transactionPoints.length;
let firstTransactionPoint: TransactionPoint = null;
let totalInterestWithCurrencyEffect = new Big(0);
let totalLiabilitiesWithCurrencyEffect = new Big(0);
let totalValuablesWithCurrencyEffect = new Big(0);
dates.push(resetHours(start));
for (const { currency, dataSource, symbol } of transactionPoints[
firstIndex - 1
].items) {
dataGatheringItems.push({
dataSource,
symbol
});
currencies[symbol] = currency;
}
for (let i = 0; i < transactionPoints.length; i++) {
if (
!isBefore(parseDate(transactionPoints[i].date), start) &&
firstTransactionPoint === null
) {
firstTransactionPoint = transactionPoints[i];
firstIndex = i;
}
if (firstTransactionPoint !== null) {
dates.push(resetHours(parseDate(transactionPoints[i].date)));
}
}
dates.push(resetHours(endDate));
// Add dates of last week for fallback
dates.push(subDays(resetHours(new Date()), 7));
dates.push(subDays(resetHours(new Date()), 6));
dates.push(subDays(resetHours(new Date()), 5));
dates.push(subDays(resetHours(new Date()), 4));
dates.push(subDays(resetHours(new Date()), 3));
dates.push(subDays(resetHours(new Date()), 2));
dates.push(subDays(resetHours(new Date()), 1));
dates.push(resetHours(new Date()));
dates = uniq(
dates.map((date) => {
return date.getTime();
})
)
.map((timestamp) => {
return new Date(timestamp);
})
.sort((a, b) => {
return a.getTime() - b.getTime();
});
let exchangeRatesByCurrency =
await this.exchangeRateDataService.getExchangeRatesByCurrency({
currencies: uniq(Object.values(currencies)),
endDate: endOfDay(endDate),
startDate: this.getStartDate(),
targetCurrency: this.currency
});
const {
dataProviderInfos,
errors: currentRateErrors,
values: marketSymbols
} = await this.currentRateService.getValues({
dataGatheringItems,
dateQuery: {
in: dates
}
});
this.dataProviderInfos = dataProviderInfos;
const marketSymbolMap: {
[date: string]: { [symbol: string]: Big };
} = {};
for (const marketSymbol of marketSymbols) {
const date = format(marketSymbol.date, DATE_FORMAT);
if (!marketSymbolMap[date]) {
marketSymbolMap[date] = {};
}
if (marketSymbol.marketPrice) {
marketSymbolMap[date][marketSymbol.symbol] = new Big(
marketSymbol.marketPrice
);
}
}
const endDateString = format(endDate, DATE_FORMAT);
if (firstIndex > 0) {
firstIndex--;
}
const positions: TimelinePosition[] = [];
let hasAnySymbolMetricsErrors = false;
const errors: ResponseError['errors'] = [];
for (const item of lastTransactionPoint.items) {
const marketPriceInBaseCurrency = (
marketSymbolMap[endDateString]?.[item.symbol] ?? item.averagePrice
).mul(
exchangeRatesByCurrency[`${item.currency}${this.currency}`]?.[
endDateString
]
);
const {
grossPerformance,
grossPerformancePercentage,
grossPerformancePercentageWithCurrencyEffect,
grossPerformanceWithCurrencyEffect,
hasErrors,
netPerformance,
netPerformancePercentage,
netPerformancePercentageWithCurrencyEffect,
netPerformanceWithCurrencyEffect,
timeWeightedInvestment,
timeWeightedInvestmentWithCurrencyEffect,
totalDividend,
totalDividendInBaseCurrency,
totalInterestInBaseCurrency,
totalInvestment,
totalInvestmentWithCurrencyEffect,
totalLiabilitiesInBaseCurrency,
totalValuablesInBaseCurrency
} = this.getSymbolMetrics({
marketSymbolMap,
start,
dataSource: item.dataSource,
end: endDate,
exchangeRates:
exchangeRatesByCurrency[`${item.currency}${this.currency}`],
symbol: item.symbol
});
hasAnySymbolMetricsErrors = hasAnySymbolMetricsErrors || hasErrors;
positions.push({
dividend: totalDividend,
dividendInBaseCurrency: totalDividendInBaseCurrency,
timeWeightedInvestment,
timeWeightedInvestmentWithCurrencyEffect,
averagePrice: item.averagePrice,
currency: item.currency,
dataSource: item.dataSource,
fee: item.fee,
firstBuyDate: item.firstBuyDate,
grossPerformance: !hasErrors ? grossPerformance ?? null : null,
grossPerformancePercentage: !hasErrors
? grossPerformancePercentage ?? null
: null,
grossPerformancePercentageWithCurrencyEffect: !hasErrors
? grossPerformancePercentageWithCurrencyEffect ?? null
: null,
grossPerformanceWithCurrencyEffect: !hasErrors
? grossPerformanceWithCurrencyEffect ?? null
: null,
investment: totalInvestment,
investmentWithCurrencyEffect: totalInvestmentWithCurrencyEffect,
marketPrice:
marketSymbolMap[endDateString]?.[item.symbol]?.toNumber() ?? null,
marketPriceInBaseCurrency:
marketPriceInBaseCurrency?.toNumber() ?? null,
netPerformance: !hasErrors ? netPerformance ?? null : null,
netPerformancePercentage: !hasErrors
? netPerformancePercentage ?? null
: null,
netPerformancePercentageWithCurrencyEffect: !hasErrors
? netPerformancePercentageWithCurrencyEffect ?? null
: null,
netPerformanceWithCurrencyEffect: !hasErrors
? netPerformanceWithCurrencyEffect ?? null
: null,
quantity: item.quantity,
symbol: item.symbol,
tags: item.tags,
transactionCount: item.transactionCount,
valueInBaseCurrency: new Big(marketPriceInBaseCurrency).mul(
item.quantity
)
});
totalInterestWithCurrencyEffect = totalInterestWithCurrencyEffect.plus(
totalInterestInBaseCurrency
);
totalLiabilitiesWithCurrencyEffect =
totalLiabilitiesWithCurrencyEffect.plus(totalLiabilitiesInBaseCurrency);
totalValuablesWithCurrencyEffect = totalValuablesWithCurrencyEffect.plus(
totalValuablesInBaseCurrency
);
if (
(hasErrors ||
currentRateErrors.find(({ dataSource, symbol }) => {
return dataSource === item.dataSource && symbol === item.symbol;
})) &&
item.investment.gt(0)
) {
errors.push({ dataSource: item.dataSource, symbol: item.symbol });
}
}
const overall = this.calculateOverallPerformance(positions);
return {
...overall,
errors,
positions,
totalInterestWithCurrencyEffect,
totalLiabilitiesWithCurrencyEffect,
totalValuablesWithCurrencyEffect,
hasErrors: hasAnySymbolMetricsErrors || overall.hasErrors
};
}
public async getChart({
dateRange = 'max',
@ -380,258 +670,32 @@ export abstract class PortfolioCalculator {
});
}
public async getCurrentPositions(
start: Date,
end?: Date
): Promise<CurrentPositions> {
const lastTransactionPoint = last(this.transactionPoints);
let endDate = end;
if (!endDate) {
endDate = new Date(Date.now());
if (lastTransactionPoint) {
endDate = max([endDate, parseDate(lastTransactionPoint.date)]);
}
}
const transactionPoints = this.transactionPoints?.filter(({ date }) => {
return isBefore(parseDate(date), endDate);
});
if (!transactionPoints.length) {
return {
currentValueInBaseCurrency: new Big(0),
grossPerformance: new Big(0),
grossPerformancePercentage: new Big(0),
grossPerformancePercentageWithCurrencyEffect: new Big(0),
grossPerformanceWithCurrencyEffect: new Big(0),
hasErrors: false,
netPerformance: new Big(0),
netPerformancePercentage: new Big(0),
netPerformancePercentageWithCurrencyEffect: new Big(0),
netPerformanceWithCurrencyEffect: new Big(0),
positions: [],
totalInvestment: new Big(0),
totalInvestmentWithCurrencyEffect: new Big(0)
};
}
const currencies: { [symbol: string]: string } = {};
const dataGatheringItems: IDataGatheringItem[] = [];
let dates: Date[] = [];
let firstIndex = transactionPoints.length;
let firstTransactionPoint: TransactionPoint = null;
dates.push(resetHours(start));
for (const { currency, dataSource, symbol } of transactionPoints[
firstIndex - 1
].items) {
dataGatheringItems.push({
dataSource,
symbol
});
currencies[symbol] = currency;
}
for (let i = 0; i < transactionPoints.length; i++) {
if (
!isBefore(parseDate(transactionPoints[i].date), start) &&
firstTransactionPoint === null
) {
firstTransactionPoint = transactionPoints[i];
firstIndex = i;
}
if (firstTransactionPoint !== null) {
dates.push(resetHours(parseDate(transactionPoints[i].date)));
}
}
dates.push(resetHours(endDate));
// Add dates of last week for fallback
dates.push(subDays(resetHours(new Date()), 7));
dates.push(subDays(resetHours(new Date()), 6));
dates.push(subDays(resetHours(new Date()), 5));
dates.push(subDays(resetHours(new Date()), 4));
dates.push(subDays(resetHours(new Date()), 3));
dates.push(subDays(resetHours(new Date()), 2));
dates.push(subDays(resetHours(new Date()), 1));
dates.push(resetHours(new Date()));
dates = uniq(
dates.map((date) => {
return date.getTime();
})
)
.map((timestamp) => {
return new Date(timestamp);
})
.sort((a, b) => {
return a.getTime() - b.getTime();
});
let exchangeRatesByCurrency =
await this.exchangeRateDataService.getExchangeRatesByCurrency({
currencies: uniq(Object.values(currencies)),
endDate: endOfDay(endDate),
startDate: this.getStartDate(),
targetCurrency: this.currency
});
const {
dataProviderInfos,
errors: currentRateErrors,
values: marketSymbols
} = await this.currentRateService.getValues({
dataGatheringItems,
dateQuery: {
in: dates
}
});
this.dataProviderInfos = dataProviderInfos;
const marketSymbolMap: {
[date: string]: { [symbol: string]: Big };
} = {};
for (const marketSymbol of marketSymbols) {
const date = format(marketSymbol.date, DATE_FORMAT);
if (!marketSymbolMap[date]) {
marketSymbolMap[date] = {};
}
if (marketSymbol.marketPrice) {
marketSymbolMap[date][marketSymbol.symbol] = new Big(
marketSymbol.marketPrice
);
}
}
const endDateString = format(endDate, DATE_FORMAT);
if (firstIndex > 0) {
firstIndex--;
}
const positions: TimelinePosition[] = [];
let hasAnySymbolMetricsErrors = false;
const errors: ResponseError['errors'] = [];
for (const item of lastTransactionPoint.items) {
const marketPriceInBaseCurrency = (
marketSymbolMap[endDateString]?.[item.symbol] ?? item.averagePrice
).mul(
exchangeRatesByCurrency[`${item.currency}${this.currency}`]?.[
endDateString
]
);
const {
grossPerformance,
grossPerformancePercentage,
grossPerformancePercentageWithCurrencyEffect,
grossPerformanceWithCurrencyEffect,
hasErrors,
netPerformance,
netPerformancePercentage,
netPerformancePercentageWithCurrencyEffect,
netPerformanceWithCurrencyEffect,
timeWeightedInvestment,
timeWeightedInvestmentWithCurrencyEffect,
totalDividend,
totalDividendInBaseCurrency,
totalInvestment,
totalInvestmentWithCurrencyEffect
} = this.getSymbolMetrics({
marketSymbolMap,
start,
dataSource: item.dataSource,
end: endDate,
exchangeRates:
exchangeRatesByCurrency[`${item.currency}${this.currency}`],
symbol: item.symbol
});
hasAnySymbolMetricsErrors = hasAnySymbolMetricsErrors || hasErrors;
positions.push({
dividend: totalDividend,
dividendInBaseCurrency: totalDividendInBaseCurrency,
timeWeightedInvestment,
timeWeightedInvestmentWithCurrencyEffect,
averagePrice: item.averagePrice,
currency: item.currency,
dataSource: item.dataSource,
fee: item.fee,
firstBuyDate: item.firstBuyDate,
grossPerformance: !hasErrors ? grossPerformance ?? null : null,
grossPerformancePercentage: !hasErrors
? grossPerformancePercentage ?? null
: null,
grossPerformancePercentageWithCurrencyEffect: !hasErrors
? grossPerformancePercentageWithCurrencyEffect ?? null
: null,
grossPerformanceWithCurrencyEffect: !hasErrors
? grossPerformanceWithCurrencyEffect ?? null
: null,
investment: totalInvestment,
investmentWithCurrencyEffect: totalInvestmentWithCurrencyEffect,
marketPrice:
marketSymbolMap[endDateString]?.[item.symbol]?.toNumber() ?? null,
marketPriceInBaseCurrency:
marketPriceInBaseCurrency?.toNumber() ?? null,
netPerformance: !hasErrors ? netPerformance ?? null : null,
netPerformancePercentage: !hasErrors
? netPerformancePercentage ?? null
: null,
netPerformancePercentageWithCurrencyEffect: !hasErrors
? netPerformancePercentageWithCurrencyEffect ?? null
: null,
netPerformanceWithCurrencyEffect: !hasErrors
? netPerformanceWithCurrencyEffect ?? null
: null,
quantity: item.quantity,
symbol: item.symbol,
tags: item.tags,
transactionCount: item.transactionCount,
valueInBaseCurrency: new Big(marketPriceInBaseCurrency).mul(
item.quantity
)
});
if (
(hasErrors ||
currentRateErrors.find(({ dataSource, symbol }) => {
return dataSource === item.dataSource && symbol === item.symbol;
})) &&
item.investment.gt(0)
) {
errors.push({ dataSource: item.dataSource, symbol: item.symbol });
}
}
const overall = this.calculateOverallPerformance(positions);
return {
...overall,
errors,
positions,
hasErrors: hasAnySymbolMetricsErrors || overall.hasErrors
};
}
public getDataProviderInfos() {
return this.dataProviderInfos;
}
public async getDividendInBaseCurrency() {
await this.snapshotPromise;
return getSum(
this.snapshot.positions.map(({ dividendInBaseCurrency }) => {
return dividendInBaseCurrency;
})
);
}
public async getFeesInBaseCurrency() {
await this.snapshotPromise;
return this.snapshot.totalFeesWithCurrencyEffect;
}
public async getInterestInBaseCurrency() {
await this.snapshotPromise;
return this.snapshot.totalInterestWithCurrencyEffect;
}
public getInvestments(): { date: string; investment: Big }[] {
if (this.transactionPoints.length === 0) {
return [];
@ -672,6 +736,18 @@ export abstract class PortfolioCalculator {
}));
}
public async getLiabilitiesInBaseCurrency() {
await this.snapshotPromise;
return this.snapshot.totalLiabilitiesWithCurrencyEffect;
}
public async getSnapshot() {
await this.snapshotPromise;
return this.snapshot;
}
public getStartDate() {
return this.transactionPoints.length > 0
? parseDate(this.transactionPoints[0].date)
@ -702,6 +778,12 @@ export abstract class PortfolioCalculator {
return this.transactionPoints;
}
public async getValuablesInBaseCurrency() {
await this.snapshotPromise;
return this.snapshot.totalValuablesWithCurrencyEffect;
}
private computeTransactionPoints() {
this.transactionPoints = [];
const symbols: { [symbol: string]: TransactionPointSymbol } = {};
@ -790,18 +872,57 @@ export abstract class PortfolioCalculator {
return a.symbol?.localeCompare(b.symbol);
});
let fees = new Big(0);
if (type === 'FEE') {
fees = fee;
}
let interest = new Big(0);
if (type === 'INTEREST') {
interest = quantity.mul(unitPrice);
}
let liabilities = new Big(0);
if (type === 'LIABILITY') {
liabilities = quantity.mul(unitPrice);
}
let valuables = new Big(0);
if (type === 'ITEM') {
valuables = quantity.mul(unitPrice);
}
if (lastDate !== date || lastTransactionPoint === null) {
lastTransactionPoint = {
date,
fees,
interest,
liabilities,
valuables,
items: newItems
};
this.transactionPoints.push(lastTransactionPoint);
} else {
lastTransactionPoint.fees = lastTransactionPoint.fees.plus(fees);
lastTransactionPoint.interest =
lastTransactionPoint.interest.plus(interest);
lastTransactionPoint.items = newItems;
lastTransactionPoint.liabilities =
lastTransactionPoint.liabilities.plus(liabilities);
lastTransactionPoint.valuables =
lastTransactionPoint.valuables.plus(valuables);
}
lastDate = date;
}
}
private async initialize() {
this.snapshot = await this.computeSnapshot(this.startDate, this.endDate);
}
}

View File

@ -46,6 +46,10 @@ describe('PortfolioCalculator', () => {
describe('get current positions', () => {
it.only('with BALN.SW buy and sell in two activities', async () => {
const spy = jest
.spyOn(Date, 'now')
.mockImplementation(() => parseDate('2021-12-18').getTime());
const activities: Activity[] = [
{
...activityDummyData,
@ -100,15 +104,11 @@ describe('PortfolioCalculator', () => {
currency: 'CHF'
});
const spy = jest
.spyOn(Date, 'now')
.mockImplementation(() => parseDate('2021-12-18').getTime());
const chartData = await portfolioCalculator.getChartData({
start: parseDate('2021-11-22')
});
const currentPositions = await portfolioCalculator.getCurrentPositions(
const portfolioSnapshot = await portfolioCalculator.computeSnapshot(
parseDate('2021-11-22')
);
@ -121,7 +121,7 @@ describe('PortfolioCalculator', () => {
spy.mockRestore();
expect(currentPositions).toEqual({
expect(portfolioSnapshot).toEqual({
currentValueInBaseCurrency: new Big('0'),
errors: [],
grossPerformance: new Big('-12.6'),
@ -173,8 +173,12 @@ describe('PortfolioCalculator', () => {
valueInBaseCurrency: new Big('0')
}
],
totalFeesWithCurrencyEffect: new Big('3.2'),
totalInterestWithCurrencyEffect: new Big('0'),
totalInvestment: new Big('0'),
totalInvestmentWithCurrencyEffect: new Big('0')
totalInvestmentWithCurrencyEffect: new Big('0'),
totalLiabilitiesWithCurrencyEffect: new Big('0'),
totalValuablesWithCurrencyEffect: new Big('0')
});
expect(investments).toEqual([

View File

@ -46,6 +46,10 @@ describe('PortfolioCalculator', () => {
describe('get current positions', () => {
it.only('with BALN.SW buy and sell', async () => {
const spy = jest
.spyOn(Date, 'now')
.mockImplementation(() => parseDate('2021-12-18').getTime());
const activities: Activity[] = [
{
...activityDummyData,
@ -85,15 +89,11 @@ describe('PortfolioCalculator', () => {
currency: 'CHF'
});
const spy = jest
.spyOn(Date, 'now')
.mockImplementation(() => parseDate('2021-12-18').getTime());
const chartData = await portfolioCalculator.getChartData({
start: parseDate('2021-11-22')
});
const currentPositions = await portfolioCalculator.getCurrentPositions(
const portfolioSnapshot = await portfolioCalculator.computeSnapshot(
parseDate('2021-11-22')
);
@ -106,7 +106,7 @@ describe('PortfolioCalculator', () => {
spy.mockRestore();
expect(currentPositions).toEqual({
expect(portfolioSnapshot).toEqual({
currentValueInBaseCurrency: new Big('0'),
errors: [],
grossPerformance: new Big('-12.6'),
@ -156,8 +156,12 @@ describe('PortfolioCalculator', () => {
valueInBaseCurrency: new Big('0')
}
],
totalFeesWithCurrencyEffect: new Big('3.2'),
totalInterestWithCurrencyEffect: new Big('0'),
totalInvestment: new Big('0'),
totalInvestmentWithCurrencyEffect: new Big('0')
totalInvestmentWithCurrencyEffect: new Big('0'),
totalLiabilitiesWithCurrencyEffect: new Big('0'),
totalValuablesWithCurrencyEffect: new Big('0')
});
expect(investments).toEqual([

View File

@ -46,6 +46,10 @@ describe('PortfolioCalculator', () => {
describe('get current positions', () => {
it.only('with BALN.SW buy', async () => {
const spy = jest
.spyOn(Date, 'now')
.mockImplementation(() => parseDate('2021-12-18').getTime());
const activities: Activity[] = [
{
...activityDummyData,
@ -70,15 +74,11 @@ describe('PortfolioCalculator', () => {
currency: 'CHF'
});
const spy = jest
.spyOn(Date, 'now')
.mockImplementation(() => parseDate('2021-12-18').getTime());
const chartData = await portfolioCalculator.getChartData({
start: parseDate('2021-11-30')
});
const currentPositions = await portfolioCalculator.getCurrentPositions(
const portfolioSnapshot = await portfolioCalculator.computeSnapshot(
parseDate('2021-11-30')
);
@ -91,7 +91,7 @@ describe('PortfolioCalculator', () => {
spy.mockRestore();
expect(currentPositions).toEqual({
expect(portfolioSnapshot).toEqual({
currentValueInBaseCurrency: new Big('297.8'),
errors: [],
grossPerformance: new Big('24.6'),
@ -141,8 +141,12 @@ describe('PortfolioCalculator', () => {
valueInBaseCurrency: new Big('297.8')
}
],
totalFeesWithCurrencyEffect: new Big('1.55'),
totalInterestWithCurrencyEffect: new Big('0'),
totalInvestment: new Big('273.2'),
totalInvestmentWithCurrencyEffect: new Big('273.2')
totalInvestmentWithCurrencyEffect: new Big('273.2'),
totalLiabilitiesWithCurrencyEffect: new Big('0'),
totalValuablesWithCurrencyEffect: new Big('0')
});
expect(investments).toEqual([

View File

@ -59,6 +59,10 @@ describe('PortfolioCalculator', () => {
describe('get current positions', () => {
it.only('with BTCUSD buy and sell partially', async () => {
const spy = jest
.spyOn(Date, 'now')
.mockImplementation(() => parseDate('2018-01-01').getTime());
const activities: Activity[] = [
{
...activityDummyData,
@ -98,15 +102,11 @@ describe('PortfolioCalculator', () => {
currency: 'CHF'
});
const spy = jest
.spyOn(Date, 'now')
.mockImplementation(() => parseDate('2018-01-01').getTime());
const chartData = await portfolioCalculator.getChartData({
start: parseDate('2015-01-01')
});
const currentPositions = await portfolioCalculator.getCurrentPositions(
const portfolioSnapshot = await portfolioCalculator.computeSnapshot(
parseDate('2015-01-01')
);
@ -119,7 +119,7 @@ describe('PortfolioCalculator', () => {
spy.mockRestore();
expect(currentPositions).toEqual({
expect(portfolioSnapshot).toEqual({
currentValueInBaseCurrency: new Big('13298.425356'),
errors: [],
grossPerformance: new Big('27172.74'),
@ -175,8 +175,12 @@ describe('PortfolioCalculator', () => {
valueInBaseCurrency: new Big('13298.425356')
}
],
totalFeesWithCurrencyEffect: new Big('0'),
totalInterestWithCurrencyEffect: new Big('0'),
totalInvestment: new Big('320.43'),
totalInvestmentWithCurrencyEffect: new Big('318.542667299999967957')
totalInvestmentWithCurrencyEffect: new Big('318.542667299999967957'),
totalLiabilitiesWithCurrencyEffect: new Big('0'),
totalValuablesWithCurrencyEffect: new Big('0')
});
expect(investments).toEqual([

View File

@ -0,0 +1,134 @@
import { Activity } from '@ghostfolio/api/app/order/interfaces/activities.interface';
import {
activityDummyData,
symbolProfileDummyData
} from '@ghostfolio/api/app/portfolio/calculator/portfolio-calculator-test-utils';
import {
PortfolioCalculatorFactory,
PerformanceCalculationType
} 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 { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.service';
import { parseDate } from '@ghostfolio/common/helper';
import { Big } from 'big.js';
jest.mock('@ghostfolio/api/app/portfolio/current-rate.service', () => {
return {
// eslint-disable-next-line @typescript-eslint/naming-convention
CurrentRateService: jest.fn().mockImplementation(() => {
return CurrentRateServiceMock;
})
};
});
describe('PortfolioCalculator', () => {
let currentRateService: CurrentRateService;
let exchangeRateDataService: ExchangeRateDataService;
let factory: PortfolioCalculatorFactory;
beforeEach(() => {
currentRateService = new CurrentRateService(null, null, null, null);
exchangeRateDataService = new ExchangeRateDataService(
null,
null,
null,
null
);
factory = new PortfolioCalculatorFactory(
currentRateService,
exchangeRateDataService
);
});
describe('compute portfolio snapshot', () => {
it.only('with fee activity', async () => {
const spy = jest
.spyOn(Date, 'now')
.mockImplementation(() => parseDate('2021-12-18').getTime());
const activities: Activity[] = [
{
...activityDummyData,
date: new Date('2021-09-01'),
fee: 49,
quantity: 0,
SymbolProfile: {
...symbolProfileDummyData,
currency: 'USD',
dataSource: 'MANUAL',
name: 'Account Opening Fee',
symbol: '2c463fb3-af07-486e-adb0-8301b3d72141'
},
type: 'FEE',
unitPrice: 0
}
];
const portfolioCalculator = factory.createCalculator({
activities,
calculationType: PerformanceCalculationType.TWR,
currency: 'USD'
});
const portfolioSnapshot = await portfolioCalculator.computeSnapshot(
parseDate('2021-11-30')
);
spy.mockRestore();
expect(portfolioSnapshot).toEqual({
currentValueInBaseCurrency: new Big('0'),
errors: [],
grossPerformance: new Big('0'),
grossPerformancePercentage: new Big('0'),
grossPerformancePercentageWithCurrencyEffect: new Big('0'),
grossPerformanceWithCurrencyEffect: new Big('0'),
hasErrors: true,
netPerformance: new Big('0'),
netPerformancePercentage: new Big('0'),
netPerformancePercentageWithCurrencyEffect: new Big('0'),
netPerformanceWithCurrencyEffect: new Big('0'),
positions: [
{
averagePrice: new Big('0'),
currency: 'USD',
dataSource: 'MANUAL',
dividend: new Big('0'),
dividendInBaseCurrency: new Big('0'),
fee: new Big('49'),
firstBuyDate: '2021-09-01',
grossPerformance: null,
grossPerformancePercentage: null,
grossPerformancePercentageWithCurrencyEffect: null,
grossPerformanceWithCurrencyEffect: null,
investment: new Big('0'),
investmentWithCurrencyEffect: new Big('0'),
marketPrice: null,
marketPriceInBaseCurrency: 0,
netPerformance: null,
netPerformancePercentage: null,
netPerformancePercentageWithCurrencyEffect: null,
netPerformanceWithCurrencyEffect: null,
quantity: new Big('0'),
symbol: '2c463fb3-af07-486e-adb0-8301b3d72141',
tags: [],
timeWeightedInvestment: new Big('0'),
timeWeightedInvestmentWithCurrencyEffect: new Big('0'),
transactionCount: 1,
valueInBaseCurrency: new Big('0')
}
],
totalFeesWithCurrencyEffect: new Big('49'),
totalInterestWithCurrencyEffect: new Big('0'),
totalInvestment: new Big('0'),
totalInvestmentWithCurrencyEffect: new Big('0'),
totalLiabilitiesWithCurrencyEffect: new Big('0'),
totalValuablesWithCurrencyEffect: new Big('0')
});
});
});
});

View File

@ -59,6 +59,10 @@ describe('PortfolioCalculator', () => {
describe('get current positions', () => {
it.only('with GOOGL buy', async () => {
const spy = jest
.spyOn(Date, 'now')
.mockImplementation(() => parseDate('2023-07-10').getTime());
const activities: Activity[] = [
{
...activityDummyData,
@ -83,15 +87,11 @@ describe('PortfolioCalculator', () => {
currency: 'CHF'
});
const spy = jest
.spyOn(Date, 'now')
.mockImplementation(() => parseDate('2023-07-10').getTime());
const chartData = await portfolioCalculator.getChartData({
start: parseDate('2023-01-03')
});
const currentPositions = await portfolioCalculator.getCurrentPositions(
const portfolioSnapshot = await portfolioCalculator.computeSnapshot(
parseDate('2023-01-03')
);
@ -104,7 +104,7 @@ describe('PortfolioCalculator', () => {
spy.mockRestore();
expect(currentPositions).toEqual({
expect(portfolioSnapshot).toEqual({
currentValueInBaseCurrency: new Big('103.10483'),
errors: [],
grossPerformance: new Big('27.33'),
@ -154,8 +154,12 @@ describe('PortfolioCalculator', () => {
valueInBaseCurrency: new Big('103.10483')
}
],
totalFeesWithCurrencyEffect: new Big('1'),
totalInterestWithCurrencyEffect: new Big('0'),
totalInvestment: new Big('89.12'),
totalInvestmentWithCurrencyEffect: new Big('82.329056')
totalInvestmentWithCurrencyEffect: new Big('82.329056'),
totalLiabilitiesWithCurrencyEffect: new Big('0'),
totalValuablesWithCurrencyEffect: new Big('0')
});
expect(investments).toEqual([

View File

@ -0,0 +1,134 @@
import { Activity } from '@ghostfolio/api/app/order/interfaces/activities.interface';
import {
activityDummyData,
symbolProfileDummyData
} from '@ghostfolio/api/app/portfolio/calculator/portfolio-calculator-test-utils';
import {
PortfolioCalculatorFactory,
PerformanceCalculationType
} 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 { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.service';
import { parseDate } from '@ghostfolio/common/helper';
import { Big } from 'big.js';
jest.mock('@ghostfolio/api/app/portfolio/current-rate.service', () => {
return {
// eslint-disable-next-line @typescript-eslint/naming-convention
CurrentRateService: jest.fn().mockImplementation(() => {
return CurrentRateServiceMock;
})
};
});
describe('PortfolioCalculator', () => {
let currentRateService: CurrentRateService;
let exchangeRateDataService: ExchangeRateDataService;
let factory: PortfolioCalculatorFactory;
beforeEach(() => {
currentRateService = new CurrentRateService(null, null, null, null);
exchangeRateDataService = new ExchangeRateDataService(
null,
null,
null,
null
);
factory = new PortfolioCalculatorFactory(
currentRateService,
exchangeRateDataService
);
});
describe('compute portfolio snapshot', () => {
it.only('with item activity', async () => {
const spy = jest
.spyOn(Date, 'now')
.mockImplementation(() => parseDate('2022-01-31').getTime());
const activities: Activity[] = [
{
...activityDummyData,
date: new Date('2022-01-01'),
fee: 0,
quantity: 1,
SymbolProfile: {
...symbolProfileDummyData,
currency: 'USD',
dataSource: 'MANUAL',
name: 'Penthouse Apartment',
symbol: 'dac95060-d4f2-4653-a253-2c45e6fb5cde'
},
type: 'ITEM',
unitPrice: 500000
}
];
const portfolioCalculator = factory.createCalculator({
activities,
calculationType: PerformanceCalculationType.TWR,
currency: 'USD'
});
const portfolioSnapshot = await portfolioCalculator.computeSnapshot(
parseDate('2022-01-01')
);
spy.mockRestore();
expect(portfolioSnapshot).toEqual({
currentValueInBaseCurrency: new Big('0'),
errors: [],
grossPerformance: new Big('0'),
grossPerformancePercentage: new Big('0'),
grossPerformancePercentageWithCurrencyEffect: new Big('0'),
grossPerformanceWithCurrencyEffect: new Big('0'),
hasErrors: true,
netPerformance: new Big('0'),
netPerformancePercentage: new Big('0'),
netPerformancePercentageWithCurrencyEffect: new Big('0'),
netPerformanceWithCurrencyEffect: new Big('0'),
positions: [
{
averagePrice: new Big('500000'),
currency: 'USD',
dataSource: 'MANUAL',
dividend: new Big('0'),
dividendInBaseCurrency: new Big('0'),
fee: new Big('0'),
firstBuyDate: '2022-01-01',
grossPerformance: null,
grossPerformancePercentage: null,
grossPerformancePercentageWithCurrencyEffect: null,
grossPerformanceWithCurrencyEffect: null,
investment: new Big('0'),
investmentWithCurrencyEffect: new Big('0'),
marketPrice: null,
marketPriceInBaseCurrency: 500000,
netPerformance: null,
netPerformancePercentage: null,
netPerformancePercentageWithCurrencyEffect: null,
netPerformanceWithCurrencyEffect: null,
quantity: new Big('0'),
symbol: 'dac95060-d4f2-4653-a253-2c45e6fb5cde',
tags: [],
timeWeightedInvestment: new Big('0'),
timeWeightedInvestmentWithCurrencyEffect: new Big('0'),
transactionCount: 1,
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')
});
});
});
});

View File

@ -0,0 +1,134 @@
import { Activity } from '@ghostfolio/api/app/order/interfaces/activities.interface';
import {
activityDummyData,
symbolProfileDummyData
} from '@ghostfolio/api/app/portfolio/calculator/portfolio-calculator-test-utils';
import {
PortfolioCalculatorFactory,
PerformanceCalculationType
} 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 { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.service';
import { parseDate } from '@ghostfolio/common/helper';
import { Big } from 'big.js';
jest.mock('@ghostfolio/api/app/portfolio/current-rate.service', () => {
return {
// eslint-disable-next-line @typescript-eslint/naming-convention
CurrentRateService: jest.fn().mockImplementation(() => {
return CurrentRateServiceMock;
})
};
});
describe('PortfolioCalculator', () => {
let currentRateService: CurrentRateService;
let exchangeRateDataService: ExchangeRateDataService;
let factory: PortfolioCalculatorFactory;
beforeEach(() => {
currentRateService = new CurrentRateService(null, null, null, null);
exchangeRateDataService = new ExchangeRateDataService(
null,
null,
null,
null
);
factory = new PortfolioCalculatorFactory(
currentRateService,
exchangeRateDataService
);
});
describe('compute portfolio snapshot', () => {
it.only('with liability activity', async () => {
const spy = jest
.spyOn(Date, 'now')
.mockImplementation(() => parseDate('2022-01-31').getTime());
const activities: Activity[] = [
{
...activityDummyData,
date: new Date('2022-01-01'),
fee: 0,
quantity: 1,
SymbolProfile: {
...symbolProfileDummyData,
currency: 'USD',
dataSource: 'MANUAL',
name: 'Loan',
symbol: '55196015-1365-4560-aa60-8751ae6d18f8'
},
type: 'LIABILITY',
unitPrice: 3000
}
];
const portfolioCalculator = factory.createCalculator({
activities,
calculationType: PerformanceCalculationType.TWR,
currency: 'USD'
});
const portfolioSnapshot = await portfolioCalculator.computeSnapshot(
parseDate('2022-01-01')
);
spy.mockRestore();
expect(portfolioSnapshot).toEqual({
currentValueInBaseCurrency: new Big('0'),
errors: [],
grossPerformance: new Big('0'),
grossPerformancePercentage: new Big('0'),
grossPerformancePercentageWithCurrencyEffect: new Big('0'),
grossPerformanceWithCurrencyEffect: new Big('0'),
hasErrors: true,
netPerformance: new Big('0'),
netPerformancePercentage: new Big('0'),
netPerformancePercentageWithCurrencyEffect: new Big('0'),
netPerformanceWithCurrencyEffect: new Big('0'),
positions: [
{
averagePrice: new Big('3000'),
currency: 'USD',
dataSource: 'MANUAL',
dividend: new Big('0'),
dividendInBaseCurrency: new Big('0'),
fee: new Big('0'),
firstBuyDate: '2022-01-01',
grossPerformance: null,
grossPerformancePercentage: null,
grossPerformancePercentageWithCurrencyEffect: null,
grossPerformanceWithCurrencyEffect: null,
investment: new Big('0'),
investmentWithCurrencyEffect: new Big('0'),
marketPrice: null,
marketPriceInBaseCurrency: 3000,
netPerformance: null,
netPerformancePercentage: null,
netPerformancePercentageWithCurrencyEffect: null,
netPerformanceWithCurrencyEffect: null,
quantity: new Big('0'),
symbol: '55196015-1365-4560-aa60-8751ae6d18f8',
tags: [],
timeWeightedInvestment: new Big('0'),
timeWeightedInvestmentWithCurrencyEffect: new Big('0'),
transactionCount: 1,
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')
});
});
});
});

View File

@ -59,6 +59,10 @@ describe('PortfolioCalculator', () => {
describe('get current positions', () => {
it.only('with MSFT buy', async () => {
const spy = jest
.spyOn(Date, 'now')
.mockImplementation(() => parseDate('2023-07-10').getTime());
const activities: Activity[] = [
{
...activityDummyData,
@ -98,17 +102,13 @@ describe('PortfolioCalculator', () => {
currency: 'USD'
});
const spy = jest
.spyOn(Date, 'now')
.mockImplementation(() => parseDate('2023-07-10').getTime());
const currentPositions = await portfolioCalculator.getCurrentPositions(
const portfolioSnapshot = await portfolioCalculator.computeSnapshot(
parseDate('2023-07-10')
);
spy.mockRestore();
expect(currentPositions).toMatchObject({
expect(portfolioSnapshot).toMatchObject({
errors: [],
hasErrors: false,
positions: [
@ -130,8 +130,12 @@ describe('PortfolioCalculator', () => {
transactionCount: 2
}
],
totalFeesWithCurrencyEffect: new Big('19'),
totalInterestWithCurrencyEffect: new Big('0'),
totalInvestment: new Big('298.58'),
totalInvestmentWithCurrencyEffect: new Big('298.58')
totalInvestmentWithCurrencyEffect: new Big('298.58'),
totalLiabilitiesWithCurrencyEffect: new Big('0'),
totalValuablesWithCurrencyEffect: new Big('0')
});
});
});

View File

@ -42,22 +42,22 @@ describe('PortfolioCalculator', () => {
describe('get current positions', () => {
it('with no orders', async () => {
const spy = jest
.spyOn(Date, 'now')
.mockImplementation(() => parseDate('2021-12-18').getTime());
const portfolioCalculator = factory.createCalculator({
activities: [],
calculationType: PerformanceCalculationType.TWR,
currency: 'CHF'
});
const spy = jest
.spyOn(Date, 'now')
.mockImplementation(() => parseDate('2021-12-18').getTime());
const start = subDays(new Date(Date.now()), 10);
const chartData = await portfolioCalculator.getChartData({ start });
const currentPositions =
await portfolioCalculator.getCurrentPositions(start);
const portfolioSnapshot =
await portfolioCalculator.computeSnapshot(start);
const investments = portfolioCalculator.getInvestments();
@ -68,7 +68,7 @@ describe('PortfolioCalculator', () => {
spy.mockRestore();
expect(currentPositions).toEqual({
expect(portfolioSnapshot).toEqual({
currentValueInBaseCurrency: new Big(0),
grossPerformance: new Big(0),
grossPerformancePercentage: new Big(0),
@ -80,8 +80,12 @@ describe('PortfolioCalculator', () => {
netPerformancePercentageWithCurrencyEffect: new Big(0),
netPerformanceWithCurrencyEffect: new Big(0),
positions: [],
totalFeesWithCurrencyEffect: new Big('0'),
totalInterestWithCurrencyEffect: new Big('0'),
totalInvestment: new Big(0),
totalInvestmentWithCurrencyEffect: new Big(0)
totalInvestmentWithCurrencyEffect: new Big(0),
totalLiabilitiesWithCurrencyEffect: new Big('0'),
totalValuablesWithCurrencyEffect: new Big('0')
});
expect(investments).toEqual([]);

View File

@ -46,6 +46,10 @@ describe('PortfolioCalculator', () => {
describe('get current positions', () => {
it.only('with NOVN.SW buy and sell partially', async () => {
const spy = jest
.spyOn(Date, 'now')
.mockImplementation(() => parseDate('2022-04-11').getTime());
const activities: Activity[] = [
{
...activityDummyData,
@ -84,15 +88,12 @@ describe('PortfolioCalculator', () => {
calculationType: PerformanceCalculationType.TWR,
currency: 'CHF'
});
const spy = jest
.spyOn(Date, 'now')
.mockImplementation(() => parseDate('2022-04-11').getTime());
const chartData = await portfolioCalculator.getChartData({
start: parseDate('2022-03-07')
});
const currentPositions = await portfolioCalculator.getCurrentPositions(
const portfolioSnapshot = await portfolioCalculator.computeSnapshot(
parseDate('2022-03-07')
);
@ -105,7 +106,7 @@ describe('PortfolioCalculator', () => {
spy.mockRestore();
expect(currentPositions).toEqual({
expect(portfolioSnapshot).toEqual({
currentValueInBaseCurrency: new Big('87.8'),
errors: [],
grossPerformance: new Big('21.93'),
@ -157,8 +158,12 @@ describe('PortfolioCalculator', () => {
valueInBaseCurrency: new Big('87.8')
}
],
totalFeesWithCurrencyEffect: new Big('4.25'),
totalInterestWithCurrencyEffect: new Big('0'),
totalInvestment: new Big('75.80'),
totalInvestmentWithCurrencyEffect: new Big('75.80')
totalInvestmentWithCurrencyEffect: new Big('75.80'),
totalLiabilitiesWithCurrencyEffect: new Big('0'),
totalValuablesWithCurrencyEffect: new Big('0')
});
expect(investments).toEqual([

View File

@ -46,6 +46,10 @@ describe('PortfolioCalculator', () => {
describe('get current positions', () => {
it.only('with NOVN.SW buy and sell', async () => {
const spy = jest
.spyOn(Date, 'now')
.mockImplementation(() => parseDate('2022-04-11').getTime());
const activities: Activity[] = [
{
...activityDummyData,
@ -85,15 +89,11 @@ describe('PortfolioCalculator', () => {
currency: 'CHF'
});
const spy = jest
.spyOn(Date, 'now')
.mockImplementation(() => parseDate('2022-04-11').getTime());
const chartData = await portfolioCalculator.getChartData({
start: parseDate('2022-03-07')
});
const currentPositions = await portfolioCalculator.getCurrentPositions(
const portfolioSnapshot = await portfolioCalculator.computeSnapshot(
parseDate('2022-03-07')
);
@ -132,7 +132,7 @@ describe('PortfolioCalculator', () => {
valueWithCurrencyEffect: 0
});
expect(currentPositions).toEqual({
expect(portfolioSnapshot).toEqual({
currentValueInBaseCurrency: new Big('0'),
errors: [],
grossPerformance: new Big('19.86'),
@ -182,8 +182,12 @@ describe('PortfolioCalculator', () => {
valueInBaseCurrency: new Big('0')
}
],
totalFeesWithCurrencyEffect: new Big('0'),
totalInterestWithCurrencyEffect: new Big('0'),
totalInvestment: new Big('0'),
totalInvestmentWithCurrencyEffect: new Big('0')
totalInvestmentWithCurrencyEffect: new Big('0'),
totalLiabilitiesWithCurrencyEffect: new Big('0'),
totalValuablesWithCurrencyEffect: new Big('0')
});
expect(investments).toEqual([

View File

@ -1,6 +1,6 @@
import { PortfolioCalculator } from '@ghostfolio/api/app/portfolio/calculator/portfolio-calculator';
import { CurrentPositions } from '@ghostfolio/api/app/portfolio/interfaces/current-positions.interface';
import { PortfolioOrderItem } from '@ghostfolio/api/app/portfolio/interfaces/portfolio-order-item.interface';
import { PortfolioSnapshot } from '@ghostfolio/api/app/portfolio/interfaces/portfolio-snapshot.interface';
import { getFactor } from '@ghostfolio/api/helper/portfolio.helper';
import { DATE_FORMAT } from '@ghostfolio/common/helper';
import {
@ -23,19 +23,27 @@ import { cloneDeep, first, last, sortBy } from 'lodash';
export class TWRPortfolioCalculator extends PortfolioCalculator {
protected calculateOverallPerformance(
positions: TimelinePosition[]
): CurrentPositions {
): PortfolioSnapshot {
let currentValueInBaseCurrency = new Big(0);
let grossPerformance = new Big(0);
let grossPerformanceWithCurrencyEffect = new Big(0);
let hasErrors = false;
let netPerformance = new Big(0);
let netPerformanceWithCurrencyEffect = new Big(0);
let totalFeesWithCurrencyEffect = new Big(0);
let totalInterestWithCurrencyEffect = new Big(0);
let totalInvestment = new Big(0);
let totalInvestmentWithCurrencyEffect = new Big(0);
let totalTimeWeightedInvestment = new Big(0);
let totalTimeWeightedInvestmentWithCurrencyEffect = new Big(0);
for (const currentPosition of positions) {
if (currentPosition.fee) {
totalFeesWithCurrencyEffect = totalFeesWithCurrencyEffect.plus(
currentPosition.fee
);
}
if (currentPosition.valueInBaseCurrency) {
currentValueInBaseCurrency = currentValueInBaseCurrency.plus(
currentPosition.valueInBaseCurrency
@ -101,6 +109,9 @@ export class TWRPortfolioCalculator extends PortfolioCalculator {
hasErrors,
netPerformance,
netPerformanceWithCurrencyEffect,
positions,
totalFeesWithCurrencyEffect,
totalInterestWithCurrencyEffect,
totalInvestment,
totalInvestmentWithCurrencyEffect,
netPerformancePercentage: totalTimeWeightedInvestment.eq(0)
@ -121,7 +132,8 @@ export class TWRPortfolioCalculator extends PortfolioCalculator {
: grossPerformanceWithCurrencyEffect.div(
totalTimeWeightedInvestmentWithCurrencyEffect
),
positions
totalLiabilitiesWithCurrencyEffect: new Big(0),
totalValuablesWithCurrencyEffect: new Big(0)
};
}
@ -178,12 +190,18 @@ export class TWRPortfolioCalculator extends PortfolioCalculator {
let totalDividend = new Big(0);
let totalDividendInBaseCurrency = new Big(0);
let totalInterest = new Big(0);
let totalInterestInBaseCurrency = new Big(0);
let totalInvestment = new Big(0);
let totalInvestmentFromBuyTransactions = new Big(0);
let totalInvestmentFromBuyTransactionsWithCurrencyEffect = new Big(0);
let totalInvestmentWithCurrencyEffect = new Big(0);
let totalLiabilities = new Big(0);
let totalLiabilitiesInBaseCurrency = new Big(0);
let totalQuantityFromBuyTransactions = new Big(0);
let totalUnits = new Big(0);
let totalValuables = new Big(0);
let totalValuablesInBaseCurrency = new Big(0);
let valueAtStartDate: Big;
let valueAtStartDateWithCurrencyEffect: Big;
@ -198,6 +216,7 @@ export class TWRPortfolioCalculator extends PortfolioCalculator {
return {
currentValues: {},
currentValuesWithCurrencyEffect: {},
feesWithCurrencyEffect: new Big(0),
grossPerformance: new Big(0),
grossPerformancePercentage: new Big(0),
grossPerformancePercentageWithCurrencyEffect: new Big(0),
@ -220,8 +239,14 @@ export class TWRPortfolioCalculator extends PortfolioCalculator {
timeWeightedInvestmentWithCurrencyEffect: new Big(0),
totalDividend: new Big(0),
totalDividendInBaseCurrency: new Big(0),
totalInterest: new Big(0),
totalInterestInBaseCurrency: new Big(0),
totalInvestment: new Big(0),
totalInvestmentWithCurrencyEffect: new Big(0)
totalInvestmentWithCurrencyEffect: new Big(0),
totalLiabilities: new Big(0),
totalLiabilitiesInBaseCurrency: new Big(0),
totalValuables: new Big(0),
totalValuablesInBaseCurrency: new Big(0)
};
}
@ -240,6 +265,7 @@ export class TWRPortfolioCalculator extends PortfolioCalculator {
return {
currentValues: {},
currentValuesWithCurrencyEffect: {},
feesWithCurrencyEffect: new Big(0),
grossPerformance: new Big(0),
grossPerformancePercentage: new Big(0),
grossPerformancePercentageWithCurrencyEffect: new Big(0),
@ -262,8 +288,14 @@ export class TWRPortfolioCalculator extends PortfolioCalculator {
timeWeightedInvestmentWithCurrencyEffect: new Big(0),
totalDividend: new Big(0),
totalDividendInBaseCurrency: new Big(0),
totalInterest: new Big(0),
totalInterestInBaseCurrency: new Big(0),
totalInvestment: new Big(0),
totalInvestmentWithCurrencyEffect: new Big(0)
totalInvestmentWithCurrencyEffect: new Big(0),
totalLiabilities: new Big(0),
totalLiabilitiesInBaseCurrency: new Big(0),
totalValuables: new Big(0),
totalValuablesInBaseCurrency: new Big(0)
};
}
@ -302,8 +334,10 @@ export class TWRPortfolioCalculator extends PortfolioCalculator {
if (isChartMode) {
const datesWithOrders = {};
for (const order of orders) {
datesWithOrders[order.date] = true;
for (const { date, type } of orders) {
if (['BUY', 'SELL'].includes(type)) {
datesWithOrders[date] = true;
}
}
while (isBefore(day, end)) {
@ -364,11 +398,46 @@ export class TWRPortfolioCalculator extends PortfolioCalculator {
if (PortfolioCalculator.ENABLE_LOGGING) {
console.log();
console.log();
console.log(i + 1, order.type, order.itemType);
console.log(
i + 1,
order.date,
order.type,
order.itemType ? `(${order.itemType})` : ''
);
}
const exchangeRateAtOrderDate = exchangeRates[order.date];
if (order.type === 'DIVIDEND') {
const dividend = order.quantity.mul(order.unitPrice);
totalDividend = totalDividend.plus(dividend);
totalDividendInBaseCurrency = totalDividendInBaseCurrency.plus(
dividend.mul(exchangeRateAtOrderDate ?? 1)
);
} else if (order.type === 'INTEREST') {
const interest = order.quantity.mul(order.unitPrice);
totalInterest = totalInterest.plus(interest);
totalInterestInBaseCurrency = totalInterestInBaseCurrency.plus(
interest.mul(exchangeRateAtOrderDate ?? 1)
);
} else if (order.type === 'ITEM') {
const valuables = order.quantity.mul(order.unitPrice);
totalValuables = totalValuables.plus(valuables);
totalValuablesInBaseCurrency = totalValuablesInBaseCurrency.plus(
valuables.mul(exchangeRateAtOrderDate ?? 1)
);
} else if (order.type === 'LIABILITY') {
const liabilities = order.quantity.mul(order.unitPrice);
totalLiabilities = totalLiabilities.plus(liabilities);
totalLiabilitiesInBaseCurrency = totalLiabilitiesInBaseCurrency.plus(
liabilities.mul(exchangeRateAtOrderDate ?? 1)
);
}
if (order.itemType === 'start') {
// Take the unit price of the order as the market price if there are no
// orders of this symbol before the start date
@ -451,13 +520,6 @@ export class TWRPortfolioCalculator extends PortfolioCalculator {
}
if (PortfolioCalculator.ENABLE_LOGGING) {
console.log('totalInvestment', totalInvestment.toNumber());
console.log(
'totalInvestmentWithCurrencyEffect',
totalInvestmentWithCurrencyEffect.toNumber()
);
console.log('order.quantity', order.quantity.toNumber());
console.log('transactionInvestment', transactionInvestment.toNumber());
@ -504,15 +566,6 @@ export class TWRPortfolioCalculator extends PortfolioCalculator {
totalUnits = totalUnits.plus(order.quantity.mul(getFactor(order.type)));
if (order.type === 'DIVIDEND') {
const dividend = order.quantity.mul(order.unitPrice);
totalDividend = totalDividend.plus(dividend);
totalDividendInBaseCurrency = totalDividendInBaseCurrency.plus(
dividend.mul(exchangeRateAtOrderDate ?? 1)
);
}
const valueOfInvestment = totalUnits.mul(order.unitPriceInBaseCurrency);
const valueOfInvestmentWithCurrencyEffect = totalUnits.mul(
@ -808,6 +861,7 @@ export class TWRPortfolioCalculator extends PortfolioCalculator {
return {
currentValues,
currentValuesWithCurrencyEffect,
feesWithCurrencyEffect,
grossPerformancePercentage,
grossPerformancePercentageWithCurrencyEffect,
initialValue,
@ -823,8 +877,14 @@ export class TWRPortfolioCalculator extends PortfolioCalculator {
timeWeightedInvestmentValuesWithCurrencyEffect,
totalDividend,
totalDividendInBaseCurrency,
totalInterest,
totalInterestInBaseCurrency,
totalInvestment,
totalInvestmentWithCurrencyEffect,
totalLiabilities,
totalLiabilitiesInBaseCurrency,
totalValuables,
totalValuablesInBaseCurrency,
grossPerformance: totalGrossPerformance,
grossPerformanceWithCurrencyEffect:
totalGrossPerformanceWithCurrencyEffect,

View File

@ -2,7 +2,7 @@ import { ResponseError, TimelinePosition } from '@ghostfolio/common/interfaces';
import { Big } from 'big.js';
export interface CurrentPositions extends ResponseError {
export interface PortfolioSnapshot extends ResponseError {
currentValueInBaseCurrency: Big;
grossPerformance: Big;
grossPerformanceWithCurrencyEffect: Big;
@ -15,6 +15,10 @@ export interface CurrentPositions extends ResponseError {
netPerformancePercentage: Big;
netPerformancePercentageWithCurrencyEffect: Big;
positions: TimelinePosition[];
totalFeesWithCurrencyEffect: Big;
totalInterestWithCurrencyEffect: Big;
totalInvestment: Big;
totalInvestmentWithCurrencyEffect: Big;
totalLiabilitiesWithCurrencyEffect: Big;
totalValuablesWithCurrencyEffect: Big;
}

View File

@ -1,6 +1,12 @@
import { Big } from 'big.js';
import { TransactionPointSymbol } from './transaction-point-symbol.interface';
export interface TransactionPoint {
date: string;
fees: Big;
interest: Big;
items: TransactionPointSymbol[];
liabilities: Big;
valuables: Big;
}

View File

@ -78,10 +78,8 @@ export class PortfolioController {
@Query('assetClasses') filterByAssetClasses?: string,
@Query('range') dateRange: DateRange = 'max',
@Query('tags') filterByTags?: string,
@Query('withLiabilities') withLiabilitiesParam = 'false',
@Query('withMarkets') withMarketsParam = 'false'
): Promise<PortfolioDetails & { hasError: boolean }> {
const withLiabilities = withLiabilitiesParam === 'true';
const withMarkets = withMarketsParam === 'true';
let hasDetails = true;
@ -107,7 +105,6 @@ export class PortfolioController {
dateRange,
filters,
impersonationId,
withLiabilities,
withMarkets,
userId: this.request.user.id,
withSummary: true
@ -293,6 +290,7 @@ export class PortfolioController {
@Query('assetClasses') filterByAssetClasses?: string,
@Query('holdingType') filterByHoldingType?: string,
@Query('query') filterBySearchQuery?: string,
@Query('range') dateRange: DateRange = 'max',
@Query('tags') filterByTags?: string
): Promise<PortfolioHoldingsResponse> {
const filters = this.apiService.buildFiltersFromQueryParams({
@ -304,6 +302,7 @@ export class PortfolioController {
});
const { holdings } = await this.portfolioService.getDetails({
dateRange,
filters,
impersonationId,
userId: this.request.user.id
@ -389,11 +388,9 @@ export class PortfolioController {
@Query('assetClasses') filterByAssetClasses?: string,
@Query('range') dateRange: DateRange = 'max',
@Query('tags') filterByTags?: string,
@Query('withExcludedAccounts') withExcludedAccountsParam = 'false',
@Query('withItems') withItemsParam = 'false'
@Query('withExcludedAccounts') withExcludedAccountsParam = 'false'
): Promise<PortfolioPerformanceResponse> {
const withExcludedAccounts = withExcludedAccountsParam === 'true';
const withItems = withItemsParam === 'true';
const hasReadRestrictedAccessPermission =
this.userService.hasReadRestrictedAccessPermission({
@ -412,7 +409,6 @@ export class PortfolioController {
filters,
impersonationId,
withExcludedAccounts,
withItems,
userId: this.request.user.id
});

View File

@ -23,12 +23,7 @@ import {
EMERGENCY_FUND_TAG_ID,
UNKNOWN_KEY
} from '@ghostfolio/common/config';
import {
DATE_FORMAT,
getAllActivityTypes,
getSum,
parseDate
} from '@ghostfolio/common/helper';
import { DATE_FORMAT, getSum, parseDate } from '@ghostfolio/common/helper';
import {
Accounts,
EnhancedSymbolProfile,
@ -65,7 +60,6 @@ import {
Prisma
} from '@prisma/client';
import { Big } from 'big.js';
import { isUUID } from 'class-validator';
import {
differenceInDays,
format,
@ -78,6 +72,7 @@ import {
} from 'date-fns';
import { isEmpty, isNumber, last, uniq, uniqBy } from 'lodash';
import { PortfolioCalculator } from './calculator/portfolio-calculator';
import {
PerformanceCalculationType,
PortfolioCalculatorFactory
@ -328,7 +323,6 @@ export class PortfolioService {
impersonationId,
userId,
withExcludedAccounts = false,
withLiabilities = false,
withMarkets = false,
withSummary = false
}: {
@ -337,7 +331,6 @@ export class PortfolioService {
impersonationId: string;
userId: string;
withExcludedAccounts?: boolean;
withLiabilities?: boolean;
withMarkets?: boolean;
withSummary?: boolean;
}): Promise<PortfolioDetails & { hasErrors: boolean }> {
@ -349,19 +342,8 @@ export class PortfolioService {
(user.Settings?.settings as UserSettings)?.emergencyFund ?? 0
);
let types = getAllActivityTypes().filter((activityType) => {
return activityType !== 'FEE';
});
if (withLiabilities === false) {
types = types.filter((activityType) => {
return activityType !== 'LIABILITY';
});
}
const { activities } = await this.orderService.getOrders({
filters,
types,
userCurrency,
userId,
withExcludedAccounts
@ -369,16 +351,13 @@ export class PortfolioService {
const portfolioCalculator = this.calculatorFactory.createCalculator({
activities,
dateRange,
calculationType: PerformanceCalculationType.TWR,
currency: userCurrency
});
const { startDate } = getInterval(
dateRange,
portfolioCalculator.getStartDate()
);
const currentPositions =
await portfolioCalculator.getCurrentPositions(startDate);
const { currentValueInBaseCurrency, hasErrors, positions } =
await portfolioCalculator.getSnapshot();
const cashDetails = await this.accountService.getCashDetails({
filters,
@ -388,10 +367,9 @@ export class PortfolioService {
const holdings: PortfolioDetails['holdings'] = {};
const totalValueInBaseCurrency =
currentPositions.currentValueInBaseCurrency.plus(
cashDetails.balanceInBaseCurrency
);
const totalValueInBaseCurrency = currentValueInBaseCurrency.plus(
cashDetails.balanceInBaseCurrency
);
const isFilteredByAccount =
filters?.some(({ type }) => {
@ -409,7 +387,7 @@ export class PortfolioService {
let filteredValueInBaseCurrency = isFilteredByAccount
? totalValueInBaseCurrency
: currentPositions.currentValueInBaseCurrency;
: currentValueInBaseCurrency;
if (
filters?.length === 0 ||
@ -422,14 +400,12 @@ export class PortfolioService {
);
}
const dataGatheringItems = currentPositions.positions.map(
({ dataSource, symbol }) => {
return {
dataSource,
symbol
};
}
);
const dataGatheringItems = positions.map(({ dataSource, symbol }) => {
return {
dataSource,
symbol
};
});
const [dataProviderResponses, symbolProfiles] = await Promise.all([
this.dataProviderService.getQuotes({ user, items: dataGatheringItems }),
@ -442,7 +418,7 @@ export class PortfolioService {
}
const portfolioItemsNow: { [symbol: string]: TimelinePosition } = {};
for (const position of currentPositions.positions) {
for (const position of positions) {
portfolioItemsNow[position.symbol] = position;
}
@ -465,7 +441,7 @@ export class PortfolioService {
tags,
transactionCount,
valueInBaseCurrency
} of currentPositions.positions) {
} of positions) {
if (isFilteredByClosedHoldings === true) {
if (!quantity.eq(0)) {
// Ignore positions with a quantity
@ -593,6 +569,7 @@ export class PortfolioService {
filteredValueInBaseCurrency,
holdings,
impersonationId,
portfolioCalculator,
userCurrency,
userId,
balanceInBaseCurrency: cashDetails.balanceInBaseCurrency,
@ -605,10 +582,10 @@ export class PortfolioService {
return {
accounts,
hasErrors,
holdings,
platforms,
summary,
hasErrors: currentPositions.hasErrors
summary
};
}
@ -681,10 +658,9 @@ export class PortfolioService {
const portfolioStart = portfolioCalculator.getStartDate();
const transactionPoints = portfolioCalculator.getTransactionPoints();
const currentPositions =
await portfolioCalculator.getCurrentPositions(portfolioStart);
const { positions } = await portfolioCalculator.getSnapshot();
const position = currentPositions.positions.find(({ symbol }) => {
const position = positions.find(({ symbol }) => {
return symbol === aSymbol;
});
@ -846,11 +822,19 @@ export class PortfolioService {
);
if (isEmpty(historicalData)) {
historicalData = await this.dataProviderService.getHistoricalRaw(
[{ dataSource: DataSource.YAHOO, symbol: aSymbol }],
portfolioStart,
new Date()
);
try {
historicalData = await this.dataProviderService.getHistoricalRaw({
dataGatheringItems: [
{ dataSource: DataSource.YAHOO, symbol: aSymbol }
],
from: portfolioStart,
to: new Date()
});
} catch {
historicalData = {
[aSymbol]: {}
};
}
}
const historicalDataArray: HistoricalDataItem[] = [];
@ -916,13 +900,12 @@ export class PortfolioService {
const userId = await this.getUserId(impersonationId, this.request.user.id);
const user = await this.userService.user({ id: userId });
const { endDate, startDate } = getInterval(dateRange);
const { endDate } = getInterval(dateRange);
const { activities } = await this.orderService.getOrders({
endDate,
filters,
userId,
types: ['BUY', 'SELL'],
userCurrency: this.getUserCurrency()
});
@ -935,16 +918,14 @@ export class PortfolioService {
const portfolioCalculator = this.calculatorFactory.createCalculator({
activities,
dateRange,
calculationType: PerformanceCalculationType.TWR,
currency: this.request.user.Settings.settings.baseCurrency
});
const currentPositions = await portfolioCalculator.getCurrentPositions(
startDate,
endDate
);
let { hasErrors, positions } = await portfolioCalculator.getSnapshot();
let positions = currentPositions.positions.filter(({ quantity }) => {
positions = positions.filter(({ quantity }) => {
return !quantity.eq(0);
});
@ -983,7 +964,7 @@ export class PortfolioService {
}
return {
hasErrors: currentPositions.hasErrors,
hasErrors,
positions: positions.map(
({
averagePrice,
@ -1050,15 +1031,13 @@ export class PortfolioService {
filters,
impersonationId,
userId,
withExcludedAccounts = false,
withItems = false
withExcludedAccounts = false
}: {
dateRange?: DateRange;
filters?: Filter[];
impersonationId: string;
userId: string;
withExcludedAccounts?: boolean;
withItems?: boolean;
}): Promise<PortfolioPerformanceResponse> {
userId = await this.getUserId(impersonationId, userId);
const user = await this.userService.user({ id: userId });
@ -1096,8 +1075,7 @@ export class PortfolioService {
filters,
userCurrency,
userId,
withExcludedAccounts,
types: withItems ? ['BUY', 'ITEM', 'SELL'] : ['BUY', 'SELL']
withExcludedAccounts
});
if (accountBalanceItems?.length <= 0 && activities?.length <= 0) {
@ -1123,6 +1101,7 @@ export class PortfolioService {
const portfolioCalculator = this.calculatorFactory.createCalculator({
activities,
dateRange,
calculationType: PerformanceCalculationType.TWR,
currency: userCurrency
});
@ -1140,7 +1119,7 @@ export class PortfolioService {
netPerformancePercentageWithCurrencyEffect,
netPerformanceWithCurrencyEffect,
totalInvestment
} = await portfolioCalculator.getCurrentPositions(startDate, endDate);
} = await portfolioCalculator.getSnapshot();
let currentNetPerformance = netPerformance;
@ -1231,8 +1210,7 @@ export class PortfolioService {
const { activities } = await this.orderService.getOrders({
userCurrency,
userId,
types: ['BUY', 'SELL']
userId
});
const portfolioCalculator = this.calculatorFactory.createCalculator({
@ -1241,13 +1219,10 @@ export class PortfolioService {
currency: this.request.user.Settings.settings.baseCurrency
});
const currentPositions = await portfolioCalculator.getCurrentPositions(
portfolioCalculator.getStartDate()
);
let { totalFeesWithCurrencyEffect, positions, totalInvestment } =
await portfolioCalculator.getSnapshot();
const positions = currentPositions.positions.filter(
(item) => !item.quantity.eq(0)
);
positions = positions.filter((item) => !item.quantity.eq(0));
const portfolioItemsNow: { [symbol: string]: TimelinePosition } = {};
@ -1309,8 +1284,8 @@ export class PortfolioService {
[
new FeeRatioInitialInvestment(
this.exchangeRateDataService,
currentPositions.totalInvestment.toNumber(),
this.getFees({ activities, userCurrency }).toNumber()
totalInvestment.toNumber(),
totalFeesWithCurrencyEffect.toNumber()
)
],
userSettings
@ -1454,30 +1429,6 @@ export class PortfolioService {
return valueInBaseCurrencyOfEmergencyFundPositions.toNumber();
}
private getFees({
activities,
userCurrency
}: {
activities: Activity[];
userCurrency: string;
}) {
return getSum(
activities
.filter(({ isDraft }) => {
return isDraft === false;
})
.map(({ fee, SymbolProfile }) => {
return new Big(
this.exchangeRateDataService.toCurrency(
fee,
SymbolProfile.currency,
userCurrency
)
);
})
);
}
private getInitialCashPosition({
balance,
currency
@ -1623,6 +1574,7 @@ export class PortfolioService {
filteredValueInBaseCurrency,
holdings,
impersonationId,
portfolioCalculator,
userCurrency,
userId
}: {
@ -1631,6 +1583,7 @@ export class PortfolioService {
filteredValueInBaseCurrency: Big;
holdings: PortfolioDetails['holdings'];
impersonationId: string;
portfolioCalculator: PortfolioCalculator;
userCurrency: string;
userId: string;
}): Promise<PortfolioSummary> {
@ -1659,17 +1612,8 @@ export class PortfolioService {
}
}
const dividendInBaseCurrency = getSum(
(
await this.getDividends({
activities: activities.filter(({ type }) => {
return type === 'DIVIDEND';
})
})
).map(({ investment }) => {
return new Big(investment);
})
);
const dividendInBaseCurrency =
await portfolioCalculator.getDividendInBaseCurrency();
const emergencyFund = new Big(
Math.max(
@ -1678,42 +1622,16 @@ export class PortfolioService {
)
);
const fees = this.getFees({ activities, userCurrency }).toNumber();
const firstOrderDate = activities[0]?.date;
const fees = await portfolioCalculator.getFeesInBaseCurrency();
const interest = this.getSumOfActivityType({
activities,
userCurrency,
activityType: 'INTEREST'
}).toNumber();
const firstOrderDate = portfolioCalculator.getStartDate();
const items = getSum(
Object.keys(holdings)
.filter((symbol) => {
return (
isUUID(symbol) &&
holdings[symbol].dataSource === 'MANUAL' &&
holdings[symbol].valueInBaseCurrency > 0
);
})
.map((symbol) => {
return new Big(holdings[symbol].valueInBaseCurrency).abs();
})
).toNumber();
const interest = await portfolioCalculator.getInterestInBaseCurrency();
const liabilities = getSum(
Object.keys(holdings)
.filter((symbol) => {
return (
isUUID(symbol) &&
holdings[symbol].dataSource === 'MANUAL' &&
holdings[symbol].valueInBaseCurrency < 0
);
})
.map((symbol) => {
return new Big(holdings[symbol].valueInBaseCurrency).abs();
})
).toNumber();
const liabilities =
await portfolioCalculator.getLiabilitiesInBaseCurrency();
const valuables = await portfolioCalculator.getValuablesInBaseCurrency();
const totalBuy = this.getSumOfActivityType({
userCurrency,
@ -1763,7 +1681,7 @@ export class PortfolioService {
const netWorth = new Big(balanceInBaseCurrency)
.plus(performanceInformation.performance.currentValue)
.plus(items)
.plus(valuables)
.plus(excludedAccountsAndActivities)
.minus(liabilities)
.toNumber();
@ -1791,11 +1709,7 @@ export class PortfolioService {
annualizedPerformancePercentWithCurrencyEffect,
cash,
excludedAccountsAndActivities,
fees,
firstOrderDate,
interest,
items,
liabilities,
totalBuy,
totalSell,
committedFunds: committedFunds.toNumber(),
@ -1807,6 +1721,7 @@ export class PortfolioService {
.toNumber(),
total: emergencyFund.toNumber()
},
fees: fees.toNumber(),
filteredValueInBaseCurrency: filteredValueInBaseCurrency.toNumber(),
filteredValueInPercentage: netWorth
? filteredValueInBaseCurrency.div(netWorth).toNumber()
@ -1814,6 +1729,9 @@ export class PortfolioService {
fireWealth: new Big(performanceInformation.performance.currentValue)
.minus(emergencyFundPositionsValueInBaseCurrency)
.toNumber(),
interest: interest.toNumber(),
items: valuables.toNumber(),
liabilities: liabilities.toNumber(),
ordersCount: activities.filter(({ type }) => {
return type === 'BUY' || type === 'SELL';
}).length,

View File

@ -74,11 +74,21 @@ export class SymbolService {
date = new Date(),
symbol
}: IDataGatheringItem): Promise<IDataProviderHistoricalResponse> {
const historicalData = await this.dataProviderService.getHistoricalRaw(
[{ dataSource, symbol }],
date,
date
);
let historicalData: {
[symbol: string]: {
[date: string]: IDataProviderHistoricalResponse;
};
} = {
[symbol]: {}
};
try {
historicalData = await this.dataProviderService.getHistoricalRaw({
dataGatheringItems: [{ dataSource, symbol }],
from: date,
to: date
});
} catch {}
return {
marketPrice:

View File

@ -18,10 +18,8 @@ export function getFactor(activityType: ActivityType) {
switch (activityType) {
case 'BUY':
case 'ITEM':
factor = 1;
break;
case 'LIABILITY':
case 'SELL':
factor = -1;
break;
@ -37,36 +35,48 @@ export function getInterval(
aDateRange: DateRange,
portfolioStart = new Date(0)
) {
let endDate = endOfDay(new Date());
let endDate = endOfDay(new Date(Date.now()));
let startDate = portfolioStart;
switch (aDateRange) {
case '1d':
startDate = max([startDate, subDays(resetHours(new Date()), 1)]);
startDate = max([
startDate,
subDays(resetHours(new Date(Date.now())), 1)
]);
break;
case 'mtd':
startDate = max([
startDate,
subDays(startOfMonth(resetHours(new Date())), 1)
subDays(startOfMonth(resetHours(new Date(Date.now()))), 1)
]);
break;
case 'wtd':
startDate = max([
startDate,
subDays(startOfWeek(resetHours(new Date()), { weekStartsOn: 1 }), 1)
subDays(
startOfWeek(resetHours(new Date(Date.now())), { weekStartsOn: 1 }),
1
)
]);
break;
case 'ytd':
startDate = max([
startDate,
subDays(startOfYear(resetHours(new Date())), 1)
subDays(startOfYear(resetHours(new Date(Date.now()))), 1)
]);
break;
case '1y':
startDate = max([startDate, subYears(resetHours(new Date()), 1)]);
startDate = max([
startDate,
subYears(resetHours(new Date(Date.now())), 1)
]);
break;
case '5y':
startDate = max([startDate, subYears(resetHours(new Date()), 5)]);
startDate = max([
startDate,
subYears(resetHours(new Date(Date.now())), 5)
]);
break;
case 'max':
break;

View File

@ -57,6 +57,7 @@ export class RedactValuesInResponseInterceptor<T>
'quantity',
'symbolMapping',
'totalBalanceInBaseCurrency',
'totalValueInBaseCurrency',
'unitPrice',
'value',
'valueInBaseCurrency'

View File

@ -37,7 +37,17 @@ export class DataGatheringProcessor {
@Process({ concurrency: 1, name: GATHER_ASSET_PROFILE_PROCESS })
public async gatherAssetProfile(job: Job<UniqueAsset>) {
try {
Logger.log(
`Asset profile data gathering has been started for ${job.data.symbol} (${job.data.dataSource})`,
`DataGatheringProcessor (${GATHER_ASSET_PROFILE_PROCESS})`
);
await this.dataGatheringService.gatherAssetProfiles([job.data]);
Logger.log(
`Asset profile data gathering has been completed for ${job.data.symbol} (${job.data.dataSource})`,
`DataGatheringProcessor (${GATHER_ASSET_PROFILE_PROCESS})`
);
} catch (error) {
Logger.error(
error,
@ -62,11 +72,11 @@ export class DataGatheringProcessor {
`DataGatheringProcessor (${GATHER_HISTORICAL_MARKET_DATA_PROCESS})`
);
const historicalData = await this.dataProviderService.getHistoricalRaw(
[{ dataSource, symbol }],
currentDate,
new Date()
);
const historicalData = await this.dataProviderService.getHistoricalRaw({
dataGatheringItems: [{ dataSource, symbol }],
from: currentDate,
to: new Date()
});
const data: Prisma.MarketDataUpdateInput[] = [];
let lastMarketPrice: number;

View File

@ -104,11 +104,11 @@ export class DataGatheringService {
symbol: string;
}) {
try {
const historicalData = await this.dataProviderService.getHistoricalRaw(
[{ dataSource, symbol }],
date,
date
);
const historicalData = await this.dataProviderService.getHistoricalRaw({
dataGatheringItems: [{ dataSource, symbol }],
from: date,
to: date
});
const marketPrice =
historicalData[symbol][format(date, DATE_FORMAT)].marketPrice;
@ -230,17 +230,12 @@ export class DataGatheringService {
error,
'DataGatheringService'
);
if (uniqueAssets.length === 1) {
throw error;
}
}
}
Logger.log(
`Asset profile data gathering has been completed for ${uniqueAssets
.map(({ dataSource, symbol }) => {
return `${symbol} (${dataSource})`;
})
.join(',')}.`,
'DataGatheringService'
);
}
public async gatherSymbols({

View File

@ -233,15 +233,17 @@ export class DataProviderService {
}
}
public async getHistoricalRaw(
aDataGatheringItems: UniqueAsset[],
from: Date,
to: Date
): Promise<{
public async getHistoricalRaw({
dataGatheringItems,
from,
to
}: {
dataGatheringItems: UniqueAsset[];
from: Date;
to: Date;
}): Promise<{
[symbol: string]: { [date: string]: IDataProviderHistoricalResponse };
}> {
let dataGatheringItems = aDataGatheringItems;
for (const { currency, rootCurrency } of DERIVED_CURRENCIES) {
if (
this.hasCurrency({
@ -330,6 +332,8 @@ export class DataProviderService {
}
} catch (error) {
Logger.error(error, 'DataProviderService');
throw error;
}
return result;

View File

@ -449,13 +449,16 @@ export class ExchangeRateDataService {
factors[format(date, DATE_FORMAT)] = factor;
}
} catch {
Logger.error(
`No exchange rate has been found for ${currencyFrom}${currencyTo} at ${format(
date,
DATE_FORMAT
)}. Please complement market data for ${DEFAULT_CURRENCY}${currencyFrom} and ${DEFAULT_CURRENCY}${currencyTo}.`,
'ExchangeRateDataService'
);
let errorMessage = `No exchange rate has been found for ${currencyFrom}${currencyTo} at ${format(
date,
DATE_FORMAT
)}. Please complement market data for ${DEFAULT_CURRENCY}${currencyFrom}`;
if (DEFAULT_CURRENCY !== currencyTo) {
errorMessage = `${errorMessage} and ${DEFAULT_CURRENCY}${currencyTo}`;
}
Logger.error(`${errorMessage}.`, 'ExchangeRateDataService');
}
}
}

View File

@ -1,4 +1,4 @@
import { GfLogoModule } from '@ghostfolio/ui/logo';
import { GfLogoComponent } from '@ghostfolio/ui/logo';
import { Platform } from '@angular/cdk/platform';
import { HttpClientModule } from '@angular/common/http';
@ -43,7 +43,7 @@ export function NgxStripeFactory(): string {
BrowserAnimationsModule,
BrowserModule,
GfHeaderModule,
GfLogoModule,
GfLogoComponent,
GfSubscriptionInterstitialDialogModule,
HttpClientModule,
MarkdownModule.forRoot(),

View File

@ -140,15 +140,33 @@ export class AccountDetailDialog implements OnDestroy, OnInit {
this.dialogRef.close();
}
public onAddAccountBalance({
balance,
date
}: {
balance: number;
date: Date;
}) {
this.dataService
.postAccountBalance({
balance,
date,
accountId: this.data.accountId
})
.pipe(takeUntil(this.unsubscribeSubject))
.subscribe(() => {
this.fetchAccountBalances();
this.fetchPortfolioPerformance();
});
}
public onDeleteAccountBalance(aId: string) {
this.dataService
.deleteAccountBalance(aId)
.pipe(takeUntil(this.unsubscribeSubject))
.subscribe({
next: () => {
this.fetchAccountBalances();
this.fetchPortfolioPerformance();
}
.subscribe(() => {
this.fetchAccountBalances();
this.fetchPortfolioPerformance();
});
}

View File

@ -115,6 +115,7 @@
</ng-template>
<gf-account-balances
[accountBalances]="accountBalances"
[accountCurrency]="currency"
[accountId]="data.accountId"
[locale]="user?.settings?.locale"
[showActions]="
@ -122,6 +123,7 @@
hasPermissionToDeleteAccountBalance &&
!user.settings.isRestrictedView
"
(accountBalanceCreated)="onAddAccountBalance($event)"
(accountBalanceDeleted)="onDeleteAccountBalance($event)"
/>
</mat-tab>

View File

@ -1,10 +1,10 @@
import { GfDialogFooterModule } from '@ghostfolio/client/components/dialog-footer/dialog-footer.module';
import { GfDialogHeaderModule } from '@ghostfolio/client/components/dialog-header/dialog-header.module';
import { GfInvestmentChartModule } from '@ghostfolio/client/components/investment-chart/investment-chart.module';
import { GfAccountBalancesModule } from '@ghostfolio/ui/account-balances/account-balances.module';
import { GfActivitiesTableModule } from '@ghostfolio/ui/activities-table/activities-table.module';
import { GfHoldingsTableModule } from '@ghostfolio/ui/holdings-table/holdings-table.module';
import { GfValueModule } from '@ghostfolio/ui/value';
import { GfAccountBalancesComponent } from '@ghostfolio/ui/account-balances';
import { GfActivitiesTableComponent } from '@ghostfolio/ui/activities-table';
import { GfHoldingsTableComponent } from '@ghostfolio/ui/holdings-table';
import { GfValueComponent } from '@ghostfolio/ui/value';
import { CommonModule } from '@angular/common';
import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core';
@ -19,13 +19,13 @@ import { AccountDetailDialog } from './account-detail-dialog.component';
declarations: [AccountDetailDialog],
imports: [
CommonModule,
GfAccountBalancesModule,
GfActivitiesTableModule,
GfAccountBalancesComponent,
GfActivitiesTableComponent,
GfDialogFooterModule,
GfDialogHeaderModule,
GfHoldingsTableModule,
GfHoldingsTableComponent,
GfInvestmentChartModule,
GfValueModule,
GfValueComponent,
MatButtonModule,
MatDialogModule,
MatTabsModule,

View File

@ -1,5 +1,5 @@
import { GfAssetProfileIconComponent } from '@ghostfolio/client/components/asset-profile-icon/asset-profile-icon.component';
import { GfValueModule } from '@ghostfolio/ui/value';
import { GfValueComponent } from '@ghostfolio/ui/value';
import { CommonModule } from '@angular/common';
import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core';
@ -18,7 +18,7 @@ import { AccountsTableComponent } from './accounts-table.component';
imports: [
CommonModule,
GfAssetProfileIconComponent,
GfValueModule,
GfValueComponent,
MatButtonModule,
MatMenuModule,
MatSortModule,

View File

@ -1,4 +1,4 @@
import { GfLineChartModule } from '@ghostfolio/ui/line-chart/line-chart.module';
import { GfLineChartComponent } from '@ghostfolio/ui/line-chart';
import { CommonModule } from '@angular/common';
import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core';
@ -9,7 +9,7 @@ import { GfMarketDataDetailDialogModule } from './market-data-detail-dialog/mark
@NgModule({
declarations: [AdminMarketDataDetailComponent],
exports: [AdminMarketDataDetailComponent],
imports: [CommonModule, GfLineChartModule, GfMarketDataDetailDialogModule],
imports: [CommonModule, GfLineChartComponent, GfMarketDataDetailDialogModule],
schemas: [CUSTOM_ELEMENTS_SCHEMA]
})
export class GfAdminMarketDataDetailModule {}

View File

@ -1,5 +1,5 @@
import { GfSymbolModule } from '@ghostfolio/client/pipes/symbol/symbol.module';
import { GfActivitiesFilterModule } from '@ghostfolio/ui/activities-filter/activities-filter.module';
import { GfActivitiesFilterComponent } from '@ghostfolio/ui/activities-filter';
import { CommonModule } from '@angular/common';
import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core';
@ -20,7 +20,7 @@ import { GfCreateAssetProfileDialogModule } from './create-asset-profile-dialog/
declarations: [AdminMarketDataComponent],
imports: [
CommonModule,
GfActivitiesFilterModule,
GfActivitiesFilterComponent,
GfAssetProfileDialogModule,
GfCreateAssetProfileDialogModule,
GfSymbolModule,

View File

@ -1,9 +1,9 @@
import { GfAdminMarketDataDetailModule } from '@ghostfolio/client/components/admin-market-data-detail/admin-market-data-detail.module';
import { AdminMarketDataService } from '@ghostfolio/client/components/admin-market-data/admin-market-data.service';
import { GfAssetProfileIconComponent } from '@ghostfolio/client/components/asset-profile-icon/asset-profile-icon.component';
import { GfCurrencySelectorModule } from '@ghostfolio/ui/currency-selector/currency-selector.module';
import { GfPortfolioProportionChartModule } from '@ghostfolio/ui/portfolio-proportion-chart/portfolio-proportion-chart.module';
import { GfValueModule } from '@ghostfolio/ui/value';
import { GfCurrencySelectorComponent } from '@ghostfolio/ui/currency-selector';
import { GfPortfolioProportionChartComponent } from '@ghostfolio/ui/portfolio-proportion-chart';
import { GfValueComponent } from '@ghostfolio/ui/value';
import { TextFieldModule } from '@angular/cdk/text-field';
import { CommonModule } from '@angular/common';
@ -26,9 +26,9 @@ import { AssetProfileDialog } from './asset-profile-dialog.component';
FormsModule,
GfAdminMarketDataDetailModule,
GfAssetProfileIconComponent,
GfCurrencySelectorModule,
GfPortfolioProportionChartModule,
GfValueModule,
GfCurrencySelectorComponent,
GfPortfolioProportionChartComponent,
GfValueComponent,
MatButtonModule,
MatCheckboxModule,
MatDialogModule,

View File

@ -1,4 +1,4 @@
import { GfSymbolAutocompleteModule } from '@ghostfolio/ui/symbol-autocomplete';
import { GfSymbolAutocompleteComponent } from '@ghostfolio/ui/symbol-autocomplete';
import { CommonModule } from '@angular/common';
import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core';
@ -16,7 +16,7 @@ import { CreateAssetProfileDialog } from './create-asset-profile-dialog.componen
imports: [
CommonModule,
FormsModule,
GfSymbolAutocompleteModule,
GfSymbolAutocompleteComponent,
MatDialogModule,
MatButtonModule,
MatFormFieldModule,

View File

@ -1,5 +1,5 @@
import { CacheService } from '@ghostfolio/client/services/cache.service';
import { GfValueModule } from '@ghostfolio/ui/value';
import { GfValueComponent } from '@ghostfolio/ui/value';
import { CommonModule } from '@angular/common';
import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core';
@ -19,7 +19,7 @@ import { AdminOverviewComponent } from './admin-overview.component';
imports: [
CommonModule,
FormsModule,
GfValueModule,
GfValueComponent,
MatButtonModule,
MatCardModule,
MatMenuModule,

View File

@ -1,5 +1,5 @@
import { GfPremiumIndicatorModule } from '@ghostfolio/ui/premium-indicator';
import { GfValueModule } from '@ghostfolio/ui/value';
import { GfPremiumIndicatorComponent } from '@ghostfolio/ui/premium-indicator';
import { GfValueComponent } from '@ghostfolio/ui/value';
import { CommonModule } from '@angular/common';
import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core';
@ -14,8 +14,8 @@ import { AdminUsersComponent } from './admin-users.component';
exports: [],
imports: [
CommonModule,
GfPremiumIndicatorModule,
GfValueModule,
GfPremiumIndicatorComponent,
GfValueComponent,
MatButtonModule,
MatMenuModule,
MatTableModule

View File

@ -1,4 +1,4 @@
import { GfPremiumIndicatorModule } from '@ghostfolio/ui/premium-indicator';
import { GfPremiumIndicatorComponent } from '@ghostfolio/ui/premium-indicator';
import { CommonModule } from '@angular/common';
import { NgModule } from '@angular/core';
@ -15,7 +15,7 @@ import { BenchmarkComparatorComponent } from './benchmark-comparator.component';
imports: [
CommonModule,
FormsModule,
GfPremiumIndicatorModule,
GfPremiumIndicatorComponent,
MatSelectModule,
NgxSkeletonLoaderModule,
ReactiveFormsModule,

View File

@ -12,7 +12,7 @@ import { UserService } from '@ghostfolio/client/services/user/user.service';
import { Filter, InfoItem, User } from '@ghostfolio/common/interfaces';
import { hasPermission, permissions } from '@ghostfolio/common/permissions';
import { DateRange } from '@ghostfolio/common/types';
import { AssistantComponent } from '@ghostfolio/ui/assistant/assistant.component';
import { GfAssistantComponent } from '@ghostfolio/ui/assistant/assistant.component';
import {
ChangeDetectionStrategy,
@ -62,7 +62,7 @@ export class HeaderComponent implements OnChanges {
@Output() signOut = new EventEmitter<void>();
@ViewChild('assistant') assistantElement: AssistantComponent;
@ViewChild('assistant') assistantElement: GfAssistantComponent;
@ViewChild('assistantTrigger') assistentMenuTriggerElement: MatMenuTrigger;
public hasPermissionForSocialLogin: boolean;

View File

@ -1,7 +1,7 @@
import { LoginWithAccessTokenDialogModule } from '@ghostfolio/client/components/login-with-access-token-dialog/login-with-access-token-dialog.module';
import { GfAssistantModule } from '@ghostfolio/ui/assistant';
import { GfLogoModule } from '@ghostfolio/ui/logo';
import { GfPremiumIndicatorModule } from '@ghostfolio/ui/premium-indicator';
import { GfAssistantComponent } from '@ghostfolio/ui/assistant';
import { GfLogoComponent } from '@ghostfolio/ui/logo';
import { GfPremiumIndicatorComponent } from '@ghostfolio/ui/premium-indicator';
import { CommonModule } from '@angular/common';
import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core';
@ -17,9 +17,9 @@ import { HeaderComponent } from './header.component';
exports: [HeaderComponent],
imports: [
CommonModule,
GfAssistantModule,
GfLogoModule,
GfPremiumIndicatorModule,
GfAssistantComponent,
GfLogoComponent,
GfPremiumIndicatorComponent,
LoginWithAccessTokenDialogModule,
MatButtonModule,
MatMenuModule,

View File

@ -1,6 +1,6 @@
import { GfFearAndGreedIndexModule } from '@ghostfolio/client/components/fear-and-greed-index/fear-and-greed-index.module';
import { GfBenchmarkModule } from '@ghostfolio/ui/benchmark/benchmark.module';
import { GfLineChartModule } from '@ghostfolio/ui/line-chart/line-chart.module';
import { GfBenchmarkComponent } from '@ghostfolio/ui/benchmark';
import { GfLineChartComponent } from '@ghostfolio/ui/line-chart';
import { CommonModule } from '@angular/common';
import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core';
@ -13,9 +13,9 @@ import { HomeMarketComponent } from './home-market.component';
exports: [HomeMarketComponent],
imports: [
CommonModule,
GfBenchmarkModule,
GfBenchmarkComponent,
GfFearAndGreedIndexModule,
GfLineChartModule,
GfLineChartComponent,
NgxSkeletonLoaderModule
],
schemas: [CUSTOM_ELEMENTS_SCHEMA]

View File

@ -1,6 +1,6 @@
import { GfPortfolioPerformanceModule } from '@ghostfolio/client/components/portfolio-performance/portfolio-performance.module';
import { GfLineChartModule } from '@ghostfolio/ui/line-chart/line-chart.module';
import { GfNoTransactionsInfoModule } from '@ghostfolio/ui/no-transactions-info';
import { GfLineChartComponent } from '@ghostfolio/ui/line-chart';
import { GfNoTransactionsInfoComponent } from '@ghostfolio/ui/no-transactions-info';
import { CommonModule } from '@angular/common';
import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core';
@ -13,8 +13,8 @@ import { HomeOverviewComponent } from './home-overview.component';
declarations: [HomeOverviewComponent],
imports: [
CommonModule,
GfLineChartModule,
GfNoTransactionsInfoModule,
GfLineChartComponent,
GfNoTransactionsInfoComponent,
GfPortfolioPerformanceModule,
MatButtonModule,
RouterModule

View File

@ -102,7 +102,7 @@ export class HomeSummaryComponent implements OnDestroy, OnInit {
this.isLoading = true;
this.dataService
.fetchPortfolioDetails({ withLiabilities: true })
.fetchPortfolioDetails()
.pipe(takeUntil(this.unsubscribeSubject))
.subscribe(({ summary }) => {
this.summary = summary;

View File

@ -1,4 +1,4 @@
import { GfValueModule } from '@ghostfolio/ui/value';
import { GfValueComponent } from '@ghostfolio/ui/value';
import { CommonModule } from '@angular/common';
import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core';
@ -9,7 +9,7 @@ import { PortfolioPerformanceComponent } from './portfolio-performance.component
@NgModule({
declarations: [PortfolioPerformanceComponent],
exports: [PortfolioPerformanceComponent],
imports: [CommonModule, GfValueModule, NgxSkeletonLoaderModule],
imports: [CommonModule, GfValueComponent, NgxSkeletonLoaderModule],
schemas: [CUSTOM_ELEMENTS_SCHEMA]
})
export class GfPortfolioPerformanceModule {}

View File

@ -1,4 +1,4 @@
import { GfValueModule } from '@ghostfolio/ui/value';
import { GfValueComponent } from '@ghostfolio/ui/value';
import { CommonModule } from '@angular/common';
import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core';
@ -8,7 +8,7 @@ import { PortfolioSummaryComponent } from './portfolio-summary.component';
@NgModule({
declarations: [PortfolioSummaryComponent],
exports: [PortfolioSummaryComponent],
imports: [CommonModule, GfValueModule],
imports: [CommonModule, GfValueComponent],
schemas: [CUSTOM_ELEMENTS_SCHEMA]
})
export class GfPortfolioSummaryModule {}

View File

@ -1,11 +1,11 @@
import { GfAccountsTableModule } from '@ghostfolio/client/components/accounts-table/accounts-table.module';
import { GfDialogFooterModule } from '@ghostfolio/client/components/dialog-footer/dialog-footer.module';
import { GfDialogHeaderModule } from '@ghostfolio/client/components/dialog-header/dialog-header.module';
import { GfActivitiesTableModule } from '@ghostfolio/ui/activities-table/activities-table.module';
import { GfDataProviderCreditsModule } from '@ghostfolio/ui/data-provider-credits/data-provider-credits.module';
import { GfLineChartModule } from '@ghostfolio/ui/line-chart/line-chart.module';
import { GfPortfolioProportionChartModule } from '@ghostfolio/ui/portfolio-proportion-chart/portfolio-proportion-chart.module';
import { GfValueModule } from '@ghostfolio/ui/value';
import { GfActivitiesTableComponent } from '@ghostfolio/ui/activities-table';
import { GfDataProviderCreditsComponent } from '@ghostfolio/ui/data-provider-credits';
import { GfLineChartComponent } from '@ghostfolio/ui/line-chart';
import { GfPortfolioProportionChartComponent } from '@ghostfolio/ui/portfolio-proportion-chart';
import { GfValueComponent } from '@ghostfolio/ui/value';
import { CommonModule } from '@angular/common';
import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core';
@ -22,13 +22,13 @@ import { PositionDetailDialog } from './position-detail-dialog.component';
imports: [
CommonModule,
GfAccountsTableModule,
GfActivitiesTableModule,
GfDataProviderCreditsModule,
GfActivitiesTableComponent,
GfDataProviderCreditsComponent,
GfDialogFooterModule,
GfDialogHeaderModule,
GfLineChartModule,
GfPortfolioProportionChartModule,
GfValueModule,
GfLineChartComponent,
GfPortfolioProportionChartComponent,
GfValueComponent,
MatButtonModule,
MatChipsModule,
MatDialogModule,

View File

@ -1,6 +1,6 @@
import { GfSymbolModule } from '@ghostfolio/client/pipes/symbol/symbol.module';
import { GfTrendIndicatorModule } from '@ghostfolio/ui/trend-indicator';
import { GfValueModule } from '@ghostfolio/ui/value';
import { GfTrendIndicatorComponent } from '@ghostfolio/ui/trend-indicator';
import { GfValueComponent } from '@ghostfolio/ui/value';
import { CommonModule } from '@angular/common';
import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core';
@ -18,8 +18,8 @@ import { PositionComponent } from './position.component';
CommonModule,
GfPositionDetailDialogModule,
GfSymbolModule,
GfTrendIndicatorModule,
GfValueModule,
GfTrendIndicatorComponent,
GfValueComponent,
MatDialogModule,
NgxSkeletonLoaderModule,
RouterModule

View File

@ -1,4 +1,4 @@
import { GfNoTransactionsInfoModule } from '@ghostfolio/ui/no-transactions-info';
import { GfNoTransactionsInfoComponent } from '@ghostfolio/ui/no-transactions-info';
import { CommonModule } from '@angular/common';
import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core';
@ -12,7 +12,7 @@ import { PositionsComponent } from './positions.component';
exports: [PositionsComponent],
imports: [
CommonModule,
GfNoTransactionsInfoModule,
GfNoTransactionsInfoComponent,
GfPositionModule,
MatButtonModule
],

View File

@ -1,5 +1,5 @@
import { GfRuleModule } from '@ghostfolio/client/components/rule/rule.module';
import { GfNoTransactionsInfoModule } from '@ghostfolio/ui/no-transactions-info';
import { GfNoTransactionsInfoComponent } from '@ghostfolio/ui/no-transactions-info';
import { CommonModule } from '@angular/common';
import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core';
@ -14,7 +14,7 @@ import { RulesComponent } from './rules.component';
exports: [RulesComponent],
imports: [
CommonModule,
GfNoTransactionsInfoModule,
GfNoTransactionsInfoComponent,
GfPositionModule,
GfRuleModule,
MatButtonModule,

View File

@ -1,4 +1,4 @@
import { GfPremiumIndicatorModule } from '@ghostfolio/ui/premium-indicator';
import { GfPremiumIndicatorComponent } from '@ghostfolio/ui/premium-indicator';
import { CommonModule } from '@angular/common';
import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core';
@ -12,7 +12,7 @@ import { SubscriptionInterstitialDialog } from './subscription-interstitial-dial
declarations: [SubscriptionInterstitialDialog],
imports: [
CommonModule,
GfPremiumIndicatorModule,
GfPremiumIndicatorComponent,
MatButtonModule,
MatDialogModule,
RouterModule

View File

@ -1,5 +1,5 @@
import { GfPortfolioAccessTableModule } from '@ghostfolio/client/components/access-table/access-table.module';
import { GfPremiumIndicatorModule } from '@ghostfolio/ui/premium-indicator';
import { GfPremiumIndicatorComponent } from '@ghostfolio/ui/premium-indicator';
import { CommonModule } from '@angular/common';
import { NgModule } from '@angular/core';
@ -17,7 +17,7 @@ import { UserAccountAccessComponent } from './user-account-access.component';
CommonModule,
GfCreateOrUpdateAccessDialogModule,
GfPortfolioAccessTableModule,
GfPremiumIndicatorModule,
GfPremiumIndicatorComponent,
MatButtonModule,
MatDialogModule,
RouterModule

View File

@ -1,6 +1,6 @@
import { GfMembershipCardModule } from '@ghostfolio/ui/membership-card';
import { GfPremiumIndicatorModule } from '@ghostfolio/ui/premium-indicator';
import { GfValueModule } from '@ghostfolio/ui/value';
import { GfMembershipCardComponent } from '@ghostfolio/ui/membership-card';
import { GfPremiumIndicatorComponent } from '@ghostfolio/ui/premium-indicator';
import { GfValueComponent } from '@ghostfolio/ui/value';
import { CommonModule } from '@angular/common';
import { NgModule } from '@angular/core';
@ -15,9 +15,9 @@ import { UserAccountMembershipComponent } from './user-account-membership.compon
exports: [UserAccountMembershipComponent],
imports: [
CommonModule,
GfMembershipCardModule,
GfPremiumIndicatorModule,
GfValueModule,
GfMembershipCardComponent,
GfPremiumIndicatorComponent,
GfValueComponent,
MatButtonModule,
MatCardModule,
RouterModule

View File

@ -1,4 +1,4 @@
import { GfValueModule } from '@ghostfolio/ui/value';
import { GfValueComponent } from '@ghostfolio/ui/value';
import { CommonModule } from '@angular/common';
import { NgModule } from '@angular/core';
@ -18,7 +18,7 @@ import { UserAccountSettingsComponent } from './user-account-settings.component'
imports: [
CommonModule,
FormsModule,
GfValueModule,
GfValueComponent,
MatButtonModule,
MatCardModule,
MatFormFieldModule,

View File

@ -63,9 +63,11 @@ export class HttpResponseInterceptor implements HttpInterceptor {
undefined,
{ duration: 6000 }
);
} else if (!error.url.endsWith('auth/anonymous')) {
} else if (!error.url.includes('/auth')) {
this.snackBarRef = this.snackBar.open(
$localize`This feature requires a subscription.`,
this.hasPermissionForSubscription
? $localize`This feature requires a subscription.`
: $localize`This action is not allowed.`,
this.hasPermissionForSubscription
? $localize`Upgrade Plan`
: undefined,

View File

@ -1,6 +1,7 @@
import { CreateAccountDto } from '@ghostfolio/api/app/account/create-account.dto';
import { UpdateAccountDto } from '@ghostfolio/api/app/account/update-account.dto';
import { DataService } from '@ghostfolio/client/services/data.service';
import { validateObjectForForm } from '@ghostfolio/client/util/form.util';
import { Currency } from '@ghostfolio/common/interfaces';
import {
@ -102,7 +103,7 @@ export class CreateOrUpdateAccountDialog implements OnDestroy {
this.dialogRef.close();
}
public onSubmit() {
public async onSubmit() {
const account: CreateAccountDto | UpdateAccountDto = {
balance: this.accountForm.controls['balance'].value,
comment: this.accountForm.controls['comment'].value,
@ -113,13 +114,29 @@ export class CreateOrUpdateAccountDialog implements OnDestroy {
platformId: this.accountForm.controls['platformId'].value?.id ?? null
};
if (this.data.account.id) {
(account as UpdateAccountDto).id = this.data.account.id;
} else {
delete (account as CreateAccountDto).id;
}
try {
if (this.data.account.id) {
(account as UpdateAccountDto).id = this.data.account.id;
this.dialogRef.close({ account });
await validateObjectForForm({
classDto: UpdateAccountDto,
form: this.accountForm,
object: account
});
} else {
delete (account as CreateAccountDto).id;
await validateObjectForForm({
classDto: CreateAccountDto,
form: this.accountForm,
object: account
});
}
this.dialogRef.close({ account });
} catch (error) {
console.error(error);
}
}
public ngOnDestroy() {

View File

@ -1,5 +1,5 @@
import { GfAssetProfileIconComponent } from '@ghostfolio/client/components/asset-profile-icon/asset-profile-icon.component';
import { GfCurrencySelectorModule } from '@ghostfolio/ui/currency-selector/currency-selector.module';
import { GfCurrencySelectorComponent } from '@ghostfolio/ui/currency-selector';
import { CommonModule } from '@angular/common';
import { NgModule } from '@angular/core';
@ -19,7 +19,7 @@ import { CreateOrUpdateAccountDialog } from './create-or-update-account-dialog.c
CommonModule,
FormsModule,
GfAssetProfileIconComponent,
GfCurrencySelectorModule,
GfCurrencySelectorComponent,
MatAutocompleteModule,
MatButtonModule,
MatCheckboxModule,

View File

@ -1,4 +1,4 @@
import { GfPremiumIndicatorModule } from '@ghostfolio/ui/premium-indicator';
import { GfPremiumIndicatorComponent } from '@ghostfolio/ui/premium-indicator';
import { Component } from '@angular/core';
import { MatButtonModule } from '@angular/material/button';
@ -6,7 +6,7 @@ import { RouterModule } from '@angular/router';
@Component({
host: { class: 'page' },
imports: [GfPremiumIndicatorModule, MatButtonModule, RouterModule],
imports: [GfPremiumIndicatorComponent, MatButtonModule, RouterModule],
selector: 'gf-black-friday-2022-page',
standalone: true,
templateUrl: './black-friday-2022-page.html'

View File

@ -1,4 +1,4 @@
import { GfPremiumIndicatorModule } from '@ghostfolio/ui/premium-indicator';
import { GfPremiumIndicatorComponent } from '@ghostfolio/ui/premium-indicator';
import { Component } from '@angular/core';
import { MatButtonModule } from '@angular/material/button';
@ -6,7 +6,7 @@ import { RouterModule } from '@angular/router';
@Component({
host: { class: 'page' },
imports: [GfPremiumIndicatorModule, MatButtonModule, RouterModule],
imports: [GfPremiumIndicatorComponent, MatButtonModule, RouterModule],
selector: 'gf-black-week-2023-page',
standalone: true,
templateUrl: './black-week-2023-page.html'

View File

@ -30,7 +30,8 @@
systems, including
<a href="https://github.com/bigbeartechworld/big-bear-casaos"
>CasaOS</a
>, <a href="https://www.runtipi.io/docs/apps-available">Runtipi</a>,
>, Home Assistant,
<a href="https://www.runtipi.io/docs/apps-available">Runtipi</a>,
<a href="https://truecharts.org/charts/stable/ghostfolio"
>TrueCharts</a
>, <a href="https://apps.umbrel.com/app/ghostfolio">Umbrel</a>, and

View File

@ -1,4 +1,4 @@
import { GfPremiumIndicatorModule } from '@ghostfolio/ui/premium-indicator';
import { GfPremiumIndicatorComponent } from '@ghostfolio/ui/premium-indicator';
import { CommonModule } from '@angular/common';
import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core';
@ -13,7 +13,7 @@ import { FeaturesPageComponent } from './features-page.component';
imports: [
CommonModule,
FeaturesPageRoutingModule,
GfPremiumIndicatorModule,
GfPremiumIndicatorComponent,
MatButtonModule,
MatCardModule
],

View File

@ -2,12 +2,6 @@
<div class="row">
<div class="col text-center">
<div>
<div class="badge badge-light badge-pill border mb-3 px-3 py-2">
<a href="../en/blog/2023/09/ghostfolio-2"
><span class="mr-1 text-uppercase" i18n>New</span>
<span class="font-weight-normal">Ghostfolio 2.0</span></a
>
</div>
<h1 class="font-weight-bold intro" i18n>
Manage your wealth like a boss
</h1>

View File

@ -1,7 +1,7 @@
import { GfWorldMapChartModule } from '@ghostfolio/client/components/world-map-chart/world-map-chart.module';
import { GfCarouselModule } from '@ghostfolio/ui/carousel';
import { GfLogoModule } from '@ghostfolio/ui/logo';
import { GfValueModule } from '@ghostfolio/ui/value';
import { GfCarouselComponent } from '@ghostfolio/ui/carousel';
import { GfLogoComponent } from '@ghostfolio/ui/logo';
import { GfValueComponent } from '@ghostfolio/ui/value';
import { CommonModule } from '@angular/common';
import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core';
@ -16,9 +16,9 @@ import { LandingPageComponent } from './landing-page.component';
declarations: [LandingPageComponent],
imports: [
CommonModule,
GfCarouselModule,
GfLogoModule,
GfValueModule,
GfCarouselComponent,
GfLogoComponent,
GfValueComponent,
GfWorldMapChartModule,
LandingPageRoutingModule,
MatButtonModule,

View File

@ -1,4 +1,4 @@
import { GfValueModule } from '@ghostfolio/ui/value';
import { GfValueComponent } from '@ghostfolio/ui/value';
import { CommonModule } from '@angular/common';
import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core';
@ -9,7 +9,12 @@ import { OpenPageComponent } from './open-page.component';
@NgModule({
declarations: [OpenPageComponent],
imports: [CommonModule, GfValueModule, MatCardModule, OpenPageRoutingModule],
imports: [
CommonModule,
GfValueComponent,
MatCardModule,
OpenPageRoutingModule
],
schemas: [CUSTOM_ELEMENTS_SCHEMA]
})
export class OpenPageModule {}

View File

@ -124,9 +124,6 @@ export class ActivitiesPageComponent implements OnDestroy, OnInit {
this.dataService
.fetchActivities({
filters: this.userService.getFilters(),
range: this.user?.settings?.isExperimentalFeatures
? this.user?.settings?.dateRange
: undefined,
skip: this.pageIndex * this.pageSize,
sortColumn: this.sortColumn,
sortDirection: this.sortDirection,

View File

@ -1,5 +1,5 @@
import { ImportActivitiesService } from '@ghostfolio/client/services/import-activities.service';
import { GfActivitiesTableModule } from '@ghostfolio/ui/activities-table/activities-table.module';
import { GfActivitiesTableComponent } from '@ghostfolio/ui/activities-table';
import { CommonModule } from '@angular/common';
import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core';
@ -17,7 +17,7 @@ import { GfImportActivitiesDialogModule } from './import-activities-dialog/impor
imports: [
ActivitiesPageRoutingModule,
CommonModule,
GfActivitiesTableModule,
GfActivitiesTableComponent,
GfCreateOrUpdateActivityDialogModule,
GfImportActivitiesDialogModule,
MatButtonModule,

View File

@ -1,6 +1,7 @@
import { CreateOrderDto } from '@ghostfolio/api/app/order/create-order.dto';
import { UpdateOrderDto } from '@ghostfolio/api/app/order/update-order.dto';
import { DataService } from '@ghostfolio/client/services/data.service';
import { validateObjectForForm } from '@ghostfolio/client/util/form.util';
import { getDateFormatString } from '@ghostfolio/common/helper';
import { translate } from '@ghostfolio/ui/i18n';
@ -451,7 +452,7 @@ export class CreateOrUpdateActivityDialog implements OnDestroy {
);
}
public onSubmit() {
public async onSubmit() {
const activity: CreateOrderDto | UpdateOrderDto = {
accountId: this.activityForm.controls['accountId'].value,
assetClass: this.activityForm.controls['assetClass'].value,
@ -474,14 +475,32 @@ export class CreateOrUpdateActivityDialog implements OnDestroy {
unitPrice: this.activityForm.controls['unitPrice'].value
};
if (this.data.activity.id) {
(activity as UpdateOrderDto).id = this.data.activity.id;
} else {
(activity as CreateOrderDto).updateAccountBalance =
this.activityForm.controls['updateAccountBalance'].value;
}
try {
if (this.data.activity.id) {
(activity as UpdateOrderDto).id = this.data.activity.id;
this.dialogRef.close({ activity });
await validateObjectForForm({
classDto: UpdateOrderDto,
form: this.activityForm,
ignoreFields: ['dataSource', 'date'],
object: activity as UpdateOrderDto
});
} else {
(activity as CreateOrderDto).updateAccountBalance =
this.activityForm.controls['updateAccountBalance'].value;
await validateObjectForForm({
classDto: CreateOrderDto,
form: this.activityForm,
ignoreFields: ['dataSource', 'date'],
object: activity
});
}
this.dialogRef.close({ activity });
} catch (error) {
console.error(error);
}
}
public ngOnDestroy() {

View File

@ -1,6 +1,6 @@
import { GfAssetProfileIconComponent } from '@ghostfolio/client/components/asset-profile-icon/asset-profile-icon.component';
import { GfSymbolAutocompleteModule } from '@ghostfolio/ui/symbol-autocomplete/symbol-autocomplete.module';
import { GfValueModule } from '@ghostfolio/ui/value';
import { GfSymbolAutocompleteComponent } from '@ghostfolio/ui/symbol-autocomplete';
import { GfValueComponent } from '@ghostfolio/ui/value';
import { CommonModule } from '@angular/common';
import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core';
@ -23,8 +23,8 @@ import { CreateOrUpdateActivityDialog } from './create-or-update-activity-dialog
CommonModule,
FormsModule,
GfAssetProfileIconComponent,
GfSymbolAutocompleteModule,
GfValueModule,
GfSymbolAutocompleteComponent,
GfValueComponent,
MatAutocompleteModule,
MatButtonModule,
MatCheckboxModule,

View File

@ -2,7 +2,7 @@ import { GfDialogFooterModule } from '@ghostfolio/client/components/dialog-foote
import { GfDialogHeaderModule } from '@ghostfolio/client/components/dialog-header/dialog-header.module';
import { GfFileDropModule } from '@ghostfolio/client/directives/file-drop/file-drop.module';
import { GfSymbolModule } from '@ghostfolio/client/pipes/symbol/symbol.module';
import { GfActivitiesTableModule } from '@ghostfolio/ui/activities-table/activities-table.module';
import { GfActivitiesTableComponent } from '@ghostfolio/ui/activities-table';
import { CommonModule } from '@angular/common';
import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core';
@ -22,7 +22,7 @@ import { ImportActivitiesDialog } from './import-activities-dialog.component';
imports: [
CommonModule,
FormsModule,
GfActivitiesTableModule,
GfActivitiesTableComponent,
GfDialogFooterModule,
GfDialogHeaderModule,
GfFileDropModule,

View File

@ -1,7 +1,7 @@
import { GfWorldMapChartModule } from '@ghostfolio/client/components/world-map-chart/world-map-chart.module';
import { GfPortfolioProportionChartModule } from '@ghostfolio/ui/portfolio-proportion-chart/portfolio-proportion-chart.module';
import { GfPremiumIndicatorModule } from '@ghostfolio/ui/premium-indicator';
import { GfValueModule } from '@ghostfolio/ui/value';
import { GfPortfolioProportionChartComponent } from '@ghostfolio/ui/portfolio-proportion-chart';
import { GfPremiumIndicatorComponent } from '@ghostfolio/ui/premium-indicator';
import { GfValueComponent } from '@ghostfolio/ui/value';
import { CommonModule } from '@angular/common';
import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core';
@ -17,10 +17,10 @@ import { AllocationsPageComponent } from './allocations-page.component';
imports: [
AllocationsPageRoutingModule,
CommonModule,
GfPortfolioProportionChartModule,
GfPremiumIndicatorModule,
GfPortfolioProportionChartComponent,
GfPremiumIndicatorComponent,
GfWorldMapChartModule,
GfValueModule,
GfValueComponent,
MatCardModule,
MatDialogModule,
MatProgressBarModule

View File

@ -1,9 +1,9 @@
import { GfBenchmarkComparatorModule } from '@ghostfolio/client/components/benchmark-comparator/benchmark-comparator.module';
import { GfInvestmentChartModule } from '@ghostfolio/client/components/investment-chart/investment-chart.module';
import { GfToggleModule } from '@ghostfolio/client/components/toggle/toggle.module';
import { GfActivitiesFilterModule } from '@ghostfolio/ui/activities-filter/activities-filter.module';
import { GfPremiumIndicatorModule } from '@ghostfolio/ui/premium-indicator';
import { GfValueModule } from '@ghostfolio/ui/value';
import { GfActivitiesFilterComponent } from '@ghostfolio/ui/activities-filter';
import { GfPremiumIndicatorComponent } from '@ghostfolio/ui/premium-indicator';
import { GfValueComponent } from '@ghostfolio/ui/value';
import { CommonModule } from '@angular/common';
import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core';
@ -18,12 +18,12 @@ import { AnalysisPageComponent } from './analysis-page.component';
imports: [
AnalysisPageRoutingModule,
CommonModule,
GfActivitiesFilterModule,
GfActivitiesFilterComponent,
GfBenchmarkComparatorModule,
GfInvestmentChartModule,
GfPremiumIndicatorModule,
GfPremiumIndicatorComponent,
GfToggleModule,
GfValueModule,
GfValueComponent,
MatCardModule,
NgxSkeletonLoaderModule
],

View File

@ -1,7 +1,7 @@
import { GfRulesModule } from '@ghostfolio/client/components/rules/rules.module';
import { GfFireCalculatorModule } from '@ghostfolio/ui/fire-calculator';
import { GfPremiumIndicatorModule } from '@ghostfolio/ui/premium-indicator';
import { GfValueModule } from '@ghostfolio/ui/value';
import { GfFireCalculatorComponent } from '@ghostfolio/ui/fire-calculator';
import { GfPremiumIndicatorComponent } from '@ghostfolio/ui/premium-indicator';
import { GfValueComponent } from '@ghostfolio/ui/value';
import { CommonModule } from '@angular/common';
import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core';
@ -15,10 +15,10 @@ import { FirePageComponent } from './fire-page.component';
imports: [
CommonModule,
FirePageRoutingModule,
GfFireCalculatorModule,
GfPremiumIndicatorModule,
GfFireCalculatorComponent,
GfPremiumIndicatorComponent,
GfRulesModule,
GfValueModule,
GfValueComponent,
NgxSkeletonLoaderModule
],
schemas: [CUSTOM_ELEMENTS_SCHEMA]

View File

@ -123,7 +123,8 @@ export class HoldingsPageComponent implements OnDestroy, OnInit {
}
return this.dataService.fetchPortfolioHoldings({
filters
filters,
range: this.user?.settings?.dateRange
});
}

View File

@ -1,5 +1,5 @@
import { GfToggleModule } from '@ghostfolio/client/components/toggle/toggle.module';
import { GfHoldingsTableModule } from '@ghostfolio/ui/holdings-table/holdings-table.module';
import { GfHoldingsTableComponent } from '@ghostfolio/ui/holdings-table';
import { CommonModule } from '@angular/common';
import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core';
@ -12,7 +12,7 @@ import { HoldingsPageComponent } from './holdings-page.component';
declarations: [HoldingsPageComponent],
imports: [
CommonModule,
GfHoldingsTableModule,
GfHoldingsTableComponent,
GfToggleModule,
HoldingsPageRoutingModule,
MatButtonModule

View File

@ -1,4 +1,4 @@
import { GfPremiumIndicatorModule } from '@ghostfolio/ui/premium-indicator';
import { GfPremiumIndicatorComponent } from '@ghostfolio/ui/premium-indicator';
import { CommonModule } from '@angular/common';
import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core';
@ -14,7 +14,7 @@ import { PricingPageComponent } from './pricing-page.component';
declarations: [PricingPageComponent],
imports: [
CommonModule,
GfPremiumIndicatorModule,
GfPremiumIndicatorComponent,
MatButtonModule,
MatCardModule,
MatTooltipModule,

View File

@ -1,7 +1,7 @@
import { GfWorldMapChartModule } from '@ghostfolio/client/components/world-map-chart/world-map-chart.module';
import { GfHoldingsTableModule } from '@ghostfolio/ui/holdings-table/holdings-table.module';
import { GfPortfolioProportionChartModule } from '@ghostfolio/ui/portfolio-proportion-chart/portfolio-proportion-chart.module';
import { GfValueModule } from '@ghostfolio/ui/value';
import { GfHoldingsTableComponent } from '@ghostfolio/ui/holdings-table';
import { GfPortfolioProportionChartComponent } from '@ghostfolio/ui/portfolio-proportion-chart';
import { GfValueComponent } from '@ghostfolio/ui/value';
import { CommonModule } from '@angular/common';
import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core';
@ -15,9 +15,9 @@ import { PublicPageComponent } from './public-page.component';
declarations: [PublicPageComponent],
imports: [
CommonModule,
GfHoldingsTableModule,
GfPortfolioProportionChartModule,
GfValueModule,
GfHoldingsTableComponent,
GfPortfolioProportionChartComponent,
GfValueComponent,
GfWorldMapChartModule,
MatButtonModule,
MatCardModule,

View File

@ -1,4 +1,4 @@
import { GfLogoModule } from '@ghostfolio/ui/logo';
import { GfLogoComponent } from '@ghostfolio/ui/logo';
import { CommonModule } from '@angular/common';
import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core';
@ -13,7 +13,7 @@ import { ShowAccessTokenDialogModule } from './show-access-token-dialog/show-acc
declarations: [RegisterPageComponent],
imports: [
CommonModule,
GfLogoModule,
GfLogoComponent,
MatButtonModule,
RegisterPageRoutingModule,
RouterModule,

View File

@ -1,5 +1,5 @@
import { WebauthnPageComponent } from '@ghostfolio/client/pages/webauthn/webauthn-page.component';
import { GfLogoModule } from '@ghostfolio/ui/logo';
import { GfLogoComponent } from '@ghostfolio/ui/logo';
import { CommonModule } from '@angular/common';
import { NgModule } from '@angular/core';
@ -12,7 +12,7 @@ import { WebauthnPageRoutingModule } from './webauthn-page-routing.module';
declarations: [WebauthnPageComponent],
imports: [
CommonModule,
GfLogoModule,
GfLogoComponent,
MatButtonModule,
MatProgressSpinnerModule,
WebauthnPageRoutingModule

View File

@ -1,3 +1,9 @@
:host {
display: block;
button {
@media (max-width: 575.98px) {
width: 100%;
}
}
}

View File

@ -42,7 +42,11 @@ import { translate } from '@ghostfolio/ui/i18n';
import { HttpClient, HttpParams } from '@angular/common/http';
import { Injectable } from '@angular/core';
import { SortDirection } from '@angular/material/sort';
import { DataSource, Order as OrderModel } from '@prisma/client';
import {
AccountBalance,
DataSource,
Order as OrderModel
} from '@prisma/client';
import { format, parseISO } from 'date-fns';
import { cloneDeep, groupBy, isNumber } from 'lodash';
import { Observable } from 'rxjs';
@ -411,19 +415,13 @@ export class DataService {
public fetchPortfolioDetails({
filters,
withLiabilities = false,
withMarkets = false
}: {
filters?: Filter[];
withLiabilities?: boolean;
withMarkets?: boolean;
} = {}): Observable<PortfolioDetails> {
let params = this.buildFiltersAsQueryParams({ filters });
if (withLiabilities) {
params = params.append('withLiabilities', withLiabilities);
}
if (withMarkets) {
params = params.append('withMarkets', withMarkets);
}
@ -470,13 +468,21 @@ export class DataService {
}
public fetchPortfolioHoldings({
filters
filters,
range
}: {
filters?: Filter[];
} = {}) {
range?: DateRange;
}) {
let params = this.buildFiltersAsQueryParams({ filters });
if (range) {
params = params.append('range', range);
}
return this.http
.get<PortfolioHoldingsResponse>('/api/v1/portfolio/holdings', {
params: this.buildFiltersAsQueryParams({ filters })
params
})
.pipe(
map((response) => {
@ -609,6 +615,22 @@ export class DataService {
return this.http.post<OrderModel>(`/api/v1/account`, aAccount);
}
public postAccountBalance({
accountId,
balance,
date
}: {
accountId: string;
balance: number;
date: Date;
}) {
return this.http.post<AccountBalance>(`/api/v1/account-balance`, {
accountId,
balance,
date
});
}
public postBenchmark(benchmark: UniqueAsset) {
return this.http.post(`/api/v1/benchmark`, benchmark);
}

View File

@ -0,0 +1,38 @@
import { FormGroup } from '@angular/forms';
import { plainToInstance } from 'class-transformer';
import { validate } from 'class-validator';
export async function validateObjectForForm<T>({
classDto,
form,
ignoreFields = [],
object
}: {
classDto: { new (): T };
form: FormGroup;
ignoreFields?: string[];
object: T;
}): Promise<void> {
const objectInstance = plainToInstance(classDto, object);
const errors = await validate(objectInstance as object);
const nonIgnoredErrors = errors.filter(({ property }) => {
return !ignoreFields.includes(property);
});
if (nonIgnoredErrors.length === 0) {
return Promise.resolve();
}
for (const { constraints, property } of nonIgnoredErrors) {
const formControl = form.get(property);
if (formControl) {
formControl.setErrors({
validationError: Object.values(constraints)[0]
});
}
}
return Promise.reject(nonIgnoredErrors);
}

View File

@ -218,7 +218,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/account-balances/account-balances.component.html</context>
<context context-type="linenumber">20</context>
<context context-type="linenumber">34</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/activities-table/activities-table.component.html</context>
@ -294,7 +294,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/account-balances/account-balances.component.html</context>
<context context-type="linenumber">51</context>
<context context-type="linenumber">80</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/activities-table/activities-table.component.html</context>
@ -314,7 +314,7 @@
<target state="translated">Jobs löschen</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">126</context>
<context context-type="linenumber">158</context>
</context-group>
</trans-unit>
<trans-unit id="7cd2168068d1fd50772c493d493f83e4e412ebc8" datatype="html">
@ -362,7 +362,7 @@
<target state="translated">Versuche</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">63</context>
<context context-type="linenumber">82</context>
</context-group>
</trans-unit>
<trans-unit id="1b051734b0ee9021991c91b3ed4e81c244322462" datatype="html">
@ -370,7 +370,7 @@
<target state="translated">Erstellt</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">72</context>
<context context-type="linenumber">91</context>
</context-group>
</trans-unit>
<trans-unit id="edcc19a49c950289ffe5d38be4843cdf194e5622" datatype="html">
@ -378,7 +378,7 @@
<target state="translated">Abgeschlossen</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">81</context>
<context context-type="linenumber">100</context>
</context-group>
</trans-unit>
<trans-unit id="81b97b8ea996ad1e4f9fca8415021850214884b1" datatype="html">
@ -386,7 +386,7 @@
<target state="translated">Status</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">90</context>
<context context-type="linenumber">109</context>
</context-group>
</trans-unit>
<trans-unit id="db287ecf48f50d8a83c1dbdcee6282723b4cd9ad" datatype="html">
@ -410,7 +410,7 @@
<target state="translated">Daten anzeigen</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">141</context>
<context context-type="linenumber">173</context>
</context-group>
</trans-unit>
<trans-unit id="94e6ec0f0d021b88dfa4ef191447315fc1898f00" datatype="html">
@ -418,7 +418,7 @@
<target state="translated">Stacktrace anzeigen</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">148</context>
<context context-type="linenumber">180</context>
</context-group>
</trans-unit>
<trans-unit id="de50f7bcb18ed16c00012741202155acb5c61acf" datatype="html">
@ -426,7 +426,7 @@
<target state="translated">Job löschen</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">154</context>
<context context-type="linenumber">186</context>
</context-group>
</trans-unit>
<trans-unit id="bfb6a28329c452254e363723ef9718b5178dfd1d" datatype="html">
@ -450,7 +450,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/account-balances/account-balances.component.html</context>
<context context-type="linenumber">11</context>
<context context-type="linenumber">12</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/activities-table/activities-table.component.html</context>
@ -728,6 +728,10 @@
<context context-type="sourcefile">apps/client/src/app/components/admin-overview/admin-overview.html</context>
<context context-type="linenumber">231</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/account-balances/account-balances.component.html</context>
<context context-type="linenumber">93</context>
</context-group>
</trans-unit>
<trans-unit id="e799e6b926557f0098f41888cdf8df868eff3d47" datatype="html">
<source>Housekeeping</source>
@ -1596,7 +1600,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
<context context-type="linenumber">188</context>
<context context-type="linenumber">215</context>
</context-group>
</trans-unit>
<trans-unit id="7377728350294749129" datatype="html">
@ -1608,7 +1612,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
<context context-type="linenumber">198</context>
<context context-type="linenumber">225</context>
</context-group>
</trans-unit>
<trans-unit id="8768104874317770689" datatype="html">
@ -1620,7 +1624,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
<context context-type="linenumber">202</context>
<context context-type="linenumber">229</context>
</context-group>
</trans-unit>
<trans-unit id="7304247106520037555" datatype="html">
@ -1632,7 +1636,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
<context context-type="linenumber">206</context>
<context context-type="linenumber">233</context>
</context-group>
</trans-unit>
<trans-unit id="3667949571823271511" datatype="html">
@ -1644,7 +1648,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
<context context-type="linenumber">209</context>
<context context-type="linenumber">236</context>
</context-group>
</trans-unit>
<trans-unit id="3041670542776846470" datatype="html">
@ -1656,7 +1660,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/core/http-response.interceptor.ts</context>
<context context-type="linenumber">68</context>
<context context-type="linenumber">69</context>
</context-group>
</trans-unit>
<trans-unit id="5499742151525073097" datatype="html">
@ -1668,7 +1672,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/core/http-response.interceptor.ts</context>
<context context-type="linenumber">70</context>
<context context-type="linenumber">72</context>
</context-group>
</trans-unit>
<trans-unit id="1579692722565712588" datatype="html">
@ -1676,7 +1680,7 @@
<target state="translated">Okay</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/core/http-response.interceptor.ts</context>
<context context-type="linenumber">90</context>
<context context-type="linenumber">92</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts</context>
@ -2748,7 +2752,7 @@
<target state="translated">Möchtest du diese Aktivität wirklich löschen?</target>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/activities-table/activities-table.component.ts</context>
<context context-type="linenumber">175</context>
<context context-type="linenumber">215</context>
</context-group>
</trans-unit>
<trans-unit id="170f7de02b14690fb9c1999a16926c0044bfd5c1" datatype="html">
@ -2824,7 +2828,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/core/http-response.interceptor.ts</context>
<context context-type="linenumber">89</context>
<context context-type="linenumber">91</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts</context>
@ -2836,7 +2840,7 @@
<target state="translated">Ups! Es ist etwas schief gelaufen.</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/core/http-response.interceptor.ts</context>
<context context-type="linenumber">87</context>
<context context-type="linenumber">89</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts</context>
@ -2984,7 +2988,7 @@
<target state="translated">Einlage</target>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/fire-calculator/fire-calculator.component.ts</context>
<context context-type="linenumber">332</context>
<context context-type="linenumber">357</context>
</context-group>
</trans-unit>
<trans-unit id="3441715041566940420" datatype="html">
@ -2992,7 +2996,7 @@
<target state="translated">Verzinsung</target>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/fire-calculator/fire-calculator.component.ts</context>
<context context-type="linenumber">342</context>
<context context-type="linenumber">367</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/i18n.ts</context>
@ -3004,7 +3008,7 @@
<target state="translated">Ersparnisse</target>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/fire-calculator/fire-calculator.component.ts</context>
<context context-type="linenumber">352</context>
<context context-type="linenumber">377</context>
</context-group>
</trans-unit>
<trans-unit id="aad5320acd7453f912bc8714e72c2fa71e8ab18e" datatype="html">
@ -3324,7 +3328,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts</context>
<context context-type="linenumber">385</context>
<context context-type="linenumber">389</context>
</context-group>
</trans-unit>
<trans-unit id="4893616715766810081" datatype="html">
@ -3332,11 +3336,11 @@
<target state="translated">Keine Daten verfügbar</target>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts</context>
<context context-type="linenumber">387</context>
<context context-type="linenumber">391</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts</context>
<context context-type="linenumber">400</context>
<context context-type="linenumber">404</context>
</context-group>
</trans-unit>
<trans-unit id="1228771048078164312" datatype="html">
@ -4108,7 +4112,7 @@
<target state="translated">Möchtest du wirklich alle Aktivitäten löschen?</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/activities/activities-page.component.ts</context>
<context context-type="linenumber">171</context>
<context context-type="linenumber">168</context>
</context-group>
</trans-unit>
<trans-unit id="166ccc92e1aa598f9056a260be209a0bab64d37a" datatype="html">
@ -11152,7 +11156,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/core/http-response.interceptor.ts</context>
<context context-type="linenumber">81</context>
<context context-type="linenumber">83</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/blog/2021/07/hallo-ghostfolio/hallo-ghostfolio-page.component.ts</context>
@ -11188,7 +11192,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/membership-card/membership-card.component.ts</context>
<context context-type="linenumber">13</context>
<context context-type="linenumber">25</context>
</context-group>
</trans-unit>
<trans-unit id="5915338689523424386" datatype="html">
@ -13436,7 +13440,7 @@
<target state="translated">Finde Position...</target>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
<context context-type="linenumber">111</context>
<context context-type="linenumber">138</context>
</context-group>
</trans-unit>
<trans-unit id="cd206f0509271d9e611747bef0713c7df048d3af" datatype="html">
@ -14636,7 +14640,7 @@
<target state="translated">Möchtest du diesen Cash-Bestand wirklich löschen?</target>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/account-balances/account-balances.component.ts</context>
<context context-type="linenumber">58</context>
<context context-type="linenumber">104</context>
</context-group>
</trans-unit>
<trans-unit id="3860727927683017623" datatype="html">
@ -14804,7 +14808,7 @@
<target state="translated">Seit Wochenbeginn</target>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
<context context-type="linenumber">190</context>
<context context-type="linenumber">217</context>
</context-group>
</trans-unit>
<trans-unit id="7451343426685730864" datatype="html">
@ -14812,7 +14816,7 @@
<target state="translated">WTD</target>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
<context context-type="linenumber">190</context>
<context context-type="linenumber">217</context>
</context-group>
</trans-unit>
<trans-unit id="358501326846847310" datatype="html">
@ -14820,7 +14824,7 @@
<target state="translated">Seit Monatsbeginn</target>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
<context context-type="linenumber">194</context>
<context context-type="linenumber">221</context>
</context-group>
</trans-unit>
<trans-unit id="399380803601269035" datatype="html">
@ -14828,7 +14832,7 @@
<target state="translated">MTD</target>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
<context context-type="linenumber">194</context>
<context context-type="linenumber">221</context>
</context-group>
</trans-unit>
<trans-unit id="2593751087640318641" datatype="html">
@ -14836,7 +14840,7 @@
<target state="translated">Seit Jahresbeginn</target>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
<context context-type="linenumber">198</context>
<context context-type="linenumber">225</context>
</context-group>
</trans-unit>
<trans-unit id="6829218544e108e152f5fa72cb79c4ccb82e0d06" datatype="html">
@ -14880,7 +14884,7 @@
<target state="translated">Jahr</target>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
<context context-type="linenumber">202</context>
<context context-type="linenumber">229</context>
</context-group>
</trans-unit>
<trans-unit id="7658073495909471632" datatype="html">
@ -14888,7 +14892,7 @@
<target state="translated">Jahre</target>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
<context context-type="linenumber">206</context>
<context context-type="linenumber">233</context>
</context-group>
</trans-unit>
<trans-unit id="7b5a5b1697006355467454025b820fd98de32074" datatype="html">
@ -14972,7 +14976,7 @@
<target state="translated">Ups! Es sieht so aus, als würdest du zu viele Anfragen senden. Bitte geh es ein bisschen langsamer an.</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/core/http-response.interceptor.ts</context>
<context context-type="linenumber">105</context>
<context context-type="linenumber">107</context>
</context-group>
</trans-unit>
<trans-unit id="myAccount" datatype="html">
@ -15020,7 +15024,23 @@
<target state="translated">Job ausführen</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">151</context>
<context context-type="linenumber">183</context>
</context-group>
</trans-unit>
<trans-unit id="b74af38005e8a8914e45af2ec412e11ceafef8b6" datatype="html">
<source>Priority</source>
<target state="translated">Priorität</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">63</context>
</context-group>
</trans-unit>
<trans-unit id="8236987838684066590" datatype="html">
<source>This action is not allowed.</source>
<target state="translated">Diese Aktion ist nicht zulässig.</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/core/http-response.interceptor.ts</context>
<context context-type="linenumber">70</context>
</context-group>
</trans-unit>
</body>

View File

@ -219,7 +219,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/account-balances/account-balances.component.html</context>
<context context-type="linenumber">20</context>
<context context-type="linenumber">34</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/activities-table/activities-table.component.html</context>
@ -295,7 +295,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/account-balances/account-balances.component.html</context>
<context context-type="linenumber">51</context>
<context context-type="linenumber">80</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/activities-table/activities-table.component.html</context>
@ -315,7 +315,7 @@
<target state="translated">Elimina los trabajos</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">126</context>
<context context-type="linenumber">158</context>
</context-group>
</trans-unit>
<trans-unit id="7cd2168068d1fd50772c493d493f83e4e412ebc8" datatype="html">
@ -363,7 +363,7 @@
<target state="translated">Intentos</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">63</context>
<context context-type="linenumber">82</context>
</context-group>
</trans-unit>
<trans-unit id="1b051734b0ee9021991c91b3ed4e81c244322462" datatype="html">
@ -371,7 +371,7 @@
<target state="translated">Creado</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">72</context>
<context context-type="linenumber">91</context>
</context-group>
</trans-unit>
<trans-unit id="edcc19a49c950289ffe5d38be4843cdf194e5622" datatype="html">
@ -379,7 +379,7 @@
<target state="translated">Finalizado</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">81</context>
<context context-type="linenumber">100</context>
</context-group>
</trans-unit>
<trans-unit id="81b97b8ea996ad1e4f9fca8415021850214884b1" datatype="html">
@ -387,7 +387,7 @@
<target state="translated">Estado</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">90</context>
<context context-type="linenumber">109</context>
</context-group>
</trans-unit>
<trans-unit id="db287ecf48f50d8a83c1dbdcee6282723b4cd9ad" datatype="html">
@ -411,7 +411,7 @@
<target state="translated">Visualiza los datos</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">141</context>
<context context-type="linenumber">173</context>
</context-group>
</trans-unit>
<trans-unit id="94e6ec0f0d021b88dfa4ef191447315fc1898f00" datatype="html">
@ -419,7 +419,7 @@
<target state="translated">Visualiza Stacktrace</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">148</context>
<context context-type="linenumber">180</context>
</context-group>
</trans-unit>
<trans-unit id="de50f7bcb18ed16c00012741202155acb5c61acf" datatype="html">
@ -427,7 +427,7 @@
<target state="translated">Elimina el trabajo</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">154</context>
<context context-type="linenumber">186</context>
</context-group>
</trans-unit>
<trans-unit id="bfb6a28329c452254e363723ef9718b5178dfd1d" datatype="html">
@ -451,7 +451,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/account-balances/account-balances.component.html</context>
<context context-type="linenumber">11</context>
<context context-type="linenumber">12</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/activities-table/activities-table.component.html</context>
@ -729,6 +729,10 @@
<context context-type="sourcefile">apps/client/src/app/components/admin-overview/admin-overview.html</context>
<context context-type="linenumber">231</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/account-balances/account-balances.component.html</context>
<context context-type="linenumber">93</context>
</context-group>
</trans-unit>
<trans-unit id="e799e6b926557f0098f41888cdf8df868eff3d47" datatype="html">
<source>Housekeeping</source>
@ -1594,7 +1598,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
<context context-type="linenumber">188</context>
<context context-type="linenumber">215</context>
</context-group>
</trans-unit>
<trans-unit id="7377728350294749129" datatype="html">
@ -1606,7 +1610,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
<context context-type="linenumber">198</context>
<context context-type="linenumber">225</context>
</context-group>
</trans-unit>
<trans-unit id="8768104874317770689" datatype="html">
@ -1618,7 +1622,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
<context context-type="linenumber">202</context>
<context context-type="linenumber">229</context>
</context-group>
</trans-unit>
<trans-unit id="7304247106520037555" datatype="html">
@ -1630,7 +1634,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
<context context-type="linenumber">206</context>
<context context-type="linenumber">233</context>
</context-group>
</trans-unit>
<trans-unit id="3667949571823271511" datatype="html">
@ -1642,7 +1646,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
<context context-type="linenumber">209</context>
<context context-type="linenumber">236</context>
</context-group>
</trans-unit>
<trans-unit id="3041670542776846470" datatype="html">
@ -1654,7 +1658,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/core/http-response.interceptor.ts</context>
<context context-type="linenumber">68</context>
<context context-type="linenumber">69</context>
</context-group>
</trans-unit>
<trans-unit id="5499742151525073097" datatype="html">
@ -1666,7 +1670,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/core/http-response.interceptor.ts</context>
<context context-type="linenumber">70</context>
<context context-type="linenumber">72</context>
</context-group>
</trans-unit>
<trans-unit id="1579692722565712588" datatype="html">
@ -1674,7 +1678,7 @@
<target state="translated">De acuerdo</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/core/http-response.interceptor.ts</context>
<context context-type="linenumber">90</context>
<context context-type="linenumber">92</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts</context>
@ -2746,7 +2750,7 @@
<target state="translated">¿Estás seguro de eliminar esta operación?</target>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/activities-table/activities-table.component.ts</context>
<context context-type="linenumber">175</context>
<context context-type="linenumber">215</context>
</context-group>
</trans-unit>
<trans-unit id="170f7de02b14690fb9c1999a16926c0044bfd5c1" datatype="html">
@ -2818,7 +2822,7 @@
<target state="translated">Vaya! Algo no funcionó bien.</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/core/http-response.interceptor.ts</context>
<context context-type="linenumber">87</context>
<context context-type="linenumber">89</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts</context>
@ -2834,7 +2838,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/core/http-response.interceptor.ts</context>
<context context-type="linenumber">89</context>
<context context-type="linenumber">91</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts</context>
@ -2974,7 +2978,7 @@
<target state="translated">Ahorros</target>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/fire-calculator/fire-calculator.component.ts</context>
<context context-type="linenumber">352</context>
<context context-type="linenumber">377</context>
</context-group>
</trans-unit>
<trans-unit id="3441715041566940420" datatype="html">
@ -2982,7 +2986,7 @@
<target state="translated">Interés</target>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/fire-calculator/fire-calculator.component.ts</context>
<context context-type="linenumber">342</context>
<context context-type="linenumber">367</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/i18n.ts</context>
@ -2994,7 +2998,7 @@
<target state="translated">Depósito</target>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/fire-calculator/fire-calculator.component.ts</context>
<context context-type="linenumber">332</context>
<context context-type="linenumber">357</context>
</context-group>
</trans-unit>
<trans-unit id="6762743264882388498" datatype="html">
@ -3322,7 +3326,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts</context>
<context context-type="linenumber">385</context>
<context context-type="linenumber">389</context>
</context-group>
</trans-unit>
<trans-unit id="4893616715766810081" datatype="html">
@ -3330,11 +3334,11 @@
<target state="translated">Sin datos disponibles</target>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts</context>
<context context-type="linenumber">387</context>
<context context-type="linenumber">391</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts</context>
<context context-type="linenumber">400</context>
<context context-type="linenumber">404</context>
</context-group>
</trans-unit>
<trans-unit id="1228771048078164312" datatype="html">
@ -4106,7 +4110,7 @@
<target state="new">Do you really want to delete all your activities?</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/activities/activities-page.component.ts</context>
<context context-type="linenumber">171</context>
<context context-type="linenumber">168</context>
</context-group>
</trans-unit>
<trans-unit id="166ccc92e1aa598f9056a260be209a0bab64d37a" datatype="html">
@ -11150,7 +11154,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/core/http-response.interceptor.ts</context>
<context context-type="linenumber">81</context>
<context context-type="linenumber">83</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/blog/2021/07/hallo-ghostfolio/hallo-ghostfolio-page.component.ts</context>
@ -11186,7 +11190,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/membership-card/membership-card.component.ts</context>
<context context-type="linenumber">13</context>
<context context-type="linenumber">25</context>
</context-group>
</trans-unit>
<trans-unit id="5915338689523424386" datatype="html">
@ -13434,7 +13438,7 @@
<target state="new">Find holding...</target>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
<context context-type="linenumber">111</context>
<context context-type="linenumber">138</context>
</context-group>
</trans-unit>
<trans-unit id="cd206f0509271d9e611747bef0713c7df048d3af" datatype="html">
@ -14634,7 +14638,7 @@
<target state="new">Do you really want to delete this account balance?</target>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/account-balances/account-balances.component.ts</context>
<context context-type="linenumber">58</context>
<context context-type="linenumber">104</context>
</context-group>
</trans-unit>
<trans-unit id="3860727927683017623" datatype="html">
@ -14802,7 +14806,7 @@
<target state="new">Week to date</target>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
<context context-type="linenumber">190</context>
<context context-type="linenumber">217</context>
</context-group>
</trans-unit>
<trans-unit id="7451343426685730864" datatype="html">
@ -14810,7 +14814,7 @@
<target state="new">WTD</target>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
<context context-type="linenumber">190</context>
<context context-type="linenumber">217</context>
</context-group>
</trans-unit>
<trans-unit id="358501326846847310" datatype="html">
@ -14818,7 +14822,7 @@
<target state="new">Month to date</target>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
<context context-type="linenumber">194</context>
<context context-type="linenumber">221</context>
</context-group>
</trans-unit>
<trans-unit id="399380803601269035" datatype="html">
@ -14826,7 +14830,7 @@
<target state="new">MTD</target>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
<context context-type="linenumber">194</context>
<context context-type="linenumber">221</context>
</context-group>
</trans-unit>
<trans-unit id="2593751087640318641" datatype="html">
@ -14834,7 +14838,7 @@
<target state="new">Year to date</target>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
<context context-type="linenumber">198</context>
<context context-type="linenumber">225</context>
</context-group>
</trans-unit>
<trans-unit id="6829218544e108e152f5fa72cb79c4ccb82e0d06" datatype="html">
@ -14878,7 +14882,7 @@
<target state="new">year</target>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
<context context-type="linenumber">202</context>
<context context-type="linenumber">229</context>
</context-group>
</trans-unit>
<trans-unit id="7658073495909471632" datatype="html">
@ -14886,7 +14890,7 @@
<target state="new">years</target>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
<context context-type="linenumber">206</context>
<context context-type="linenumber">233</context>
</context-group>
</trans-unit>
<trans-unit id="7b5a5b1697006355467454025b820fd98de32074" datatype="html">
@ -14970,7 +14974,7 @@
<target state="new">Oops! It looks like youre making too many requests. Please slow down a bit.</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/core/http-response.interceptor.ts</context>
<context context-type="linenumber">105</context>
<context context-type="linenumber">107</context>
</context-group>
</trans-unit>
<trans-unit id="myAccount" datatype="html">
@ -15018,7 +15022,23 @@
<target state="new">Execute Job</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">151</context>
<context context-type="linenumber">183</context>
</context-group>
</trans-unit>
<trans-unit id="b74af38005e8a8914e45af2ec412e11ceafef8b6" datatype="html">
<source>Priority</source>
<target state="new">Priority</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">63</context>
</context-group>
</trans-unit>
<trans-unit id="8236987838684066590" datatype="html">
<source>This action is not allowed.</source>
<target state="new">This action is not allowed.</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/core/http-response.interceptor.ts</context>
<context context-type="linenumber">70</context>
</context-group>
</trans-unit>
</body>

View File

@ -274,7 +274,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/account-balances/account-balances.component.html</context>
<context context-type="linenumber">20</context>
<context context-type="linenumber">34</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/activities-table/activities-table.component.html</context>
@ -350,7 +350,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/account-balances/account-balances.component.html</context>
<context context-type="linenumber">51</context>
<context context-type="linenumber">80</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/activities-table/activities-table.component.html</context>
@ -410,7 +410,7 @@
<target state="translated">Tentatives</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">63</context>
<context context-type="linenumber">82</context>
</context-group>
</trans-unit>
<trans-unit id="1b051734b0ee9021991c91b3ed4e81c244322462" datatype="html">
@ -418,7 +418,7 @@
<target state="translated">Créé</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">72</context>
<context context-type="linenumber">91</context>
</context-group>
</trans-unit>
<trans-unit id="edcc19a49c950289ffe5d38be4843cdf194e5622" datatype="html">
@ -426,7 +426,7 @@
<target state="translated">Terminé</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">81</context>
<context context-type="linenumber">100</context>
</context-group>
</trans-unit>
<trans-unit id="81b97b8ea996ad1e4f9fca8415021850214884b1" datatype="html">
@ -434,7 +434,7 @@
<target state="translated">Statut</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">90</context>
<context context-type="linenumber">109</context>
</context-group>
</trans-unit>
<trans-unit id="056853138da25939da59abfb432ed2316fe50934" datatype="html">
@ -442,7 +442,7 @@
<target state="translated">Supprimer Tâches</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">126</context>
<context context-type="linenumber">158</context>
</context-group>
</trans-unit>
<trans-unit id="db287ecf48f50d8a83c1dbdcee6282723b4cd9ad" datatype="html">
@ -466,7 +466,7 @@
<target state="translated">Voir Données</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">141</context>
<context context-type="linenumber">173</context>
</context-group>
</trans-unit>
<trans-unit id="94e6ec0f0d021b88dfa4ef191447315fc1898f00" datatype="html">
@ -474,7 +474,7 @@
<target state="translated">Voir la Stacktrace</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">148</context>
<context context-type="linenumber">180</context>
</context-group>
</trans-unit>
<trans-unit id="de50f7bcb18ed16c00012741202155acb5c61acf" datatype="html">
@ -482,7 +482,7 @@
<target state="translated">Supprimer Tâche</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">154</context>
<context context-type="linenumber">186</context>
</context-group>
</trans-unit>
<trans-unit id="bfb6a28329c452254e363723ef9718b5178dfd1d" datatype="html">
@ -506,7 +506,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/account-balances/account-balances.component.html</context>
<context context-type="linenumber">11</context>
<context context-type="linenumber">12</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/activities-table/activities-table.component.html</context>
@ -988,6 +988,10 @@
<context context-type="sourcefile">apps/client/src/app/components/admin-overview/admin-overview.html</context>
<context context-type="linenumber">231</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/account-balances/account-balances.component.html</context>
<context context-type="linenumber">93</context>
</context-group>
</trans-unit>
<trans-unit id="e799e6b926557f0098f41888cdf8df868eff3d47" datatype="html">
<source>Housekeeping</source>
@ -1578,7 +1582,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/core/http-response.interceptor.ts</context>
<context context-type="linenumber">68</context>
<context context-type="linenumber">69</context>
</context-group>
</trans-unit>
<trans-unit id="5499742151525073097" datatype="html">
@ -1590,7 +1594,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/core/http-response.interceptor.ts</context>
<context context-type="linenumber">70</context>
<context context-type="linenumber">72</context>
</context-group>
</trans-unit>
<trans-unit id="a8233de047500bf0f0d9f9f1712ddb071501a283" datatype="html">
@ -1925,7 +1929,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
<context context-type="linenumber">188</context>
<context context-type="linenumber">215</context>
</context-group>
</trans-unit>
<trans-unit id="7377728350294749129" datatype="html">
@ -1937,7 +1941,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
<context context-type="linenumber">198</context>
<context context-type="linenumber">225</context>
</context-group>
</trans-unit>
<trans-unit id="8768104874317770689" datatype="html">
@ -1949,7 +1953,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
<context context-type="linenumber">202</context>
<context context-type="linenumber">229</context>
</context-group>
</trans-unit>
<trans-unit id="7304247106520037555" datatype="html">
@ -1961,7 +1965,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
<context context-type="linenumber">206</context>
<context context-type="linenumber">233</context>
</context-group>
</trans-unit>
<trans-unit id="3667949571823271511" datatype="html">
@ -1973,7 +1977,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
<context context-type="linenumber">209</context>
<context context-type="linenumber">236</context>
</context-group>
</trans-unit>
<trans-unit id="4190182554887994764" datatype="html">
@ -1993,7 +1997,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/core/http-response.interceptor.ts</context>
<context context-type="linenumber">89</context>
<context context-type="linenumber">91</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts</context>
@ -2005,7 +2009,7 @@
<target state="translated">Oups! Quelque chose s&apos;est mal passé.</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/core/http-response.interceptor.ts</context>
<context context-type="linenumber">87</context>
<context context-type="linenumber">89</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts</context>
@ -2017,7 +2021,7 @@
<target state="translated">D&apos;accord</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/core/http-response.interceptor.ts</context>
<context context-type="linenumber">90</context>
<context context-type="linenumber">92</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts</context>
@ -2925,7 +2929,7 @@
<target state="translated">Dépôt</target>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/fire-calculator/fire-calculator.component.ts</context>
<context context-type="linenumber">332</context>
<context context-type="linenumber">357</context>
</context-group>
</trans-unit>
<trans-unit id="6762743264882388498" datatype="html">
@ -3265,7 +3269,7 @@
<target state="translated">Voulez-vous vraiment supprimer cette activité ?</target>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/activities-table/activities-table.component.ts</context>
<context context-type="linenumber">175</context>
<context context-type="linenumber">215</context>
</context-group>
</trans-unit>
<trans-unit id="170f7de02b14690fb9c1999a16926c0044bfd5c1" datatype="html">
@ -3313,7 +3317,7 @@
<target state="translated">Intérêt</target>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/fire-calculator/fire-calculator.component.ts</context>
<context context-type="linenumber">342</context>
<context context-type="linenumber">367</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/i18n.ts</context>
@ -3325,7 +3329,7 @@
<target state="translated">Épargne</target>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/fire-calculator/fire-calculator.component.ts</context>
<context context-type="linenumber">352</context>
<context context-type="linenumber">377</context>
</context-group>
</trans-unit>
<trans-unit id="2ee26d58f2707416e636887111d5603b35346c4a" datatype="html">
@ -3385,7 +3389,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts</context>
<context context-type="linenumber">385</context>
<context context-type="linenumber">389</context>
</context-group>
</trans-unit>
<trans-unit id="8106025670158480144" datatype="html">
@ -3561,11 +3565,11 @@
<target state="translated">Pas de données disponibles</target>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts</context>
<context context-type="linenumber">387</context>
<context context-type="linenumber">391</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts</context>
<context context-type="linenumber">400</context>
<context context-type="linenumber">404</context>
</context-group>
</trans-unit>
<trans-unit id="0f845001c88b82c18535e6d44f5597061f506e42" datatype="html">
@ -4105,7 +4109,7 @@
<target state="translated">Voulez-vous vraiment supprimer toutes vos activités ?</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/activities/activities-page.component.ts</context>
<context context-type="linenumber">171</context>
<context context-type="linenumber">168</context>
</context-group>
</trans-unit>
<trans-unit id="166ccc92e1aa598f9056a260be209a0bab64d37a" datatype="html">
@ -11149,7 +11153,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/core/http-response.interceptor.ts</context>
<context context-type="linenumber">81</context>
<context context-type="linenumber">83</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/blog/2021/07/hallo-ghostfolio/hallo-ghostfolio-page.component.ts</context>
@ -11185,7 +11189,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/membership-card/membership-card.component.ts</context>
<context context-type="linenumber">13</context>
<context context-type="linenumber">25</context>
</context-group>
</trans-unit>
<trans-unit id="5915338689523424386" datatype="html">
@ -13433,7 +13437,7 @@
<target state="new">Find holding...</target>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
<context context-type="linenumber">111</context>
<context context-type="linenumber">138</context>
</context-group>
</trans-unit>
<trans-unit id="cd206f0509271d9e611747bef0713c7df048d3af" datatype="html">
@ -14633,7 +14637,7 @@
<target state="new">Do you really want to delete this account balance?</target>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/account-balances/account-balances.component.ts</context>
<context context-type="linenumber">58</context>
<context context-type="linenumber">104</context>
</context-group>
</trans-unit>
<trans-unit id="3860727927683017623" datatype="html">
@ -14801,7 +14805,7 @@
<target state="new">Week to date</target>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
<context context-type="linenumber">190</context>
<context context-type="linenumber">217</context>
</context-group>
</trans-unit>
<trans-unit id="7451343426685730864" datatype="html">
@ -14809,7 +14813,7 @@
<target state="new">WTD</target>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
<context context-type="linenumber">190</context>
<context context-type="linenumber">217</context>
</context-group>
</trans-unit>
<trans-unit id="358501326846847310" datatype="html">
@ -14817,7 +14821,7 @@
<target state="new">Month to date</target>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
<context context-type="linenumber">194</context>
<context context-type="linenumber">221</context>
</context-group>
</trans-unit>
<trans-unit id="399380803601269035" datatype="html">
@ -14825,7 +14829,7 @@
<target state="new">MTD</target>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
<context context-type="linenumber">194</context>
<context context-type="linenumber">221</context>
</context-group>
</trans-unit>
<trans-unit id="2593751087640318641" datatype="html">
@ -14833,7 +14837,7 @@
<target state="new">Year to date</target>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
<context context-type="linenumber">198</context>
<context context-type="linenumber">225</context>
</context-group>
</trans-unit>
<trans-unit id="6829218544e108e152f5fa72cb79c4ccb82e0d06" datatype="html">
@ -14877,7 +14881,7 @@
<target state="new">year</target>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
<context context-type="linenumber">202</context>
<context context-type="linenumber">229</context>
</context-group>
</trans-unit>
<trans-unit id="7658073495909471632" datatype="html">
@ -14885,7 +14889,7 @@
<target state="new">years</target>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
<context context-type="linenumber">206</context>
<context context-type="linenumber">233</context>
</context-group>
</trans-unit>
<trans-unit id="7b5a5b1697006355467454025b820fd98de32074" datatype="html">
@ -14969,7 +14973,7 @@
<target state="new">Oops! It looks like youre making too many requests. Please slow down a bit.</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/core/http-response.interceptor.ts</context>
<context context-type="linenumber">105</context>
<context context-type="linenumber">107</context>
</context-group>
</trans-unit>
<trans-unit id="myAccount" datatype="html">
@ -15017,7 +15021,23 @@
<target state="new">Execute Job</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">151</context>
<context context-type="linenumber">183</context>
</context-group>
</trans-unit>
<trans-unit id="b74af38005e8a8914e45af2ec412e11ceafef8b6" datatype="html">
<source>Priority</source>
<target state="new">Priority</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">63</context>
</context-group>
</trans-unit>
<trans-unit id="8236987838684066590" datatype="html">
<source>This action is not allowed.</source>
<target state="new">This action is not allowed.</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/core/http-response.interceptor.ts</context>
<context context-type="linenumber">70</context>
</context-group>
</trans-unit>
</body>

View File

@ -219,7 +219,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/account-balances/account-balances.component.html</context>
<context context-type="linenumber">20</context>
<context context-type="linenumber">34</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/activities-table/activities-table.component.html</context>
@ -295,7 +295,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/account-balances/account-balances.component.html</context>
<context context-type="linenumber">51</context>
<context context-type="linenumber">80</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/activities-table/activities-table.component.html</context>
@ -315,7 +315,7 @@
<target state="translated">Elimina i lavori</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">126</context>
<context context-type="linenumber">158</context>
</context-group>
</trans-unit>
<trans-unit id="7cd2168068d1fd50772c493d493f83e4e412ebc8" datatype="html">
@ -363,7 +363,7 @@
<target state="translated">Tentativi</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">63</context>
<context context-type="linenumber">82</context>
</context-group>
</trans-unit>
<trans-unit id="1b051734b0ee9021991c91b3ed4e81c244322462" datatype="html">
@ -371,7 +371,7 @@
<target state="translated">Creato</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">72</context>
<context context-type="linenumber">91</context>
</context-group>
</trans-unit>
<trans-unit id="edcc19a49c950289ffe5d38be4843cdf194e5622" datatype="html">
@ -379,7 +379,7 @@
<target state="translated">Finito</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">81</context>
<context context-type="linenumber">100</context>
</context-group>
</trans-unit>
<trans-unit id="81b97b8ea996ad1e4f9fca8415021850214884b1" datatype="html">
@ -387,7 +387,7 @@
<target state="translated">Stato</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">90</context>
<context context-type="linenumber">109</context>
</context-group>
</trans-unit>
<trans-unit id="db287ecf48f50d8a83c1dbdcee6282723b4cd9ad" datatype="html">
@ -411,7 +411,7 @@
<target state="translated">Visualizza i dati</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">141</context>
<context context-type="linenumber">173</context>
</context-group>
</trans-unit>
<trans-unit id="94e6ec0f0d021b88dfa4ef191447315fc1898f00" datatype="html">
@ -419,7 +419,7 @@
<target state="translated">Visualizza Stacktrace</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">148</context>
<context context-type="linenumber">180</context>
</context-group>
</trans-unit>
<trans-unit id="de50f7bcb18ed16c00012741202155acb5c61acf" datatype="html">
@ -427,7 +427,7 @@
<target state="translated">Elimina il lavoro</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">154</context>
<context context-type="linenumber">186</context>
</context-group>
</trans-unit>
<trans-unit id="bfb6a28329c452254e363723ef9718b5178dfd1d" datatype="html">
@ -451,7 +451,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/account-balances/account-balances.component.html</context>
<context context-type="linenumber">11</context>
<context context-type="linenumber">12</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/activities-table/activities-table.component.html</context>
@ -729,6 +729,10 @@
<context context-type="sourcefile">apps/client/src/app/components/admin-overview/admin-overview.html</context>
<context context-type="linenumber">231</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/account-balances/account-balances.component.html</context>
<context context-type="linenumber">93</context>
</context-group>
</trans-unit>
<trans-unit id="e799e6b926557f0098f41888cdf8df868eff3d47" datatype="html">
<source>Housekeeping</source>
@ -1594,7 +1598,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
<context context-type="linenumber">188</context>
<context context-type="linenumber">215</context>
</context-group>
</trans-unit>
<trans-unit id="7377728350294749129" datatype="html">
@ -1606,7 +1610,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
<context context-type="linenumber">198</context>
<context context-type="linenumber">225</context>
</context-group>
</trans-unit>
<trans-unit id="8768104874317770689" datatype="html">
@ -1618,7 +1622,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
<context context-type="linenumber">202</context>
<context context-type="linenumber">229</context>
</context-group>
</trans-unit>
<trans-unit id="7304247106520037555" datatype="html">
@ -1630,7 +1634,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
<context context-type="linenumber">206</context>
<context context-type="linenumber">233</context>
</context-group>
</trans-unit>
<trans-unit id="3667949571823271511" datatype="html">
@ -1642,7 +1646,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
<context context-type="linenumber">209</context>
<context context-type="linenumber">236</context>
</context-group>
</trans-unit>
<trans-unit id="3041670542776846470" datatype="html">
@ -1654,7 +1658,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/core/http-response.interceptor.ts</context>
<context context-type="linenumber">68</context>
<context context-type="linenumber">69</context>
</context-group>
</trans-unit>
<trans-unit id="5499742151525073097" datatype="html">
@ -1666,7 +1670,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/core/http-response.interceptor.ts</context>
<context context-type="linenumber">70</context>
<context context-type="linenumber">72</context>
</context-group>
</trans-unit>
<trans-unit id="1579692722565712588" datatype="html">
@ -1674,7 +1678,7 @@
<target state="translated">Bene</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/core/http-response.interceptor.ts</context>
<context context-type="linenumber">90</context>
<context context-type="linenumber">92</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts</context>
@ -2746,7 +2750,7 @@
<target state="translated">Vuoi davvero eliminare questa attività?</target>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/activities-table/activities-table.component.ts</context>
<context context-type="linenumber">175</context>
<context context-type="linenumber">215</context>
</context-group>
</trans-unit>
<trans-unit id="170f7de02b14690fb9c1999a16926c0044bfd5c1" datatype="html">
@ -2818,7 +2822,7 @@
<target state="translated">Ops! Qualcosa è andato storto.</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/core/http-response.interceptor.ts</context>
<context context-type="linenumber">87</context>
<context context-type="linenumber">89</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts</context>
@ -2834,7 +2838,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/core/http-response.interceptor.ts</context>
<context context-type="linenumber">89</context>
<context context-type="linenumber">91</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts</context>
@ -2974,7 +2978,7 @@
<target state="translated">Risparmio</target>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/fire-calculator/fire-calculator.component.ts</context>
<context context-type="linenumber">352</context>
<context context-type="linenumber">377</context>
</context-group>
</trans-unit>
<trans-unit id="3441715041566940420" datatype="html">
@ -2982,7 +2986,7 @@
<target state="translated">Interesse</target>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/fire-calculator/fire-calculator.component.ts</context>
<context context-type="linenumber">342</context>
<context context-type="linenumber">367</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/i18n.ts</context>
@ -2994,7 +2998,7 @@
<target state="translated">Deposito</target>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/fire-calculator/fire-calculator.component.ts</context>
<context context-type="linenumber">332</context>
<context context-type="linenumber">357</context>
</context-group>
</trans-unit>
<trans-unit id="6762743264882388498" datatype="html">
@ -3322,7 +3326,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts</context>
<context context-type="linenumber">385</context>
<context context-type="linenumber">389</context>
</context-group>
</trans-unit>
<trans-unit id="4893616715766810081" datatype="html">
@ -3330,11 +3334,11 @@
<target state="translated">Nessun dato disponibile</target>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts</context>
<context context-type="linenumber">387</context>
<context context-type="linenumber">391</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts</context>
<context context-type="linenumber">400</context>
<context context-type="linenumber">404</context>
</context-group>
</trans-unit>
<trans-unit id="1228771048078164312" datatype="html">
@ -4106,7 +4110,7 @@
<target state="translated">Vuoi davvero eliminare tutte le tue attività?</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/activities/activities-page.component.ts</context>
<context context-type="linenumber">171</context>
<context context-type="linenumber">168</context>
</context-group>
</trans-unit>
<trans-unit id="166ccc92e1aa598f9056a260be209a0bab64d37a" datatype="html">
@ -11150,7 +11154,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/core/http-response.interceptor.ts</context>
<context context-type="linenumber">81</context>
<context context-type="linenumber">83</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/blog/2021/07/hallo-ghostfolio/hallo-ghostfolio-page.component.ts</context>
@ -11186,7 +11190,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/membership-card/membership-card.component.ts</context>
<context context-type="linenumber">13</context>
<context context-type="linenumber">25</context>
</context-group>
</trans-unit>
<trans-unit id="5915338689523424386" datatype="html">
@ -13434,7 +13438,7 @@
<target state="new">Find holding...</target>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
<context context-type="linenumber">111</context>
<context context-type="linenumber">138</context>
</context-group>
</trans-unit>
<trans-unit id="cd206f0509271d9e611747bef0713c7df048d3af" datatype="html">
@ -14634,7 +14638,7 @@
<target state="new">Do you really want to delete this account balance?</target>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/account-balances/account-balances.component.ts</context>
<context context-type="linenumber">58</context>
<context context-type="linenumber">104</context>
</context-group>
</trans-unit>
<trans-unit id="3860727927683017623" datatype="html">
@ -14802,7 +14806,7 @@
<target state="new">Week to date</target>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
<context context-type="linenumber">190</context>
<context context-type="linenumber">217</context>
</context-group>
</trans-unit>
<trans-unit id="7451343426685730864" datatype="html">
@ -14810,7 +14814,7 @@
<target state="new">WTD</target>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
<context context-type="linenumber">190</context>
<context context-type="linenumber">217</context>
</context-group>
</trans-unit>
<trans-unit id="358501326846847310" datatype="html">
@ -14818,7 +14822,7 @@
<target state="new">Month to date</target>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
<context context-type="linenumber">194</context>
<context context-type="linenumber">221</context>
</context-group>
</trans-unit>
<trans-unit id="399380803601269035" datatype="html">
@ -14826,7 +14830,7 @@
<target state="new">MTD</target>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
<context context-type="linenumber">194</context>
<context context-type="linenumber">221</context>
</context-group>
</trans-unit>
<trans-unit id="2593751087640318641" datatype="html">
@ -14834,7 +14838,7 @@
<target state="new">Year to date</target>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
<context context-type="linenumber">198</context>
<context context-type="linenumber">225</context>
</context-group>
</trans-unit>
<trans-unit id="6829218544e108e152f5fa72cb79c4ccb82e0d06" datatype="html">
@ -14878,7 +14882,7 @@
<target state="new">year</target>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
<context context-type="linenumber">202</context>
<context context-type="linenumber">229</context>
</context-group>
</trans-unit>
<trans-unit id="7658073495909471632" datatype="html">
@ -14886,7 +14890,7 @@
<target state="new">years</target>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
<context context-type="linenumber">206</context>
<context context-type="linenumber">233</context>
</context-group>
</trans-unit>
<trans-unit id="7b5a5b1697006355467454025b820fd98de32074" datatype="html">
@ -14970,7 +14974,7 @@
<target state="new">Oops! It looks like youre making too many requests. Please slow down a bit.</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/core/http-response.interceptor.ts</context>
<context context-type="linenumber">105</context>
<context context-type="linenumber">107</context>
</context-group>
</trans-unit>
<trans-unit id="myAccount" datatype="html">
@ -15018,7 +15022,23 @@
<target state="new">Execute Job</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">151</context>
<context context-type="linenumber">183</context>
</context-group>
</trans-unit>
<trans-unit id="b74af38005e8a8914e45af2ec412e11ceafef8b6" datatype="html">
<source>Priority</source>
<target state="new">Priority</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">63</context>
</context-group>
</trans-unit>
<trans-unit id="8236987838684066590" datatype="html">
<source>This action is not allowed.</source>
<target state="new">This action is not allowed.</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/core/http-response.interceptor.ts</context>
<context context-type="linenumber">70</context>
</context-group>
</trans-unit>
</body>

View File

@ -218,7 +218,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/account-balances/account-balances.component.html</context>
<context context-type="linenumber">20</context>
<context context-type="linenumber">34</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/activities-table/activities-table.component.html</context>
@ -294,7 +294,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/account-balances/account-balances.component.html</context>
<context context-type="linenumber">51</context>
<context context-type="linenumber">80</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/activities-table/activities-table.component.html</context>
@ -314,7 +314,7 @@
<target state="translated">Taken verwijderen</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">126</context>
<context context-type="linenumber">158</context>
</context-group>
</trans-unit>
<trans-unit id="7cd2168068d1fd50772c493d493f83e4e412ebc8" datatype="html">
@ -362,7 +362,7 @@
<target state="translated">Pogingen</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">63</context>
<context context-type="linenumber">82</context>
</context-group>
</trans-unit>
<trans-unit id="1b051734b0ee9021991c91b3ed4e81c244322462" datatype="html">
@ -370,7 +370,7 @@
<target state="translated">Aangemaakt</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">72</context>
<context context-type="linenumber">91</context>
</context-group>
</trans-unit>
<trans-unit id="edcc19a49c950289ffe5d38be4843cdf194e5622" datatype="html">
@ -378,7 +378,7 @@
<target state="translated">Voltooid</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">81</context>
<context context-type="linenumber">100</context>
</context-group>
</trans-unit>
<trans-unit id="81b97b8ea996ad1e4f9fca8415021850214884b1" datatype="html">
@ -386,7 +386,7 @@
<target state="translated">Status</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">90</context>
<context context-type="linenumber">109</context>
</context-group>
</trans-unit>
<trans-unit id="db287ecf48f50d8a83c1dbdcee6282723b4cd9ad" datatype="html">
@ -410,7 +410,7 @@
<target state="translated">Bekijk gegevens</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">141</context>
<context context-type="linenumber">173</context>
</context-group>
</trans-unit>
<trans-unit id="94e6ec0f0d021b88dfa4ef191447315fc1898f00" datatype="html">
@ -418,7 +418,7 @@
<target state="translated">Bekijk Stacktrace</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">148</context>
<context context-type="linenumber">180</context>
</context-group>
</trans-unit>
<trans-unit id="de50f7bcb18ed16c00012741202155acb5c61acf" datatype="html">
@ -426,7 +426,7 @@
<target state="translated">Taak verwijderen</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">154</context>
<context context-type="linenumber">186</context>
</context-group>
</trans-unit>
<trans-unit id="bfb6a28329c452254e363723ef9718b5178dfd1d" datatype="html">
@ -450,7 +450,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/account-balances/account-balances.component.html</context>
<context context-type="linenumber">11</context>
<context context-type="linenumber">12</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/activities-table/activities-table.component.html</context>
@ -728,6 +728,10 @@
<context context-type="sourcefile">apps/client/src/app/components/admin-overview/admin-overview.html</context>
<context context-type="linenumber">231</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/account-balances/account-balances.component.html</context>
<context context-type="linenumber">93</context>
</context-group>
</trans-unit>
<trans-unit id="e799e6b926557f0098f41888cdf8df868eff3d47" datatype="html">
<source>Housekeeping</source>
@ -1593,7 +1597,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
<context context-type="linenumber">188</context>
<context context-type="linenumber">215</context>
</context-group>
</trans-unit>
<trans-unit id="7377728350294749129" datatype="html">
@ -1605,7 +1609,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
<context context-type="linenumber">198</context>
<context context-type="linenumber">225</context>
</context-group>
</trans-unit>
<trans-unit id="8768104874317770689" datatype="html">
@ -1617,7 +1621,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
<context context-type="linenumber">202</context>
<context context-type="linenumber">229</context>
</context-group>
</trans-unit>
<trans-unit id="7304247106520037555" datatype="html">
@ -1629,7 +1633,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
<context context-type="linenumber">206</context>
<context context-type="linenumber">233</context>
</context-group>
</trans-unit>
<trans-unit id="3667949571823271511" datatype="html">
@ -1641,7 +1645,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
<context context-type="linenumber">209</context>
<context context-type="linenumber">236</context>
</context-group>
</trans-unit>
<trans-unit id="3041670542776846470" datatype="html">
@ -1653,7 +1657,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/core/http-response.interceptor.ts</context>
<context context-type="linenumber">68</context>
<context context-type="linenumber">69</context>
</context-group>
</trans-unit>
<trans-unit id="5499742151525073097" datatype="html">
@ -1665,7 +1669,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/core/http-response.interceptor.ts</context>
<context context-type="linenumber">70</context>
<context context-type="linenumber">72</context>
</context-group>
</trans-unit>
<trans-unit id="1579692722565712588" datatype="html">
@ -1673,7 +1677,7 @@
<target state="translated">Oké</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/core/http-response.interceptor.ts</context>
<context context-type="linenumber">90</context>
<context context-type="linenumber">92</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts</context>
@ -2745,7 +2749,7 @@
<target state="translated">Wil je deze activiteit echt verwijderen?</target>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/activities-table/activities-table.component.ts</context>
<context context-type="linenumber">175</context>
<context context-type="linenumber">215</context>
</context-group>
</trans-unit>
<trans-unit id="170f7de02b14690fb9c1999a16926c0044bfd5c1" datatype="html">
@ -2817,7 +2821,7 @@
<target state="translated">Oeps! Er ging iets mis.</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/core/http-response.interceptor.ts</context>
<context context-type="linenumber">87</context>
<context context-type="linenumber">89</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts</context>
@ -2833,7 +2837,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/core/http-response.interceptor.ts</context>
<context context-type="linenumber">89</context>
<context context-type="linenumber">91</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts</context>
@ -2973,7 +2977,7 @@
<target state="translated">Besparingen</target>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/fire-calculator/fire-calculator.component.ts</context>
<context context-type="linenumber">352</context>
<context context-type="linenumber">377</context>
</context-group>
</trans-unit>
<trans-unit id="3441715041566940420" datatype="html">
@ -2981,7 +2985,7 @@
<target state="translated">Rente</target>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/fire-calculator/fire-calculator.component.ts</context>
<context context-type="linenumber">342</context>
<context context-type="linenumber">367</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/i18n.ts</context>
@ -2993,7 +2997,7 @@
<target state="translated">Storting</target>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/fire-calculator/fire-calculator.component.ts</context>
<context context-type="linenumber">332</context>
<context context-type="linenumber">357</context>
</context-group>
</trans-unit>
<trans-unit id="6762743264882388498" datatype="html">
@ -3321,7 +3325,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts</context>
<context context-type="linenumber">385</context>
<context context-type="linenumber">389</context>
</context-group>
</trans-unit>
<trans-unit id="4893616715766810081" datatype="html">
@ -3329,11 +3333,11 @@
<target state="translated">Geen gegevens beschikbaar</target>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts</context>
<context context-type="linenumber">387</context>
<context context-type="linenumber">391</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts</context>
<context context-type="linenumber">400</context>
<context context-type="linenumber">404</context>
</context-group>
</trans-unit>
<trans-unit id="1228771048078164312" datatype="html">
@ -4105,7 +4109,7 @@
<target state="translated">Wil je echt al je activiteiten verwijderen?</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/activities/activities-page.component.ts</context>
<context context-type="linenumber">171</context>
<context context-type="linenumber">168</context>
</context-group>
</trans-unit>
<trans-unit id="166ccc92e1aa598f9056a260be209a0bab64d37a" datatype="html">
@ -11149,7 +11153,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/core/http-response.interceptor.ts</context>
<context context-type="linenumber">81</context>
<context context-type="linenumber">83</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/blog/2021/07/hallo-ghostfolio/hallo-ghostfolio-page.component.ts</context>
@ -11185,7 +11189,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/membership-card/membership-card.component.ts</context>
<context context-type="linenumber">13</context>
<context context-type="linenumber">25</context>
</context-group>
</trans-unit>
<trans-unit id="5915338689523424386" datatype="html">
@ -13433,7 +13437,7 @@
<target state="new">Find holding...</target>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
<context context-type="linenumber">111</context>
<context context-type="linenumber">138</context>
</context-group>
</trans-unit>
<trans-unit id="cd206f0509271d9e611747bef0713c7df048d3af" datatype="html">
@ -14633,7 +14637,7 @@
<target state="new">Do you really want to delete this account balance?</target>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/account-balances/account-balances.component.ts</context>
<context context-type="linenumber">58</context>
<context context-type="linenumber">104</context>
</context-group>
</trans-unit>
<trans-unit id="3860727927683017623" datatype="html">
@ -14801,7 +14805,7 @@
<target state="new">Week to date</target>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
<context context-type="linenumber">190</context>
<context context-type="linenumber">217</context>
</context-group>
</trans-unit>
<trans-unit id="7451343426685730864" datatype="html">
@ -14809,7 +14813,7 @@
<target state="new">WTD</target>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
<context context-type="linenumber">190</context>
<context context-type="linenumber">217</context>
</context-group>
</trans-unit>
<trans-unit id="358501326846847310" datatype="html">
@ -14817,7 +14821,7 @@
<target state="new">Month to date</target>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
<context context-type="linenumber">194</context>
<context context-type="linenumber">221</context>
</context-group>
</trans-unit>
<trans-unit id="399380803601269035" datatype="html">
@ -14825,7 +14829,7 @@
<target state="new">MTD</target>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
<context context-type="linenumber">194</context>
<context context-type="linenumber">221</context>
</context-group>
</trans-unit>
<trans-unit id="2593751087640318641" datatype="html">
@ -14833,7 +14837,7 @@
<target state="new">Year to date</target>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
<context context-type="linenumber">198</context>
<context context-type="linenumber">225</context>
</context-group>
</trans-unit>
<trans-unit id="6829218544e108e152f5fa72cb79c4ccb82e0d06" datatype="html">
@ -14877,7 +14881,7 @@
<target state="new">year</target>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
<context context-type="linenumber">202</context>
<context context-type="linenumber">229</context>
</context-group>
</trans-unit>
<trans-unit id="7658073495909471632" datatype="html">
@ -14885,7 +14889,7 @@
<target state="new">years</target>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
<context context-type="linenumber">206</context>
<context context-type="linenumber">233</context>
</context-group>
</trans-unit>
<trans-unit id="7b5a5b1697006355467454025b820fd98de32074" datatype="html">
@ -14969,7 +14973,7 @@
<target state="new">Oops! It looks like youre making too many requests. Please slow down a bit.</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/core/http-response.interceptor.ts</context>
<context context-type="linenumber">105</context>
<context context-type="linenumber">107</context>
</context-group>
</trans-unit>
<trans-unit id="myAccount" datatype="html">
@ -15017,7 +15021,23 @@
<target state="new">Execute Job</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">151</context>
<context context-type="linenumber">183</context>
</context-group>
</trans-unit>
<trans-unit id="b74af38005e8a8914e45af2ec412e11ceafef8b6" datatype="html">
<source>Priority</source>
<target state="new">Priority</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">63</context>
</context-group>
</trans-unit>
<trans-unit id="8236987838684066590" datatype="html">
<source>This action is not allowed.</source>
<target state="new">This action is not allowed.</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/core/http-response.interceptor.ts</context>
<context context-type="linenumber">70</context>
</context-group>
</trans-unit>
</body>

View File

@ -654,7 +654,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/core/http-response.interceptor.ts</context>
<context context-type="linenumber">81</context>
<context context-type="linenumber">83</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/blog/2021/07/hallo-ghostfolio/hallo-ghostfolio-page.component.ts</context>
@ -690,7 +690,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/membership-card/membership-card.component.ts</context>
<context context-type="linenumber">13</context>
<context context-type="linenumber">25</context>
</context-group>
</trans-unit>
<trans-unit id="6948811958230386934" datatype="html">
@ -1790,7 +1790,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/account-balances/account-balances.component.html</context>
<context context-type="linenumber">20</context>
<context context-type="linenumber">34</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/activities-table/activities-table.component.html</context>
@ -1866,7 +1866,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/account-balances/account-balances.component.html</context>
<context context-type="linenumber">51</context>
<context context-type="linenumber">80</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/activities-table/activities-table.component.html</context>
@ -1942,7 +1942,7 @@
<target state="new">Attempts</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">63</context>
<context context-type="linenumber">82</context>
</context-group>
</trans-unit>
<trans-unit id="1b051734b0ee9021991c91b3ed4e81c244322462" datatype="html">
@ -1950,7 +1950,7 @@
<target state="new">Created</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">72</context>
<context context-type="linenumber">91</context>
</context-group>
</trans-unit>
<trans-unit id="edcc19a49c950289ffe5d38be4843cdf194e5622" datatype="html">
@ -1958,7 +1958,7 @@
<target state="new">Finished</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">81</context>
<context context-type="linenumber">100</context>
</context-group>
</trans-unit>
<trans-unit id="81b97b8ea996ad1e4f9fca8415021850214884b1" datatype="html">
@ -1966,7 +1966,7 @@
<target state="new">Status</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">90</context>
<context context-type="linenumber">109</context>
</context-group>
</trans-unit>
<trans-unit id="056853138da25939da59abfb432ed2316fe50934" datatype="html">
@ -1974,7 +1974,7 @@
<target state="new">Delete Jobs</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">126</context>
<context context-type="linenumber">158</context>
</context-group>
</trans-unit>
<trans-unit id="30afc50625f30e4ac97acc23fd7e77031a341a8f" datatype="html">
@ -1982,7 +1982,7 @@
<target state="new">View Data</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">141</context>
<context context-type="linenumber">173</context>
</context-group>
</trans-unit>
<trans-unit id="94e6ec0f0d021b88dfa4ef191447315fc1898f00" datatype="html">
@ -1990,7 +1990,7 @@
<target state="new">View Stacktrace</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">148</context>
<context context-type="linenumber">180</context>
</context-group>
</trans-unit>
<trans-unit id="de50f7bcb18ed16c00012741202155acb5c61acf" datatype="html">
@ -1998,7 +1998,7 @@
<target state="new">Delete Job</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">154</context>
<context context-type="linenumber">186</context>
</context-group>
</trans-unit>
<trans-unit id="bfb6a28329c452254e363723ef9718b5178dfd1d" datatype="html">
@ -2022,7 +2022,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/account-balances/account-balances.component.html</context>
<context context-type="linenumber">11</context>
<context context-type="linenumber">12</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/activities-table/activities-table.component.html</context>
@ -2616,6 +2616,10 @@
<context context-type="sourcefile">apps/client/src/app/components/admin-overview/admin-overview.html</context>
<context context-type="linenumber">231</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/account-balances/account-balances.component.html</context>
<context context-type="linenumber">93</context>
</context-group>
</trans-unit>
<trans-unit id="e799e6b926557f0098f41888cdf8df868eff3d47" datatype="html">
<source>Housekeeping</source>
@ -3138,7 +3142,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/core/http-response.interceptor.ts</context>
<context context-type="linenumber">68</context>
<context context-type="linenumber">69</context>
</context-group>
</trans-unit>
<trans-unit id="5499742151525073097" datatype="html">
@ -3150,7 +3154,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/core/http-response.interceptor.ts</context>
<context context-type="linenumber">70</context>
<context context-type="linenumber">72</context>
</context-group>
</trans-unit>
<trans-unit id="a8233de047500bf0f0d9f9f1712ddb071501a283" datatype="html">
@ -3688,7 +3692,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
<context context-type="linenumber">188</context>
<context context-type="linenumber">215</context>
</context-group>
</trans-unit>
<trans-unit id="7377728350294749129" datatype="html">
@ -3700,7 +3704,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
<context context-type="linenumber">198</context>
<context context-type="linenumber">225</context>
</context-group>
</trans-unit>
<trans-unit id="8768104874317770689" datatype="html">
@ -3712,7 +3716,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
<context context-type="linenumber">202</context>
<context context-type="linenumber">229</context>
</context-group>
</trans-unit>
<trans-unit id="7304247106520037555" datatype="html">
@ -3724,7 +3728,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
<context context-type="linenumber">206</context>
<context context-type="linenumber">233</context>
</context-group>
</trans-unit>
<trans-unit id="3667949571823271511" datatype="html">
@ -3736,7 +3740,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
<context context-type="linenumber">209</context>
<context context-type="linenumber">236</context>
</context-group>
</trans-unit>
<trans-unit id="5e41f1b4c46ad9e0a9bc83fa36445483aa5cc324" datatype="html">
@ -4016,7 +4020,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/core/http-response.interceptor.ts</context>
<context context-type="linenumber">89</context>
<context context-type="linenumber">91</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts</context>
@ -4028,7 +4032,7 @@
<target state="new">Oops! Something went wrong.</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/core/http-response.interceptor.ts</context>
<context context-type="linenumber">87</context>
<context context-type="linenumber">89</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts</context>
@ -4040,7 +4044,7 @@
<target state="new">Okay</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/core/http-response.interceptor.ts</context>
<context context-type="linenumber">90</context>
<context context-type="linenumber">92</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts</context>
@ -4952,7 +4956,7 @@
<target state="new">Do you really want to delete all your activities?</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/activities/activities-page.component.ts</context>
<context context-type="linenumber">171</context>
<context context-type="linenumber">168</context>
</context-group>
</trans-unit>
<trans-unit id="72ba3bcdd8350cb8bf462e217a28ec7f7a48bb44" datatype="html">
@ -5396,7 +5400,7 @@
<target state="new">Deposit</target>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/fire-calculator/fire-calculator.component.ts</context>
<context context-type="linenumber">332</context>
<context context-type="linenumber">357</context>
</context-group>
</trans-unit>
<trans-unit id="6762743264882388498" datatype="html">
@ -13220,7 +13224,7 @@
<target state="new">Do you really want to delete this activity?</target>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/activities-table/activities-table.component.ts</context>
<context context-type="linenumber">175</context>
<context context-type="linenumber">215</context>
</context-group>
</trans-unit>
<trans-unit id="4149127798893455354" datatype="html">
@ -13228,7 +13232,7 @@
<target state="new">Find holding...</target>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
<context context-type="linenumber">111</context>
<context context-type="linenumber">138</context>
</context-group>
</trans-unit>
<trans-unit id="cd206f0509271d9e611747bef0713c7df048d3af" datatype="html">
@ -13328,7 +13332,7 @@
<target state="new">Interest</target>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/fire-calculator/fire-calculator.component.ts</context>
<context context-type="linenumber">342</context>
<context context-type="linenumber">367</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/i18n.ts</context>
@ -13340,7 +13344,7 @@
<target state="new">Savings</target>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/fire-calculator/fire-calculator.component.ts</context>
<context context-type="linenumber">352</context>
<context context-type="linenumber">377</context>
</context-group>
</trans-unit>
<trans-unit id="2ee26d58f2707416e636887111d5603b35346c4a" datatype="html">
@ -13496,7 +13500,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts</context>
<context context-type="linenumber">385</context>
<context context-type="linenumber">389</context>
</context-group>
</trans-unit>
<trans-unit id="6333857424161463201" datatype="html">
@ -13792,11 +13796,11 @@
<target state="new">No data available</target>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts</context>
<context context-type="linenumber">387</context>
<context context-type="linenumber">391</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts</context>
<context context-type="linenumber">400</context>
<context context-type="linenumber">404</context>
</context-group>
</trans-unit>
<trans-unit id="d762c43328624b5dd81f3c6a3023203ae9a7553f" datatype="html">
@ -14636,7 +14640,7 @@
<target state="new">Do you really want to delete this account balance?</target>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/account-balances/account-balances.component.ts</context>
<context context-type="linenumber">58</context>
<context context-type="linenumber">104</context>
</context-group>
</trans-unit>
<trans-unit id="3860727927683017623" datatype="html">
@ -14804,7 +14808,7 @@
<target state="new">Week to date</target>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
<context context-type="linenumber">190</context>
<context context-type="linenumber">217</context>
</context-group>
</trans-unit>
<trans-unit id="7451343426685730864" datatype="html">
@ -14812,7 +14816,7 @@
<target state="new">WTD</target>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
<context context-type="linenumber">190</context>
<context context-type="linenumber">217</context>
</context-group>
</trans-unit>
<trans-unit id="358501326846847310" datatype="html">
@ -14820,7 +14824,7 @@
<target state="new">Month to date</target>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
<context context-type="linenumber">194</context>
<context context-type="linenumber">221</context>
</context-group>
</trans-unit>
<trans-unit id="399380803601269035" datatype="html">
@ -14828,7 +14832,7 @@
<target state="new">MTD</target>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
<context context-type="linenumber">194</context>
<context context-type="linenumber">221</context>
</context-group>
</trans-unit>
<trans-unit id="2593751087640318641" datatype="html">
@ -14836,7 +14840,7 @@
<target state="new">Year to date</target>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
<context context-type="linenumber">198</context>
<context context-type="linenumber">225</context>
</context-group>
</trans-unit>
<trans-unit id="6829218544e108e152f5fa72cb79c4ccb82e0d06" datatype="html">
@ -14880,7 +14884,7 @@
<target state="new">year</target>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
<context context-type="linenumber">202</context>
<context context-type="linenumber">229</context>
</context-group>
</trans-unit>
<trans-unit id="7658073495909471632" datatype="html">
@ -14888,7 +14892,7 @@
<target state="new">years</target>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
<context context-type="linenumber">206</context>
<context context-type="linenumber">233</context>
</context-group>
</trans-unit>
<trans-unit id="7b5a5b1697006355467454025b820fd98de32074" datatype="html">
@ -14972,7 +14976,7 @@
<target state="new">Oops! It looks like youre making too many requests. Please slow down a bit.</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/core/http-response.interceptor.ts</context>
<context context-type="linenumber">105</context>
<context context-type="linenumber">107</context>
</context-group>
</trans-unit>
<trans-unit id="myAccount" datatype="html">
@ -15020,7 +15024,23 @@
<target state="new">Execute Job</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">151</context>
<context context-type="linenumber">183</context>
</context-group>
</trans-unit>
<trans-unit id="b74af38005e8a8914e45af2ec412e11ceafef8b6" datatype="html">
<source>Priority</source>
<target state="new">Priority</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">63</context>
</context-group>
</trans-unit>
<trans-unit id="8236987838684066590" datatype="html">
<source>This action is not allowed.</source>
<target state="new">This action is not allowed.</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/core/http-response.interceptor.ts</context>
<context context-type="linenumber">70</context>
</context-group>
</trans-unit>
</body>

View File

@ -274,7 +274,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/account-balances/account-balances.component.html</context>
<context context-type="linenumber">20</context>
<context context-type="linenumber">34</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/activities-table/activities-table.component.html</context>
@ -350,7 +350,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/account-balances/account-balances.component.html</context>
<context context-type="linenumber">51</context>
<context context-type="linenumber">80</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/activities-table/activities-table.component.html</context>
@ -410,7 +410,7 @@
<target state="translated">Tentativas</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">63</context>
<context context-type="linenumber">82</context>
</context-group>
</trans-unit>
<trans-unit id="1b051734b0ee9021991c91b3ed4e81c244322462" datatype="html">
@ -418,7 +418,7 @@
<target state="translated">Criado</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">72</context>
<context context-type="linenumber">91</context>
</context-group>
</trans-unit>
<trans-unit id="edcc19a49c950289ffe5d38be4843cdf194e5622" datatype="html">
@ -426,7 +426,7 @@
<target state="translated">Terminado</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">81</context>
<context context-type="linenumber">100</context>
</context-group>
</trans-unit>
<trans-unit id="81b97b8ea996ad1e4f9fca8415021850214884b1" datatype="html">
@ -434,7 +434,7 @@
<target state="translated">Estado</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">90</context>
<context context-type="linenumber">109</context>
</context-group>
</trans-unit>
<trans-unit id="056853138da25939da59abfb432ed2316fe50934" datatype="html">
@ -442,7 +442,7 @@
<target state="translated">Eliminar Tarefas</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">126</context>
<context context-type="linenumber">158</context>
</context-group>
</trans-unit>
<trans-unit id="db287ecf48f50d8a83c1dbdcee6282723b4cd9ad" datatype="html">
@ -466,7 +466,7 @@
<target state="translated">Visualizar dados</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">141</context>
<context context-type="linenumber">173</context>
</context-group>
</trans-unit>
<trans-unit id="94e6ec0f0d021b88dfa4ef191447315fc1898f00" datatype="html">
@ -474,7 +474,7 @@
<target state="translated">Ver Stacktrace</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">148</context>
<context context-type="linenumber">180</context>
</context-group>
</trans-unit>
<trans-unit id="de50f7bcb18ed16c00012741202155acb5c61acf" datatype="html">
@ -482,7 +482,7 @@
<target state="translated">Apagar Tarefa</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">154</context>
<context context-type="linenumber">186</context>
</context-group>
</trans-unit>
<trans-unit id="bfb6a28329c452254e363723ef9718b5178dfd1d" datatype="html">
@ -506,7 +506,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/account-balances/account-balances.component.html</context>
<context context-type="linenumber">11</context>
<context context-type="linenumber">12</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/activities-table/activities-table.component.html</context>
@ -856,6 +856,10 @@
<context context-type="sourcefile">apps/client/src/app/components/admin-overview/admin-overview.html</context>
<context context-type="linenumber">231</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/account-balances/account-balances.component.html</context>
<context context-type="linenumber">93</context>
</context-group>
</trans-unit>
<trans-unit id="e799e6b926557f0098f41888cdf8df868eff3d47" datatype="html">
<source>Housekeeping</source>
@ -1446,7 +1450,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/core/http-response.interceptor.ts</context>
<context context-type="linenumber">68</context>
<context context-type="linenumber">69</context>
</context-group>
</trans-unit>
<trans-unit id="5499742151525073097" datatype="html">
@ -1458,7 +1462,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/core/http-response.interceptor.ts</context>
<context context-type="linenumber">70</context>
<context context-type="linenumber">72</context>
</context-group>
</trans-unit>
<trans-unit id="a8233de047500bf0f0d9f9f1712ddb071501a283" datatype="html">
@ -1474,7 +1478,7 @@
<target state="translated">Depósito</target>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/fire-calculator/fire-calculator.component.ts</context>
<context context-type="linenumber">332</context>
<context context-type="linenumber">357</context>
</context-group>
</trans-unit>
<trans-unit id="112783260724635106" datatype="html">
@ -1901,7 +1905,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
<context context-type="linenumber">188</context>
<context context-type="linenumber">215</context>
</context-group>
</trans-unit>
<trans-unit id="7377728350294749129" datatype="html">
@ -1913,7 +1917,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
<context context-type="linenumber">198</context>
<context context-type="linenumber">225</context>
</context-group>
</trans-unit>
<trans-unit id="8768104874317770689" datatype="html">
@ -1925,7 +1929,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
<context context-type="linenumber">202</context>
<context context-type="linenumber">229</context>
</context-group>
</trans-unit>
<trans-unit id="7304247106520037555" datatype="html">
@ -1937,7 +1941,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
<context context-type="linenumber">206</context>
<context context-type="linenumber">233</context>
</context-group>
</trans-unit>
<trans-unit id="3667949571823271511" datatype="html">
@ -1949,7 +1953,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
<context context-type="linenumber">209</context>
<context context-type="linenumber">236</context>
</context-group>
</trans-unit>
<trans-unit id="4190182554887994764" datatype="html">
@ -1969,7 +1973,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/core/http-response.interceptor.ts</context>
<context context-type="linenumber">89</context>
<context context-type="linenumber">91</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts</context>
@ -1981,7 +1985,7 @@
<target state="translated">Oops! Ocorreu um erro.</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/core/http-response.interceptor.ts</context>
<context context-type="linenumber">87</context>
<context context-type="linenumber">89</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts</context>
@ -1993,7 +1997,7 @@
<target state="translated">OK</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/core/http-response.interceptor.ts</context>
<context context-type="linenumber">90</context>
<context context-type="linenumber">92</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts</context>
@ -3137,7 +3141,7 @@
<target state="translated">Deseja realmente eliminar esta atividade?</target>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/activities-table/activities-table.component.ts</context>
<context context-type="linenumber">175</context>
<context context-type="linenumber">215</context>
</context-group>
</trans-unit>
<trans-unit id="170f7de02b14690fb9c1999a16926c0044bfd5c1" datatype="html">
@ -3185,7 +3189,7 @@
<target state="translated">Juros</target>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/fire-calculator/fire-calculator.component.ts</context>
<context context-type="linenumber">342</context>
<context context-type="linenumber">367</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/i18n.ts</context>
@ -3197,7 +3201,7 @@
<target state="translated">Poupanças</target>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/fire-calculator/fire-calculator.component.ts</context>
<context context-type="linenumber">352</context>
<context context-type="linenumber">377</context>
</context-group>
</trans-unit>
<trans-unit id="4086606389696938932" datatype="html">
@ -3233,7 +3237,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts</context>
<context context-type="linenumber">385</context>
<context context-type="linenumber">389</context>
</context-group>
</trans-unit>
<trans-unit id="8106025670158480144" datatype="html">
@ -3409,11 +3413,11 @@
<target state="translated">Sem dados disponíveis</target>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts</context>
<context context-type="linenumber">387</context>
<context context-type="linenumber">391</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts</context>
<context context-type="linenumber">400</context>
<context context-type="linenumber">404</context>
</context-group>
</trans-unit>
<trans-unit id="064d88bead9e71bd849ecaefd8b38cca8f195a88" datatype="html">
@ -4105,7 +4109,7 @@
<target state="translated">Deseja mesmo eliminar todas as suas atividades?</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/activities/activities-page.component.ts</context>
<context context-type="linenumber">171</context>
<context context-type="linenumber">168</context>
</context-group>
</trans-unit>
<trans-unit id="166ccc92e1aa598f9056a260be209a0bab64d37a" datatype="html">
@ -11149,7 +11153,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/core/http-response.interceptor.ts</context>
<context context-type="linenumber">81</context>
<context context-type="linenumber">83</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/blog/2021/07/hallo-ghostfolio/hallo-ghostfolio-page.component.ts</context>
@ -11185,7 +11189,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/membership-card/membership-card.component.ts</context>
<context context-type="linenumber">13</context>
<context context-type="linenumber">25</context>
</context-group>
</trans-unit>
<trans-unit id="5915338689523424386" datatype="html">
@ -13433,7 +13437,7 @@
<target state="new">Find holding...</target>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
<context context-type="linenumber">111</context>
<context context-type="linenumber">138</context>
</context-group>
</trans-unit>
<trans-unit id="cd206f0509271d9e611747bef0713c7df048d3af" datatype="html">
@ -14633,7 +14637,7 @@
<target state="new">Do you really want to delete this account balance?</target>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/account-balances/account-balances.component.ts</context>
<context context-type="linenumber">58</context>
<context context-type="linenumber">104</context>
</context-group>
</trans-unit>
<trans-unit id="3860727927683017623" datatype="html">
@ -14801,7 +14805,7 @@
<target state="new">Week to date</target>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
<context context-type="linenumber">190</context>
<context context-type="linenumber">217</context>
</context-group>
</trans-unit>
<trans-unit id="7451343426685730864" datatype="html">
@ -14809,7 +14813,7 @@
<target state="new">WTD</target>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
<context context-type="linenumber">190</context>
<context context-type="linenumber">217</context>
</context-group>
</trans-unit>
<trans-unit id="358501326846847310" datatype="html">
@ -14817,7 +14821,7 @@
<target state="new">Month to date</target>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
<context context-type="linenumber">194</context>
<context context-type="linenumber">221</context>
</context-group>
</trans-unit>
<trans-unit id="399380803601269035" datatype="html">
@ -14825,7 +14829,7 @@
<target state="new">MTD</target>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
<context context-type="linenumber">194</context>
<context context-type="linenumber">221</context>
</context-group>
</trans-unit>
<trans-unit id="2593751087640318641" datatype="html">
@ -14833,7 +14837,7 @@
<target state="new">Year to date</target>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
<context context-type="linenumber">198</context>
<context context-type="linenumber">225</context>
</context-group>
</trans-unit>
<trans-unit id="6829218544e108e152f5fa72cb79c4ccb82e0d06" datatype="html">
@ -14877,7 +14881,7 @@
<target state="new">year</target>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
<context context-type="linenumber">202</context>
<context context-type="linenumber">229</context>
</context-group>
</trans-unit>
<trans-unit id="7658073495909471632" datatype="html">
@ -14885,7 +14889,7 @@
<target state="new">years</target>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
<context context-type="linenumber">206</context>
<context context-type="linenumber">233</context>
</context-group>
</trans-unit>
<trans-unit id="7b5a5b1697006355467454025b820fd98de32074" datatype="html">
@ -14969,7 +14973,7 @@
<target state="new">Oops! It looks like youre making too many requests. Please slow down a bit.</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/core/http-response.interceptor.ts</context>
<context context-type="linenumber">105</context>
<context context-type="linenumber">107</context>
</context-group>
</trans-unit>
<trans-unit id="myAccount" datatype="html">
@ -15017,7 +15021,23 @@
<target state="new">Execute Job</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">151</context>
<context context-type="linenumber">183</context>
</context-group>
</trans-unit>
<trans-unit id="b74af38005e8a8914e45af2ec412e11ceafef8b6" datatype="html">
<source>Priority</source>
<target state="new">Priority</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">63</context>
</context-group>
</trans-unit>
<trans-unit id="8236987838684066590" datatype="html">
<source>This action is not allowed.</source>
<target state="new">This action is not allowed.</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/core/http-response.interceptor.ts</context>
<context context-type="linenumber">70</context>
</context-group>
</trans-unit>
</body>

View File

@ -654,7 +654,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/core/http-response.interceptor.ts</context>
<context context-type="linenumber">81</context>
<context context-type="linenumber">83</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/blog/2021/07/hallo-ghostfolio/hallo-ghostfolio-page.component.ts</context>
@ -690,7 +690,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/membership-card/membership-card.component.ts</context>
<context context-type="linenumber">13</context>
<context context-type="linenumber">25</context>
</context-group>
</trans-unit>
<trans-unit id="6948811958230386934" datatype="html">
@ -1754,7 +1754,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/account-balances/account-balances.component.html</context>
<context context-type="linenumber">20</context>
<context context-type="linenumber">34</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/activities-table/activities-table.component.html</context>
@ -1830,7 +1830,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/account-balances/account-balances.component.html</context>
<context context-type="linenumber">51</context>
<context context-type="linenumber">80</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/activities-table/activities-table.component.html</context>
@ -1890,7 +1890,7 @@
<target state="translated">Deneme</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">63</context>
<context context-type="linenumber">82</context>
</context-group>
</trans-unit>
<trans-unit id="1b051734b0ee9021991c91b3ed4e81c244322462" datatype="html">
@ -1898,7 +1898,7 @@
<target state="translated">Oluşturuldu</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">72</context>
<context context-type="linenumber">91</context>
</context-group>
</trans-unit>
<trans-unit id="edcc19a49c950289ffe5d38be4843cdf194e5622" datatype="html">
@ -1906,7 +1906,7 @@
<target state="translated">Tamamlandı</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">81</context>
<context context-type="linenumber">100</context>
</context-group>
</trans-unit>
<trans-unit id="81b97b8ea996ad1e4f9fca8415021850214884b1" datatype="html">
@ -1914,7 +1914,7 @@
<target state="translated">Durum</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">90</context>
<context context-type="linenumber">109</context>
</context-group>
</trans-unit>
<trans-unit id="056853138da25939da59abfb432ed2316fe50934" datatype="html">
@ -1922,7 +1922,7 @@
<target state="translated">İşleri Sil</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">126</context>
<context context-type="linenumber">158</context>
</context-group>
</trans-unit>
<trans-unit id="db287ecf48f50d8a83c1dbdcee6282723b4cd9ad" datatype="html">
@ -1946,7 +1946,7 @@
<target state="translated">Veri Gör</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">141</context>
<context context-type="linenumber">173</context>
</context-group>
</trans-unit>
<trans-unit id="94e6ec0f0d021b88dfa4ef191447315fc1898f00" datatype="html">
@ -1954,7 +1954,7 @@
<target state="translated">Hata İzini Görüntüle</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">148</context>
<context context-type="linenumber">180</context>
</context-group>
</trans-unit>
<trans-unit id="de50f7bcb18ed16c00012741202155acb5c61acf" datatype="html">
@ -1962,7 +1962,7 @@
<target state="translated">İşleri Sil</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">154</context>
<context context-type="linenumber">186</context>
</context-group>
</trans-unit>
<trans-unit id="bfb6a28329c452254e363723ef9718b5178dfd1d" datatype="html">
@ -1986,7 +1986,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/account-balances/account-balances.component.html</context>
<context context-type="linenumber">11</context>
<context context-type="linenumber">12</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/activities-table/activities-table.component.html</context>
@ -2528,6 +2528,10 @@
<context context-type="sourcefile">apps/client/src/app/components/admin-overview/admin-overview.html</context>
<context context-type="linenumber">231</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/account-balances/account-balances.component.html</context>
<context context-type="linenumber">93</context>
</context-group>
</trans-unit>
<trans-unit id="e799e6b926557f0098f41888cdf8df868eff3d47" datatype="html">
<source>Housekeeping</source>
@ -2990,7 +2994,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/core/http-response.interceptor.ts</context>
<context context-type="linenumber">68</context>
<context context-type="linenumber">69</context>
</context-group>
</trans-unit>
<trans-unit id="5499742151525073097" datatype="html">
@ -3002,7 +3006,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/core/http-response.interceptor.ts</context>
<context context-type="linenumber">70</context>
<context context-type="linenumber">72</context>
</context-group>
</trans-unit>
<trans-unit id="a8233de047500bf0f0d9f9f1712ddb071501a283" datatype="html">
@ -3529,7 +3533,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
<context context-type="linenumber">188</context>
<context context-type="linenumber">215</context>
</context-group>
</trans-unit>
<trans-unit id="7377728350294749129" datatype="html">
@ -3541,7 +3545,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
<context context-type="linenumber">198</context>
<context context-type="linenumber">225</context>
</context-group>
</trans-unit>
<trans-unit id="8768104874317770689" datatype="html">
@ -3553,7 +3557,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
<context context-type="linenumber">202</context>
<context context-type="linenumber">229</context>
</context-group>
</trans-unit>
<trans-unit id="7304247106520037555" datatype="html">
@ -3565,7 +3569,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
<context context-type="linenumber">206</context>
<context context-type="linenumber">233</context>
</context-group>
</trans-unit>
<trans-unit id="3667949571823271511" datatype="html">
@ -3577,7 +3581,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
<context context-type="linenumber">209</context>
<context context-type="linenumber">236</context>
</context-group>
</trans-unit>
<trans-unit id="4190182554887994764" datatype="html">
@ -3597,7 +3601,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/core/http-response.interceptor.ts</context>
<context context-type="linenumber">89</context>
<context context-type="linenumber">91</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts</context>
@ -3609,7 +3613,7 @@
<target state="translated">Hay Allah! Bir şeyler yanlış gitti.</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/core/http-response.interceptor.ts</context>
<context context-type="linenumber">87</context>
<context context-type="linenumber">89</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts</context>
@ -3621,7 +3625,7 @@
<target state="translated">Tamam</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/core/http-response.interceptor.ts</context>
<context context-type="linenumber">90</context>
<context context-type="linenumber">92</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts</context>
@ -4453,7 +4457,7 @@
<target state="translated">Tüm işlemlerinizi silmeyi gerçekten istiyor musunuz?</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/activities/activities-page.component.ts</context>
<context context-type="linenumber">171</context>
<context context-type="linenumber">168</context>
</context-group>
</trans-unit>
<trans-unit id="72ba3bcdd8350cb8bf462e217a28ec7f7a48bb44" datatype="html">
@ -4873,7 +4877,7 @@
<target state="translated">Para Yatırma</target>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/fire-calculator/fire-calculator.component.ts</context>
<context context-type="linenumber">332</context>
<context context-type="linenumber">357</context>
</context-group>
</trans-unit>
<trans-unit id="6762743264882388498" datatype="html">
@ -12669,7 +12673,7 @@
<target state="translated">TBu işlemi silmeyi gerçekten istiyor musunuz?</target>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/activities-table/activities-table.component.ts</context>
<context context-type="linenumber">175</context>
<context context-type="linenumber">215</context>
</context-group>
</trans-unit>
<trans-unit id="170f7de02b14690fb9c1999a16926c0044bfd5c1" datatype="html">
@ -12741,7 +12745,7 @@
<target state="translated">Faiz</target>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/fire-calculator/fire-calculator.component.ts</context>
<context context-type="linenumber">342</context>
<context context-type="linenumber">367</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/i18n.ts</context>
@ -12753,7 +12757,7 @@
<target state="translated">Tasarruflar</target>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/fire-calculator/fire-calculator.component.ts</context>
<context context-type="linenumber">352</context>
<context context-type="linenumber">377</context>
</context-group>
</trans-unit>
<trans-unit id="2ee26d58f2707416e636887111d5603b35346c4a" datatype="html">
@ -12909,7 +12913,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts</context>
<context context-type="linenumber">385</context>
<context context-type="linenumber">389</context>
</context-group>
</trans-unit>
<trans-unit id="6333857424161463201" datatype="html">
@ -13157,11 +13161,11 @@
<target state="new">No data available</target>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts</context>
<context context-type="linenumber">387</context>
<context context-type="linenumber">391</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts</context>
<context context-type="linenumber">400</context>
<context context-type="linenumber">404</context>
</context-group>
</trans-unit>
<trans-unit id="1c0638816928ae45284e60504936ca985960df5c" datatype="html">
@ -13433,7 +13437,7 @@
<target state="new">Find holding...</target>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
<context context-type="linenumber">111</context>
<context context-type="linenumber">138</context>
</context-group>
</trans-unit>
<trans-unit id="cd206f0509271d9e611747bef0713c7df048d3af" datatype="html">
@ -14633,7 +14637,7 @@
<target state="new">Do you really want to delete this account balance?</target>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/account-balances/account-balances.component.ts</context>
<context context-type="linenumber">58</context>
<context context-type="linenumber">104</context>
</context-group>
</trans-unit>
<trans-unit id="3860727927683017623" datatype="html">
@ -14801,7 +14805,7 @@
<target state="new">Week to date</target>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
<context context-type="linenumber">190</context>
<context context-type="linenumber">217</context>
</context-group>
</trans-unit>
<trans-unit id="7451343426685730864" datatype="html">
@ -14809,7 +14813,7 @@
<target state="new">WTD</target>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
<context context-type="linenumber">190</context>
<context context-type="linenumber">217</context>
</context-group>
</trans-unit>
<trans-unit id="358501326846847310" datatype="html">
@ -14817,7 +14821,7 @@
<target state="new">Month to date</target>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
<context context-type="linenumber">194</context>
<context context-type="linenumber">221</context>
</context-group>
</trans-unit>
<trans-unit id="399380803601269035" datatype="html">
@ -14825,7 +14829,7 @@
<target state="new">MTD</target>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
<context context-type="linenumber">194</context>
<context context-type="linenumber">221</context>
</context-group>
</trans-unit>
<trans-unit id="2593751087640318641" datatype="html">
@ -14833,7 +14837,7 @@
<target state="new">Year to date</target>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
<context context-type="linenumber">198</context>
<context context-type="linenumber">225</context>
</context-group>
</trans-unit>
<trans-unit id="6829218544e108e152f5fa72cb79c4ccb82e0d06" datatype="html">
@ -14877,7 +14881,7 @@
<target state="new">year</target>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
<context context-type="linenumber">202</context>
<context context-type="linenumber">229</context>
</context-group>
</trans-unit>
<trans-unit id="7658073495909471632" datatype="html">
@ -14885,7 +14889,7 @@
<target state="new">years</target>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
<context context-type="linenumber">206</context>
<context context-type="linenumber">233</context>
</context-group>
</trans-unit>
<trans-unit id="7b5a5b1697006355467454025b820fd98de32074" datatype="html">
@ -14969,7 +14973,7 @@
<target state="new">Oops! It looks like youre making too many requests. Please slow down a bit.</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/core/http-response.interceptor.ts</context>
<context context-type="linenumber">105</context>
<context context-type="linenumber">107</context>
</context-group>
</trans-unit>
<trans-unit id="myAccount" datatype="html">
@ -15017,7 +15021,23 @@
<target state="new">Execute Job</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">151</context>
<context context-type="linenumber">183</context>
</context-group>
</trans-unit>
<trans-unit id="b74af38005e8a8914e45af2ec412e11ceafef8b6" datatype="html">
<source>Priority</source>
<target state="new">Priority</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">63</context>
</context-group>
</trans-unit>
<trans-unit id="8236987838684066590" datatype="html">
<source>This action is not allowed.</source>
<target state="new">This action is not allowed.</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/core/http-response.interceptor.ts</context>
<context context-type="linenumber">70</context>
</context-group>
</trans-unit>
</body>

View File

@ -649,7 +649,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/core/http-response.interceptor.ts</context>
<context context-type="linenumber">81</context>
<context context-type="linenumber">83</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/blog/2021/07/hallo-ghostfolio/hallo-ghostfolio-page.component.ts</context>
@ -685,7 +685,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/membership-card/membership-card.component.ts</context>
<context context-type="linenumber">13</context>
<context context-type="linenumber">25</context>
</context-group>
</trans-unit>
<trans-unit id="6948811958230386934" datatype="html">
@ -1759,7 +1759,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/account-balances/account-balances.component.html</context>
<context context-type="linenumber">20</context>
<context context-type="linenumber">34</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/activities-table/activities-table.component.html</context>
@ -1833,7 +1833,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/account-balances/account-balances.component.html</context>
<context context-type="linenumber">51</context>
<context context-type="linenumber">80</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/activities-table/activities-table.component.html</context>
@ -1903,56 +1903,56 @@
<source>Attempts</source>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">63</context>
<context context-type="linenumber">82</context>
</context-group>
</trans-unit>
<trans-unit id="1b051734b0ee9021991c91b3ed4e81c244322462" datatype="html">
<source>Created</source>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">72</context>
<context context-type="linenumber">91</context>
</context-group>
</trans-unit>
<trans-unit id="edcc19a49c950289ffe5d38be4843cdf194e5622" datatype="html">
<source>Finished</source>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">81</context>
<context context-type="linenumber">100</context>
</context-group>
</trans-unit>
<trans-unit id="81b97b8ea996ad1e4f9fca8415021850214884b1" datatype="html">
<source>Status</source>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">90</context>
<context context-type="linenumber">109</context>
</context-group>
</trans-unit>
<trans-unit id="056853138da25939da59abfb432ed2316fe50934" datatype="html">
<source>Delete Jobs</source>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">126</context>
<context context-type="linenumber">158</context>
</context-group>
</trans-unit>
<trans-unit id="30afc50625f30e4ac97acc23fd7e77031a341a8f" datatype="html">
<source>View Data</source>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">141</context>
<context context-type="linenumber">173</context>
</context-group>
</trans-unit>
<trans-unit id="94e6ec0f0d021b88dfa4ef191447315fc1898f00" datatype="html">
<source>View Stacktrace</source>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">148</context>
<context context-type="linenumber">180</context>
</context-group>
</trans-unit>
<trans-unit id="de50f7bcb18ed16c00012741202155acb5c61acf" datatype="html">
<source>Delete Job</source>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">154</context>
<context context-type="linenumber">186</context>
</context-group>
</trans-unit>
<trans-unit id="bfb6a28329c452254e363723ef9718b5178dfd1d" datatype="html">
@ -1974,7 +1974,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/account-balances/account-balances.component.html</context>
<context context-type="linenumber">11</context>
<context context-type="linenumber">12</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/activities-table/activities-table.component.html</context>
@ -2523,6 +2523,10 @@
<context context-type="sourcefile">apps/client/src/app/components/admin-overview/admin-overview.html</context>
<context context-type="linenumber">231</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/account-balances/account-balances.component.html</context>
<context context-type="linenumber">93</context>
</context-group>
</trans-unit>
<trans-unit id="e799e6b926557f0098f41888cdf8df868eff3d47" datatype="html">
<source>Housekeeping</source>
@ -2992,7 +2996,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/core/http-response.interceptor.ts</context>
<context context-type="linenumber">68</context>
<context context-type="linenumber">69</context>
</context-group>
</trans-unit>
<trans-unit id="5499742151525073097" datatype="html">
@ -3003,7 +3007,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/core/http-response.interceptor.ts</context>
<context context-type="linenumber">70</context>
<context context-type="linenumber">72</context>
</context-group>
</trans-unit>
<trans-unit id="a8233de047500bf0f0d9f9f1712ddb071501a283" datatype="html">
@ -3488,7 +3492,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
<context context-type="linenumber">188</context>
<context context-type="linenumber">215</context>
</context-group>
</trans-unit>
<trans-unit id="7377728350294749129" datatype="html">
@ -3499,7 +3503,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
<context context-type="linenumber">198</context>
<context context-type="linenumber">225</context>
</context-group>
</trans-unit>
<trans-unit id="8768104874317770689" datatype="html">
@ -3510,7 +3514,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
<context context-type="linenumber">202</context>
<context context-type="linenumber">229</context>
</context-group>
</trans-unit>
<trans-unit id="7304247106520037555" datatype="html">
@ -3521,7 +3525,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
<context context-type="linenumber">206</context>
<context context-type="linenumber">233</context>
</context-group>
</trans-unit>
<trans-unit id="3667949571823271511" datatype="html">
@ -3532,7 +3536,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
<context context-type="linenumber">209</context>
<context context-type="linenumber">236</context>
</context-group>
</trans-unit>
<trans-unit id="5e41f1b4c46ad9e0a9bc83fa36445483aa5cc324" datatype="html">
@ -3779,7 +3783,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/core/http-response.interceptor.ts</context>
<context context-type="linenumber">89</context>
<context context-type="linenumber">91</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts</context>
@ -3790,7 +3794,7 @@
<source>Oops! Something went wrong.</source>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/core/http-response.interceptor.ts</context>
<context context-type="linenumber">87</context>
<context context-type="linenumber">89</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts</context>
@ -3801,7 +3805,7 @@
<source>Okay</source>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/core/http-response.interceptor.ts</context>
<context context-type="linenumber">90</context>
<context context-type="linenumber">92</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts</context>
@ -4615,7 +4619,7 @@
<source>Do you really want to delete all your activities?</source>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/activities/activities-page.component.ts</context>
<context context-type="linenumber">171</context>
<context context-type="linenumber">168</context>
</context-group>
</trans-unit>
<trans-unit id="72ba3bcdd8350cb8bf462e217a28ec7f7a48bb44" datatype="html">
@ -5011,7 +5015,7 @@
<source>Deposit</source>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/fire-calculator/fire-calculator.component.ts</context>
<context context-type="linenumber">332</context>
<context context-type="linenumber">357</context>
</context-group>
</trans-unit>
<trans-unit id="6762743264882388498" datatype="html">
@ -13459,7 +13463,7 @@
<source>Do you really want to delete this account balance?</source>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/account-balances/account-balances.component.ts</context>
<context context-type="linenumber">58</context>
<context context-type="linenumber">104</context>
</context-group>
</trans-unit>
<trans-unit id="ed1d0d3031aba025b9bf280c1d7c54f44982ed46" datatype="html">
@ -13538,14 +13542,14 @@
<source>Do you really want to delete this activity?</source>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/activities-table/activities-table.component.ts</context>
<context context-type="linenumber">175</context>
<context context-type="linenumber">215</context>
</context-group>
</trans-unit>
<trans-unit id="4149127798893455354" datatype="html">
<source>Find holding...</source>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
<context context-type="linenumber">111</context>
<context context-type="linenumber">138</context>
</context-group>
</trans-unit>
<trans-unit id="cd206f0509271d9e611747bef0713c7df048d3af" datatype="html">
@ -13647,7 +13651,7 @@
<source>Interest</source>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/fire-calculator/fire-calculator.component.ts</context>
<context context-type="linenumber">342</context>
<context context-type="linenumber">367</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/i18n.ts</context>
@ -13658,7 +13662,7 @@
<source>Savings</source>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/fire-calculator/fire-calculator.component.ts</context>
<context context-type="linenumber">352</context>
<context context-type="linenumber">377</context>
</context-group>
</trans-unit>
<trans-unit id="2ee26d58f2707416e636887111d5603b35346c4a" datatype="html">
@ -13795,7 +13799,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts</context>
<context context-type="linenumber">385</context>
<context context-type="linenumber">389</context>
</context-group>
</trans-unit>
<trans-unit id="6333857424161463201" datatype="html">
@ -14054,11 +14058,11 @@
<source>No data available</source>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts</context>
<context context-type="linenumber">387</context>
<context context-type="linenumber">391</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts</context>
<context context-type="linenumber">400</context>
<context context-type="linenumber">404</context>
</context-group>
</trans-unit>
<trans-unit id="54bb0580a9f9e5cf80f61c5e94aaabb70c8b1f01" datatype="html">
@ -14200,35 +14204,35 @@
<source>Year to date</source>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
<context context-type="linenumber">198</context>
<context context-type="linenumber">225</context>
</context-group>
</trans-unit>
<trans-unit id="3105754554141014845" datatype="html">
<source>Week to date</source>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
<context context-type="linenumber">190</context>
<context context-type="linenumber">217</context>
</context-group>
</trans-unit>
<trans-unit id="358501326846847310" datatype="html">
<source>Month to date</source>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
<context context-type="linenumber">194</context>
<context context-type="linenumber">221</context>
</context-group>
</trans-unit>
<trans-unit id="399380803601269035" datatype="html">
<source>MTD</source>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
<context context-type="linenumber">194</context>
<context context-type="linenumber">221</context>
</context-group>
</trans-unit>
<trans-unit id="7451343426685730864" datatype="html">
<source>WTD</source>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
<context context-type="linenumber">190</context>
<context context-type="linenumber">217</context>
</context-group>
</trans-unit>
<trans-unit id="051f7201e65df238102b8f33aeb2f993bba280bb" datatype="html">
@ -14267,14 +14271,14 @@
<source>year</source>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
<context context-type="linenumber">202</context>
<context context-type="linenumber">229</context>
</context-group>
</trans-unit>
<trans-unit id="7658073495909471632" datatype="html">
<source>years</source>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
<context context-type="linenumber">206</context>
<context context-type="linenumber">233</context>
</context-group>
</trans-unit>
<trans-unit id="73864299814955e733ade6e3e7204548b7b9adae" datatype="html">
@ -14349,7 +14353,7 @@
<source>Oops! It looks like youre making too many requests. Please slow down a bit.</source>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/core/http-response.interceptor.ts</context>
<context context-type="linenumber">105</context>
<context context-type="linenumber">107</context>
</context-group>
</trans-unit>
<trans-unit id="myAccount" datatype="html">
@ -14391,7 +14395,21 @@
<source>Execute Job</source>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">151</context>
<context context-type="linenumber">183</context>
</context-group>
</trans-unit>
<trans-unit id="8236987838684066590" datatype="html">
<source>This action is not allowed.</source>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/core/http-response.interceptor.ts</context>
<context context-type="linenumber">70</context>
</context-group>
</trans-unit>
<trans-unit id="b74af38005e8a8914e45af2ec412e11ceafef8b6" datatype="html">
<source>Priority</source>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">63</context>
</context-group>
</trans-unit>
</body>

View File

@ -655,7 +655,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/core/http-response.interceptor.ts</context>
<context context-type="linenumber">81</context>
<context context-type="linenumber">83</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/blog/2021/07/hallo-ghostfolio/hallo-ghostfolio-page.component.ts</context>
@ -691,7 +691,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/membership-card/membership-card.component.ts</context>
<context context-type="linenumber">13</context>
<context context-type="linenumber">25</context>
</context-group>
</trans-unit>
<trans-unit id="6948811958230386934" datatype="html">
@ -1799,7 +1799,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/account-balances/account-balances.component.html</context>
<context context-type="linenumber">20</context>
<context context-type="linenumber">34</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/activities-table/activities-table.component.html</context>
@ -1875,7 +1875,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/account-balances/account-balances.component.html</context>
<context context-type="linenumber">51</context>
<context context-type="linenumber">80</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/activities-table/activities-table.component.html</context>
@ -1951,7 +1951,7 @@
<target state="translated">尝试</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">63</context>
<context context-type="linenumber">82</context>
</context-group>
</trans-unit>
<trans-unit id="1b051734b0ee9021991c91b3ed4e81c244322462" datatype="html">
@ -1959,7 +1959,7 @@
<target state="translated">创建</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">72</context>
<context context-type="linenumber">91</context>
</context-group>
</trans-unit>
<trans-unit id="edcc19a49c950289ffe5d38be4843cdf194e5622" datatype="html">
@ -1967,7 +1967,7 @@
<target state="translated">完成的</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">81</context>
<context context-type="linenumber">100</context>
</context-group>
</trans-unit>
<trans-unit id="81b97b8ea996ad1e4f9fca8415021850214884b1" datatype="html">
@ -1975,7 +1975,7 @@
<target state="translated">状况</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">90</context>
<context context-type="linenumber">109</context>
</context-group>
</trans-unit>
<trans-unit id="056853138da25939da59abfb432ed2316fe50934" datatype="html">
@ -1983,7 +1983,7 @@
<target state="translated">删除作业</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">126</context>
<context context-type="linenumber">158</context>
</context-group>
</trans-unit>
<trans-unit id="30afc50625f30e4ac97acc23fd7e77031a341a8f" datatype="html">
@ -1991,7 +1991,7 @@
<target state="translated">查看数据</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">141</context>
<context context-type="linenumber">173</context>
</context-group>
</trans-unit>
<trans-unit id="94e6ec0f0d021b88dfa4ef191447315fc1898f00" datatype="html">
@ -1999,7 +1999,7 @@
<target state="translated">查看堆栈跟踪</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">148</context>
<context context-type="linenumber">180</context>
</context-group>
</trans-unit>
<trans-unit id="de50f7bcb18ed16c00012741202155acb5c61acf" datatype="html">
@ -2007,7 +2007,7 @@
<target state="translated">删除作业</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">154</context>
<context context-type="linenumber">186</context>
</context-group>
</trans-unit>
<trans-unit id="bfb6a28329c452254e363723ef9718b5178dfd1d" datatype="html">
@ -2031,7 +2031,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/account-balances/account-balances.component.html</context>
<context context-type="linenumber">11</context>
<context context-type="linenumber">12</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/activities-table/activities-table.component.html</context>
@ -2633,6 +2633,10 @@
<context context-type="sourcefile">apps/client/src/app/components/admin-overview/admin-overview.html</context>
<context context-type="linenumber">231</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/account-balances/account-balances.component.html</context>
<context context-type="linenumber">93</context>
</context-group>
</trans-unit>
<trans-unit id="e799e6b926557f0098f41888cdf8df868eff3d47" datatype="html">
<source>Housekeeping</source>
@ -3155,7 +3159,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/core/http-response.interceptor.ts</context>
<context context-type="linenumber">68</context>
<context context-type="linenumber">69</context>
</context-group>
</trans-unit>
<trans-unit id="5499742151525073097" datatype="html">
@ -3167,7 +3171,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/core/http-response.interceptor.ts</context>
<context context-type="linenumber">70</context>
<context context-type="linenumber">72</context>
</context-group>
</trans-unit>
<trans-unit id="a8233de047500bf0f0d9f9f1712ddb071501a283" datatype="html">
@ -3705,7 +3709,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
<context context-type="linenumber">188</context>
<context context-type="linenumber">215</context>
</context-group>
</trans-unit>
<trans-unit id="7377728350294749129" datatype="html">
@ -3717,7 +3721,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
<context context-type="linenumber">198</context>
<context context-type="linenumber">225</context>
</context-group>
</trans-unit>
<trans-unit id="8768104874317770689" datatype="html">
@ -3729,7 +3733,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
<context context-type="linenumber">202</context>
<context context-type="linenumber">229</context>
</context-group>
</trans-unit>
<trans-unit id="7304247106520037555" datatype="html">
@ -3741,7 +3745,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
<context context-type="linenumber">206</context>
<context context-type="linenumber">233</context>
</context-group>
</trans-unit>
<trans-unit id="3667949571823271511" datatype="html">
@ -3753,7 +3757,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
<context context-type="linenumber">209</context>
<context context-type="linenumber">236</context>
</context-group>
</trans-unit>
<trans-unit id="5e41f1b4c46ad9e0a9bc83fa36445483aa5cc324" datatype="html">
@ -4033,7 +4037,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/core/http-response.interceptor.ts</context>
<context context-type="linenumber">89</context>
<context context-type="linenumber">91</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts</context>
@ -4045,7 +4049,7 @@
<target state="translated">哎呀!出了些问题。</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/core/http-response.interceptor.ts</context>
<context context-type="linenumber">87</context>
<context context-type="linenumber">89</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts</context>
@ -4057,7 +4061,7 @@
<target state="translated">好的</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/core/http-response.interceptor.ts</context>
<context context-type="linenumber">90</context>
<context context-type="linenumber">92</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts</context>
@ -4969,7 +4973,7 @@
<target state="translated">您真的要删除所有活动吗?</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/activities/activities-page.component.ts</context>
<context context-type="linenumber">171</context>
<context context-type="linenumber">168</context>
</context-group>
</trans-unit>
<trans-unit id="72ba3bcdd8350cb8bf462e217a28ec7f7a48bb44" datatype="html">
@ -5413,7 +5417,7 @@
<target state="translated">订金</target>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/fire-calculator/fire-calculator.component.ts</context>
<context context-type="linenumber">332</context>
<context context-type="linenumber">357</context>
</context-group>
</trans-unit>
<trans-unit id="6762743264882388498" datatype="html">
@ -13965,7 +13969,7 @@
<target state="translated">您确实要删除该帐户余额吗?</target>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/account-balances/account-balances.component.ts</context>
<context context-type="linenumber">58</context>
<context context-type="linenumber">104</context>
</context-group>
</trans-unit>
<trans-unit id="ed1d0d3031aba025b9bf280c1d7c54f44982ed46" datatype="html">
@ -14053,7 +14057,7 @@
<target state="translated">您确实要删除此活动吗?</target>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/activities-table/activities-table.component.ts</context>
<context context-type="linenumber">175</context>
<context context-type="linenumber">215</context>
</context-group>
</trans-unit>
<trans-unit id="4149127798893455354" datatype="html">
@ -14061,7 +14065,7 @@
<target state="translated">查找持有...</target>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
<context context-type="linenumber">111</context>
<context context-type="linenumber">138</context>
</context-group>
</trans-unit>
<trans-unit id="cd206f0509271d9e611747bef0713c7df048d3af" datatype="html">
@ -14177,7 +14181,7 @@
<target state="translated">利息</target>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/fire-calculator/fire-calculator.component.ts</context>
<context context-type="linenumber">342</context>
<context context-type="linenumber">367</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/i18n.ts</context>
@ -14189,7 +14193,7 @@
<target state="translated">储蓄</target>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/fire-calculator/fire-calculator.component.ts</context>
<context context-type="linenumber">352</context>
<context context-type="linenumber">377</context>
</context-group>
</trans-unit>
<trans-unit id="2ee26d58f2707416e636887111d5603b35346c4a" datatype="html">
@ -14345,7 +14349,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts</context>
<context context-type="linenumber">385</context>
<context context-type="linenumber">389</context>
</context-group>
</trans-unit>
<trans-unit id="6333857424161463201" datatype="html">
@ -14641,11 +14645,11 @@
<target state="translated">无可用数据</target>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts</context>
<context context-type="linenumber">387</context>
<context context-type="linenumber">391</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts</context>
<context context-type="linenumber">400</context>
<context context-type="linenumber">404</context>
</context-group>
</trans-unit>
<trans-unit id="54bb0580a9f9e5cf80f61c5e94aaabb70c8b1f01" datatype="html">
@ -14805,7 +14809,7 @@
<target state="translated">今年迄今为止</target>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
<context context-type="linenumber">198</context>
<context context-type="linenumber">225</context>
</context-group>
</trans-unit>
<trans-unit id="3105754554141014845" datatype="html">
@ -14813,7 +14817,7 @@
<target state="translated">本周至今</target>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
<context context-type="linenumber">190</context>
<context context-type="linenumber">217</context>
</context-group>
</trans-unit>
<trans-unit id="358501326846847310" datatype="html">
@ -14821,7 +14825,7 @@
<target state="translated">本月至今</target>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
<context context-type="linenumber">194</context>
<context context-type="linenumber">221</context>
</context-group>
</trans-unit>
<trans-unit id="399380803601269035" datatype="html">
@ -14829,7 +14833,7 @@
<target state="translated">最大输运量</target>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
<context context-type="linenumber">194</context>
<context context-type="linenumber">221</context>
</context-group>
</trans-unit>
<trans-unit id="7451343426685730864" datatype="html">
@ -14837,7 +14841,7 @@
<target state="translated">世界贸易组织</target>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
<context context-type="linenumber">190</context>
<context context-type="linenumber">217</context>
</context-group>
</trans-unit>
<trans-unit id="051f7201e65df238102b8f33aeb2f993bba280bb" datatype="html">
@ -14881,7 +14885,7 @@
<target state="translated">年</target>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
<context context-type="linenumber">202</context>
<context context-type="linenumber">229</context>
</context-group>
</trans-unit>
<trans-unit id="7658073495909471632" datatype="html">
@ -14889,7 +14893,7 @@
<target state="translated">年</target>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
<context context-type="linenumber">206</context>
<context context-type="linenumber">233</context>
</context-group>
</trans-unit>
<trans-unit id="73864299814955e733ade6e3e7204548b7b9adae" datatype="html">
@ -14973,7 +14977,7 @@
<target state="translated">哎呀!看来您提出了太多要求。请慢一点。</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/core/http-response.interceptor.ts</context>
<context context-type="linenumber">105</context>
<context context-type="linenumber">107</context>
</context-group>
</trans-unit>
<trans-unit id="myAccount" datatype="html">
@ -15021,7 +15025,23 @@
<target state="new">Execute Job</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">151</context>
<context context-type="linenumber">183</context>
</context-group>
</trans-unit>
<trans-unit id="b74af38005e8a8914e45af2ec412e11ceafef8b6" datatype="html">
<source>Priority</source>
<target state="new">Priority</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">63</context>
</context-group>
</trans-unit>
<trans-unit id="8236987838684066590" datatype="html">
<source>This action is not allowed.</source>
<target state="new">This action is not allowed.</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/core/http-response.interceptor.ts</context>
<context context-type="linenumber">70</context>
</context-group>
</trans-unit>
</body>

0
git-hooks/pre-commit Normal file → Executable file
View File

View File

@ -7,6 +7,7 @@ export interface SymbolMetrics {
currentValuesWithCurrencyEffect: {
[date: string]: Big;
};
feesWithCurrencyEffect: Big;
grossPerformance: Big;
grossPerformancePercentage: Big;
grossPerformancePercentageWithCurrencyEffect: Big;
@ -41,6 +42,12 @@ export interface SymbolMetrics {
timeWeightedInvestmentWithCurrencyEffect: Big;
totalDividend: Big;
totalDividendInBaseCurrency: Big;
totalInterest: Big;
totalInterestInBaseCurrency: Big;
totalInvestment: Big;
totalInvestmentWithCurrencyEffect: Big;
totalLiabilities: Big;
totalLiabilitiesInBaseCurrency: Big;
totalValuables: Big;
totalValuablesInBaseCurrency: Big;
}

Some files were not shown because too many files have changed in this diff Show More