Search in sources :

Example 1 with Attendee

use of alfio.model.modification.AdminReservationModification.Attendee in project alf.io by alfio-event.

the class AdminReservationManager method reserveForTicketsInfo.

private Result<List<Ticket>> reserveForTicketsInfo(Event event, AdminReservationModification arm, String reservationId, Pair<TicketCategory, TicketsInfo> pair) {
    TicketCategory category = pair.getLeft();
    TicketsInfo ticketsInfo = pair.getRight();
    int categoryId = category.getId();
    List<Attendee> attendees = ticketsInfo.getAttendees();
    List<Integer> reservedForUpdate = ticketReservationManager.reserveTickets(event.getId(), categoryId, attendees.size(), singletonList(Ticket.TicketStatus.FREE));
    if (reservedForUpdate.isEmpty() || reservedForUpdate.size() != attendees.size()) {
        return Result.error(ErrorCode.CategoryError.NOT_ENOUGH_SEATS);
    }
    var currencyCode = category.getCurrencyCode();
    ticketRepository.reserveTickets(reservationId, reservedForUpdate, category, arm.getLanguage(), event.getVatStatus(), i -> null);
    Ticket ticket = ticketRepository.findById(reservedForUpdate.get(0), categoryId);
    TicketPriceContainer priceContainer = TicketPriceContainer.from(ticket, null, event.getVat(), event.getVatStatus(), null);
    ticketRepository.updateTicketPrice(reservedForUpdate, categoryId, event.getId(), category.getSrcPriceCts(), unitToCents(priceContainer.getFinalPrice(), currencyCode), unitToCents(priceContainer.getVAT(), currencyCode), unitToCents(priceContainer.getAppliedDiscount(), currencyCode), currencyCode, priceContainer.getVatStatus());
    List<SpecialPrice> codes = category.isAccessRestricted() ? bindSpecialPriceTokens(categoryId, attendees) : Collections.emptyList();
    if (category.isAccessRestricted() && codes.size() < attendees.size()) {
        return Result.error(ErrorCode.CategoryError.NOT_ENOUGH_SEATS);
    }
    assignTickets(event, attendees, categoryId, reservedForUpdate, codes, reservationId, arm.getLanguage(), category.getSrcPriceCts());
    List<Ticket> tickets = reservedForUpdate.stream().map(id -> ticketRepository.findById(id, categoryId)).collect(toList());
    return Result.success(tickets);
}
Also used : alfio.repository(alfio.repository) PaymentProxy(alfio.model.transaction.PaymentProxy) TemplateProcessor(alfio.controller.support.TemplateProcessor) StringUtils.firstNonBlank(org.apache.commons.lang3.StringUtils.firstNonBlank) RequiredArgsConstructor(lombok.RequiredArgsConstructor) AlfioMetadata(alfio.model.metadata.AlfioMetadata) StringUtils(org.apache.commons.lang3.StringUtils) Collections.singletonList(java.util.Collections.singletonList) UPDATE_TICKET(alfio.model.Audit.EventType.UPDATE_TICKET) ResultStatus(alfio.model.result.Result.ResultStatus) BigDecimal(java.math.BigDecimal) ErrorCode(alfio.model.result.ErrorCode) Pair(org.apache.commons.lang3.tuple.Pair) DefaultMessageSourceResolvable(org.springframework.context.support.DefaultMessageSourceResolvable) DataIntegrityViolationException(org.springframework.dao.DataIntegrityViolationException) DefaultTransactionDefinition(org.springframework.transaction.support.DefaultTransactionDefinition) Triple(org.apache.commons.lang3.tuple.Triple) TICKET(alfio.model.Audit.EntityType.TICKET) StringUtils.trimToNull(org.apache.commons.lang3.StringUtils.trimToNull) Organization(alfio.model.user.Organization) Predicate(java.util.function.Predicate) Collectors(java.util.stream.Collectors) BinaryOperator(java.util.function.BinaryOperator) CANCEL_TICKET(alfio.model.Audit.EventType.CANCEL_TICKET) Stream(java.util.stream.Stream) PlatformTransactionManager(org.springframework.transaction.PlatformTransactionManager) alfio.model(alfio.model) UserRepository(alfio.repository.user.UserRepository) MapBindingResult(org.springframework.validation.MapBindingResult) java.util(java.util) MonetaryUtil.unitToCents(alfio.util.MonetaryUtil.unitToCents) MessageSourceManager(alfio.manager.i18n.MessageSourceManager) TransactionDefinition(org.springframework.transaction.TransactionDefinition) DuplicateReferenceException(alfio.manager.support.DuplicateReferenceException) PurchaseContextType(alfio.model.PurchaseContext.PurchaseContextType) MapSqlParameterSource(org.springframework.jdbc.core.namedparam.MapSqlParameterSource) Function(java.util.function.Function) alfio.util(alfio.util) Objects.requireNonNullElse(java.util.Objects.requireNonNullElse) Attendee(alfio.model.modification.AdminReservationModification.Attendee) DateTimeModification(alfio.model.modification.DateTimeModification) ReservationPriceCalculator(alfio.manager.system.ReservationPriceCalculator) TicketPriceContainer(alfio.model.decorator.TicketPriceContainer) ObjectUtils(org.apache.commons.lang3.ObjectUtils) Collections.singletonMap(java.util.Collections.singletonMap) TicketReservationStatus(alfio.model.TicketReservation.TicketReservationStatus) DateTimeModification.fromZonedDateTime(alfio.model.modification.DateTimeModification.fromZonedDateTime) TicketCategoryModification(alfio.model.modification.TicketCategoryModification) RESERVATION(alfio.model.Audit.EntityType.RESERVATION) Notification(alfio.model.modification.AdminReservationModification.Notification) TicketsInfo(alfio.model.modification.AdminReservationModification.TicketsInfo) User(alfio.model.user.User) Result(alfio.model.result.Result) Component(org.springframework.stereotype.Component) Validate(org.apache.commons.lang3.Validate) PaymentSpecification(alfio.manager.payment.PaymentSpecification) TransactionTemplate(org.springframework.transaction.support.TransactionTemplate) Log4j2(lombok.extern.log4j.Log4j2) Category(alfio.model.modification.AdminReservationModification.Category) Wrappers.optionally(alfio.util.Wrappers.optionally) EventUtil.generateEmptyTickets(alfio.util.EventUtil.generateEmptyTickets) AdminReservationModification(alfio.model.modification.AdminReservationModification) Transactional(org.springframework.transaction.annotation.Transactional) Assert(org.springframework.util.Assert) TicketPriceContainer(alfio.model.decorator.TicketPriceContainer) TicketsInfo(alfio.model.modification.AdminReservationModification.TicketsInfo) Attendee(alfio.model.modification.AdminReservationModification.Attendee)

