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:
@ -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,
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user