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.

This commit is contained in:
Torsten Schulz (local)
2025-12-03 16:42:36 +01:00
parent e14272e477
commit d2c8b62156

View File

@@ -378,7 +378,12 @@ impl DirectorWorker {
"[DirectorWorker] Starte Transportprüfung für Director {} (branch_id={})", "[DirectorWorker] Starte Transportprüfung für Director {} (branch_id={})",
director.id, 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 { if director.may_sell {
eprintln!( eprintln!(
@@ -665,8 +670,57 @@ impl DirectorWorker {
Ok(()) Ok(())
} }
fn start_transports_stub(&self, _director: &Director) { fn start_transports_stub(&mut self, director: &Director) -> Result<(), DbError> {
// TODO: Transportlogik bei Bedarf aus dem C++-Code nachziehen. 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<InventoryItem> =
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> { fn start_sellings(&mut self, director: &Director) -> Result<(), DbError> {