diff --git a/src/main/java/alfio/manager/EventManager.java b/src/main/java/alfio/manager/EventManager.java index b3aaf890aa..1ca502af14 100644 --- a/src/main/java/alfio/manager/EventManager.java +++ b/src/main/java/alfio/manager/EventManager.java @@ -91,6 +91,7 @@ public class EventManager { private static final Predicate IS_CATEGORY_BOUNDED = TicketCategory::isBounded; + static final String ERROR_ONLINE_ON_SITE_NOT_COMPATIBLE = "Cannot switch to Online. Please remove On-Site payment method first."; private final UserManager userManager; private final EventRepository eventRepository; private final EventDescriptionRepository eventDescriptionRepository; @@ -318,6 +319,10 @@ public void updateEventHeader(Event original, EventModification em, String usern int eventId = original.getId(); Validate.isTrue(sameOrganization || groupRepository.countByEventId(eventId) == 0, "Cannot change organization because there is a group linked to this event."); + if(em.getFormat() == Event.EventFormat.ONLINE && em.getFormat() != original.getFormat()) { + Validate.isTrue(original.getAllowedPaymentProxies().stream().allMatch(p -> p != PaymentProxy.ON_SITE), ERROR_ONLINE_ON_SITE_NOT_COMPATIBLE); + } + String timeZone = ObjectUtils.firstNonNull(em.getZoneId(), em.getGeolocation() != null ? em.getGeolocation().getTimeZone() : null); String latitude = ObjectUtils.firstNonNull(em.getLatitude(), em.getGeolocation() != null ? em.getGeolocation().getLatitude() : null); String longitude = ObjectUtils.firstNonNull(em.getLongitude(), em.getGeolocation() != null ? em.getGeolocation().getLongitude(): null); diff --git a/src/test/java/alfio/manager/EventManagerIntegrationTest.java b/src/test/java/alfio/manager/EventManagerIntegrationTest.java index 2c73ee1b43..75771749f2 100644 --- a/src/test/java/alfio/manager/EventManagerIntegrationTest.java +++ b/src/test/java/alfio/manager/EventManagerIntegrationTest.java @@ -27,6 +27,7 @@ import alfio.model.modification.*; import alfio.model.result.ErrorCode; import alfio.model.result.Result; +import alfio.model.transaction.PaymentProxy; import alfio.repository.*; import alfio.repository.system.ConfigurationRepository; import alfio.repository.user.OrganizationRepository; @@ -809,6 +810,41 @@ public void rearrangeTicketCategories() { } + @Test + public void updateEventFormat() { + var categories = List.of( + new TicketCategoryModification(null, "first", TicketCategory.TicketAccessType.INHERIT, AVAILABLE_SEATS, + new DateTimeModification(LocalDate.now(), LocalTime.now()), + new DateTimeModification(LocalDate.now(), LocalTime.now()), + DESCRIPTION, BigDecimal.TEN, false, "", false, null, null, null, null, null, 2, null, null, AlfioMetadata.empty())); + + var eventAndUsername = initEvent(categories, organizationRepository, userManager, eventManager, eventRepository); + var event = eventAndUsername.getLeft(); + + // add ON_SITE payment method + var withOnSite = List.of(PaymentProxy.OFFLINE, PaymentProxy.ON_SITE); + var onSitePaymentMethodModification = createEventModification(AVAILABLE_SEATS, event, Event.EventFormat.IN_PERSON, withOnSite); + var username = eventAndUsername.getRight(); + eventManager.updateEventPrices(event, onSitePaymentMethodModification, username); + + event = eventRepository.findById(event.getId()); + assertEquals(withOnSite, event.getAllowedPaymentProxies()); + + try { + eventManager.updateEventHeader(event, createEventModification(AVAILABLE_SEATS, event, Event.EventFormat.ONLINE, withOnSite), username); + fail(); + } catch(IllegalArgumentException ex) { + assertEquals(EventManager.ERROR_ONLINE_ON_SITE_NOT_COMPATIBLE, ex.getMessage()); + } + + event = eventRepository.findById(event.getId()); + // update header and remove ON_SITE + eventManager.updateEventPrices(event, createEventModification(AVAILABLE_SEATS, event, event.getFormat(), List.of(PaymentProxy.OFFLINE)), username); + // retry + event = eventRepository.findById(event.getId()); + eventManager.updateEventHeader(event, createEventModification(AVAILABLE_SEATS, event, Event.EventFormat.ONLINE, event.getAllowedPaymentProxies()), username); + } + private Pair generateAndEditEvent(int newEventSize) { List categories = Collections.singletonList( new TicketCategoryModification(null, "default", TicketCategory.TicketAccessType.INHERIT, 10, @@ -819,9 +855,7 @@ private Pair generateAndEditEvent(int newEventSize) { Event event = pair.getKey(); if(newEventSize != AVAILABLE_SEATS) { - EventModification update = new EventModification(event.getId(), Event.EventFormat.IN_PERSON, null, null, null, null, null, null, null, null, event.getOrganizationId(), null, null, - null, event.getZoneId().toString(), Collections.emptyMap(), DateTimeModification.fromZonedDateTime(event.getBegin()), DateTimeModification.fromZonedDateTime(event.getEnd()), - event.getRegularPrice(), event.getCurrency(), newEventSize, event.getVat(), event.isVatIncluded(), event.getAllowedPaymentProxies(), null, event.isFreeOfCharge(), null, 7, null, null, AlfioMetadata.empty()); + EventModification update = createEventModification(newEventSize, event); eventManager.updateEventPrices(event, update, pair.getValue()); } List tickets = ticketRepository.findFreeByEventId(event.getId()); @@ -834,4 +868,14 @@ private Pair generateAndEditEvent(int newEventSize) { assertEquals(10, tickets.stream().filter(t -> t.getCategoryId() != null).count()); return Pair.of(eventRepository.findById(event.getId()), pair.getRight()); } + + private EventModification createEventModification(int availableSeats, Event event) { + return createEventModification(availableSeats, event, Event.EventFormat.IN_PERSON, event.getAllowedPaymentProxies()); + } + + private EventModification createEventModification(int availableSeats, Event event, Event.EventFormat format, List allowedPaymentProxies) { + return new EventModification(event.getId(), format, "http://website-url", null, "http://website-url/tc", null, null, null, null, null, event.getOrganizationId(), null, null, + null, event.getZoneId().toString(), Collections.emptyMap(), DateTimeModification.fromZonedDateTime(event.getBegin()), DateTimeModification.fromZonedDateTime(event.getEnd()), + event.getRegularPrice(), event.getCurrency(), availableSeats, event.getVat(), event.isVatIncluded(), allowedPaymentProxies, null, event.isFreeOfCharge(), null, 7, null, null, AlfioMetadata.empty()); + } }