Example 2 with Attendee

use of alfio.model.modification.AdminReservationModification.Attendee in project alf.io by alfio-event.

the class AdminReservationManager method assignTickets.

private void assignTickets(Event event, List<Attendee> attendees, int categoryId, List<Integer> reservedForUpdate, List<SpecialPrice> codes, String reservationId, String userLanguage, int srcPriceCts) {
    Optional<Iterator<SpecialPrice>> specialPriceIterator = Optional.of(codes).filter(c -> !c.isEmpty()).map(Collection::iterator);
    for (int i = 0; i < reservedForUpdate.size(); i++) {
        Attendee attendee = attendees.get(i);
        Integer ticketId = reservedForUpdate.get(i);
        if (!attendee.isEmpty()) {
            ticketRepository.updateTicketOwnerById(ticketId, attendee.getEmailAddress(), attendee.getFullName(), attendee.getFirstName(), attendee.getLastName());
            if (StringUtils.isNotBlank(attendee.getReference()) || attendee.isReassignmentForbidden()) {
                updateExtRefAndLocking(categoryId, attendee, ticketId);
            }
            if (!attendee.getAdditionalInfo().isEmpty()) {
                ticketFieldRepository.updateOrInsert(attendee.getAdditionalInfo(), ticketId, event.getId());
            }
        }
        specialPriceIterator.map(Iterator::next).ifPresent(code -> ticketRepository.reserveTicket(reservationId, ticketId, code.getId(), userLanguage, srcPriceCts, event.getCurrency(), event.getVatStatus(), null));
    }
}
Also used : alfio.repository(alfio.repository) PaymentProxy(alfio.model.transaction.PaymentProxy) TemplateProcessor(alfio.controller.support.TemplateProcessor) StringUtils.firstNonBlank(org.apache.commons.lang3.StringUtils.firstNonBlank) RequiredArgsConstructor(lombok.RequiredArgsConstructor) AlfioMetadata(alfio.model.metadata.AlfioMetadata) StringUtils(org.apache.commons.lang3.StringUtils) Collections.singletonList(java.util.Collections.singletonList) UPDATE_TICKET(alfio.model.Audit.EventType.UPDATE_TICKET) ResultStatus(alfio.model.result.Result.ResultStatus) BigDecimal(java.math.BigDecimal) ErrorCode(alfio.model.result.ErrorCode) Pair(org.apache.commons.lang3.tuple.Pair) DefaultMessageSourceResolvable(org.springframework.context.support.DefaultMessageSourceResolvable) DataIntegrityViolationException(org.springframework.dao.DataIntegrityViolationException) DefaultTransactionDefinition(org.springframework.transaction.support.DefaultTransactionDefinition) Triple(org.apache.commons.lang3.tuple.Triple) TICKET(alfio.model.Audit.EntityType.TICKET) StringUtils.trimToNull(org.apache.commons.lang3.StringUtils.trimToNull) Organization(alfio.model.user.Organization) Predicate(java.util.function.Predicate) Collectors(java.util.stream.Collectors) BinaryOperator(java.util.function.BinaryOperator) CANCEL_TICKET(alfio.model.Audit.EventType.CANCEL_TICKET) Stream(java.util.stream.Stream) PlatformTransactionManager(org.springframework.transaction.PlatformTransactionManager) alfio.model(alfio.model) UserRepository(alfio.repository.user.UserRepository) MapBindingResult(org.springframework.validation.MapBindingResult) java.util(java.util) MonetaryUtil.unitToCents(alfio.util.MonetaryUtil.unitToCents) MessageSourceManager(alfio.manager.i18n.MessageSourceManager) TransactionDefinition(org.springframework.transaction.TransactionDefinition) DuplicateReferenceException(alfio.manager.support.DuplicateReferenceException) PurchaseContextType(alfio.model.PurchaseContext.PurchaseContextType) MapSqlParameterSource(org.springframework.jdbc.core.namedparam.MapSqlParameterSource) Function(java.util.function.Function) alfio.util(alfio.util) Objects.requireNonNullElse(java.util.Objects.requireNonNullElse) Attendee(alfio.model.modification.AdminReservationModification.Attendee) DateTimeModification(alfio.model.modification.DateTimeModification) ReservationPriceCalculator(alfio.manager.system.ReservationPriceCalculator) TicketPriceContainer(alfio.model.decorator.TicketPriceContainer) ObjectUtils(org.apache.commons.lang3.ObjectUtils) Collections.singletonMap(java.util.Collections.singletonMap) TicketReservationStatus(alfio.model.TicketReservation.TicketReservationStatus) DateTimeModification.fromZonedDateTime(alfio.model.modification.DateTimeModification.fromZonedDateTime) TicketCategoryModification(alfio.model.modification.TicketCategoryModification) RESERVATION(alfio.model.Audit.EntityType.RESERVATION) Notification(alfio.model.modification.AdminReservationModification.Notification) TicketsInfo(alfio.model.modification.AdminReservationModification.TicketsInfo) User(alfio.model.user.User) Result(alfio.model.result.Result) Component(org.springframework.stereotype.Component) Validate(org.apache.commons.lang3.Validate) PaymentSpecification(alfio.manager.payment.PaymentSpecification) TransactionTemplate(org.springframework.transaction.support.TransactionTemplate) Log4j2(lombok.extern.log4j.Log4j2) Category(alfio.model.modification.AdminReservationModification.Category) Wrappers.optionally(alfio.util.Wrappers.optionally) EventUtil.generateEmptyTickets(alfio.util.EventUtil.generateEmptyTickets) AdminReservationModification(alfio.model.modification.AdminReservationModification) Transactional(org.springframework.transaction.annotation.Transactional) Assert(org.springframework.util.Assert) Attendee(alfio.model.modification.AdminReservationModification.Attendee)

