commit
edbcd0e225
CHANGELOG.mdpackage-lock.jsonpackage.json
apps
api/src
app
admin
endpoints
portfolio
services
client/src/locales
libs
common/src/lib/interfaces/responses
ui/src/lib/benchmark
prisma
12
CHANGELOG.md
12
CHANGELOG.md
@ -5,12 +5,22 @@ 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).
|
||||
|
||||
## Unreleased
|
||||
## 2.161.0 - 2025-05-06
|
||||
|
||||
### Added
|
||||
|
||||
- Extended the endpoint to get a holding by the date of the last all time high and the current change to the all time high
|
||||
|
||||
### Changed
|
||||
|
||||
- Renamed `Order` to `activities` in the `SymbolProfile` database schema
|
||||
- Improved the language localization for Turkish (`tr`)
|
||||
|
||||
### Fixed
|
||||
|
||||
- Fixed an issue in the performance calculation on the date of an activity when the unit price differs from the market price
|
||||
- Fixed the horizontal overflow in the table of the benchmark component
|
||||
|
||||
## 2.160.0 - 2025-05-04
|
||||
|
||||
### Added
|
||||
|
@ -227,7 +227,7 @@ export class AdminService {
|
||||
|
||||
if (sortColumn === 'activitiesCount') {
|
||||
orderBy = {
|
||||
Order: {
|
||||
activities: {
|
||||
_count: sortDirection
|
||||
}
|
||||
};
|
||||
@ -246,10 +246,15 @@ export class AdminService {
|
||||
select: {
|
||||
_count: {
|
||||
select: {
|
||||
Order: true,
|
||||
activities: true,
|
||||
watchedBy: true
|
||||
}
|
||||
},
|
||||
activities: {
|
||||
orderBy: [{ date: 'asc' }],
|
||||
select: { date: true },
|
||||
take: 1
|
||||
},
|
||||
assetClass: true,
|
||||
assetSubClass: true,
|
||||
comment: true,
|
||||
@ -260,11 +265,6 @@ export class AdminService {
|
||||
isActive: true,
|
||||
isUsedByUsersWithSubscription: true,
|
||||
name: true,
|
||||
Order: {
|
||||
orderBy: [{ date: 'asc' }],
|
||||
select: { date: true },
|
||||
take: 1
|
||||
},
|
||||
scraperConfiguration: true,
|
||||
sectors: true,
|
||||
symbol: true,
|
||||
@ -311,6 +311,7 @@ export class AdminService {
|
||||
assetProfiles.map(
|
||||
async ({
|
||||
_count,
|
||||
activities,
|
||||
assetClass,
|
||||
assetSubClass,
|
||||
comment,
|
||||
@ -321,7 +322,6 @@ export class AdminService {
|
||||
isActive,
|
||||
isUsedByUsersWithSubscription,
|
||||
name,
|
||||
Order,
|
||||
sectors,
|
||||
symbol,
|
||||
SymbolProfileOverrides
|
||||
@ -383,8 +383,8 @@ export class AdminService {
|
||||
symbol,
|
||||
marketDataItemCount,
|
||||
sectorsCount,
|
||||
activitiesCount: _count.Order,
|
||||
date: Order?.[0]?.date,
|
||||
activitiesCount: _count.activities,
|
||||
date: activities?.[0]?.date,
|
||||
isUsedByUsersWithSubscription:
|
||||
await isUsedByUsersWithSubscription,
|
||||
watchedByCount: _count.watchedBy
|
||||
@ -654,7 +654,7 @@ export class AdminService {
|
||||
select: {
|
||||
_count: {
|
||||
select: {
|
||||
Order: {
|
||||
activities: {
|
||||
where: {
|
||||
User: {
|
||||
subscriptions: {
|
||||
@ -675,7 +675,7 @@ export class AdminService {
|
||||
}
|
||||
});
|
||||
|
||||
return _count.Order > 0;
|
||||
return _count.activities > 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -8,6 +8,7 @@ import { RulesService } from '@ghostfolio/api/app/portfolio/rules.service';
|
||||
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 { BenchmarkModule } from '@ghostfolio/api/services/benchmark/benchmark.module';
|
||||
import { ConfigurationModule } from '@ghostfolio/api/services/configuration/configuration.module';
|
||||
import { DataProviderModule } from '@ghostfolio/api/services/data-provider/data-provider.module';
|
||||
import { ExchangeRateDataModule } from '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.module';
|
||||
@ -27,6 +28,7 @@ import { AiService } from './ai.service';
|
||||
controllers: [AiController],
|
||||
imports: [
|
||||
ApiModule,
|
||||
BenchmarkModule,
|
||||
ConfigurationModule,
|
||||
DataProviderModule,
|
||||
ExchangeRateDataModule,
|
||||
|
@ -9,6 +9,7 @@ import { RulesService } from '@ghostfolio/api/app/portfolio/rules.service';
|
||||
import { RedisCacheModule } from '@ghostfolio/api/app/redis-cache/redis-cache.module';
|
||||
import { UserModule } from '@ghostfolio/api/app/user/user.module';
|
||||
import { TransformDataSourceInRequestModule } from '@ghostfolio/api/interceptors/transform-data-source-in-request/transform-data-source-in-request.module';
|
||||
import { BenchmarkModule } from '@ghostfolio/api/services/benchmark/benchmark.module';
|
||||
import { DataProviderModule } from '@ghostfolio/api/services/data-provider/data-provider.module';
|
||||
import { ExchangeRateDataModule } from '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.module';
|
||||
import { ImpersonationModule } from '@ghostfolio/api/services/impersonation/impersonation.module';
|
||||
@ -25,6 +26,7 @@ import { PublicController } from './public.controller';
|
||||
controllers: [PublicController],
|
||||
imports: [
|
||||
AccessModule,
|
||||
BenchmarkModule,
|
||||
DataProviderModule,
|
||||
ExchangeRateDataModule,
|
||||
ImpersonationModule,
|
||||
|
@ -193,5 +193,83 @@ describe('PortfolioCalculator', () => {
|
||||
{ date: '2021-12-01', investment: 0 }
|
||||
]);
|
||||
});
|
||||
|
||||
it.only('with BALN.SW buy (with unit price lower than closing price)', async () => {
|
||||
jest.useFakeTimers().setSystemTime(parseDate('2021-12-18').getTime());
|
||||
|
||||
const activities: Activity[] = [
|
||||
{
|
||||
...activityDummyData,
|
||||
date: new Date('2021-11-30'),
|
||||
feeInAssetProfileCurrency: 1.55,
|
||||
quantity: 2,
|
||||
SymbolProfile: {
|
||||
...symbolProfileDummyData,
|
||||
currency: 'CHF',
|
||||
dataSource: 'YAHOO',
|
||||
name: 'Bâloise Holding AG',
|
||||
symbol: 'BALN.SW'
|
||||
},
|
||||
type: 'BUY',
|
||||
unitPriceInAssetProfileCurrency: 135.0
|
||||
}
|
||||
];
|
||||
|
||||
const portfolioCalculator = portfolioCalculatorFactory.createCalculator({
|
||||
activities,
|
||||
calculationType: PerformanceCalculationType.ROAI,
|
||||
currency: 'CHF',
|
||||
userId: userDummyData.id
|
||||
});
|
||||
|
||||
const portfolioSnapshot = await portfolioCalculator.computeSnapshot();
|
||||
const snapshotOnBuyDate = portfolioSnapshot.historicalData.find(
|
||||
({ date }) => {
|
||||
return date === '2021-11-30';
|
||||
}
|
||||
);
|
||||
|
||||
// Closing price on 2021-11-30: 136.6
|
||||
expect(snapshotOnBuyDate?.netPerformanceWithCurrencyEffect).toEqual(1.65); // 2 * (136.6 - 135.0) - 1.55 = 1.65
|
||||
});
|
||||
|
||||
it.only('with BALN.SW buy (with unit price lower than closing price), calculated on buy date', async () => {
|
||||
jest.useFakeTimers().setSystemTime(parseDate('2021-11-30').getTime());
|
||||
|
||||
const activities: Activity[] = [
|
||||
{
|
||||
...activityDummyData,
|
||||
date: new Date('2021-11-30'),
|
||||
feeInAssetProfileCurrency: 1.55,
|
||||
quantity: 2,
|
||||
SymbolProfile: {
|
||||
...symbolProfileDummyData,
|
||||
currency: 'CHF',
|
||||
dataSource: 'YAHOO',
|
||||
name: 'Bâloise Holding AG',
|
||||
symbol: 'BALN.SW'
|
||||
},
|
||||
type: 'BUY',
|
||||
unitPriceInAssetProfileCurrency: 135.0
|
||||
}
|
||||
];
|
||||
|
||||
const portfolioCalculator = portfolioCalculatorFactory.createCalculator({
|
||||
activities,
|
||||
calculationType: PerformanceCalculationType.ROAI,
|
||||
currency: 'CHF',
|
||||
userId: userDummyData.id
|
||||
});
|
||||
|
||||
const portfolioSnapshot = await portfolioCalculator.computeSnapshot();
|
||||
const snapshotOnBuyDate = portfolioSnapshot.historicalData.find(
|
||||
({ date }) => {
|
||||
return date === '2021-11-30';
|
||||
}
|
||||
);
|
||||
|
||||
// Closing price on 2021-11-30: 136.6
|
||||
expect(snapshotOnBuyDate?.netPerformanceWithCurrencyEffect).toEqual(1.65); // 2 * (136.6 - 135.0) - 1.55 = 1.65
|
||||
});
|
||||
});
|
||||
});
|
||||
|
@ -142,19 +142,22 @@ describe('PortfolioCalculator', () => {
|
||||
valueWithCurrencyEffect: 0
|
||||
});
|
||||
|
||||
/**
|
||||
* Closing price on 2021-12-12: 50098.3
|
||||
*/
|
||||
expect(portfolioSnapshot.historicalData[1]).toEqual({
|
||||
date: '2021-12-12',
|
||||
investmentValueWithCurrencyEffect: 44558.42,
|
||||
netPerformance: -4.46,
|
||||
netPerformanceInPercentage: 0,
|
||||
netPerformanceInPercentageWithCurrencyEffect: 0,
|
||||
netPerformanceWithCurrencyEffect: -4.46,
|
||||
netWorth: 44558.42,
|
||||
netPerformance: 5535.42, // 1 * (50098.3 - 44558.42) - 4.46 = 5535.42
|
||||
netPerformanceInPercentage: 0.12422837255001412, // 5535.42 ÷ 44558.42 = 0.12422837255001412
|
||||
netPerformanceInPercentageWithCurrencyEffect: 0.12422837255001412, // 5535.42 ÷ 44558.42 = 0.12422837255001412
|
||||
netPerformanceWithCurrencyEffect: 5535.42,
|
||||
netWorth: 50098.3, // 1 * 50098.3 = 50098.3
|
||||
totalAccountBalance: 0,
|
||||
totalInvestment: 44558.42,
|
||||
totalInvestmentValueWithCurrencyEffect: 44558.42,
|
||||
value: 44558.42,
|
||||
valueWithCurrencyEffect: 44558.42
|
||||
value: 50098.3, // 1 * 50098.3 = 50098.3
|
||||
valueWithCurrencyEffect: 50098.3
|
||||
});
|
||||
|
||||
expect(
|
||||
|
@ -142,19 +142,22 @@ describe('PortfolioCalculator', () => {
|
||||
valueWithCurrencyEffect: 0
|
||||
});
|
||||
|
||||
/**
|
||||
* Closing price on 2021-12-12: 50098.3
|
||||
*/
|
||||
expect(portfolioSnapshot.historicalData[1]).toEqual({
|
||||
date: '2021-12-12',
|
||||
investmentValueWithCurrencyEffect: 44558.42,
|
||||
netPerformance: -4.46,
|
||||
netPerformanceInPercentage: 0,
|
||||
netPerformanceInPercentageWithCurrencyEffect: 0,
|
||||
netPerformanceWithCurrencyEffect: -4.46,
|
||||
netWorth: 44558.42,
|
||||
netPerformance: 5535.42, // 1 * (50098.3 - 44558.42) - 4.46 = 5535.42
|
||||
netPerformanceInPercentage: 0.12422837255001412, // 5535.42 ÷ 44558.42 = 0.12422837255001412
|
||||
netPerformanceInPercentageWithCurrencyEffect: 0.12422837255001412, // 5535.42 ÷ 44558.42 = 0.12422837255001412
|
||||
netPerformanceWithCurrencyEffect: 5535.42, // 1 * (50098.3 - 44558.42) - 4.46 = 5535.42
|
||||
netWorth: 50098.3, // 1 * 50098.3 = 50098.3
|
||||
totalAccountBalance: 0,
|
||||
totalInvestment: 44558.42,
|
||||
totalInvestmentValueWithCurrencyEffect: 44558.42,
|
||||
value: 44558.42,
|
||||
valueWithCurrencyEffect: 44558.42
|
||||
value: 50098.3, // 1 * 50098.3 = 50098.3
|
||||
valueWithCurrencyEffect: 50098.3
|
||||
});
|
||||
|
||||
expect(
|
||||
|
@ -145,19 +145,23 @@ describe('PortfolioCalculator', () => {
|
||||
valueWithCurrencyEffect: 0
|
||||
});
|
||||
|
||||
/**
|
||||
* Closing price on 2022-03-07 is unknown,
|
||||
* hence it uses the last unit price (2022-04-11): 87.8
|
||||
*/
|
||||
expect(portfolioSnapshot.historicalData[1]).toEqual({
|
||||
date: '2022-03-07',
|
||||
investmentValueWithCurrencyEffect: 151.6,
|
||||
netPerformance: 0,
|
||||
netPerformanceInPercentage: 0,
|
||||
netPerformanceInPercentageWithCurrencyEffect: 0,
|
||||
netPerformanceWithCurrencyEffect: 0,
|
||||
netWorth: 151.6,
|
||||
netPerformance: 24, // 2 * (87.8 - 75.8) = 24
|
||||
netPerformanceInPercentage: 0.158311345646438, // 24 ÷ 151.6 = 0.158311345646438
|
||||
netPerformanceInPercentageWithCurrencyEffect: 0.158311345646438, // 24 ÷ 151.6 = 0.158311345646438
|
||||
netPerformanceWithCurrencyEffect: 24,
|
||||
netWorth: 175.6, // 2 * 87.8 = 175.6
|
||||
totalAccountBalance: 0,
|
||||
totalInvestment: 151.6,
|
||||
totalInvestmentValueWithCurrencyEffect: 151.6,
|
||||
value: 151.6,
|
||||
valueWithCurrencyEffect: 151.6
|
||||
value: 175.6, // 2 * 87.8 = 175.6
|
||||
valueWithCurrencyEffect: 175.6
|
||||
});
|
||||
|
||||
expect(
|
||||
|
@ -456,12 +456,19 @@ export class RoaiPortfolioCalculator extends PortfolioCalculator {
|
||||
);
|
||||
}
|
||||
|
||||
const marketPriceInBaseCurrency =
|
||||
order.unitPriceFromMarketData?.mul(currentExchangeRate ?? 1) ??
|
||||
new Big(0);
|
||||
const marketPriceInBaseCurrencyWithCurrencyEffect =
|
||||
order.unitPriceFromMarketData?.mul(exchangeRateAtOrderDate ?? 1) ??
|
||||
new Big(0);
|
||||
|
||||
const valueOfInvestmentBeforeTransaction = totalUnits.mul(
|
||||
order.unitPriceInBaseCurrency
|
||||
marketPriceInBaseCurrency
|
||||
);
|
||||
|
||||
const valueOfInvestmentBeforeTransactionWithCurrencyEffect =
|
||||
totalUnits.mul(order.unitPriceInBaseCurrencyWithCurrencyEffect);
|
||||
totalUnits.mul(marketPriceInBaseCurrencyWithCurrencyEffect);
|
||||
|
||||
if (!investmentAtStartDate && i >= indexOfStartOrder) {
|
||||
investmentAtStartDate = totalInvestment ?? new Big(0);
|
||||
@ -558,10 +565,10 @@ export class RoaiPortfolioCalculator extends PortfolioCalculator {
|
||||
|
||||
totalUnits = totalUnits.plus(order.quantity.mul(getFactor(order.type)));
|
||||
|
||||
const valueOfInvestment = totalUnits.mul(order.unitPriceInBaseCurrency);
|
||||
const valueOfInvestment = totalUnits.mul(marketPriceInBaseCurrency);
|
||||
|
||||
const valueOfInvestmentWithCurrencyEffect = totalUnits.mul(
|
||||
order.unitPriceInBaseCurrencyWithCurrencyEffect
|
||||
marketPriceInBaseCurrencyWithCurrencyEffect
|
||||
);
|
||||
|
||||
const grossPerformanceFromSell =
|
||||
@ -701,17 +708,23 @@ export class RoaiPortfolioCalculator extends PortfolioCalculator {
|
||||
investmentValuesWithCurrencyEffect[order.date] ?? new Big(0)
|
||||
).add(transactionInvestmentWithCurrencyEffect);
|
||||
|
||||
// If duration is effectively zero (first day), use the actual investment as the base.
|
||||
// Otherwise, use the calculated time-weighted average.
|
||||
timeWeightedInvestmentValues[order.date] =
|
||||
totalInvestmentDays > 0
|
||||
totalInvestmentDays > Number.EPSILON
|
||||
? sumOfTimeWeightedInvestments.div(totalInvestmentDays)
|
||||
: new Big(0);
|
||||
: totalInvestment.gt(0)
|
||||
? totalInvestment
|
||||
: new Big(0);
|
||||
|
||||
timeWeightedInvestmentValuesWithCurrencyEffect[order.date] =
|
||||
totalInvestmentDays > 0
|
||||
totalInvestmentDays > Number.EPSILON
|
||||
? sumOfTimeWeightedInvestmentsWithCurrencyEffect.div(
|
||||
totalInvestmentDays
|
||||
)
|
||||
: new Big(0);
|
||||
: totalInvestmentWithCurrencyEffect.gt(0)
|
||||
? totalInvestmentWithCurrencyEffect
|
||||
: new Big(0);
|
||||
}
|
||||
|
||||
if (PortfolioCalculator.ENABLE_LOGGING) {
|
||||
|
@ -9,6 +9,7 @@ import { RedactValuesInResponseModule } from '@ghostfolio/api/interceptors/redac
|
||||
import { TransformDataSourceInRequestModule } from '@ghostfolio/api/interceptors/transform-data-source-in-request/transform-data-source-in-request.module';
|
||||
import { TransformDataSourceInResponseModule } from '@ghostfolio/api/interceptors/transform-data-source-in-response/transform-data-source-in-response.module';
|
||||
import { ApiModule } from '@ghostfolio/api/services/api/api.module';
|
||||
import { BenchmarkModule } from '@ghostfolio/api/services/benchmark/benchmark.module';
|
||||
import { ConfigurationModule } from '@ghostfolio/api/services/configuration/configuration.module';
|
||||
import { DataProviderModule } from '@ghostfolio/api/services/data-provider/data-provider.module';
|
||||
import { ExchangeRateDataModule } from '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.module';
|
||||
@ -33,6 +34,7 @@ import { RulesService } from './rules.service';
|
||||
imports: [
|
||||
AccessModule,
|
||||
ApiModule,
|
||||
BenchmarkModule,
|
||||
ConfigurationModule,
|
||||
DataGatheringModule,
|
||||
DataProviderModule,
|
||||
|
@ -20,6 +20,7 @@ import { RegionalMarketClusterRiskEmergingMarkets } from '@ghostfolio/api/models
|
||||
import { RegionalMarketClusterRiskEurope } from '@ghostfolio/api/models/rules/regional-market-cluster-risk/europe';
|
||||
import { RegionalMarketClusterRiskJapan } from '@ghostfolio/api/models/rules/regional-market-cluster-risk/japan';
|
||||
import { RegionalMarketClusterRiskNorthAmerica } from '@ghostfolio/api/models/rules/regional-market-cluster-risk/north-america';
|
||||
import { BenchmarkService } from '@ghostfolio/api/services/benchmark/benchmark.service';
|
||||
import { DataProviderService } from '@ghostfolio/api/services/data-provider/data-provider.service';
|
||||
import { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.service';
|
||||
import { ImpersonationService } from '@ghostfolio/api/services/impersonation/impersonation.service';
|
||||
@ -100,6 +101,7 @@ export class PortfolioService {
|
||||
public constructor(
|
||||
private readonly accountBalanceService: AccountBalanceService,
|
||||
private readonly accountService: AccountService,
|
||||
private readonly benchmarkService: BenchmarkService,
|
||||
private readonly calculatorFactory: PortfolioCalculatorFactory,
|
||||
private readonly dataProviderService: DataProviderService,
|
||||
private readonly exchangeRateDataService: ExchangeRateDataService,
|
||||
@ -669,6 +671,7 @@ export class PortfolioService {
|
||||
netPerformancePercent: undefined,
|
||||
netPerformancePercentWithCurrencyEffect: undefined,
|
||||
netPerformanceWithCurrencyEffect: undefined,
|
||||
performances: undefined,
|
||||
quantity: undefined,
|
||||
SymbolProfile: undefined,
|
||||
tags: [],
|
||||
@ -752,6 +755,10 @@ export class PortfolioService {
|
||||
activitiesOfHolding[0].unitPriceInAssetProfileCurrency,
|
||||
marketPrice
|
||||
);
|
||||
let marketPriceMaxDate =
|
||||
marketPrice > activitiesOfHolding[0].unitPriceInAssetProfileCurrency
|
||||
? new Date()
|
||||
: activitiesOfHolding[0].date;
|
||||
let marketPriceMin = Math.min(
|
||||
activitiesOfHolding[0].unitPriceInAssetProfileCurrency,
|
||||
marketPrice
|
||||
@ -793,7 +800,10 @@ export class PortfolioService {
|
||||
quantity: currentQuantity
|
||||
});
|
||||
|
||||
marketPriceMax = Math.max(marketPrice ?? 0, marketPriceMax);
|
||||
if (marketPrice > marketPriceMax) {
|
||||
marketPriceMax = marketPrice;
|
||||
marketPriceMaxDate = parseISO(date);
|
||||
}
|
||||
marketPriceMin = Math.min(
|
||||
marketPrice ?? Number.MAX_SAFE_INTEGER,
|
||||
marketPriceMin
|
||||
@ -809,6 +819,12 @@ export class PortfolioService {
|
||||
});
|
||||
}
|
||||
|
||||
const performancePercent =
|
||||
this.benchmarkService.calculateChangeInPercentage(
|
||||
marketPriceMax,
|
||||
marketPrice
|
||||
);
|
||||
|
||||
return {
|
||||
firstBuyDate,
|
||||
marketPrice,
|
||||
@ -846,6 +862,12 @@ export class PortfolioService {
|
||||
]?.toNumber(),
|
||||
netPerformanceWithCurrencyEffect:
|
||||
position.netPerformanceWithCurrencyEffectMap?.['max']?.toNumber(),
|
||||
performances: {
|
||||
allTimeHigh: {
|
||||
performancePercent,
|
||||
date: marketPriceMaxDate
|
||||
}
|
||||
},
|
||||
quantity: quantity.toNumber(),
|
||||
value: this.exchangeRateDataService.toCurrency(
|
||||
quantity.mul(marketPrice ?? 0).toNumber(),
|
||||
@ -885,6 +907,7 @@ export class PortfolioService {
|
||||
|
||||
const historicalDataArray: HistoricalDataItem[] = [];
|
||||
let marketPriceMax = marketPrice;
|
||||
let marketPriceMaxDate = new Date();
|
||||
let marketPriceMin = marketPrice;
|
||||
|
||||
for (const [date, { marketPrice }] of Object.entries(
|
||||
@ -895,13 +918,22 @@ export class PortfolioService {
|
||||
value: marketPrice
|
||||
});
|
||||
|
||||
marketPriceMax = Math.max(marketPrice ?? 0, marketPriceMax);
|
||||
if (marketPrice > marketPriceMax) {
|
||||
marketPriceMax = marketPrice;
|
||||
marketPriceMaxDate = parseISO(date);
|
||||
}
|
||||
marketPriceMin = Math.min(
|
||||
marketPrice ?? Number.MAX_SAFE_INTEGER,
|
||||
marketPriceMin
|
||||
);
|
||||
}
|
||||
|
||||
const performancePercent =
|
||||
this.benchmarkService.calculateChangeInPercentage(
|
||||
marketPriceMax,
|
||||
marketPrice
|
||||
);
|
||||
|
||||
return {
|
||||
marketPrice,
|
||||
marketPriceMax,
|
||||
@ -925,6 +957,12 @@ export class PortfolioService {
|
||||
netPerformancePercent: undefined,
|
||||
netPerformancePercentWithCurrencyEffect: undefined,
|
||||
netPerformanceWithCurrencyEffect: undefined,
|
||||
performances: {
|
||||
allTimeHigh: {
|
||||
performancePercent,
|
||||
date: marketPriceMaxDate
|
||||
}
|
||||
},
|
||||
quantity: 0,
|
||||
tags: [],
|
||||
transactionCount: undefined,
|
||||
|
@ -433,13 +433,13 @@ export class DataGatheringService {
|
||||
await this.prismaService.symbolProfile.findMany({
|
||||
orderBy: [{ symbol: 'asc' }],
|
||||
select: {
|
||||
dataSource: true,
|
||||
id: true,
|
||||
Order: {
|
||||
activities: {
|
||||
orderBy: [{ date: 'asc' }],
|
||||
select: { date: true },
|
||||
take: 1
|
||||
},
|
||||
dataSource: true,
|
||||
id: true,
|
||||
scraperConfiguration: true,
|
||||
symbol: true
|
||||
},
|
||||
@ -459,7 +459,7 @@ export class DataGatheringService {
|
||||
);
|
||||
})
|
||||
.map((symbolProfile) => {
|
||||
let date = symbolProfile.Order?.[0]?.date ?? startDate;
|
||||
let date = symbolProfile.activities?.[0]?.date ?? startDate;
|
||||
|
||||
if (benchmarkAssetProfileIdMap[symbolProfile.id]) {
|
||||
date = this.getEarliestDate(startDate);
|
||||
|
@ -42,7 +42,7 @@ export class SymbolProfileService {
|
||||
}) {
|
||||
return this.prismaService.symbolProfile.findMany({
|
||||
include: {
|
||||
Order: {
|
||||
activities: {
|
||||
include: {
|
||||
User: true
|
||||
}
|
||||
@ -50,8 +50,7 @@ export class SymbolProfileService {
|
||||
},
|
||||
orderBy: [{ symbol: 'asc' }],
|
||||
where: {
|
||||
isActive: true,
|
||||
Order: withUserSubscription
|
||||
activities: withUserSubscription
|
||||
? {
|
||||
some: {
|
||||
User: {
|
||||
@ -65,7 +64,8 @@ export class SymbolProfileService {
|
||||
subscriptions: { none: { expiresAt: { gt: new Date() } } }
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
isActive: true
|
||||
}
|
||||
});
|
||||
}
|
||||
@ -77,9 +77,9 @@ export class SymbolProfileService {
|
||||
.findMany({
|
||||
include: {
|
||||
_count: {
|
||||
select: { Order: true }
|
||||
select: { activities: true }
|
||||
},
|
||||
Order: {
|
||||
activities: {
|
||||
orderBy: {
|
||||
date: 'asc'
|
||||
},
|
||||
@ -109,7 +109,7 @@ export class SymbolProfileService {
|
||||
.findMany({
|
||||
include: {
|
||||
_count: {
|
||||
select: { Order: true }
|
||||
select: { activities: true }
|
||||
},
|
||||
SymbolProfileOverrides: true
|
||||
},
|
||||
@ -184,8 +184,8 @@ export class SymbolProfileService {
|
||||
|
||||
private enhanceSymbolProfiles(
|
||||
symbolProfiles: (SymbolProfile & {
|
||||
_count: { Order: number };
|
||||
Order?: {
|
||||
_count: { activities: number };
|
||||
activities?: {
|
||||
date: Date;
|
||||
}[];
|
||||
SymbolProfileOverrides: SymbolProfileOverrides;
|
||||
@ -209,11 +209,11 @@ export class SymbolProfileService {
|
||||
symbolMapping: this.getSymbolMapping(symbolProfile)
|
||||
};
|
||||
|
||||
item.activitiesCount = symbolProfile._count.Order;
|
||||
item.activitiesCount = symbolProfile._count.activities;
|
||||
delete item._count;
|
||||
|
||||
item.dateOfFirstActivity = symbolProfile.Order?.[0]?.date;
|
||||
delete item.Order;
|
||||
item.dateOfFirstActivity = symbolProfile.activities?.[0]?.date;
|
||||
delete item.activities;
|
||||
|
||||
if (item.SymbolProfileOverrides) {
|
||||
item.assetClass =
|
||||
|
@ -1079,7 +1079,7 @@
|
||||
</context-group>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">libs/ui/src/lib/benchmark/benchmark.component.html</context>
|
||||
<context context-type="linenumber">3</context>
|
||||
<context context-type="linenumber">4</context>
|
||||
</context-group>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">libs/ui/src/lib/holdings-table/holdings-table.component.html</context>
|
||||
@ -1247,7 +1247,7 @@
|
||||
</context-group>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">libs/ui/src/lib/benchmark/benchmark.component.html</context>
|
||||
<context context-type="linenumber">142</context>
|
||||
<context context-type="linenumber">155</context>
|
||||
</context-group>
|
||||
</trans-unit>
|
||||
<trans-unit id="8280212421112607879" datatype="html">
|
||||
@ -4971,7 +4971,7 @@
|
||||
</context-group>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">libs/ui/src/lib/benchmark/benchmark.component.html</context>
|
||||
<context context-type="linenumber">174</context>
|
||||
<context context-type="linenumber">188</context>
|
||||
</context-group>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">libs/ui/src/lib/top-holdings/top-holdings.component.html</context>
|
||||
@ -6111,7 +6111,7 @@
|
||||
<target state="new">50-Day Trend</target>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">libs/ui/src/lib/benchmark/benchmark.component.html</context>
|
||||
<context context-type="linenumber">15</context>
|
||||
<context context-type="linenumber">16</context>
|
||||
</context-group>
|
||||
</trans-unit>
|
||||
<trans-unit id="7cca44e647a4b3a6deff49cd29055e21e245f5ee" datatype="html">
|
||||
@ -6119,7 +6119,7 @@
|
||||
<target state="new">200-Day Trend</target>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">libs/ui/src/lib/benchmark/benchmark.component.html</context>
|
||||
<context context-type="linenumber">40</context>
|
||||
<context context-type="linenumber">45</context>
|
||||
</context-group>
|
||||
</trans-unit>
|
||||
<trans-unit id="46236411f4e4f76b93179e7c73a08257d1be63cc" datatype="html">
|
||||
@ -6127,7 +6127,7 @@
|
||||
<target state="new">Last All Time High</target>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">libs/ui/src/lib/benchmark/benchmark.component.html</context>
|
||||
<context context-type="linenumber">65</context>
|
||||
<context context-type="linenumber">74</context>
|
||||
</context-group>
|
||||
</trans-unit>
|
||||
<trans-unit id="c81076431c2d98928ac370ca3e57092ae77366d7" datatype="html">
|
||||
@ -6135,7 +6135,7 @@
|
||||
<target state="new">Change from All Time High</target>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">libs/ui/src/lib/benchmark/benchmark.component.html</context>
|
||||
<context context-type="linenumber">83</context>
|
||||
<context context-type="linenumber">96</context>
|
||||
</context-group>
|
||||
</trans-unit>
|
||||
<trans-unit id="4bbe89749f1580cdca7f9238cb67ba2bd6968126" datatype="html">
|
||||
@ -6143,7 +6143,7 @@
|
||||
<target state="new">from ATH</target>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">libs/ui/src/lib/benchmark/benchmark.component.html</context>
|
||||
<context context-type="linenumber">85</context>
|
||||
<context context-type="linenumber">98</context>
|
||||
</context-group>
|
||||
</trans-unit>
|
||||
<trans-unit id="b74406fd93207c23bb840732ad2760ce0efaa2c5" datatype="html">
|
||||
|
@ -166,7 +166,7 @@
|
||||
</context-group>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">libs/ui/src/lib/benchmark/benchmark.component.html</context>
|
||||
<context context-type="linenumber">3</context>
|
||||
<context context-type="linenumber">4</context>
|
||||
</context-group>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">libs/ui/src/lib/holdings-table/holdings-table.component.html</context>
|
||||
@ -302,7 +302,7 @@
|
||||
</context-group>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">libs/ui/src/lib/benchmark/benchmark.component.html</context>
|
||||
<context context-type="linenumber">142</context>
|
||||
<context context-type="linenumber">155</context>
|
||||
</context-group>
|
||||
</trans-unit>
|
||||
<trans-unit id="8280212421112607879" datatype="html">
|
||||
@ -2546,7 +2546,7 @@
|
||||
<target state="translated">Änderung vom Allzeithoch</target>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">libs/ui/src/lib/benchmark/benchmark.component.html</context>
|
||||
<context context-type="linenumber">83</context>
|
||||
<context context-type="linenumber">96</context>
|
||||
</context-group>
|
||||
</trans-unit>
|
||||
<trans-unit id="4bbe89749f1580cdca7f9238cb67ba2bd6968126" datatype="html">
|
||||
@ -2554,7 +2554,7 @@
|
||||
<target state="translated">vom AZH</target>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">libs/ui/src/lib/benchmark/benchmark.component.html</context>
|
||||
<context context-type="linenumber">85</context>
|
||||
<context context-type="linenumber">98</context>
|
||||
</context-group>
|
||||
</trans-unit>
|
||||
<trans-unit id="ba18e93c4572bfe6d14b2a3f333468b12f890e5d" datatype="html">
|
||||
@ -4690,7 +4690,7 @@
|
||||
</context-group>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">libs/ui/src/lib/benchmark/benchmark.component.html</context>
|
||||
<context context-type="linenumber">174</context>
|
||||
<context context-type="linenumber">188</context>
|
||||
</context-group>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">libs/ui/src/lib/top-holdings/top-holdings.component.html</context>
|
||||
@ -6039,7 +6039,7 @@
|
||||
<target state="translated">Letztes Allzeithoch</target>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">libs/ui/src/lib/benchmark/benchmark.component.html</context>
|
||||
<context context-type="linenumber">65</context>
|
||||
<context context-type="linenumber">74</context>
|
||||
</context-group>
|
||||
</trans-unit>
|
||||
<trans-unit id="a3db2898b85fed425f03294b839a98cef247a2dc" datatype="html">
|
||||
@ -6127,7 +6127,7 @@
|
||||
<target state="translated">50 Tage Trend</target>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">libs/ui/src/lib/benchmark/benchmark.component.html</context>
|
||||
<context context-type="linenumber">15</context>
|
||||
<context context-type="linenumber">16</context>
|
||||
</context-group>
|
||||
</trans-unit>
|
||||
<trans-unit id="7cca44e647a4b3a6deff49cd29055e21e245f5ee" datatype="html">
|
||||
@ -6135,7 +6135,7 @@
|
||||
<target state="translated">200 Tage Trend</target>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">libs/ui/src/lib/benchmark/benchmark.component.html</context>
|
||||
<context context-type="linenumber">40</context>
|
||||
<context context-type="linenumber">45</context>
|
||||
</context-group>
|
||||
</trans-unit>
|
||||
<trans-unit id="06c32fe06e23571d90965046809c0e29b37a6ef3" datatype="html">
|
||||
|
@ -167,7 +167,7 @@
|
||||
</context-group>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">libs/ui/src/lib/benchmark/benchmark.component.html</context>
|
||||
<context context-type="linenumber">3</context>
|
||||
<context context-type="linenumber">4</context>
|
||||
</context-group>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">libs/ui/src/lib/holdings-table/holdings-table.component.html</context>
|
||||
@ -303,7 +303,7 @@
|
||||
</context-group>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">libs/ui/src/lib/benchmark/benchmark.component.html</context>
|
||||
<context context-type="linenumber">142</context>
|
||||
<context context-type="linenumber">155</context>
|
||||
</context-group>
|
||||
</trans-unit>
|
||||
<trans-unit id="8280212421112607879" datatype="html">
|
||||
@ -2531,7 +2531,7 @@
|
||||
<target state="translated">Variación respecto al máximo histórico (ATH)</target>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">libs/ui/src/lib/benchmark/benchmark.component.html</context>
|
||||
<context context-type="linenumber">83</context>
|
||||
<context context-type="linenumber">96</context>
|
||||
</context-group>
|
||||
</trans-unit>
|
||||
<trans-unit id="4bbe89749f1580cdca7f9238cb67ba2bd6968126" datatype="html">
|
||||
@ -2539,7 +2539,7 @@
|
||||
<target state="translated">desde el máximo histórico (ATH)</target>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">libs/ui/src/lib/benchmark/benchmark.component.html</context>
|
||||
<context context-type="linenumber">85</context>
|
||||
<context context-type="linenumber">98</context>
|
||||
</context-group>
|
||||
</trans-unit>
|
||||
<trans-unit id="ba18e93c4572bfe6d14b2a3f333468b12f890e5d" datatype="html">
|
||||
@ -4667,7 +4667,7 @@
|
||||
</context-group>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">libs/ui/src/lib/benchmark/benchmark.component.html</context>
|
||||
<context context-type="linenumber">174</context>
|
||||
<context context-type="linenumber">188</context>
|
||||
</context-group>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">libs/ui/src/lib/top-holdings/top-holdings.component.html</context>
|
||||
@ -6016,7 +6016,7 @@
|
||||
<target state="new">Last All Time High</target>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">libs/ui/src/lib/benchmark/benchmark.component.html</context>
|
||||
<context context-type="linenumber">65</context>
|
||||
<context context-type="linenumber">74</context>
|
||||
</context-group>
|
||||
</trans-unit>
|
||||
<trans-unit id="a3db2898b85fed425f03294b839a98cef247a2dc" datatype="html">
|
||||
@ -6104,7 +6104,7 @@
|
||||
<target state="new">50-Day Trend</target>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">libs/ui/src/lib/benchmark/benchmark.component.html</context>
|
||||
<context context-type="linenumber">15</context>
|
||||
<context context-type="linenumber">16</context>
|
||||
</context-group>
|
||||
</trans-unit>
|
||||
<trans-unit id="7cca44e647a4b3a6deff49cd29055e21e245f5ee" datatype="html">
|
||||
@ -6112,7 +6112,7 @@
|
||||
<target state="new">200-Day Trend</target>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">libs/ui/src/lib/benchmark/benchmark.component.html</context>
|
||||
<context context-type="linenumber">40</context>
|
||||
<context context-type="linenumber">45</context>
|
||||
</context-group>
|
||||
</trans-unit>
|
||||
<trans-unit id="06c32fe06e23571d90965046809c0e29b37a6ef3" datatype="html">
|
||||
|
@ -174,7 +174,7 @@
|
||||
</context-group>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">libs/ui/src/lib/benchmark/benchmark.component.html</context>
|
||||
<context context-type="linenumber">3</context>
|
||||
<context context-type="linenumber">4</context>
|
||||
</context-group>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">libs/ui/src/lib/holdings-table/holdings-table.component.html</context>
|
||||
@ -358,7 +358,7 @@
|
||||
</context-group>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">libs/ui/src/lib/benchmark/benchmark.component.html</context>
|
||||
<context context-type="linenumber">142</context>
|
||||
<context context-type="linenumber">155</context>
|
||||
</context-group>
|
||||
</trans-unit>
|
||||
<trans-unit id="8280212421112607879" datatype="html">
|
||||
@ -3050,7 +3050,7 @@
|
||||
<target state="translated">Différence avec le Record Historique</target>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">libs/ui/src/lib/benchmark/benchmark.component.html</context>
|
||||
<context context-type="linenumber">83</context>
|
||||
<context context-type="linenumber">96</context>
|
||||
</context-group>
|
||||
</trans-unit>
|
||||
<trans-unit id="4bbe89749f1580cdca7f9238cb67ba2bd6968126" datatype="html">
|
||||
@ -3058,7 +3058,7 @@
|
||||
<target state="translated">par rapport au record historique</target>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">libs/ui/src/lib/benchmark/benchmark.component.html</context>
|
||||
<context context-type="linenumber">85</context>
|
||||
<context context-type="linenumber">98</context>
|
||||
</context-group>
|
||||
</trans-unit>
|
||||
<trans-unit id="ba18e93c4572bfe6d14b2a3f333468b12f890e5d" datatype="html">
|
||||
@ -4666,7 +4666,7 @@
|
||||
</context-group>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">libs/ui/src/lib/benchmark/benchmark.component.html</context>
|
||||
<context context-type="linenumber">174</context>
|
||||
<context context-type="linenumber">188</context>
|
||||
</context-group>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">libs/ui/src/lib/top-holdings/top-holdings.component.html</context>
|
||||
@ -6015,7 +6015,7 @@
|
||||
<target state="translated">Dernier All Time High</target>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">libs/ui/src/lib/benchmark/benchmark.component.html</context>
|
||||
<context context-type="linenumber">65</context>
|
||||
<context context-type="linenumber">74</context>
|
||||
</context-group>
|
||||
</trans-unit>
|
||||
<trans-unit id="a3db2898b85fed425f03294b839a98cef247a2dc" datatype="html">
|
||||
@ -6103,7 +6103,7 @@
|
||||
<target state="translated">Tendance 50 jours</target>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">libs/ui/src/lib/benchmark/benchmark.component.html</context>
|
||||
<context context-type="linenumber">15</context>
|
||||
<context context-type="linenumber">16</context>
|
||||
</context-group>
|
||||
</trans-unit>
|
||||
<trans-unit id="7cca44e647a4b3a6deff49cd29055e21e245f5ee" datatype="html">
|
||||
@ -6111,7 +6111,7 @@
|
||||
<target state="translated">Tendance 200 jours</target>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">libs/ui/src/lib/benchmark/benchmark.component.html</context>
|
||||
<context context-type="linenumber">40</context>
|
||||
<context context-type="linenumber">45</context>
|
||||
</context-group>
|
||||
</trans-unit>
|
||||
<trans-unit id="06c32fe06e23571d90965046809c0e29b37a6ef3" datatype="html">
|
||||
|
@ -167,7 +167,7 @@
|
||||
</context-group>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">libs/ui/src/lib/benchmark/benchmark.component.html</context>
|
||||
<context context-type="linenumber">3</context>
|
||||
<context context-type="linenumber">4</context>
|
||||
</context-group>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">libs/ui/src/lib/holdings-table/holdings-table.component.html</context>
|
||||
@ -303,7 +303,7 @@
|
||||
</context-group>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">libs/ui/src/lib/benchmark/benchmark.component.html</context>
|
||||
<context context-type="linenumber">142</context>
|
||||
<context context-type="linenumber">155</context>
|
||||
</context-group>
|
||||
</trans-unit>
|
||||
<trans-unit id="8280212421112607879" datatype="html">
|
||||
@ -2531,7 +2531,7 @@
|
||||
<target state="translated">Variazione rispetto al massimo storico (ATH)</target>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">libs/ui/src/lib/benchmark/benchmark.component.html</context>
|
||||
<context context-type="linenumber">83</context>
|
||||
<context context-type="linenumber">96</context>
|
||||
</context-group>
|
||||
</trans-unit>
|
||||
<trans-unit id="4bbe89749f1580cdca7f9238cb67ba2bd6968126" datatype="html">
|
||||
@ -2539,7 +2539,7 @@
|
||||
<target state="translated">dal massimo storico (ATH)</target>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">libs/ui/src/lib/benchmark/benchmark.component.html</context>
|
||||
<context context-type="linenumber">85</context>
|
||||
<context context-type="linenumber">98</context>
|
||||
</context-group>
|
||||
</trans-unit>
|
||||
<trans-unit id="ba18e93c4572bfe6d14b2a3f333468b12f890e5d" datatype="html">
|
||||
@ -4667,7 +4667,7 @@
|
||||
</context-group>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">libs/ui/src/lib/benchmark/benchmark.component.html</context>
|
||||
<context context-type="linenumber">174</context>
|
||||
<context context-type="linenumber">188</context>
|
||||
</context-group>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">libs/ui/src/lib/top-holdings/top-holdings.component.html</context>
|
||||
@ -6016,7 +6016,7 @@
|
||||
<target state="translated">Ultimo massimo storico</target>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">libs/ui/src/lib/benchmark/benchmark.component.html</context>
|
||||
<context context-type="linenumber">65</context>
|
||||
<context context-type="linenumber">74</context>
|
||||
</context-group>
|
||||
</trans-unit>
|
||||
<trans-unit id="a3db2898b85fed425f03294b839a98cef247a2dc" datatype="html">
|
||||
@ -6104,7 +6104,7 @@
|
||||
<target state="translated">Trend a 50 giorni</target>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">libs/ui/src/lib/benchmark/benchmark.component.html</context>
|
||||
<context context-type="linenumber">15</context>
|
||||
<context context-type="linenumber">16</context>
|
||||
</context-group>
|
||||
</trans-unit>
|
||||
<trans-unit id="7cca44e647a4b3a6deff49cd29055e21e245f5ee" datatype="html">
|
||||
@ -6112,7 +6112,7 @@
|
||||
<target state="translated">Trend a 200 giorni</target>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">libs/ui/src/lib/benchmark/benchmark.component.html</context>
|
||||
<context context-type="linenumber">40</context>
|
||||
<context context-type="linenumber">45</context>
|
||||
</context-group>
|
||||
</trans-unit>
|
||||
<trans-unit id="06c32fe06e23571d90965046809c0e29b37a6ef3" datatype="html">
|
||||
|
@ -166,7 +166,7 @@
|
||||
</context-group>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">libs/ui/src/lib/benchmark/benchmark.component.html</context>
|
||||
<context context-type="linenumber">3</context>
|
||||
<context context-type="linenumber">4</context>
|
||||
</context-group>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">libs/ui/src/lib/holdings-table/holdings-table.component.html</context>
|
||||
@ -302,7 +302,7 @@
|
||||
</context-group>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">libs/ui/src/lib/benchmark/benchmark.component.html</context>
|
||||
<context context-type="linenumber">142</context>
|
||||
<context context-type="linenumber">155</context>
|
||||
</context-group>
|
||||
</trans-unit>
|
||||
<trans-unit id="8280212421112607879" datatype="html">
|
||||
@ -2530,7 +2530,7 @@
|
||||
<target state="translated">Verandering van All Time High</target>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">libs/ui/src/lib/benchmark/benchmark.component.html</context>
|
||||
<context context-type="linenumber">83</context>
|
||||
<context context-type="linenumber">96</context>
|
||||
</context-group>
|
||||
</trans-unit>
|
||||
<trans-unit id="4bbe89749f1580cdca7f9238cb67ba2bd6968126" datatype="html">
|
||||
@ -2538,7 +2538,7 @@
|
||||
<target state="translated">van ATH</target>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">libs/ui/src/lib/benchmark/benchmark.component.html</context>
|
||||
<context context-type="linenumber">85</context>
|
||||
<context context-type="linenumber">98</context>
|
||||
</context-group>
|
||||
</trans-unit>
|
||||
<trans-unit id="ba18e93c4572bfe6d14b2a3f333468b12f890e5d" datatype="html">
|
||||
@ -4666,7 +4666,7 @@
|
||||
</context-group>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">libs/ui/src/lib/benchmark/benchmark.component.html</context>
|
||||
<context context-type="linenumber">174</context>
|
||||
<context context-type="linenumber">188</context>
|
||||
</context-group>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">libs/ui/src/lib/top-holdings/top-holdings.component.html</context>
|
||||
@ -6015,7 +6015,7 @@
|
||||
<target state="new">Last All Time High</target>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">libs/ui/src/lib/benchmark/benchmark.component.html</context>
|
||||
<context context-type="linenumber">65</context>
|
||||
<context context-type="linenumber">74</context>
|
||||
</context-group>
|
||||
</trans-unit>
|
||||
<trans-unit id="a3db2898b85fed425f03294b839a98cef247a2dc" datatype="html">
|
||||
@ -6103,7 +6103,7 @@
|
||||
<target state="new">50-Day Trend</target>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">libs/ui/src/lib/benchmark/benchmark.component.html</context>
|
||||
<context context-type="linenumber">15</context>
|
||||
<context context-type="linenumber">16</context>
|
||||
</context-group>
|
||||
</trans-unit>
|
||||
<trans-unit id="7cca44e647a4b3a6deff49cd29055e21e245f5ee" datatype="html">
|
||||
@ -6111,7 +6111,7 @@
|
||||
<target state="new">200-Day Trend</target>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">libs/ui/src/lib/benchmark/benchmark.component.html</context>
|
||||
<context context-type="linenumber">40</context>
|
||||
<context context-type="linenumber">45</context>
|
||||
</context-group>
|
||||
</trans-unit>
|
||||
<trans-unit id="06c32fe06e23571d90965046809c0e29b37a6ef3" datatype="html">
|
||||
|
@ -1007,7 +1007,7 @@
|
||||
</context-group>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">libs/ui/src/lib/benchmark/benchmark.component.html</context>
|
||||
<context context-type="linenumber">3</context>
|
||||
<context context-type="linenumber">4</context>
|
||||
</context-group>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">libs/ui/src/lib/holdings-table/holdings-table.component.html</context>
|
||||
@ -1175,7 +1175,7 @@
|
||||
</context-group>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">libs/ui/src/lib/benchmark/benchmark.component.html</context>
|
||||
<context context-type="linenumber">142</context>
|
||||
<context context-type="linenumber">155</context>
|
||||
</context-group>
|
||||
</trans-unit>
|
||||
<trans-unit id="8280212421112607879" datatype="html">
|
||||
@ -4583,7 +4583,7 @@
|
||||
</context-group>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">libs/ui/src/lib/benchmark/benchmark.component.html</context>
|
||||
<context context-type="linenumber">174</context>
|
||||
<context context-type="linenumber">188</context>
|
||||
</context-group>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">libs/ui/src/lib/top-holdings/top-holdings.component.html</context>
|
||||
@ -5551,7 +5551,7 @@
|
||||
<target state="translated">Ostatni Najwyższy Punkt w Historii</target>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">libs/ui/src/lib/benchmark/benchmark.component.html</context>
|
||||
<context context-type="linenumber">65</context>
|
||||
<context context-type="linenumber">74</context>
|
||||
</context-group>
|
||||
</trans-unit>
|
||||
<trans-unit id="c81076431c2d98928ac370ca3e57092ae77366d7" datatype="html">
|
||||
@ -5559,7 +5559,7 @@
|
||||
<target state="translated">Zmiana od Najwyższego Punktu w Historii</target>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">libs/ui/src/lib/benchmark/benchmark.component.html</context>
|
||||
<context context-type="linenumber">83</context>
|
||||
<context context-type="linenumber">96</context>
|
||||
</context-group>
|
||||
</trans-unit>
|
||||
<trans-unit id="4bbe89749f1580cdca7f9238cb67ba2bd6968126" datatype="html">
|
||||
@ -5567,7 +5567,7 @@
|
||||
<target state="translated">od ATH</target>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">libs/ui/src/lib/benchmark/benchmark.component.html</context>
|
||||
<context context-type="linenumber">85</context>
|
||||
<context context-type="linenumber">98</context>
|
||||
</context-group>
|
||||
</trans-unit>
|
||||
<trans-unit id="b74406fd93207c23bb840732ad2760ce0efaa2c5" datatype="html">
|
||||
@ -6103,7 +6103,7 @@
|
||||
<target state="translated">50-Dniowy Trend</target>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">libs/ui/src/lib/benchmark/benchmark.component.html</context>
|
||||
<context context-type="linenumber">15</context>
|
||||
<context context-type="linenumber">16</context>
|
||||
</context-group>
|
||||
</trans-unit>
|
||||
<trans-unit id="7cca44e647a4b3a6deff49cd29055e21e245f5ee" datatype="html">
|
||||
@ -6111,7 +6111,7 @@
|
||||
<target state="translated">200-Dniowy Trend</target>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">libs/ui/src/lib/benchmark/benchmark.component.html</context>
|
||||
<context context-type="linenumber">40</context>
|
||||
<context context-type="linenumber">45</context>
|
||||
</context-group>
|
||||
</trans-unit>
|
||||
<trans-unit id="06c32fe06e23571d90965046809c0e29b37a6ef3" datatype="html">
|
||||
|
@ -174,7 +174,7 @@
|
||||
</context-group>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">libs/ui/src/lib/benchmark/benchmark.component.html</context>
|
||||
<context context-type="linenumber">3</context>
|
||||
<context context-type="linenumber">4</context>
|
||||
</context-group>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">libs/ui/src/lib/holdings-table/holdings-table.component.html</context>
|
||||
@ -358,7 +358,7 @@
|
||||
</context-group>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">libs/ui/src/lib/benchmark/benchmark.component.html</context>
|
||||
<context context-type="linenumber">142</context>
|
||||
<context context-type="linenumber">155</context>
|
||||
</context-group>
|
||||
</trans-unit>
|
||||
<trans-unit id="8280212421112607879" datatype="html">
|
||||
@ -2922,7 +2922,7 @@
|
||||
<target state="translated">Diferença desde o Máximo Histórico</target>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">libs/ui/src/lib/benchmark/benchmark.component.html</context>
|
||||
<context context-type="linenumber">83</context>
|
||||
<context context-type="linenumber">96</context>
|
||||
</context-group>
|
||||
</trans-unit>
|
||||
<trans-unit id="4bbe89749f1580cdca7f9238cb67ba2bd6968126" datatype="html">
|
||||
@ -2930,7 +2930,7 @@
|
||||
<target state="translated">a partir do ATH (All Time High)</target>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">libs/ui/src/lib/benchmark/benchmark.component.html</context>
|
||||
<context context-type="linenumber">85</context>
|
||||
<context context-type="linenumber">98</context>
|
||||
</context-group>
|
||||
</trans-unit>
|
||||
<trans-unit id="ba18e93c4572bfe6d14b2a3f333468b12f890e5d" datatype="html">
|
||||
@ -4666,7 +4666,7 @@
|
||||
</context-group>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">libs/ui/src/lib/benchmark/benchmark.component.html</context>
|
||||
<context context-type="linenumber">174</context>
|
||||
<context context-type="linenumber">188</context>
|
||||
</context-group>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">libs/ui/src/lib/top-holdings/top-holdings.component.html</context>
|
||||
@ -6015,7 +6015,7 @@
|
||||
<target state="new">Last All Time High</target>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">libs/ui/src/lib/benchmark/benchmark.component.html</context>
|
||||
<context context-type="linenumber">65</context>
|
||||
<context context-type="linenumber">74</context>
|
||||
</context-group>
|
||||
</trans-unit>
|
||||
<trans-unit id="a3db2898b85fed425f03294b839a98cef247a2dc" datatype="html">
|
||||
@ -6103,7 +6103,7 @@
|
||||
<target state="new">50-Day Trend</target>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">libs/ui/src/lib/benchmark/benchmark.component.html</context>
|
||||
<context context-type="linenumber">15</context>
|
||||
<context context-type="linenumber">16</context>
|
||||
</context-group>
|
||||
</trans-unit>
|
||||
<trans-unit id="7cca44e647a4b3a6deff49cd29055e21e245f5ee" datatype="html">
|
||||
@ -6111,7 +6111,7 @@
|
||||
<target state="new">200-Day Trend</target>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">libs/ui/src/lib/benchmark/benchmark.component.html</context>
|
||||
<context context-type="linenumber">40</context>
|
||||
<context context-type="linenumber">45</context>
|
||||
</context-group>
|
||||
</trans-unit>
|
||||
<trans-unit id="06c32fe06e23571d90965046809c0e29b37a6ef3" datatype="html">
|
||||
|
@ -967,7 +967,7 @@
|
||||
</context-group>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">libs/ui/src/lib/benchmark/benchmark.component.html</context>
|
||||
<context context-type="linenumber">3</context>
|
||||
<context context-type="linenumber">4</context>
|
||||
</context-group>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">libs/ui/src/lib/holdings-table/holdings-table.component.html</context>
|
||||
@ -1135,7 +1135,7 @@
|
||||
</context-group>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">libs/ui/src/lib/benchmark/benchmark.component.html</context>
|
||||
<context context-type="linenumber">142</context>
|
||||
<context context-type="linenumber">155</context>
|
||||
</context-group>
|
||||
</trans-unit>
|
||||
<trans-unit id="8280212421112607879" datatype="html">
|
||||
@ -3588,7 +3588,7 @@
|
||||
</trans-unit>
|
||||
<trans-unit id="fb9e3bfd7030894a15bebdb45e9502469d7b44b1" datatype="html">
|
||||
<source> How does <x id="START_TAG_STRONG" ctype="x-strong" equiv-text="<strong>"/>Ghostfolio<x id="CLOSE_TAG_STRONG" ctype="x-strong" equiv-text="</strong>"/> work? </source>
|
||||
<target state="translated"> Nasıl<x id="START_TAG_STRONG" ctype="x-strong" equiv-text="<strong>"/>Ghostfolio<x id="CLOSE_TAG_STRONG" ctype="x-strong" equiv-text="</strong>"/> çalışır? </target>
|
||||
<target state="translated"> Nasıl<x id="START_TAG_STRONG" ctype="x-strong" equiv-text="<strong>"/>Ghostfolio<x id="CLOSE_TAG_STRONG" ctype="x-strong" equiv-text="</strong>"/> çalışır? </target>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">apps/client/src/app/pages/landing/landing-page.html</context>
|
||||
<context context-type="linenumber">383</context>
|
||||
@ -4071,7 +4071,7 @@
|
||||
</context-group>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">libs/ui/src/lib/benchmark/benchmark.component.html</context>
|
||||
<context context-type="linenumber">174</context>
|
||||
<context context-type="linenumber">188</context>
|
||||
</context-group>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">libs/ui/src/lib/top-holdings/top-holdings.component.html</context>
|
||||
@ -5247,7 +5247,7 @@
|
||||
<target state="translated">Tüm Zamanların En Yüksek Seviyesinden (ATH) Değişim</target>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">libs/ui/src/lib/benchmark/benchmark.component.html</context>
|
||||
<context context-type="linenumber">83</context>
|
||||
<context context-type="linenumber">96</context>
|
||||
</context-group>
|
||||
</trans-unit>
|
||||
<trans-unit id="4bbe89749f1580cdca7f9238cb67ba2bd6968126" datatype="html">
|
||||
@ -5255,7 +5255,7 @@
|
||||
<target state="translated">Tüm Zamanların En Yüksek Seviyesinden</target>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">libs/ui/src/lib/benchmark/benchmark.component.html</context>
|
||||
<context context-type="linenumber">85</context>
|
||||
<context context-type="linenumber">98</context>
|
||||
</context-group>
|
||||
</trans-unit>
|
||||
<trans-unit id="b74406fd93207c23bb840732ad2760ce0efaa2c5" datatype="html">
|
||||
@ -5384,7 +5384,7 @@
|
||||
</trans-unit>
|
||||
<trans-unit id="3298117765569632011" datatype="html">
|
||||
<source>Switch to Ghostfolio Premium or Ghostfolio Open Source easily</source>
|
||||
<target state="translated">Ghostfolio Premium veya Ghostfolio Open Source'a kolayca geçin</target>
|
||||
<target state="translated">Ghostfolio Premium veya Ghostfolio Open Source’a kolayca geçin</target>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">libs/ui/src/lib/i18n.ts</context>
|
||||
<context context-type="linenumber">12</context>
|
||||
@ -5392,7 +5392,7 @@
|
||||
</trans-unit>
|
||||
<trans-unit id="1631940846690193897" datatype="html">
|
||||
<source>Switch to Ghostfolio Premium easily</source>
|
||||
<target state="translated">Ghostfolio Premium'a kolayca geçin</target>
|
||||
<target state="translated">Ghostfolio Premium’a kolayca geçin</target>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">libs/ui/src/lib/i18n.ts</context>
|
||||
<context context-type="linenumber">13</context>
|
||||
@ -5400,7 +5400,7 @@
|
||||
</trans-unit>
|
||||
<trans-unit id="1921273115613254799" datatype="html">
|
||||
<source>Switch to Ghostfolio Open Source or Ghostfolio Basic easily</source>
|
||||
<target state="translated">Ghostfolio Açık Kaynak veya Ghostfolio Temel'e kolayca geçin.</target>
|
||||
<target state="translated">Ghostfolio Açık Kaynak veya Ghostfolio Temel’e kolayca geçin.</target>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">libs/ui/src/lib/i18n.ts</context>
|
||||
<context context-type="linenumber">14</context>
|
||||
@ -6015,7 +6015,7 @@
|
||||
<target state="translated">Son, ATH</target>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">libs/ui/src/lib/benchmark/benchmark.component.html</context>
|
||||
<context context-type="linenumber">65</context>
|
||||
<context context-type="linenumber">74</context>
|
||||
</context-group>
|
||||
</trans-unit>
|
||||
<trans-unit id="a3db2898b85fed425f03294b839a98cef247a2dc" datatype="html">
|
||||
@ -6103,7 +6103,7 @@
|
||||
<target state="translated">50 Günlük Trend</target>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">libs/ui/src/lib/benchmark/benchmark.component.html</context>
|
||||
<context context-type="linenumber">15</context>
|
||||
<context context-type="linenumber">16</context>
|
||||
</context-group>
|
||||
</trans-unit>
|
||||
<trans-unit id="7cca44e647a4b3a6deff49cd29055e21e245f5ee" datatype="html">
|
||||
@ -6111,7 +6111,7 @@
|
||||
<target state="translated">200 Günlük Trend</target>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">libs/ui/src/lib/benchmark/benchmark.component.html</context>
|
||||
<context context-type="linenumber">40</context>
|
||||
<context context-type="linenumber">45</context>
|
||||
</context-group>
|
||||
</trans-unit>
|
||||
<trans-unit id="06c32fe06e23571d90965046809c0e29b37a6ef3" datatype="html">
|
||||
@ -6372,7 +6372,7 @@
|
||||
</trans-unit>
|
||||
<trans-unit id="f42ea256db85ae2dba48b04a7bf0eb1614abac2f" 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" [isCurrency]="true" [locale]="user?.settings?.locale" [unit]="user?.settings?.baseCurrency" [value]="withdrawalRatePerYear?.toNumber()" />"/><x id="CLOSE_TAG_GF_VALUE" ctype="x-gf_value" equiv-text="<gf-value class="d-inline-block" [isCurrency]="true" [locale]="user?.settings?.locale" [unit]="user?.settings?.baseCurrency" [value]="fireWealth?.toNumber()" />"/> 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" [isCurrency]="true" [locale]="user?.settings?.locale" [unit]="user?.settings?.baseCurrency" [value]="withdrawalRatePerMonth?.toNumber()" />"/><x id="CLOSE_TAG_GF_VALUE" ctype="x-gf_value" equiv-text="<gf-value class="d-inline-block" [isCurrency]="true" [locale]="user?.settings?.locale" [unit]="user?.settings?.baseCurrency" [value]="fireWealth?.toNumber()" />"/> per month<x id="CLOSE_TAG_SPAN" ctype="x-span" equiv-text="</span>"/>, based on your total assets of <x id="START_TAG_SPAN" ctype="x-span" equiv-text="<span class="font-weight-bold" >"/><x id="START_TAG_GF_VALUE_2" ctype="x-gf_value_2" equiv-text="<gf-value class="d-inline-block" [isCurrency]="true" [locale]="user?.settings?.locale" [unit]="user?.settings?.baseCurrency" [value]="fireWealth?.toNumber()" />"/><x id="CLOSE_TAG_GF_VALUE" ctype="x-gf_value" equiv-text="<gf-value class="d-inline-block" [isCurrency]="true" [locale]="user?.settings?.locale" [unit]="user?.settings?.baseCurrency" [value]="fireWealth?.toNumber()" />"/><x id="CLOSE_TAG_SPAN" ctype="x-span" equiv-text="</span>"/> and a withdrawal rate of 4%. </source>
|
||||
<target state="translated"> Eğer bugün emekli olursanız, toplam <x id="START_TAG_SPAN" ctype="x-span" equiv-text="<span class="font-weight-bold" >"/><x id="START_TAG_GF_VALUE_2" ctype="x-gf_value_2" equiv-text="<gf-value class="d-inline-block" [isCurrency]="true" [locale]="user?.settings?.locale" [unit]="user?.settings?.baseCurrency" [value]="fireWealth?.toNumber()" />"/><x id="CLOSE_TAG_GF_VALUE" ctype="x-gf_value" equiv-text="<gf-value class="d-inline-block" [isCurrency]="true" [locale]="user?.settings?.locale" [unit]="user?.settings?.baseCurrency" [value]="fireWealth?.toNumber()" />"/><x id="CLOSE_TAG_SPAN" ctype="x-span" equiv-text="</span>"/> tutarındaki varlıklarınız ve %4'lük bir çekilme oranına dayanarak yıllık <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" [isCurrency]="true" [locale]="user?.settings?.locale" [unit]="user?.settings?.baseCurrency" [value]="withdrawalRatePerYear?.toNumber()" />"/><x id="CLOSE_TAG_GF_VALUE" ctype="x-gf_value" equiv-text="<gf-value class="d-inline-block" [isCurrency]="true" [locale]="user?.settings?.locale" [unit]="user?.settings?.baseCurrency" [value]="fireWealth?.toNumber()" />"/> veya aylık <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" [isCurrency]="true" [locale]="user?.settings?.locale" [unit]="user?.settings?.baseCurrency" [value]="withdrawalRatePerMonth?.toNumber()" />"/><x id="CLOSE_TAG_GF_VALUE" ctype="x-gf_value" equiv-text="<gf-value class="d-inline-block" [isCurrency]="true" [locale]="user?.settings?.locale" [unit]="user?.settings?.baseCurrency" [value]="fireWealth?.toNumber()" />"/><x id="CLOSE_TAG_SPAN" ctype="x-span" equiv-text="</span>"/> çekebilirsiniz. </target>
|
||||
<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" [isCurrency]="true" [locale]="user?.settings?.locale" [unit]="user?.settings?.baseCurrency" [value]="withdrawalRatePerYear?.toNumber()" />"/><x id="CLOSE_TAG_GF_VALUE" ctype="x-gf_value" equiv-text="<gf-value class="d-inline-block" [isCurrency]="true" [locale]="user?.settings?.locale" [unit]="user?.settings?.baseCurrency" [value]="fireWealth?.toNumber()" />"/> 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" [isCurrency]="true" [locale]="user?.settings?.locale" [unit]="user?.settings?.baseCurrency" [value]="withdrawalRatePerMonth?.toNumber()" />"/><x id="CLOSE_TAG_GF_VALUE" ctype="x-gf_value" equiv-text="<gf-value class="d-inline-block" [isCurrency]="true" [locale]="user?.settings?.locale" [unit]="user?.settings?.baseCurrency" [value]="fireWealth?.toNumber()" />"/> per month<x id="CLOSE_TAG_SPAN" ctype="x-span" equiv-text="</span>"/>, based on your total assets of <x id="START_TAG_SPAN" ctype="x-span" equiv-text="<span class="font-weight-bold" >"/><x id="START_TAG_GF_VALUE_2" ctype="x-gf_value_2" equiv-text="<gf-value class="d-inline-block" [isCurrency]="true" [locale]="user?.settings?.locale" [unit]="user?.settings?.baseCurrency" [value]="fireWealth?.toNumber()" />"/><x id="CLOSE_TAG_GF_VALUE" ctype="x-gf_value" equiv-text="<gf-value class="d-inline-block" [isCurrency]="true" [locale]="user?.settings?.locale" [unit]="user?.settings?.baseCurrency" [value]="fireWealth?.toNumber()" />"/><x id="CLOSE_TAG_SPAN" ctype="x-span" equiv-text="</span>"/> 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">67</context>
|
||||
@ -6620,7 +6620,7 @@
|
||||
</trans-unit>
|
||||
<trans-unit id="3d30a34e40fd0afa4f0233005752e4ab615e83a0" datatype="html">
|
||||
<source>Approximation based on the top holdings of each ETF</source>
|
||||
<target state="translated">Her ETF'nin en üst tutarlarına dayalı yaklaşım</target>
|
||||
<target state="translated">Her ETF’nin en üst tutarlarına dayalı yaklaşım</target>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/allocations/allocations-page.html</context>
|
||||
<context context-type="linenumber">340</context>
|
||||
|
@ -1095,7 +1095,7 @@
|
||||
</context-group>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">libs/ui/src/lib/benchmark/benchmark.component.html</context>
|
||||
<context context-type="linenumber">3</context>
|
||||
<context context-type="linenumber">4</context>
|
||||
</context-group>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">libs/ui/src/lib/holdings-table/holdings-table.component.html</context>
|
||||
@ -1263,7 +1263,7 @@
|
||||
</context-group>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">libs/ui/src/lib/benchmark/benchmark.component.html</context>
|
||||
<context context-type="linenumber">142</context>
|
||||
<context context-type="linenumber">155</context>
|
||||
</context-group>
|
||||
</trans-unit>
|
||||
<trans-unit id="8280212421112607879" datatype="html">
|
||||
@ -5223,7 +5223,7 @@
|
||||
</context-group>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">libs/ui/src/lib/benchmark/benchmark.component.html</context>
|
||||
<context context-type="linenumber">174</context>
|
||||
<context context-type="linenumber">188</context>
|
||||
</context-group>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">libs/ui/src/lib/top-holdings/top-holdings.component.html</context>
|
||||
@ -6741,7 +6741,7 @@
|
||||
<target state="translated">Тренд на 50 днів</target>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">libs/ui/src/lib/benchmark/benchmark.component.html</context>
|
||||
<context context-type="linenumber">15</context>
|
||||
<context context-type="linenumber">16</context>
|
||||
</context-group>
|
||||
</trans-unit>
|
||||
<trans-unit id="7cca44e647a4b3a6deff49cd29055e21e245f5ee" datatype="html">
|
||||
@ -6749,7 +6749,7 @@
|
||||
<target state="translated">Тренд на 200 днів</target>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">libs/ui/src/lib/benchmark/benchmark.component.html</context>
|
||||
<context context-type="linenumber">40</context>
|
||||
<context context-type="linenumber">45</context>
|
||||
</context-group>
|
||||
</trans-unit>
|
||||
<trans-unit id="46236411f4e4f76b93179e7c73a08257d1be63cc" datatype="html">
|
||||
@ -6757,7 +6757,7 @@
|
||||
<target state="translated">Останній рекордний максимум</target>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">libs/ui/src/lib/benchmark/benchmark.component.html</context>
|
||||
<context context-type="linenumber">65</context>
|
||||
<context context-type="linenumber">74</context>
|
||||
</context-group>
|
||||
</trans-unit>
|
||||
<trans-unit id="c81076431c2d98928ac370ca3e57092ae77366d7" datatype="html">
|
||||
@ -6765,7 +6765,7 @@
|
||||
<target state="translated">Зміна від Історичного Максимуму</target>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">libs/ui/src/lib/benchmark/benchmark.component.html</context>
|
||||
<context context-type="linenumber">83</context>
|
||||
<context context-type="linenumber">96</context>
|
||||
</context-group>
|
||||
</trans-unit>
|
||||
<trans-unit id="4bbe89749f1580cdca7f9238cb67ba2bd6968126" datatype="html">
|
||||
@ -6773,7 +6773,7 @@
|
||||
<target state="translated">від ІМ</target>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">libs/ui/src/lib/benchmark/benchmark.component.html</context>
|
||||
<context context-type="linenumber">85</context>
|
||||
<context context-type="linenumber">98</context>
|
||||
</context-group>
|
||||
</trans-unit>
|
||||
<trans-unit id="b74406fd93207c23bb840732ad2760ce0efaa2c5" datatype="html">
|
||||
|
@ -979,7 +979,7 @@
|
||||
</context-group>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">libs/ui/src/lib/benchmark/benchmark.component.html</context>
|
||||
<context context-type="linenumber">3</context>
|
||||
<context context-type="linenumber">4</context>
|
||||
</context-group>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">libs/ui/src/lib/holdings-table/holdings-table.component.html</context>
|
||||
@ -1142,7 +1142,7 @@
|
||||
</context-group>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">libs/ui/src/lib/benchmark/benchmark.component.html</context>
|
||||
<context context-type="linenumber">142</context>
|
||||
<context context-type="linenumber">155</context>
|
||||
</context-group>
|
||||
</trans-unit>
|
||||
<trans-unit id="8280212421112607879" datatype="html">
|
||||
@ -4237,7 +4237,7 @@
|
||||
</context-group>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">libs/ui/src/lib/benchmark/benchmark.component.html</context>
|
||||
<context context-type="linenumber">174</context>
|
||||
<context context-type="linenumber">188</context>
|
||||
</context-group>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">libs/ui/src/lib/top-holdings/top-holdings.component.html</context>
|
||||
@ -5134,35 +5134,35 @@
|
||||
<source>50-Day Trend</source>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">libs/ui/src/lib/benchmark/benchmark.component.html</context>
|
||||
<context context-type="linenumber">15</context>
|
||||
<context context-type="linenumber">16</context>
|
||||
</context-group>
|
||||
</trans-unit>
|
||||
<trans-unit id="7cca44e647a4b3a6deff49cd29055e21e245f5ee" datatype="html">
|
||||
<source>200-Day Trend</source>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">libs/ui/src/lib/benchmark/benchmark.component.html</context>
|
||||
<context context-type="linenumber">40</context>
|
||||
<context context-type="linenumber">45</context>
|
||||
</context-group>
|
||||
</trans-unit>
|
||||
<trans-unit id="46236411f4e4f76b93179e7c73a08257d1be63cc" datatype="html">
|
||||
<source>Last All Time High</source>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">libs/ui/src/lib/benchmark/benchmark.component.html</context>
|
||||
<context context-type="linenumber">65</context>
|
||||
<context context-type="linenumber">74</context>
|
||||
</context-group>
|
||||
</trans-unit>
|
||||
<trans-unit id="c81076431c2d98928ac370ca3e57092ae77366d7" datatype="html">
|
||||
<source>Change from All Time High</source>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">libs/ui/src/lib/benchmark/benchmark.component.html</context>
|
||||
<context context-type="linenumber">83</context>
|
||||
<context context-type="linenumber">96</context>
|
||||
</context-group>
|
||||
</trans-unit>
|
||||
<trans-unit id="4bbe89749f1580cdca7f9238cb67ba2bd6968126" datatype="html">
|
||||
<source>from ATH</source>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">libs/ui/src/lib/benchmark/benchmark.component.html</context>
|
||||
<context context-type="linenumber">85</context>
|
||||
<context context-type="linenumber">98</context>
|
||||
</context-group>
|
||||
</trans-unit>
|
||||
<trans-unit id="b74406fd93207c23bb840732ad2760ce0efaa2c5" datatype="html">
|
||||
|
@ -1016,7 +1016,7 @@
|
||||
</context-group>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">libs/ui/src/lib/benchmark/benchmark.component.html</context>
|
||||
<context context-type="linenumber">3</context>
|
||||
<context context-type="linenumber">4</context>
|
||||
</context-group>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">libs/ui/src/lib/holdings-table/holdings-table.component.html</context>
|
||||
@ -1184,7 +1184,7 @@
|
||||
</context-group>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">libs/ui/src/lib/benchmark/benchmark.component.html</context>
|
||||
<context context-type="linenumber">142</context>
|
||||
<context context-type="linenumber">155</context>
|
||||
</context-group>
|
||||
</trans-unit>
|
||||
<trans-unit id="8280212421112607879" datatype="html">
|
||||
@ -4592,7 +4592,7 @@
|
||||
</context-group>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">libs/ui/src/lib/benchmark/benchmark.component.html</context>
|
||||
<context context-type="linenumber">174</context>
|
||||
<context context-type="linenumber">188</context>
|
||||
</context-group>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">libs/ui/src/lib/top-holdings/top-holdings.component.html</context>
|
||||
@ -5592,7 +5592,7 @@
|
||||
<target state="translated">50 天趋势</target>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">libs/ui/src/lib/benchmark/benchmark.component.html</context>
|
||||
<context context-type="linenumber">15</context>
|
||||
<context context-type="linenumber">16</context>
|
||||
</context-group>
|
||||
</trans-unit>
|
||||
<trans-unit id="7cca44e647a4b3a6deff49cd29055e21e245f5ee" datatype="html">
|
||||
@ -5600,7 +5600,7 @@
|
||||
<target state="translated">200天趋势</target>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">libs/ui/src/lib/benchmark/benchmark.component.html</context>
|
||||
<context context-type="linenumber">40</context>
|
||||
<context context-type="linenumber">45</context>
|
||||
</context-group>
|
||||
</trans-unit>
|
||||
<trans-unit id="46236411f4e4f76b93179e7c73a08257d1be63cc" datatype="html">
|
||||
@ -5608,7 +5608,7 @@
|
||||
<target state="translated">上次历史最高纪录</target>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">libs/ui/src/lib/benchmark/benchmark.component.html</context>
|
||||
<context context-type="linenumber">65</context>
|
||||
<context context-type="linenumber">74</context>
|
||||
</context-group>
|
||||
</trans-unit>
|
||||
<trans-unit id="c81076431c2d98928ac370ca3e57092ae77366d7" datatype="html">
|
||||
@ -5616,7 +5616,7 @@
|
||||
<target state="translated">从历史最高点开始变化</target>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">libs/ui/src/lib/benchmark/benchmark.component.html</context>
|
||||
<context context-type="linenumber">83</context>
|
||||
<context context-type="linenumber">96</context>
|
||||
</context-group>
|
||||
</trans-unit>
|
||||
<trans-unit id="4bbe89749f1580cdca7f9238cb67ba2bd6968126" datatype="html">
|
||||
@ -5624,7 +5624,7 @@
|
||||
<target state="translated">来自 ATH</target>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">libs/ui/src/lib/benchmark/benchmark.component.html</context>
|
||||
<context context-type="linenumber">85</context>
|
||||
<context context-type="linenumber">98</context>
|
||||
</context-group>
|
||||
</trans-unit>
|
||||
<trans-unit id="b74406fd93207c23bb840732ad2760ce0efaa2c5" datatype="html">
|
||||
|
@ -1,5 +1,6 @@
|
||||
import { Activity } from '@ghostfolio/api/app/order/interfaces/activities.interface';
|
||||
import {
|
||||
Benchmark,
|
||||
DataProviderInfo,
|
||||
EnhancedSymbolProfile,
|
||||
HistoricalDataItem
|
||||
@ -29,6 +30,7 @@ export interface PortfolioHoldingResponse {
|
||||
netPerformancePercent: number;
|
||||
netPerformancePercentWithCurrencyEffect: number;
|
||||
netPerformanceWithCurrencyEffect: number;
|
||||
performances: Benchmark['performances'];
|
||||
quantity: number;
|
||||
SymbolProfile: EnhancedSymbolProfile;
|
||||
tags: Tag[];
|
||||
|
@ -1,164 +1,178 @@
|
||||
<table class="gf-table w-100" mat-table [dataSource]="benchmarks">
|
||||
<ng-container matColumnDef="name">
|
||||
<th *matHeaderCellDef class="px-2" i18n mat-header-cell>Name</th>
|
||||
<td *matCellDef="let element" class="px-2" mat-cell>
|
||||
{{ element?.name }}
|
||||
</td>
|
||||
</ng-container>
|
||||
<div class="overflow-x-auto">
|
||||
<table class="gf-table w-100" mat-table [dataSource]="benchmarks">
|
||||
<ng-container matColumnDef="name">
|
||||
<th *matHeaderCellDef class="px-2" i18n mat-header-cell>Name</th>
|
||||
<td *matCellDef="let element" class="px-2 text-nowrap" mat-cell>
|
||||
{{ element?.name }}
|
||||
</td>
|
||||
</ng-container>
|
||||
|
||||
<ng-container matColumnDef="trend50d">
|
||||
<th
|
||||
*matHeaderCellDef
|
||||
class="d-none d-lg-table-cell px-2 text-right"
|
||||
mat-header-cell
|
||||
>
|
||||
<ng-container i18n>50-Day Trend</ng-container>
|
||||
</th>
|
||||
<td *matCellDef="let element" class="d-none d-lg-table-cell px-2" mat-cell>
|
||||
<div class="d-flex justify-content-end">
|
||||
@if (element?.trend50d !== 'UNKNOWN') {
|
||||
<gf-trend-indicator
|
||||
[value]="
|
||||
element?.trend50d === 'UP'
|
||||
? 0.001
|
||||
: element?.trend50d === 'DOWN'
|
||||
? -0.001
|
||||
: 0
|
||||
"
|
||||
/>
|
||||
}
|
||||
</div>
|
||||
</td>
|
||||
</ng-container>
|
||||
|
||||
<ng-container matColumnDef="trend200d">
|
||||
<th
|
||||
*matHeaderCellDef
|
||||
class="d-none d-lg-table-cell px-2 text-right"
|
||||
mat-header-cell
|
||||
>
|
||||
<ng-container i18n>200-Day Trend</ng-container>
|
||||
</th>
|
||||
<td *matCellDef="let element" class="d-none d-lg-table-cell px-2" mat-cell>
|
||||
<div class="d-flex justify-content-end">
|
||||
@if (element?.trend200d !== 'UNKNOWN') {
|
||||
<gf-trend-indicator
|
||||
[value]="
|
||||
element?.trend200d === 'UP'
|
||||
? 0.001
|
||||
: element?.trend200d === 'DOWN'
|
||||
? -0.001
|
||||
: 0
|
||||
"
|
||||
/>
|
||||
}
|
||||
</div>
|
||||
</td>
|
||||
</ng-container>
|
||||
|
||||
<ng-container matColumnDef="date">
|
||||
<th
|
||||
*matHeaderCellDef
|
||||
class="d-none d-lg-table-cell px-2 text-right"
|
||||
mat-header-cell
|
||||
>
|
||||
<ng-container i18n>Last All Time High</ng-container>
|
||||
</th>
|
||||
<td *matCellDef="let element" class="d-none d-lg-table-cell px-2" mat-cell>
|
||||
<div class="d-flex justify-content-end">
|
||||
@if (element?.performances?.allTimeHigh?.date) {
|
||||
<gf-value
|
||||
[isDate]="true"
|
||||
[locale]="locale"
|
||||
[value]="element?.performances?.allTimeHigh?.date"
|
||||
/>
|
||||
}
|
||||
</div>
|
||||
</td>
|
||||
</ng-container>
|
||||
|
||||
<ng-container matColumnDef="change">
|
||||
<th *matHeaderCellDef class="px-2 text-right" mat-header-cell>
|
||||
<span class="d-none d-sm-block text-nowrap" i18n
|
||||
>Change from All Time High</span
|
||||
<ng-container matColumnDef="trend50d">
|
||||
<th
|
||||
*matHeaderCellDef
|
||||
class="d-none d-lg-table-cell px-2 text-right"
|
||||
mat-header-cell
|
||||
>
|
||||
<span class="d-block d-sm-none text-nowrap" i18n>from ATH</span>
|
||||
</th>
|
||||
<td *matCellDef="let element" class="px-2 text-right" mat-cell>
|
||||
@if (isNumber(element?.performances?.allTimeHigh?.performancePercent)) {
|
||||
<gf-value
|
||||
class="d-inline-block justify-content-end"
|
||||
[isPercent]="true"
|
||||
[locale]="locale"
|
||||
[ngClass]="{
|
||||
'text-danger':
|
||||
element?.performances?.allTimeHigh?.performancePercent < 0,
|
||||
'text-success':
|
||||
element?.performances?.allTimeHigh?.performancePercent === 0
|
||||
}"
|
||||
[value]="element?.performances?.allTimeHigh?.performancePercent"
|
||||
/>
|
||||
}
|
||||
</td>
|
||||
</ng-container>
|
||||
|
||||
<ng-container matColumnDef="marketCondition">
|
||||
<th *matHeaderCellDef mat-header-cell></th>
|
||||
<td *matCellDef="let element" class="px-0" mat-cell>
|
||||
@if (element?.marketCondition) {
|
||||
<div class="text-center" [title]="translate(element.marketCondition)">
|
||||
{{ resolveMarketCondition(element.marketCondition).emoji }}
|
||||
<ng-container i18n>50-Day Trend</ng-container>
|
||||
</th>
|
||||
<td
|
||||
*matCellDef="let element"
|
||||
class="d-none d-lg-table-cell px-2"
|
||||
mat-cell
|
||||
>
|
||||
<div class="d-flex justify-content-end">
|
||||
@if (element?.trend50d !== 'UNKNOWN') {
|
||||
<gf-trend-indicator
|
||||
[value]="
|
||||
element?.trend50d === 'UP'
|
||||
? 0.001
|
||||
: element?.trend50d === 'DOWN'
|
||||
? -0.001
|
||||
: 0
|
||||
"
|
||||
/>
|
||||
}
|
||||
</div>
|
||||
}
|
||||
</td>
|
||||
</ng-container>
|
||||
</td>
|
||||
</ng-container>
|
||||
|
||||
<ng-container matColumnDef="actions" stickyEnd>
|
||||
<th *matHeaderCellDef class="px-1 text-center" mat-header-cell></th>
|
||||
<td *matCellDef="let element" class="px-1 text-center" mat-cell>
|
||||
@if (hasPermissionToDeleteItem) {
|
||||
<button
|
||||
class="mx-1 no-min-width px-2"
|
||||
mat-button
|
||||
[matMenuTriggerFor]="benchmarkMenu"
|
||||
(click)="$event.stopPropagation()"
|
||||
>
|
||||
<ion-icon name="ellipsis-horizontal" />
|
||||
</button>
|
||||
}
|
||||
<mat-menu #benchmarkMenu="matMenu" xPosition="before">
|
||||
<button
|
||||
mat-menu-item
|
||||
[disabled]="!hasPermissionToDeleteItem"
|
||||
(click)="
|
||||
onDeleteItem({
|
||||
dataSource: element.dataSource,
|
||||
symbol: element.symbol
|
||||
})
|
||||
"
|
||||
>
|
||||
<span class="align-items-center d-flex">
|
||||
<ion-icon class="mr-2" name="trash-outline" />
|
||||
<span i18n>Delete</span>
|
||||
</span>
|
||||
</button>
|
||||
</mat-menu>
|
||||
</td>
|
||||
</ng-container>
|
||||
<ng-container matColumnDef="trend200d">
|
||||
<th
|
||||
*matHeaderCellDef
|
||||
class="d-none d-lg-table-cell px-2 text-right"
|
||||
mat-header-cell
|
||||
>
|
||||
<ng-container i18n>200-Day Trend</ng-container>
|
||||
</th>
|
||||
<td
|
||||
*matCellDef="let element"
|
||||
class="d-none d-lg-table-cell px-2"
|
||||
mat-cell
|
||||
>
|
||||
<div class="d-flex justify-content-end">
|
||||
@if (element?.trend200d !== 'UNKNOWN') {
|
||||
<gf-trend-indicator
|
||||
[value]="
|
||||
element?.trend200d === 'UP'
|
||||
? 0.001
|
||||
: element?.trend200d === 'DOWN'
|
||||
? -0.001
|
||||
: 0
|
||||
"
|
||||
/>
|
||||
}
|
||||
</div>
|
||||
</td>
|
||||
</ng-container>
|
||||
|
||||
<tr *matHeaderRowDef="displayedColumns" mat-header-row></tr>
|
||||
<tr
|
||||
*matRowDef="let row; columns: displayedColumns"
|
||||
class="cursor-pointer"
|
||||
mat-row
|
||||
(click)="
|
||||
onOpenBenchmarkDialog({
|
||||
dataSource: row.dataSource,
|
||||
symbol: row.symbol
|
||||
})
|
||||
"
|
||||
></tr>
|
||||
</table>
|
||||
<ng-container matColumnDef="date">
|
||||
<th
|
||||
*matHeaderCellDef
|
||||
class="d-none d-lg-table-cell px-2 text-right"
|
||||
mat-header-cell
|
||||
>
|
||||
<ng-container i18n>Last All Time High</ng-container>
|
||||
</th>
|
||||
<td
|
||||
*matCellDef="let element"
|
||||
class="d-none d-lg-table-cell px-2"
|
||||
mat-cell
|
||||
>
|
||||
<div class="d-flex justify-content-end">
|
||||
@if (element?.performances?.allTimeHigh?.date) {
|
||||
<gf-value
|
||||
[isDate]="true"
|
||||
[locale]="locale"
|
||||
[value]="element?.performances?.allTimeHigh?.date"
|
||||
/>
|
||||
}
|
||||
</div>
|
||||
</td>
|
||||
</ng-container>
|
||||
|
||||
<ng-container matColumnDef="change">
|
||||
<th *matHeaderCellDef class="px-2 text-right" mat-header-cell>
|
||||
<span class="d-none d-sm-block text-nowrap" i18n
|
||||
>Change from All Time High</span
|
||||
>
|
||||
<span class="d-block d-sm-none text-nowrap" i18n>from ATH</span>
|
||||
</th>
|
||||
<td *matCellDef="let element" class="px-2 text-right" mat-cell>
|
||||
@if (isNumber(element?.performances?.allTimeHigh?.performancePercent)) {
|
||||
<gf-value
|
||||
class="d-inline-block justify-content-end"
|
||||
[isPercent]="true"
|
||||
[locale]="locale"
|
||||
[ngClass]="{
|
||||
'text-danger':
|
||||
element?.performances?.allTimeHigh?.performancePercent < 0,
|
||||
'text-success':
|
||||
element?.performances?.allTimeHigh?.performancePercent === 0
|
||||
}"
|
||||
[value]="element?.performances?.allTimeHigh?.performancePercent"
|
||||
/>
|
||||
}
|
||||
</td>
|
||||
</ng-container>
|
||||
|
||||
<ng-container matColumnDef="marketCondition">
|
||||
<th *matHeaderCellDef mat-header-cell></th>
|
||||
<td *matCellDef="let element" class="px-0" mat-cell>
|
||||
@if (element?.marketCondition) {
|
||||
<div class="text-center" [title]="translate(element.marketCondition)">
|
||||
{{ resolveMarketCondition(element.marketCondition).emoji }}
|
||||
</div>
|
||||
}
|
||||
</td>
|
||||
</ng-container>
|
||||
|
||||
<ng-container matColumnDef="actions" stickyEnd>
|
||||
<th *matHeaderCellDef class="px-1 text-center" mat-header-cell></th>
|
||||
<td *matCellDef="let element" class="px-1 text-center" mat-cell>
|
||||
@if (hasPermissionToDeleteItem) {
|
||||
<button
|
||||
class="mx-1 no-min-width px-2"
|
||||
mat-button
|
||||
[matMenuTriggerFor]="benchmarkMenu"
|
||||
(click)="$event.stopPropagation()"
|
||||
>
|
||||
<ion-icon name="ellipsis-horizontal" />
|
||||
</button>
|
||||
}
|
||||
<mat-menu #benchmarkMenu="matMenu" xPosition="before">
|
||||
<button
|
||||
mat-menu-item
|
||||
[disabled]="!hasPermissionToDeleteItem"
|
||||
(click)="
|
||||
onDeleteItem({
|
||||
dataSource: element.dataSource,
|
||||
symbol: element.symbol
|
||||
})
|
||||
"
|
||||
>
|
||||
<span class="align-items-center d-flex">
|
||||
<ion-icon class="mr-2" name="trash-outline" />
|
||||
<span i18n>Delete</span>
|
||||
</span>
|
||||
</button>
|
||||
</mat-menu>
|
||||
</td>
|
||||
</ng-container>
|
||||
|
||||
<tr *matHeaderRowDef="displayedColumns" mat-header-row></tr>
|
||||
<tr
|
||||
*matRowDef="let row; columns: displayedColumns"
|
||||
class="cursor-pointer"
|
||||
mat-row
|
||||
(click)="
|
||||
onOpenBenchmarkDialog({
|
||||
dataSource: row.dataSource,
|
||||
symbol: row.symbol
|
||||
})
|
||||
"
|
||||
></tr>
|
||||
</table>
|
||||
</div>
|
||||
|
||||
@if (isLoading) {
|
||||
<ngx-skeleton-loader
|
||||
|
4
package-lock.json
generated
4
package-lock.json
generated
@ -1,12 +1,12 @@
|
||||
{
|
||||
"name": "ghostfolio",
|
||||
"version": "2.160.0",
|
||||
"version": "2.161.0",
|
||||
"lockfileVersion": 3,
|
||||
"requires": true,
|
||||
"packages": {
|
||||
"": {
|
||||
"name": "ghostfolio",
|
||||
"version": "2.160.0",
|
||||
"version": "2.161.0",
|
||||
"hasInstallScript": true,
|
||||
"license": "AGPL-3.0",
|
||||
"dependencies": {
|
||||
|
@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "ghostfolio",
|
||||
"version": "2.160.0",
|
||||
"version": "2.161.0",
|
||||
"homepage": "https://ghostfol.io",
|
||||
"license": "AGPL-3.0",
|
||||
"repository": "https://github.com/ghostfolio/ghostfolio",
|
||||
|
@ -131,6 +131,7 @@ model Order {
|
||||
isDraft Boolean @default(false)
|
||||
quantity Float
|
||||
symbolProfileId String
|
||||
tags Tag[]
|
||||
type Type
|
||||
unitPrice Float
|
||||
updatedAt DateTime @updatedAt
|
||||
@ -138,7 +139,6 @@ model Order {
|
||||
Account Account? @relation(fields: [accountId, accountUserId], references: [id, userId])
|
||||
SymbolProfile SymbolProfile @relation(fields: [symbolProfileId], references: [id])
|
||||
User User @relation(fields: [userId], onDelete: Cascade, references: [id])
|
||||
tags Tag[]
|
||||
|
||||
@@index([accountId])
|
||||
@@index([date])
|
||||
@ -168,6 +168,7 @@ model Settings {
|
||||
}
|
||||
|
||||
model SymbolProfile {
|
||||
activities Order[]
|
||||
assetClass AssetClass?
|
||||
assetSubClass AssetSubClass?
|
||||
comment String?
|
||||
@ -192,7 +193,6 @@ model SymbolProfile {
|
||||
url String?
|
||||
userId String?
|
||||
watchedBy User[] @relation("UserWatchlist")
|
||||
Order Order[]
|
||||
SymbolProfileOverrides SymbolProfileOverrides?
|
||||
User User? @relation(fields: [userId], onDelete: Cascade, references: [id])
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user