> triple = ticketReservationManager.fetchComplete(eventName, reservationId, ticketIdentifier)
+ .map(result -> {
+ Ticket t = result.getRight();
+ Validate.isTrue(!t.getLockedAssignment(), "cannot change a locked ticket");
+ final Event event = result.getLeft();
+ final TicketReservation ticketReservation = result.getMiddle();
+ ValidationResult validationResult = Validator.validateTicketAssignment(updateTicketOwner, bindingResult)
+ .ifSuccess(() -> updateTicketOwner(updateTicketOwner, request, t, event, ticketReservation));
+ return Triple.of(validationResult, event, ticketRepository.findByUUID(t.getUuid()));
+ });
+ triple.ifPresent(t -> {
+ model.addAttribute("value", t.getRight());
+ model.addAttribute("validationResult", t.getLeft());
+ model.addAttribute("countries", getLocalizedCountries(RequestContextUtils.getLocale(request)));
+ model.addAttribute("event", t.getMiddle());
+ });
+ return triple;
+ }
+
+ private void updateTicketOwner(UpdateTicketOwnerForm updateTicketOwner, HttpServletRequest request, Ticket t, Event event, TicketReservation ticketReservation) {
+ ticketReservationManager.updateTicketOwner(t, RequestContextUtils.getLocale(request), event, updateTicketOwner,
+ getConfirmationTextBuilder(request, t, event, ticketReservation),
+ getOwnerChangeTextBuilder(request, t, event),
+ preparePdfTicket(request, event, ticketReservation, t));
+ }
+
+ private TextTemplateBuilder getOwnerChangeTextBuilder(HttpServletRequest request, Ticket t, Event event) {
+ return TemplateProcessor.buildEmailForOwnerChange(t.getEmail(), event, t, organizationRepository, ticketReservationManager, templateManager, request);
+ }
+
+ private TextTemplateBuilder getConfirmationTextBuilder(HttpServletRequest request, Ticket t, Event event, TicketReservation ticketReservation) {
+ return TemplateProcessor.buildEmail(event, organizationRepository, ticketReservation, t, templateManager, request);
+ }
+
+ private PDFTemplateBuilder preparePdfTicket(HttpServletRequest request, Event event, TicketReservation ticketReservation, Ticket ticket) {
+ TicketCategory ticketCategory = ticketCategoryRepository.getById(ticket.getCategoryId(), event.getId());
+ Organization organization = organizationRepository.getById(event.getOrganizationId());
+ try {
+ return TemplateProcessor.buildPDFTicket(request, event, ticketReservation, ticket, ticketCategory, organization, templateManager);
+ } catch (WriterException | IOException e) {
+ throw new IllegalStateException(e);
+ }
+ }
+
private void sendReservationCompleteEmail(HttpServletRequest request, Event event, TicketReservation reservation) {
String reservationTxt = templateManager.render("/alfio/templates/confirmation-email-txt.ms",
diff --git a/src/main/java/alfio/controller/api/EventApiController.java b/src/main/java/alfio/controller/api/EventApiController.java
deleted file mode 100644
index 5d106d10f5..0000000000
--- a/src/main/java/alfio/controller/api/EventApiController.java
+++ /dev/null
@@ -1,114 +0,0 @@
-/**
- * This file is part of alf.io.
- *
- * alf.io is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * alf.io is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with alf.io. If not, see .
- */
-package alfio.controller.api;
-
-import alfio.controller.form.UpdateTicketOwnerForm;
-import alfio.controller.support.TemplateManager;
-import alfio.controller.support.TemplateProcessor;
-import alfio.manager.TicketReservationManager;
-import alfio.manager.support.PDFTemplateBuilder;
-import alfio.manager.support.TextTemplateBuilder;
-import alfio.model.Event;
-import alfio.model.Ticket;
-import alfio.model.TicketCategory;
-import alfio.model.TicketReservation;
-import alfio.model.user.Organization;
-import alfio.repository.TicketCategoryRepository;
-import alfio.repository.user.OrganizationRepository;
-import alfio.util.ValidationResult;
-import alfio.util.Validator;
-import com.google.zxing.WriterException;
-import org.apache.commons.lang3.Validate;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.validation.BindingResult;
-import org.springframework.web.bind.annotation.PathVariable;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestMethod;
-import org.springframework.web.bind.annotation.RestController;
-
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-import java.io.IOException;
-import java.util.Locale;
-
-@RestController
-@RequestMapping("/event/{eventName}")
-public class EventApiController {
-
- private final TicketReservationManager ticketReservationManager;
- private final OrganizationRepository organizationRepository;
- private final TemplateManager templateManager;
- private final TicketCategoryRepository ticketCategoryRepository;
-
- @Autowired
- public EventApiController(TicketReservationManager ticketReservationManager,
- OrganizationRepository organizationRepository,
- TemplateManager templateManager,
- TicketCategoryRepository ticketCategoryRepository) {
- this.ticketReservationManager = ticketReservationManager;
- this.organizationRepository = organizationRepository;
- this.templateManager = templateManager;
- this.ticketCategoryRepository = ticketCategoryRepository;
- }
-
- @RequestMapping(value = "/reservation/{reservationId}/{ticketIdentifier}", method = RequestMethod.POST)
- public ValidationResult assignTicketToPerson(@PathVariable("eventName") String eventName,
- @PathVariable("reservationId") String reservationId,
- @PathVariable("ticketIdentifier") String ticketIdentifier,
- UpdateTicketOwnerForm updateTicketOwner,
- BindingResult bindingResult,
- HttpServletRequest request,
- HttpServletResponse response,
- Locale locale) throws Exception {
-
- return ticketReservationManager.fetchComplete(eventName, reservationId, ticketIdentifier)
- .map(result -> {
- Ticket t = result.getRight();
- Validate.isTrue(!t.getLockedAssignment(), "cannot change a locked ticket");
- final Event event = result.getLeft();
- final TicketReservation ticketReservation = result.getMiddle();
- return Validator.validateTicketAssignment(updateTicketOwner, bindingResult)
- .ifSuccess(() -> updateTicketOwner(updateTicketOwner, request, locale, t, event, ticketReservation));
- }).orElse(ValidationResult.failed());
-
- }
-
- private void updateTicketOwner(UpdateTicketOwnerForm updateTicketOwner, HttpServletRequest request, Locale locale, Ticket t, Event event, TicketReservation ticketReservation) {
- ticketReservationManager.updateTicketOwner(t, locale, event, updateTicketOwner,
- getConfirmationTextBuilder(request, t, event, ticketReservation),
- getOwnerChangeTextBuilder(request, t, event),
- preparePdfTicket(request, event, ticketReservation, t));
- }
-
- private TextTemplateBuilder getOwnerChangeTextBuilder(HttpServletRequest request, Ticket t, Event event) {
- return TemplateProcessor.buildEmailForOwnerChange(t.getEmail(), event, t, organizationRepository, ticketReservationManager, templateManager, request);
- }
-
- private TextTemplateBuilder getConfirmationTextBuilder(HttpServletRequest request, Ticket t, Event event, TicketReservation ticketReservation) {
- return TemplateProcessor.buildEmail(event, organizationRepository, ticketReservation, t, templateManager, request);
- }
-
- private PDFTemplateBuilder preparePdfTicket(HttpServletRequest request, Event event, TicketReservation ticketReservation, Ticket ticket) {
- TicketCategory ticketCategory = ticketCategoryRepository.getById(ticket.getCategoryId(), event.getId());
- Organization organization = organizationRepository.getById(event.getOrganizationId());
- try {
- return TemplateProcessor.buildPDFTicket(request, event, ticketReservation, ticket, ticketCategory, organization, templateManager);
- } catch (WriterException | IOException e) {
- throw new IllegalStateException(e);
- }
- }
-}
diff --git a/src/main/java/alfio/manager/TicketReservationManager.java b/src/main/java/alfio/manager/TicketReservationManager.java
index 26249cc8d8..29a2c54909 100644
--- a/src/main/java/alfio/manager/TicketReservationManager.java
+++ b/src/main/java/alfio/manager/TicketReservationManager.java
@@ -41,6 +41,7 @@
import org.apache.commons.lang3.tuple.Pair;
import org.apache.commons.lang3.tuple.Triple;
import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.MessageSource;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
diff --git a/src/main/java/alfio/repository/TicketRepository.java b/src/main/java/alfio/repository/TicketRepository.java
index c42561a491..c35d2230dd 100644
--- a/src/main/java/alfio/repository/TicketRepository.java
+++ b/src/main/java/alfio/repository/TicketRepository.java
@@ -82,7 +82,7 @@ int reserveTickets(@Bind("reservationId") String reservationId,
@Query("update ticket set email_address = :email, full_name = :fullName where uuid = :ticketIdentifier")
int updateTicketOwner(@Bind("ticketIdentifier") String ticketIdentifier, @Bind("email") String email, @Bind("fullName") String fullName);
- @Query("update ticket set job_title = :jobTitle, company = :company, phone_number = :phoneNumber, address = :address, country = :country, tshirt_size = :tShirtSize, notes = :notes, user_language = :userLanguage, where uuid = :ticketIdentifier")
+ @Query("update ticket set job_title = :jobTitle, company = :company, phone_number = :phoneNumber, address = :address, country = :country, tshirt_size = :tShirtSize, notes = :notes, user_language = :userLanguage where uuid = :ticketIdentifier")
int updateOptionalTicketInfo(@Bind("ticketIdentifier") String ticketIdentifier,
@Bind("jobTitle") String jobTitle,
@Bind("company") String company,
diff --git a/src/main/resources/alfio/i18n/application.properties b/src/main/resources/alfio/i18n/application.properties
index 9772d560ab..54967e5097 100644
--- a/src/main/resources/alfio/i18n/application.properties
+++ b/src/main/resources/alfio/i18n/application.properties
@@ -82,12 +82,12 @@ reservation-page-complete.update=Update
reservation-page-complete.cancel=Cancel
reservation-page-complete.download-ticket=Download
reservation-page-complete.resend-reservation-email=Resend reservation email
-reservation-page-complete.send-ticket-by-email-to=Send by email
+reservation-page-complete.send-ticket-by-email-to=Send
reservation-page-complete.info-update=You can update the owner of a ticket: a new email will be sent, the previously sent ticket will be invalidated.
reservation-page-complete.info-assign=Your reservation for the event {0} has been completed. In order to view and download your tickets, please assign them.
reservation-page-complete.info-assign-email=An email has already been sent to {0}. Didn''t you receive any message? Please check your ''spam'' folder and if nothing found click on the following button to send it again
reservation-page-complete.show-ticket=View
-reservation-page-complete.update-ticket-owner=Update owner
+reservation-page-complete.update-ticket-owner=Update
reservation-page-complete.assigned-to=Assigned to {0} <{1}>
reservation-page-complete.ticket-type=Ticket type\:
reservation-page-complete.ticket-not-assigned=not yet assigned
@@ -100,7 +100,8 @@ reservation-page-complete.address=Address
reservation-page-complete.country=Country
reservation-page-complete.t-shirt-size=T-Shirt size
reservation-page-complete.notes=Notes
-reservation-page-complete.notes.placeholder=Do you have any particular needing about food, accessibility, etc.? Please let us know
+reservation-page-complete.notes.placeholder=Should you have any special need (such as but not limited to diet or accessibility requirements) please let us know
+reservation-page-complete.please-check-input-fields=Please check input values.
#show-ticket
show-ticket.header.title=Your Ticket for {0}
@@ -130,7 +131,7 @@ error.STEP2_STRIPE_missing=There is no card on a customer that is being charged.
error.STEP2_STRIPE_processing_error=An error occurred while processing the card.
error.STEP2_STRIPE_abort=A network error has occurred, and you have not been charged. Please try again.
error.STEP2_STRIPE_rate_limit=A network error has occurred, and you have not been charged. Please try again.
-error.STEP2_STRIPE_unexpected=An unexpected error has occurred. Please contact the event\u00B4s organizers in order to get assistance.
+error.STEP2_STRIPE_unexpected=An unexpected error has occurred. Please contact the event''s organizers in order to get assistance.
error.STEP_2_PAYMENT_PROCESSING_ERROR=Payment processing error: {0}
error.STEP_2_MISSING_STRIPE_TOKEN=Error with the payment processor: missing token, have you enabled javascript?
diff --git a/src/main/resources/alfio/i18n/application_it.properties b/src/main/resources/alfio/i18n/application_it.properties
index f2c9fa3bcc..f2d77859c1 100644
--- a/src/main/resources/alfio/i18n/application_it.properties
+++ b/src/main/resources/alfio/i18n/application_it.properties
@@ -72,11 +72,11 @@ reservation-page-complete.update=Modifica
reservation-page-complete.cancel=Annulla
reservation-page-complete.download-ticket=Scarica
reservation-page-complete.resend-reservation-email=Invia email prenotazione
-reservation-page-complete.send-ticket-by-email-to=Invia via email
+reservation-page-complete.send-ticket-by-email-to=Invia
reservation-page-complete.info-update=Puoi aggiornare l''intestatario di un biglietto. In questo caso verr\u00E0 inviata una nuova email ed il vecchio biglietto verr\u00E0 annullato.
reservation-page-complete.info-assign=La tua prenotazione per l''evento {0} \u00E8 stata completata con successo. Ti preghiamo di assegnare tutti i biglietti in modo da poter effettuare il download.
reservation-page-complete.show-ticket=Visualizza
-reservation-page-complete.update-ticket-owner=Modifica intestatario
+reservation-page-complete.update-ticket-owner=Modifica
reservation-page-complete.assigned-to=Assegnato a {0} <{1}>
reservation-page-complete.ticket-type=Tipo del biglietto\:
reservation-page-complete.ticket-nr=Biglietto n. {0}
@@ -182,4 +182,5 @@ breadcrumb.step2=Prenota
breadcrumb.step3=Assegna e scarica
reservation-page-complete.info-assign-email=\u00C8 gi\u00E0 stata spedita un''email all''indirizzo {0}. Se non l''hai ricevuta\: hai gi\u00E0 controllato la cartella ''posta indesiderata''? Clicca sul bottone sottostante per inviarla nuovamente
reservation-page-complete.notes=Note
-reservation-page-complete.notes.placeholder=Hai qualche esigenza particolare per quanto riguarda ad esempio cibo o accessibilità? Per favore, faccelo sapere!
+reservation-page-complete.notes.placeholder=Hai qualche esigenza particolare (ad esempio per quanto riguarda cibo o accessibilit\u00E0)? Per favore, faccelo sapere!
+reservation-page-complete.please-check-input-fields=Controlla i valori immessi.
\ No newline at end of file
diff --git a/src/main/webapp/WEB-INF/templates/event/assign-ticket-form.ms b/src/main/webapp/WEB-INF/templates/event/assign-ticket-form.ms
new file mode 100644
index 0000000000..34b036c249
--- /dev/null
+++ b/src/main/webapp/WEB-INF/templates/event/assign-ticket-form.ms
@@ -0,0 +1,101 @@
+{{#assigned}}
+
+
{{#i18n}}reservation-page-complete.assigned-to [{{fullName}}] [{{email}}]{{/i18n}}
+
+
+
+
+ {{^lockedAssignment}}
+
+ {{/lockedAssignment}}
+
+
+{{/assigned}}
+{{#validationResult}}
+ {{^isSuccess}}
+ {{#i18n}}reservation-page-complete.please-check-input-fields{{/i18n}}
+ {{/isSuccess}}
+{{/validationResult}}
+
\ No newline at end of file
diff --git a/src/main/webapp/WEB-INF/templates/event/assign-ticket-result.ms b/src/main/webapp/WEB-INF/templates/event/assign-ticket-result.ms
new file mode 100644
index 0000000000..24229186d3
--- /dev/null
+++ b/src/main/webapp/WEB-INF/templates/event/assign-ticket-result.ms
@@ -0,0 +1,5 @@
+{{#value}}
+
+ {{> /event/assign-ticket-form}}
+
+{{/value}}
\ No newline at end of file
diff --git a/src/main/webapp/WEB-INF/templates/event/reservation-page-complete.ms b/src/main/webapp/WEB-INF/templates/event/reservation-page-complete.ms
index c1bd1271c1..3e657b92fd 100644
--- a/src/main/webapp/WEB-INF/templates/event/reservation-page-complete.ms
+++ b/src/main/webapp/WEB-INF/templates/event/reservation-page-complete.ms
@@ -68,111 +68,15 @@
{{#ticketsByCategory}}
{{#value}}
- -
+
-
{{#i18n}}reservation-page-complete.ticket-nr [{{-index}}]{{/i18n}}
- {{^assigned}}{{#i18n}}reservation-page-complete.ticket-not-assigned{{/i18n}}{{/assigned}}
{{#i18n}}reservation-page-complete.ticket-type{{/i18n}} {{key.name}}
- {{#assigned}}
-
-
{{#i18n}}reservation-page-complete.assigned-to [{{fullName}}] [{{email}}]{{/i18n}}
-
-
-
- {{/assigned}}
-
-
-
+
+ {{> /event/assign-ticket-form}}
+
+
{{/value}}
{{/ticketsByCategory}}
diff --git a/src/main/webapp/resources/bower_components/components-font-awesome/fonts/fontawesome-webfont.eot b/src/main/webapp/resources/bower_components/components-font-awesome/fonts/fontawesome-webfont.eot
old mode 100755
new mode 100644
diff --git a/src/main/webapp/resources/bower_components/components-font-awesome/fonts/fontawesome-webfont.svg b/src/main/webapp/resources/bower_components/components-font-awesome/fonts/fontawesome-webfont.svg
old mode 100755
new mode 100644
diff --git a/src/main/webapp/resources/bower_components/components-font-awesome/fonts/fontawesome-webfont.ttf b/src/main/webapp/resources/bower_components/components-font-awesome/fonts/fontawesome-webfont.ttf
old mode 100755
new mode 100644
diff --git a/src/main/webapp/resources/bower_components/components-font-awesome/fonts/fontawesome-webfont.woff b/src/main/webapp/resources/bower_components/components-font-awesome/fonts/fontawesome-webfont.woff
old mode 100755
new mode 100644
diff --git a/src/main/webapp/resources/js/event/reservation-page-complete.js b/src/main/webapp/resources/js/event/reservation-page-complete.js
index 60b4619a31..97d9a6e6b6 100644
--- a/src/main/webapp/resources/js/event/reservation-page-complete.js
+++ b/src/main/webapp/resources/js/event/reservation-page-complete.js
@@ -3,30 +3,52 @@
'use strict';
$(function() {
- $(".update-ticket-owner").click(function() {
- $($(this).attr('href')).show().find("input:first").focus();
- return false;
- });
-
-
- $(".cancel-update").click(function() {
- $('#' + $(this).attr('data-for-form')).hide();
- })
-
-
- $("[data-dismiss=alert]").click(function() {
- $(this).parent().hide('medium');
- });
-
-
- $("select").map(function() {
-
- if($(this).attr('value').length > 0) {
- $(this).find("option[value="+$(this).attr('value')+"]").attr('selected','selected');
- }
- });
-
- $('.show-by-default').not(':eq(0)').hide();
+
+ var initListeners = function() {
+ $(".update-ticket-owner").click(function() {
+ $($(this).attr('href')).show().find("input:first").focus();
+ return false;
+ });
+
+
+ $(".cancel-update").click(function() {
+ $('#' + $(this).attr('data-for-form')).hide();
+ });
+
+
+ $("[data-dismiss=alert]").click(function() {
+ $(this).parent().hide('medium');
+ });
+
+
+ $("select").map(function() {
+
+ if($(this).attr('value').length > 0) {
+ $(this).find("option[value="+$(this).attr('value')+"]").attr('selected','selected');
+ }
+ });
+
+ $('.submit-assignee-data').click(function() {
+ var frm = $(this.form);
+ var action = frm.attr('action');
+ var uuid = frm.attr('data-ticket-uuid');
+ if (!frm[0].checkValidity()) {
+ return true;//trigger the HTML5 error messages. Thanks to Abraham http://stackoverflow.com/a/11867013
+ }
+ jQuery.ajax({
+ url: action,
+ type: 'POST',
+ data: frm.serialize(),
+ success: function(result) {
+ $('#ticket-detail-'+uuid).replaceWith(result);
+ initListeners();
+ }
+ });
+ return false;
+ });
+ };
+
+ initListeners();
});