/// Die expliziten Phasen des Lieferprozesses nach der Fahrzeugauswahl. /// /// Die Reihenfolge im Enum entspricht der logischen Tagesabfolge: /// 1. [auswaehlen] (nur bei Teams mit mehreren Fahrzeugen) /// 2. [sortieren] /// 3. [beladen] /// 4. [ausliefern] /// /// Wichtig: Die Schrittnummer ist NICHT statisch (z. B. "Sortieren = 2"), /// sondern hängt von der für den Fahrer sichtbaren Phasenmenge ab — bei /// Ein-Auto-Teams entfällt [auswaehlen] und [sortieren] wird zu Schritt 1. /// Die Berechnung erfolgt deshalb dynamisch im [PhaseStepper] bzw. in der /// BLoC-Schicht und nicht auf dem Enum selbst. /// /// Der Fahrer darf zwischen bereits erreichten Phasen frei zurückspringen /// — die Phase ist daher kein Zwangs-Stepper, sondern markiert lediglich /// die aktuelle Bühne des Tages. enum DeliveryPhase { /// Aus den Tour-Lieferungen die eigenen Aufträge auswählen / umladen /// (nur bei ≥2 Fahrzeugen im Team relevant). auswaehlen, /// Reihenfolge der Lieferungen festlegen (Drag & Drop). sortieren, /// Beladung mit Scan, geführt nach der gewählten Reihenfolge. beladen, /// Beladung abgeschlossen, Auslieferung läuft. ausliefern, } extension DeliveryPhaseExtension on DeliveryPhase { /// Stabile Schlüssel für die Persistenz. Bewusst entkoppelt von der /// enum-Reihenfolge, damit zukünftige Umbenennungen den Disk-State nicht /// brechen. String get persistenceKey => switch (this) { DeliveryPhase.auswaehlen => "auswaehlen", DeliveryPhase.sortieren => "sortieren", DeliveryPhase.beladen => "beladen", DeliveryPhase.ausliefern => "ausliefern", }; /// Anzeigename für die UI (Banner, Stepper). String get displayName => switch (this) { DeliveryPhase.auswaehlen => "Auswählen", DeliveryPhase.sortieren => "Sortieren", DeliveryPhase.beladen => "Beladen", DeliveryPhase.ausliefern => "Ausliefern", }; /// Schrittnummer (1-basiert) in einer gegebenen Phasen-Sichtbarkeitsliste. /// /// Dynamische Variante, die [stepNumber] (statisch) ersetzt — der Stepper /// erhält je nach Team-Konfiguration eine andere [visiblePhases]-Liste und /// bestimmt darüber, welche Nummer hier angezeigt wird. /// /// Liefert `-1`, wenn die Phase nicht in [visiblePhases] enthalten ist. int stepNumberIn(List visiblePhases) { final idx = visiblePhases.indexOf(this); return idx == -1 ? -1 : idx + 1; } static DeliveryPhase? fromPersistenceKey(String? key) { if (key == null) return null; for (final phase in DeliveryPhase.values) { if (phase.persistenceKey == key) return phase; } return null; } /// Liefert die für den Fahrer sichtbaren Phasen abhängig von der Anzahl /// der Team-Fahrzeuge: /// /// * 0 oder 1 Auto → [sortieren, beladen, ausliefern] /// * ≥2 Autos → [auswaehlen, sortieren, beladen, ausliefern] /// /// Single source of truth für Stepper und Banner. static List visiblePhasesForCarCount(int carCount) { if (carCount >= 2) { return const [ DeliveryPhase.auswaehlen, DeliveryPhase.sortieren, DeliveryPhase.beladen, DeliveryPhase.ausliefern, ]; } return const [ DeliveryPhase.sortieren, DeliveryPhase.beladen, DeliveryPhase.ausliefern, ]; } }