Example 3 with Attendee

use of alfio.model.modification.AdminReservationModification.Attendee in project alf.io by alfio-event.

the class AdminReservationManagerIntegrationTest method validateSuccess.

private void validateSuccess(boolean bounded, List<Integer> attendeesNr, Event event, String username, List<TicketCategory> existingCategories, Result<Pair<TicketReservation, List<Ticket>>> result, List<Attendee> allAttendees, int expectedEventSeats, int reservedTickets) {
    assertTrue(result.isSuccess());
    Pair<TicketReservation, List<Ticket>> data = result.getData();
    assertTrue(data.getRight().size() == attendeesNr.stream().mapToInt(i -> i).sum());
    assertNotNull(data.getLeft());
    Event modified = eventManager.getSingleEvent(event.getShortName(), username);
    assertEquals(expectedEventSeats, eventRepository.countExistingTickets(event.getId()).intValue());
    List<Ticket> tickets = ticketRepository.findPendingTicketsInCategories(existingCategories.stream().map(TicketCategory::getId).collect(toList()));
    assertEquals(attendeesNr.stream().mapToInt(i -> i).sum(), tickets.size() - reservedTickets);
    if (bounded) {
        final Iterator<Integer> iterator = attendeesNr.iterator();
        existingCategories.forEach(existingCategory -> {
            TicketCategory categoryModified = ticketCategoryRepository.getByIdAndActive(existingCategory.getId(), event.getId());
            assertEquals(categoryModified.getMaxTickets(), iterator.next().intValue());
        });
    }
    for (int i = 0; i < tickets.size() - reservedTickets; i++) {
        Attendee attendee = allAttendees.get(i);
        if (!attendee.isEmpty()) {
            Ticket ticket = data.getRight().get(i);
            assertTrue(ticket.getAssigned());
            assertNotNull(ticket.getFullName());
            assertEquals(attendee.getFullName(), ticket.getFullName());
            assertEquals(attendee.getEmailAddress(), ticket.getEmail());
            assertEquals(Ticket.TicketStatus.PENDING, ticket.getStatus());
            assertEquals(data.getLeft().getId(), ticket.getTicketsReservationId());
        }
    }
    ticketCategoryRepository.findByEventId(modified.getId()).forEach(tc -> assertTrue(specialPriceRepository.findAllByCategoryId(tc.getId()).stream().allMatch(sp -> sp.getStatus() == SpecialPrice.Status.PENDING)));
    assertFalse(ticketRepository.findAllReservationsConfirmedButNotAssigned(event.getId()).contains(data.getLeft().getId()));
}
Also used : alfio.repository(alfio.repository) IntStream(java.util.stream.IntStream) java.util(java.util) BeforeClass(org.junit.BeforeClass) ZonedDateTime(java.time.ZonedDateTime) RunWith(org.junit.runner.RunWith) Autowired(org.springframework.beans.factory.annotation.Autowired) ActiveProfiles(org.springframework.test.context.ActiveProfiles) Attendee(alfio.model.modification.AdminReservationModification.Attendee) RepositoryConfiguration(alfio.config.RepositoryConfiguration) BigDecimal(java.math.BigDecimal) SpringJUnit4ClassRunner(org.springframework.test.context.junit4.SpringJUnit4ClassRunner) Pair(org.apache.commons.lang3.tuple.Pair) LocalTime(java.time.LocalTime) Triple(org.apache.commons.lang3.tuple.Triple) OrganizationRepository(alfio.repository.user.OrganizationRepository) TicketsInfo(alfio.model.modification.AdminReservationModification.TicketsInfo) Test(org.junit.Test) CustomerData(alfio.model.modification.AdminReservationModification.CustomerData) IntegrationTestUtil(alfio.test.util.IntegrationTestUtil) DateUtils(org.apache.commons.lang3.time.DateUtils) Result(alfio.model.result.Result) Collectors.toList(java.util.stream.Collectors.toList) Initializer(alfio.config.Initializer) alfio.model(alfio.model) UserManager(alfio.manager.user.UserManager) ContextConfiguration(org.springframework.test.context.ContextConfiguration) LocalDate(java.time.LocalDate) DataSourceConfiguration(alfio.config.DataSourceConfiguration) Category(alfio.model.modification.AdminReservationModification.Category) TestConfiguration(alfio.TestConfiguration) Assert(org.junit.Assert) alfio.model.modification(alfio.model.modification) Transactional(org.springframework.transaction.annotation.Transactional) Collectors.toList(java.util.stream.Collectors.toList) Attendee(alfio.model.modification.AdminReservationModification.Attendee)

