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

@ -197,13 +197,3 @@ lib/src/model/update_service_request.dart
lib/src/model/warehouse.dart
lib/src/serializers.dart
pubspec.yaml
test/completed_deliveries_response_test.dart
test/completed_delivery_item_test.dart
test/delivery_details_test.dart
test/delivery_payment_response_test.dart
test/delivery_payment_test.dart
test/pending_review_response_test.dart
test/positions_modified_response_test.dart
test/record_delivery_payment_request_test.dart
test/resolve_review_request_test.dart
test/reviewed_item_response_test.dart

View File

@ -10,6 +10,7 @@ Name | Type | Description | Notes
------------ | ------------- | ------------- | -------------
**acknowledgedNoteIds** | **BuiltList&lt;String&gt;** | Notiz-IDs, die zum Abschlusszeitpunkt sichtbar waren und mit-bestätigt wurden (Audit-Robustheit). | [optional]
**authorCarId** | **String** | Fahrzeug des Akteurs (Audit-Spur). Muss zum Account gehören. | [optional]
**internalNote** | **String** | Optionale interne Notiz des Fahrers, abgefragt nach beiden Unterschriften. Nur für interne Zwecke (Lieferbericht), nicht Teil der Kunden-Bestätigung. Leer/Whitespace = keine Notiz; max. 2000 Zeichen. | [optional]
**notesAcknowledged** | **bool** | „Anmerkungen zur Lieferung zur Kenntnis genommen.\" — Pflicht nur, wenn Notizen existieren (das prüft der Server). | [optional]
**paymentCollected** | **bool** | Inkasso-Bestätigung des Fahrers: „der offene Betrag wurde erhalten (bar) bzw. über das EC-Gerät abgerechnet.\" Pflicht nur, wenn beim Abschluss ein offener Betrag > 0 besteht UND die Methode ein Vor-Ort- Inkasso ist (Bar/EC) — das prüft der Server. Der kassierte Betrag wird server-seitig autoritativ berechnet (nicht vom Client übernommen). | [optional]
**paymentMethodId** | **String** | Optionale Zahlungsmethode, die der Fahrer beim Abschluss gewählt hat. `None` = die am Beleg hinterlegte Methode bleibt. Falls gesetzt, muss sie existieren **und** aktiv sein (vom Server geprüft). | [optional]

View File

