- 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>
96 lines
3.2 KiB
Dart
96 lines
3.2 KiB
Dart
import 'package:flutter/material.dart';
|
|
|
|
import 'package:hl_lieferservice/domain/entity/delivery.dart';
|
|
import 'package:hl_lieferservice/domain/entity/tour_details.dart';
|
|
import 'package:hl_lieferservice/feature/delivery/detail/model/delivery_payment_status.dart';
|
|
import 'package:hl_lieferservice/feature/delivery/detail/presentation/widget/delivered_items_card.dart';
|
|
import 'package:hl_lieferservice/feature/delivery/detail/presentation/widget/payment_breakdown_card.dart';
|
|
import 'package:hl_lieferservice/feature/delivery/detail/presentation/widget/payment_record_card.dart';
|
|
|
|
/// Step 6 — Übersicht & Abschluss.
|
|
///
|
|
/// Listet alle Artikel mit der **tatsächlich auszuliefernden Menge** auf,
|
|
/// dazu die Betragsaufstellung und den Stand der Zahlung. Die Zahlungsart
|
|
/// wird nicht mehr hier gewählt, sondern im Step „Zahlung" abgewickelt und
|
|
/// protokolliert — die Übersicht zeigt das Ergebnis nur an.
|
|
///
|
|
/// Der „Unterschreiben"-Button lebt in der Bottom-Navigation des
|
|
/// Page-Wrappers; hier zeigen wir den Resümee-Block, der direkt vor der
|
|
/// Unterschrift steht.
|
|
class StepSummary extends StatelessWidget {
|
|
const StepSummary({super.key, required this.delivery, required this.details});
|
|
|
|
final Delivery delivery;
|
|
final TourDetails details;
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
final status = DeliveryPaymentStatus.of(delivery, details);
|
|
return ListView(
|
|
padding: const EdgeInsets.fromLTRB(16, 16, 16, 24),
|
|
children: [
|
|
const _SectionHeader(text: 'Ausgelieferte Artikel'),
|
|
const SizedBox(height: 8),
|
|
DeliveredItemsCard(delivery: delivery, details: details),
|
|
const SizedBox(height: 24),
|
|
const _SectionHeader(text: 'Zahlung'),
|
|
const SizedBox(height: 8),
|
|
PaymentBreakdownCard(
|
|
status: status,
|
|
credit: details.creditOf(delivery.id),
|
|
),
|
|
const SizedBox(height: 12),
|
|
PaymentRecordCard(status: status),
|
|
const SizedBox(height: 16),
|
|
const _SignHint(),
|
|
],
|
|
);
|
|
}
|
|
}
|
|
|
|
class _SectionHeader extends StatelessWidget {
|
|
const _SectionHeader({required this.text});
|
|
final String text;
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
return Text(
|
|
text,
|
|
style: Theme.of(
|
|
context,
|
|
).textTheme.titleMedium?.copyWith(fontWeight: FontWeight.w700),
|
|
);
|
|
}
|
|
}
|
|
|
|
class _SignHint extends StatelessWidget {
|
|
const _SignHint();
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
final theme = Theme.of(context);
|
|
return Container(
|
|
padding: const EdgeInsets.all(12),
|
|
decoration: BoxDecoration(
|
|
color: theme.colorScheme.primary.withValues(alpha: 0.07),
|
|
borderRadius: BorderRadius.circular(8),
|
|
border: Border.all(
|
|
color: theme.colorScheme.primary.withValues(alpha: 0.3),
|
|
),
|
|
),
|
|
child: Row(
|
|
children: [
|
|
Icon(Icons.draw_outlined, color: theme.colorScheme.primary),
|
|
const SizedBox(width: 10),
|
|
Expanded(
|
|
child: Text(
|
|
'Mit „Unterschreiben" unten schließt der Kunde den Vorgang ab.',
|
|
style: TextStyle(fontSize: 13, color: theme.colorScheme.primary),
|
|
),
|
|
),
|
|
],
|
|
),
|
|
);
|
|
}
|
|
}
|