Example 4 with Attendee

use of alfio.model.modification.AdminReservationModification.Attendee in project alf.io by alfio-event.

the class AdminReservationManager method checkExistingCategory.

private Result<TicketCategory> checkExistingCategory(TicketsInfo ti, Event event, String username) {
    Category category = ti.getCategory();
    List<Attendee> attendees = ti.getAttendees();
    int tickets = attendees.size();
    int eventId = event.getId();
    TicketCategory existing = ticketCategoryRepository.getByIdAndActive(category.getExistingCategoryId(), eventId);
    int existingCategoryId = existing.getId();
    int freeTicketsInCategory = ticketRepository.countFreeTickets(eventId, existingCategoryId);
    int notAllocated = getNotAllocatedTickets(event);
    int missingTickets = Math.max(tickets - (freeTicketsInCategory + notAllocated), 0);
    Event modified = increaseSeatsIfNeeded(ti, event, missingTickets, event);
    if (freeTicketsInCategory < tickets && existing.isBounded()) {
        int maxTickets = existing.getMaxTickets() + (tickets - freeTicketsInCategory);
        TicketCategoryModification tcm = new TicketCategoryModification(existingCategoryId, existing.getName(), existing.getTicketAccessType(), maxTickets, fromZonedDateTime(existing.getInception(modified.getZoneId())), fromZonedDateTime(existing.getExpiration(event.getZoneId())), Collections.emptyMap(), existing.getPrice(), existing.isAccessRestricted(), "", true, existing.getCode(), fromZonedDateTime(existing.getValidCheckInFrom(modified.getZoneId())), fromZonedDateTime(existing.getValidCheckInTo(modified.getZoneId())), fromZonedDateTime(existing.getTicketValidityStart(modified.getZoneId())), fromZonedDateTime(existing.getTicketValidityEnd(modified.getZoneId())), 0, existing.getTicketCheckInStrategy(), null, AlfioMetadata.empty());
        return eventManager.updateCategory(existingCategoryId, modified, tcm, username, true);
    }
    return Result.success(existing);
}
Also used : Category(alfio.model.modification.AdminReservationModification.Category) TicketCategoryModification(alfio.model.modification.TicketCategoryModification) Attendee(alfio.model.modification.AdminReservationModification.Attendee)

