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)
58 lines
2.1 KiB
Dart
58 lines
2.1 KiB
Dart
import 'package:hl_lieferservice/feature/delivery/model/delivery_phase.dart';
|
|
import 'package:shared_preferences/shared_preferences.dart';
|
|
|
|
/// Persistiert die aktuelle Phase pro Fahrzeug. Der Key ist datumsspezifisch,
|
|
/// damit ein App-Neustart am nächsten Tag automatisch wieder mit Phase 1
|
|
/// (Sortieren) startet — die Phase eines Vortags hat keine Bedeutung mehr.
|
|
///
|
|
/// Zusätzlich wird die **höchste am Tag erreichte Phase** pro Fahrzeug
|
|
/// persistiert (eigener Key-Suffix `_max`). Der Stepper nutzt diesen Wert,
|
|
/// um Vorwärts-Sprünge auf bereits besuchte Phasen zu erlauben — auch wenn
|
|
/// der Fahrer zwischenzeitlich zurückgesprungen ist.
|
|
class PhaseService {
|
|
static const _prefix = "delivery_phase";
|
|
|
|
String _key(String carId) {
|
|
final now = DateTime.now();
|
|
final date = "${now.year}_${now.month}_${now.day}";
|
|
return "${_prefix}_${date}_$carId";
|
|
}
|
|
|
|
String _maxKey(String carId) {
|
|
final now = DateTime.now();
|
|
final date = "${now.year}_${now.month}_${now.day}";
|
|
return "${_prefix}_max_${date}_$carId";
|
|
}
|
|
|
|
Future<void> save(String carId, DeliveryPhase phase) async {
|
|
final prefs = await SharedPreferences.getInstance();
|
|
await prefs.setString(_key(carId), phase.persistenceKey);
|
|
}
|
|
|
|
Future<DeliveryPhase?> load(String carId) async {
|
|
final prefs = await SharedPreferences.getInstance();
|
|
return DeliveryPhaseExtension.fromPersistenceKey(prefs.getString(_key(carId)));
|
|
}
|
|
|
|
Future<void> saveMax(String carId, DeliveryPhase phase) async {
|
|
final prefs = await SharedPreferences.getInstance();
|
|
await prefs.setString(_maxKey(carId), phase.persistenceKey);
|
|
}
|
|
|
|
Future<DeliveryPhase?> loadMax(String carId) async {
|
|
final prefs = await SharedPreferences.getInstance();
|
|
return DeliveryPhaseExtension.fromPersistenceKey(
|
|
prefs.getString(_maxKey(carId)),
|
|
);
|
|
}
|
|
|
|
Future<Map<String, DeliveryPhase>> loadAll(Iterable<String> carIds) async {
|
|
final result = <String, DeliveryPhase>{};
|
|
for (final carId in carIds) {
|
|
final phase = await load(carId);
|
|
if (phase != null) result[carId] = phase;
|
|
}
|
|
return result;
|
|
}
|
|
}
|