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:
@ -7,6 +7,7 @@ import 'package:uuid/uuid.dart';
|
||||
import 'package:hl_lieferservice/data/cache/attachment_cache.dart';
|
||||
import 'package:hl_lieferservice/domain/entity/delivery.dart';
|
||||
import 'package:hl_lieferservice/domain/entity/delivery_credit.dart';
|
||||
import 'package:hl_lieferservice/domain/entity/delivery_payment.dart';
|
||||
import 'package:hl_lieferservice/domain/entity/delivery_item.dart';
|
||||
import 'package:hl_lieferservice/domain/entity/delivery_note.dart';
|
||||
import 'package:hl_lieferservice/domain/entity/delivery_service_value.dart';
|
||||
@ -50,6 +51,7 @@ class TourBloc extends Bloc<TourEvent, TourState> {
|
||||
on<UploadDeliveryNoteImage>(_onUploadDeliveryNoteImage);
|
||||
on<SetDeliveryCredit>(_onSetDeliveryCredit);
|
||||
on<RemoveDeliveryCredit>(_onRemoveDeliveryCredit);
|
||||
on<RecordDeliveryPayment>(_onRecordDeliveryPayment);
|
||||
on<SetDeliveryServiceValue>(_onSetDeliveryServiceValue);
|
||||
on<RemoveDeliveryServiceValue>(_onRemoveDeliveryServiceValue);
|
||||
}
|
||||
@ -613,6 +615,45 @@ class TourBloc extends Bloc<TourEvent, TourState> {
|
||||
}
|
||||
}
|
||||
|
||||
// ─── Zahlungsabwicklung ──────────────────────────────────────────────
|
||||
|
||||
/// Protokolliert die Zahlung. Bewusst NICHT optimistisch: Der Server
|
||||
/// berechnet den Betrag autoritativ und kann ablehnen (z. B. Betrag hat
|
||||
/// sich zwischenzeitlich geändert). Erst die Server-Antwort gibt den
|
||||
/// Zahlungs-Step frei.
|
||||
Future<void> _onRecordDeliveryPayment(
|
||||
RecordDeliveryPayment event,
|
||||
Emitter<TourState> emit,
|
||||
) async {
|
||||
if (state is! TourLoaded) return;
|
||||
|
||||
opBloc.add(StartOperation(message: 'Zahlung wird protokolliert …'));
|
||||
try {
|
||||
final payment = await tourRepository.recordDeliveryPayment(
|
||||
deliveryId: event.deliveryId,
|
||||
clientEventId: _uuid.v4(),
|
||||
paymentMethodId: event.paymentMethodId,
|
||||
expectedAmountCents: event.expectedAmountCents,
|
||||
actorCarId: event.actorCarId,
|
||||
);
|
||||
final latest = state;
|
||||
if (latest is TourLoaded) {
|
||||
final next = Map<String, DeliveryPayment>.from(
|
||||
latest.details.paymentsByDeliveryId,
|
||||
)..[event.deliveryId] = payment;
|
||||
emit(latest.copyWith(
|
||||
details: latest.details.copyWith(paymentsByDeliveryId: next),
|
||||
));
|
||||
}
|
||||
opBloc.add(FinishOperation(message: 'Zahlung protokolliert'));
|
||||
} catch (e, st) {
|
||||
debugPrint('TourBloc.RecordDeliveryPayment fehlgeschlagen: $e\n$st');
|
||||
opBloc.add(FailOperation(
|
||||
message: _messageOf(e, 'Zahlung konnte nicht protokolliert werden'),
|
||||
));
|
||||
}
|
||||
}
|
||||
|
||||
// ─── Betrags-Gutschrift ──────────────────────────────────────────────
|
||||
|
||||
/// Tauscht die Gutschrift einer Lieferung im Aggregat aus (`null` = entfernt).
|
||||
|
||||
Reference in New Issue
Block a user