Browse Source

Task/deprecate firstBuyDate in portfolio holding response (#6208)

* Deprecate firstBuyDate

* Update changelog
pull/6211/head
Thomas Kaul 3 days ago
committed by GitHub
parent
commit
4cfb785499
No known key found for this signature in database GPG Key ID: B5690EEEBB952194
  1. 1
      CHANGELOG.md
  2. 6
      apps/api/src/app/import/import.service.ts
  3. 1
      apps/api/src/app/portfolio/portfolio.service.ts
  4. 14
      apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.component.ts
  5. 4
      apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
  6. 4
      libs/common/src/lib/interfaces/responses/portfolio-holding-response.interface.ts

1
CHANGELOG.md

@ -9,6 +9,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
### Changed ### Changed
- Deprecated `firstBuyDate` in favor of `dateOfFirstActivity` in the endpoint `GET api/v1/portfolio/holding/:dataSource/:symbol`
- Upgraded `countries-list` from version `3.2.0` to `3.2.2` - Upgraded `countries-list` from version `3.2.0` to `3.2.2`
## 2.231.0 - 2026-01-17 ## 2.231.0 - 2026-01-17

6
apps/api/src/app/import/import.service.ts

@ -82,7 +82,7 @@ export class ImportService {
filterBySymbol: symbol filterBySymbol: symbol
}); });
const { firstBuyDate, historicalData } = holding; const { dateOfFirstActivity, historicalData } = holding;
const [{ accounts }, { activities }, [assetProfile], dividends] = const [{ accounts }, { activities }, [assetProfile], dividends] =
await Promise.all([ await Promise.all([
@ -95,7 +95,7 @@ export class ImportService {
filters, filters,
userCurrency, userCurrency,
userId, userId,
startDate: parseDate(firstBuyDate) startDate: parseDate(dateOfFirstActivity)
}), }),
this.symbolProfileService.getSymbolProfiles([ this.symbolProfileService.getSymbolProfiles([
{ {
@ -106,7 +106,7 @@ export class ImportService {
await this.dataProviderService.getDividends({ await this.dataProviderService.getDividends({
dataSource, dataSource,
symbol, symbol,
from: parseDate(firstBuyDate), from: parseDate(dateOfFirstActivity),
granularity: 'day', granularity: 'day',
to: new Date() to: new Date()
}) })

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

@ -923,6 +923,7 @@ export class PortfolioService {
activitiesCount: transactionCount, activitiesCount: transactionCount,
averagePrice: averagePrice.toNumber(), averagePrice: averagePrice.toNumber(),
dataProviderInfo: portfolioCalculator.getDataProviderInfos()?.[0], dataProviderInfo: portfolioCalculator.getDataProviderInfos()?.[0],
dateOfFirstActivity: firstBuyDate,
dividendInBaseCurrency: dividendInBaseCurrency.toNumber(), dividendInBaseCurrency: dividendInBaseCurrency.toNumber(),
dividendYieldPercent: dividendYieldPercent.toNumber(), dividendYieldPercent: dividendYieldPercent.toNumber(),
dividendYieldPercentWithCurrencyEffect: dividendYieldPercentWithCurrencyEffect:

14
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.component.ts

@ -116,11 +116,11 @@ export class GfHoldingDetailDialogComponent implements OnDestroy, OnInit {
}; };
public dataProviderInfo: DataProviderInfo; public dataProviderInfo: DataProviderInfo;
public dataSource: MatTableDataSource<Activity>; public dataSource: MatTableDataSource<Activity>;
public dateOfFirstActivity: string;
public dividendInBaseCurrency: number; public dividendInBaseCurrency: number;
public dividendInBaseCurrencyPrecision = 2; public dividendInBaseCurrencyPrecision = 2;
public dividendYieldPercentWithCurrencyEffect: number; public dividendYieldPercentWithCurrencyEffect: number;
public feeInBaseCurrency: number; public feeInBaseCurrency: number;
public firstBuyDate: string;
public hasPermissionToCreateOwnTag: boolean; public hasPermissionToCreateOwnTag: boolean;
public hasPermissionToReadMarketDataOfOwnAssetProfile: boolean; public hasPermissionToReadMarketDataOfOwnAssetProfile: boolean;
public historicalDataItems: LineChartItem[]; public historicalDataItems: LineChartItem[];
@ -267,10 +267,10 @@ export class GfHoldingDetailDialogComponent implements OnDestroy, OnInit {
activitiesCount, activitiesCount,
averagePrice, averagePrice,
dataProviderInfo, dataProviderInfo,
dateOfFirstActivity,
dividendInBaseCurrency, dividendInBaseCurrency,
dividendYieldPercentWithCurrencyEffect, dividendYieldPercentWithCurrencyEffect,
feeInBaseCurrency, feeInBaseCurrency,
firstBuyDate,
historicalData, historicalData,
investmentInBaseCurrencyWithCurrencyEffect, investmentInBaseCurrencyWithCurrencyEffect,
marketPrice, marketPrice,
@ -298,6 +298,7 @@ export class GfHoldingDetailDialogComponent implements OnDestroy, OnInit {
this.benchmarkDataItems = []; this.benchmarkDataItems = [];
this.countries = {}; this.countries = {};
this.dataProviderInfo = dataProviderInfo; this.dataProviderInfo = dataProviderInfo;
this.dateOfFirstActivity = dateOfFirstActivity;
this.dividendInBaseCurrency = dividendInBaseCurrency; this.dividendInBaseCurrency = dividendInBaseCurrency;
if ( if (
@ -312,7 +313,6 @@ export class GfHoldingDetailDialogComponent implements OnDestroy, OnInit {
dividendYieldPercentWithCurrencyEffect; dividendYieldPercentWithCurrencyEffect;
this.feeInBaseCurrency = feeInBaseCurrency; this.feeInBaseCurrency = feeInBaseCurrency;
this.firstBuyDate = firstBuyDate;
this.hasPermissionToReadMarketDataOfOwnAssetProfile = this.hasPermissionToReadMarketDataOfOwnAssetProfile =
hasPermission( hasPermission(
@ -461,16 +461,16 @@ export class GfHoldingDetailDialogComponent implements OnDestroy, OnInit {
} }
} }
if (isToday(parseISO(this.firstBuyDate))) { if (isToday(parseISO(this.dateOfFirstActivity))) {
// Add average price // Add average price
this.historicalDataItems.push({ this.historicalDataItems.push({
date: this.firstBuyDate, date: this.dateOfFirstActivity,
value: this.averagePrice value: this.averagePrice
}); });
// Add benchmark 1 // Add benchmark 1
this.benchmarkDataItems.push({ this.benchmarkDataItems.push({
date: this.firstBuyDate, date: this.dateOfFirstActivity,
value: averagePrice value: averagePrice
}); });
@ -501,7 +501,7 @@ export class GfHoldingDetailDialogComponent implements OnDestroy, OnInit {
if ( if (
this.benchmarkDataItems[0]?.value === undefined && this.benchmarkDataItems[0]?.value === undefined &&
isSameMonth(parseISO(this.firstBuyDate), new Date()) isSameMonth(parseISO(this.dateOfFirstActivity), new Date())
) { ) {
this.benchmarkDataItems[0].value = this.averagePrice; this.benchmarkDataItems[0].value = this.averagePrice;
} }

4
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html

@ -215,7 +215,7 @@
[deviceType]="data.deviceType" [deviceType]="data.deviceType"
[isDate]="true" [isDate]="true"
[locale]="data.locale" [locale]="data.locale"
[value]="firstBuyDate" [value]="dateOfFirstActivity"
>First Activity</gf-value >First Activity</gf-value
> >
</div> </div>
@ -400,7 +400,7 @@
<gf-historical-market-data-editor <gf-historical-market-data-editor
[currency]="SymbolProfile?.currency" [currency]="SymbolProfile?.currency"
[dataSource]="SymbolProfile?.dataSource" [dataSource]="SymbolProfile?.dataSource"
[dateOfFirstActivity]="firstBuyDate" [dateOfFirstActivity]="dateOfFirstActivity"
[locale]="data.locale" [locale]="data.locale"
[marketData]="marketDataItems" [marketData]="marketDataItems"
[symbol]="SymbolProfile?.symbol" [symbol]="SymbolProfile?.symbol"

4
libs/common/src/lib/interfaces/responses/portfolio-holding-response.interface.ts

@ -11,11 +11,15 @@ export interface PortfolioHoldingResponse {
activitiesCount: number; activitiesCount: number;
averagePrice: number; averagePrice: number;
dataProviderInfo: DataProviderInfo; dataProviderInfo: DataProviderInfo;
dateOfFirstActivity: string;
dividendInBaseCurrency: number; dividendInBaseCurrency: number;
dividendYieldPercent: number; dividendYieldPercent: number;
dividendYieldPercentWithCurrencyEffect: number; dividendYieldPercentWithCurrencyEffect: number;
feeInBaseCurrency: number; feeInBaseCurrency: number;
/** @deprecated use dateOfFirstActivity */
firstBuyDate: string; firstBuyDate: string;
grossPerformance: number; grossPerformance: number;
grossPerformancePercent: number; grossPerformancePercent: number;
grossPerformancePercentWithCurrencyEffect: number; grossPerformancePercentWithCurrencyEffect: number;

Loading…
Cancel
Save