diff --git a/src/main/java/alfio/manager/EventManager.java b/src/main/java/alfio/manager/EventManager.java index 04462c8d86..7b8514348f 100644 --- a/src/main/java/alfio/manager/EventManager.java +++ b/src/main/java/alfio/manager/EventManager.java @@ -285,7 +285,7 @@ private Integer findAdditionalService(EventAndOrganizationId event, EventModific as.getVatType(), Optional.ofNullable(as.getPrice()).map(MonetaryUtil::unitToCents).orElse(0), as.getType(), - as.getSupplementPolicy()).getChecksum(); + as.getSupplementPolicy(), null).getChecksum(); return additionalServiceRepository.loadAllForEvent(eventId).stream().filter(as1 -> as1.getChecksum().equals(checksum)).findFirst().map(AdditionalService::getId).orElse(null); } diff --git a/src/main/java/alfio/model/AdditionalService.java b/src/main/java/alfio/model/AdditionalService.java index d69df0fd1b..fc6d4707c6 100644 --- a/src/main/java/alfio/model/AdditionalService.java +++ b/src/main/java/alfio/model/AdditionalService.java @@ -79,6 +79,7 @@ public boolean isValid(int quantity, AdditionalService as, int selectionCount) { private final SupplementPolicy supplementPolicy; private final Integer srcPriceCts; + private final Integer countConfirmed; public AdditionalService(@Column("id") int id, @Column("event_id_fk") int eventId, @@ -92,7 +93,8 @@ public AdditionalService(@Column("id") int id, @Column("vat_type") VatType vatType, @Column("src_price_cts") Integer srcPriceCts, @Column("service_type") AdditionalServiceType type, - @Column("supplement_policy") SupplementPolicy supplementPolicy) { + @Column("supplement_policy") SupplementPolicy supplementPolicy, + @Column("count_confirmed") Integer countConfirmed) { this.id = id; this.eventId = eventId; this.fixPrice = fixPrice; @@ -106,6 +108,7 @@ public AdditionalService(@Column("id") int id, this.srcPriceCts = srcPriceCts; this.type = type; this.supplementPolicy = supplementPolicy; + this.countConfirmed = countConfirmed; } public ZonedDateTime getInception(ZoneId zoneId) { diff --git a/src/main/java/alfio/model/modification/EventModification.java b/src/main/java/alfio/model/modification/EventModification.java index 070016fc42..3c43eff499 100644 --- a/src/main/java/alfio/model/modification/EventModification.java +++ b/src/main/java/alfio/model/modification/EventModification.java @@ -313,6 +313,7 @@ public static class AdditionalService { private final String currencyCode; private final alfio.model.AdditionalService.AdditionalServiceType type; private final alfio.model.AdditionalService.SupplementPolicy supplementPolicy; + private final Integer countConfirmed; @JsonCreator public AdditionalService(@JsonProperty("id") Integer id, @@ -330,7 +331,7 @@ public AdditionalService(@JsonProperty("id") Integer id, @JsonProperty("description") List description, @JsonProperty("type")alfio.model.AdditionalService.AdditionalServiceType type, @JsonProperty("supplementPolicy")alfio.model.AdditionalService.SupplementPolicy supplementPolicy) { - this(id, price, fixPrice, ordinal, availableQuantity, maxQtyPerOrder, inception, expiration, vat, vatType, additionalServiceFields, title, description, null, null, type, supplementPolicy); + this(id, price, fixPrice, ordinal, availableQuantity, maxQtyPerOrder, inception, expiration, vat, vatType, additionalServiceFields, title, description, null, null, type, supplementPolicy, null); } private AdditionalService(Integer id, @@ -349,7 +350,8 @@ private AdditionalService(Integer id, BigDecimal finalPrice, String currencyCode, alfio.model.AdditionalService.AdditionalServiceType type, - alfio.model.AdditionalService.SupplementPolicy supplementPolicy) { + alfio.model.AdditionalService.SupplementPolicy supplementPolicy, + Integer countConfirmed) { this.id = id; this.price = price; this.fixPrice = fixPrice; @@ -367,6 +369,7 @@ private AdditionalService(Integer id, this.currencyCode = currencyCode; this.type = type; this.supplementPolicy = supplementPolicy; + this.countConfirmed = countConfirmed; } public static Builder from(alfio.model.AdditionalService src) { @@ -411,7 +414,7 @@ public AdditionalService build() { String currencyCode = priceContainer.map(PriceContainer::getCurrencyCode).orElse(""); return new AdditionalService(src.getId(), Optional.ofNullable(src.getSrcPriceCts()).map(MonetaryUtil::centsToUnit).orElse(BigDecimal.ZERO), src.isFixPrice(), src.getOrdinal(), src.getAvailableQuantity(), src.getMaxQtyPerOrder(), DateTimeModification.fromZonedDateTime(src.getInception(zoneId)), - DateTimeModification.fromZonedDateTime(src.getExpiration(zoneId)), src.getVat(), src.getVatType(), additionalServiceFields, title, description, finalPrice, currencyCode, src.getType(), src.getSupplementPolicy()); + DateTimeModification.fromZonedDateTime(src.getExpiration(zoneId)), src.getVat(), src.getVatType(), additionalServiceFields, title, description, finalPrice, currencyCode, src.getType(), src.getSupplementPolicy(), src.getCountConfirmed()); } } diff --git a/src/main/java/alfio/repository/AdditionalServiceRepository.java b/src/main/java/alfio/repository/AdditionalServiceRepository.java index 03af8f6827..54cb1e14bc 100644 --- a/src/main/java/alfio/repository/AdditionalServiceRepository.java +++ b/src/main/java/alfio/repository/AdditionalServiceRepository.java @@ -27,7 +27,10 @@ @QueryRepository public interface AdditionalServiceRepository { - @Query("select * from additional_service where event_id_fk = :eventId order by ordinal") + String SELECT_PREFIX = "select distinct(ads.*), sum(case asi.status when 'ACQUIRED' then 1 else 0 end) as count_confirmed from additional_service ads left join additional_service_item asi on asi.additional_service_id_fk = ads.id where ads.event_id_fk = :eventId"; + String SELECT_SUFFIX = " group by ads.id order by ads.ordinal"; + + @Query(SELECT_PREFIX + SELECT_SUFFIX) List loadAllForEvent(@Bind("eventId") int eventId); NamedParameterJdbcTemplate getJdbcTemplate(); @@ -43,10 +46,13 @@ default Map getCount(int eventId) { return res; } - @Query("select * from additional_service where id = :id and event_id_fk = :eventId") + @Query(SELECT_PREFIX + " and ads.supplement_policy = :supplementPolicy" + SELECT_SUFFIX) + List findAllInEventWithPolicy(@Bind("eventId") int eventId, @Bind("supplementPolicy") AdditionalService.SupplementPolicy policy); + + @Query(SELECT_PREFIX + " and ads.id = :id" + SELECT_SUFFIX) AdditionalService getById(@Bind("id") int id, @Bind("eventId") int eventId); - @Query("select * from additional_service where id = :id and event_id_fk = :eventId") + @Query(SELECT_PREFIX + " and ads.id = :id" + SELECT_SUFFIX) Optional getOptionalById(@Bind("id") int id, @Bind("eventId") int eventId); @Query("delete from additional_service where id = :id and event_id_fk = :eventId") @@ -69,6 +75,4 @@ int update(@Bind("id") int id, @Bind("fixPrice") boolean fixPrice, @Bind("inceptionTs") ZonedDateTime inception, @Bind("expirationTs") ZonedDateTime expiration, @Bind("vat") BigDecimal vat, @Bind("vatType") AdditionalService.VatType vatType, @Bind("srcPriceCts") int srcPriceCts); - @Query("select * from additional_service where event_id_fk = :eventId and supplement_policy = :supplementPolicy order by ordinal") - List findAllInEventWithPolicy(@Bind("eventId") int eventId, @Bind("supplementPolicy") AdditionalService.SupplementPolicy policy); } diff --git a/src/main/webapp/resources/js/admin/feature/additional-service/additional-services.html b/src/main/webapp/resources/js/admin/feature/additional-service/additional-services.html index de098cc583..cda40b9c8c 100644 --- a/src/main/webapp/resources/js/admin/feature/additional-service/additional-services.html +++ b/src/main/webapp/resources/js/admin/feature/additional-service/additional-services.html @@ -6,10 +6,16 @@

{{ctrl.title}}

-
-
{{pair[0] | showMissingASText}} /
+
+
+ {{pair[0] | showMissingASText}} / +
-
+
+
+ {{item.countConfirmed}}
+
+