From 4d01185af1061611872200f7d65a507fd9e2dff9 Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Sat, 5 Jul 2025 12:19:02 +0200 Subject: [PATCH] Deprecate ITEM activity type in favor of BUY --- README.md | 25 +++++++++---------- apps/api/src/app/export/export.service.ts | 8 +++--- apps/api/src/app/import/import.service.ts | 2 +- apps/api/src/app/order/order.service.ts | 10 +++++--- ... => portfolio-calculator-valuable.spec.ts} | 23 +++++++++++------ .../app/services/import-activities.service.ts | 2 -- .../activity-type.component.html | 3 --- .../activity-type.component.scss | 4 --- libs/ui/src/lib/i18n.ts | 1 - 9 files changed, 40 insertions(+), 38 deletions(-) rename apps/api/src/app/portfolio/calculator/roai/{portfolio-calculator-item.spec.ts => portfolio-calculator-valuable.spec.ts} (92%) diff --git a/README.md b/README.md index d2f5394ff..d5824cad4 100644 --- a/README.md +++ b/README.md @@ -138,7 +138,6 @@ docker compose -f docker/docker-compose.build.yml up -d #### Upgrade Version 1. Update the _Ghostfolio_ Docker image - - Increase the version of the `ghostfolio/ghostfolio` Docker image in `docker/docker-compose.yml` - Run the following command if `ghostfolio:latest` is set: ```bash @@ -222,18 +221,18 @@ Deprecated: `GET http://localhost:3333/api/v1/auth/anonymous/ { return tagId; }) diff --git a/apps/api/src/app/import/import.service.ts b/apps/api/src/app/import/import.service.ts index a14b523a0..c48df08d0 100644 --- a/apps/api/src/app/import/import.service.ts +++ b/apps/api/src/app/import/import.service.ts @@ -232,7 +232,7 @@ export class ImportService { for (const activity of activitiesDto) { if (!activity.dataSource) { - if (['FEE', 'INTEREST', 'ITEM', 'LIABILITY'].includes(activity.type)) { + if (['FEE', 'INTEREST', 'LIABILITY'].includes(activity.type)) { activity.dataSource = DataSource.MANUAL; } else { activity.dataSource = diff --git a/apps/api/src/app/order/order.service.ts b/apps/api/src/app/order/order.service.ts index 51c03e3a9..0c803d3d2 100644 --- a/apps/api/src/app/order/order.service.ts +++ b/apps/api/src/app/order/order.service.ts @@ -118,7 +118,7 @@ export class OrderService { const userId = data.userId; if ( - ['FEE', 'INTEREST', 'ITEM', 'LIABILITY'].includes(data.type) || + ['FEE', 'INTEREST', 'LIABILITY'].includes(data.type) || (data.SymbolProfile.connectOrCreate.create.dataSource === 'MANUAL' && data.type === 'BUY') ) { @@ -174,7 +174,7 @@ export class OrderService { const orderData: Prisma.OrderCreateInput = data; - const isDraft = ['FEE', 'INTEREST', 'ITEM', 'LIABILITY'].includes(data.type) + const isDraft = ['FEE', 'INTEREST', 'LIABILITY'].includes(data.type) ? false : isAfter(data.date as Date, endOfToday()); @@ -647,7 +647,11 @@ export class OrderService { let isDraft = false; - if (['FEE', 'INTEREST', 'ITEM', 'LIABILITY'].includes(data.type)) { + if ( + ['FEE', 'INTEREST', 'LIABILITY'].includes(data.type) || + (data.SymbolProfile.connect.dataSource_symbol.dataSource === 'MANUAL' && + data.type === 'BUY') + ) { delete data.SymbolProfile.connect; if (data.account?.connect?.id_userId?.id === null) { diff --git a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-item.spec.ts b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-valuable.spec.ts similarity index 92% rename from apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-item.spec.ts rename to apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-valuable.spec.ts index 469ebcd41..e0b6ca975 100644 --- a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-item.spec.ts +++ b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-valuable.spec.ts @@ -82,7 +82,7 @@ describe('PortfolioCalculator', () => { }); describe('compute portfolio snapshot', () => { - it.only('with item activity', async () => { + it.only('with valuable activity', async () => { jest.useFakeTimers().setSystemTime(parseDate('2022-01-31').getTime()); const activities: Activity[] = [ @@ -98,7 +98,7 @@ describe('PortfolioCalculator', () => { name: 'Penthouse Apartment', symbol: 'dac95060-d4f2-4653-a253-2c45e6fb5cde' }, - type: 'ITEM', + type: 'BUY', unitPriceInAssetProfileCurrency: 500000 } ]; @@ -113,8 +113,15 @@ describe('PortfolioCalculator', () => { const portfolioSnapshot = await portfolioCalculator.computeSnapshot(); expect(portfolioSnapshot).toMatchObject({ - currentValueInBaseCurrency: new Big('0'), - errors: [], + currentValueInBaseCurrency: new Big('500000'), + // TODO + errors: [ + { + dataSource: 'MANUAL', + symbol: 'dac95060-d4f2-4653-a253-2c45e6fb5cde' + } + ], + // TODO hasErrors: true, positions: [ { @@ -130,21 +137,21 @@ describe('PortfolioCalculator', () => { grossPerformancePercentage: null, grossPerformancePercentageWithCurrencyEffect: null, grossPerformanceWithCurrencyEffect: null, - investment: new Big('0'), - investmentWithCurrencyEffect: new Big('0'), + investment: new Big('0'), // TODO + investmentWithCurrencyEffect: new Big('0'), // TODO marketPrice: null, marketPriceInBaseCurrency: 500000, netPerformance: null, netPerformancePercentage: null, netPerformancePercentageWithCurrencyEffectMap: null, netPerformanceWithCurrencyEffectMap: null, - quantity: new Big('0'), + quantity: new Big('1'), symbol: 'dac95060-d4f2-4653-a253-2c45e6fb5cde', tags: [], timeWeightedInvestment: new Big('0'), timeWeightedInvestmentWithCurrencyEffect: new Big('0'), transactionCount: 1, - valueInBaseCurrency: new Big('0') + valueInBaseCurrency: new Big('500000') } ], totalFeesWithCurrencyEffect: new Big('0'), diff --git a/apps/client/src/app/services/import-activities.service.ts b/apps/client/src/app/services/import-activities.service.ts index 2164bd248..a4ffa7ec4 100644 --- a/apps/client/src/app/services/import-activities.service.ts +++ b/apps/client/src/app/services/import-activities.service.ts @@ -343,8 +343,6 @@ export class ImportActivitiesService { return 'FEE'; case 'interest': return 'INTEREST'; - case 'item': - return 'ITEM'; case 'liability': return 'LIABILITY'; case 'sell': diff --git a/libs/ui/src/lib/activity-type/activity-type.component.html b/libs/ui/src/lib/activity-type/activity-type.component.html index 78eb2f17b..fe5ecfa01 100644 --- a/libs/ui/src/lib/activity-type/activity-type.component.html +++ b/libs/ui/src/lib/activity-type/activity-type.component.html @@ -5,7 +5,6 @@ dividend: activityType === 'DIVIDEND', fee: activityType === 'FEE', interest: activityType === 'INTEREST', - item: activityType === 'ITEM', liability: activityType === 'LIABILITY', sell: activityType === 'SELL' }" @@ -16,8 +15,6 @@ } @else if (activityType === 'FEE') { - } @else if (activityType === 'ITEM') { - } @else if (activityType === 'LIABILITY') { } @else if (activityType === 'SELL') { diff --git a/libs/ui/src/lib/activity-type/activity-type.component.scss b/libs/ui/src/lib/activity-type/activity-type.component.scss index 49889b665..34b951805 100644 --- a/libs/ui/src/lib/activity-type/activity-type.component.scss +++ b/libs/ui/src/lib/activity-type/activity-type.component.scss @@ -26,10 +26,6 @@ color: var(--cyan); } - &.item { - color: var(--purple); - } - &.liability { color: var(--red); } diff --git a/libs/ui/src/lib/i18n.ts b/libs/ui/src/lib/i18n.ts index 62b7d162a..759561ce5 100644 --- a/libs/ui/src/lib/i18n.ts +++ b/libs/ui/src/lib/i18n.ts @@ -36,7 +36,6 @@ const locales = { DIVIDEND: $localize`Dividend`, FEE: $localize`Fee`, INTEREST: $localize`Interest`, - ITEM: $localize`Valuable`, LIABILITY: $localize`Liability`, SELL: $localize`Sell`,