Compare commits
9 Commits
Author | SHA1 | Date | |
---|---|---|---|
0f637a5d0f | |||
3f85c327f5 | |||
c2df99072d | |||
e8afbcad9c | |||
e6d8de781b | |||
6e1935899f | |||
169cb85b66 | |||
fe6658d0ac | |||
1f0381228e |
14
CHANGELOG.md
14
CHANGELOG.md
@ -5,6 +5,20 @@ 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).
|
||||
|
||||
## 1.202.0 - 07.10.2022
|
||||
|
||||
- Added support for a translated 4% rule in the _FIRE_ section
|
||||
|
||||
### Changed
|
||||
|
||||
- Improved the caching of the benchmarks in the markets overview (only cache if fetching was successful)
|
||||
- Improved the wording in the twitter bot service
|
||||
|
||||
### Fixed
|
||||
|
||||
- Fixed the support for cryptocurrencies having a symbol with less than 3 characters (e.g. `SC-USD`)
|
||||
- Fixed the text truncation in the value component
|
||||
|
||||
## 1.201.0 - 01.10.2022
|
||||
|
||||
### Added
|
||||
|
@ -95,11 +95,10 @@ export class AccountController {
|
||||
);
|
||||
|
||||
let accountsWithAggregations =
|
||||
await this.portfolioService.getAccountsWithAggregations(
|
||||
impersonationUserId || this.request.user.id,
|
||||
undefined,
|
||||
true
|
||||
);
|
||||
await this.portfolioService.getAccountsWithAggregations({
|
||||
userId: impersonationUserId || this.request.user.id,
|
||||
withExcludedAccounts: true
|
||||
});
|
||||
|
||||
if (
|
||||
impersonationUserId ||
|
||||
@ -139,11 +138,11 @@ export class AccountController {
|
||||
);
|
||||
|
||||
let accountsWithAggregations =
|
||||
await this.portfolioService.getAccountsWithAggregations(
|
||||
impersonationUserId || this.request.user.id,
|
||||
[{ id, type: 'ACCOUNT' }],
|
||||
true
|
||||
);
|
||||
await this.portfolioService.getAccountsWithAggregations({
|
||||
filters: [{ id, type: 'ACCOUNT' }],
|
||||
userId: impersonationUserId || this.request.user.id,
|
||||
withExcludedAccounts: true
|
||||
});
|
||||
|
||||
if (
|
||||
impersonationUserId ||
|
||||
|
@ -73,6 +73,7 @@ export class BenchmarkService {
|
||||
}
|
||||
|
||||
const allTimeHighs = await Promise.all(promises);
|
||||
let storeInCache = true;
|
||||
|
||||
benchmarks = allTimeHighs.map((allTimeHigh, index) => {
|
||||
const { marketPrice } =
|
||||
@ -85,6 +86,8 @@ export class BenchmarkService {
|
||||
allTimeHigh,
|
||||
marketPrice
|
||||
);
|
||||
} else {
|
||||
storeInCache = false;
|
||||
}
|
||||
|
||||
return {
|
||||
@ -100,11 +103,13 @@ export class BenchmarkService {
|
||||
};
|
||||
});
|
||||
|
||||
await this.redisCacheService.set(
|
||||
this.CACHE_KEY_BENCHMARKS,
|
||||
JSON.stringify(benchmarks),
|
||||
ms('4 hours') / 1000
|
||||
);
|
||||
if (storeInCache) {
|
||||
await this.redisCacheService.set(
|
||||
this.CACHE_KEY_BENCHMARKS,
|
||||
JSON.stringify(benchmarks),
|
||||
ms('4 hours') / 1000
|
||||
);
|
||||
}
|
||||
|
||||
return benchmarks;
|
||||
}
|
||||
|
@ -3,8 +3,8 @@ import { nullifyValuesInObjects } from '@ghostfolio/api/helper/object.helper';
|
||||
import { RedactValuesInResponseInterceptor } from '@ghostfolio/api/interceptors/redact-values-in-response.interceptor';
|
||||
import { TransformDataSourceInRequestInterceptor } from '@ghostfolio/api/interceptors/transform-data-source-in-request.interceptor';
|
||||
import { TransformDataSourceInResponseInterceptor } from '@ghostfolio/api/interceptors/transform-data-source-in-response.interceptor';
|
||||
import { ApiService } from '@ghostfolio/api/services/api/api.service';
|
||||
import { ImpersonationService } from '@ghostfolio/api/services/impersonation.service';
|
||||
import { Filter } from '@ghostfolio/common/interfaces';
|
||||
import { hasPermission, permissions } from '@ghostfolio/common/permissions';
|
||||
import type { RequestWithUser } from '@ghostfolio/common/types';
|
||||
import {
|
||||
@ -36,6 +36,7 @@ import { UpdateOrderDto } from './update-order.dto';
|
||||
@Controller('order')
|
||||
export class OrderController {
|
||||
public constructor(
|
||||
private readonly apiService: ApiService,
|
||||
private readonly impersonationService: ImpersonationService,
|
||||
private readonly orderService: OrderService,
|
||||
@Inject(REQUEST) private readonly request: RequestWithUser,
|
||||
@ -73,30 +74,11 @@ export class OrderController {
|
||||
@Query('assetClasses') filterByAssetClasses?: string,
|
||||
@Query('tags') filterByTags?: string
|
||||
): Promise<Activities> {
|
||||
const accountIds = filterByAccounts?.split(',') ?? [];
|
||||
const assetClasses = filterByAssetClasses?.split(',') ?? [];
|
||||
const tagIds = filterByTags?.split(',') ?? [];
|
||||
|
||||
const filters: Filter[] = [
|
||||
...accountIds.map((accountId) => {
|
||||
return <Filter>{
|
||||
id: accountId,
|
||||
type: 'ACCOUNT'
|
||||
};
|
||||
}),
|
||||
...assetClasses.map((assetClass) => {
|
||||
return <Filter>{
|
||||
id: assetClass,
|
||||
type: 'ASSET_CLASS'
|
||||
};
|
||||
}),
|
||||
...tagIds.map((tagId) => {
|
||||
return <Filter>{
|
||||
id: tagId,
|
||||
type: 'TAG'
|
||||
};
|
||||
})
|
||||
];
|
||||
const filters = this.apiService.buildFiltersFromQueryParams({
|
||||
filterByAccounts,
|
||||
filterByAssetClasses,
|
||||
filterByTags
|
||||
});
|
||||
|
||||
const impersonationUserId =
|
||||
await this.impersonationService.validateImpersonationId(
|
||||
|
@ -2,6 +2,7 @@ import { AccountService } from '@ghostfolio/api/app/account/account.service';
|
||||
import { CacheModule } from '@ghostfolio/api/app/cache/cache.module';
|
||||
import { RedisCacheModule } from '@ghostfolio/api/app/redis-cache/redis-cache.module';
|
||||
import { UserModule } from '@ghostfolio/api/app/user/user.module';
|
||||
import { ApiModule } from '@ghostfolio/api/services/api/api.module';
|
||||
import { ConfigurationModule } from '@ghostfolio/api/services/configuration.module';
|
||||
import { DataGatheringModule } from '@ghostfolio/api/services/data-gathering.module';
|
||||
import { DataProviderModule } from '@ghostfolio/api/services/data-provider/data-provider.module';
|
||||
@ -18,6 +19,7 @@ import { OrderService } from './order.service';
|
||||
controllers: [OrderController],
|
||||
exports: [OrderService],
|
||||
imports: [
|
||||
ApiModule,
|
||||
CacheModule,
|
||||
ConfigurationModule,
|
||||
DataGatheringModule,
|
||||
|
@ -7,18 +7,17 @@ import {
|
||||
import { RedactValuesInResponseInterceptor } from '@ghostfolio/api/interceptors/redact-values-in-response.interceptor';
|
||||
import { TransformDataSourceInRequestInterceptor } from '@ghostfolio/api/interceptors/transform-data-source-in-request.interceptor';
|
||||
import { TransformDataSourceInResponseInterceptor } from '@ghostfolio/api/interceptors/transform-data-source-in-response.interceptor';
|
||||
import { ApiService } from '@ghostfolio/api/services/api/api.service';
|
||||
import { ConfigurationService } from '@ghostfolio/api/services/configuration.service';
|
||||
import { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate-data.service';
|
||||
import { parseDate } from '@ghostfolio/common/helper';
|
||||
import {
|
||||
Filter,
|
||||
PortfolioChart,
|
||||
PortfolioDetails,
|
||||
PortfolioInvestments,
|
||||
PortfolioPerformanceResponse,
|
||||
PortfolioPublicDetails,
|
||||
PortfolioReport,
|
||||
PortfolioSummary
|
||||
PortfolioReport
|
||||
} from '@ghostfolio/common/interfaces';
|
||||
import { InvestmentItem } from '@ghostfolio/common/interfaces/investment-item.interface';
|
||||
import type {
|
||||
@ -52,6 +51,7 @@ export class PortfolioController {
|
||||
|
||||
public constructor(
|
||||
private readonly accessService: AccessService,
|
||||
private readonly apiService: ApiService,
|
||||
private readonly configurationService: ConfigurationService,
|
||||
private readonly exchangeRateDataService: ExchangeRateDataService,
|
||||
private readonly portfolioService: PortfolioService,
|
||||
@ -123,32 +123,11 @@ export class PortfolioController {
|
||||
): Promise<PortfolioDetails & { hasError: boolean }> {
|
||||
let hasError = false;
|
||||
|
||||
const accountIds = filterByAccounts?.split(',') ?? [];
|
||||
const assetClasses = filterByAssetClasses?.split(',') ?? [];
|
||||
const tagIds = filterByTags?.split(',') ?? [];
|
||||
|
||||
const filters: Filter[] = [
|
||||
...accountIds.map((accountId) => {
|
||||
return <Filter>{
|
||||
id: accountId,
|
||||
type: 'ACCOUNT'
|
||||
};
|
||||
}),
|
||||
...assetClasses.map((assetClass) => {
|
||||
return <Filter>{
|
||||
id: assetClass,
|
||||
type: 'ASSET_CLASS'
|
||||
};
|
||||
}),
|
||||
...tagIds.map((tagId) => {
|
||||
return <Filter>{
|
||||
id: tagId,
|
||||
type: 'TAG'
|
||||
};
|
||||
})
|
||||
];
|
||||
|
||||
let portfolioSummary: PortfolioSummary;
|
||||
const filters = this.apiService.buildFiltersFromQueryParams({
|
||||
filterByAccounts,
|
||||
filterByAssetClasses,
|
||||
filterByTags
|
||||
});
|
||||
|
||||
const {
|
||||
accounts,
|
||||
@ -158,18 +137,18 @@ export class PortfolioController {
|
||||
holdings,
|
||||
summary,
|
||||
totalValueInBaseCurrency
|
||||
} = await this.portfolioService.getDetails(
|
||||
} = await this.portfolioService.getDetails({
|
||||
filters,
|
||||
impersonationId,
|
||||
this.request.user.id,
|
||||
range,
|
||||
filters
|
||||
);
|
||||
dateRange: range,
|
||||
userId: this.request.user.id
|
||||
});
|
||||
|
||||
if (hasErrors || hasNotDefinedValuesInObject(holdings)) {
|
||||
hasError = true;
|
||||
}
|
||||
|
||||
portfolioSummary = summary;
|
||||
let portfolioSummary = summary;
|
||||
|
||||
if (
|
||||
impersonationId ||
|
||||
@ -400,12 +379,12 @@ export class PortfolioController {
|
||||
hasDetails = user.subscription.type === 'Premium';
|
||||
}
|
||||
|
||||
const { holdings } = await this.portfolioService.getDetails(
|
||||
access.userId,
|
||||
access.userId,
|
||||
'max',
|
||||
[{ id: 'EQUITY', type: 'ASSET_CLASS' }]
|
||||
);
|
||||
const { holdings } = await this.portfolioService.getDetails({
|
||||
dateRange: 'max',
|
||||
filters: [{ id: 'EQUITY', type: 'ASSET_CLASS' }],
|
||||
impersonationId: access.userId,
|
||||
userId: access.userId
|
||||
});
|
||||
|
||||
const portfolioPublicDetails: PortfolioPublicDetails = {
|
||||
hasDetails,
|
||||
|
@ -2,6 +2,7 @@ import { AccessModule } from '@ghostfolio/api/app/access/access.module';
|
||||
import { AccountService } from '@ghostfolio/api/app/account/account.service';
|
||||
import { OrderModule } from '@ghostfolio/api/app/order/order.module';
|
||||
import { UserModule } from '@ghostfolio/api/app/user/user.module';
|
||||
import { ApiModule } from '@ghostfolio/api/services/api/api.module';
|
||||
import { ConfigurationModule } from '@ghostfolio/api/services/configuration.module';
|
||||
import { DataGatheringModule } from '@ghostfolio/api/services/data-gathering.module';
|
||||
import { DataProviderModule } from '@ghostfolio/api/services/data-provider/data-provider.module';
|
||||
@ -22,6 +23,7 @@ import { RulesService } from './rules.service';
|
||||
exports: [PortfolioService],
|
||||
imports: [
|
||||
AccessModule,
|
||||
ApiModule,
|
||||
ConfigurationModule,
|
||||
DataGatheringModule,
|
||||
DataProviderModule,
|
||||
|
@ -107,15 +107,19 @@ export class PortfolioService {
|
||||
this.baseCurrency = this.configurationService.get('BASE_CURRENCY');
|
||||
}
|
||||
|
||||
public async getAccounts(
|
||||
aUserId: string,
|
||||
aFilters?: Filter[],
|
||||
public async getAccounts({
|
||||
filters,
|
||||
userId,
|
||||
withExcludedAccounts = false
|
||||
): Promise<AccountWithValue[]> {
|
||||
const where: Prisma.AccountWhereInput = { userId: aUserId };
|
||||
}: {
|
||||
filters?: Filter[];
|
||||
userId: string;
|
||||
withExcludedAccounts?: boolean;
|
||||
}): Promise<AccountWithValue[]> {
|
||||
const where: Prisma.AccountWhereInput = { userId: userId };
|
||||
|
||||
if (aFilters?.[0].id && aFilters?.[0].type === 'ACCOUNT') {
|
||||
where.id = aFilters[0].id;
|
||||
if (filters?.[0].id && filters?.[0].type === 'ACCOUNT') {
|
||||
where.id = filters[0].id;
|
||||
}
|
||||
|
||||
const [accounts, details] = await Promise.all([
|
||||
@ -124,13 +128,12 @@ export class PortfolioService {
|
||||
include: { Order: true, Platform: true },
|
||||
orderBy: { name: 'asc' }
|
||||
}),
|
||||
this.getDetails(
|
||||
aUserId,
|
||||
aUserId,
|
||||
undefined,
|
||||
aFilters,
|
||||
withExcludedAccounts
|
||||
)
|
||||
this.getDetails({
|
||||
filters,
|
||||
userId,
|
||||
withExcludedAccounts,
|
||||
impersonationId: userId
|
||||
})
|
||||
]);
|
||||
|
||||
const userCurrency = this.request.user.Settings.settings.baseCurrency;
|
||||
@ -168,16 +171,20 @@ export class PortfolioService {
|
||||
});
|
||||
}
|
||||
|
||||
public async getAccountsWithAggregations(
|
||||
aUserId: string,
|
||||
aFilters?: Filter[],
|
||||
public async getAccountsWithAggregations({
|
||||
filters,
|
||||
userId,
|
||||
withExcludedAccounts = false
|
||||
): Promise<Accounts> {
|
||||
const accounts = await this.getAccounts(
|
||||
aUserId,
|
||||
aFilters,
|
||||
}: {
|
||||
filters?: Filter[];
|
||||
userId: string;
|
||||
withExcludedAccounts?: boolean;
|
||||
}): Promise<Accounts> {
|
||||
const accounts = await this.getAccounts({
|
||||
filters,
|
||||
userId,
|
||||
withExcludedAccounts
|
||||
);
|
||||
});
|
||||
let totalBalanceInBaseCurrency = new Big(0);
|
||||
let totalValueInBaseCurrency = new Big(0);
|
||||
let transactionCount = 0;
|
||||
@ -421,14 +428,21 @@ export class PortfolioService {
|
||||
};
|
||||
}
|
||||
|
||||
public async getDetails(
|
||||
aImpersonationId: string,
|
||||
aUserId: string,
|
||||
aDateRange: DateRange = 'max',
|
||||
aFilters?: Filter[],
|
||||
public async getDetails({
|
||||
impersonationId,
|
||||
userId,
|
||||
dateRange = 'max',
|
||||
filters,
|
||||
withExcludedAccounts = false
|
||||
): Promise<PortfolioDetails & { hasErrors: boolean }> {
|
||||
const userId = await this.getUserId(aImpersonationId, aUserId);
|
||||
}: {
|
||||
impersonationId: string;
|
||||
userId: string;
|
||||
dateRange?: DateRange;
|
||||
filters?: Filter[];
|
||||
withExcludedAccounts?: boolean;
|
||||
}): Promise<PortfolioDetails & { hasErrors: boolean }> {
|
||||
// TODO:
|
||||
userId = await this.getUserId(impersonationId, userId);
|
||||
const user = await this.userService.user({ id: userId });
|
||||
|
||||
const emergencyFund = new Big(
|
||||
@ -441,9 +455,9 @@ export class PortfolioService {
|
||||
|
||||
const { orders, portfolioOrders, transactionPoints } =
|
||||
await this.getTransactionPoints({
|
||||
filters,
|
||||
userId,
|
||||
withExcludedAccounts,
|
||||
filters: aFilters
|
||||
withExcludedAccounts
|
||||
});
|
||||
|
||||
const portfolioCalculator = new PortfolioCalculator({
|
||||
@ -457,15 +471,15 @@ export class PortfolioService {
|
||||
const portfolioStart = parseDate(
|
||||
transactionPoints[0]?.date ?? format(new Date(), DATE_FORMAT)
|
||||
);
|
||||
const startDate = this.getStartDate(aDateRange, portfolioStart);
|
||||
const startDate = this.getStartDate(dateRange, portfolioStart);
|
||||
const currentPositions = await portfolioCalculator.getCurrentPositions(
|
||||
startDate
|
||||
);
|
||||
|
||||
const cashDetails = await this.accountService.getCashDetails({
|
||||
filters,
|
||||
userId,
|
||||
currency: userCurrency,
|
||||
filters: aFilters
|
||||
currency: userCurrency
|
||||
});
|
||||
|
||||
const holdings: PortfolioDetails['holdings'] = {};
|
||||
@ -475,10 +489,10 @@ export class PortfolioService {
|
||||
let filteredValueInBaseCurrency = currentPositions.currentValue;
|
||||
|
||||
if (
|
||||
aFilters?.length === 0 ||
|
||||
(aFilters?.length === 1 &&
|
||||
aFilters[0].type === 'ASSET_CLASS' &&
|
||||
aFilters[0].id === 'CASH')
|
||||
filters?.length === 0 ||
|
||||
(filters?.length === 1 &&
|
||||
filters[0].type === 'ASSET_CLASS' &&
|
||||
filters[0].id === 'CASH')
|
||||
) {
|
||||
filteredValueInBaseCurrency = filteredValueInBaseCurrency.plus(
|
||||
cashDetails.balanceInBaseCurrency
|
||||
@ -574,10 +588,10 @@ export class PortfolioService {
|
||||
}
|
||||
|
||||
if (
|
||||
aFilters?.length === 0 ||
|
||||
(aFilters?.length === 1 &&
|
||||
aFilters[0].type === 'ASSET_CLASS' &&
|
||||
aFilters[0].id === 'CASH')
|
||||
filters?.length === 0 ||
|
||||
(filters?.length === 1 &&
|
||||
filters[0].type === 'ASSET_CLASS' &&
|
||||
filters[0].id === 'CASH')
|
||||
) {
|
||||
const cashPositions = await this.getCashPositions({
|
||||
cashDetails,
|
||||
@ -593,15 +607,15 @@ export class PortfolioService {
|
||||
}
|
||||
|
||||
const accounts = await this.getValueOfAccounts({
|
||||
filters,
|
||||
orders,
|
||||
portfolioItemsNow,
|
||||
userCurrency,
|
||||
userId,
|
||||
withExcludedAccounts,
|
||||
filters: aFilters
|
||||
withExcludedAccounts
|
||||
});
|
||||
|
||||
const summary = await this.getSummary(aImpersonationId);
|
||||
const summary = await this.getSummary(impersonationId);
|
||||
|
||||
return {
|
||||
accounts,
|
||||
|
9
apps/api/src/services/api/api.module.ts
Normal file
9
apps/api/src/services/api/api.module.ts
Normal file
@ -0,0 +1,9 @@
|
||||
import { Module } from '@nestjs/common';
|
||||
|
||||
import { ApiService } from './api.service';
|
||||
|
||||
@Module({
|
||||
exports: [ApiService],
|
||||
providers: [ApiService]
|
||||
})
|
||||
export class ApiModule {}
|
42
apps/api/src/services/api/api.service.ts
Normal file
42
apps/api/src/services/api/api.service.ts
Normal file
@ -0,0 +1,42 @@
|
||||
import { Filter } from '@ghostfolio/common/interfaces';
|
||||
import { Injectable } from '@nestjs/common';
|
||||
|
||||
@Injectable()
|
||||
export class ApiService {
|
||||
public constructor() {}
|
||||
|
||||
public buildFiltersFromQueryParams({
|
||||
filterByAccounts,
|
||||
filterByAssetClasses,
|
||||
filterByTags
|
||||
}: {
|
||||
filterByAccounts?: string;
|
||||
filterByAssetClasses?: string;
|
||||
filterByTags?: string;
|
||||
}): Filter[] {
|
||||
const accountIds = filterByAccounts?.split(',') ?? [];
|
||||
const assetClasses = filterByAssetClasses?.split(',') ?? [];
|
||||
const tagIds = filterByTags?.split(',') ?? [];
|
||||
|
||||
return [
|
||||
...accountIds.map((accountId) => {
|
||||
return <Filter>{
|
||||
id: accountId,
|
||||
type: 'ACCOUNT'
|
||||
};
|
||||
}),
|
||||
...assetClasses.map((assetClass) => {
|
||||
return <Filter>{
|
||||
id: assetClass,
|
||||
type: 'ASSET_CLASS'
|
||||
};
|
||||
}),
|
||||
...tagIds.map((tagId) => {
|
||||
return <Filter>{
|
||||
id: tagId,
|
||||
type: 'TAG'
|
||||
};
|
||||
})
|
||||
];
|
||||
}
|
||||
}
|
@ -58,8 +58,15 @@ export class YahooFinanceService implements DataProviderInterface {
|
||||
* DOGEUSD -> DOGE-USD
|
||||
*/
|
||||
public convertToYahooFinanceSymbol(aSymbol: string) {
|
||||
if (aSymbol.includes(this.baseCurrency) && aSymbol.length >= 6) {
|
||||
if (isCurrency(aSymbol.substring(0, aSymbol.length - 3))) {
|
||||
if (
|
||||
aSymbol.includes(this.baseCurrency) &&
|
||||
aSymbol.length > this.baseCurrency.length
|
||||
) {
|
||||
if (
|
||||
isCurrency(
|
||||
aSymbol.substring(0, aSymbol.length - this.baseCurrency.length)
|
||||
)
|
||||
) {
|
||||
return `${aSymbol}=X`;
|
||||
} else if (
|
||||
this.cryptocurrencyService.isCryptocurrency(
|
||||
|
@ -53,13 +53,15 @@ export class TwitterBotService {
|
||||
symbolItem.marketPrice
|
||||
);
|
||||
|
||||
let status = `Current Market Mood: ${emoji} ${text} (${symbolItem.marketPrice}/100)`;
|
||||
let status = `Current market mood is ${emoji} ${text.toLowerCase()} (${
|
||||
symbolItem.marketPrice
|
||||
}/100)`;
|
||||
|
||||
const benchmarkListing = await this.getBenchmarkListing(3);
|
||||
|
||||
if (benchmarkListing?.length > 1) {
|
||||
status += '\n\n';
|
||||
status += '±% from ATH\n';
|
||||
status += '± from ATH in %\n';
|
||||
status += benchmarkListing;
|
||||
}
|
||||
|
||||
|
@ -35,7 +35,7 @@
|
||||
}"
|
||||
></ngx-skeleton-loader>
|
||||
</div>
|
||||
<div *ngIf="!isLoading">
|
||||
<div *ngIf="!isLoading" i18n>
|
||||
If you retire today, you would be able to withdraw
|
||||
<span class="font-weight-bold"
|
||||
><gf-value
|
||||
|
@ -74,60 +74,19 @@ export class DataService {
|
||||
}: {
|
||||
filters?: Filter[];
|
||||
}): Observable<Activities> {
|
||||
let params = new HttpParams();
|
||||
|
||||
if (filters?.length > 0) {
|
||||
const {
|
||||
ACCOUNT: filtersByAccount,
|
||||
ASSET_CLASS: filtersByAssetClass,
|
||||
TAG: filtersByTag
|
||||
} = groupBy(filters, (filter) => {
|
||||
return filter.type;
|
||||
});
|
||||
|
||||
if (filtersByAccount) {
|
||||
params = params.append(
|
||||
'accounts',
|
||||
filtersByAccount
|
||||
.map(({ id }) => {
|
||||
return id;
|
||||
})
|
||||
.join(',')
|
||||
);
|
||||
}
|
||||
|
||||
if (filtersByAssetClass) {
|
||||
params = params.append(
|
||||
'assetClasses',
|
||||
filtersByAssetClass
|
||||
.map(({ id }) => {
|
||||
return id;
|
||||
})
|
||||
.join(',')
|
||||
);
|
||||
}
|
||||
|
||||
if (filtersByTag) {
|
||||
params = params.append(
|
||||
'tags',
|
||||
filtersByTag
|
||||
.map(({ id }) => {
|
||||
return id;
|
||||
})
|
||||
.join(',')
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
return this.http.get<any>('/api/v1/order', { params }).pipe(
|
||||
map(({ activities }) => {
|
||||
for (const activity of activities) {
|
||||
activity.createdAt = parseISO(activity.createdAt);
|
||||
activity.date = parseISO(activity.date);
|
||||
}
|
||||
return { activities };
|
||||
return this.http
|
||||
.get<any>('/api/v1/order', {
|
||||
params: this.buildFiltersAsQueryParams({ filters })
|
||||
})
|
||||
);
|
||||
.pipe(
|
||||
map(({ activities }) => {
|
||||
for (const activity of activities) {
|
||||
activity.createdAt = parseISO(activity.createdAt);
|
||||
activity.date = parseISO(activity.date);
|
||||
}
|
||||
return { activities };
|
||||
})
|
||||
);
|
||||
}
|
||||
|
||||
public fetchAdminData() {
|
||||
@ -135,30 +94,8 @@ export class DataService {
|
||||
}
|
||||
|
||||
public fetchAdminMarketData({ filters }: { filters?: Filter[] }) {
|
||||
let params = new HttpParams();
|
||||
|
||||
if (filters?.length > 0) {
|
||||
const { ASSET_SUB_CLASS: filtersByAssetSubClass } = groupBy(
|
||||
filters,
|
||||
(filter) => {
|
||||
return filter.type;
|
||||
}
|
||||
);
|
||||
|
||||
if (filtersByAssetSubClass) {
|
||||
params = params.append(
|
||||
'assetSubClasses',
|
||||
filtersByAssetSubClass
|
||||
.map(({ id }) => {
|
||||
return id;
|
||||
})
|
||||
.join(',')
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
return this.http.get<AdminMarketData>('/api/v1/admin/market-data', {
|
||||
params
|
||||
params: this.buildFiltersAsQueryParams({ filters })
|
||||
});
|
||||
}
|
||||
|
||||
@ -306,54 +243,9 @@ export class DataService {
|
||||
}: {
|
||||
filters?: Filter[];
|
||||
}): Observable<PortfolioDetails> {
|
||||
let params = new HttpParams();
|
||||
|
||||
if (filters?.length > 0) {
|
||||
const {
|
||||
ACCOUNT: filtersByAccount,
|
||||
ASSET_CLASS: filtersByAssetClass,
|
||||
TAG: filtersByTag
|
||||
} = groupBy(filters, (filter) => {
|
||||
return filter.type;
|
||||
});
|
||||
|
||||
if (filtersByAccount) {
|
||||
params = params.append(
|
||||
'accounts',
|
||||
filtersByAccount
|
||||
.map(({ id }) => {
|
||||
return id;
|
||||
})
|
||||
.join(',')
|
||||
);
|
||||
}
|
||||
|
||||
if (filtersByAssetClass) {
|
||||
params = params.append(
|
||||
'assetClasses',
|
||||
filtersByAssetClass
|
||||
.map(({ id }) => {
|
||||
return id;
|
||||
})
|
||||
.join(',')
|
||||
);
|
||||
}
|
||||
|
||||
if (filtersByTag) {
|
||||
params = params.append(
|
||||
'tags',
|
||||
filtersByTag
|
||||
.map(({ id }) => {
|
||||
return id;
|
||||
})
|
||||
.join(',')
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
return this.http
|
||||
.get<any>('/api/v1/portfolio/details', {
|
||||
params
|
||||
params: this.buildFiltersAsQueryParams({ filters })
|
||||
})
|
||||
.pipe(
|
||||
map((response) => {
|
||||
@ -458,4 +350,53 @@ export class DataService {
|
||||
couponCode
|
||||
});
|
||||
}
|
||||
|
||||
private buildFiltersAsQueryParams({ filters }: { filters?: Filter[] }) {
|
||||
let params = new HttpParams();
|
||||
|
||||
if (filters?.length > 0) {
|
||||
const {
|
||||
ACCOUNT: filtersByAccount,
|
||||
ASSET_CLASS: filtersByAssetClass,
|
||||
TAG: filtersByTag
|
||||
} = groupBy(filters, (filter) => {
|
||||
return filter.type;
|
||||
});
|
||||
|
||||
if (filtersByAccount) {
|
||||
params = params.append(
|
||||
'accounts',
|
||||
filtersByAccount
|
||||
.map(({ id }) => {
|
||||
return id;
|
||||
})
|
||||
.join(',')
|
||||
);
|
||||
}
|
||||
|
||||
if (filtersByAssetClass) {
|
||||
params = params.append(
|
||||
'assetClasses',
|
||||
filtersByAssetClass
|
||||
.map(({ id }) => {
|
||||
return id;
|
||||
})
|
||||
.join(',')
|
||||
);
|
||||
}
|
||||
|
||||
if (filtersByTag) {
|
||||
params = params.append(
|
||||
'tags',
|
||||
filtersByTag
|
||||
.map(({ id }) => {
|
||||
return id;
|
||||
})
|
||||
.join(',')
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
return params;
|
||||
}
|
||||
}
|
||||
|
@ -15,7 +15,7 @@
|
||||
</trans-unit>
|
||||
<trans-unit id="ccb2a809018b32a96c813ae69126ce05976109ce" datatype="html">
|
||||
<source>The risk of loss in trading can be substantial. It is not advisable to invest money you may need in the short term.</source>
|
||||
<target state="translated">Das Ausfallrisiko beim Börsenhandel kann erheblich sein. Es ist nicht ratsam, Geld zu investieren, welches Sie kurzfristig benötigen.</target>
|
||||
<target state="translated">Das Ausfallrisiko beim Börsenhandel kann erheblich sein. Es ist nicht ratsam, Geld zu investieren, welches du kurzfristig benötigst.</target>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">apps/client/src/app/app.component.html</context>
|
||||
<context context-type="linenumber">55,56</context>
|
||||
@ -418,7 +418,7 @@
|
||||
</context-group>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">apps/client/src/app/components/admin-overview/admin-overview.html</context>
|
||||
<context context-type="linenumber">11</context>
|
||||
<context context-type="linenumber">17</context>
|
||||
</context-group>
|
||||
</trans-unit>
|
||||
<trans-unit id="5eebcc824c2d34b17abba8c9ef718c5ce118a5c8" datatype="html">
|
||||
@ -490,7 +490,7 @@
|
||||
<target state="translated">pro Benutzer</target>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">apps/client/src/app/components/admin-overview/admin-overview.html</context>
|
||||
<context context-type="linenumber">15</context>
|
||||
<context context-type="linenumber">26</context>
|
||||
</context-group>
|
||||
</trans-unit>
|
||||
<trans-unit id="5067ede95804e0e0e2b078747848367a7373cc9b" datatype="html">
|
||||
@ -498,7 +498,7 @@
|
||||
<target state="translated">Letzte Daten einholen</target>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">apps/client/src/app/components/admin-overview/admin-overview.html</context>
|
||||
<context context-type="linenumber">33</context>
|
||||
<context context-type="linenumber">44</context>
|
||||
</context-group>
|
||||
</trans-unit>
|
||||
<trans-unit id="27e27f3f7338baefacfd5668bad03ece9c5955df" datatype="html">
|
||||
@ -506,7 +506,7 @@
|
||||
<target state="translated">Alle Daten einholen</target>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">apps/client/src/app/components/admin-overview/admin-overview.html</context>
|
||||
<context context-type="linenumber">46</context>
|
||||
<context context-type="linenumber">57</context>
|
||||
</context-group>
|
||||
</trans-unit>
|
||||
<trans-unit id="cc65b67b46b69cf06ff1f16a909e61612c9d57b8" datatype="html">
|
||||
@ -518,7 +518,7 @@
|
||||
</context-group>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">apps/client/src/app/components/admin-overview/admin-overview.html</context>
|
||||
<context context-type="linenumber">60</context>
|
||||
<context context-type="linenumber">71</context>
|
||||
</context-group>
|
||||
</trans-unit>
|
||||
<trans-unit id="37ff0697aa81b2777250c483d2ce1ebdaa5ab042" datatype="html">
|
||||
@ -526,7 +526,7 @@
|
||||
<target state="translated">Wechselkurse</target>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">apps/client/src/app/components/admin-overview/admin-overview.html</context>
|
||||
<context context-type="linenumber">67</context>
|
||||
<context context-type="linenumber">78</context>
|
||||
</context-group>
|
||||
</trans-unit>
|
||||
<trans-unit id="4567a660a7f67e254bbf13219906843e34d9f807" datatype="html">
|
||||
@ -534,7 +534,7 @@
|
||||
<target state="translated">Währung hinzufügen</target>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">apps/client/src/app/components/admin-overview/admin-overview.html</context>
|
||||
<context context-type="linenumber">106</context>
|
||||
<context context-type="linenumber">117</context>
|
||||
</context-group>
|
||||
</trans-unit>
|
||||
<trans-unit id="860e5f056b59410ec8db65cb53955505c6931752" datatype="html">
|
||||
@ -542,7 +542,7 @@
|
||||
<target state="translated">Systemmeldung</target>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">apps/client/src/app/components/admin-overview/admin-overview.html</context>
|
||||
<context context-type="linenumber">112</context>
|
||||
<context context-type="linenumber">123</context>
|
||||
</context-group>
|
||||
</trans-unit>
|
||||
<trans-unit id="657028d5fc9c3da8f2d667b6b15cd0df8b9a3729" datatype="html">
|
||||
@ -550,7 +550,7 @@
|
||||
<target state="translated">Systemmeldung setzen</target>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">apps/client/src/app/components/admin-overview/admin-overview.html</context>
|
||||
<context context-type="linenumber">134</context>
|
||||
<context context-type="linenumber">145</context>
|
||||
</context-group>
|
||||
</trans-unit>
|
||||
<trans-unit id="7fd64c34428887e4cd56d05534b89c100b8544ad" datatype="html">
|
||||
@ -558,7 +558,7 @@
|
||||
<target state="translated">Lese-Modus</target>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">apps/client/src/app/components/admin-overview/admin-overview.html</context>
|
||||
<context context-type="linenumber">139</context>
|
||||
<context context-type="linenumber">150</context>
|
||||
</context-group>
|
||||
</trans-unit>
|
||||
<trans-unit id="e698b03c34b459b1b006d7f0473a49b9fcf5dfc1" datatype="html">
|
||||
@ -566,7 +566,7 @@
|
||||
<target state="translated">Gutscheincodes</target>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">apps/client/src/app/components/admin-overview/admin-overview.html</context>
|
||||
<context context-type="linenumber">152</context>
|
||||
<context context-type="linenumber">163</context>
|
||||
</context-group>
|
||||
</trans-unit>
|
||||
<trans-unit id="f6755cff4957d5c3c89bafce5651f1b6fa2b1fd9" datatype="html">
|
||||
@ -574,7 +574,7 @@
|
||||
<target state="translated">Hinzufügen</target>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">apps/client/src/app/components/admin-overview/admin-overview.html</context>
|
||||
<context context-type="linenumber">187</context>
|
||||
<context context-type="linenumber">198</context>
|
||||
</context-group>
|
||||
</trans-unit>
|
||||
<trans-unit id="e799e6b926557f0098f41888cdf8df868eff3d47" datatype="html">
|
||||
@ -582,7 +582,7 @@
|
||||
<target state="translated">Verwaltung</target>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">apps/client/src/app/components/admin-overview/admin-overview.html</context>
|
||||
<context context-type="linenumber">194</context>
|
||||
<context context-type="linenumber">205</context>
|
||||
</context-group>
|
||||
</trans-unit>
|
||||
<trans-unit id="c7ac907e52a7ce2ac70b1786eb5f403ce306ce1f" datatype="html">
|
||||
@ -590,7 +590,7 @@
|
||||
<target state="translated">Cache leeren</target>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">apps/client/src/app/components/admin-overview/admin-overview.html</context>
|
||||
<context context-type="linenumber">198</context>
|
||||
<context context-type="linenumber">209</context>
|
||||
</context-group>
|
||||
</trans-unit>
|
||||
<trans-unit id="2817099043823177227" datatype="html">
|
||||
@ -2314,7 +2314,7 @@
|
||||
<target state="translated">Datenverwaltung</target>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">apps/client/src/app/components/admin-overview/admin-overview.html</context>
|
||||
<context context-type="linenumber">20</context>
|
||||
<context context-type="linenumber">31</context>
|
||||
</context-group>
|
||||
</trans-unit>
|
||||
<trans-unit id="3ccabfc3dc288eaa2355ba43298c739f85951ec3" datatype="html">
|
||||
@ -2659,7 +2659,7 @@
|
||||
</trans-unit>
|
||||
<trans-unit id="ac598d664f86ba5783915d65f2664a7f38a9d23a" datatype="html">
|
||||
<source>Account Type</source>
|
||||
<target state="new">Account Type</target>
|
||||
<target state="translated">Kontotyp</target>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">apps/client/src/app/components/account-detail-dialog/account-detail-dialog.html</context>
|
||||
<context context-type="linenumber">25</context>
|
||||
@ -2667,12 +2667,20 @@
|
||||
</trans-unit>
|
||||
<trans-unit id="98fc3013bfcbf452b9f37bbfcdb77b9b882866e3" datatype="html">
|
||||
<source>Excluded from Analysis</source>
|
||||
<target state="new">Excluded from Analysis</target>
|
||||
<target state="translated">Von der Analyse ausgenommen</target>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html</context>
|
||||
<context context-type="linenumber">176</context>
|
||||
</context-group>
|
||||
</trans-unit>
|
||||
<trans-unit id="458363f8e413759aa9e3235a53fd0f64cc916395" datatype="html">
|
||||
<source> If you retire today, you would be able to withdraw <x id="START_TAG_SPAN" ctype="x-span" equiv-text="<span class="font-weight-bold" >"/><x id="START_TAG_GF_VALUE" ctype="x-gf_value" equiv-text="<gf-value class="d-inline-block" [currency]="user?.settings?.baseCurrency" [locale]="user?.settings?.locale" [value]="withdrawalRatePerYear?.toNumber()" >"/><x id="CLOSE_TAG_GF_VALUE" ctype="x-gf_value" equiv-text="</gf-value>"/> per year<x id="CLOSE_TAG_SPAN" ctype="x-span" equiv-text="</span >"/> or <x id="START_TAG_SPAN" ctype="x-span" equiv-text="<span class="font-weight-bold" >"/><x id="START_TAG_GF_VALUE_1" ctype="x-gf_value_1" equiv-text="<gf-value class="d-inline-block" [currency]="user?.settings?.baseCurrency" [locale]="user?.settings?.locale" [value]="withdrawalRatePerMonth?.toNumber()" >"/><x id="CLOSE_TAG_GF_VALUE" ctype="x-gf_value" equiv-text="</gf-value>"/> per month<x id="CLOSE_TAG_SPAN" ctype="x-span" equiv-text="</span >"/>, based on your total assets of <x id="START_TAG_GF_VALUE_2" ctype="x-gf_value_2" equiv-text="<gf-value class="d-inline-block" [currency]="user?.settings?.baseCurrency" [locale]="user?.settings?.locale" [value]="fireWealth?.toNumber()" >"/><x id="CLOSE_TAG_GF_VALUE" ctype="x-gf_value" equiv-text="</gf-value>"/> and a withdrawal rate of 4%. </source>
|
||||
<target state="translated"> Wenn du heute in den Ruhestand gehen würdest, könnest du <x id="START_TAG_SPAN" ctype="x-span" equiv-text="<span class="font-weight-bold" >"/><x id="START_TAG_GF_VALUE" ctype="x-gf_value" equiv-text="<gf-value class="d-inline-block" [currency]="user?.settings?.baseCurrency" [locale]="user?.settings?.locale" [value]="withdrawalRatePerYear?.toNumber()" >"/><x id="CLOSE_TAG_GF_VALUE" ctype="x-gf_value" equiv-text="</gf-value>"/> pro Jahr<x id="CLOSE_TAG_SPAN" ctype="x-span" equiv-text="</span >"/> oder <x id="START_TAG_SPAN" ctype="x-span" equiv-text="<span class="font-weight-bold" >"/><x id="START_TAG_GF_VALUE_1" ctype="x-gf_value_1" equiv-text="<gf-value class="d-inline-block" [currency]="user?.settings?.baseCurrency" [locale]="user?.settings?.locale" [value]="withdrawalRatePerMonth?.toNumber()" >"/><x id="CLOSE_TAG_GF_VALUE" ctype="x-gf_value" equiv-text="</gf-value>"/> pro Monat<x id="CLOSE_TAG_SPAN" ctype="x-span" equiv-text="</span >"/> entnehmen, bezogen auf dein Gesamtanlagevermögen von <x id="START_TAG_GF_VALUE_2" ctype="x-gf_value_2" equiv-text="<gf-value class="d-inline-block" [currency]="user?.settings?.baseCurrency" [locale]="user?.settings?.locale" [value]="fireWealth?.toNumber()" >"/><x id="CLOSE_TAG_GF_VALUE" ctype="x-gf_value" equiv-text="</gf-value>"/> und einer Entnahmerate von 4%. </target>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/fire/fire-page.html</context>
|
||||
<context context-type="linenumber">38,66</context>
|
||||
</context-group>
|
||||
</trans-unit>
|
||||
</body>
|
||||
</file>
|
||||
</xliff>
|
||||
|
@ -419,7 +419,7 @@
|
||||
</context-group>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">apps/client/src/app/components/admin-overview/admin-overview.html</context>
|
||||
<context context-type="linenumber">11</context>
|
||||
<context context-type="linenumber">17</context>
|
||||
</context-group>
|
||||
</trans-unit>
|
||||
<trans-unit id="5eebcc824c2d34b17abba8c9ef718c5ce118a5c8" datatype="html">
|
||||
@ -491,7 +491,7 @@
|
||||
<target state="translated">por usario</target>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">apps/client/src/app/components/admin-overview/admin-overview.html</context>
|
||||
<context context-type="linenumber">15</context>
|
||||
<context context-type="linenumber">26</context>
|
||||
</context-group>
|
||||
</trans-unit>
|
||||
<trans-unit id="5067ede95804e0e0e2b078747848367a7373cc9b" datatype="html">
|
||||
@ -499,7 +499,7 @@
|
||||
<target state="translated">Recoger datos recientes</target>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">apps/client/src/app/components/admin-overview/admin-overview.html</context>
|
||||
<context context-type="linenumber">33</context>
|
||||
<context context-type="linenumber">44</context>
|
||||
</context-group>
|
||||
</trans-unit>
|
||||
<trans-unit id="27e27f3f7338baefacfd5668bad03ece9c5955df" datatype="html">
|
||||
@ -507,7 +507,7 @@
|
||||
<target state="translated">Recoger todos los datos</target>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">apps/client/src/app/components/admin-overview/admin-overview.html</context>
|
||||
<context context-type="linenumber">46</context>
|
||||
<context context-type="linenumber">57</context>
|
||||
</context-group>
|
||||
</trans-unit>
|
||||
<trans-unit id="cc65b67b46b69cf06ff1f16a909e61612c9d57b8" datatype="html">
|
||||
@ -519,7 +519,7 @@
|
||||
</context-group>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">apps/client/src/app/components/admin-overview/admin-overview.html</context>
|
||||
<context context-type="linenumber">60</context>
|
||||
<context context-type="linenumber">71</context>
|
||||
</context-group>
|
||||
</trans-unit>
|
||||
<trans-unit id="37ff0697aa81b2777250c483d2ce1ebdaa5ab042" datatype="html">
|
||||
@ -527,7 +527,7 @@
|
||||
<target state="translated">Tipos de cambio</target>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">apps/client/src/app/components/admin-overview/admin-overview.html</context>
|
||||
<context context-type="linenumber">67</context>
|
||||
<context context-type="linenumber">78</context>
|
||||
</context-group>
|
||||
</trans-unit>
|
||||
<trans-unit id="4567a660a7f67e254bbf13219906843e34d9f807" datatype="html">
|
||||
@ -535,7 +535,7 @@
|
||||
<target state="translated">Añadir divisa</target>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">apps/client/src/app/components/admin-overview/admin-overview.html</context>
|
||||
<context context-type="linenumber">106</context>
|
||||
<context context-type="linenumber">117</context>
|
||||
</context-group>
|
||||
</trans-unit>
|
||||
<trans-unit id="860e5f056b59410ec8db65cb53955505c6931752" datatype="html">
|
||||
@ -543,7 +543,7 @@
|
||||
<target state="translated">Mensaje del sistema</target>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">apps/client/src/app/components/admin-overview/admin-overview.html</context>
|
||||
<context context-type="linenumber">112</context>
|
||||
<context context-type="linenumber">123</context>
|
||||
</context-group>
|
||||
</trans-unit>
|
||||
<trans-unit id="657028d5fc9c3da8f2d667b6b15cd0df8b9a3729" datatype="html">
|
||||
@ -551,7 +551,7 @@
|
||||
<target state="translated">Establecer mensaje</target>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">apps/client/src/app/components/admin-overview/admin-overview.html</context>
|
||||
<context context-type="linenumber">134</context>
|
||||
<context context-type="linenumber">145</context>
|
||||
</context-group>
|
||||
</trans-unit>
|
||||
<trans-unit id="7fd64c34428887e4cd56d05534b89c100b8544ad" datatype="html">
|
||||
@ -559,7 +559,7 @@
|
||||
<target state="translated">Modo de solo lectura</target>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">apps/client/src/app/components/admin-overview/admin-overview.html</context>
|
||||
<context context-type="linenumber">139</context>
|
||||
<context context-type="linenumber">150</context>
|
||||
</context-group>
|
||||
</trans-unit>
|
||||
<trans-unit id="e698b03c34b459b1b006d7f0473a49b9fcf5dfc1" datatype="html">
|
||||
@ -567,7 +567,7 @@
|
||||
<target state="translated">Cupones</target>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">apps/client/src/app/components/admin-overview/admin-overview.html</context>
|
||||
<context context-type="linenumber">152</context>
|
||||
<context context-type="linenumber">163</context>
|
||||
</context-group>
|
||||
</trans-unit>
|
||||
<trans-unit id="f6755cff4957d5c3c89bafce5651f1b6fa2b1fd9" datatype="html">
|
||||
@ -575,7 +575,7 @@
|
||||
<target state="translated">Añadir</target>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">apps/client/src/app/components/admin-overview/admin-overview.html</context>
|
||||
<context context-type="linenumber">187</context>
|
||||
<context context-type="linenumber">198</context>
|
||||
</context-group>
|
||||
</trans-unit>
|
||||
<trans-unit id="e799e6b926557f0098f41888cdf8df868eff3d47" datatype="html">
|
||||
@ -583,7 +583,7 @@
|
||||
<target state="translated">Tareas domésticas</target>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">apps/client/src/app/components/admin-overview/admin-overview.html</context>
|
||||
<context context-type="linenumber">194</context>
|
||||
<context context-type="linenumber">205</context>
|
||||
</context-group>
|
||||
</trans-unit>
|
||||
<trans-unit id="c7ac907e52a7ce2ac70b1786eb5f403ce306ce1f" datatype="html">
|
||||
@ -591,7 +591,7 @@
|
||||
<target state="translated">Limpiar caché</target>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">apps/client/src/app/components/admin-overview/admin-overview.html</context>
|
||||
<context context-type="linenumber">198</context>
|
||||
<context context-type="linenumber">209</context>
|
||||
</context-group>
|
||||
</trans-unit>
|
||||
<trans-unit id="2817099043823177227" datatype="html">
|
||||
@ -968,7 +968,7 @@
|
||||
</trans-unit>
|
||||
<trans-unit id="e5c369abfbe1bd70f577aa03b2679797e38d7590" datatype="html">
|
||||
<source> Fees for <x id="INTERPOLATION" equiv-text="{{ summary?.ordersCount }}"/> <x id="ICU" equiv-text="{summary?.ordersCount, plural, =1 {transaction} other {transactions}}"/> </source>
|
||||
<target state="translated">Comisiones por <x id="INTERPOLATION" equiv-text="{{ summary?.ordersCount }}"/> <x id="ICU" equiv-text="{summary?.ordersCount, plural, =1 {transacción} otras {transacciones}}"/> </target>
|
||||
<target state="translated">Comisiones por <x id="INTERPOLATION" equiv-text="{{ summary?.ordersCount }}"/> <x id="ICU" equiv-text="{summary?.ordersCount, plural, =1 {transacción} other {transacciones}}"/> </target>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html</context>
|
||||
<context context-type="linenumber">77,80</context>
|
||||
@ -976,7 +976,7 @@
|
||||
</trans-unit>
|
||||
<trans-unit id="272c7fd98af55bfa5b9d579176f1cfa25cd5489f" datatype="html">
|
||||
<source>{VAR_PLURAL, plural, =1 {transaction} other {transactions}}</source>
|
||||
<target state="translated">{VAR_PLURAL, plural, =1 {transacción} otras {transacciones}}</target>
|
||||
<target state="translated">{VAR_PLURAL, plural, =1 {transacción} other {transacciones}}</target>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html</context>
|
||||
<context context-type="linenumber">78,79</context>
|
||||
@ -2315,7 +2315,7 @@
|
||||
<target state="translated">Gestión de los datos</target>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">apps/client/src/app/components/admin-overview/admin-overview.html</context>
|
||||
<context context-type="linenumber">20</context>
|
||||
<context context-type="linenumber">31</context>
|
||||
</context-group>
|
||||
</trans-unit>
|
||||
<trans-unit id="3ccabfc3dc288eaa2355ba43298c739f85951ec3" datatype="html">
|
||||
@ -2674,6 +2674,14 @@
|
||||
<context context-type="linenumber">176</context>
|
||||
</context-group>
|
||||
</trans-unit>
|
||||
<trans-unit id="458363f8e413759aa9e3235a53fd0f64cc916395" datatype="html">
|
||||
<source> If you retire today, you would be able to withdraw <x id="START_TAG_SPAN" ctype="x-span" equiv-text="<span class="font-weight-bold" >"/><x id="START_TAG_GF_VALUE" ctype="x-gf_value" equiv-text="<gf-value class="d-inline-block" [currency]="user?.settings?.baseCurrency" [locale]="user?.settings?.locale" [value]="withdrawalRatePerYear?.toNumber()" >"/><x id="CLOSE_TAG_GF_VALUE" ctype="x-gf_value" equiv-text="</gf-value>"/> per year<x id="CLOSE_TAG_SPAN" ctype="x-span" equiv-text="</span >"/> or <x id="START_TAG_SPAN" ctype="x-span" equiv-text="<span class="font-weight-bold" >"/><x id="START_TAG_GF_VALUE_1" ctype="x-gf_value_1" equiv-text="<gf-value class="d-inline-block" [currency]="user?.settings?.baseCurrency" [locale]="user?.settings?.locale" [value]="withdrawalRatePerMonth?.toNumber()" >"/><x id="CLOSE_TAG_GF_VALUE" ctype="x-gf_value" equiv-text="</gf-value>"/> per month<x id="CLOSE_TAG_SPAN" ctype="x-span" equiv-text="</span >"/>, based on your total assets of <x id="START_TAG_GF_VALUE_2" ctype="x-gf_value_2" equiv-text="<gf-value class="d-inline-block" [currency]="user?.settings?.baseCurrency" [locale]="user?.settings?.locale" [value]="fireWealth?.toNumber()" >"/><x id="CLOSE_TAG_GF_VALUE" ctype="x-gf_value" equiv-text="</gf-value>"/> and a withdrawal rate of 4%. </source>
|
||||
<target state="new"> If you retire today, you would be able to withdraw <x id="START_TAG_SPAN" ctype="x-span" equiv-text="<span class="font-weight-bold" >"/><x id="START_TAG_GF_VALUE" ctype="x-gf_value" equiv-text="<gf-value class="d-inline-block" [currency]="user?.settings?.baseCurrency" [locale]="user?.settings?.locale" [value]="withdrawalRatePerYear?.toNumber()" >"/><x id="CLOSE_TAG_GF_VALUE" ctype="x-gf_value" equiv-text="</gf-value>"/> per year<x id="CLOSE_TAG_SPAN" ctype="x-span" equiv-text="</span >"/> or <x id="START_TAG_SPAN" ctype="x-span" equiv-text="<span class="font-weight-bold" >"/><x id="START_TAG_GF_VALUE_1" ctype="x-gf_value_1" equiv-text="<gf-value class="d-inline-block" [currency]="user?.settings?.baseCurrency" [locale]="user?.settings?.locale" [value]="withdrawalRatePerMonth?.toNumber()" >"/><x id="CLOSE_TAG_GF_VALUE" ctype="x-gf_value" equiv-text="</gf-value>"/> per month<x id="CLOSE_TAG_SPAN" ctype="x-span" equiv-text="</span >"/>, based on your total assets of <x id="START_TAG_GF_VALUE_2" ctype="x-gf_value_2" equiv-text="<gf-value class="d-inline-block" [currency]="user?.settings?.baseCurrency" [locale]="user?.settings?.locale" [value]="fireWealth?.toNumber()" >"/><x id="CLOSE_TAG_GF_VALUE" ctype="x-gf_value" equiv-text="</gf-value>"/> and a withdrawal rate of 4%. </target>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/fire/fire-page.html</context>
|
||||
<context context-type="linenumber">38,66</context>
|
||||
</context-group>
|
||||
</trans-unit>
|
||||
</body>
|
||||
</file>
|
||||
</xliff>
|
||||
|
@ -419,7 +419,7 @@
|
||||
</context-group>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">apps/client/src/app/components/admin-overview/admin-overview.html</context>
|
||||
<context context-type="linenumber">11</context>
|
||||
<context context-type="linenumber">17</context>
|
||||
</context-group>
|
||||
</trans-unit>
|
||||
<trans-unit id="5eebcc824c2d34b17abba8c9ef718c5ce118a5c8" datatype="html">
|
||||
@ -491,7 +491,7 @@
|
||||
<target state="translated">per utente</target>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">apps/client/src/app/components/admin-overview/admin-overview.html</context>
|
||||
<context context-type="linenumber">15</context>
|
||||
<context context-type="linenumber">26</context>
|
||||
</context-group>
|
||||
</trans-unit>
|
||||
<trans-unit id="5067ede95804e0e0e2b078747848367a7373cc9b" datatype="html">
|
||||
@ -499,7 +499,7 @@
|
||||
<target state="translated">Raccogli dati recenti</target>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">apps/client/src/app/components/admin-overview/admin-overview.html</context>
|
||||
<context context-type="linenumber">33</context>
|
||||
<context context-type="linenumber">44</context>
|
||||
</context-group>
|
||||
</trans-unit>
|
||||
<trans-unit id="27e27f3f7338baefacfd5668bad03ece9c5955df" datatype="html">
|
||||
@ -507,7 +507,7 @@
|
||||
<target state="translated">Raccogli tutti i dati</target>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">apps/client/src/app/components/admin-overview/admin-overview.html</context>
|
||||
<context context-type="linenumber">46</context>
|
||||
<context context-type="linenumber">57</context>
|
||||
</context-group>
|
||||
</trans-unit>
|
||||
<trans-unit id="cc65b67b46b69cf06ff1f16a909e61612c9d57b8" datatype="html">
|
||||
@ -519,7 +519,7 @@
|
||||
</context-group>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">apps/client/src/app/components/admin-overview/admin-overview.html</context>
|
||||
<context context-type="linenumber">60</context>
|
||||
<context context-type="linenumber">71</context>
|
||||
</context-group>
|
||||
</trans-unit>
|
||||
<trans-unit id="37ff0697aa81b2777250c483d2ce1ebdaa5ab042" datatype="html">
|
||||
@ -527,7 +527,7 @@
|
||||
<target state="translated">Tassi di cambio</target>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">apps/client/src/app/components/admin-overview/admin-overview.html</context>
|
||||
<context context-type="linenumber">67</context>
|
||||
<context context-type="linenumber">78</context>
|
||||
</context-group>
|
||||
</trans-unit>
|
||||
<trans-unit id="4567a660a7f67e254bbf13219906843e34d9f807" datatype="html">
|
||||
@ -535,7 +535,7 @@
|
||||
<target state="translated">Aggiungi valuta</target>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">apps/client/src/app/components/admin-overview/admin-overview.html</context>
|
||||
<context context-type="linenumber">106</context>
|
||||
<context context-type="linenumber">117</context>
|
||||
</context-group>
|
||||
</trans-unit>
|
||||
<trans-unit id="860e5f056b59410ec8db65cb53955505c6931752" datatype="html">
|
||||
@ -543,7 +543,7 @@
|
||||
<target state="translated">Messaggio di sistema</target>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">apps/client/src/app/components/admin-overview/admin-overview.html</context>
|
||||
<context context-type="linenumber">112</context>
|
||||
<context context-type="linenumber">123</context>
|
||||
</context-group>
|
||||
</trans-unit>
|
||||
<trans-unit id="657028d5fc9c3da8f2d667b6b15cd0df8b9a3729" datatype="html">
|
||||
@ -551,7 +551,7 @@
|
||||
<target state="translated">Imposta messaggio</target>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">apps/client/src/app/components/admin-overview/admin-overview.html</context>
|
||||
<context context-type="linenumber">134</context>
|
||||
<context context-type="linenumber">145</context>
|
||||
</context-group>
|
||||
</trans-unit>
|
||||
<trans-unit id="7fd64c34428887e4cd56d05534b89c100b8544ad" datatype="html">
|
||||
@ -559,7 +559,7 @@
|
||||
<target state="translated">Modalità di sola lettura</target>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">apps/client/src/app/components/admin-overview/admin-overview.html</context>
|
||||
<context context-type="linenumber">139</context>
|
||||
<context context-type="linenumber">150</context>
|
||||
</context-group>
|
||||
</trans-unit>
|
||||
<trans-unit id="e698b03c34b459b1b006d7f0473a49b9fcf5dfc1" datatype="html">
|
||||
@ -567,7 +567,7 @@
|
||||
<target state="translated">Buoni sconto</target>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">apps/client/src/app/components/admin-overview/admin-overview.html</context>
|
||||
<context context-type="linenumber">152</context>
|
||||
<context context-type="linenumber">163</context>
|
||||
</context-group>
|
||||
</trans-unit>
|
||||
<trans-unit id="f6755cff4957d5c3c89bafce5651f1b6fa2b1fd9" datatype="html">
|
||||
@ -575,7 +575,7 @@
|
||||
<target state="translated">Aggiungi</target>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">apps/client/src/app/components/admin-overview/admin-overview.html</context>
|
||||
<context context-type="linenumber">187</context>
|
||||
<context context-type="linenumber">198</context>
|
||||
</context-group>
|
||||
</trans-unit>
|
||||
<trans-unit id="e799e6b926557f0098f41888cdf8df868eff3d47" datatype="html">
|
||||
@ -583,7 +583,7 @@
|
||||
<target state="translated">Bilancio domestico</target>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">apps/client/src/app/components/admin-overview/admin-overview.html</context>
|
||||
<context context-type="linenumber">194</context>
|
||||
<context context-type="linenumber">205</context>
|
||||
</context-group>
|
||||
</trans-unit>
|
||||
<trans-unit id="c7ac907e52a7ce2ac70b1786eb5f403ce306ce1f" datatype="html">
|
||||
@ -591,7 +591,7 @@
|
||||
<target state="translated">Svuota la cache</target>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">apps/client/src/app/components/admin-overview/admin-overview.html</context>
|
||||
<context context-type="linenumber">198</context>
|
||||
<context context-type="linenumber">209</context>
|
||||
</context-group>
|
||||
</trans-unit>
|
||||
<trans-unit id="2817099043823177227" datatype="html">
|
||||
@ -968,7 +968,7 @@
|
||||
</trans-unit>
|
||||
<trans-unit id="e5c369abfbe1bd70f577aa03b2679797e38d7590" datatype="html">
|
||||
<source> Fees for <x id="INTERPOLATION" equiv-text="{{ summary?.ordersCount }}"/> <x id="ICU" equiv-text="{summary?.ordersCount, plural, =1 {transaction} other {transactions}}"/> </source>
|
||||
<target state="translated">Commissioni per <x id="INTERPOLATION" equiv-text="{{ summary?.ordersCount }}"/> <x id="ICU" equiv-text="{summary?.ordersCount, plural, =1 {transaction} other {transactions}}"/> </target>
|
||||
<target state="translated">Commissioni per <x id="INTERPOLATION" equiv-text="{{ summary?.ordersCount }}"/> <x id="ICU" equiv-text="{summary?.ordersCount, plural, =1 {transazione} other {transazioni}}"/> </target>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html</context>
|
||||
<context context-type="linenumber">77,80</context>
|
||||
@ -976,7 +976,7 @@
|
||||
</trans-unit>
|
||||
<trans-unit id="272c7fd98af55bfa5b9d579176f1cfa25cd5489f" datatype="html">
|
||||
<source>{VAR_PLURAL, plural, =1 {transaction} other {transactions}}</source>
|
||||
<target state="translated">{VAR_PLURAL, plural, =1 {transaction} altre {transactions}}</target>
|
||||
<target state="translated">{VAR_PLURAL, plural, =1 {transazione} other {transazioni}}</target>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html</context>
|
||||
<context context-type="linenumber">78,79</context>
|
||||
@ -2315,7 +2315,7 @@
|
||||
<target state="translated">Gestione dei dati</target>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">apps/client/src/app/components/admin-overview/admin-overview.html</context>
|
||||
<context context-type="linenumber">20</context>
|
||||
<context context-type="linenumber">31</context>
|
||||
</context-group>
|
||||
</trans-unit>
|
||||
<trans-unit id="3ccabfc3dc288eaa2355ba43298c739f85951ec3" datatype="html">
|
||||
@ -2658,22 +2658,30 @@
|
||||
<context context-type="linenumber">18</context>
|
||||
</context-group>
|
||||
</trans-unit>
|
||||
<trans-unit id="ac598d664f86ba5783915d65f2664a7f38a9d23a" datatype="html">
|
||||
<source>Account Type</source>
|
||||
<target state="new">Account Type</target>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">apps/client/src/app/components/account-detail-dialog/account-detail-dialog.html</context>
|
||||
<context context-type="linenumber">25</context>
|
||||
</context-group>
|
||||
</trans-unit>
|
||||
<trans-unit id="98fc3013bfcbf452b9f37bbfcdb77b9b882866e3" datatype="html">
|
||||
<source>Excluded from Analysis</source>
|
||||
<target state="new">Excluded from Analysis</target>
|
||||
<target state="translated">Escluso dall'analisi</target>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html</context>
|
||||
<context context-type="linenumber">176</context>
|
||||
</context-group>
|
||||
</trans-unit>
|
||||
<trans-unit id="ac598d664f86ba5783915d65f2664a7f38a9d23a" datatype="html">
|
||||
<source>Account Type</source>
|
||||
<target state="translated">Tipo di account</target>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">apps/client/src/app/components/account-detail-dialog/account-detail-dialog.html</context>
|
||||
<context context-type="linenumber">25</context>
|
||||
</context-group>
|
||||
</trans-unit>
|
||||
<trans-unit id="458363f8e413759aa9e3235a53fd0f64cc916395" datatype="html">
|
||||
<source> If you retire today, you would be able to withdraw <x id="START_TAG_SPAN" ctype="x-span" equiv-text="<span class="font-weight-bold" >"/><x id="START_TAG_GF_VALUE" ctype="x-gf_value" equiv-text="<gf-value class="d-inline-block" [currency]="user?.settings?.baseCurrency" [locale]="user?.settings?.locale" [value]="withdrawalRatePerYear?.toNumber()" >"/><x id="CLOSE_TAG_GF_VALUE" ctype="x-gf_value" equiv-text="</gf-value>"/> per year<x id="CLOSE_TAG_SPAN" ctype="x-span" equiv-text="</span >"/> or <x id="START_TAG_SPAN" ctype="x-span" equiv-text="<span class="font-weight-bold" >"/><x id="START_TAG_GF_VALUE_1" ctype="x-gf_value_1" equiv-text="<gf-value class="d-inline-block" [currency]="user?.settings?.baseCurrency" [locale]="user?.settings?.locale" [value]="withdrawalRatePerMonth?.toNumber()" >"/><x id="CLOSE_TAG_GF_VALUE" ctype="x-gf_value" equiv-text="</gf-value>"/> per month<x id="CLOSE_TAG_SPAN" ctype="x-span" equiv-text="</span >"/>, based on your total assets of <x id="START_TAG_GF_VALUE_2" ctype="x-gf_value_2" equiv-text="<gf-value class="d-inline-block" [currency]="user?.settings?.baseCurrency" [locale]="user?.settings?.locale" [value]="fireWealth?.toNumber()" >"/><x id="CLOSE_TAG_GF_VALUE" ctype="x-gf_value" equiv-text="</gf-value>"/> and a withdrawal rate of 4%. </source>
|
||||
<target state="new"> If you retire today, you would be able to withdraw <x id="START_TAG_SPAN" ctype="x-span" equiv-text="<span class="font-weight-bold" >"/><x id="START_TAG_GF_VALUE" ctype="x-gf_value" equiv-text="<gf-value class="d-inline-block" [currency]="user?.settings?.baseCurrency" [locale]="user?.settings?.locale" [value]="withdrawalRatePerYear?.toNumber()" >"/><x id="CLOSE_TAG_GF_VALUE" ctype="x-gf_value" equiv-text="</gf-value>"/> per year<x id="CLOSE_TAG_SPAN" ctype="x-span" equiv-text="</span >"/> or <x id="START_TAG_SPAN" ctype="x-span" equiv-text="<span class="font-weight-bold" >"/><x id="START_TAG_GF_VALUE_1" ctype="x-gf_value_1" equiv-text="<gf-value class="d-inline-block" [currency]="user?.settings?.baseCurrency" [locale]="user?.settings?.locale" [value]="withdrawalRatePerMonth?.toNumber()" >"/><x id="CLOSE_TAG_GF_VALUE" ctype="x-gf_value" equiv-text="</gf-value>"/> per month<x id="CLOSE_TAG_SPAN" ctype="x-span" equiv-text="</span >"/>, based on your total assets of <x id="START_TAG_GF_VALUE_2" ctype="x-gf_value_2" equiv-text="<gf-value class="d-inline-block" [currency]="user?.settings?.baseCurrency" [locale]="user?.settings?.locale" [value]="fireWealth?.toNumber()" >"/><x id="CLOSE_TAG_GF_VALUE" ctype="x-gf_value" equiv-text="</gf-value>"/> and a withdrawal rate of 4%. </target>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/fire/fire-page.html</context>
|
||||
<context context-type="linenumber">38,66</context>
|
||||
</context-group>
|
||||
</trans-unit>
|
||||
</body>
|
||||
</file>
|
||||
</xliff>
|
||||
|
@ -418,7 +418,7 @@
|
||||
</context-group>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">apps/client/src/app/components/admin-overview/admin-overview.html</context>
|
||||
<context context-type="linenumber">11</context>
|
||||
<context context-type="linenumber">17</context>
|
||||
</context-group>
|
||||
</trans-unit>
|
||||
<trans-unit id="5eebcc824c2d34b17abba8c9ef718c5ce118a5c8" datatype="html">
|
||||
@ -490,7 +490,7 @@
|
||||
<target state="translated">per gebruiker</target>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">apps/client/src/app/components/admin-overview/admin-overview.html</context>
|
||||
<context context-type="linenumber">15</context>
|
||||
<context context-type="linenumber">26</context>
|
||||
</context-group>
|
||||
</trans-unit>
|
||||
<trans-unit id="5067ede95804e0e0e2b078747848367a7373cc9b" datatype="html">
|
||||
@ -498,7 +498,7 @@
|
||||
<target state="translated">Verzamel recente gegevens</target>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">apps/client/src/app/components/admin-overview/admin-overview.html</context>
|
||||
<context context-type="linenumber">33</context>
|
||||
<context context-type="linenumber">44</context>
|
||||
</context-group>
|
||||
</trans-unit>
|
||||
<trans-unit id="27e27f3f7338baefacfd5668bad03ece9c5955df" datatype="html">
|
||||
@ -506,7 +506,7 @@
|
||||
<target state="translated">Alle gegevens verzamelen</target>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">apps/client/src/app/components/admin-overview/admin-overview.html</context>
|
||||
<context context-type="linenumber">46</context>
|
||||
<context context-type="linenumber">57</context>
|
||||
</context-group>
|
||||
</trans-unit>
|
||||
<trans-unit id="cc65b67b46b69cf06ff1f16a909e61612c9d57b8" datatype="html">
|
||||
@ -518,7 +518,7 @@
|
||||
</context-group>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">apps/client/src/app/components/admin-overview/admin-overview.html</context>
|
||||
<context context-type="linenumber">60</context>
|
||||
<context context-type="linenumber">71</context>
|
||||
</context-group>
|
||||
</trans-unit>
|
||||
<trans-unit id="37ff0697aa81b2777250c483d2ce1ebdaa5ab042" datatype="html">
|
||||
@ -526,7 +526,7 @@
|
||||
<target state="translated">Wisselkoersen</target>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">apps/client/src/app/components/admin-overview/admin-overview.html</context>
|
||||
<context context-type="linenumber">67</context>
|
||||
<context context-type="linenumber">78</context>
|
||||
</context-group>
|
||||
</trans-unit>
|
||||
<trans-unit id="4567a660a7f67e254bbf13219906843e34d9f807" datatype="html">
|
||||
@ -534,7 +534,7 @@
|
||||
<target state="translated">Valuta toevoegen</target>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">apps/client/src/app/components/admin-overview/admin-overview.html</context>
|
||||
<context context-type="linenumber">106</context>
|
||||
<context context-type="linenumber">117</context>
|
||||
</context-group>
|
||||
</trans-unit>
|
||||
<trans-unit id="860e5f056b59410ec8db65cb53955505c6931752" datatype="html">
|
||||
@ -542,7 +542,7 @@
|
||||
<target state="translated">Systeembericht</target>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">apps/client/src/app/components/admin-overview/admin-overview.html</context>
|
||||
<context context-type="linenumber">112</context>
|
||||
<context context-type="linenumber">123</context>
|
||||
</context-group>
|
||||
</trans-unit>
|
||||
<trans-unit id="657028d5fc9c3da8f2d667b6b15cd0df8b9a3729" datatype="html">
|
||||
@ -550,7 +550,7 @@
|
||||
<target state="translated">Bericht instellen</target>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">apps/client/src/app/components/admin-overview/admin-overview.html</context>
|
||||
<context context-type="linenumber">134</context>
|
||||
<context context-type="linenumber">145</context>
|
||||
</context-group>
|
||||
</trans-unit>
|
||||
<trans-unit id="7fd64c34428887e4cd56d05534b89c100b8544ad" datatype="html">
|
||||
@ -558,7 +558,7 @@
|
||||
<target state="translated">Alleen lezen</target>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">apps/client/src/app/components/admin-overview/admin-overview.html</context>
|
||||
<context context-type="linenumber">139</context>
|
||||
<context context-type="linenumber">150</context>
|
||||
</context-group>
|
||||
</trans-unit>
|
||||
<trans-unit id="e698b03c34b459b1b006d7f0473a49b9fcf5dfc1" datatype="html">
|
||||
@ -566,7 +566,7 @@
|
||||
<target state="translated">Coupons</target>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">apps/client/src/app/components/admin-overview/admin-overview.html</context>
|
||||
<context context-type="linenumber">152</context>
|
||||
<context context-type="linenumber">163</context>
|
||||
</context-group>
|
||||
</trans-unit>
|
||||
<trans-unit id="f6755cff4957d5c3c89bafce5651f1b6fa2b1fd9" datatype="html">
|
||||
@ -574,7 +574,7 @@
|
||||
<target state="translated">Toevoegen</target>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">apps/client/src/app/components/admin-overview/admin-overview.html</context>
|
||||
<context context-type="linenumber">187</context>
|
||||
<context context-type="linenumber">198</context>
|
||||
</context-group>
|
||||
</trans-unit>
|
||||
<trans-unit id="e799e6b926557f0098f41888cdf8df868eff3d47" datatype="html">
|
||||
@ -582,7 +582,7 @@
|
||||
<target state="translated">Huishouding</target>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">apps/client/src/app/components/admin-overview/admin-overview.html</context>
|
||||
<context context-type="linenumber">194</context>
|
||||
<context context-type="linenumber">205</context>
|
||||
</context-group>
|
||||
</trans-unit>
|
||||
<trans-unit id="c7ac907e52a7ce2ac70b1786eb5f403ce306ce1f" datatype="html">
|
||||
@ -590,7 +590,7 @@
|
||||
<target state="translated">Cache legen</target>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">apps/client/src/app/components/admin-overview/admin-overview.html</context>
|
||||
<context context-type="linenumber">198</context>
|
||||
<context context-type="linenumber">209</context>
|
||||
</context-group>
|
||||
</trans-unit>
|
||||
<trans-unit id="2817099043823177227" datatype="html">
|
||||
@ -2314,7 +2314,7 @@
|
||||
<target state="translated">Gegevensbeheer</target>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">apps/client/src/app/components/admin-overview/admin-overview.html</context>
|
||||
<context context-type="linenumber">20</context>
|
||||
<context context-type="linenumber">31</context>
|
||||
</context-group>
|
||||
</trans-unit>
|
||||
<trans-unit id="3ccabfc3dc288eaa2355ba43298c739f85951ec3" datatype="html">
|
||||
@ -2673,6 +2673,14 @@
|
||||
<context context-type="linenumber">176</context>
|
||||
</context-group>
|
||||
</trans-unit>
|
||||
<trans-unit id="458363f8e413759aa9e3235a53fd0f64cc916395" datatype="html">
|
||||
<source> If you retire today, you would be able to withdraw <x id="START_TAG_SPAN" ctype="x-span" equiv-text="<span class="font-weight-bold" >"/><x id="START_TAG_GF_VALUE" ctype="x-gf_value" equiv-text="<gf-value class="d-inline-block" [currency]="user?.settings?.baseCurrency" [locale]="user?.settings?.locale" [value]="withdrawalRatePerYear?.toNumber()" >"/><x id="CLOSE_TAG_GF_VALUE" ctype="x-gf_value" equiv-text="</gf-value>"/> per year<x id="CLOSE_TAG_SPAN" ctype="x-span" equiv-text="</span >"/> or <x id="START_TAG_SPAN" ctype="x-span" equiv-text="<span class="font-weight-bold" >"/><x id="START_TAG_GF_VALUE_1" ctype="x-gf_value_1" equiv-text="<gf-value class="d-inline-block" [currency]="user?.settings?.baseCurrency" [locale]="user?.settings?.locale" [value]="withdrawalRatePerMonth?.toNumber()" >"/><x id="CLOSE_TAG_GF_VALUE" ctype="x-gf_value" equiv-text="</gf-value>"/> per month<x id="CLOSE_TAG_SPAN" ctype="x-span" equiv-text="</span >"/>, based on your total assets of <x id="START_TAG_GF_VALUE_2" ctype="x-gf_value_2" equiv-text="<gf-value class="d-inline-block" [currency]="user?.settings?.baseCurrency" [locale]="user?.settings?.locale" [value]="fireWealth?.toNumber()" >"/><x id="CLOSE_TAG_GF_VALUE" ctype="x-gf_value" equiv-text="</gf-value>"/> and a withdrawal rate of 4%. </source>
|
||||
<target state="new"> If you retire today, you would be able to withdraw <x id="START_TAG_SPAN" ctype="x-span" equiv-text="<span class="font-weight-bold" >"/><x id="START_TAG_GF_VALUE" ctype="x-gf_value" equiv-text="<gf-value class="d-inline-block" [currency]="user?.settings?.baseCurrency" [locale]="user?.settings?.locale" [value]="withdrawalRatePerYear?.toNumber()" >"/><x id="CLOSE_TAG_GF_VALUE" ctype="x-gf_value" equiv-text="</gf-value>"/> per year<x id="CLOSE_TAG_SPAN" ctype="x-span" equiv-text="</span >"/> or <x id="START_TAG_SPAN" ctype="x-span" equiv-text="<span class="font-weight-bold" >"/><x id="START_TAG_GF_VALUE_1" ctype="x-gf_value_1" equiv-text="<gf-value class="d-inline-block" [currency]="user?.settings?.baseCurrency" [locale]="user?.settings?.locale" [value]="withdrawalRatePerMonth?.toNumber()" >"/><x id="CLOSE_TAG_GF_VALUE" ctype="x-gf_value" equiv-text="</gf-value>"/> per month<x id="CLOSE_TAG_SPAN" ctype="x-span" equiv-text="</span >"/>, based on your total assets of <x id="START_TAG_GF_VALUE_2" ctype="x-gf_value_2" equiv-text="<gf-value class="d-inline-block" [currency]="user?.settings?.baseCurrency" [locale]="user?.settings?.locale" [value]="fireWealth?.toNumber()" >"/><x id="CLOSE_TAG_GF_VALUE" ctype="x-gf_value" equiv-text="</gf-value>"/> and a withdrawal rate of 4%. </target>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/fire/fire-page.html</context>
|
||||
<context context-type="linenumber">38,66</context>
|
||||
</context-group>
|
||||
</trans-unit>
|
||||
</body>
|
||||
</file>
|
||||
</xliff>
|
||||
|
@ -386,7 +386,7 @@
|
||||
</context-group>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">apps/client/src/app/components/admin-overview/admin-overview.html</context>
|
||||
<context context-type="linenumber">11</context>
|
||||
<context context-type="linenumber">17</context>
|
||||
</context-group>
|
||||
</trans-unit>
|
||||
<trans-unit id="5eebcc824c2d34b17abba8c9ef718c5ce118a5c8" datatype="html">
|
||||
@ -449,21 +449,21 @@
|
||||
<source>per User</source>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">apps/client/src/app/components/admin-overview/admin-overview.html</context>
|
||||
<context context-type="linenumber">15</context>
|
||||
<context context-type="linenumber">26</context>
|
||||
</context-group>
|
||||
</trans-unit>
|
||||
<trans-unit id="5067ede95804e0e0e2b078747848367a7373cc9b" datatype="html">
|
||||
<source>Gather Recent Data</source>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">apps/client/src/app/components/admin-overview/admin-overview.html</context>
|
||||
<context context-type="linenumber">33</context>
|
||||
<context context-type="linenumber">44</context>
|
||||
</context-group>
|
||||
</trans-unit>
|
||||
<trans-unit id="27e27f3f7338baefacfd5668bad03ece9c5955df" datatype="html">
|
||||
<source>Gather All Data</source>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">apps/client/src/app/components/admin-overview/admin-overview.html</context>
|
||||
<context context-type="linenumber">46</context>
|
||||
<context context-type="linenumber">57</context>
|
||||
</context-group>
|
||||
</trans-unit>
|
||||
<trans-unit id="cc65b67b46b69cf06ff1f16a909e61612c9d57b8" datatype="html">
|
||||
@ -474,70 +474,70 @@
|
||||
</context-group>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">apps/client/src/app/components/admin-overview/admin-overview.html</context>
|
||||
<context context-type="linenumber">60</context>
|
||||
<context context-type="linenumber">71</context>
|
||||
</context-group>
|
||||
</trans-unit>
|
||||
<trans-unit id="37ff0697aa81b2777250c483d2ce1ebdaa5ab042" datatype="html">
|
||||
<source>Exchange Rates</source>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">apps/client/src/app/components/admin-overview/admin-overview.html</context>
|
||||
<context context-type="linenumber">67</context>
|
||||
<context context-type="linenumber">78</context>
|
||||
</context-group>
|
||||
</trans-unit>
|
||||
<trans-unit id="4567a660a7f67e254bbf13219906843e34d9f807" datatype="html">
|
||||
<source>Add Currency</source>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">apps/client/src/app/components/admin-overview/admin-overview.html</context>
|
||||
<context context-type="linenumber">106</context>
|
||||
<context context-type="linenumber">117</context>
|
||||
</context-group>
|
||||
</trans-unit>
|
||||
<trans-unit id="860e5f056b59410ec8db65cb53955505c6931752" datatype="html">
|
||||
<source>System Message</source>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">apps/client/src/app/components/admin-overview/admin-overview.html</context>
|
||||
<context context-type="linenumber">112</context>
|
||||
<context context-type="linenumber">123</context>
|
||||
</context-group>
|
||||
</trans-unit>
|
||||
<trans-unit id="657028d5fc9c3da8f2d667b6b15cd0df8b9a3729" datatype="html">
|
||||
<source>Set Message</source>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">apps/client/src/app/components/admin-overview/admin-overview.html</context>
|
||||
<context context-type="linenumber">134</context>
|
||||
<context context-type="linenumber">145</context>
|
||||
</context-group>
|
||||
</trans-unit>
|
||||
<trans-unit id="7fd64c34428887e4cd56d05534b89c100b8544ad" datatype="html">
|
||||
<source>Read-only Mode</source>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">apps/client/src/app/components/admin-overview/admin-overview.html</context>
|
||||
<context context-type="linenumber">139</context>
|
||||
<context context-type="linenumber">150</context>
|
||||
</context-group>
|
||||
</trans-unit>
|
||||
<trans-unit id="e698b03c34b459b1b006d7f0473a49b9fcf5dfc1" datatype="html">
|
||||
<source>Coupons</source>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">apps/client/src/app/components/admin-overview/admin-overview.html</context>
|
||||
<context context-type="linenumber">152</context>
|
||||
<context context-type="linenumber">163</context>
|
||||
</context-group>
|
||||
</trans-unit>
|
||||
<trans-unit id="f6755cff4957d5c3c89bafce5651f1b6fa2b1fd9" datatype="html">
|
||||
<source>Add</source>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">apps/client/src/app/components/admin-overview/admin-overview.html</context>
|
||||
<context context-type="linenumber">187</context>
|
||||
<context context-type="linenumber">198</context>
|
||||
</context-group>
|
||||
</trans-unit>
|
||||
<trans-unit id="e799e6b926557f0098f41888cdf8df868eff3d47" datatype="html">
|
||||
<source>Housekeeping</source>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">apps/client/src/app/components/admin-overview/admin-overview.html</context>
|
||||
<context context-type="linenumber">194</context>
|
||||
<context context-type="linenumber">205</context>
|
||||
</context-group>
|
||||
</trans-unit>
|
||||
<trans-unit id="c7ac907e52a7ce2ac70b1786eb5f403ce306ce1f" datatype="html">
|
||||
<source>Flush Cache</source>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">apps/client/src/app/components/admin-overview/admin-overview.html</context>
|
||||
<context context-type="linenumber">198</context>
|
||||
<context context-type="linenumber">209</context>
|
||||
</context-group>
|
||||
</trans-unit>
|
||||
<trans-unit id="2817099043823177227" datatype="html">
|
||||
@ -2070,7 +2070,7 @@
|
||||
<source>Data Management</source>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">apps/client/src/app/components/admin-overview/admin-overview.html</context>
|
||||
<context context-type="linenumber">20</context>
|
||||
<context context-type="linenumber">31</context>
|
||||
</context-group>
|
||||
</trans-unit>
|
||||
<trans-unit id="3ccabfc3dc288eaa2355ba43298c739f85951ec3" datatype="html">
|
||||
@ -2389,6 +2389,13 @@
|
||||
<context context-type="linenumber">25</context>
|
||||
</context-group>
|
||||
</trans-unit>
|
||||
<trans-unit id="458363f8e413759aa9e3235a53fd0f64cc916395" datatype="html">
|
||||
<source> If you retire today, you would be able to withdraw <x id="START_TAG_SPAN" ctype="x-span" equiv-text="<span class="font-weight-bold" >"/><x id="START_TAG_GF_VALUE" ctype="x-gf_value" equiv-text="<gf-value class="d-inline-block" [currency]="user?.settings?.baseCurrency" [locale]="user?.settings?.locale" [value]="withdrawalRatePerYear?.toNumber()" >"/><x id="CLOSE_TAG_GF_VALUE" ctype="x-gf_value" equiv-text="</gf-value>"/> per year<x id="CLOSE_TAG_SPAN" ctype="x-span" equiv-text="</span >"/> or <x id="START_TAG_SPAN" ctype="x-span" equiv-text="<span class="font-weight-bold" >"/><x id="START_TAG_GF_VALUE_1" ctype="x-gf_value_1" equiv-text="<gf-value class="d-inline-block" [currency]="user?.settings?.baseCurrency" [locale]="user?.settings?.locale" [value]="withdrawalRatePerMonth?.toNumber()" >"/><x id="CLOSE_TAG_GF_VALUE" ctype="x-gf_value" equiv-text="</gf-value>"/> per month<x id="CLOSE_TAG_SPAN" ctype="x-span" equiv-text="</span >"/>, based on your total assets of <x id="START_TAG_GF_VALUE_2" ctype="x-gf_value_2" equiv-text="<gf-value class="d-inline-block" [currency]="user?.settings?.baseCurrency" [locale]="user?.settings?.locale" [value]="fireWealth?.toNumber()" >"/><x id="CLOSE_TAG_GF_VALUE" ctype="x-gf_value" equiv-text="</gf-value>"/> and a withdrawal rate of 4%. </source>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/fire/fire-page.html</context>
|
||||
<context context-type="linenumber">38,66</context>
|
||||
</context-group>
|
||||
</trans-unit>
|
||||
</body>
|
||||
</file>
|
||||
</xliff>
|
||||
|
@ -1,7 +1,7 @@
|
||||
<div *ngIf="icon" class="align-self-center mr-3">
|
||||
<ion-icon class="h3 m-0" [name]="icon"></ion-icon>
|
||||
</div>
|
||||
<div>
|
||||
<div class="w-100">
|
||||
<ng-template #label><ng-content></ng-content></ng-template>
|
||||
<ng-container *ngIf="value || value === 0 || value === null">
|
||||
<div
|
||||
|
@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "ghostfolio",
|
||||
"version": "1.201.0",
|
||||
"version": "1.202.0",
|
||||
"homepage": "https://ghostfol.io",
|
||||
"license": "AGPL-3.0",
|
||||
"scripts": {
|
||||
|
Reference in New Issue
Block a user