diff --git a/src/worker/transport.rs b/src/worker/transport.rs index 48ed1e9..8da4ca4 100644 --- a/src/worker/transport.rs +++ b/src/worker/transport.rs @@ -11,7 +11,7 @@ use super::base::{BaseWorker, Worker, WorkerState}; struct ArrivedTransport { id: i32, branch_id: i32, - product_id: i32, + product_id: Option, // NULL für leere Transporte size: i32, vehicle_id: i32, distance: f64, @@ -163,12 +163,25 @@ impl TransportWorker { for row in rows { let id = parse_i32(&row, "id", -1); let branch_id = parse_i32(&row, "branch_id", -1); - let product_id = parse_i32(&row, "product_id", -1); + // product_id kann NULL sein (für leere Transporte) + let product_id_str = row.get("product_id"); + let product_id = product_id_str + .and_then(|v| v.parse::().ok()); let size = parse_i32(&row, "size", 0); let vehicle_id = parse_i32(&row, "vehicle_id", -1); let distance = parse_f64(&row, "distance", 0.0); - if id >= 0 && branch_id >= 0 && product_id >= 0 && vehicle_id >= 0 && size > 0 { + // Für normale Transporte: product_id muss vorhanden sein und size > 0 + // Für leere Transporte: product_id ist NULL und size = 0 + let is_valid = if product_id.is_some() { + // Normaler Transport mit Produkt + id >= 0 && branch_id >= 0 && vehicle_id >= 0 && size > 0 + } else { + // Leerer Transport (ohne Produkt) + id >= 0 && branch_id >= 0 && vehicle_id >= 0 && size == 0 + }; + + if is_valid { result.push(ArrivedTransport { id, branch_id, @@ -184,10 +197,24 @@ impl TransportWorker { } fn handle_arrived_transport(pool: &ConnectionPool, t: &ArrivedTransport) -> Result<(), DbError> { + // Leere Transporte (ohne Produkt) werden anders behandelt + if t.product_id.is_none() { + // Leerer Transport: Nur Fahrzeug-Region aktualisieren und Transport löschen + eprintln!( + "[TransportWorker] Leerer Transport {} angekommen: Fahrzeug {} zurückgeholt", + t.id, t.vehicle_id + ); + Self::update_vehicle_after_transport(pool, t.vehicle_id, t.branch_id, t.distance)?; + Self::delete_transport(pool, t.id)?; + return Ok(()); + } + + // Normaler Transport mit Produkt: // 1) Waren in das Ziel-Branch-Lager einbuchen – wir erhalten die // tatsächlich verbleibende Menge im Transportmittel zurück. + let product_id = t.product_id.unwrap(); let remaining_quantity = - Self::add_to_inventory(pool, t.branch_id, t.product_id, t.size)?; + Self::add_to_inventory(pool, t.branch_id, product_id, t.size)?; let delivered = t.size.saturating_sub(remaining_quantity); @@ -214,7 +241,7 @@ impl TransportWorker { if let Err(err) = Self::insert_transport_waiting_notification( pool, user_id, - t.product_id, + product_id, remaining_quantity, ) { eprintln!(