Browse Source

Feature/stock splits setup (part 2) (#7523)

Improve stock splits setup
pull/7518/head^2
Thomas Kaul 5 days ago
committed by GitHub
parent
commit
75e3d032ab
No known key found for this signature in database GPG Key ID: B5690EEEBB952194
  1. 2
      apps/api/src/app/endpoints/asset-profiles/asset-profiles.controller.ts
  2. 2
      apps/api/src/app/endpoints/asset-profiles/asset-profiles.module.ts
  3. 12
      apps/api/src/app/endpoints/asset-profiles/asset-profiles.service.ts
  4. 31
      apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html

2
apps/api/src/app/endpoints/asset-profiles/asset-profiles.controller.ts

@ -142,6 +142,8 @@ export class AssetProfilesController {
}); });
return this.assetProfilesService.createSplit({ return this.assetProfilesService.createSplit({
dataSource,
symbol,
symbolProfileId, symbolProfileId,
date: parseISO(data.date), date: parseISO(data.date),
denominator: data.denominator, denominator: data.denominator,

2
apps/api/src/app/endpoints/asset-profiles/asset-profiles.module.ts

@ -8,6 +8,7 @@ import { DataProviderModule } from '@ghostfolio/api/services/data-provider/data-
import { ExchangeRateDataModule } from '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.module'; import { ExchangeRateDataModule } from '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.module';
import { MarketDataModule } from '@ghostfolio/api/services/market-data/market-data.module'; import { MarketDataModule } from '@ghostfolio/api/services/market-data/market-data.module';
import { PrismaModule } from '@ghostfolio/api/services/prisma/prisma.module'; import { PrismaModule } from '@ghostfolio/api/services/prisma/prisma.module';
import { DataGatheringQueueModule } from '@ghostfolio/api/services/queues/data-gathering/data-gathering.module';
import { SymbolProfileModule } from '@ghostfolio/api/services/symbol-profile/symbol-profile.module'; import { SymbolProfileModule } from '@ghostfolio/api/services/symbol-profile/symbol-profile.module';
import { Module } from '@nestjs/common'; import { Module } from '@nestjs/common';
@ -23,6 +24,7 @@ import { AssetProfilesService } from './asset-profiles.service';
ApiModule, ApiModule,
AssetProfileSplitModule, AssetProfileSplitModule,
BenchmarkModule, BenchmarkModule,
DataGatheringQueueModule,
DataProviderModule, DataProviderModule,
ExchangeRateDataModule, ExchangeRateDataModule,
MarketDataModule, MarketDataModule,

12
apps/api/src/app/endpoints/asset-profiles/asset-profiles.service.ts

@ -5,6 +5,7 @@ import { DataProviderService } from '@ghostfolio/api/services/data-provider/data
import { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.service'; import { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.service';
import { MarketDataService } from '@ghostfolio/api/services/market-data/market-data.service'; import { MarketDataService } from '@ghostfolio/api/services/market-data/market-data.service';
import { PrismaService } from '@ghostfolio/api/services/prisma/prisma.service'; import { PrismaService } from '@ghostfolio/api/services/prisma/prisma.service';
import { DataGatheringService } from '@ghostfolio/api/services/queues/data-gathering/data-gathering.service';
import { SymbolProfileService } from '@ghostfolio/api/services/symbol-profile/symbol-profile.service'; import { SymbolProfileService } from '@ghostfolio/api/services/symbol-profile/symbol-profile.service';
import { UpdateAssetProfileDataDto } from '@ghostfolio/common/dtos'; import { UpdateAssetProfileDataDto } from '@ghostfolio/common/dtos';
import { import {
@ -33,6 +34,7 @@ export class AssetProfilesService {
private readonly activitiesService: ActivitiesService, private readonly activitiesService: ActivitiesService,
private readonly assetProfileSplitService: AssetProfileSplitService, private readonly assetProfileSplitService: AssetProfileSplitService,
private readonly benchmarkService: BenchmarkService, private readonly benchmarkService: BenchmarkService,
private readonly dataGatheringService: DataGatheringService,
private readonly dataProviderService: DataProviderService, private readonly dataProviderService: DataProviderService,
private readonly exchangeRateDataService: ExchangeRateDataService, private readonly exchangeRateDataService: ExchangeRateDataService,
private readonly marketDataService: MarketDataService, private readonly marketDataService: MarketDataService,
@ -41,22 +43,28 @@ export class AssetProfilesService {
) {} ) {}
public async createSplit({ public async createSplit({
dataSource,
date, date,
denominator, denominator,
numerator, numerator,
symbol,
symbolProfileId symbolProfileId
}: { }: {
date: Date; date: Date;
denominator: number; denominator: number;
numerator: number; numerator: number;
symbolProfileId: string; symbolProfileId: string;
}) { } & AssetProfileIdentifier) {
return this.assetProfileSplitService.upsert({ const assetProfileSplit = await this.assetProfileSplitService.upsert({
date, date,
denominator, denominator,
numerator, numerator,
symbolProfileId symbolProfileId
}); });
await this.dataGatheringService.gatherSymbol({ dataSource, symbol });
return assetProfileSplit;
} }
public async deleteSplit({ public async deleteSplit({

31
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html

@ -514,10 +514,6 @@
<div class="container mt-3 p-0"> <div class="container mt-3 p-0">
<div class="no-gutters row w-100"> <div class="no-gutters row w-100">
<div class="col-12"> <div class="col-12">
<p class="text-muted" i18n>
Splits are stored for this asset profile, but are not applied
to the portfolio calculation yet.
</p>
@if (splits.length > 0) { @if (splits.length > 0) {
<table class="gf-table mb-3 w-100"> <table class="gf-table mb-3 w-100">
<thead> <thead>
@ -580,7 +576,11 @@
</mat-datepicker-toggle> </mat-datepicker-toggle>
<mat-datepicker #dateOfSplit /> <mat-datepicker #dateOfSplit />
</mat-form-field> </mat-form-field>
<mat-form-field appearance="outline" class="mb-3 w-100"> <div class="align-items-center d-flex mb-3">
<mat-form-field
appearance="outline"
class="w-100 without-hint"
>
<mat-label i18n>Shares After</mat-label> <mat-label i18n>Shares After</mat-label>
<input <input
formControlName="numerator" formControlName="numerator"
@ -588,15 +588,12 @@
step="1" step="1"
type="number" type="number"
/> />
<mat-hint
><ng-container i18n>Numerator</ng-container>,
<ng-container i18n
>e.g. 4 for a 4:1 split or 1 for a 1:10 reverse
split</ng-container
></mat-hint
>
</mat-form-field> </mat-form-field>
<mat-form-field appearance="outline" class="mb-3 w-100"> <div class="mx-2">:</div>
<mat-form-field
appearance="outline"
class="w-100 without-hint"
>
<mat-label i18n>Shares Before</mat-label> <mat-label i18n>Shares Before</mat-label>
<input <input
formControlName="denominator" formControlName="denominator"
@ -604,14 +601,8 @@
step="1" step="1"
type="number" type="number"
/> />
<mat-hint
><ng-container i18n>Denominator</ng-container>,
<ng-container i18n
>e.g. 1 for a 4:1 split or 10 for a 1:10 reverse
split</ng-container
></mat-hint
>
</mat-form-field> </mat-form-field>
</div>
<div class="text-right"> <div class="text-right">
<button <button
color="primary" color="primary"

Loading…
Cancel
Save