From 745a0eed35f757811100b0327fe48e7fbd3b438b Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Sat, 22 Aug 2026 19:04:08 +0200 Subject: [PATCH] Feature/extend holdings table of AI prompt with date of first activity (#7698) * Extend holdings table with date of first activity * Update changelog --- CHANGELOG.md | 7 +++++++ apps/api/src/app/endpoints/ai/ai.service.ts | 13 ++++++++++++- 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f05a2196a..ba7d143d8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,13 @@ 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 + +### Added + +- Extended the holdings table by the date of first activity in the _Copy AI prompt to clipboard for analysis_ action on the analysis page (experimental) +- Extended the holdings table by the date of first activity in the _Copy portfolio data to clipboard for AI prompt_ action on the analysis page (experimental) + ## 3.58.0 - 2026-08-22 ### Changed diff --git a/apps/api/src/app/endpoints/ai/ai.service.ts b/apps/api/src/app/endpoints/ai/ai.service.ts index 70741374d..4e35ff5ef 100644 --- a/apps/api/src/app/endpoints/ai/ai.service.ts +++ b/apps/api/src/app/endpoints/ai/ai.service.ts @@ -5,12 +5,14 @@ import { PROPERTY_API_KEY_OPENROUTER, PROPERTY_OPENROUTER_MODEL } from '@ghostfolio/common/config'; +import { DATE_FORMAT } from '@ghostfolio/common/helper'; import { Filter } from '@ghostfolio/common/interfaces'; import type { AiPromptMode } from '@ghostfolio/common/types'; import { Injectable } from '@nestjs/common'; import { createOpenRouter } from '@openrouter/ai-sdk-provider'; import { generateText } from 'ai'; +import { format } from 'date-fns'; import type { ColumnDescriptor } from 'tablemark'; @Injectable() @@ -21,6 +23,7 @@ export class AiService { | 'ASSET_CLASS' | 'ASSET_SUB_CLASS' | 'CURRENCY' + | 'DATE_OF_FIRST_ACTIVITY' | 'NAME' | 'SYMBOL'; } & ColumnDescriptor)[] = [ @@ -29,6 +32,7 @@ export class AiService { { key: 'CURRENCY', name: 'Currency' }, { key: 'ASSET_CLASS', name: 'Asset Class' }, { key: 'ASSET_SUB_CLASS', name: 'Asset Sub Class' }, + { key: 'DATE_OF_FIRST_ACTIVITY', name: 'Date of First Activity' }, { align: 'right', key: 'ALLOCATION_PERCENTAGE', @@ -104,7 +108,8 @@ export class AiService { currency, name: label, symbol - } + }, + dateOfFirstActivity }) => { return AiService.HOLDINGS_TABLE_COLUMN_DEFINITIONS.reduce( (row, { key, name }) => { @@ -125,6 +130,12 @@ export class AiService { row[name] = currency; break; + case 'DATE_OF_FIRST_ACTIVITY': + row[name] = dateOfFirstActivity + ? format(dateOfFirstActivity, DATE_FORMAT) + : ''; + break; + case 'NAME': row[name] = label; break;