Browse Source

Merge 565a8c2a83 into 620929fe32

pull/5420/merge
Thomas Kaul 4 months ago
committed by GitHub
parent
commit
a89b1e3d53
No known key found for this signature in database GPG Key ID: B5690EEEBB952194
  1. 5
      CHANGELOG.md
  2. 25
      README.md
  3. 2
      apps/api/src/app/export/export.service.ts
  4. 11
      apps/api/src/app/import/import.service.ts
  5. 2
      apps/api/src/app/order/create-order.dto.ts
  6. 2
      apps/api/src/app/order/order.controller.ts
  7. 4
      apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-btceur.spec.ts
  8. 4
      apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-btcusd.spec.ts
  9. 4
      apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-novn-buy-and-sell-partially.spec.ts
  10. 4
      apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-novn-buy-and-sell.spec.ts
  11. 2
      apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.component.ts
  12. 8
      apps/client/src/app/services/import-activities.service.ts
  13. 11
      libs/common/src/lib/interfaces/export.interface.ts
  14. 2
      test/import/ok/500-activities.json
  15. 4
      test/import/ok/btceur.json
  16. 4
      test/import/ok/btcusd.json
  17. 2
      test/import/ok/derived-currency.json
  18. 17
      test/import/ok/sample.json
  19. 2
      test/import/ok/vti-buy-long-history.json

5
CHANGELOG.md

@ -7,8 +7,13 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
## Unreleased
### Added
- Extended the activities import documentation by the tags
### Changed
- Changed `tags` to `tagIds` in the activities import and export
- Refactored the _ZEN_ page to standalone
## 2.194.0 - 2025-08-27

25
README.md

@ -221,18 +221,19 @@ Deprecated: `GET http://localhost:3333/api/v1/auth/anonymous/<INSERT_SECURITY_TO
}
```
| Field | Type | Description |
| ------------ | ------------------- | ------------------------------------------------------------------- |
| `accountId` | `string` (optional) | Id of the account |
| `comment` | `string` (optional) | Comment of the activity |
| `currency` | `string` | `CHF` \| `EUR` \| `USD` etc. |
| `dataSource` | `string` | `COINGECKO` \| `MANUAL` \| `YAHOO` |
| `date` | `string` | Date in the format `ISO-8601` |
| `fee` | `number` | Fee of the activity |
| `quantity` | `number` | Quantity of the activity |
| `symbol` | `string` | Symbol of the activity (suitable for `dataSource`) |
| `type` | `string` | `BUY` \| `DIVIDEND` \| `FEE` \| `INTEREST` \| `LIABILITY` \| `SELL` |
| `unitPrice` | `number` | Price per unit of the activity |
| Field | Type | Description |
| ------------ | --------------------- | ------------------------------------------------------------------- |
| `accountId` | `string` (optional) | Id of the account |
| `comment` | `string` (optional) | Comment of the activity |
| `currency` | `string` | `CHF` \| `EUR` \| `USD` etc. |
| `dataSource` | `string` | `COINGECKO` \| `MANUAL` \| `YAHOO` |
| `date` | `string` | Date in the format `ISO-8601` |
| `fee` | `number` | Fee of the activity |
| `quantity` | `number` | Quantity of the activity |
| `symbol` | `string` | Symbol of the activity (suitable for `dataSource`) |
| `tagIds` | `string[]` (optional) | Ids of the tags |
| `type` | `string` | `BUY` \| `DIVIDEND` \| `FEE` \| `INTEREST` \| `LIABILITY` \| `SELL` |
| `unitPrice` | `number` | Price per unit of the activity |
#### Response

2
apps/api/src/app/export/export.service.ts