Example 5 with Attendee

use of alfio.model.modification.AdminReservationModification.Attendee in project alf.io by alfio-event.

the class AdminReservationManager method createCategory.

private Result<TicketCategory> createCategory(TicketsInfo ti, Event event, AdminReservationModification reservation, String username) {
    Category category = ti.getCategory();
    List<Attendee> attendees = ti.getAttendees();
    DateTimeModification inception = fromZonedDateTime(event.now(clockProvider));
    int tickets = attendees.size();
    var accessType = event.getFormat() != Event.EventFormat.HYBRID ? TicketCategory.TicketAccessType.INHERIT : Objects.requireNonNull(category.getTicketAccessType());
    TicketCategoryModification tcm = new TicketCategoryModification(category.getExistingCategoryId(), category.getName(), accessType, tickets, inception, reservation.getExpiration(), Collections.emptyMap(), category.getPrice(), true, "", true, null, null, null, null, null, 0, null, null, AlfioMetadata.empty());
    int notAllocated = getNotAllocatedTickets(event);
    int missingTickets = Math.max(tickets - notAllocated, 0);
    Event modified = increaseSeatsIfNeeded(ti, event, missingTickets, event);
    return eventManager.insertCategory(modified, tcm, username).map(id -> ticketCategoryRepository.getByIdAndActive(id, event.getId()));
}
Also used : Category(alfio.model.modification.AdminReservationModification.Category) DateTimeModification(alfio.model.modification.DateTimeModification) TicketCategoryModification(alfio.model.modification.TicketCategoryModification) Attendee(alfio.model.modification.AdminReservationModification.Attendee)

Aggregations

Attendee (alfio.model.modification.AdminReservationModification.Attendee)5 Category (alfio.model.modification.AdminReservationModification.Category)5 TicketCategoryModification (alfio.model.modification.TicketCategoryModification)4 alfio.model (alfio.model)3 TicketsInfo (alfio.model.modification.AdminReservationModification.TicketsInfo)3 DateTimeModification (alfio.model.modification.DateTimeModification)3 Result (alfio.model.result.Result)3 alfio.repository (alfio.repository)3 BigDecimal (java.math.BigDecimal)3 java.util (java.util)3 TemplateProcessor (alfio.controller.support.TemplateProcessor)2 MessageSourceManager (alfio.manager.i18n.MessageSourceManager)2 PaymentSpecification (alfio.manager.payment.PaymentSpecification)2 DuplicateReferenceException (alfio.manager.support.DuplicateReferenceException)2 ReservationPriceCalculator (alfio.manager.system.ReservationPriceCalculator)2 RESERVATION (alfio.model.Audit.EntityType.RESERVATION)2 TICKET (alfio.model.Audit.EntityType.TICKET)2 CANCEL_TICKET (alfio.model.Audit.EventType.CANCEL_TICKET)2 UPDATE_TICKET (alfio.model.Audit.EventType.UPDATE_TICKET)2 PurchaseContextType (alfio.model.PurchaseContext.PurchaseContextType)2