diff --git a/pom.xml b/pom.xml
index f9aec58..3369a0f 100644
--- a/pom.xml
+++ b/pom.xml
@@ -35,7 +35,7 @@
de.infinimotion
model-persistence
- 0.0.110
+ 0.0.116
diff --git a/src/main/java/de/infinimotion/persistence/processor/CommandListStatisticsProcessor.java b/src/main/java/de/infinimotion/persistence/processor/CommandListStatisticsProcessor.java
index 091a67a..2841519 100644
--- a/src/main/java/de/infinimotion/persistence/processor/CommandListStatisticsProcessor.java
+++ b/src/main/java/de/infinimotion/persistence/processor/CommandListStatisticsProcessor.java
@@ -11,10 +11,14 @@ public class CommandListStatisticsProcessor implements de.infinimotion.model.per
@Transactional(Transactional.TxType.NOT_SUPPORTED)
@Override
- public CommandListStatisticsResponse processCommandListStatistics(CommandListStatistics commandListStatistics) {
+ public CommandListStatisticsResponse processCommandListStatistics(CommandListStatistics req) {
CommandListStatisticsResponse resp = new CommandListStatisticsResponse();
- resp.setMovies(StatisticsFilm.findAll().list());
- resp.setShows(StatisticsVorstellung.findAll().list());
+ if (req.isShows()) {
+ resp.setShows(StatisticsVorstellung.findAll().list());
+ }
+ if (req.isMovies()) {
+ resp.setMovies(StatisticsFilm.findAll().list());
+ }
return resp;
}
}
diff --git a/src/main/java/de/infinimotion/persistence/processor/CommandResponseInterceptor.java b/src/main/java/de/infinimotion/persistence/processor/CommandResponseInterceptor.java
index ea7e49f..150341e 100644
--- a/src/main/java/de/infinimotion/persistence/processor/CommandResponseInterceptor.java
+++ b/src/main/java/de/infinimotion/persistence/processor/CommandResponseInterceptor.java
@@ -1,6 +1,7 @@
package de.infinimotion.persistence.processor;
import de.infinimotion.model.persistence.*;
+import io.quarkus.narayana.jta.QuarkusTransaction;
import io.vertx.core.Vertx;
import jakarta.enterprise.context.ApplicationScoped;
import jakarta.inject.Inject;
@@ -9,6 +10,7 @@ import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
+import java.time.LocalDateTime;
import java.util.List;
import java.util.Optional;
import java.util.concurrent.atomic.AtomicBoolean;
@@ -26,6 +28,9 @@ public class CommandResponseInterceptor {
@Inject
Vertx vertx;
+ @Inject
+ GenericFilterQuery filterQuery;
+
public static final AtomicBoolean LOCK = new AtomicBoolean(true);
public void intercept(CommandWrapper response) {
@@ -58,123 +63,94 @@ public class CommandResponseInterceptor {
});
}
+ // Aktualisiert Preise und Ticket-Anzahl bei Erstellung einer Eintrittskarte
public void interceptCreate(Eintrittskarte ticket) {
+ if (!checkOrderActive(ticket.getOrder()))
+ return;
+
int price = ticket.getSeat().getRow().getCategory().getPrice();
int showId = ticket.getShow().getId();
+ String showHallName = ticket.getShow().getHall().getName();
+ LocalDateTime showStart = ticket.getShow().getStart();
+ String movieTitle = ticket.getShow().getMovie().getTitle();
int movieId = ticket.getShow().getMovie().getId();
- boolean active = checkOrderActive(ticket.getOrder());
- Optional show = StatisticsVorstellung.find("show._id", showId).firstResultOptional();
- Optional movie = StatisticsFilm.find("movie._id", movieId).firstResultOptional();
+ Optional show = StatisticsVorstellung.find("showId", showId).firstResultOptional();
+ Optional movie = StatisticsFilm.find("movieId", movieId).firstResultOptional();
if (show.isEmpty()) {
StatisticsVorstellung newShow = new StatisticsVorstellung();
- newShow.setShow(ticket.getShow());
- newShow.setTickets(List.of(ticket));
- if (active) {
- newShow.setEarnings(price);
- }
+ newShow.setShowId(showId);
+ newShow.setShowHallName(showHallName);
+ newShow.setShowStart(showStart);
+ newShow.setMovieTitle(movieTitle);
+ newShow.setTickets(1);
+ newShow.setEarnings(price);
newShow.persist();
} else {
StatisticsVorstellung existingShow = show.orElseThrow();
- existingShow.getTickets().add(ticket);
- if (active) {
- existingShow.setEarnings(existingShow.getEarnings() + price);
- }
+ existingShow.setTickets(existingShow.getTickets() + 1);
+ existingShow.setEarnings(existingShow.getEarnings() + price);
existingShow.update();
}
if (movie.isEmpty()) {
StatisticsFilm newMovie = new StatisticsFilm();
- newMovie.setMovie(ticket.getShow().getMovie());
- newMovie.setTickets(List.of(ticket));
- if (active) {
- newMovie.setEarnings(price);
- }
+ newMovie.setMovieId(movieId);
+ newMovie.setMovieTitle(movieTitle);
+ newMovie.setTickets(1);
+ newMovie.setEarnings(price);
newMovie.persist();
} else {
StatisticsFilm existingMovie = movie.orElseThrow();
- existingMovie.getTickets().add(ticket);
- if (active) {
- existingMovie.setEarnings(existingMovie.getEarnings() + price);
- }
+ existingMovie.setTickets(existingMovie.getTickets() + 1);
+ existingMovie.setEarnings(existingMovie.getEarnings() + price);
existingMovie.update();
}
}
-// public void interceptUpdate(Eintrittskarte ticket) {
-// int price = ticket.getSeat().getRow().getCategory().getPrice();
-// int showId = ticket.getShow().getId();
-// int movieId = ticket.getShow().getMovie().getId();
-//
-// StatisticsVorstellung show = StatisticsVorstellung.find("show._id", showId).firstResult();
-// StatisticsFilm movie = StatisticsFilm.find("movie._id", movieId).firstResult();
-//
-// Optional existingTicketShow = show.getTickets().stream().filter(t -> Objects.equals(t.getId(), ticket.getId())).findAny();
-// int existingPriceShow = existingTicketShow
-// .map(Eintrittskarte::getSeat)
-// .map(Sitzplatz::getRow)
-// .map(Sitzreihe::getCategory)
-// .map(Sitzkategorie::getPrice)
-// .orElse(0);
-// show.getTickets().remove(existingTicketShow.orElse(null));
-// show.getTickets().add(ticket);
-// show.setEarnings(show.getEarnings() - existingPriceShow + price);
-// show.update();
-//
-// Optional existingTicketMovie = show.getTickets().stream().filter(t -> Objects.equals(t.getId(), ticket.getId())).findAny();
-// int existingPriceMovie = existingTicketMovie
-// .map(Eintrittskarte::getSeat)
-// .map(Sitzplatz::getRow)
-// .map(Sitzreihe::getCategory)
-// .map(Sitzkategorie::getPrice)
-// .orElse(0);
-// movie.getTickets().remove(existingTicketMovie.orElse(null));
-// movie.getTickets().add(ticket);
-// movie.setEarnings(movie.getEarnings() - existingPriceMovie + price);
-// movie.update();
-// }
-
+ // Aktualisiert Preise und Ticket-Anzahl bei Änderung der Bestellung (Reserved -> Booked und Booked - Cancelled)
public void interceptUpdate(Bestellung order) {
boolean orderActive = checkOrderActive(order);
+ List tickets = QuarkusTransaction.disallowingExisting()
+ .call(() -> filterQuery.query(Eintrittskarte.class, List.of("eq;order.id;int;" + order.getId())));
+ int price = tickets.stream().mapToInt(ticket -> ticket.getSeat().getRow().getCategory().getPrice()).sum();
+ if (price <= 0)
+ return;
- Optional showOpt = StatisticsVorstellung.find("tickets.order._id", order.getId()).firstResultOptional();
+ int showId = tickets.getFirst().getShow().getId();
+ Optional showOpt = StatisticsVorstellung.find("showId", showId).firstResultOptional();
if (showOpt.isPresent()) {
+ // sollte immer bereits mit CreateEintrittskarte erzeugt werden
StatisticsVorstellung show = showOpt.orElseThrow();
- show.getTickets().stream()
- .filter(t -> t.getOrder().getId().equals(order.getId()))
- .forEach(ticket -> {
- boolean ticketActive = checkOrderActive(ticket.getOrder());
- if (ticketActive && !orderActive) {
- show.setEarnings(show.getEarnings() - ticket.getSeat().getRow().getCategory().getPrice());
- } else if (!ticketActive && orderActive) {
- show.setEarnings(show.getEarnings() + ticket.getSeat().getRow().getCategory().getPrice());
- }
- ticket.setOrder(order);
- });
+ if (orderActive) {
+ show.setEarnings(show.getEarnings() + price);
+ show.setTickets(show.getTickets() + tickets.size());
+ } else if (order.getBooked() != null) {
+ show.setEarnings(show.getEarnings() - price);
+ show.setTickets(show.getTickets() - tickets.size());
+ }
show.update();
}
- Optional movieOpt = StatisticsFilm.find("tickets.order._id", order.getId()).firstResultOptional();
+ int movieId = tickets.getFirst().getShow().getMovie().getId();
+ Optional movieOpt = StatisticsFilm.find("movieId", movieId).firstResultOptional();
if (movieOpt.isPresent()) {
+ // sollte immer bereits mit CreateEintrittskarte erzeugt werden
StatisticsFilm movie = movieOpt.orElseThrow();
- movie.getTickets().stream()
- .filter(t -> t.getOrder().getId().equals(order.getId()))
- .forEach(ticket -> {
- boolean ticketActive = checkOrderActive(ticket.getOrder());
- if (ticketActive && !orderActive) {
- movie.setEarnings(movie.getEarnings() - ticket.getSeat().getRow().getCategory().getPrice());
- } else if (!ticketActive && orderActive) {
- movie.setEarnings(movie.getEarnings() + ticket.getSeat().getRow().getCategory().getPrice());
- }
- ticket.setOrder(order);
- });
+ if (orderActive) {
+ movie.setEarnings(movie.getEarnings() + price);
+ movie.setTickets(movie.getTickets() + tickets.size());
+ } else if (order.getBooked() != null) {
+ movie.setEarnings(movie.getEarnings() - price);
+ movie.setTickets(movie.getTickets() - tickets.size());
+ }
movie.update();
}
}
private boolean checkOrderActive(Bestellung order) {
- return order.getCancelled() == null && order.getBooked() != null;
+ return order.getBooked() != null && order.getCancelled() == null;
}
}