@ -237,7 +237,7 @@ export class ExportService {
dataSource: SymbolProfile.dataSource,
date: date.toISOString(),
symbol: SymbolProfile.symbol,
tags: currentTags.map(({ id: tagId }) => {
tagId: currentTags.map(({ id: tagId }) => {
return tagId;
})
};

11
apps/api/src/app/import/import.service.ts

@ -365,7 +365,7 @@ export class ImportService {
}
// If a new tag is created, then update the tag ID in all activities
activity.tags = (activity.tags ?? []).map((tagId) => {
activity.tagIds = (activity.tagIds ?? []).map((tagId) => {
return tagIdMapping[tagId] ?? tagId;
});
}
@ -630,7 +630,7 @@ export class ImportService {
fee,
quantity,
symbol,
tags,
tagIds,
type,
unitPrice
}) => {
@ -663,6 +663,7 @@ export class ImportService {
error,
fee,
quantity,
tagIds,
type,
unitPrice,
SymbolProfile: {
@ -679,8 +680,7 @@ export class ImportService {
isActive: true,
sectors: undefined,
updatedAt: undefined
},
tagIds: tags
}
};
}
);
@ -745,7 +745,8 @@ export class ImportService {
}
}
if (!assetProfiles[getAssetProfileIdentifier({ dataSource, symbol })]) {
if (assetProfiles[getAssetProfileIdentifier({ dataSource, symbol })]) {
} else {
const assetProfile = {
currency,
...(

2
apps/api/src/app/order/create-order.dto.ts

@ -64,7 +64,7 @@ export class CreateOrderDto {
@IsArray()
@IsOptional()
tags?: string[];
tagIds?: string[];
@IsEnum(Type, { each: true })
type: Type;

2
apps/api/src/app/order/order.controller.ts

@ -217,7 +217,7 @@ export class OrderController {
}
}
},
tags: data.tags?.map((id) => {
tags: data.tagIds?.map((id) => {
return { id };
}),
user: { connect: { id: this.request.user.id } },

4
apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-btceur.spec.ts

@ -18,7 +18,6 @@ import { PortfolioSnapshotServiceMock } from '@ghostfolio/api/services/queues/po
import { parseDate } from '@ghostfolio/common/helper';
import { PerformanceCalculationType } from '@ghostfolio/common/types/performance-calculation-type.type';
import { Tag } from '@prisma/client';
import { Big } from 'big.js';
import { join } from 'path';
@ -109,9 +108,6 @@ describe('PortfolioCalculator', () => {
name: 'Bitcoin',
symbol: activity.symbol
},
tags: activity.tags?.map((id) => {
return { id } as Tag;
}),
unitPriceInAssetProfileCurrency: 44558.42
}));

4
apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-btcusd.spec.ts

@ -18,7 +18,6 @@ import { PortfolioSnapshotServiceMock } from '@ghostfolio/api/services/queues/po
import { parseDate } from '@ghostfolio/common/helper';
import { PerformanceCalculationType } from '@ghostfolio/common/types/performance-calculation-type.type';
import { Tag } from '@prisma/client';
import { Big } from 'big.js';
import { join } from 'path';
@ -109,9 +108,6 @@ describe('PortfolioCalculator', () => {
name: 'Bitcoin',
symbol: activity.symbol
},
tags: activity.tags?.map((id) => {
return { id } as Tag;
}),
unitPriceInAssetProfileCurrency: 44558.42
}));

4
apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-novn-buy-and-sell-partially.spec.ts

@ -18,7 +18,6 @@ import { PortfolioSnapshotServiceMock } from '@ghostfolio/api/services/queues/po
import { parseDate } from '@ghostfolio/common/helper';
import { PerformanceCalculationType } from '@ghostfolio/common/types/performance-calculation-type.type';
import { Tag } from '@prisma/client';
import { Big } from 'big.js';
import { join } from 'path';
@ -112,9 +111,6 @@ describe('PortfolioCalculator', () => {
name: 'Novartis AG',
symbol: activity.symbol
},
tags: activity.tags?.map((id) => {
return { id } as Tag;
}),
unitPriceInAssetProfileCurrency: activity.unitPrice
}));

4
apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-novn-buy-and-sell.spec.ts

@ -18,7 +18,6 @@ import { PortfolioSnapshotServiceMock } from '@ghostfolio/api/services/queues/po
import { parseDate } from '@ghostfolio/common/helper';
import { PerformanceCalculationType } from '@ghostfolio/common/types/performance-calculation-type.type';
import { Tag } from '@prisma/client';
import { Big } from 'big.js';
import { join } from 'path';
@ -112,9 +111,6 @@ describe('PortfolioCalculator', () => {
name: 'Novartis AG',
symbol: activity.symbol
},
tags: activity.tags?.map((id) => {
return { id } as Tag;
}),
unitPriceInAssetProfileCurrency: activity.unitPrice
}));

2
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.component.ts

