Alles Entfernte war nachweislich ohne Aufrufer. Build, 198/198 Tests, Smoke-UI
und Daemon-Prueflauf sind vor und nach jedem Schritt gruen.
Code:
- AIModelService: Platzhalter, der immer 0.5 lieferte. Im DI registriert,
aber nie irgendwo injiziert. Ordner Core/AI faellt mit weg.
- CtApiWrapper + CtMeta: JSON-Modelle fuer einen {data,meta}-Umschlag, den
CapitolTrades nicht mehr liefert. Der Scraper deserialisiert seit laengerem
direkt List<CtTrade>.
- IBKRGatewayService: DisconnectAsync, InitBrokerageSessionAsync und
SearchStocksBySymbolAsync. Der Dienst selbst bleibt - er versorgt
Instrument-Sync, Kurshistorie und den Watchdog-Heartbeat.
- Je eine Methode ohne Aufrufer: BudgetService.GetAvailableBudgetAsync,
TradeHistoryService.GetRecentTradesAsync, CongressRepository.
GetAllTradeIdsAsync und .ResetHistoryImportAsync, IbkrMapping.DefaultPortFor,
SecretProtection.IsEncrypted.
- CongressRepository bekam damit einen LoggingService injiziert, den es nicht
mehr benutzt - Abhaengigkeit samt Konstruktorparameter raus.
Ressourcen:
- 17 Symbole der WinForms-Oberflaeche entfernt. Das Wildcard-Muster im csproj
nahm sie in die Binaerdatei auf, ViewIcons.cs bildet aber nur sieben
Schluessel ab. Resources/ enthaelt jetzt genau die sieben.
NuGet-Allowlist:
- Dapper und HtmlAgilityPack sind seit R3 bzw. R1 aus dem Projekt raus,
Microsoft.WindowsDesktop.* seit L5. Muster entfernt.
- MySqlConnector und Newtonsoft.Json stehen NUR transitiv in den
Projektdateien und wurden zuerst mitentfernt - ein Restore in einen leeren
Paket-Ordner scheiterte darauf mit NU1100. Beide wieder aufgenommen, jetzt
mit Begruendung, damit der naechste Aufraeumlauf nicht dieselbe Falle tritt.
Dokumente an den tatsaechlichen Stand angeglichen:
- ARCHITECTURE: R2 fuehrte die Umstellung auf IHostedService als offen, obwohl
R4 sie erledigt hat. L6 und die Deploymentcenter-Phase fehlten ganz.
- DC-Konzept: Schritte 0-8 standen auf "dieser Durchlauf", sind aber umgesetzt.
Jetzt je Schritt der wirkliche Stand - inklusive der beiden Halbfertigen:
Update-PRUEFUNG laeuft, das Anwenden hat keinen Aufrufer; die
Release-Pipeline steht, ist aber nie gelaufen. P5 ist eingetreten.
- Accounting und Supervisor trugen keinen Umsetzungsvermerk, obwohl beide
Module gebaut sind. Vermerk nach dem Muster des Linux-Konzepts ergaenzt,
mit dem, was jeweils offen bleibt.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
48 lines
1.4 KiB
C#
48 lines
1.4 KiB
C#
using IBKRTrader.Core.Logging;
|
|
using IBKRTrader.Core.Persistence.Ef;
|
|
using IBKRTrader.Core.Persistence.Entities;
|
|
using Microsoft.EntityFrameworkCore;
|
|
|
|
namespace IBKRTrader.Core.Budget;
|
|
|
|
/// <summary>
|
|
/// Verwaltet das Budget pro Modul (Tabelle core_budget) via EF Core.
|
|
/// </summary>
|
|
public class BudgetService
|
|
{
|
|
private readonly IDbContextFactory<CoreDbContext> _dbf;
|
|
private readonly LoggingService _logger;
|
|
|
|
public BudgetService(IDbContextFactory<CoreDbContext> dbf, LoggingService logger)
|
|
{
|
|
_dbf = dbf;
|
|
_logger = logger;
|
|
}
|
|
|
|
public async Task ReserveBudgetAsync(string module, decimal amount)
|
|
{
|
|
await using var db = await _dbf.CreateDbContextAsync();
|
|
var b = await db.Budgets.FindAsync(module);
|
|
if (b is null)
|
|
{
|
|
db.Budgets.Add(new CoreBudget { Module = module, UsedBudget = amount, UpdatedAt = DateTime.UtcNow });
|
|
}
|
|
else
|
|
{
|
|
b.UsedBudget += amount;
|
|
b.UpdatedAt = DateTime.UtcNow;
|
|
}
|
|
await db.SaveChangesAsync();
|
|
}
|
|
|
|
public async Task ReleaseBudgetAsync(string module, decimal amount)
|
|
{
|
|
await using var db = await _dbf.CreateDbContextAsync();
|
|
var b = await db.Budgets.FindAsync(module);
|
|
if (b is null) return;
|
|
b.UsedBudget = Math.Max(0m, b.UsedBudget - amount);
|
|
b.UpdatedAt = DateTime.UtcNow;
|
|
await db.SaveChangesAsync();
|
|
}
|
|
}
|