From d2c8b62156197a391b63711f918f5f3cbab4d07b Mon Sep 17 00:00:00 2001 From: "Torsten Schulz (local)" Date: Wed, 3 Dec 2025 16:42:36 +0100 Subject: [PATCH] Implement transport management in DirectorWorker: Enhanced the start_transports_stub function to handle transport planning for inventory items associated with a director. Added error handling for transport initiation and improved database interactions for inventory management, ensuring accurate transport planning and logging of potential errors. --- src/worker/director.rs | 60 +++++++++++++++++++++++++++++++++++++++--- 1 file changed, 57 insertions(+), 3 deletions(-) diff --git a/src/worker/director.rs b/src/worker/director.rs index e949219..15b7271 100644 --- a/src/worker/director.rs +++ b/src/worker/director.rs @@ -378,7 +378,12 @@ impl DirectorWorker { "[DirectorWorker] Starte Transportprüfung für Director {} (branch_id={})", director.id, director.branch_id ); - self.start_transports_stub(&director); + if let Err(err) = self.start_transports_stub(&director) { + eprintln!( + "[DirectorWorker] Fehler bei start_transports für Director {}: {err}", + director.id + ); + } } if director.may_sell { eprintln!( @@ -665,8 +670,57 @@ impl DirectorWorker { Ok(()) } - fn start_transports_stub(&self, _director: &Director) { - // TODO: Transportlogik bei Bedarf aus dem C++-Code nachziehen. + fn start_transports_stub(&mut self, director: &Director) -> Result<(), DbError> { + self.base + .set_current_step("DirectorWorker: start_transports"); + + let mut conn = self + .base + .pool + .get() + .map_err(|e| DbError::new(format!("DB-Verbindung fehlgeschlagen: {e}")))?; + + conn.prepare("get_to_transport", QUERY_GET_INVENTORY)?; + let rows = conn.execute("get_to_transport", &[&director.id, &director.branch_id])?; + + let mut items: Vec = + rows.into_iter().filter_map(Self::map_row_to_inventory_item).collect(); + + // Falls es nichts zu transportieren gibt, können wir sofort zurückkehren. + if items.is_empty() { + return Ok(()); + } + + // Für alle Items dieses Directors sollten die user_id-Felder identisch + // sein (Arbeitgeber des Directors). + let falukant_user_id = items[0].user_id; + + // Lohnende Transporte planen. Dabei werden: + // - ggf. Transport-Einträge erzeugt + // - Inventar-Mengen reduziert + for item in items.iter_mut() { + let shipped = self.plan_transports_for_item( + &mut conn, + falukant_user_id, + item, + )?; + + if shipped > 0 { + if shipped >= item.quantity { + // Alles wurde in Transporte umgewandelt, Inventar komplett entfernen. + conn.prepare("remove_inventory", QUERY_REMOVE_INVENTORY)?; + conn.execute("remove_inventory", &[&item.id])?; + item.quantity = 0; + } else { + // Inventar-Menge in der DB reduzieren und im Item anpassen. + let remaining = item.quantity - shipped; + Self::update_inventory_quantity(&mut conn, item.id, remaining)?; + item.quantity = remaining; + } + } + } + + Ok(()) } fn start_sellings(&mut self, director: &Director) -> Result<(), DbError> {