feat(zahlung): eigener Step "Zahlung" vor der Uebersicht

- Neuer Workflow-Step "Zahlung" zeigt ausgelieferte Artikel mit Menge und
  Preis, Betragsaufstellung, Zahlungsstatus und einen grossen Button
  "Zahlung abwickeln" (fest unten)
- Zahlungs-Modal: grosser offener Betrag, Methoden als Cards aus den
  Backend-Stammdaten, bei EC-Karte gross die Kundennummer; schliesst nur
  ueber Abbrechen, "Zahlung erhalten" oder "Lieferung abbrechen" (mit Grund)
- Bestaetigung wird am Server protokolliert (RecordDeliveryPayment); bis
  dahin sind "Weiter" und die Uebersicht gesperrt, ausser es ist nichts
  offen (bereits bezahlt). Aendert sich der Betrag danach, wird die Zahlung
  als veraltet markiert und muss erneut abgewickelt werden
- Uebersicht zeigt die abgewickelte Zahlung statt eigener Methodenauswahl;
  Unterschrift-Flow ohne doppelte Inkasso-Stufe; Abschluss sendet Methode
  und Inkasso-Flag der gueltigen Zahlung
- DeliveryPaymentStatus als einzige Quelle fuer offenen Betrag
  (gleiche Formel wie Backend); Artikelliste/Betragskarte als geteilte
  Widgets; Begruendungs-Dialog geteilt mit Info-Step
- API-Client aus aktueller Backend-Spec neu generiert
- Tests fuer Zahlungsstatus und Modal

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Dennis Nemec
2026-09-25 14:04:36 +02:00
parent f832b69b9d
commit dd7fe9a8eb
78 changed files with 7466 additions and 874 deletions

View File

@ -0,0 +1,32 @@
/// Protokollierte Zahlungsabwicklung („Abkassieren") einer Lieferung —
/// spiegelt das Backend-Aggregat `DeliveryPayment`.
///
/// Das Backend liefert pro Lieferung nur den jüngsten Eintrag. Der Betrag ist
/// der offene Betrag zum Zeitpunkt der Bestätigung. Ändert sich der offene
/// Betrag danach (z. B. neue Gutschrift), ist der Eintrag veraltet — siehe
/// `DeliveryPaymentStatus`.
class DeliveryPayment {
const DeliveryPayment({
required this.id,
required this.deliveryId,
required this.paymentMethodId,
required this.paymentMethodCode,
required this.amountCents,
required this.recordedAt,
});
final String id;
final String deliveryId;
final String paymentMethodId;
/// Snapshot des Methoden-Codes (`cash`, `ec_card`, `invoice`, …).
final String paymentMethodCode;
/// Abgewickelter Betrag in Cent.
final int amountCents;
final DateTime recordedAt;
/// Bar/EC = vor Ort kassiert. „Auf Rechnung" bleibt offen.
bool get isCollectedOnSite =>
paymentMethodCode == 'cash' || paymentMethodCode == 'ec_card';
}