@ -523,7 +523,7 @@ export class GfCreateOrUpdateActivityDialog implements OnDestroy {
? undefined
: this.activityForm.get('searchSymbol')?.value?.symbol) ??
this.activityForm.get('name')?.value,
tags: this.activityForm.get('tags').value?.map(({ id }) => {
tagIds: this.activityForm.get('tags').value?.map(({ id }) => {
return id;
}),
type: this.activityForm.get('type').value,

8
apps/client/src/app/services/import-activities.service.ts

@ -146,7 +146,7 @@ export class ImportActivitiesService {
fee,
quantity,
SymbolProfile,
tags,
tagIds,
type,
unitPrice,
updateAccountBalance
@ -156,16 +156,14 @@ export class ImportActivitiesService {
comment,
fee,
quantity,
tagIds,
type,
unitPrice,
updateAccountBalance,
currency: currency ?? SymbolProfile.currency,
dataSource: SymbolProfile.dataSource,
date: date.toString(),
symbol: SymbolProfile.symbol,
tags: tags?.map(({ id }) => {
return id;
})
symbol: SymbolProfile.symbol
};
}

11
libs/common/src/lib/interfaces/export.interface.ts

@ -1,7 +1,8 @@
import { Activity } from '@ghostfolio/api/app/order/interfaces/activities.interface';
import {
Account,
DataSource,
Order,
Platform,
SymbolProfile,
Tag
@ -15,14 +16,20 @@ export interface Export {
balances: AccountBalance[];
})[];
activities: (Omit<
Order,
Activity,
| 'accountUserId'
| 'createdAt'
| 'date'
| 'feeInAssetProfileCurrency'
| 'feeInBaseCurrency'
| 'isDraft'
| 'symbolProfileId'
| 'tags'
| 'unitPriceInAssetProfileCurrency'
| 'updatedAt'
| 'userId'
| 'value'
| 'valueInBaseCurrency'
> & { dataSource: DataSource; date: string; symbol: string })[];
assetProfiles: (Omit<
SymbolProfile,

2
test/import/ok/500-activities.json

@ -14,7 +14,7 @@
}
],
"platforms": [],
"tags": [],
"tagIds": [],
"activities": [
{
"accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0",

4
test/import/ok/btceur.json

@ -5,7 +5,7 @@
},
"accounts": [],
"platforms": [],
"tags": [],
"tagIds": [],
"activities": [
{
"accountId": null,
@ -18,7 +18,7 @@
"dataSource": "YAHOO",
"date": "2021-12-12T00:00:00.000Z",
"symbol": "BTCUSD",
"tags": []
"tagIds": []
}
],
"user": {

4
test/import/ok/btcusd.json

@ -5,7 +5,7 @@
},
"accounts": [],
"platforms": [],
"tags": [],
"tagIds": [],
"activities": [
{
"accountId": null,
@ -18,7 +18,7 @@
"dataSource": "YAHOO",
"date": "2021-12-12T00:00:00.000Z",
"symbol": "BTCUSD",
"tags": []
"tagIds": []
}
],
"user": {

2
test/import/ok/derived-currency.json

@ -14,7 +14,7 @@
}
],
"platforms": [],
"tags": [],
"tagIds": [],
"activities": [
{
"accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0",

17
test/import/ok/sample.json

@ -77,7 +77,12 @@
"url": "https://interactivebrokers.com"
}
],
"tags": [],
"tagIds": [
{
"id": "7314654b-46a7-48a4-b6b9-4895b45ea107",
"name": "CORE"
}
],
"activities": [
{
"accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0",
@ -90,7 +95,7 @@
"dataSource": "MANUAL",
"date": "2021-09-01T00:00:00.000Z",
"symbol": "14a69cb9-1e31-43fa-b320-83703d8ed74b",
"tags": []
"tagIds": []
},
{
"accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0",
@ -103,7 +108,7 @@
"dataSource": "YAHOO",
"date": "2021-09-16T00:00:00.000Z",
"symbol": "MSFT",
"tags": []
"tagIds": ["7314654b-46a7-48a4-b6b9-4895b45ea107"]
},
{
"accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0",
@ -116,7 +121,7 @@
"dataSource": "YAHOO",
"date": "2021-11-17T00:00:00.000Z",
"symbol": "MSFT",
"tags": []
"tagIds": ["7314654b-46a7-48a4-b6b9-4895b45ea107"]
},
{
"accountId": null,
@ -129,7 +134,7 @@
"dataSource": "MANUAL",
"date": "2022-01-01T00:00:00.000Z",
"symbol": "7e91b7d4-1430-4212-8380-289a06c9bbc1",
"tags": []
"tagIds": []
},
{
"accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0",
@ -142,7 +147,7 @@
"dataSource": "YAHOO",
"date": "2050-06-06T00:00:00.000Z",
"symbol": "MSFT",
"tags": []
"tagIds": ["7314654b-46a7-48a4-b6b9-4895b45ea107"]
}
],
"user": {

2
test/import/ok/vti-buy-long-history.json

@ -5,7 +5,7 @@
},
"accounts": [],
"platforms": [],
"tags": [],
"tagIds": [],
"activities": [
{
"fee": 0,

Loading…
Cancel
Save