UI-Restructuring: - TabBar in scan_page durch dedizierte Phasen ersetzt: Sortieren / Beladen / Ausliefern - PhaseBloc + PhaseService leiten Phase aus Tour-/Item-States ab - DeliverySelectionPage (ab 2 Autos) und DeliverySortPage als eigene Flows - LoadingOverviewPage / LoadingCustomerPage für die Beladephase - PhaseStepper-Widget im Home für Phasen-Anzeige - Lager-Differenzierung (Standardlager 0 vs. Außenlager) via WarehouseBadge Process-Stubs: - ProcessRepository für Hold/Cancel/Sort/Assign-Flows (stub, bereit für Backend-Anbindung) Doku: - docs/BACKEND_MIGRATION.md: Phasenplan für Umstellung auf das neue Rust-Backend (OpenAPI-Generator, Keycloak OIDC, Clean-Arch-Layering)
96 lines
4.0 KiB
Dart
96 lines
4.0 KiB
Dart
import 'package:flutter/foundation.dart';
|
|
|
|
/// Repository für prozess-übergreifende Aktionen entlang des
|
|
/// Phasen-Workflows (Sortieren → Beladen → Ausliefern).
|
|
///
|
|
/// Aktuell nur ein Stub: Sobald der entsprechende Backend-Endpunkt
|
|
/// von DOCUcontrol/VARIOcontrol bereitsteht, wird hier die echte
|
|
/// HTTP-Implementierung eingehängt — die Aufrufer (TourBloc) bleiben
|
|
/// dann unverändert.
|
|
class ProcessRepository {
|
|
ProcessRepository();
|
|
|
|
/// Persistiert die vom Fahrer bestätigte Lieferreihenfolge für ein
|
|
/// Fahrzeug am Backend. Wird ausschließlich beim Bestätigen-Button
|
|
/// in der Sortier-Page aufgerufen, nicht bei jedem Drag&Drop —
|
|
/// das lokale Reorder läuft weiterhin nur über ReorderService.
|
|
Future<void> persistDeliveryOrder({
|
|
required String carId,
|
|
required List<String> orderedDeliveryIds,
|
|
}) async {
|
|
// STUB: Echte HTTP-Implementierung folgt, sobald der Endpoint steht.
|
|
await Future.delayed(const Duration(milliseconds: 200));
|
|
debugPrint(
|
|
"ProcessRepository.persistDeliveryOrder (stub) — carId=$carId, "
|
|
"order=$orderedDeliveryIds",
|
|
);
|
|
}
|
|
|
|
/// Hebt die Zuordnung einer Lieferung zu einem Fahrzeug auf. Wird im
|
|
/// Auswahl-Schritt verwendet, wenn der Fahrer eine bereits seinem Auto
|
|
/// zugeordnete Lieferung wieder "freigibt", damit ein Kollege sie
|
|
/// übernehmen kann.
|
|
///
|
|
/// TODO(backend): Echte HTTP-Implementierung sobald der DOCUcontrol-
|
|
/// bzw. VARIOcontrol-Endpoint zum Entfernen der Fahrzeug-Zuordnung
|
|
/// steht. Aktuell nur Stub mit Log, damit der UI-Flow getestet werden
|
|
/// kann; die Tour wird nach diesem Call NICHT automatisch refresht
|
|
/// (das übernimmt später der Stream nach dem echten Endpoint).
|
|
Future<void> unassignDeliveryFromCar({
|
|
required String deliveryId,
|
|
}) async {
|
|
// STUB: Echte HTTP-Implementierung folgt, sobald der Endpoint steht.
|
|
await Future.delayed(const Duration(milliseconds: 200));
|
|
debugPrint(
|
|
"ProcessRepository.unassignDeliveryFromCar (stub) — "
|
|
"deliveryId=$deliveryId",
|
|
);
|
|
}
|
|
|
|
/// Meldet einen vom Fahrer dokumentierten Lieferungs-Abbruch (komplette
|
|
/// Lieferung) an das Backend mit Begründung. Wird zusätzlich zum
|
|
/// bestehenden `cancelDelivery`-Endpoint im [TourRepository] gefeuert,
|
|
/// damit auf Backend-Seite die Stornogründe getrennt geführt werden
|
|
/// können (Reporting / Logistik-Audit).
|
|
///
|
|
/// TODO(backend): Echte HTTP-Implementierung sobald der DOCUcontrol-
|
|
/// Endpoint zum Berichten eines Abbruch-Grunds bereitsteht. Bis dahin
|
|
/// nur Log, damit der UI-Flow geübt werden kann.
|
|
Future<void> reportDeliveryCancelled({
|
|
required String deliveryId,
|
|
required String reason,
|
|
}) async {
|
|
// STUB: Echte HTTP-Implementierung folgt, sobald der Endpoint steht.
|
|
await Future.delayed(const Duration(milliseconds: 200));
|
|
debugPrint(
|
|
"ProcessRepository.reportDeliveryCancelled (stub) — "
|
|
"deliveryId=$deliveryId, reason=$reason",
|
|
);
|
|
}
|
|
|
|
/// Meldet einen einzelnen Artikel oder eine Komponente als "heute nicht
|
|
/// auszuliefern" (Teilabbruch). Der Eintrag bleibt in der Lieferung
|
|
/// bestehen, wird aber im UI ausgegraut und vom Beladen-Fortschritt
|
|
/// ausgeschlossen. [componentId] wird genau dann gesetzt, wenn nur eine
|
|
/// einzelne Stücklisten-Position betroffen ist.
|
|
///
|
|
/// TODO(backend): Echte HTTP-Implementierung sobald der DOCUcontrol-/
|
|
/// VARIOcontrol-Endpoint für "Position zurückhalten" bereitsteht. Bis
|
|
/// dahin wird der Hold-State ausschließlich lokal in der jeweiligen
|
|
/// Beladen-Page gehalten (siehe `LoadingCustomerPage._heldKeys`).
|
|
Future<void> reportItemHeld({
|
|
required String deliveryId,
|
|
required String articleId,
|
|
String? componentId,
|
|
required String reason,
|
|
}) async {
|
|
// STUB: Echte HTTP-Implementierung folgt, sobald der Endpoint steht.
|
|
await Future.delayed(const Duration(milliseconds: 200));
|
|
debugPrint(
|
|
"ProcessRepository.reportItemHeld (stub) — "
|
|
"deliveryId=$deliveryId, articleId=$articleId, "
|
|
"componentId=$componentId, reason=$reason",
|
|
);
|
|
}
|
|
}
|