Browse Source

format:check

pull/5825/head
Raj Gupta 1 week ago
parent
commit
ce57e8166f
  1. 2
      CHANGELOG.md
  2. 22
      apps/api/src/app/import/import.service.ts
  3. 28
      apps/api/src/app/order/interfaces/activities.interface.ts
  4. 9
      apps/api/src/app/portfolio/calculator/portfolio-calculator.factory.ts
  5. 4
      apps/api/src/app/portfolio/calculator/portfolio-calculator.ts
  6. 4
      apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-baln-buy-and-buy.spec.ts
  7. 4
      apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-baln-buy-and-sell-in-two-activities.spec.ts
  8. 4
      apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-baln-buy-and-sell.spec.ts
  9. 8
      apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-baln-buy.spec.ts
  10. 8
      apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-btceur.spec.ts
  11. 4
      apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-btcusd-buy-and-sell-partially.spec.ts
  12. 8
      apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-btcusd-short.spec.ts
  13. 8
      apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-btcusd.spec.ts
  14. 4
      apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-fee.spec.ts
  15. 4
      apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-googl-buy.spec.ts
  16. 4
      apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-liability.spec.ts
  17. 4
      apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-msft-buy-and-sell.spec.ts
  18. 4
      apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-msft-buy-with-dividend.spec.ts
  19. 8
      apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-novn-buy-and-sell-partially.spec.ts
  20. 8
      apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-novn-buy-and-sell.spec.ts
  21. 4
      apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-valuable.spec.ts
  22. 7
      apps/api/src/app/portfolio/interfaces/portfolio-order.interface.ts
  23. 12
      apps/api/src/app/portfolio/portfolio.service.ts
  24. 8
      apps/client/src/app/components/account-detail-dialog/account-detail-dialog.component.ts
  25. 8
      apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.component.ts
  26. 17
      apps/client/src/app/pages/portfolio/activities/activities-page.component.ts
  27. 5
      apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/interfaces/interfaces.ts
  28. 14
      apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts
  29. 4
      apps/client/src/app/services/data.service.ts
  30. 10
      apps/client/src/app/services/import-activities.service.ts
  31. 8
      libs/common/src/lib/interfaces/index.ts
  32. 29
      libs/common/src/lib/interfaces/responses/activity-response.interface.ts
  33. 4
      libs/common/src/lib/interfaces/responses/import-response.interface.ts
  34. 4
      libs/common/src/lib/interfaces/responses/portfolio-holding-response.interface.ts
  35. 10
      libs/ui/src/lib/activities-table/activities-table.component.stories.ts
  36. 16
      libs/ui/src/lib/activities-table/activities-table.component.ts

2
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`

22
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<Activity[]> {
}: AssetProfileIdentifier & { userId: string }): Promise<ActivityResponse[]> {
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<Activity[]> {
}): Promise<ActivityResponse[]> {
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<CreateOrderDto>[];
userCurrency: string;
userId: string;
}): Promise<Partial<Activity>[]> {
}): Promise<Partial<ActivityResponse>[]> {
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;

28
apps/api/src/app/order/interfaces/activities.interface.ts

@ -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;
}

9
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[];

4
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;

4
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'),

4
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'),

4
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'),

8
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'),

8
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,

4
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'),

8
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,

8
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,

4
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'),

4
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'),

4
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

4
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'),

4
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'),

8
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,

8
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,

4
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'),

7
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<Activity, 'tags' | 'type'> {
export interface PortfolioOrder
extends Pick<ActivityResponse, 'tags' | 'type'> {
date: string;
fee: Big;
quantity: Big;
SymbolProfile: Pick<
Activity['SymbolProfile'],
ActivityResponse['SymbolProfile'],
'currency' | 'dataSource' | 'name' | 'symbol' | 'userId'
>;
unitPrice: Big;

12
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<InvestmentItem[]> {
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<string, TimelinePosition>;
userCurrency: string;

8
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<Activity>;
public dataSource: MatTableDataSource<ActivityResponse>;
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,
{

8
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<Activity>;
public dataSource: MatTableDataSource<ActivityResponse>;
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,
{

17
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<Activity>;
public dataSource: MatTableDataSource<ActivityResponse>;
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))

5
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;
}

14
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<Activity>;
public dataSource: MatTableDataSource<ActivityResponse>;
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;
});

4
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<Activities> {
}): Observable<ActivitiesResponse> {
let params = this.buildFiltersAsQueryParams({ filters });
if (range) {

10
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[] = [];

8
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,

29
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;
}

4
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[];
}

4
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;

10
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<Activity>(activities);
const dataSource = new MatTableDataSource<ActivityResponse>(activities);
export default {
title: 'Activities Table',
@ -443,9 +443,9 @@ export const Default: Story = {
export const Pagination: Story = {
args: {
baseCurrency: 'USD',
dataSource: new MatTableDataSource<Activity>(
dataSource: new MatTableDataSource<ActivityResponse>(
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}`
}))

16
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<Activity>;
@Input() dataSource: MatTableDataSource<ActivityResponse>;
@Input() deviceType: string;
@Input() hasActivities: boolean;
@Input() hasPermissionToCreateActivity: boolean;
@ -123,7 +125,7 @@ export class GfActivitiesTableComponent
@Output() import = new EventEmitter<void>();
@Output() importDividends = new EventEmitter<AssetProfileIdentifier>();
@Output() pageChanged = new EventEmitter<PageEvent>();
@Output() selectedActivities = new EventEmitter<Activity[]>();
@Output() selectedActivities = new EventEmitter<ActivityResponse[]>();
@Output() sortChanged = new EventEmitter<Sort>();
@ViewChild(MatPaginator) paginator: MatPaginator;
@ -137,7 +139,7 @@ export class GfActivitiesTableComponent
public isLoading = true;
public isUUID = isUUID;
public routeQueryParams: Subscription;
public selectedRows = new SelectionModel<Activity>(true, []);
public selectedRows = new SelectionModel<ActivityResponse>(true, []);
private unsubscribeSubject = new Subject<void>();
@ -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);

Loading…
Cancel
Save