Added components to article

This commit is contained in:
Dennis Nemec
2026-05-11 17:12:05 +02:00
parent 2470299a10
commit ac6b03227d
37 changed files with 1189 additions and 513 deletions

View File

@ -43,6 +43,7 @@ class TourBloc extends Bloc<TourEvent, TourState> {
on<AssignCarEvent>(_assignCar);
on<IncrementArticleScanAmount>(_increment);
on<ScanArticleEvent>(_scan);
on<ScanComponentEvent>(_scanComponent);
on<HoldDeliveryEvent>(_holdDelivery);
on<CancelDeliveryEvent>(_cancelDelivery);
on<ReactivateDeliveryEvent>(_reactivateDelivery);
@ -82,6 +83,7 @@ class TourBloc extends Bloc<TourEvent, TourState> {
) async {
final currentState = state;
if (currentState is TourLoaded) {
opBloc.add(StartOperation());
try {
await tourRepository.setArticleAmount(
event.deliveryId,
@ -89,6 +91,7 @@ class TourBloc extends Bloc<TourEvent, TourState> {
event.amount,
event.reason,
);
opBloc.add(FinishOperation());
} catch (e, st) {
debugPrint("$e $st");
_handleError(e, "Fehler beim Ändern der Menge des Artikels");
@ -131,8 +134,6 @@ class TourBloc extends Bloc<TourEvent, TourState> {
) async {
Map<String, double> distances = {};
emit(TourRequestingDistances(tour: event.tour, payments: event.payments));
for (final delivery in event.tour.deliveries) {
try {
distances[delivery.id] = await DistanceService.getDistanceByRoad(
@ -141,22 +142,14 @@ class TourBloc extends Bloc<TourEvent, TourState> {
} catch (e, st) {
debugPrint("Fehler beim Laden der Distanz: $e");
debugPrint("$st");
// set the distance to none in order to handle the error case
// afterwards for that specific delivery
distances[delivery.id] = double.nan;
}
}
// If an error occurred, then the distances will be empty
// If the distances are empty then they shouldn't be displayed
add(
RequestSortingInformationEvent(
tour: event.tour,
payments: event.payments,
distances: distances,
),
);
final currentState = state;
if (currentState is TourLoaded) {
emit(currentState.copyWith(distances: distances));
}
}
void _requestSortingInformation(
@ -217,9 +210,10 @@ class TourBloc extends Bloc<TourEvent, TourState> {
tour: event.tour,
paymentOptions: event.payments,
sortingInformation: container,
distances: event.distances,
),
);
add(RequestDeliveryDistanceEvent(tour: event.tour));
}
void _updated(TourUpdated event, Emitter<TourState> emit) {
@ -235,14 +229,14 @@ class TourBloc extends Bloc<TourEvent, TourState> {
paymentOptions: payments,
distances: Map<String, double>.from(currentState.distances ?? {}),
sortingInformation: currentState.sortingInformation,
pendingScanRequests: currentState.pendingScanRequests,
),
);
}
// Download distances if tour has previously fetched by API
if (currentState is TourLoading) {
add(
RequestDeliveryDistanceEvent(tour: tour.copyWith(), payments: payments),
RequestSortingInformationEvent(tour: tour.copyWith(), payments: payments),
);
}
}
@ -253,8 +247,10 @@ class TourBloc extends Bloc<TourEvent, TourState> {
) async {
final currentState = state;
if (currentState is TourLoaded) {
opBloc.add(StartOperation());
try {
await tourRepository.reactivateDelivery(event.deliveryId);
opBloc.add(FinishOperation());
} catch (e, st) {
debugPrint("$e $st");
_handleError(e, "Fehler beim Zurückstellen der Lieferung");
@ -265,8 +261,10 @@ class TourBloc extends Bloc<TourEvent, TourState> {
void _holdDelivery(HoldDeliveryEvent event, Emitter<TourState> emit) async {
final currentState = state;
if (currentState is TourLoaded) {
opBloc.add(StartOperation());
try {
await tourRepository.holdDelivery(event.deliveryId);
opBloc.add(FinishOperation());
} catch (e, st) {
debugPrint("$e $st");
_handleError(e, "Fehler beim Zurückstellen der Lieferung");
@ -280,8 +278,10 @@ class TourBloc extends Bloc<TourEvent, TourState> {
) async {
final currentState = state;
if (currentState is TourLoaded) {
opBloc.add(StartOperation());
try {
await tourRepository.cancelDelivery(event.deliveryId);
opBloc.add(FinishOperation());
} catch (e, st) {
debugPrint("$e $st");
_handleError(e, "Fehler beim Stornieren der Lieferung");
@ -289,10 +289,58 @@ class TourBloc extends Bloc<TourEvent, TourState> {
}
}
void _bumpPendingScans(Emitter<TourState> emit, int delta) {
final currentState = state;
if (currentState is TourLoaded) {
final next = (currentState.pendingScanRequests + delta).clamp(0, 1 << 30);
emit(currentState.copyWith(pendingScanRequests: next));
}
}
void _scanComponent(
ScanComponentEvent event,
Emitter<TourState> emit,
) async {
final currentState = state;
if (currentState is TourLoaded) {
_bumpPendingScans(emit, 1);
try {
switch (await tourRepository.scanComponent(
event.deliveryId,
event.carId,
event.componentArticleNumber,
)) {
case ScanResult.scanned:
opBloc.add(FinishOperation(message: 'Komponente gescannt'));
break;
case ScanResult.alreadyScanned:
opBloc.add(
FailOperation(message: 'Komponente wurde bereits gescannt'),
);
break;
case ScanResult.notFound:
opBloc.add(
FailOperation(
message: 'Komponente ist für keine Lieferung vorgesehen',
),
);
break;
}
} catch (e, st) {
debugPrint("FEHLER beim Scannen einer Komponente: $e $st");
_handleError(e, "Fehler beim Scannen der Komponente");
} finally {
_bumpPendingScans(emit, -1);
}
}
}
void _scan(ScanArticleEvent event, Emitter<TourState> emit) async {
final currentState = state;
if (currentState is TourLoaded) {
_bumpPendingScans(emit, 1);
try {
switch (await tourRepository.scanArticle(
event.deliveryId,
@ -318,6 +366,8 @@ class TourBloc extends Bloc<TourEvent, TourState> {
} catch (e, st) {
debugPrint("FEHLER beim Scannen eines Artikels: $e $st");
_handleError(e, "Fehler beim Scannen des Artikels");
} finally {
_bumpPendingScans(emit, -1);
}
}
}
@ -329,6 +379,7 @@ class TourBloc extends Bloc<TourEvent, TourState> {
final currentState = state;
if (currentState is TourLoaded) {
_bumpPendingScans(emit, 1);
try {
await tourRepository.scanArticle(
event.deliveryId,
@ -338,6 +389,8 @@ class TourBloc extends Bloc<TourEvent, TourState> {
} catch (e, st) {
debugPrint("$e $st");
_handleError(e, "Fehler beim Scannen des Artikels");
} finally {
_bumpPendingScans(emit, -1);
}
}
}
@ -345,8 +398,10 @@ class TourBloc extends Bloc<TourEvent, TourState> {
Future<void> _assignCar(AssignCarEvent event, Emitter<TourState> emit) async {
final currentState = state;
if (currentState is TourLoaded) {
opBloc.add(StartOperation());
try {
await tourRepository.assignCar(event.deliveryId, event.carId);
opBloc.add(FinishOperation());
} catch (e, st) {
debugPrint("$e $st");
_handleError(e, "Fehler beim Zuweisen des Fahrzeugs");
@ -376,6 +431,7 @@ class TourBloc extends Bloc<TourEvent, TourState> {
final currentState = state;
if (currentState is TourLoaded) {
opBloc.add(StartOperation(message: "Lieferung wird abgeschlossen…"));
try {
await tourRepository.uploadDriverSignature(
event.deliveryId,
@ -387,6 +443,7 @@ class TourBloc extends Bloc<TourEvent, TourState> {
);
await tourRepository.finishDelivery(event.deliveryId);
opBloc.add(FinishOperation(message: "Lieferung abgeschlossen"));
} catch (e, st) {
debugPrint("$e $st");
_handleError(e, "Fehler beim Abschließen der Lieferung");
@ -398,8 +455,10 @@ class TourBloc extends Bloc<TourEvent, TourState> {
UpdateSelectedPaymentMethodEvent event,
Emitter<TourState> emit,
) async {
opBloc.add(StartOperation());
try {
await tourRepository.updatePayment(event.deliveryId, event.payment);
opBloc.add(FinishOperation());
} catch (e, st) {
debugPrint("$e $st");
_handleError(e, "Fehler beim Aktualisieren des Betrags");
@ -410,12 +469,14 @@ class TourBloc extends Bloc<TourEvent, TourState> {
UpdateDeliveryOptionEvent event,
Emitter<TourState> emit,
) async {
opBloc.add(StartOperation());
try {
await tourRepository.updateOption(
event.deliveryId,
event.key,
event.value,
);
opBloc.add(FinishOperation());
} catch (e, st) {
debugPrint("$e $st");
_handleError(e, "Fehler beim Aktualisieren der Optionen");
@ -426,12 +487,14 @@ class TourBloc extends Bloc<TourEvent, TourState> {
UpdateDiscountEvent event,
Emitter<TourState> emit,
) async {
opBloc.add(StartOperation());
try {
await tourRepository.updateDiscount(
event.deliveryId,
event.reason,
event.value,
);
opBloc.add(FinishOperation());
} catch (e, st) {
debugPrint("Fehler beim Aktualisieren des Discounts: $e $st");
_handleError(e, "Fehler beim Aktualisieren des Discounts");
@ -442,8 +505,10 @@ class TourBloc extends Bloc<TourEvent, TourState> {
RemoveDiscountEvent event,
Emitter<TourState> emit,
) async {
opBloc.add(StartOperation());
try {
await tourRepository.removeDiscount(event.deliveryId);
opBloc.add(FinishOperation());
} catch (e, st) {
debugPrint("Fehler beim Löschen des Discounts: $e $st");
_handleError(e, "Fehler beim Löschen des Discounts");
@ -451,12 +516,14 @@ class TourBloc extends Bloc<TourEvent, TourState> {
}
void _addDiscount(AddDiscountEvent event, Emitter<TourState> emit) async {
opBloc.add(StartOperation());
try {
await tourRepository.addDiscount(
event.deliveryId,
event.reason,
event.value,
);
opBloc.add(FinishOperation());
} catch (e, st) {
debugPrint("Fehler beim Hinzufügen des Discounts: $e $st");
_handleError(e, "Fehler beim Hinzufügen des Discounts");
@ -464,6 +531,7 @@ class TourBloc extends Bloc<TourEvent, TourState> {
}
void _unscan(UnscanArticleEvent event, Emitter<TourState> emit) async {
opBloc.add(StartOperation());
try {
await tourRepository.unscan(
event.deliveryId,
@ -471,6 +539,7 @@ class TourBloc extends Bloc<TourEvent, TourState> {
event.newAmount,
event.reason,
);
opBloc.add(FinishOperation());
} catch (e, st) {
debugPrint("Fehler beim Unscan des Artikels ${event.articleId}: $e $st");
_handleError(e, "Fehler beim Unscan des Artikels");
@ -478,8 +547,10 @@ class TourBloc extends Bloc<TourEvent, TourState> {
}
void _resetAmount(ResetScanAmountEvent event, Emitter<TourState> emit) async {
opBloc.add(StartOperation());
try {
await tourRepository.resetScan(event.articleId, event.deliveryId);
opBloc.add(FinishOperation());
} catch (e, st) {
debugPrint("Fehler beim Zurücksetzen Artikel ${event.articleId}: $e $st");
_handleError(e, "Fehler beim Zurücksetzen");