From ce57e8166ff5e0dbfc51253c143ea7e469eb50b8 Mon Sep 17 00:00:00 2001 From: Raj Gupta <150777419+Raj-G07@users.noreply.github.com> Date: Thu, 23 Oct 2025 19:21:19 +0530 Subject: [PATCH] format:check --- CHANGELOG.md | 2 ++ apps/api/src/app/import/import.service.ts | 22 +++++++------- .../order/interfaces/activities.interface.ts | 28 ------------------ .../portfolio-calculator.factory.ts | 9 ++++-- .../calculator/portfolio-calculator.ts | 4 +-- ...tfolio-calculator-baln-buy-and-buy.spec.ts | 4 +-- ...aln-buy-and-sell-in-two-activities.spec.ts | 4 +-- ...folio-calculator-baln-buy-and-sell.spec.ts | 4 +-- .../portfolio-calculator-baln-buy.spec.ts | 8 ++--- .../roai/portfolio-calculator-btceur.spec.ts | 8 +++-- ...ator-btcusd-buy-and-sell-partially.spec.ts | 4 +-- .../portfolio-calculator-btcusd-short.spec.ts | 8 +++-- .../roai/portfolio-calculator-btcusd.spec.ts | 8 +++-- .../roai/portfolio-calculator-fee.spec.ts | 4 +-- .../portfolio-calculator-googl-buy.spec.ts | 4 +-- .../portfolio-calculator-liability.spec.ts | 4 +-- ...folio-calculator-msft-buy-and-sell.spec.ts | 4 +-- ...-calculator-msft-buy-with-dividend.spec.ts | 4 +-- ...ulator-novn-buy-and-sell-partially.spec.ts | 8 +++-- ...folio-calculator-novn-buy-and-sell.spec.ts | 8 +++-- .../portfolio-calculator-valuable.spec.ts | 4 +-- .../interfaces/portfolio-order.interface.ts | 7 +++-- .../src/app/portfolio/portfolio.service.ts | 12 ++++---- .../account-detail-dialog.component.ts | 8 ++--- .../holding-detail-dialog.component.ts | 8 ++--- .../activities/activities-page.component.ts | 17 ++++++----- .../interfaces/interfaces.ts | 5 ++-- .../import-activities-dialog.component.ts | 14 +++++---- apps/client/src/app/services/data.service.ts | 4 +-- .../app/services/import-activities.service.ts | 10 +++---- libs/common/src/lib/interfaces/index.ts | 8 ++++- .../responses/activity-response.interface.ts | 29 +++++++++++++++++-- .../responses/import-response.interface.ts | 4 +-- .../portfolio-holding-response.interface.ts | 4 +-- .../activities-table.component.stories.ts | 10 +++---- .../activities-table.component.ts | 16 +++++----- 36 files changed, 167 insertions(+), 142 deletions(-) delete mode 100644 apps/api/src/app/order/interfaces/activities.interface.ts diff --git a/CHANGELOG.md b/CHANGELOG.md index 285e8917a..b59cb9207 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## Unreleased +- Refactor Activities interface to ActivitiesResponse interface + ### Changed - Upgraded `prisma` from version `6.17.1` to `6.18.0` diff --git a/apps/api/src/app/import/import.service.ts b/apps/api/src/app/import/import.service.ts index 2725747aa..89acdbfd0 100644 --- a/apps/api/src/app/import/import.service.ts +++ b/apps/api/src/app/import/import.service.ts @@ -1,10 +1,6 @@ import { AccountService } from '@ghostfolio/api/app/account/account.service'; import { CreateAccountDto } from '@ghostfolio/api/app/account/create-account.dto'; import { CreateOrderDto } from '@ghostfolio/api/app/order/create-order.dto'; -import { - Activity, - ActivityError -} from '@ghostfolio/api/app/order/interfaces/activities.interface'; import { OrderService } from '@ghostfolio/api/app/order/order.service'; import { PlatformService } from '@ghostfolio/api/app/platform/platform.service'; import { PortfolioService } from '@ghostfolio/api/app/portfolio/portfolio.service'; @@ -19,7 +15,11 @@ import { getAssetProfileIdentifier, parseDate } from '@ghostfolio/common/helper'; -import { AssetProfileIdentifier } from '@ghostfolio/common/interfaces'; +import { + AssetProfileIdentifier, + ActivityErrorResponse, + ActivityResponse +} from '@ghostfolio/common/interfaces'; import { hasPermission, permissions } from '@ghostfolio/common/permissions'; import { AccountWithPlatform, @@ -56,7 +56,7 @@ export class ImportService { dataSource, symbol, userId - }: AssetProfileIdentifier & { userId: string }): Promise { + }: AssetProfileIdentifier & { userId: string }): Promise { try { const { activities, firstBuyDate, historicalData } = await this.portfolioService.getHolding({ @@ -115,7 +115,7 @@ export class ImportService { ); }); - const error: ActivityError = isDuplicate + const error: ActivityErrorResponse = isDuplicate ? { code: 'IS_DUPLICATE' } : undefined; @@ -167,7 +167,7 @@ export class ImportService { maxActivitiesToImport: number; tagsDto: ImportDataDto['tags']; user: UserWithSettings; - }): Promise { + }): Promise { const accountIdMapping: { [oldAccountId: string]: string } = {}; const assetProfileSymbolMapping: { [oldSymbol: string]: string } = {}; const tagIdMapping: { [oldTagId: string]: string } = {}; @@ -414,7 +414,7 @@ export class ImportService { }); } - const activities: Activity[] = []; + const activities: ActivityResponse[] = []; for (const activity of activitiesExtendedWithErrors) { const accountId = activity.accountId; @@ -612,7 +612,7 @@ export class ImportService { activitiesDto: Partial[]; userCurrency: string; userId: string; - }): Promise[]> { + }): Promise[]> { const { activities: existingActivities } = await this.orderService.getOrders({ userCurrency, @@ -652,7 +652,7 @@ export class ImportService { ); }); - const error: ActivityError = isDuplicate + const error: ActivityErrorResponse = isDuplicate ? { code: 'IS_DUPLICATE' } : undefined; diff --git a/apps/api/src/app/order/interfaces/activities.interface.ts b/apps/api/src/app/order/interfaces/activities.interface.ts deleted file mode 100644 index 01a5a60f0..000000000 --- a/apps/api/src/app/order/interfaces/activities.interface.ts +++ /dev/null @@ -1,28 +0,0 @@ -import { EnhancedSymbolProfile } from '@ghostfolio/common/interfaces'; -import { AccountWithPlatform } from '@ghostfolio/common/types'; - -import { Order, Tag } from '@prisma/client'; - -export interface Activities { - activities: Activity[]; - count: number; -} - -export interface Activity extends Order { - account?: AccountWithPlatform; - error?: ActivityError; - feeInAssetProfileCurrency: number; - feeInBaseCurrency: number; - SymbolProfile?: EnhancedSymbolProfile; - tagIds?: string[]; - tags?: Tag[]; - unitPriceInAssetProfileCurrency: number; - updateAccountBalance?: boolean; - value: number; - valueInBaseCurrency: number; -} - -export interface ActivityError { - code: 'IS_DUPLICATE'; - message?: string; -} diff --git a/apps/api/src/app/portfolio/calculator/portfolio-calculator.factory.ts b/apps/api/src/app/portfolio/calculator/portfolio-calculator.factory.ts index 24fe2b2f3..97a888adb 100644 --- a/apps/api/src/app/portfolio/calculator/portfolio-calculator.factory.ts +++ b/apps/api/src/app/portfolio/calculator/portfolio-calculator.factory.ts @@ -1,10 +1,13 @@ -import { Activity } from '@ghostfolio/api/app/order/interfaces/activities.interface'; import { CurrentRateService } from '@ghostfolio/api/app/portfolio/current-rate.service'; import { RedisCacheService } from '@ghostfolio/api/app/redis-cache/redis-cache.service'; import { ConfigurationService } from '@ghostfolio/api/services/configuration/configuration.service'; import { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.service'; import { PortfolioSnapshotService } from '@ghostfolio/api/services/queues/portfolio-snapshot/portfolio-snapshot.service'; -import { Filter, HistoricalDataItem } from '@ghostfolio/common/interfaces'; +import { + ActivityResponse, + Filter, + HistoricalDataItem +} from '@ghostfolio/common/interfaces'; import { PerformanceCalculationType } from '@ghostfolio/common/types/performance-calculation-type.type'; import { Injectable } from '@nestjs/common'; @@ -34,7 +37,7 @@ export class PortfolioCalculatorFactory { userId }: { accountBalanceItems?: HistoricalDataItem[]; - activities: Activity[]; + activities: ActivityResponse[]; calculationType: PerformanceCalculationType; currency: string; filters?: Filter[]; diff --git a/apps/api/src/app/portfolio/calculator/portfolio-calculator.ts b/apps/api/src/app/portfolio/calculator/portfolio-calculator.ts index 3218d01f4..f5dd83c02 100644 --- a/apps/api/src/app/portfolio/calculator/portfolio-calculator.ts +++ b/apps/api/src/app/portfolio/calculator/portfolio-calculator.ts @@ -1,4 +1,3 @@ -import { Activity } from '@ghostfolio/api/app/order/interfaces/activities.interface'; import { CurrentRateService } from '@ghostfolio/api/app/portfolio/current-rate.service'; import { PortfolioOrder } from '@ghostfolio/api/app/portfolio/interfaces/portfolio-order.interface'; import { PortfolioSnapshotValue } from '@ghostfolio/api/app/portfolio/interfaces/snapshot-value.interface'; @@ -26,6 +25,7 @@ import { resetHours } from '@ghostfolio/common/helper'; import { + ActivityResponse, AssetProfileIdentifier, DataProviderInfo, Filter, @@ -87,7 +87,7 @@ export abstract class PortfolioCalculator { userId }: { accountBalanceItems: HistoricalDataItem[]; - activities: Activity[]; + activities: ActivityResponse[]; configurationService: ConfigurationService; currency: string; currentRateService: CurrentRateService; diff --git a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-baln-buy-and-buy.spec.ts b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-baln-buy-and-buy.spec.ts index aa174f319..becb79f3b 100644 --- a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-baln-buy-and-buy.spec.ts +++ b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-baln-buy-and-buy.spec.ts @@ -1,4 +1,3 @@ -import { Activity } from '@ghostfolio/api/app/order/interfaces/activities.interface'; import { activityDummyData, symbolProfileDummyData, @@ -14,6 +13,7 @@ import { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate- import { PortfolioSnapshotService } from '@ghostfolio/api/services/queues/portfolio-snapshot/portfolio-snapshot.service'; import { PortfolioSnapshotServiceMock } from '@ghostfolio/api/services/queues/portfolio-snapshot/portfolio-snapshot.service.mock'; import { parseDate } from '@ghostfolio/common/helper'; +import { ActivityResponse } from '@ghostfolio/common/interfaces'; import { PerformanceCalculationType } from '@ghostfolio/common/types/performance-calculation-type.type'; import { Big } from 'big.js'; @@ -82,7 +82,7 @@ describe('PortfolioCalculator', () => { it.only('with BALN.SW buy and buy', async () => { jest.useFakeTimers().setSystemTime(parseDate('2021-12-18').getTime()); - const activities: Activity[] = [ + const activities: ActivityResponse[] = [ { ...activityDummyData, date: new Date('2021-11-22'), diff --git a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-baln-buy-and-sell-in-two-activities.spec.ts b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-baln-buy-and-sell-in-two-activities.spec.ts index 69b6c3dfc..c5e3c1cb9 100644 --- a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-baln-buy-and-sell-in-two-activities.spec.ts +++ b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-baln-buy-and-sell-in-two-activities.spec.ts @@ -1,4 +1,3 @@ -import { Activity } from '@ghostfolio/api/app/order/interfaces/activities.interface'; import { activityDummyData, symbolProfileDummyData, @@ -14,6 +13,7 @@ import { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate- import { PortfolioSnapshotService } from '@ghostfolio/api/services/queues/portfolio-snapshot/portfolio-snapshot.service'; import { PortfolioSnapshotServiceMock } from '@ghostfolio/api/services/queues/portfolio-snapshot/portfolio-snapshot.service.mock'; import { parseDate } from '@ghostfolio/common/helper'; +import { ActivityResponse } from '@ghostfolio/common/interfaces'; import { PerformanceCalculationType } from '@ghostfolio/common/types/performance-calculation-type.type'; import { Big } from 'big.js'; @@ -82,7 +82,7 @@ describe('PortfolioCalculator', () => { it.only('with BALN.SW buy and sell in two activities', async () => { jest.useFakeTimers().setSystemTime(parseDate('2021-12-18').getTime()); - const activities: Activity[] = [ + const activities: ActivityResponse[] = [ { ...activityDummyData, date: new Date('2021-11-22'), diff --git a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-baln-buy-and-sell.spec.ts b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-baln-buy-and-sell.spec.ts index a3cb8716e..6e0df81a4 100644 --- a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-baln-buy-and-sell.spec.ts +++ b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-baln-buy-and-sell.spec.ts @@ -1,4 +1,3 @@ -import { Activity } from '@ghostfolio/api/app/order/interfaces/activities.interface'; import { activityDummyData, symbolProfileDummyData, @@ -14,6 +13,7 @@ import { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate- import { PortfolioSnapshotService } from '@ghostfolio/api/services/queues/portfolio-snapshot/portfolio-snapshot.service'; import { PortfolioSnapshotServiceMock } from '@ghostfolio/api/services/queues/portfolio-snapshot/portfolio-snapshot.service.mock'; import { parseDate } from '@ghostfolio/common/helper'; +import { ActivityResponse } from '@ghostfolio/common/interfaces'; import { PerformanceCalculationType } from '@ghostfolio/common/types/performance-calculation-type.type'; import { Big } from 'big.js'; @@ -82,7 +82,7 @@ describe('PortfolioCalculator', () => { it.only('with BALN.SW buy and sell', async () => { jest.useFakeTimers().setSystemTime(parseDate('2021-12-18').getTime()); - const activities: Activity[] = [ + const activities: ActivityResponse[] = [ { ...activityDummyData, date: new Date('2021-11-22'), diff --git a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-baln-buy.spec.ts b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-baln-buy.spec.ts index ae083a7db..14ec03b7f 100644 --- a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-baln-buy.spec.ts +++ b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-baln-buy.spec.ts @@ -1,4 +1,3 @@ -import { Activity } from '@ghostfolio/api/app/order/interfaces/activities.interface'; import { activityDummyData, symbolProfileDummyData, @@ -14,6 +13,7 @@ import { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate- import { PortfolioSnapshotService } from '@ghostfolio/api/services/queues/portfolio-snapshot/portfolio-snapshot.service'; import { PortfolioSnapshotServiceMock } from '@ghostfolio/api/services/queues/portfolio-snapshot/portfolio-snapshot.service.mock'; import { parseDate } from '@ghostfolio/common/helper'; +import { ActivityResponse } from '@ghostfolio/common/interfaces'; import { PerformanceCalculationType } from '@ghostfolio/common/types/performance-calculation-type.type'; import { Big } from 'big.js'; @@ -82,7 +82,7 @@ describe('PortfolioCalculator', () => { it.only('with BALN.SW buy', async () => { jest.useFakeTimers().setSystemTime(parseDate('2021-12-18').getTime()); - const activities: Activity[] = [ + const activities: ActivityResponse[] = [ { ...activityDummyData, date: new Date('2021-11-30'), @@ -193,7 +193,7 @@ describe('PortfolioCalculator', () => { it.only('with BALN.SW buy (with unit price lower than closing price)', async () => { jest.useFakeTimers().setSystemTime(parseDate('2021-12-18').getTime()); - const activities: Activity[] = [ + const activities: ActivityResponse[] = [ { ...activityDummyData, date: new Date('2021-11-30'), @@ -232,7 +232,7 @@ describe('PortfolioCalculator', () => { it.only('with BALN.SW buy (with unit price lower than closing price), calculated on buy date', async () => { jest.useFakeTimers().setSystemTime(parseDate('2021-11-30').getTime()); - const activities: Activity[] = [ + const activities: ActivityResponse[] = [ { ...activityDummyData, date: new Date('2021-11-30'), diff --git a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-btceur.spec.ts b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-btceur.spec.ts index cef8938c2..7f81a8d27 100644 --- a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-btceur.spec.ts +++ b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-btceur.spec.ts @@ -1,4 +1,3 @@ -import { Activity } from '@ghostfolio/api/app/order/interfaces/activities.interface'; import { activityDummyData, loadExportFile, @@ -15,7 +14,10 @@ import { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate- import { PortfolioSnapshotService } from '@ghostfolio/api/services/queues/portfolio-snapshot/portfolio-snapshot.service'; import { PortfolioSnapshotServiceMock } from '@ghostfolio/api/services/queues/portfolio-snapshot/portfolio-snapshot.service.mock'; import { parseDate } from '@ghostfolio/common/helper'; -import { ExportResponse } from '@ghostfolio/common/interfaces'; +import { + ActivityResponse, + ExportResponse +} from '@ghostfolio/common/interfaces'; import { PerformanceCalculationType } from '@ghostfolio/common/types/performance-calculation-type.type'; import { Big } from 'big.js'; @@ -93,7 +95,7 @@ describe('PortfolioCalculator', () => { it.only('with BTCUSD buy (in EUR)', async () => { jest.useFakeTimers().setSystemTime(parseDate('2022-01-14').getTime()); - const activities: Activity[] = exportResponse.activities.map( + const activities: ActivityResponse[] = exportResponse.activities.map( (activity) => ({ ...activityDummyData, ...activity, diff --git a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-btcusd-buy-and-sell-partially.spec.ts b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-btcusd-buy-and-sell-partially.spec.ts index 36e6fa900..2ab49d6d7 100644 --- a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-btcusd-buy-and-sell-partially.spec.ts +++ b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-btcusd-buy-and-sell-partially.spec.ts @@ -1,4 +1,3 @@ -import { Activity } from '@ghostfolio/api/app/order/interfaces/activities.interface'; import { activityDummyData, symbolProfileDummyData, @@ -15,6 +14,7 @@ import { ExchangeRateDataServiceMock } from '@ghostfolio/api/services/exchange-r import { PortfolioSnapshotService } from '@ghostfolio/api/services/queues/portfolio-snapshot/portfolio-snapshot.service'; import { PortfolioSnapshotServiceMock } from '@ghostfolio/api/services/queues/portfolio-snapshot/portfolio-snapshot.service.mock'; import { parseDate } from '@ghostfolio/common/helper'; +import { ActivityResponse } from '@ghostfolio/common/interfaces'; import { PerformanceCalculationType } from '@ghostfolio/common/types/performance-calculation-type.type'; import { Big } from 'big.js'; @@ -95,7 +95,7 @@ describe('PortfolioCalculator', () => { it.only('with BTCUSD buy and sell partially', async () => { jest.useFakeTimers().setSystemTime(parseDate('2018-01-01').getTime()); - const activities: Activity[] = [ + const activities: ActivityResponse[] = [ { ...activityDummyData, date: new Date('2015-01-01'), diff --git a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-btcusd-short.spec.ts b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-btcusd-short.spec.ts index 5a4dfdc07..c9d37c182 100644 --- a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-btcusd-short.spec.ts +++ b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-btcusd-short.spec.ts @@ -1,4 +1,3 @@ -import { Activity } from '@ghostfolio/api/app/order/interfaces/activities.interface'; import { activityDummyData, loadExportFile, @@ -15,7 +14,10 @@ import { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate- import { PortfolioSnapshotService } from '@ghostfolio/api/services/queues/portfolio-snapshot/portfolio-snapshot.service'; import { PortfolioSnapshotServiceMock } from '@ghostfolio/api/services/queues/portfolio-snapshot/portfolio-snapshot.service.mock'; import { parseDate } from '@ghostfolio/common/helper'; -import { ExportResponse } from '@ghostfolio/common/interfaces'; +import { + ActivityResponse, + ExportResponse +} from '@ghostfolio/common/interfaces'; import { PerformanceCalculationType } from '@ghostfolio/common/types/performance-calculation-type.type'; import { Big } from 'big.js'; @@ -93,7 +95,7 @@ describe('PortfolioCalculator', () => { it.only('with BTCUSD short sell (in USD)', async () => { jest.useFakeTimers().setSystemTime(parseDate('2022-01-14').getTime()); - const activities: Activity[] = exportResponse.activities.map( + const activities: ActivityResponse[] = exportResponse.activities.map( (activity) => ({ ...activityDummyData, ...activity, diff --git a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-btcusd.spec.ts b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-btcusd.spec.ts index 2ee367530..e7c366a06 100644 --- a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-btcusd.spec.ts +++ b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-btcusd.spec.ts @@ -1,4 +1,3 @@ -import { Activity } from '@ghostfolio/api/app/order/interfaces/activities.interface'; import { activityDummyData, loadExportFile, @@ -15,7 +14,10 @@ import { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate- import { PortfolioSnapshotService } from '@ghostfolio/api/services/queues/portfolio-snapshot/portfolio-snapshot.service'; import { PortfolioSnapshotServiceMock } from '@ghostfolio/api/services/queues/portfolio-snapshot/portfolio-snapshot.service.mock'; import { parseDate } from '@ghostfolio/common/helper'; -import { ExportResponse } from '@ghostfolio/common/interfaces'; +import { + ActivityResponse, + ExportResponse +} from '@ghostfolio/common/interfaces'; import { PerformanceCalculationType } from '@ghostfolio/common/types/performance-calculation-type.type'; import { Big } from 'big.js'; @@ -93,7 +95,7 @@ describe('PortfolioCalculator', () => { it.only('with BTCUSD buy (in USD)', async () => { jest.useFakeTimers().setSystemTime(parseDate('2022-01-14').getTime()); - const activities: Activity[] = exportResponse.activities.map( + const activities: ActivityResponse[] = exportResponse.activities.map( (activity) => ({ ...activityDummyData, ...activity, diff --git a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-fee.spec.ts b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-fee.spec.ts index 002be9154..ee617b199 100644 --- a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-fee.spec.ts +++ b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-fee.spec.ts @@ -1,4 +1,3 @@ -import { Activity } from '@ghostfolio/api/app/order/interfaces/activities.interface'; import { activityDummyData, symbolProfileDummyData, @@ -14,6 +13,7 @@ import { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate- import { PortfolioSnapshotService } from '@ghostfolio/api/services/queues/portfolio-snapshot/portfolio-snapshot.service'; import { PortfolioSnapshotServiceMock } from '@ghostfolio/api/services/queues/portfolio-snapshot/portfolio-snapshot.service.mock'; import { parseDate } from '@ghostfolio/common/helper'; +import { ActivityResponse } from '@ghostfolio/common/interfaces'; import { PerformanceCalculationType } from '@ghostfolio/common/types/performance-calculation-type.type'; import { Big } from 'big.js'; @@ -82,7 +82,7 @@ describe('PortfolioCalculator', () => { it.only('with fee activity', async () => { jest.useFakeTimers().setSystemTime(parseDate('2021-12-18').getTime()); - const activities: Activity[] = [ + const activities: ActivityResponse[] = [ { ...activityDummyData, date: new Date('2021-09-01'), diff --git a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-googl-buy.spec.ts b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-googl-buy.spec.ts index bf0b15020..4b680d299 100644 --- a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-googl-buy.spec.ts +++ b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-googl-buy.spec.ts @@ -1,4 +1,3 @@ -import { Activity } from '@ghostfolio/api/app/order/interfaces/activities.interface'; import { activityDummyData, symbolProfileDummyData, @@ -15,6 +14,7 @@ import { ExchangeRateDataServiceMock } from '@ghostfolio/api/services/exchange-r import { PortfolioSnapshotService } from '@ghostfolio/api/services/queues/portfolio-snapshot/portfolio-snapshot.service'; import { PortfolioSnapshotServiceMock } from '@ghostfolio/api/services/queues/portfolio-snapshot/portfolio-snapshot.service.mock'; import { parseDate } from '@ghostfolio/common/helper'; +import { ActivityResponse } from '@ghostfolio/common/interfaces'; import { PerformanceCalculationType } from '@ghostfolio/common/types/performance-calculation-type.type'; import { Big } from 'big.js'; @@ -94,7 +94,7 @@ describe('PortfolioCalculator', () => { it.only('with GOOGL buy', async () => { jest.useFakeTimers().setSystemTime(parseDate('2023-07-10').getTime()); - const activities: Activity[] = [ + const activities: ActivityResponse[] = [ { ...activityDummyData, date: new Date('2023-01-03'), diff --git a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-liability.spec.ts b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-liability.spec.ts index 32822014c..41a3e2f82 100644 --- a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-liability.spec.ts +++ b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-liability.spec.ts @@ -1,4 +1,3 @@ -import { Activity } from '@ghostfolio/api/app/order/interfaces/activities.interface'; import { activityDummyData, symbolProfileDummyData, @@ -14,6 +13,7 @@ import { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate- import { PortfolioSnapshotService } from '@ghostfolio/api/services/queues/portfolio-snapshot/portfolio-snapshot.service'; import { PortfolioSnapshotServiceMock } from '@ghostfolio/api/services/queues/portfolio-snapshot/portfolio-snapshot.service.mock'; import { parseDate } from '@ghostfolio/common/helper'; +import { ActivityResponse } from '@ghostfolio/common/interfaces'; import { PerformanceCalculationType } from '@ghostfolio/common/types/performance-calculation-type.type'; import { Big } from 'big.js'; @@ -82,7 +82,7 @@ describe('PortfolioCalculator', () => { it.only('with liability activity', async () => { jest.useFakeTimers().setSystemTime(parseDate('2022-01-31').getTime()); - const activities: Activity[] = [ + const activities: ActivityResponse[] = [ { ...activityDummyData, date: new Date('2023-01-01'), // Date in future diff --git a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-msft-buy-and-sell.spec.ts b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-msft-buy-and-sell.spec.ts index 08015da5b..a8556ca32 100644 --- a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-msft-buy-and-sell.spec.ts +++ b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-msft-buy-and-sell.spec.ts @@ -1,4 +1,3 @@ -import { Activity } from '@ghostfolio/api/app/order/interfaces/activities.interface'; import { activityDummyData, symbolProfileDummyData, @@ -14,6 +13,7 @@ import { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate- import { PortfolioSnapshotService } from '@ghostfolio/api/services/queues/portfolio-snapshot/portfolio-snapshot.service'; import { PortfolioSnapshotServiceMock } from '@ghostfolio/api/services/queues/portfolio-snapshot/portfolio-snapshot.service.mock'; import { parseDate } from '@ghostfolio/common/helper'; +import { ActivityResponse } from '@ghostfolio/common/interfaces'; import { PerformanceCalculationType } from '@ghostfolio/common/types/performance-calculation-type.type'; jest.mock('@ghostfolio/api/app/portfolio/current-rate.service', () => { @@ -75,7 +75,7 @@ describe('PortfolioCalculator', () => { it('with MSFT buy and sell with fractional quantities (multiples of 1/3)', () => { jest.useFakeTimers().setSystemTime(parseDate('2024-04-01').getTime()); - const activities: Activity[] = [ + const activities: ActivityResponse[] = [ { ...activityDummyData, date: new Date('2024-03-08'), diff --git a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-msft-buy-with-dividend.spec.ts b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-msft-buy-with-dividend.spec.ts index e5b128085..13ffd7322 100644 --- a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-msft-buy-with-dividend.spec.ts +++ b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-msft-buy-with-dividend.spec.ts @@ -1,4 +1,3 @@ -import { Activity } from '@ghostfolio/api/app/order/interfaces/activities.interface'; import { activityDummyData, symbolProfileDummyData, @@ -14,6 +13,7 @@ import { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate- import { PortfolioSnapshotService } from '@ghostfolio/api/services/queues/portfolio-snapshot/portfolio-snapshot.service'; import { PortfolioSnapshotServiceMock } from '@ghostfolio/api/services/queues/portfolio-snapshot/portfolio-snapshot.service.mock'; import { parseDate } from '@ghostfolio/common/helper'; +import { ActivityResponse } from '@ghostfolio/common/interfaces'; import { PerformanceCalculationType } from '@ghostfolio/common/types/performance-calculation-type.type'; import { Big } from 'big.js'; @@ -82,7 +82,7 @@ describe('PortfolioCalculator', () => { it.only('with MSFT buy', async () => { jest.useFakeTimers().setSystemTime(parseDate('2023-07-10').getTime()); - const activities: Activity[] = [ + const activities: ActivityResponse[] = [ { ...activityDummyData, date: new Date('2021-09-16'), diff --git a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-novn-buy-and-sell-partially.spec.ts b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-novn-buy-and-sell-partially.spec.ts index cf330d136..e3fd9c7e4 100644 --- a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-novn-buy-and-sell-partially.spec.ts +++ b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-novn-buy-and-sell-partially.spec.ts @@ -1,4 +1,3 @@ -import { Activity } from '@ghostfolio/api/app/order/interfaces/activities.interface'; import { activityDummyData, loadExportFile, @@ -15,7 +14,10 @@ import { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate- import { PortfolioSnapshotService } from '@ghostfolio/api/services/queues/portfolio-snapshot/portfolio-snapshot.service'; import { PortfolioSnapshotServiceMock } from '@ghostfolio/api/services/queues/portfolio-snapshot/portfolio-snapshot.service.mock'; import { parseDate } from '@ghostfolio/common/helper'; -import { ExportResponse } from '@ghostfolio/common/interfaces'; +import { + ActivityResponse, + ExportResponse +} from '@ghostfolio/common/interfaces'; import { PerformanceCalculationType } from '@ghostfolio/common/types/performance-calculation-type.type'; import { Big } from 'big.js'; @@ -96,7 +98,7 @@ describe('PortfolioCalculator', () => { it.only('with NOVN.SW buy and sell partially', async () => { jest.useFakeTimers().setSystemTime(parseDate('2022-04-11').getTime()); - const activities: Activity[] = exportResponse.activities.map( + const activities: ActivityResponse[] = exportResponse.activities.map( (activity) => ({ ...activityDummyData, ...activity, diff --git a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-novn-buy-and-sell.spec.ts b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-novn-buy-and-sell.spec.ts index 681169062..54800c019 100644 --- a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-novn-buy-and-sell.spec.ts +++ b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-novn-buy-and-sell.spec.ts @@ -1,4 +1,3 @@ -import { Activity } from '@ghostfolio/api/app/order/interfaces/activities.interface'; import { activityDummyData, loadExportFile, @@ -15,7 +14,10 @@ import { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate- import { PortfolioSnapshotService } from '@ghostfolio/api/services/queues/portfolio-snapshot/portfolio-snapshot.service'; import { PortfolioSnapshotServiceMock } from '@ghostfolio/api/services/queues/portfolio-snapshot/portfolio-snapshot.service.mock'; import { parseDate } from '@ghostfolio/common/helper'; -import { ExportResponse } from '@ghostfolio/common/interfaces'; +import { + ActivityResponse, + ExportResponse +} from '@ghostfolio/common/interfaces'; import { PerformanceCalculationType } from '@ghostfolio/common/types/performance-calculation-type.type'; import { Big } from 'big.js'; @@ -96,7 +98,7 @@ describe('PortfolioCalculator', () => { it.only('with NOVN.SW buy and sell', async () => { jest.useFakeTimers().setSystemTime(parseDate('2022-04-11').getTime()); - const activities: Activity[] = exportResponse.activities.map( + const activities: ActivityResponse[] = exportResponse.activities.map( (activity) => ({ ...activityDummyData, ...activity, diff --git a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-valuable.spec.ts b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-valuable.spec.ts index fc1d477a6..5fe40a1a9 100644 --- a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-valuable.spec.ts +++ b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-valuable.spec.ts @@ -1,4 +1,3 @@ -import { Activity } from '@ghostfolio/api/app/order/interfaces/activities.interface'; import { activityDummyData, symbolProfileDummyData, @@ -14,6 +13,7 @@ import { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate- import { PortfolioSnapshotService } from '@ghostfolio/api/services/queues/portfolio-snapshot/portfolio-snapshot.service'; import { PortfolioSnapshotServiceMock } from '@ghostfolio/api/services/queues/portfolio-snapshot/portfolio-snapshot.service.mock'; import { parseDate } from '@ghostfolio/common/helper'; +import { ActivityResponse } from '@ghostfolio/common/interfaces'; import { PerformanceCalculationType } from '@ghostfolio/common/types/performance-calculation-type.type'; import { Big } from 'big.js'; @@ -82,7 +82,7 @@ describe('PortfolioCalculator', () => { it.only('with valuable activity', async () => { jest.useFakeTimers().setSystemTime(parseDate('2022-01-31').getTime()); - const activities: Activity[] = [ + const activities: ActivityResponse[] = [ { ...activityDummyData, date: new Date('2022-01-01'), diff --git a/apps/api/src/app/portfolio/interfaces/portfolio-order.interface.ts b/apps/api/src/app/portfolio/interfaces/portfolio-order.interface.ts index 1c53430f6..9d76ad1ed 100644 --- a/apps/api/src/app/portfolio/interfaces/portfolio-order.interface.ts +++ b/apps/api/src/app/portfolio/interfaces/portfolio-order.interface.ts @@ -1,11 +1,12 @@ -import { Activity } from '@ghostfolio/api/app/order/interfaces/activities.interface'; +import { ActivityResponse } from '@ghostfolio/common/interfaces'; -export interface PortfolioOrder extends Pick { +export interface PortfolioOrder + extends Pick { date: string; fee: Big; quantity: Big; SymbolProfile: Pick< - Activity['SymbolProfile'], + ActivityResponse['SymbolProfile'], 'currency' | 'dataSource' | 'name' | 'symbol' | 'userId' >; unitPrice: Big; diff --git a/apps/api/src/app/portfolio/portfolio.service.ts b/apps/api/src/app/portfolio/portfolio.service.ts index b74b779f6..90a65cc89 100644 --- a/apps/api/src/app/portfolio/portfolio.service.ts +++ b/apps/api/src/app/portfolio/portfolio.service.ts @@ -1,7 +1,6 @@ import { AccountBalanceService } from '@ghostfolio/api/app/account-balance/account-balance.service'; import { AccountService } from '@ghostfolio/api/app/account/account.service'; import { CashDetails } from '@ghostfolio/api/app/account/interfaces/cash-details.interface'; -import { Activity } from '@ghostfolio/api/app/order/interfaces/activities.interface'; import { OrderService } from '@ghostfolio/api/app/order/order.service'; import { UserService } from '@ghostfolio/api/app/user/user.service'; import { getFactor } from '@ghostfolio/api/helper/portfolio.helper'; @@ -40,6 +39,7 @@ import { import { DATE_FORMAT, getSum, parseDate } from '@ghostfolio/common/helper'; import { AccountsResponse, + ActivityResponse, EnhancedSymbolProfile, Filter, HistoricalDataItem, @@ -323,7 +323,7 @@ export class PortfolioService { activities, groupBy }: { - activities: Activity[]; + activities: ActivityResponse[]; groupBy?: GroupBy; }): Promise { let dividends = activities.map(({ currency, date, value }) => { @@ -1948,8 +1948,8 @@ export class PortfolioService { withExcludedAccountsAndActivities: true }); - const excludedActivities: Activity[] = []; - const nonExcludedActivities: Activity[] = []; + const excludedActivities: ActivityResponse[] = []; + const nonExcludedActivities: ActivityResponse[] = []; for (const activity of activities) { if ( @@ -2117,7 +2117,7 @@ export class PortfolioService { activityType, userCurrency }: { - activities: Activity[]; + activities: ActivityResponse[]; activityType: ActivityType; userCurrency: string; }) { @@ -2182,7 +2182,7 @@ export class PortfolioService { userId, withExcludedAccounts = false }: { - activities: Activity[]; + activities: ActivityResponse[]; filters?: Filter[]; portfolioItemsNow: Record; userCurrency: string; diff --git a/apps/client/src/app/components/account-detail-dialog/account-detail-dialog.component.ts b/apps/client/src/app/components/account-detail-dialog/account-detail-dialog.component.ts index bdc2424f5..06910581d 100644 --- a/apps/client/src/app/components/account-detail-dialog/account-detail-dialog.component.ts +++ b/apps/client/src/app/components/account-detail-dialog/account-detail-dialog.component.ts @@ -1,5 +1,4 @@ import { CreateAccountBalanceDto } from '@ghostfolio/api/app/account-balance/create-account-balance.dto'; -import { Activity } from '@ghostfolio/api/app/order/interfaces/activities.interface'; import { GfDialogFooterComponent } from '@ghostfolio/client/components/dialog-footer/dialog-footer.component'; import { GfDialogHeaderComponent } from '@ghostfolio/client/components/dialog-header/dialog-header.component'; import { GfInvestmentChartComponent } from '@ghostfolio/client/components/investment-chart/investment-chart.component'; @@ -9,6 +8,7 @@ import { NUMERICAL_PRECISION_THRESHOLD_6_FIGURES } from '@ghostfolio/common/conf import { DATE_FORMAT, downloadAsFile } from '@ghostfolio/common/helper'; import { AccountBalancesResponse, + ActivityResponse, HistoricalDataItem, PortfolioPosition, User @@ -83,7 +83,7 @@ export class GfAccountDetailDialogComponent implements OnDestroy, OnInit { public balance: number; public balancePrecision = 2; public currency: string; - public dataSource: MatTableDataSource; + public dataSource: MatTableDataSource; public dividendInBaseCurrency: number; public dividendInBaseCurrencyPrecision = 2; public equity: number; @@ -136,7 +136,7 @@ export class GfAccountDetailDialogComponent implements OnDestroy, OnInit { this.initialize(); } - public onCloneActivity(aActivity: Activity) { + public onCloneActivity(aActivity: ActivityResponse) { this.router.navigate( internalRoutes.portfolio.subRoutes.activities.routerLink, { @@ -198,7 +198,7 @@ export class GfAccountDetailDialogComponent implements OnDestroy, OnInit { this.fetchActivities(); } - public onUpdateActivity(aActivity: Activity) { + public onUpdateActivity(aActivity: ActivityResponse) { this.router.navigate( internalRoutes.portfolio.subRoutes.activities.routerLink, { 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 d4c1c59c1..bd796b3ea 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 @@ -1,4 +1,3 @@ -import { Activity } from '@ghostfolio/api/app/order/interfaces/activities.interface'; import { GfDialogFooterComponent } from '@ghostfolio/client/components/dialog-footer/dialog-footer.component'; import { GfDialogHeaderComponent } from '@ghostfolio/client/components/dialog-header/dialog-header.component'; import { DataService } from '@ghostfolio/client/services/data.service'; @@ -10,6 +9,7 @@ import { } from '@ghostfolio/common/config'; import { DATE_FORMAT, downloadAsFile } from '@ghostfolio/common/helper'; import { + ActivityResponse, DataProviderInfo, EnhancedSymbolProfile, Filter, @@ -113,7 +113,7 @@ export class GfHoldingDetailDialogComponent implements OnDestroy, OnInit { [code: string]: { name: string; value: number }; }; public dataProviderInfo: DataProviderInfo; - public dataSource: MatTableDataSource; + public dataSource: MatTableDataSource; public dividendInBaseCurrency: number; public dividendInBaseCurrencyPrecision = 2; public dividendYieldPercentWithCurrencyEffect: number; @@ -542,7 +542,7 @@ export class GfHoldingDetailDialogComponent implements OnDestroy, OnInit { }); } - public onCloneActivity(aActivity: Activity) { + public onCloneActivity(aActivity: ActivityResponse) { this.router.navigate( internalRoutes.portfolio.subRoutes.activities.routerLink, { @@ -587,7 +587,7 @@ export class GfHoldingDetailDialogComponent implements OnDestroy, OnInit { this.activityForm.get('tags').setValue(tags); } - public onUpdateActivity(aActivity: Activity) { + public onUpdateActivity(aActivity: ActivityResponse) { this.router.navigate( internalRoutes.portfolio.subRoutes.activities.routerLink, { diff --git a/apps/client/src/app/pages/portfolio/activities/activities-page.component.ts b/apps/client/src/app/pages/portfolio/activities/activities-page.component.ts index ce99fbf77..d355f1ab3 100644 --- a/apps/client/src/app/pages/portfolio/activities/activities-page.component.ts +++ b/apps/client/src/app/pages/portfolio/activities/activities-page.component.ts @@ -1,5 +1,4 @@ import { CreateOrderDto } from '@ghostfolio/api/app/order/create-order.dto'; -import { Activity } from '@ghostfolio/api/app/order/interfaces/activities.interface'; import { UpdateOrderDto } from '@ghostfolio/api/app/order/update-order.dto'; import { DataService } from '@ghostfolio/client/services/data.service'; import { IcsService } from '@ghostfolio/client/services/ics/ics.service'; @@ -7,7 +6,11 @@ import { ImpersonationStorageService } from '@ghostfolio/client/services/imperso import { UserService } from '@ghostfolio/client/services/user/user.service'; import { DEFAULT_PAGE_SIZE } from '@ghostfolio/common/config'; import { downloadAsFile } from '@ghostfolio/common/helper'; -import { AssetProfileIdentifier, User } from '@ghostfolio/common/interfaces'; +import { + ActivityResponse, + AssetProfileIdentifier, + User +} from '@ghostfolio/common/interfaces'; import { hasPermission, permissions } from '@ghostfolio/common/permissions'; import { GfActivitiesTableComponent } from '@ghostfolio/ui/activities-table'; @@ -45,7 +48,7 @@ import { ImportActivitiesDialogParams } from './import-activities-dialog/interfa templateUrl: './activities-page.html' }) export class GfActivitiesPageComponent implements OnDestroy, OnInit { - public dataSource: MatTableDataSource; + public dataSource: MatTableDataSource; public deviceType: string; public hasImpersonationId: boolean; public hasPermissionToCreateActivity: boolean; @@ -166,7 +169,7 @@ export class GfActivitiesPageComponent implements OnDestroy, OnInit { }); } - public onCloneActivity(aActivity: Activity) { + public onCloneActivity(aActivity: ActivityResponse) { this.openCreateActivityDialog(aActivity); } @@ -299,13 +302,13 @@ export class GfActivitiesPageComponent implements OnDestroy, OnInit { this.fetchActivities(); } - public onUpdateActivity(aActivity: Activity) { + public onUpdateActivity(aActivity: ActivityResponse) { this.router.navigate([], { queryParams: { activityId: aActivity.id, editDialog: true } }); } - public openUpdateActivityDialog(aActivity: Activity) { + public openUpdateActivityDialog(aActivity: ActivityResponse) { const dialogRef = this.dialog.open( GfCreateOrUpdateActivityDialogComponent, { @@ -343,7 +346,7 @@ export class GfActivitiesPageComponent implements OnDestroy, OnInit { this.unsubscribeSubject.complete(); } - private openCreateActivityDialog(aActivity?: Activity) { + private openCreateActivityDialog(aActivity?: ActivityResponse) { this.userService .get() .pipe(takeUntil(this.unsubscribeSubject)) diff --git a/apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/interfaces/interfaces.ts b/apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/interfaces/interfaces.ts index 60a39d361..1a937c448 100644 --- a/apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/interfaces/interfaces.ts +++ b/apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/interfaces/interfaces.ts @@ -1,11 +1,10 @@ -import { Activity } from '@ghostfolio/api/app/order/interfaces/activities.interface'; -import { User } from '@ghostfolio/common/interfaces'; +import { ActivityResponse, User } from '@ghostfolio/common/interfaces'; import { Account } from '@prisma/client'; export interface CreateOrUpdateActivityDialogParams { accountId: string; accounts: Account[]; - activity: Activity; + activity: ActivityResponse; user: User; } diff --git a/apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts b/apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts index 0c0054e9b..bba40178d 100644 --- a/apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts +++ b/apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts @@ -1,14 +1,16 @@ import { CreateTagDto } from '@ghostfolio/api/app/endpoints/tags/create-tag.dto'; import { CreateAccountWithBalancesDto } from '@ghostfolio/api/app/import/create-account-with-balances.dto'; import { CreateAssetProfileWithMarketDataDto } from '@ghostfolio/api/app/import/create-asset-profile-with-market-data.dto'; -import { Activity } from '@ghostfolio/api/app/order/interfaces/activities.interface'; import { GfDialogFooterComponent } from '@ghostfolio/client/components/dialog-footer/dialog-footer.component'; import { GfDialogHeaderComponent } from '@ghostfolio/client/components/dialog-header/dialog-header.component'; import { GfFileDropDirective } from '@ghostfolio/client/directives/file-drop/file-drop.directive'; import { GfSymbolPipe } from '@ghostfolio/client/pipes/symbol/symbol.pipe'; import { DataService } from '@ghostfolio/client/services/data.service'; import { ImportActivitiesService } from '@ghostfolio/client/services/import-activities.service'; -import { PortfolioPosition } from '@ghostfolio/common/interfaces'; +import { + ActivityResponse, + PortfolioPosition +} from '@ghostfolio/common/interfaces'; import { GfActivitiesTableComponent } from '@ghostfolio/ui/activities-table'; import { @@ -82,10 +84,10 @@ import { ImportActivitiesDialogParams } from './interfaces/interfaces'; }) export class GfImportActivitiesDialogComponent implements OnDestroy { public accounts: CreateAccountWithBalancesDto[] = []; - public activities: Activity[] = []; + public activities: ActivityResponse[] = []; public assetProfileForm: FormGroup; public assetProfiles: CreateAssetProfileWithMarketDataDto[] = []; - public dataSource: MatTableDataSource; + public dataSource: MatTableDataSource; public details: any[] = []; public deviceType: string; public dialogTitle = $localize`Import Activities`; @@ -96,7 +98,7 @@ export class GfImportActivitiesDialogComponent implements OnDestroy { public mode: 'DIVIDEND'; public pageIndex = 0; public pageSize = 8; - public selectedActivities: Activity[] = []; + public selectedActivities: ActivityResponse[] = []; public sortColumn = 'date'; public sortDirection: SortDirection = 'desc'; public stepperOrientation: StepperOrientation; @@ -277,7 +279,7 @@ export class GfImportActivitiesDialogComponent implements OnDestroy { input.click(); } - public updateSelection(activities: Activity[]) { + public updateSelection(activities: ActivityResponse[]) { this.selectedActivities = activities.filter(({ error }) => { return !error; }); diff --git a/apps/client/src/app/services/data.service.ts b/apps/client/src/app/services/data.service.ts index a32bc6d3e..6f0b17ed1 100644 --- a/apps/client/src/app/services/data.service.ts +++ b/apps/client/src/app/services/data.service.ts @@ -9,7 +9,6 @@ import { CreateTagDto } from '@ghostfolio/api/app/endpoints/tags/create-tag.dto' import { UpdateTagDto } from '@ghostfolio/api/app/endpoints/tags/update-tag.dto'; import { CreateWatchlistItemDto } from '@ghostfolio/api/app/endpoints/watchlist/create-watchlist-item.dto'; import { CreateOrderDto } from '@ghostfolio/api/app/order/create-order.dto'; -import { Activities } from '@ghostfolio/api/app/order/interfaces/activities.interface'; import { UpdateOrderDto } from '@ghostfolio/api/app/order/update-order.dto'; import { SymbolItem } from '@ghostfolio/api/app/symbol/interfaces/symbol-item.interface'; import { DeleteOwnUserDto } from '@ghostfolio/api/app/user/delete-own-user.dto'; @@ -24,6 +23,7 @@ import { AccessTokenResponse, AccountBalancesResponse, AccountsResponse, + ActivitiesResponse, ActivityResponse, AiPromptResponse, ApiKeyResponse, @@ -215,7 +215,7 @@ export class DataService { sortColumn?: string; sortDirection?: SortDirection; take?: number; - }): Observable { + }): Observable { let params = this.buildFiltersAsQueryParams({ filters }); if (range) { diff --git a/apps/client/src/app/services/import-activities.service.ts b/apps/client/src/app/services/import-activities.service.ts index 323f07a5b..3523dfeda 100644 --- a/apps/client/src/app/services/import-activities.service.ts +++ b/apps/client/src/app/services/import-activities.service.ts @@ -2,8 +2,8 @@ import { CreateTagDto } from '@ghostfolio/api/app/endpoints/tags/create-tag.dto' import { CreateAccountWithBalancesDto } from '@ghostfolio/api/app/import/create-account-with-balances.dto'; import { CreateAssetProfileWithMarketDataDto } from '@ghostfolio/api/app/import/create-asset-profile-with-market-data.dto'; import { CreateOrderDto } from '@ghostfolio/api/app/order/create-order.dto'; -import { Activity } from '@ghostfolio/api/app/order/interfaces/activities.interface'; import { parseDate as parseDateHelper } from '@ghostfolio/common/helper'; +import { ActivityResponse } from '@ghostfolio/common/interfaces'; import { HttpClient } from '@angular/common/http'; import { Injectable } from '@angular/core'; @@ -44,7 +44,7 @@ export class ImportActivitiesService { isDryRun?: boolean; userAccounts: Account[]; }): Promise<{ - activities: Activity[]; + activities: ActivityResponse[]; assetProfiles: CreateAssetProfileWithMarketDataDto[]; }> { const content = csvToJson(fileContent, { @@ -128,7 +128,7 @@ export class ImportActivitiesService { isDryRun?: boolean; tags?: CreateTagDto[]; }): Promise<{ - activities: Activity[]; + activities: ActivityResponse[]; }> { return new Promise((resolve, reject) => { this.postImport( @@ -161,11 +161,11 @@ export class ImportActivitiesService { tags }: { accounts?: CreateAccountWithBalancesDto[]; - activities: Activity[]; + activities: ActivityResponse[]; assetProfiles?: CreateAssetProfileWithMarketDataDto[]; tags?: CreateTagDto[]; }): Promise<{ - activities: Activity[]; + activities: ActivityResponse[]; }> { const importData: CreateOrderDto[] = []; diff --git a/libs/common/src/lib/interfaces/index.ts b/libs/common/src/lib/interfaces/index.ts index 828a65974..81d90a676 100644 --- a/libs/common/src/lib/interfaces/index.ts +++ b/libs/common/src/lib/interfaces/index.ts @@ -37,7 +37,11 @@ import type { Product } from './product'; import type { AccessTokenResponse } from './responses/access-token-response.interface'; import type { AccountBalancesResponse } from './responses/account-balances-response.interface'; import type { AccountsResponse } from './responses/accounts-response.interface'; -import type { ActivityResponse } from './responses/activity-response.interface'; +import type { + ActivitiesResponse, + ActivityErrorResponse, + ActivityResponse +} from './responses/activity-response.interface'; import type { AiPromptResponse } from './responses/ai-prompt-response.interface'; import type { ApiKeyResponse } from './responses/api-key-response.interface'; import type { AssetResponse } from './responses/asset-response.interface'; @@ -84,6 +88,8 @@ export { AccountBalance, AccountBalancesResponse, AccountsResponse, + ActivitiesResponse, + ActivityErrorResponse, ActivityResponse, AdminData, AdminJobs, diff --git a/libs/common/src/lib/interfaces/responses/activity-response.interface.ts b/libs/common/src/lib/interfaces/responses/activity-response.interface.ts index 5dd338627..1dd8e7e2b 100644 --- a/libs/common/src/lib/interfaces/responses/activity-response.interface.ts +++ b/libs/common/src/lib/interfaces/responses/activity-response.interface.ts @@ -1,3 +1,28 @@ -import { Activity } from '@ghostfolio/api/app/order/interfaces/activities.interface'; +import { EnhancedSymbolProfile } from '@ghostfolio/common/interfaces'; +import { AccountWithPlatform } from '@ghostfolio/common/types'; -export interface ActivityResponse extends Activity {} +import { Order, Tag } from '@prisma/client'; + +export interface ActivitiesResponse { + activities: ActivityResponse[]; + count: number; +} + +export interface ActivityResponse extends Order { + account?: AccountWithPlatform; + error?: ActivityErrorResponse; + feeInAssetProfileCurrency: number; + feeInBaseCurrency: number; + SymbolProfile?: EnhancedSymbolProfile; + tagIds?: string[]; + tags?: Tag[]; + unitPriceInAssetProfileCurrency: number; + updateAccountBalance?: boolean; + value: number; + valueInBaseCurrency: number; +} + +export interface ActivityErrorResponse { + code: 'IS_DUPLICATE'; + message?: string; +} diff --git a/libs/common/src/lib/interfaces/responses/import-response.interface.ts b/libs/common/src/lib/interfaces/responses/import-response.interface.ts index be2da9837..d88d04854 100644 --- a/libs/common/src/lib/interfaces/responses/import-response.interface.ts +++ b/libs/common/src/lib/interfaces/responses/import-response.interface.ts @@ -1,5 +1,5 @@ -import { Activity } from '@ghostfolio/api/app/order/interfaces/activities.interface'; +import { ActivityResponse } from './activity-response.interface'; export interface ImportResponse { - activities: Activity[]; + activities: ActivityResponse[]; } diff --git a/libs/common/src/lib/interfaces/responses/portfolio-holding-response.interface.ts b/libs/common/src/lib/interfaces/responses/portfolio-holding-response.interface.ts index b82a8f85d..dd8b17ae3 100644 --- a/libs/common/src/lib/interfaces/responses/portfolio-holding-response.interface.ts +++ b/libs/common/src/lib/interfaces/responses/portfolio-holding-response.interface.ts @@ -1,5 +1,5 @@ -import { Activity } from '@ghostfolio/api/app/order/interfaces/activities.interface'; import { + ActivityResponse, Benchmark, DataProviderInfo, EnhancedSymbolProfile, @@ -9,7 +9,7 @@ import { import { Tag } from '@prisma/client'; export interface PortfolioHoldingResponse { - activities: Activity[]; + activities: ActivityResponse[]; activitiesCount: number; averagePrice: number; dataProviderInfo: DataProviderInfo; diff --git a/libs/ui/src/lib/activities-table/activities-table.component.stories.ts b/libs/ui/src/lib/activities-table/activities-table.component.stories.ts index 5e774730b..6f345dc2a 100644 --- a/libs/ui/src/lib/activities-table/activities-table.component.stories.ts +++ b/libs/ui/src/lib/activities-table/activities-table.component.stories.ts @@ -1,5 +1,5 @@ -import { Activity } from '@ghostfolio/api/app/order/interfaces/activities.interface'; import { GfSymbolPipe } from '@ghostfolio/client/pipes/symbol/symbol.pipe'; +import { ActivityResponse } from '@ghostfolio/common/interfaces'; import { CommonModule } from '@angular/common'; import { MatButtonModule } from '@angular/material/button'; @@ -22,7 +22,7 @@ import { GfNoTransactionsInfoComponent } from '../no-transactions-info/no-transa import { GfValueComponent } from '../value'; import { GfActivitiesTableComponent } from './activities-table.component'; -const activities: Activity[] = [ +const activities: ActivityResponse[] = [ { accountId: '776bd1e9-b2f6-4f7e-933d-18756c2f0625', accountUserId: '081aa387-487d-4438-83a4-3060eb2a016e', @@ -360,7 +360,7 @@ const activities: Activity[] = [ } ]; -const dataSource = new MatTableDataSource(activities); +const dataSource = new MatTableDataSource(activities); export default { title: 'Activities Table', @@ -443,9 +443,9 @@ export const Default: Story = { export const Pagination: Story = { args: { baseCurrency: 'USD', - dataSource: new MatTableDataSource( + dataSource: new MatTableDataSource( Array.from({ length: 50 }).map((_, i) => ({ - ...(activities[i % activities.length] as Activity), + ...(activities[i % activities.length] as ActivityResponse), date: new Date(2025, 5, (i % 28) + 1), id: `${i}` })) diff --git a/libs/ui/src/lib/activities-table/activities-table.component.ts b/libs/ui/src/lib/activities-table/activities-table.component.ts index ce2de1caa..809663fd3 100644 --- a/libs/ui/src/lib/activities-table/activities-table.component.ts +++ b/libs/ui/src/lib/activities-table/activities-table.component.ts @@ -1,4 +1,3 @@ -import { Activity } from '@ghostfolio/api/app/order/interfaces/activities.interface'; import { ConfirmationDialogType } from '@ghostfolio/client/core/notification/confirmation-dialog/confirmation-dialog.type'; import { NotificationService } from '@ghostfolio/client/core/notification/notification.service'; import { GfSymbolPipe } from '@ghostfolio/client/pipes/symbol/symbol.pipe'; @@ -7,7 +6,10 @@ import { TAG_ID_EXCLUDE_FROM_ANALYSIS } from '@ghostfolio/common/config'; import { getLocale } from '@ghostfolio/common/helper'; -import { AssetProfileIdentifier } from '@ghostfolio/common/interfaces'; +import { + ActivityResponse, + AssetProfileIdentifier +} from '@ghostfolio/common/interfaces'; import { OrderWithAccount } from '@ghostfolio/common/types'; import { SelectionModel } from '@angular/cdk/collections'; @@ -94,7 +96,7 @@ export class GfActivitiesTableComponent implements AfterViewInit, OnChanges, OnDestroy, OnInit { @Input() baseCurrency: string; - @Input() dataSource: MatTableDataSource; + @Input() dataSource: MatTableDataSource; @Input() deviceType: string; @Input() hasActivities: boolean; @Input() hasPermissionToCreateActivity: boolean; @@ -123,7 +125,7 @@ export class GfActivitiesTableComponent @Output() import = new EventEmitter(); @Output() importDividends = new EventEmitter(); @Output() pageChanged = new EventEmitter(); - @Output() selectedActivities = new EventEmitter(); + @Output() selectedActivities = new EventEmitter(); @Output() sortChanged = new EventEmitter(); @ViewChild(MatPaginator) paginator: MatPaginator; @@ -137,7 +139,7 @@ export class GfActivitiesTableComponent public isLoading = true; public isUUID = isUUID; public routeQueryParams: Subscription; - public selectedRows = new SelectionModel(true, []); + public selectedRows = new SelectionModel(true, []); private unsubscribeSubject = new Subject(); @@ -226,7 +228,7 @@ export class GfActivitiesTableComponent return numSelectedRows === numTotalRows; } - public isExcludedFromAnalysis(activity: Activity) { + public isExcludedFromAnalysis(activity: ActivityResponse) { return ( activity.account?.isExcluded || activity.tags?.some(({ id }) => { @@ -239,7 +241,7 @@ export class GfActivitiesTableComponent this.pageChanged.emit(page); } - public onClickActivity(activity: Activity) { + public onClickActivity(activity: ActivityResponse) { if (this.showCheckbox) { if (!activity.error) { this.selectedRows.toggle(activity);