From 47b8494efa2f5619f106c1c94ab27167fd029d62 Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Sun, 18 Jan 2026 10:32:18 +0100 Subject: [PATCH 1/2] Task/upgrade countries-list to version 3.2.2 (#6209) * Upgrade countries-list to version 3.2.2 * Update changelog --- CHANGELOG.md | 6 ++++++ package-lock.json | 8 ++++---- package.json | 2 +- 3 files changed, 11 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 311b3c36b..28d3b6ea0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,12 @@ 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 + +### Changed + +- Upgraded `countries-list` from version `3.2.0` to `3.2.2` + ## 2.231.0 - 2026-01-17 ### Changed diff --git a/package-lock.json b/package-lock.json index fb86f76be..b8e9295ed 100644 --- a/package-lock.json +++ b/package-lock.json @@ -56,7 +56,7 @@ "class-validator": "0.14.3", "color": "5.0.3", "countries-and-timezones": "3.8.0", - "countries-list": "3.2.0", + "countries-list": "3.2.2", "countup.js": "2.9.0", "date-fns": "4.1.0", "dotenv": "17.2.3", @@ -16319,9 +16319,9 @@ } }, "node_modules/countries-list": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/countries-list/-/countries-list-3.2.0.tgz", - "integrity": "sha512-HYHAo2fwEsG3TmbsNdVmIQPHizRlqeYMTtLEAl0IANG/3jRYX7p3NR6VapDqKP0n60TmsRy1dyRjVN5JbywDbA==", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/countries-list/-/countries-list-3.2.2.tgz", + "integrity": "sha512-ABJ/RWQBrPWy+hRuZoW+0ooK8p65Eo3WmUZwHm6v4wmfSPznNAKzjy3+UUYrJK2v3182BVsgWxdB6ROidj39kw==", "license": "MIT" }, "node_modules/countup.js": { diff --git a/package.json b/package.json index a45df0d61..0b5a28deb 100644 --- a/package.json +++ b/package.json @@ -100,7 +100,7 @@ "class-validator": "0.14.3", "color": "5.0.3", "countries-and-timezones": "3.8.0", - "countries-list": "3.2.0", + "countries-list": "3.2.2", "countup.js": "2.9.0", "date-fns": "4.1.0", "dotenv": "17.2.3", From 4cfb785499538ca3bde4b4f04db75986aa947cab Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Sun, 18 Jan 2026 10:42:58 +0100 Subject: [PATCH 2/2] Task/deprecate firstBuyDate in portfolio holding response (#6208) * Deprecate firstBuyDate * Update changelog --- CHANGELOG.md | 1 + apps/api/src/app/import/import.service.ts | 6 +++--- apps/api/src/app/portfolio/portfolio.service.ts | 1 + .../holding-detail-dialog.component.ts | 14 +++++++------- .../holding-detail-dialog.html | 4 ++-- .../portfolio-holding-response.interface.ts | 4 ++++ 6 files changed, 18 insertions(+), 12 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 28d3b6ea0..8c66c9c07 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### 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` ## 2.231.0 - 2026-01-17 diff --git a/apps/api/src/app/import/import.service.ts b/apps/api/src/app/import/import.service.ts index 3f8bd2cde..7e8e333b9 100644 --- a/apps/api/src/app/import/import.service.ts +++ b/apps/api/src/app/import/import.service.ts @@ -82,7 +82,7 @@ export class ImportService { filterBySymbol: symbol }); - const { firstBuyDate, historicalData } = holding; + const { dateOfFirstActivity, historicalData } = holding; const [{ accounts }, { activities }, [assetProfile], dividends] = await Promise.all([ @@ -95,7 +95,7 @@ export class ImportService { filters, userCurrency, userId, - startDate: parseDate(firstBuyDate) + startDate: parseDate(dateOfFirstActivity) }), this.symbolProfileService.getSymbolProfiles([ { @@ -106,7 +106,7 @@ export class ImportService { await this.dataProviderService.getDividends({ dataSource, symbol, - from: parseDate(firstBuyDate), + from: parseDate(dateOfFirstActivity), granularity: 'day', to: new Date() }) diff --git a/apps/api/src/app/portfolio/portfolio.service.ts b/apps/api/src/app/portfolio/portfolio.service.ts index 5fc2224eb..9a6f6af62 100644 --- a/apps/api/src/app/portfolio/portfolio.service.ts +++ b/apps/api/src/app/portfolio/portfolio.service.ts @@ -923,6 +923,7 @@ export class PortfolioService { activitiesCount: transactionCount, averagePrice: averagePrice.toNumber(), dataProviderInfo: portfolioCalculator.getDataProviderInfos()?.[0], + dateOfFirstActivity: firstBuyDate, dividendInBaseCurrency: dividendInBaseCurrency.toNumber(), dividendYieldPercent: dividendYieldPercent.toNumber(), dividendYieldPercentWithCurrencyEffect: diff --git a/apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.component.ts b/apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.component.ts index 95c58d35a..427386796 100644 --- a/apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.component.ts +++ b/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 dataSource: MatTableDataSource; + public dateOfFirstActivity: string; public dividendInBaseCurrency: number; public dividendInBaseCurrencyPrecision = 2; public dividendYieldPercentWithCurrencyEffect: number; public feeInBaseCurrency: number; - public firstBuyDate: string; public hasPermissionToCreateOwnTag: boolean; public hasPermissionToReadMarketDataOfOwnAssetProfile: boolean; public historicalDataItems: LineChartItem[]; @@ -267,10 +267,10 @@ export class GfHoldingDetailDialogComponent implements OnDestroy, OnInit { activitiesCount, averagePrice, dataProviderInfo, + dateOfFirstActivity, dividendInBaseCurrency, dividendYieldPercentWithCurrencyEffect, feeInBaseCurrency, - firstBuyDate, historicalData, investmentInBaseCurrencyWithCurrencyEffect, marketPrice, @@ -298,6 +298,7 @@ export class GfHoldingDetailDialogComponent implements OnDestroy, OnInit { this.benchmarkDataItems = []; this.countries = {}; this.dataProviderInfo = dataProviderInfo; + this.dateOfFirstActivity = dateOfFirstActivity; this.dividendInBaseCurrency = dividendInBaseCurrency; if ( @@ -312,7 +313,6 @@ export class GfHoldingDetailDialogComponent implements OnDestroy, OnInit { dividendYieldPercentWithCurrencyEffect; this.feeInBaseCurrency = feeInBaseCurrency; - this.firstBuyDate = firstBuyDate; this.hasPermissionToReadMarketDataOfOwnAssetProfile = hasPermission( @@ -461,16 +461,16 @@ export class GfHoldingDetailDialogComponent implements OnDestroy, OnInit { } } - if (isToday(parseISO(this.firstBuyDate))) { + if (isToday(parseISO(this.dateOfFirstActivity))) { // Add average price this.historicalDataItems.push({ - date: this.firstBuyDate, + date: this.dateOfFirstActivity, value: this.averagePrice }); // Add benchmark 1 this.benchmarkDataItems.push({ - date: this.firstBuyDate, + date: this.dateOfFirstActivity, value: averagePrice }); @@ -501,7 +501,7 @@ export class GfHoldingDetailDialogComponent implements OnDestroy, OnInit { if ( this.benchmarkDataItems[0]?.value === undefined && - isSameMonth(parseISO(this.firstBuyDate), new Date()) + isSameMonth(parseISO(this.dateOfFirstActivity), new Date()) ) { this.benchmarkDataItems[0].value = this.averagePrice; } diff --git a/apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html b/apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html index f52286160..f9329dbfb 100644 --- a/apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html +++ b/apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -215,7 +215,7 @@ [deviceType]="data.deviceType" [isDate]="true" [locale]="data.locale" - [value]="firstBuyDate" + [value]="dateOfFirstActivity" >First Activity @@ -400,7 +400,7 @@