diff --git a/src/main/java/alfio/controller/ReservationController.java b/src/main/java/alfio/controller/ReservationController.java index 8eaf2990fb..f8d59fc86b 100644 --- a/src/main/java/alfio/controller/ReservationController.java +++ b/src/main/java/alfio/controller/ReservationController.java @@ -181,7 +181,7 @@ public String showBookingPage(@PathVariable("eventName") String eventName, !hasPaidSupplement && configurationManager.getBooleanConfigValue(Configuration.from(event.getOrganizationId(), event.getId(), category.getId(), ALLOW_FREE_TICKETS_CANCELLATION), false), eventManager.checkTicketCancellationPrerequisites(), ticketHelper::findTicketFieldConfigurationAndValue, - true, (t) -> "tickets['"+t.getUuid()+"']."); + true, (t) -> "tickets["+t.getUuid()+"]."); return Pair.of(category, decorators); }) .collect(toList())); @@ -276,7 +276,7 @@ public String validateToOverview(@PathVariable("eventName") String eventName, @P paymentForm.setInvoiceRequested(true); } - CustomerName customerName = new CustomerName(paymentForm.getFullName(), paymentForm.getFirstName(), paymentForm.getLastName(), event); + CustomerName customerName = new CustomerName(paymentForm.getFullName(), paymentForm.getFirstName(), paymentForm.getLastName(), event, false); //persist data ticketReservationManager.updateReservation(reservationId, customerName, paymentForm.getEmail(), @@ -287,8 +287,9 @@ public String validateToOverview(@PathVariable("eventName") String eventName, @P assignTickets(event.getShortName(), reservationId, paymentForm, bindingResult, request, true, true); // - // FIXME validate! - //paymentForm.validate(bindingResult, event, ticketFieldRepository.findAdditionalFieldsForEvent(event.getId()), companyVatChecked); + // + paymentForm.validate(bindingResult, event, ticketFieldRepository.findAdditionalFieldsForEvent(event.getId()), new SameCountryValidator(vatChecker, event.getOrganizationId(), event.getId(), reservationId)); + // if(bindingResult.hasErrors()) { SessionUtil.addToFlash(bindingResult, redirectAttributes); diff --git a/src/main/java/alfio/controller/form/PaymentForm.java b/src/main/java/alfio/controller/form/PaymentForm.java index 849504c779..7b618ed27e 100644 --- a/src/main/java/alfio/controller/form/PaymentForm.java +++ b/src/main/java/alfio/controller/form/PaymentForm.java @@ -90,25 +90,24 @@ public boolean hasPaypalTokens() { return StringUtils.isNotBlank(paypalPayerID) && StringUtils.isNotBlank(paypalPaymentId); } - public void validate(BindingResult bindingResult, TotalPrice reservationCost, Event event, - List fieldConf, EuVatChecker.SameCountryValidator vatValidator) { - - List allowedPaymentMethods = event.getAllowedPaymentProxies(); - - Optional paymentProxyOptional = Optional.ofNullable(paymentMethod); - PaymentProxy paymentProxy = paymentProxyOptional.filter(allowedPaymentMethods::contains).orElse(PaymentProxy.STRIPE); - boolean priceGreaterThanZero = reservationCost.getPriceWithVAT() > 0; - boolean multiplePaymentMethods = allowedPaymentMethods.size() > 1; - if (multiplePaymentMethods && priceGreaterThanZero && !paymentProxyOptional.isPresent()) { - bindingResult.reject(ErrorsCode.STEP_2_MISSING_PAYMENT_METHOD); - } else if (priceGreaterThanZero && (paymentProxy == PaymentProxy.STRIPE && StringUtils.isBlank(stripeToken))) { - bindingResult.reject(ErrorsCode.STEP_2_MISSING_STRIPE_TOKEN); - } - - if(Objects.isNull(termAndConditionsAccepted) || !termAndConditionsAccepted - || (StringUtils.isNotEmpty(event.getPrivacyPolicyUrl()) && (Objects.isNull(privacyPolicyAccepted) || !privacyPolicyAccepted)) ) { - bindingResult.reject(ErrorsCode.STEP_2_TERMS_NOT_ACCEPTED); - } + public void validate(BindingResult bindingResult, Event event, List fieldConf, EuVatChecker.SameCountryValidator vatValidator) { + + //List allowedPaymentMethods = event.getAllowedPaymentProxies(); + + //Optional paymentProxyOptional = Optional.ofNullable(paymentMethod); + //PaymentProxy paymentProxy = paymentProxyOptional.filter(allowedPaymentMethods::contains).orElse(PaymentProxy.STRIPE); + //boolean priceGreaterThanZero = reservationCost.getPriceWithVAT() > 0; + //boolean multiplePaymentMethods = allowedPaymentMethods.size() > 1; + //if (multiplePaymentMethods && priceGreaterThanZero && !paymentProxyOptional.isPresent()) { + //bindingResult.reject(ErrorsCode.STEP_2_MISSING_PAYMENT_METHOD); + //} else if (priceGreaterThanZero && (paymentProxy == PaymentProxy.STRIPE && StringUtils.isBlank(stripeToken))) { + //bindingResult.reject(ErrorsCode.STEP_2_MISSING_STRIPE_TOKEN); + //} + + //if(Objects.isNull(termAndConditionsAccepted) || !termAndConditionsAccepted + //|| (StringUtils.isNotEmpty(event.getPrivacyPolicyUrl()) && (Objects.isNull(privacyPolicyAccepted) || !privacyPolicyAccepted)) ) { + //bindingResult.reject(ErrorsCode.STEP_2_TERMS_NOT_ACCEPTED); + //} email = StringUtils.trim(email); diff --git a/src/main/java/alfio/manager/TicketReservationManager.java b/src/main/java/alfio/manager/TicketReservationManager.java index 54f621b7f4..7feb69d973 100644 --- a/src/main/java/alfio/manager/TicketReservationManager.java +++ b/src/main/java/alfio/manager/TicketReservationManager.java @@ -1058,7 +1058,7 @@ public void updateTicketOwner(Ticket ticket, Map preUpdateTicketFields = ticketFieldRepository.findAllByTicketId(ticket.getId()).stream().collect(Collectors.toMap(TicketFieldValue::getName, TicketFieldValue::getValue)); String newEmail = updateTicketOwner.getEmail().trim(); - CustomerName customerName = new CustomerName(updateTicketOwner.getFullName(), updateTicketOwner.getFirstName(), updateTicketOwner.getLastName(), event); + CustomerName customerName = new CustomerName(updateTicketOwner.getFullName(), updateTicketOwner.getFirstName(), updateTicketOwner.getLastName(), event, false); ticketRepository.updateTicketOwner(ticket.getUuid(), newEmail, customerName.getFullName(), customerName.getFirstName(), customerName.getLastName()); // diff --git a/src/main/java/alfio/util/MustacheCustomTagInterceptor.java b/src/main/java/alfio/util/MustacheCustomTagInterceptor.java index 5c20561727..e5f3792c8c 100644 --- a/src/main/java/alfio/util/MustacheCustomTagInterceptor.java +++ b/src/main/java/alfio/util/MustacheCustomTagInterceptor.java @@ -139,18 +139,17 @@ private static Pair> parseParams(String r) { private static final Pattern ARG_PATTERN = Pattern.compile("\\[(.*)\\]"); - private static final Function HAS_ERROR = (mv) -> { - return (frag, out) -> { - Errors err = (Errors) mv.getModelMap().get("error"); - String execution = frag.execute().trim(); - Matcher matcher = ARG_PATTERN.matcher(execution); - if (matcher.find()) { - String field = matcher.group(1); - if (err != null && err.hasFieldErrors(field)) { - out.write(execution.substring(matcher.end(1) + 1)); - } + + private static final Function HAS_ERROR = (mv) -> (frag, out) -> { + Errors err = (Errors) mv.getModelMap().get("error"); + String execution = frag.execute().trim(); + Matcher matcher = ARG_PATTERN.matcher(execution); + if (matcher.find()) { + String field = matcher.group(1); + if (err != null && err.hasFieldErrors(field)) { + out.write(execution.substring(matcher.end(1) + 1)); } - }; + } }; private static final Mustache.Lambda IS_PAYMENT_METHOD = (frag, out) -> { @@ -166,20 +165,18 @@ private static Pair> parseParams(String r) { } }; - private static final Function FIELD_ERROR = (mv) -> { - return (frag, out) -> { - Errors err = (Errors) mv.getModelMap().get("error"); - String field = frag.execute().trim(); - if (err != null && err.hasFieldErrors(field)) { - FieldError fe = err.getFieldError(field); - out.write(fe.getCode() - + " " - + Arrays.stream(Optional.ofNullable(fe.getArguments()).orElse(new Object[] {})) - .map(x -> "[" + x.toString() + "]").collect(Collectors.joining(" "))); - } else { - out.write("empty"); - } - }; + private static final Function FIELD_ERROR = (mv) -> (frag, out) -> { + Errors err = (Errors) mv.getModelMap().get("error"); + String field = frag.execute().trim(); + if (err != null && err.hasFieldErrors(field)) { + FieldError fe = err.getFieldError(field); + out.write(fe.getCode() + + " " + + Arrays.stream(Optional.ofNullable(fe.getArguments()).orElse(new Object[] {})) + .map(x -> "[" + x.toString() + "]").collect(Collectors.joining(" "))); + } else { + out.write("empty"); + } }; diff --git a/src/main/java/alfio/util/Validator.java b/src/main/java/alfio/util/Validator.java index 088eac1840..e92943e76b 100644 --- a/src/main/java/alfio/util/Validator.java +++ b/src/main/java/alfio/util/Validator.java @@ -36,6 +36,7 @@ import java.math.BigDecimal; import java.util.Collection; +import java.util.Collections; import java.util.List; import java.util.Optional; import java.util.function.Predicate; @@ -218,37 +219,38 @@ public static ValidationResult validateTicketAssignment(UpdateTicketOwnerForm fo if(!isField) { continue; } - - form.getAdditional().get(fieldConf.getName()).forEach(formValue -> { + + List values = Optional.ofNullable(form.getAdditional().get(fieldConf.getName())).orElse(Collections.emptyList()); + for(int i = 0; i < values.size(); i++) { + String formValue = values.get(i); if(fieldConf.isMaxLengthDefined()) { - validateMaxLength(formValue, prefixForLambda + "additional['"+fieldConf.getName()+"']", "error."+fieldConf.getName(), fieldConf.getMaxLength(), errors); + validateMaxLength(formValue, prefixForLambda + "additional["+fieldConf.getName()+"]["+i+"]", "error."+fieldConf.getName(), fieldConf.getMaxLength(), errors); } if(StringUtils.isNotBlank(formValue) && fieldConf.isMinLengthDefined() && StringUtils.length(formValue) < fieldConf.getMinLength()) { - errors.rejectValue(prefixForLambda + "additional['"+fieldConf.getName()+"']", "error."+fieldConf.getName()); + errors.rejectValue(prefixForLambda + "additional["+fieldConf.getName()+"]["+i+"]", "error."+fieldConf.getName()); } if(!fieldConf.getRestrictedValues().isEmpty()) { - validateRestrictedValue(formValue, prefixForLambda + "additional['"+fieldConf.getName()+"']", "error."+fieldConf.getName(), fieldConf.getRestrictedValues(), errors); + validateRestrictedValue(formValue, prefixForLambda + "additional["+fieldConf.getName()+"]["+i+"]", "error."+fieldConf.getName(), fieldConf.getRestrictedValues(), errors); } if(fieldConf.isRequired() && StringUtils.isBlank(formValue)){ - errors.rejectValue(prefixForLambda + "additional['"+fieldConf.getName()+"']", "error."+fieldConf.getName()); + errors.rejectValue(prefixForLambda + "additional["+fieldConf.getName()+"]["+i+"]", "error."+fieldConf.getName()); } if(fieldConf.hasDisabledValues() && fieldConf.getDisabledValues().contains(formValue)) { - errors.rejectValue(prefixForLambda + "additional['"+fieldConf.getName()+"']", "error."+fieldConf.getName()); + errors.rejectValue(prefixForLambda + "additional["+fieldConf.getName()+"]["+i+"]", "error."+fieldConf.getName()); } try { if (fieldConf.isEuVat() && !vatValidator.test(formValue)) { - errors.rejectValue(prefixForLambda + "additional['" + fieldConf.getName() + "']", ErrorsCode.STEP_2_INVALID_VAT); + errors.rejectValue(prefixForLambda + "additional[" + fieldConf.getName() + "]["+i+"]", ErrorsCode.STEP_2_INVALID_VAT); } } catch (IllegalStateException e) { - errors.rejectValue(prefixForLambda + "additional['" + fieldConf.getName() + "']", ErrorsCode.VIES_IS_DOWN); + errors.rejectValue(prefixForLambda + "additional[" + fieldConf.getName() + "]["+i+"]", ErrorsCode.VIES_IS_DOWN); } - - }); + } } diff --git a/src/main/webapp/WEB-INF/templates/event/attendee-fields.ms b/src/main/webapp/WEB-INF/templates/event/attendee-fields.ms index e536f8aee4..49eb1828d5 100644 --- a/src/main/webapp/WEB-INF/templates/event/attendee-fields.ms +++ b/src/main/webapp/WEB-INF/templates/event/attendee-fields.ms @@ -1,5 +1,5 @@ {{#useFirstAndLastName}} -
+
{{^lockedAssignment}} @@ -10,7 +10,7 @@ {{/lockedAssignment}}
-
+
{{^lockedAssignment}} @@ -23,7 +23,7 @@
{{/useFirstAndLastName}} {{^useFirstAndLastName}} -
+
{{^lockedAssignment}} @@ -35,7 +35,7 @@
{{/useFirstAndLastName}} -
+
{{^lockedAssignment}} @@ -49,11 +49,11 @@
{{#ticketFieldConfiguration}} {{#fields}} -
+
{{#inputField}} - {{/inputField}} {{#euVat}} - {{/euVat}} {{#textareaField}} - {{/textareaField}} {{#countryField}} - {{#countries}} @@ -85,7 +85,7 @@ {{/countryField}} {{#selectField}} - {{#translatedRestrictedValue}}{{/translatedRestrictedValue}}