From 195bf49d145cb0ab0cb7e58b2f1ccd35e16e4a3b Mon Sep 17 00:00:00 2001 From: "Torsten Schulz (local)" Date: Mon, 23 Mar 2026 12:21:23 +0100 Subject: [PATCH] Refactor sales processing in DirectorWorker: Aggregate local sales payouts and taxes for improved efficiency. Update `sell_single_inventory_item` to return payout and tax amounts, ensuring accurate financial updates. Enhance money transfer logic to handle aggregated sales data, streamlining financial interactions. --- src/worker/director.rs | 49 +++++++++++++++++++++++++++++++----------- 1 file changed, 36 insertions(+), 13 deletions(-) diff --git a/src/worker/director.rs b/src/worker/director.rs index c74ce48..26cae7f 100644 --- a/src/worker/director.rs +++ b/src/worker/director.rs @@ -563,16 +563,35 @@ impl DirectorWorker { // item.quantity wurde dort bereits aktualisiert } - // Anschließend lokale Verkäufe für die verbleibenden Mengen durchführen. + // Lokale Verkäufe: Geld-Updates gebündelt (eine money_history-Zeile pro Nutzer/Steuer + // statt einer Zeile pro Inventarzeile). + let mut total_payout: f64 = 0.0; + let mut total_tax: f64 = 0.0; for item in items.drain(..) { if item.quantity > 0 { - self.sell_single_inventory_item(&mut conn, &item)?; + let (payout, tax) = self.sell_single_inventory_item(&mut conn, &item)?; + total_payout += payout; + total_tax += tax; } else { // Falls die Menge auf 0 gesetzt wurde, das Inventar ggf. aufräumen. conn.execute("remove_inventory", &[&item.id])?; } } + total_payout = (total_payout * 100.0).round() / 100.0; + total_tax = (total_tax * 100.0).round() / 100.0; + + if total_tax > 0.0 { + let _ = self.base.change_falukant_user_money( + DEFAULT_TREASURY_USER_ID, + total_tax, + &format!("tax from sales branch {}", director.branch_id), + ); + } + if total_payout != 0.0 { + let _ = self.base.change_falukant_user_money(falukant_user_id, total_payout, "sell products"); + } + Ok(()) } @@ -676,14 +695,16 @@ impl DirectorWorker { Ok(cumulative_tax_percent) } + /// Verkauft eine Inventarzeile; Geld fließt erst nach Aggregation in [`start_sellings`]. + /// Rückgabe: `(Auszahlung an Spieler, Steuer ans Finanzamt)` in gleicher Währung wie die DB. fn sell_single_inventory_item( &mut self, conn: &mut DbConnection, item: &InventoryItem, - ) -> Result<(), DbError> { + ) -> Result<(f64, f64), DbError> { if item.quantity <= 0 { conn.execute("remove_inventory", &[&item.id])?; - return Ok(()); + return Ok((0.0, 0.0)); } // compute piece price and full sell price @@ -699,15 +720,17 @@ impl DirectorWorker { let tax_cents = ((profit_cents as f64) * cumulative_tax_percent / 100.0).round() as i64; let payout_cents = revenue_cents - tax_cents; - if tax_cents > 0 { - let tax_amount = (tax_cents as f64) / 100.0; - let _ = self.base.change_falukant_user_money(DEFAULT_TREASURY_USER_ID, tax_amount, &format!("tax from sale product {}", item.product_id)); - } + let tax_amount = if tax_cents > 0 { + (tax_cents as f64) / 100.0 + } else { + 0.0 + }; - let payout_amount = (payout_cents as f64) / 100.0; - if payout_cents != 0 { - let _ = self.base.change_falukant_user_money(item.user_id, payout_amount, "sell products"); - } + let payout_amount = if payout_cents != 0 { + (payout_cents as f64) / 100.0 + } else { + 0.0 + }; eprintln!( "[DirectorWorker] Verkauf: branch_id={}, product_id={}, quantity={}, revenue={:.2}, tax%={:.2}, payout={:.2}, user_id={}", @@ -738,7 +761,7 @@ impl DirectorWorker { ); self.base.broker.publish(message); - Ok(()) + Ok((payout_amount, tax_amount)) } /// Plant ggf. Transporte für ein einzelnes Inventar-Item und gibt die