feat(abschluss): interne Notiz nach den Unterschriften abfragen

- Nach "Abschliessen" oeffnet sich ein Blatt "Interne Notiz" (optional,
  max. 2000 Zeichen). Ohne Eingabe genuegt ein Tipp auf "Ohne Notiz
  abschliessen"; "Zurueck zur Unterschrift" bricht nur das Abschliessen ab
- Die Notiz reist im Abschluss-Aufruf mit (internalNote) und landet im
  Lieferbericht, nicht in den Kunden-Notizen
- API-Client aus aktueller Backend-Spec neu generiert
- Widget-Tests fuer das Blatt

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Dennis Nemec
2026-09-25 14:52:51 +02:00
parent dd7fe9a8eb
commit 6b934e4534
13 changed files with 268 additions and 11 deletions

View File

@ -7,6 +7,7 @@ import 'package:signature/signature.dart';
import 'package:hl_lieferservice/domain/entity/delivery.dart';
import 'package:hl_lieferservice/domain/entity/delivery_note.dart';
import 'package:hl_lieferservice/domain/entity/tour_details.dart';
import 'package:hl_lieferservice/feature/delivery/detail/presentation/widget/internal_note_sheet.dart';
/// Daten, die der Abschluss-Flow an den Aufrufer zurückgibt: beide
/// Unterschriften als PNG plus die dokumentierten Bestätigungen des Kunden.
@ -17,6 +18,7 @@ class SignatureResult {
required this.receiptConfirmed,
required this.notesAcknowledged,
required this.acknowledgedNoteIds,
this.internalNote,
});
final Uint8List customerSignaturePng;
@ -24,6 +26,10 @@ class SignatureResult {
final bool receiptConfirmed;
final bool notesAcknowledged;
final List<String> acknowledgedNoteIds;
/// Optionale interne Notiz des Fahrers, abgefragt nach beiden
/// Unterschriften. `null` = keine.
final String? internalNote;
}
/// Mehrstufiger Unterschrift-Flow zum Abschließen einer Lieferung.
@ -34,7 +40,8 @@ class SignatureResult {
/// Stufe 1 (Kunde): sieht die Anmerkungen zur Lieferung, hakt zwei
/// Bestätigungen ab (Anmerkungen-Kenntnisnahme — nur Pflicht, wenn Notizen
/// vorhanden; Empfangsbestätigung — immer Pflicht) und unterschreibt.
/// Stufe 2 (Fahrer): unterschreibt.
/// Stufe 2 (Fahrer): unterschreibt. Danach fragt ein Blatt optional eine
/// interne Notiz ab (nur für den Lieferbericht, nicht für den Kunden).
///
/// Erst nach beiden Unterschriften ruft die View [onSigned] mit dem
/// vollständigen [SignatureResult] auf — der Aufrufer triggert dann den
@ -133,6 +140,11 @@ class _SignatureViewState extends State<SignatureView> {
final customerPng = await _customerController.toPngBytes();
final driverPng = await _driverController.toPngBytes();
if (customerPng == null || driverPng == null) return;
if (!mounted) return;
// Nach beiden Unterschriften: optional interne Notiz. „Zurück" im
// Blatt bricht nur das Abschließen ab, die Unterschriften bleiben.
final decision = await showInternalNoteSheet(context);
if (decision == null || !mounted) return;
widget.onSigned(
SignatureResult(
customerSignaturePng: customerPng,
@ -141,6 +153,7 @@ class _SignatureViewState extends State<SignatureView> {
notesAcknowledged: _notesEmpty ? false : _notesAccepted,
acknowledgedNoteIds:
_notesEmpty ? const [] : _notes.map((n) => n.id).toList(),
internalNote: decision.note,
),
);
}