@ -14,6 +14,7 @@ part 'complete_delivery_acknowledgements.g.dart';
/// Properties:
/// * [acknowledgedNoteIds] - Notiz-IDs, die zum Abschlusszeitpunkt sichtbar waren und mit-bestätigt wurden (Audit-Robustheit).
/// * [authorCarId] - Fahrzeug des Akteurs (Audit-Spur). Muss zum Account gehören.
/// * [internalNote] - Optionale interne Notiz des Fahrers, abgefragt nach beiden Unterschriften. Nur für interne Zwecke (Lieferbericht), nicht Teil der Kunden-Bestätigung. Leer/Whitespace = keine Notiz; max. 2000 Zeichen.
/// * [notesAcknowledged] - „Anmerkungen zur Lieferung zur Kenntnis genommen.\" — Pflicht nur, wenn Notizen existieren (das prüft der Server).
/// * [paymentCollected] - Inkasso-Bestätigung des Fahrers: „der offene Betrag wurde erhalten (bar) bzw. über das EC-Gerät abgerechnet.\" Pflicht nur, wenn beim Abschluss ein offener Betrag > 0 besteht UND die Methode ein Vor-Ort- Inkasso ist (Bar/EC) — das prüft der Server. Der kassierte Betrag wird server-seitig autoritativ berechnet (nicht vom Client übernommen).
/// * [paymentMethodId] - Optionale Zahlungsmethode, die der Fahrer beim Abschluss gewählt hat. `None` = die am Beleg hinterlegte Methode bleibt. Falls gesetzt, muss sie existieren **und** aktiv sein (vom Server geprüft).
@ -28,6 +29,10 @@ abstract class CompleteDeliveryAcknowledgements implements Built<CompleteDeliver
@BuiltValueField(wireName: r'authorCarId')
String? get authorCarId;
/// Optionale interne Notiz des Fahrers, abgefragt nach beiden Unterschriften. Nur für interne Zwecke (Lieferbericht), nicht Teil der Kunden-Bestätigung. Leer/Whitespace = keine Notiz; max. 2000 Zeichen.
@BuiltValueField(wireName: r'internalNote')
String? get internalNote;
/// „Anmerkungen zur Lieferung zur Kenntnis genommen.\" — Pflicht nur, wenn Notizen existieren (das prüft der Server).
@BuiltValueField(wireName: r'notesAcknowledged')
bool? get notesAcknowledged;
@ -81,6 +86,13 @@ class _$CompleteDeliveryAcknowledgementsSerializer implements PrimitiveSerialize
specifiedType: const FullType.nullable(String),
);
}
if (object.internalNote != null) {
yield r'internalNote';
yield serializers.serialize(
object.internalNote,
specifiedType: const FullType.nullable(String),
);
}
if (object.notesAcknowledged != null) {
yield r'notesAcknowledged';
yield serializers.serialize(
@ -145,6 +157,14 @@ class _$CompleteDeliveryAcknowledgementsSerializer implements PrimitiveSerialize
if (valueDes == null) continue;
result.authorCarId = valueDes;
break;
case r'internalNote':
final valueDes = serializers.deserialize(
value,
specifiedType: const FullType.nullable(String),
) as String?;
if (valueDes == null) continue;
result.internalNote = valueDes;
break;
case r'notesAcknowledged':
final valueDes = serializers.deserialize(
value,

View File

@ -13,6 +13,8 @@ class _$CompleteDeliveryAcknowledgements
@override
final String? authorCarId;
@override
final String? internalNote;
@override
final bool? notesAcknowledged;
@override
final bool? paymentCollected;
@ -28,6 +30,7 @@ class _$CompleteDeliveryAcknowledgements
_$CompleteDeliveryAcknowledgements._(
{this.acknowledgedNoteIds,
this.authorCarId,
this.internalNote,
this.notesAcknowledged,
this.paymentCollected,
this.paymentMethodId,
@ -48,6 +51,7 @@ class _$CompleteDeliveryAcknowledgements
return other is CompleteDeliveryAcknowledgements &&
acknowledgedNoteIds == other.acknowledgedNoteIds &&
authorCarId == other.authorCarId &&
internalNote == other.internalNote &&
notesAcknowledged == other.notesAcknowledged &&
paymentCollected == other.paymentCollected &&
paymentMethodId == other.paymentMethodId &&
@ -59,6 +63,7 @@ class _$CompleteDeliveryAcknowledgements
var _$hash = 0;
_$hash = $jc(_$hash, acknowledgedNoteIds.hashCode);
_$hash = $jc(_$hash, authorCarId.hashCode);
_$hash = $jc(_$hash, internalNote.hashCode);
_$hash = $jc(_$hash, notesAcknowledged.hashCode);
_$hash = $jc(_$hash, paymentCollected.hashCode);
_$hash = $jc(_$hash, paymentMethodId.hashCode);
@ -72,6 +77,7 @@ class _$CompleteDeliveryAcknowledgements
return (newBuiltValueToStringHelper(r'CompleteDeliveryAcknowledgements')
..add('acknowledgedNoteIds', acknowledgedNoteIds)
..add('authorCarId', authorCarId)
..add('internalNote', internalNote)
..add('notesAcknowledged', notesAcknowledged)
..add('paymentCollected', paymentCollected)
..add('paymentMethodId', paymentMethodId)
@ -96,6 +102,10 @@ class CompleteDeliveryAcknowledgementsBuilder
String? get authorCarId => _$this._authorCarId;
set authorCarId(String? authorCarId) => _$this._authorCarId = authorCarId;
String? _internalNote;
String? get internalNote => _$this._internalNote;
set internalNote(String? internalNote) => _$this._internalNote = internalNote;
bool? _notesAcknowledged;
bool? get notesAcknowledged => _$this._notesAcknowledged;
set notesAcknowledged(bool? notesAcknowledged) =>
@ -125,6 +135,7 @@ class CompleteDeliveryAcknowledgementsBuilder
if ($v != null) {
_acknowledgedNoteIds = $v.acknowledgedNoteIds?.toBuilder();
_authorCarId = $v.authorCarId;
_internalNote = $v.internalNote;
_notesAcknowledged = $v.notesAcknowledged;
_paymentCollected = $v.paymentCollected;
_paymentMethodId = $v.paymentMethodId;
@ -154,6 +165,7 @@ class CompleteDeliveryAcknowledgementsBuilder
_$CompleteDeliveryAcknowledgements._(
acknowledgedNoteIds: _acknowledgedNoteIds?.build(),
authorCarId: authorCarId,
internalNote: internalNote,
notesAcknowledged: notesAcknowledged,
paymentCollected: paymentCollected,
paymentMethodId: paymentMethodId,