From a6e42ac021aed9ee73766b1bbdfd2ce724e90ab5 Mon Sep 17 00:00:00 2001 From: Celestino Bellone Date: Mon, 8 Aug 2016 15:31:14 +0200 Subject: [PATCH] #110 - don't apply discounts to donations --- .../controller/decorator/SaleableAdditionalService.java | 4 ++-- src/main/java/alfio/manager/TicketReservationManager.java | 7 +++---- src/main/java/alfio/model/AdditionalService.java | 5 +++++ .../model/decorator/AdditionalServicePriceContainer.java | 2 +- 4 files changed, 11 insertions(+), 7 deletions(-) diff --git a/src/main/java/alfio/controller/decorator/SaleableAdditionalService.java b/src/main/java/alfio/controller/decorator/SaleableAdditionalService.java index 65852390ea..159b0aacec 100644 --- a/src/main/java/alfio/controller/decorator/SaleableAdditionalService.java +++ b/src/main/java/alfio/controller/decorator/SaleableAdditionalService.java @@ -86,7 +86,7 @@ public int getSrcPriceCts() { @Override public Optional getDiscount() { - return Optional.ofNullable(promoCodeDiscount); + return Optional.ofNullable(promoCodeDiscount).filter(x -> getType() != AdditionalService.AdditionalServiceType.DONATION); } @Override @@ -123,7 +123,7 @@ public String getFormattedFinalPrice() { } public boolean getSupportsDiscount() { - return isFixPrice() && promoCodeDiscount != null; + return getType() != AdditionalService.AdditionalServiceType.DONATION && isFixPrice() && promoCodeDiscount != null; } public boolean getUserDefinedPrice() { diff --git a/src/main/java/alfio/manager/TicketReservationManager.java b/src/main/java/alfio/manager/TicketReservationManager.java index 0822805810..6d907490af 100644 --- a/src/main/java/alfio/manager/TicketReservationManager.java +++ b/src/main/java/alfio/manager/TicketReservationManager.java @@ -208,7 +208,7 @@ public String createTicketReservation(Event event, ticketReservationRepository.createNewReservation(reservationId, reservationExpiration, discount.map(PromoCodeDiscount::getId).orElse(null), locale.getLanguage()); list.forEach(t -> reserveTicketsForCategory(event, specialPriceSessionId, reservationId, t, locale, forWaitingQueue, discount.orElse(null))); - additionalServices.forEach(as -> reserveAdditionalServicesForReservation(event.getId(), reservationId, as, locale)); + additionalServices.forEach(as -> reserveAdditionalServicesForReservation(event.getId(), reservationId, as, locale, discount.orElse(null))); return reservationId; } @@ -238,8 +238,7 @@ void reserveTicketsForCategory(Event event, Optional specialPriceSession ticketRepository.updateTicketPrice(reservedForUpdate, category.getId(), event.getId(), category.getSrcPriceCts(), MonetaryUtil.unitToCents(priceContainer.getFinalPrice()), MonetaryUtil.unitToCents(priceContainer.getVAT()), MonetaryUtil.unitToCents(priceContainer.getAppliedDiscount())); } - private void reserveAdditionalServicesForReservation(int eventId, String transactionId, ASReservationWithOptionalCodeModification additionalServiceReservation, Locale locale) { - //FIXME we don't need to apply discount codes to a donation, therefore this feature is not yet implemented. + private void reserveAdditionalServicesForReservation(int eventId, String transactionId, ASReservationWithOptionalCodeModification additionalServiceReservation, Locale locale, PromoCodeDiscount discount) { Optional.ofNullable(additionalServiceReservation.getAdditionalServiceId()) .flatMap(id -> optionally(() -> additionalServiceRepository.getById(id, eventId))) .filter(as -> additionalServiceReservation.getQuantity() > 0 && (as.isFixPrice() || Optional.ofNullable(additionalServiceReservation.getAmount()).filter(a -> a.compareTo(BigDecimal.ZERO) > 0).isPresent())) @@ -249,7 +248,7 @@ private void reserveAdditionalServicesForReservation(int eventId, String transac AdditionalService as = pair.getValue(); IntStream.range(0, additionalServiceReservation.getQuantity()) .forEach(i -> { - AdditionalServicePriceContainer pc = AdditionalServicePriceContainer.from(additionalServiceReservation.getAmount(), as, e, null); + AdditionalServicePriceContainer pc = AdditionalServicePriceContainer.from(additionalServiceReservation.getAmount(), as, e, discount); additionalServiceItemRepository.insert(UUID.randomUUID().toString(), ZonedDateTime.now(Clock.systemUTC()), transactionId, as.getId(), AdditionalServiceItemStatus.PENDING, eventId, pc.getSrcPriceCts(), unitToCents(pc.getFinalPrice()), unitToCents(pc.getVAT()), unitToCents(pc.getAppliedDiscount())); }); diff --git a/src/main/java/alfio/model/AdditionalService.java b/src/main/java/alfio/model/AdditionalService.java index 95bd192d11..b8d30d9630 100644 --- a/src/main/java/alfio/model/AdditionalService.java +++ b/src/main/java/alfio/model/AdditionalService.java @@ -36,6 +36,10 @@ public enum VatType { CUSTOM_EXCLUDED } + public enum AdditionalServiceType { + DONATION + } + private final int id; private final int eventId; private final boolean fixPrice; @@ -46,6 +50,7 @@ public enum VatType { private final ZonedDateTime utcExpiration; private final BigDecimal vat; private final VatType vatType; + private final AdditionalServiceType type = AdditionalServiceType.DONATION; private final Integer srcPriceCts; diff --git a/src/main/java/alfio/model/decorator/AdditionalServicePriceContainer.java b/src/main/java/alfio/model/decorator/AdditionalServicePriceContainer.java index a65f873b62..ce2c7cea29 100644 --- a/src/main/java/alfio/model/decorator/AdditionalServicePriceContainer.java +++ b/src/main/java/alfio/model/decorator/AdditionalServicePriceContainer.java @@ -47,7 +47,7 @@ public int getSrcPriceCts() { @Override public Optional getDiscount() { - return Optional.ofNullable(promoCodeDiscount); + return Optional.ofNullable(promoCodeDiscount).filter(d -> additionalService.getType() != AdditionalService.AdditionalServiceType.DONATION); } @Override