# Lieferungs-Abschluss: Ablauf & bekannte Themen Dieses Dokument beschreibt den Request-Ablauf, der ausgelöst wird, wenn der Fahrer nach der Unterschrift "Lieferung abschließen" auslöst, sowie bekannte Schwachstellen, die mittelfristig adressiert werden sollten. Stand: 2026-04-26. ## Aufrufkette UI: `SignatureView.onSigned` → `_onSign(customer, driver)` (`lib/feature/delivery/detail/presentation/delivery_detail_page.dart`) BLoC: dispatched `FinishDeliveryEvent` → `TourBloc._finishDelivery` (`lib/feature/delivery/bloc/tour_bloc.dart`) Repository (`lib/feature/delivery/repository/tour_repository.dart`): 1. `uploadDriverSignature(deliveryId, driverSignature)` 2. `uploadCustomerSignature(deliveryId, customerSignature)` 3. `finishDelivery(deliveryId)` Daraus ergeben sich 7 sequenzielle HTTP-Requests (jeweils `await`): | Reihenfolge | HTTP | Endpoint | Zweck | | ----------- | ------ | --------------------------------- | ---------------------------------------------------------------------------------------------------------------- | | 1 | GET | `/v1/uploadFile` | `uploadId` für Fahrer-Signatur holen | | 2 | POST | `/v1/uploadFile/{uploadId}` | Multipart-Upload `delivery_{id}_signature_driver.jpg` | | 3 | PATCH | `/v1/uploadFile/{uploadId}` | Upload commit, liefert `ObjectID` | | 4 | GET | `/v1/uploadFile` | `uploadId` für Kunden-Signatur holen | | 5 | POST | `/v1/uploadFile/{uploadId}` | Multipart-Upload `delivery_{id}_signature_customer.jpg` | | 6 | PATCH | `/v1/uploadFile/{uploadId}` | Upload commit | | 7 | POST | `_web_finishDelivery` | Atomarer Abschluss: setzt `_SV_DELIVERY_STATE = "geliefert"` und `_SV_DELIVERY_DELIVERED_AT = `, räumt entfernte Artikel auf. Body `{ "delivery_id": , "delivered_at": "" }` | Die GET/POST/PATCH-Sequenz pro Signatur (Schritte 1–3 bzw. 4–6) ist vom ERP-/Dokumentenverwaltungssystem so vorgegeben und wird hier **nicht** angepasst. Der frühere zusätzliche Aufruf von `_web_updateDelivery` mit `state = finished` (historisch Schritt 7) ist entfallen: `_web_finishDelivery` setzt State und Lieferzeitpunkt jetzt atomar in einem einzigen `UPDATE` auf `Belegkopf`. ## Offene Punkte ### 1. ~~Doppelter Abschluss-Call~~ — erledigt (2026-04-26) Status: behoben. `_web_updateDelivery` wird im Abschluss-Flow nicht mehr aufgerufen. `_web_finishDelivery` schreibt `_SV_DELIVERY_STATE` und `_SV_DELIVERY_DELIVERED_AT` atomar in einem einzigen `UPDATE` auf `Belegkopf` und führt anschließend `_removeArticles` aus. ### 3. Hartcodierte Sequenz ohne Retry, generisches Error-Reporting Die 7 Requests laufen strikt nacheinander mit `await`. Bei einem Fehler an einer beliebigen Stelle landet der Flow in `TourBloc._handleError` und emittiert eine generische Meldung "Fehler beim Abschließen der Lieferung", ohne den genauen Schritt zu nennen. Risiken: - Partial-Failure-Zustände sind möglich: - Fehler in 1–3: keine Fahrer-Signatur, kein Abschluss. - Fehler in 4–6: Fahrer-Signatur ist hochgeladen, Kunden-Signatur nicht, Lieferung weiterhin offen. - Fehler in 7 (`_web_finishDelivery`): beide Signaturen liegen am ERP, State und Lieferzeitpunkt aber nicht gesetzt — Lieferung bleibt `laufend`. Da der Endpoint atomar ist, gibt es keinen Zwischen-Zustand "State gesetzt, Zeitstempel fehlt" oder umgekehrt. - Schlechtes Netz / Funkloch beim Fahrer ist Realität → Wahrscheinlichkeit ist nicht klein. - Fahrer kann den Schritt blind wiederholen, ohne zu wissen, ob Signaturen schon liegen → potenziell doppelte Bilddateien im DMS. - Diagnose im Support ist mühsam, weil die Fehlermeldung nichts zur Stelle sagt. To-do (mittelfristig): - Pro Repository-Schritt eine eigene, sprechende Fehlermeldung ("Fahrersignatur konnte nicht gespeichert werden", "Kundensignatur …", "Lieferung konnte nicht als abgeschlossen markiert werden"). - Idempotenz prüfen: lassen sich die Schritte 1–6 ohne Doppel-Effekt wiederholen? Falls ja, Retry-Strategie mit exponential backoff für Netzfehler. Falls nein, mit Backend abstimmen. - Server-Sicht "Wurde Schritt X für Lieferung Y schon erledigt?" einbauen, damit ein Wiederaufnehmen nach App-Crash/Neustart möglich ist. - Optional: Outbox-Pattern — Signaturen + Finish-Marker werden lokal persistiert und im Hintergrund hochgeladen, statt blockierend im UI.