show free beds, see #2

This commit is contained in:
Jottyfan 2024-02-23 01:24:53 +01:00
parent 5a365b1a37
commit 8f69320505
5 changed files with 128 additions and 14 deletions

View File

@ -8,7 +8,7 @@ plugins {
} }
group = 'de.jottyfan.camporganizer' group = 'de.jottyfan.camporganizer'
version = '0.6.8' version = '0.6.9'
description = """CampOrganizer2""" description = """CampOrganizer2"""
@ -42,7 +42,7 @@ war {
dependencies { dependencies {
implementation 'org.jooq:jooq:3.19.1' implementation 'org.jooq:jooq:3.19.1'
implementation 'de.jottyfan:COJooq:2023.12.1' implementation 'de.jottyfan:COJooq:2024.02.23'
implementation 'org.apache.logging.log4j:log4j-api:2.22.0' implementation 'org.apache.logging.log4j:log4j-api:2.22.0'
implementation 'org.apache.logging.log4j:log4j-core:2.22.0' implementation 'org.apache.logging.log4j:log4j-core:2.22.0'

View File

@ -13,12 +13,10 @@ import java.time.LocalDateTime;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.HashSet; import java.util.HashSet;
import java.util.Iterator;
import java.util.List; import java.util.List;
import java.util.Set; import java.util.Set;
import jakarta.validation.Valid;
import java.util.Iterator;
import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.Logger;
import org.jooq.Condition; import org.jooq.Condition;
@ -27,7 +25,7 @@ import org.jooq.DeleteConditionStep;
import org.jooq.Field; import org.jooq.Field;
import org.jooq.InsertResultStep; import org.jooq.InsertResultStep;
import org.jooq.InsertReturningStep; import org.jooq.InsertReturningStep;
import org.jooq.InsertValuesStep11; import org.jooq.InsertValuesStep15;
import org.jooq.InsertValuesStep3; import org.jooq.InsertValuesStep3;
import org.jooq.Record4; import org.jooq.Record4;
import org.jooq.Record5; import org.jooq.Record5;
@ -61,6 +59,7 @@ import de.jottyfan.camporganizer.module.admin.model.LocationBean;
import de.jottyfan.camporganizer.module.admin.model.PrivilegesContainerBean; import de.jottyfan.camporganizer.module.admin.model.PrivilegesContainerBean;
import de.jottyfan.camporganizer.module.admin.model.ProfileBean; import de.jottyfan.camporganizer.module.admin.model.ProfileBean;
import de.jottyfan.camporganizer.module.camplist.model.LambdaResultWrapper; import de.jottyfan.camporganizer.module.camplist.model.LambdaResultWrapper;
import jakarta.validation.Valid;
/** /**
* *
@ -439,7 +438,7 @@ public class AdminRepository {
LocalDateTime arrive = arriveDate == null ? null : arriveDate.atStartOfDay(); LocalDateTime arrive = arriveDate == null ? null : arriveDate.atStartOfDay();
LocalDateTime depart = departDate == null ? null : departDate.atStartOfDay(); LocalDateTime depart = departDate == null ? null : departDate.atStartOfDay();
if (bean.getPk() == null) { if (bean.getPk() == null) {
InsertValuesStep11<TCampRecord, LocalDateTime, String, LocalDateTime, Integer, Integer, Integer, Boolean, Integer, Integer, String, String> sql = DSL InsertValuesStep15<TCampRecord, LocalDateTime, String, LocalDateTime, Integer, Integer, Integer, Boolean, Integer, Integer, String, String, Integer, Integer, Integer, Integer> sql = DSL
.using(t) .using(t)
// @formatter:off // @formatter:off
.insertInto(T_CAMP, .insertInto(T_CAMP,
@ -453,9 +452,14 @@ public class AdminRepository {
T_CAMP.MAX_AGE, T_CAMP.MAX_AGE,
T_CAMP.MIN_AGE, T_CAMP.MIN_AGE,
T_CAMP.NAME, T_CAMP.NAME,
T_CAMP.PRICE) T_CAMP.PRICE,
T_CAMP.BEDS_FEMALE,
T_CAMP.BEDS_MALE,
T_CAMP.BLOCKED_BEDS_FEMALE,
T_CAMP.BLOCKED_BEDS_MALE)
.values(arrive, bean.getCountries(), depart, bean.getFkDocument(), bean.getFkLocation(), bean.getFkProfile(), .values(arrive, bean.getCountries(), depart, bean.getFkDocument(), bean.getFkLocation(), bean.getFkProfile(),
bean.getLockSales() != null ? bean.getLockSales() : false, bean.getMaxAge(), bean.getMinAge(), bean.getName(), bean.getPrice()); bean.getLockSales() != null ? bean.getLockSales() : false, bean.getMaxAge(), bean.getMinAge(), bean.getName(), bean.getPrice(),
bean.getBedsFemale(), bean.getBedsMale(), bean.getBlockedBedsFemale(), bean.getBlockedBedsMale());
// @formatter:on // @formatter:on
LOGGER.debug(sql.toString()); LOGGER.debug(sql.toString());
sql.execute(); sql.execute();
@ -474,6 +478,10 @@ public class AdminRepository {
.set(T_CAMP.MIN_AGE, bean.getMinAge()) .set(T_CAMP.MIN_AGE, bean.getMinAge())
.set(T_CAMP.NAME, bean.getName()) .set(T_CAMP.NAME, bean.getName())
.set(T_CAMP.PRICE, bean.getPrice()) .set(T_CAMP.PRICE, bean.getPrice())
.set(T_CAMP.BEDS_FEMALE, bean.getBedsFemale())
.set(T_CAMP.BEDS_MALE, bean.getBedsMale())
.set(T_CAMP.BLOCKED_BEDS_FEMALE, bean.getBlockedBedsFemale())
.set(T_CAMP.BLOCKED_BEDS_MALE, bean.getBlockedBedsMale())
.where(T_CAMP.PK.eq(bean.getPk())); .where(T_CAMP.PK.eq(bean.getPk()));
// @formatter:on // @formatter:on
LOGGER.debug(sql.toString()); LOGGER.debug(sql.toString());

View File

@ -7,12 +7,12 @@ import java.time.format.DateTimeFormatter;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import org.springframework.format.annotation.DateTimeFormat; import org.springframework.format.annotation.DateTimeFormat;
import de.jottyfan.camporganizer.db.jooq.tables.records.TCampRecord; import de.jottyfan.camporganizer.db.jooq.tables.records.TCampRecord;
import jakarta.validation.constraints.Min;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
/** /**
* *
@ -45,6 +45,18 @@ public class CampBean implements Serializable {
private String countries; private String countries;
@NotNull @NotNull
private String price; private String price;
@NotNull
@Min(value = 0)
private Integer bedsFemale;
@NotNull
@Min(value = 0)
private Integer bedsMale;
@NotNull
@Min(value = 0)
private Integer blockedBedsFemale;
@NotNull
@Min(value = 0)
private Integer blockedBedsMale;
/** /**
* generate a camp bean out of r * generate a camp bean out of r
@ -71,6 +83,10 @@ public class CampBean implements Serializable {
bean.setName(r.getName()); bean.setName(r.getName());
bean.setPk(r.getPk()); bean.setPk(r.getPk());
bean.setPrice(r.getPrice()); bean.setPrice(r.getPrice());
bean.setBedsFemale(r.getBedsFemale());
bean.setBedsMale(r.getBedsMale());
bean.setBlockedBedsFemale(r.getBlockedBedsFemale());
bean.setBlockedBedsMale(r.getBlockedBedsMale());
return bean; return bean;
} }
@ -272,4 +288,60 @@ public class CampBean implements Serializable {
} }
this.countries = buf.toString(); this.countries = buf.toString();
} }
/**
* @return the bedsFemale
*/
public Integer getBedsFemale() {
return bedsFemale;
}
/**
* @param bedsFemale the bedsFemale to set
*/
public void setBedsFemale(Integer bedsFemale) {
this.bedsFemale = bedsFemale;
}
/**
* @return the bedsMale
*/
public Integer getBedsMale() {
return bedsMale;
}
/**
* @param bedsMale the bedsMale to set
*/
public void setBedsMale(Integer bedsMale) {
this.bedsMale = bedsMale;
}
/**
* @return the blockedBedsFemale
*/
public Integer getBlockedBedsFemale() {
return blockedBedsFemale;
}
/**
* @param blockedBedsFemale the blockedBedsFemale to set
*/
public void setBlockedBedsFemale(Integer blockedBedsFemale) {
this.blockedBedsFemale = blockedBedsFemale;
}
/**
* @return the blockedBedsMale
*/
public Integer getBlockedBedsMale() {
return blockedBedsMale;
}
/**
* @param blockedBedsMale the blockedBedsMale to set
*/
public void setBlockedBedsMale(Integer blockedBedsMale) {
this.blockedBedsMale = blockedBedsMale;
}
} }

View File

@ -119,6 +119,34 @@
</script> </script>
</div> </div>
</div> </div>
<div class="row mb-2">
<label for="inputBedsFemale" class="col-sm-2 col-form-label">Anzahl Betten für Mädchen</label>
<div class="col-sm-10">
<span class="error" th:each="error : ${#fields.errors('bedsFemale')}">[[${error}]]<br /></span>
<input type="number" class="form-control" th:field="*{bedsFemale}" />
</div>
</div>
<div class="row mb-2">
<label for="inputBedsMale" class="col-sm-2 col-form-label">Anzahl Betten für Jungen</label>
<div class="col-sm-10">
<span class="error" th:each="error : ${#fields.errors('bedsMale')}">[[${error}]]<br /></span>
<input type="number" class="form-control" th:field="*{bedsMale}" />
</div>
</div>
<div class="row mb-2">
<label for="inputBlockedBedsFemale" class="col-sm-2 col-form-label">Reservierte Betten für Mädchen</label>
<div class="col-sm-10">
<span class="error" th:each="error : ${#fields.errors('blockedBedsFemale')}">[[${error}]]<br /></span>
<input type="number" class="form-control" th:field="*{blockedBedsFemale}" />
</div>
</div>
<div class="row mb-2">
<label for="inputBlockedBedsMale" class="col-sm-2 col-form-label">Reservierte Betten für Jungen</label>
<div class="col-sm-10">
<span class="error" th:each="error : ${#fields.errors('blockedBedsMale')}">[[${error}]]<br /></span>
<input type="number" class="form-control" th:field="*{blockedBedsMale}" />
</div>
</div>
<div class="row mb-2"> <div class="row mb-2">
<label for="inputLockSales" class="col-sm-2 col-form-label">Kassenschluss</label> <label for="inputLockSales" class="col-sm-2 col-form-label">Kassenschluss</label>
<div class="col-sm-10"> <div class="col-sm-10">

View File

@ -14,8 +14,8 @@
<div class="accordion-body"> <div class="accordion-body">
<table style="width: 100%"> <table style="width: 100%">
<tr> <tr>
<td rowspan="4"><img th:src="@{/images/Icon_Stern.svg}" width="36px" height="36px" style="margin-left: 24px" /></td> <td rowspan="5"><img th:src="@{/images/Icon_Stern.svg}" width="36px" height="36px" style="margin-left: 24px" /></td>
<td rowspan="4"> <td rowspan="5">
<div> <div>
Biblische Geschichten<br /> Nachtwanderung<br /> Gruppenspiele<br /> Ausflüge<br /> Überraschungen Biblische Geschichten<br /> Nachtwanderung<br /> Gruppenspiele<br /> Ausflüge<br /> Überraschungen
</div> </div>
@ -38,6 +38,12 @@
<p th:text="${c.price}"></p> <p th:text="${c.price}"></p>
</div></td> </div></td>
</tr> </tr>
<tr th:if="${c.bedsFemale + c.bedsMale > 0}">
<td><img th:src="@{/images/Icon_Bett.svg}" width="36px" height="36px" style="margin-top: 24px" /></td>
<td><div style="margin-top: 24px">
<p style="width: 200px" th:utext="${'es sind nur noch <br />' + (c.bedsFemale - c.blockedBedsFemale - c.usedBedsFemale) + ' Mädchen- und ' + (c.bedsMale - c.blockedBedsMale - c.usedBedsMale) + ' Jungs-<br />von ' + (c.bedsFemale + c.bedsMale) + ' Betten frei'}"></p>
</div></td>
</tr>
</table> </table>
<div style="text-align: center; margin-top: 64px"> <div style="text-align: center; margin-top: 64px">
<a class="btn btn-linda buttonfont" th:href="@{/registration/{id}(id=${c.pk})}">jetzt anmelden</a> <a class="btn btn-linda buttonfont" th:href="@{/registration/{id}(id=${c.pk})}">jetzt anmelden</a>