diff --git a/NuGet.config b/NuGet.config index 5ced69e..7e000eb 100644 --- a/NuGet.config +++ b/NuGet.config @@ -13,10 +13,12 @@ - + - - @@ -55,7 +57,6 @@ - diff --git a/Resources/accept_button.png b/Resources/accept_button.png deleted file mode 100644 index 7786ac7..0000000 Binary files a/Resources/accept_button.png and /dev/null differ diff --git a/Resources/add.png b/Resources/add.png deleted file mode 100644 index 60a7a29..0000000 Binary files a/Resources/add.png and /dev/null differ diff --git a/Resources/cancel.png b/Resources/cancel.png deleted file mode 100644 index 1b20ae0..0000000 Binary files a/Resources/cancel.png and /dev/null differ diff --git a/Resources/delete.png b/Resources/delete.png deleted file mode 100644 index 30a45b8..0000000 Binary files a/Resources/delete.png and /dev/null differ diff --git a/Resources/diskette.png b/Resources/diskette.png deleted file mode 100644 index 3a9dcf3..0000000 Binary files a/Resources/diskette.png and /dev/null differ diff --git a/Resources/emotion_batman.png b/Resources/emotion_batman.png deleted file mode 100644 index 17ddd8b..0000000 Binary files a/Resources/emotion_batman.png and /dev/null differ diff --git a/Resources/file_start_workflow.png b/Resources/file_start_workflow.png deleted file mode 100644 index a83e969..0000000 Binary files a/Resources/file_start_workflow.png and /dev/null differ diff --git a/Resources/money.png b/Resources/money.png deleted file mode 100644 index c8c5a11..0000000 Binary files a/Resources/money.png and /dev/null differ diff --git a/Resources/money_add.png b/Resources/money_add.png deleted file mode 100644 index 62154f3..0000000 Binary files a/Resources/money_add.png and /dev/null differ diff --git a/Resources/money_delete.png b/Resources/money_delete.png deleted file mode 100644 index d1a9cd0..0000000 Binary files a/Resources/money_delete.png and /dev/null differ diff --git a/Resources/money_dollar.png b/Resources/money_dollar.png deleted file mode 100644 index bab8f07..0000000 Binary files a/Resources/money_dollar.png and /dev/null differ diff --git a/Resources/refresh_all.png b/Resources/refresh_all.png deleted file mode 100644 index 0f4d261..0000000 Binary files a/Resources/refresh_all.png and /dev/null differ diff --git a/Resources/stop.png b/Resources/stop.png deleted file mode 100644 index 807117f..0000000 Binary files a/Resources/stop.png and /dev/null differ diff --git a/Resources/traffic_lights_green.png b/Resources/traffic_lights_green.png deleted file mode 100644 index bd53d89..0000000 Binary files a/Resources/traffic_lights_green.png and /dev/null differ diff --git a/Resources/traffic_lights_red.png b/Resources/traffic_lights_red.png deleted file mode 100644 index fd00be2..0000000 Binary files a/Resources/traffic_lights_red.png and /dev/null differ diff --git a/Resources/traffic_lights_yellow.png b/Resources/traffic_lights_yellow.png deleted file mode 100644 index 54034fc..0000000 Binary files a/Resources/traffic_lights_yellow.png and /dev/null differ diff --git a/Resources/warning.png b/Resources/warning.png deleted file mode 100644 index 311e726..0000000 Binary files a/Resources/warning.png and /dev/null differ diff --git a/docs/ARCHITECTURE.md b/docs/ARCHITECTURE.md index 8cabb12..bc2daf2 100644 --- a/docs/ARCHITECTURE.md +++ b/docs/ARCHITECTURE.md @@ -97,7 +97,7 @@ src/IBKRTrader.Hosting (classlib, net10.0) – AppHostBuilder + RunStartu - [x] `ShellUiHost` + `LauncherForm` (View-Buttons + gemeinsames Fenster-Menü); Core-Views (Workers/Logs/Settings) als eigene Fenster - [x] CongressTrading auf neuen `IModule`-Vertrag; Modul-Worker als `IWorker` registriert - [x] `--smoke-ui` Headless-Test (alle Views + Launcher konstruieren) → grün -- [ ] **Offen (R4/R5):** Worker von `WorkerEngine`/`IWorker` auf `IHostedService` umstellen (aktuell noch WorkerEngine) +- [x] Worker von `WorkerEngine`/`IWorker` auf `IHostedService` umgestellt — **in R4 erledigt**, die Zeile stand hier bis zum 2026-08-23 faelschlich noch offen ### R3 – Persistenz auf EF Core **Festgelegt:** EF-Migrationen **extern** (wie PolytraderSharp) – Schema per `dotnet ef database update`, @@ -163,6 +163,34 @@ Anzeigegerät mehr und ist damit erstmals Teil der CI. **Offen:** IB Gateway kopflos betreiben (IBC + Xvfb) – eigene Baustelle, unabhängig vom Code; LiveCharts2 kommt mit den neuen Modulen (Avalonia deshalb auf der 11er-Linie gepinnt). +### L6 – Namensgebung bereinigt ✅ (2026-08-07) +- [x] `IBKRTrader.App.Avalonia` → **`IBKRTrader.App`**. Das Suffix gab es nur, solange daneben eine + WinForms-`IBKRTrader.App` stand; seit L5 ist die weg. Assembly, Wurzel-Namensraum und die + `avares://`-Ressourcen-URI sind mitgezogen, Git erkennt alles als Umbenennung. +- [x] Die `global::Avalonia`-Qualifizierungen entfallen – sie waren nur nötig, weil der Namensraum + `IBKRTrader.App.Avalonia` das gleichnamige Paket verdeckte. +- [x] **Inhaltlich falsch gewordene Aussagen berichtigt** – das waren die eigentlichen Überbleibsel, + nicht die Kommentare: `.agents/rules/grundregeln.md` schrieb weiterhin „C# .NET 10 WinForms", + RichTextBox-Logging, `LauncherForm` und `PropertyGrid` vor und hätte die Portierung Stück für + Stück rückgängig gemacht. Dazu Core-Kommentare (`LogEntry`, `IWorker`, `ModuleView`) und Doku. + +### DC – Deploymentcenter-Integration ✅ (2026-08-23) +Konzept und Begründung: [konzepte/KONZEPT-Deploymentcenter-Integration.md](konzepte/KONZEPT-Deploymentcenter-Integration.md). +Schritte 0–8 der dortigen Reihenfolge sind umgesetzt; der Stand je Schritt steht in §9 dieses Konzepts. + +- [x] Lizenz (Sperrbetrieb statt Abbruch), Watchdog-Heartbeat, Fehler-Stream inkl. globaler + Ausnahmebehandler, Update-Prüfung mit `ReleaseCredentials`, `setup.json` + Release-Pipeline. + Einbauort ist `IBKRTrader.Hosting/Deploymentcenter/` – den Host teilen sich Shell und Daemon. +- [x] Vier Projekt-Befunde vorab bereinigt: Zugangsdaten aus `AppSettings` (P1), `AppPaths`-Rückfall + unter Windows (P2), globale Handler (P3), Version zentral in `Directory.Build.props` (P4). +- [ ] **Offen (P5):** Die Gitea-CI checkt das Schwester-Repo `Deploymentcenter` nicht aus. Solange + das SDK als Cross-Repo-`ProjectReference` hängt, ist der CI-Lauf rot. Behebt sich mit + Schritt 10 (SDK als NuGet-Paket in der Gitea-Registry). +- [ ] **Offen (Schritt 9):** Bugtracker-Baustein – setzt voraus, dass das Projekt `ibkrtrader` im + DC-WebUI angelegt ist und ein Token mit `bugtracker:report` vorliegt (serverseitige Handarbeit). +- [ ] **Offen:** Das Anwenden eines gefundenen Updates ist nicht verdrahtet. `DcUpdateService.LaunchAgent` + ist fertig und dokumentiert, es fehlt der Aufrufer, der danach geordnet herunterfährt. + --- ## Kurskorrektur abgeschlossen (R1–R7) diff --git a/docs/konzepte/KONZEPT-Deploymentcenter-Integration.md b/docs/konzepte/KONZEPT-Deploymentcenter-Integration.md index df45607..6d361d6 100644 --- a/docs/konzepte/KONZEPT-Deploymentcenter-Integration.md +++ b/docs/konzepte/KONZEPT-Deploymentcenter-Integration.md @@ -523,6 +523,9 @@ Packager, der genau das abfängt — kein Fehlschlag, sondern die Absicherung, d ## 8. Befunde und offene Punkte +> **Status 2026-08-23:** P1–P4 sind umgesetzt (Einzelheiten in §9). **P5 ist eingetreten**, +> P6 entscheidet sich erst beim ersten Release. Der ursprüngliche Vermerk von 2026-08-14: +> > **Status 2026-08-14:** Alle sieben ursprünglich an den Deploymentcenter-Entwickler > gemeldeten Befunde (D1–D7) sind mit den Versionen 2.5.0/2.5.1 behoben — bestätigt über > `GET /api/updateservice/v1/changelog?since=2.4`. Der Abschnitt bleibt als Nachweis @@ -567,6 +570,13 @@ ersten Release ab — zu Recht. nur IBKRTrader aus. Eine `ProjectReference` nach `..\..\..\..\Deploymentcenter\…` macht den Build auf beiden Matrix-Zielen rot. Siehe die Entscheidung in §2.2. +> **Seit 2026-08-23 eingetreten, nicht mehr nur vorhergesagt.** Die +> `ProjectReference` ist mit der Integration auf `main` gelandet, die CI ist +> damit rot. Das war die bewusst in Kauf genommene Folge der Interimslösung aus +> §2.2 — lokal baut die Projektmappe, sobald das Schwester-Repo daneben liegt. +> Auflösung ist Schritt 10: SDK als NuGet-Paket in die Gitea-Registry, dann +> `PackageReference` statt Cross-Repo-Pfad. + **P6 · Konfiguration liegt im Installationsverzeichnis.** Unter Windows schreibt `AppPaths` neben die Binärdatei. Das ist mit `preservePatterns` beherrschbar (§7.3), muss aber beim ersten Release stimmen — ein Update, das `settings.json` @@ -627,16 +637,16 @@ nicht durchgängig beziffert). ✅ **Behoben (2.5.1, Doku)** — Changelog nennt | Schritt | Inhalt | Abhängig von | Stand | |---|---|---|---| -| 0 | **P1** Zugangsdaten wechseln, Vorgaben auf Platzhalter | — | ⬜ dieser Durchlauf | -| 1 | **P2** `AppPaths`-Rückfall plattformabhängig, **P4** `Directory.Build.props` | — | ⬜ dieser Durchlauf | -| 2 | SDK-Bezug Stufe 1: Cross-Repo-`ProjectReference` (§2.2) | — | ⬜ dieser Durchlauf | -| 3 | `DcConfig`, `DeploymentcenterSettings`, `DcApiClient`, `BuildInfo` | 1, 2 | ⬜ dieser Durchlauf | -| 4 | **P3** globale Handler + Fehler-Stream | 3 | ⬜ dieser Durchlauf | -| 5 | Watchdog-Heartbeat inkl. `stopped` | 3 | ⬜ dieser Durchlauf | -| 6 | Lizenz mit Sperrbetrieb statt Abbruch (§5.2), `EnsureLicensedAsync` | 3 | ⬜ dieser Durchlauf | -| 7 | Update-Prüfung **mit** `ReleaseCredentials`, `exitCurrentApp:false` bei offenem Zustand | 6 (braucht den Schlüssel) | ⬜ dieser Durchlauf | -| 8 | `setup.json`, `preserve`/`exclude`, Release-Pipeline (Vorlage per `curl` von `/docs/release-template/`) | 1–7 | ⬜ dieser Durchlauf | -| 9 | Bugtracker-Baustein nach `AGENTS.md` / `.agents/rules` | Projekt-Slug angelegt | ⬜ separat (Projekt `ibkrtrader` muss im WebUI erst angelegt werden) | +| 0 | **P1** Zugangsdaten wechseln, Vorgaben auf Platzhalter | — | ✅ Vorgaben sind Platzhalter. **Die Rotation des geleakten Passworts steht weiterhin aus** (Nutzer-Aktion) | +| 1 | **P2** `AppPaths`-Rückfall plattformabhängig, **P4** `Directory.Build.props` | — | ✅ 2026-08-23 | +| 2 | SDK-Bezug Stufe 1: Cross-Repo-`ProjectReference` (§2.2) | — | ✅ 2026-08-23, inkl. Prüf-Target mit lesbarer Fehlermeldung | +| 3 | `DcConfig`, `DeploymentcenterSettings`, `DcApiClient`, `BuildInfo` | 1, 2 | ✅ 2026-08-23 | +| 4 | **P3** globale Handler + Fehler-Stream | 3 | ✅ 2026-08-23 (`DcCrashHandlers`, `DcErrorSink`, `DcErrorReporter`) | +| 5 | Watchdog-Heartbeat inkl. `stopped` | 3 | ✅ 2026-08-23 (`DcHeartbeatWorker`) | +| 6 | Lizenz mit Sperrbetrieb statt Abbruch (§5.2), `EnsureLicensedAsync` | 3 | ✅ 2026-08-23 (`LicenseGuard`) | +| 7 | Update-Prüfung **mit** `ReleaseCredentials`, `exitCurrentApp:false` bei offenem Zustand | 6 (braucht den Schlüssel) | 🔶 Die **Prüfung** läuft beim Start. Das **Anwenden** ist es nicht: `LaunchAgent` ist fertig, aber kein Aufrufer fährt danach geordnet herunter | +| 8 | `setup.json`, `preserve`/`exclude`, Release-Pipeline (Vorlage per `curl` von `/docs/release-template/`) | 1–7 | ✅ 2026-08-23 (`setup.json`, `scripts/release.*`). **Noch nie ausgeführt** – das erste Release steht aus | +| 9 | Bugtracker-Baustein nach `AGENTS.md` / `.agents/rules` | Projekt-Slug angelegt | ⬜ offen — Projekt `ibkrtrader` muss im WebUI erst angelegt werden | | 10 | **Folgeschritt, nicht Teil dieses Durchlaufs:** `Deploymentcenter.Client` als NuGet-Paket in die Gitea-Registry pushen, `` durch `PackageReference` ersetzen, Gitea-CI (**P5**) auf den Paketbezug umstellen | 2 | ⬜ offen — siehe §2.2 | Schritt 7 und 8 hängen zusammen: **der erste ausgelieferte Build muss die diff --git a/docs/konzepte/KONZEPT-Modul-Accounting.md b/docs/konzepte/KONZEPT-Modul-Accounting.md index 148644e..fb81b70 100644 --- a/docs/konzepte/KONZEPT-Modul-Accounting.md +++ b/docs/konzepte/KONZEPT-Modul-Accounting.md @@ -1,5 +1,15 @@ # Konzept: Modul „Accounting" (Buchhaltung/Reporting aller Konten) +> **UMGESETZT (Modulgerüst).** Das Modul steht: `acc_`-Schema mit Migration `InitialAccounting`, +> `AccountingIngestService` (append-only, idempotent über `IdempotencyKey`), `AccountingClassifier`, +> `AccountingEngine`, `FxConverter`, `AccountingReportService` sowie CSV- und PDF-Export. Die +> Ingest-Quellen liegen hinter Interfaces mit **Offline-Null-Stubs** — das Modul läuft vollständig +> und bucht dabei korrekt nichts. +> +> **Weiterhin offen ist genau die Zielland-Arbeit aus §6** — vor allem der Live-Flex-Abruf, ohne den +> keine echten Buchungen entstehen, und die Steuerschicht, deren Jurisdiktion nicht festgelegt ist. +> Das Modul ist damit lauffähig, aber noch nicht in Betrieb. + > Stand: 2026-07-30 > Ziel: Vollständige, **von unserer Trading-DB unabhängige**, buchhalterisch korrekte Erfassung ALLER > Kontobewegungen der IBKR-Konten. Periodische (meist monatliche), vor einer Steuerbehörde diff --git a/docs/konzepte/KONZEPT-Modul-Supervisor.md b/docs/konzepte/KONZEPT-Modul-Supervisor.md index 907f0e4..ad6fbfc 100644 --- a/docs/konzepte/KONZEPT-Modul-Supervisor.md +++ b/docs/konzepte/KONZEPT-Modul-Supervisor.md @@ -1,5 +1,13 @@ # Konzept: Modul „Supervisor" (KI-gestützte Handels-Analyse & Forensik) +> **UMGESETZT (S-0 bis S-4).** Datenfundament im Core (`core_decision_journal`, `core_order_events`, +> durchgereichte `SignalId`, JSONL-Log-Sink), `DossierService`/`DossierBuilder`, der +> OpenRouter-Agent mit read-only Tool-Registry und Profilen, `sup_reports`, `CounterfactualJob`, +> `DailyReportService` und der MCP-Server (`McpLightServer`, `McpJsonRpc`). +> +> **Weiterhin offen** sind die beiden Punkte am Ende dieses Dokuments: die Counterfactual-Kursauflösung +> (Interface + Stub vorhanden) und der externe Versand des Tagesberichts. + > Stand: 2026-07-30 > Ziel: ALLES, was IBKRTrader getan (und bewusst NICHT getan) hat, detailliert analysierbar machen — > Entscheidungen, Orders, Trades und Logs — und die Analyse durch ein KI-Modell (OpenRouter) durchführen diff --git a/src/IBKRTrader.App/IBKRTrader.App.csproj b/src/IBKRTrader.App/IBKRTrader.App.csproj index 420f03d..eec3ed7 100644 --- a/src/IBKRTrader.App/IBKRTrader.App.csproj +++ b/src/IBKRTrader.App/IBKRTrader.App.csproj @@ -44,7 +44,10 @@ - + diff --git a/src/IBKRTrader.Core/AI/AIModelService.cs b/src/IBKRTrader.Core/AI/AIModelService.cs deleted file mode 100644 index 7d91c4b..0000000 --- a/src/IBKRTrader.Core/AI/AIModelService.cs +++ /dev/null @@ -1,24 +0,0 @@ -using IBKRTrader.Core.Logging; - -namespace IBKRTrader.Core.AI; - -/// -/// Platzhalter für KI-Modell-Integration. -/// Wird in einer späteren Phase mit echten ML-Modellen ersetzt. -/// -public class AIModelService -{ - private readonly LoggingService _logger; - - public AIModelService(LoggingService logger) - { - _logger = logger; - } - - /// Platzhalter: Gibt immer 0.5 zurück (keine echte Vorhersage). - public Task PredictAsync(string symbol, object features) - { - _logger.Warn("AI", $"AIModelService ist ein Platzhalter – keine echte Vorhersage für {symbol}."); - return Task.FromResult(0.5); - } -} diff --git a/src/IBKRTrader.Core/Budget/BudgetService.cs b/src/IBKRTrader.Core/Budget/BudgetService.cs index 81938ad..8cfc12f 100644 --- a/src/IBKRTrader.Core/Budget/BudgetService.cs +++ b/src/IBKRTrader.Core/Budget/BudgetService.cs @@ -19,13 +19,6 @@ public class BudgetService _logger = logger; } - public async Task GetAvailableBudgetAsync(string module) - { - await using var db = await _dbf.CreateDbContextAsync(); - var b = await db.Budgets.FindAsync(module); - return b is null ? 0m : b.TotalBudget - b.UsedBudget; - } - public async Task ReserveBudgetAsync(string module, decimal amount) { await using var db = await _dbf.CreateDbContextAsync(); diff --git a/src/IBKRTrader.Core/IBKR/IBKRGatewayService.cs b/src/IBKRTrader.Core/IBKR/IBKRGatewayService.cs index 3c4bcb4..fe64450 100644 --- a/src/IBKRTrader.Core/IBKR/IBKRGatewayService.cs +++ b/src/IBKRTrader.Core/IBKR/IBKRGatewayService.cs @@ -119,26 +119,6 @@ public class IBKRGatewayService } } - /// - /// Initialisiert die Brokerage-Session über den Gateway. - /// - public async Task InitBrokerageSessionAsync(CancellationToken ct = default) - { - try - { - await RateLimitAsync(ct); - var body = new StringContent("{\"publish\":true,\"compete\":true}", - System.Text.Encoding.UTF8, "application/json"); - var response = await _http.PostAsync("iserver/auth/ssodh/init", body, ct); - return response.IsSuccessStatusCode; - } - catch (Exception ex) - { - _logger.Warn("IBKR", $"Brokerage-Session-Init fehlgeschlagen: {ex.Message}"); - return false; - } - } - // ─── Contract Search ───────────────────────────────────────────────────── /// @@ -198,33 +178,6 @@ public class IBKRGatewayService } } - /// - /// Sucht Aktien-Contracts nach Symbolen. - /// GET /trsrv/stocks?symbols=AAPL,MSFT - /// - public async Task>?> SearchStocksBySymbolAsync( - string symbols, CancellationToken ct = default) - { - try - { - await RateLimitAsync(ct); - var response = await _http.GetAsync($"trsrv/stocks?symbols={Uri.EscapeDataString(symbols)}", ct); - - if (!response.IsSuccessStatusCode) - { - _logger.Warn("IBKR", $"Stock-Suche fehlgeschlagen: HTTP {(int)response.StatusCode}"); - return null; - } - - return await response.Content.ReadFromJsonAsync>>(JsonOpts, ct); - } - catch (Exception ex) - { - _logger.Error("IBKR", $"Stock-Suche fehlgeschlagen: {ex.Message}", ex); - return null; - } - } - // ─── Historical Market Data ────────────────────────────────────────────── /// @@ -263,12 +216,4 @@ public class IBKRGatewayService return null; } } - - // ─── Disconnect ────────────────────────────────────────────────────────── - - public Task DisconnectAsync() - { - IsConnected = false; - return Task.CompletedTask; - } } diff --git a/src/IBKRTrader.Core/Security/SecretProtection.cs b/src/IBKRTrader.Core/Security/SecretProtection.cs index 714f996..3ae44cf 100644 --- a/src/IBKRTrader.Core/Security/SecretProtection.cs +++ b/src/IBKRTrader.Core/Security/SecretProtection.cs @@ -92,10 +92,6 @@ public static class SecretProtection return Encoding.UTF8.GetString(pt); } - /// True, wenn der Wert bereits im verschlüsselten Format vorliegt. - public static bool IsEncrypted(string? value) => - !string.IsNullOrEmpty(value) && value!.StartsWith(Prefix, StringComparison.Ordinal); - private static byte[] DeriveKey(string raw) { // 32-Byte-Key als Base64? diff --git a/src/IBKRTrader.Core/Trading/Ibkr/IbkrMapping.cs b/src/IBKRTrader.Core/Trading/Ibkr/IbkrMapping.cs index 6b7817e..62bd4ae 100644 --- a/src/IBKRTrader.Core/Trading/Ibkr/IbkrMapping.cs +++ b/src/IBKRTrader.Core/Trading/Ibkr/IbkrMapping.cs @@ -33,10 +33,6 @@ internal static class IbkrMapping return null; } - /// Der zum Handelsmodus passende Gateway-Port. - public static int DefaultPortFor(TradingMode mode) => - mode == TradingMode.Live ? GatewayLivePort : GatewayPaperPort; - /// US-Aktie über die SMART-Route – der einzige Instrumententyp, den die Module handeln. public static Contract Stock(string symbol) => new() { diff --git a/src/IBKRTrader.Core/Trading/TradeHistoryService.cs b/src/IBKRTrader.Core/Trading/TradeHistoryService.cs index 7fd1047..2af16a5 100644 --- a/src/IBKRTrader.Core/Trading/TradeHistoryService.cs +++ b/src/IBKRTrader.Core/Trading/TradeHistoryService.cs @@ -42,13 +42,4 @@ public class TradeHistoryService _logger.Info(module, $"Trade gespeichert: {action} {quantity}x {symbol} @ {price:F2}"); } - - public async Task> GetRecentTradesAsync(int limit = 100) - { - await using var db = await _dbf.CreateDbContextAsync(); - return await db.TradeHistory - .OrderByDescending(t => t.TradedAt) - .Take(limit) - .ToListAsync(); - } } diff --git a/src/IBKRTrader.Hosting/AppHostBuilder.cs b/src/IBKRTrader.Hosting/AppHostBuilder.cs index cb5bfe6..1bffe65 100644 --- a/src/IBKRTrader.Hosting/AppHostBuilder.cs +++ b/src/IBKRTrader.Hosting/AppHostBuilder.cs @@ -1,4 +1,3 @@ -using IBKRTrader.Core.AI; using IBKRTrader.Core.Budget; using IBKRTrader.Core.Configuration; using IBKRTrader.Core.DependencyInjection; @@ -166,7 +165,6 @@ public static class AppHostBuilder services.AddSingleton(); services.AddSingleton(); - services.AddSingleton(); // Datenfundament für Analyse/Forensik (Supervisor): Entscheidungsjournal + Order-Events. services.AddSingleton(); diff --git a/src/IBKRTrader.Modules.CongressTrading/Database/CongressRepository.cs b/src/IBKRTrader.Modules.CongressTrading/Database/CongressRepository.cs index 24adcfb..0d17f6e 100644 --- a/src/IBKRTrader.Modules.CongressTrading/Database/CongressRepository.cs +++ b/src/IBKRTrader.Modules.CongressTrading/Database/CongressRepository.cs @@ -1,4 +1,3 @@ -using IBKRTrader.Core.Logging; using IBKRTrader.Core.Settings; using IBKRTrader.Modules.CongressTrading.Models; using IBKRTrader.Modules.CongressTrading.Persistence.Ef; @@ -14,16 +13,13 @@ public class CongressRepository { private readonly IDbContextFactory _dbf; private readonly CoreSettingsService _settings; - private readonly LoggingService _logger; public CongressRepository( IDbContextFactory dbf, - CoreSettingsService settings, - LoggingService logger) + CoreSettingsService settings) { _dbf = dbf; _settings = settings; - _logger = logger; } // ─── CongressMember ─────────────────────────────────────────────────────── @@ -71,13 +67,6 @@ public class CongressRepository return await db.Trades.AnyAsync(t => t.TradeId == tradeId); } - public async Task> GetAllTradeIdsAsync() - { - await using var db = await _dbf.CreateDbContextAsync(); - var ids = await db.Trades.Select(t => t.TradeId).ToListAsync(); - return ids.ToHashSet(); - } - /// Fügt einen Trade ein, sofern die TradeId noch nicht existiert. public async Task InsertTradeAsync(CongressTrade trade, bool detailsFetched = true) { @@ -133,19 +122,4 @@ public class CongressRepository public Task GetSettingAsync(string key) => _settings.GetAsync(key); public Task SetSettingAsync(string key, string v) => _settings.SetAsync(key, v); public Task DeleteSettingAsync(string key) => _settings.DeleteAsync(key); - - // ─── Reset ──────────────────────────────────────────────────────────────── - - /// Löscht alle CT-Fortschritts-Flags und alle CT-Daten aus der DB. - public async Task ResetHistoryImportAsync() - { - await DeleteSettingAsync("ct.history_import_done"); - await DeleteSettingAsync("ct.history_import_page"); - await DeleteSettingAsync("ct.history_import_total"); - - await using var db = await _dbf.CreateDbContextAsync(); - await db.Trades.ExecuteDeleteAsync(); - await db.Members.ExecuteDeleteAsync(); - _logger.Warn("CT", "History-Import-Reset durchgeführt – alle CT-Daten gelöscht."); - } } diff --git a/src/IBKRTrader.Modules.CongressTrading/Scraper/CapitolTradesScraper.cs b/src/IBKRTrader.Modules.CongressTrading/Scraper/CapitolTradesScraper.cs index 6b02b79..03fc5a9 100644 --- a/src/IBKRTrader.Modules.CongressTrading/Scraper/CapitolTradesScraper.cs +++ b/src/IBKRTrader.Modules.CongressTrading/Scraper/CapitolTradesScraper.cs @@ -9,20 +9,6 @@ namespace IBKRTrader.Modules.CongressTrading.Scraper; // ─── JSON-Modelle (exakte Feldnamen aus dem RSC-Stream) ────────────────────── -internal class CtApiWrapper -{ - [JsonPropertyName("data")] public List? Data { get; set; } - [JsonPropertyName("meta")] public CtMeta? Meta { get; set; } -} - -internal class CtMeta -{ - [JsonPropertyName("totalPages")] public int TotalPages { get; set; } - [JsonPropertyName("pageSize")] public int PageSize { get; set; } - [JsonPropertyName("totalCount")] public int TotalCount { get; set; } - [JsonPropertyName("page")] public int Page { get; set; } -} - internal class CtTrade { [JsonPropertyName("_txId")] public long TxId { get; set; } diff --git a/tests/IBKRTrader.Tests/Modules/CongressRepositoryTests.cs b/tests/IBKRTrader.Tests/Modules/CongressRepositoryTests.cs index 65c276c..f78536a 100644 --- a/tests/IBKRTrader.Tests/Modules/CongressRepositoryTests.cs +++ b/tests/IBKRTrader.Tests/Modules/CongressRepositoryTests.cs @@ -26,7 +26,7 @@ public class CongressRepositoryTests .UseInMemoryDatabase(Guid.NewGuid().ToString()).Options; var settings = new CoreSettingsService(new Factory(coreOpts)); - return new CongressRepository(new Factory(ctOpts), settings, new LoggingService()); + return new CongressRepository(new Factory(ctOpts), settings); } [Fact]