Files
Holzleitner-Lieferservice-App/lib/feature/delivery/repository/process_repository.dart
Dennis Nemec 456fb59668 Phasenbasierte Lieferübersicht + Beladen-Flow, plus Migrationsplan für Rust-Backend
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)
2026-05-14 22:27:56 +02:00

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",
);
}
}