diff --git a/CHANGELOG.md b/CHANGELOG.md index 5f5ad9470..7994659d7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -25,6 +25,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Improved the language localization for Portuguese (`pt`) - Improved the language localization for Spanish (`es`) +### Fixed + +- Fixed an issue with the clone functionality related to a custom asset profile activity + ## 2.181.0 - 2025-07-11 ### Changed diff --git a/apps/api/src/app/order/order.service.ts b/apps/api/src/app/order/order.service.ts index 9c96af865..21fa0d076 100644 --- a/apps/api/src/app/order/order.service.ts +++ b/apps/api/src/app/order/order.service.ts @@ -8,7 +8,8 @@ import { SymbolProfileService } from '@ghostfolio/api/services/symbol-profile/sy import { DATA_GATHERING_QUEUE_PRIORITY_HIGH, GATHER_ASSET_PROFILE_PROCESS_JOB_NAME, - GATHER_ASSET_PROFILE_PROCESS_JOB_OPTIONS + GATHER_ASSET_PROFILE_PROCESS_JOB_OPTIONS, + ghostfolioPrefix } from '@ghostfolio/common/config'; import { getAssetProfileIdentifier } from '@ghostfolio/common/helper'; import { @@ -30,6 +31,7 @@ import { Type as ActivityType } from '@prisma/client'; import { Big } from 'big.js'; +import { isUUID } from 'class-validator'; import { endOfToday, isAfter } from 'date-fns'; import { groupBy, uniqBy } from 'lodash'; import { v4 as uuidv4 } from 'uuid'; @@ -125,19 +127,33 @@ export class OrderService { const assetClass = data.assetClass; const assetSubClass = data.assetSubClass; const dataSource: DataSource = 'MANUAL'; - const id = uuidv4(); - const name = data.SymbolProfile.connectOrCreate.create.symbol; - data.id = id; + let name: string; + let symbol: string; + + if ( + data.SymbolProfile.connectOrCreate.create.symbol.startsWith( + `${ghostfolioPrefix}_` + ) || + isUUID(data.SymbolProfile.connectOrCreate.create.symbol) + ) { + // Connect custom asset profile (clone) + symbol = data.SymbolProfile.connectOrCreate.create.symbol; + } else { + // Create custom asset profile + name = data.SymbolProfile.connectOrCreate.create.symbol; + symbol = uuidv4(); + } + data.SymbolProfile.connectOrCreate.create.assetClass = assetClass; data.SymbolProfile.connectOrCreate.create.assetSubClass = assetSubClass; data.SymbolProfile.connectOrCreate.create.dataSource = dataSource; data.SymbolProfile.connectOrCreate.create.name = name; - data.SymbolProfile.connectOrCreate.create.symbol = id; + data.SymbolProfile.connectOrCreate.create.symbol = symbol; data.SymbolProfile.connectOrCreate.create.userId = userId; data.SymbolProfile.connectOrCreate.where.dataSource_symbol = { dataSource, - symbol: id + symbol }; } diff --git a/apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.component.ts b/apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.component.ts index e84554577..4343077e6 100644 --- a/apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.component.ts +++ b/apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.component.ts @@ -1,6 +1,9 @@ import { AdminService } from '@ghostfolio/client/services/admin.service'; import { DataService } from '@ghostfolio/client/services/data.service'; -import { PROPERTY_CURRENCIES } from '@ghostfolio/common/config'; +import { + ghostfolioPrefix, + PROPERTY_CURRENCIES +} from '@ghostfolio/common/config'; import { ChangeDetectionStrategy, @@ -55,7 +58,9 @@ export class CreateAssetProfileDialog implements OnInit, OnDestroy { addCurrency: new FormControl(null, [ this.iso4217CurrencyCodeValidator() ]), - addSymbol: new FormControl(null, [Validators.required]), + addSymbol: new FormControl(`${ghostfolioPrefix}_`, [ + Validators.required + ]), searchSymbol: new FormControl(null, [Validators.required]) }, {