using IBKRTrader.Core.Database; using IBKRTrader.Core.Logging; namespace IBKRTrader.Core.Budget; /// /// Verwaltet das Budget pro Modul. /// Liest/schreibt core_budget. /// public class BudgetService { private readonly DatabaseService _db; private readonly LoggingService _logger; public BudgetService(DatabaseService db, LoggingService logger) { _db = db; _logger = logger; } public async Task GetAvailableBudgetAsync(string module) { var row = await _db.QueryFirstOrDefaultAsync( "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 }); } }