From 2cbbaed9a9a7dffe53c41224f3dfc5e681970884 Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Wed, 7 Oct 2026 20:30:51 +0200 Subject: [PATCH] Fix creation of custom asset profiles with ghostfolio prefix --- .../src/app/activities/activities.service.ts | 8 ++--- .../api/src/app/import/import.service.spec.ts | 33 +++++++++++++++++++ apps/api/src/app/import/import.service.ts | 4 ++- 3 files changed, 39 insertions(+), 6 deletions(-) diff --git a/apps/api/src/app/activities/activities.service.ts b/apps/api/src/app/activities/activities.service.ts index bbd24dd0e5..c592a44e76 100644 --- a/apps/api/src/app/activities/activities.service.ts +++ b/apps/api/src/app/activities/activities.service.ts @@ -37,8 +37,8 @@ import { canUseCustomAssetProfileSymbol, getAssetProfileIdentifier, getStartOfUtcDateOfTomorrow, - isDraftActivity, - isValidCustomAssetProfileSymbol + hasGhostfolioPrefix, + isDraftActivity } from '@ghostfolio/common/helper'; import { ActivitiesResponse, @@ -226,9 +226,7 @@ export class ActivitiesService { let name = data.SymbolProfile.connectOrCreate.create.name; let symbol: string; - const existingAssetProfile = isValidCustomAssetProfileSymbol( - requestedSymbol - ) + const existingAssetProfile = hasGhostfolioPrefix(requestedSymbol) ? await this.prismaService.symbolProfile.findUnique({ select: { id: true }, where: { diff --git a/apps/api/src/app/import/import.service.spec.ts b/apps/api/src/app/import/import.service.spec.ts index 4a297dcd9d..5858cf0b65 100644 --- a/apps/api/src/app/import/import.service.spec.ts +++ b/apps/api/src/app/import/import.service.spec.ts @@ -396,6 +396,39 @@ describe('ImportService', () => { ).toMatchObject({ symbol, dataSource: DataSource.MANUAL }); }); + it('refers the next activities with a symbol with the prefix to the custom asset profile which createActivity() has created', async () => { + mockCreatedAssetProfiles([ + { dataSource: DataSource.MANUAL, symbol: CUSTOM_ASSET_PROFILE_SYMBOL }, + { dataSource: DataSource.MANUAL, symbol: CUSTOM_ASSET_PROFILE_SYMBOL } + ]); + + await importActivities({ + activitiesDto: [ + createActivityDto({ + dataSource: DataSource.MANUAL, + date: '2024-01-01T00:00:00.000Z', + symbol: 'GF_COPX', + type: 'BUY' + }), + createActivityDto({ + dataSource: DataSource.MANUAL, + date: '2024-01-02T00:00:00.000Z', + symbol: 'GF_COPX', + type: 'BUY' + }) + ] + }); + + expect( + createActivity.mock.calls.map(([activity]) => { + return activity.SymbolProfile.connectOrCreate.create; + }) + ).toMatchObject([ + { dataSource: DataSource.MANUAL, symbol: 'GF_COPX' }, + { dataSource: DataSource.MANUAL, symbol: CUSTOM_ASSET_PROFILE_SYMBOL } + ]); + }); + it('keeps the asset profiles of the activities in a dry run', async () => { const activities = await importActivities({ activitiesDto: [ diff --git a/apps/api/src/app/import/import.service.ts b/apps/api/src/app/import/import.service.ts index 3cfb1973ab..0f44fc2855 100644 --- a/apps/api/src/app/import/import.service.ts +++ b/apps/api/src/app/import/import.service.ts @@ -660,7 +660,9 @@ export class ImportService { } ); - assetProfile.name ??= symbol; + if (hasGhostfolioPrefix(symbol)) { + assetProfile.name ??= symbol; + } symbol = isSymbolOfAssetProfileToCreate ? assetProfileSymbolMapping[symbol]