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={})",
|
"[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> {
|
||||||
|
|||||||
Reference in New Issue
Block a user