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:
@@ -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<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> {
|
||||
|
||||
Reference in New Issue
Block a user