use chrono::{DateTime, NaiveDate, Utc}; use serde::{Deserialize, Serialize}; use uuid::Uuid; /// Phasen des geführten Tagesablaufs eines Fahrers. /// /// Die Reihenfolge der Varianten entspricht dem natürlichen Fortschritt; /// `PartialOrd`/`Ord` werden derived, sodass `current < max_reached` /// als „besucht"-Check funktioniert. /// /// `Auswaehlen` ist optional und nur sichtbar bei Accounts mit mehreren /// Fahrzeugen — die Eintrittsphase bei einem Ein-Auto-Account ist /// `Sortieren`. #[derive( Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq, Hash, PartialOrd, Ord, )] #[cfg_attr(feature = "openapi", derive(utoipa::ToSchema))] #[serde(rename_all = "snake_case")] pub enum DeliveryPhase { Auswaehlen, Sortieren, Beladen, Ausliefern, } /// Prozess-State pro Fahrzeug pro Tag. Trägt sowohl die aktuelle Phase /// als auch die höchste je erreichte Phase — damit Rück- und /// Vorwärtssprünge zwischen besuchten Phasen erlaubt sind. /// /// `sorting_order` ist die in der Sortier-Phase festgelegte /// Auslieferungsreihenfolge (Liste von [`crate::domain::Delivery`]-IDs). /// Bei der Beladung wird sie umgekehrt benutzt (letzte Lieferung zuerst /// ins Auto). #[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[cfg_attr(feature = "openapi", derive(utoipa::ToSchema))] #[serde(rename_all = "camelCase")] pub struct DeliveryProcessState { pub id: Uuid, pub car_id: Uuid, pub date: NaiveDate, pub current_phase: DeliveryPhase, pub max_reached_phase: DeliveryPhase, pub sorting_order: Vec, /// Gesetzt sobald die Sortierung bestätigt wurde — markiert den /// Übergang von `Sortieren` nach `Beladen` als „offiziell". pub confirmed_at: Option>, }