.NET WinForms-Anwendung (Core, Modules/CongressTrading, UI). Enthaelt .gitignore und settings.example.json als Konfigurationsvorlage. Echte settings.json mit Zugangsdaten ist bewusst ausgeschlossen. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
49 lines
1.4 KiB
C#
49 lines
1.4 KiB
C#
using IBKRTrader.Core.Database;
|
|
using IBKRTrader.Core.Logging;
|
|
|
|
namespace IBKRTrader.Core.Budget;
|
|
|
|
/// <summary>
|
|
/// Verwaltet das Budget pro Modul.
|
|
/// Liest/schreibt core_budget.
|
|
/// </summary>
|
|
public class BudgetService
|
|
{
|
|
private readonly DatabaseService _db;
|
|
private readonly LoggingService _logger;
|
|
|
|
public BudgetService(DatabaseService db, LoggingService logger)
|
|
{
|
|
_db = db;
|
|
_logger = logger;
|
|
}
|
|
|
|
public async Task<decimal> GetAvailableBudgetAsync(string module)
|
|
{
|
|
var row = await _db.QueryFirstOrDefaultAsync<dynamic>(
|
|
"SELECT total_budget, used_budget FROM `core_budget` WHERE module = @module",
|
|
new { module });
|
|
|
|
if (row == null) return 0;
|
|
return (decimal)row.total_budget - (decimal)row.used_budget;
|
|
}
|
|
|
|
public async Task ReserveBudgetAsync(string module, decimal amount)
|
|
{
|
|
await _db.ExecuteAsync(
|
|
@"INSERT INTO `core_budget` (module, used_budget)
|
|
VALUES (@module, @amount)
|
|
ON DUPLICATE KEY UPDATE used_budget = used_budget + @amount",
|
|
new { module, amount });
|
|
}
|
|
|
|
public async Task ReleaseBudgetAsync(string module, decimal amount)
|
|
{
|
|
await _db.ExecuteAsync(
|
|
@"UPDATE `core_budget`
|
|
SET used_budget = GREATEST(0, used_budget - @amount)
|
|
WHERE module = @module",
|
|
new { module, amount });
|
|
}
|
|
}
|