Compare commits
4 Commits
Author | SHA1 | Date | |
---|---|---|---|
31727e23ac | |||
2abb937725 | |||
b5403ae20c | |||
ae9e2018a8 |
20
build.gradle
20
build.gradle
@ -1,5 +1,5 @@
|
||||
plugins {
|
||||
id 'org.springframework.boot' version '3.2.4'
|
||||
id 'org.springframework.boot' version '3.3.4'
|
||||
id "io.spring.dependency-management" version "1.1.4"
|
||||
id 'java'
|
||||
id 'war'
|
||||
@ -8,7 +8,7 @@ plugins {
|
||||
}
|
||||
|
||||
group = 'de.jottyfan.camporganizer'
|
||||
version = '0.8.5'
|
||||
version = '0.8.7'
|
||||
|
||||
description = """CampOrganizer2"""
|
||||
|
||||
@ -40,15 +40,15 @@ war {
|
||||
}
|
||||
|
||||
dependencies {
|
||||
implementation 'org.jooq:jooq:3.19.6'
|
||||
implementation 'de.jottyfan:COJooq:2024.03.16c'
|
||||
implementation 'org.jooq:jooq:3.19.14'
|
||||
implementation 'de.jottyfan:COJooq:2024.10.24'
|
||||
|
||||
implementation 'org.apache.logging.log4j:log4j-api:2.23.1'
|
||||
implementation 'org.apache.logging.log4j:log4j-core:2.23.1'
|
||||
implementation 'org.apache.logging.log4j:log4j-to-slf4j:2.23.1'
|
||||
implementation 'org.apache.logging.log4j:log4j-api:2.24.1'
|
||||
implementation 'org.apache.logging.log4j:log4j-core:2.24.1'
|
||||
implementation 'org.apache.logging.log4j:log4j-to-slf4j:2.24.1'
|
||||
|
||||
implementation 'org.webjars:bootstrap:5.3.2'
|
||||
implementation 'org.webjars:font-awesome:6.5.1'
|
||||
implementation 'org.webjars:bootstrap:5.3.3'
|
||||
implementation 'org.webjars:font-awesome:6.5.2'
|
||||
implementation 'org.webjars:jquery:3.7.1'
|
||||
implementation 'org.webjars:popper.js:2.11.7'
|
||||
implementation 'org.webjars:datatables:1.13.5'
|
||||
@ -74,7 +74,7 @@ dependencies {
|
||||
implementation 'org.springframework.boot:spring-boot-starter-jooq'
|
||||
implementation 'org.springframework.boot:spring-boot-starter-security'
|
||||
implementation "org.springframework.boot:spring-boot-starter-oauth2-client"
|
||||
implementation 'org.springframework.security:spring-security-oauth2-authorization-server:1.2.1'
|
||||
implementation 'org.springframework.security:spring-security-oauth2-authorization-server:1.3.3'
|
||||
implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
|
||||
implementation 'org.springframework.boot:spring-boot-starter-web'
|
||||
implementation 'org.springframework.boot:spring-boot-starter-validation'
|
||||
|
@ -31,7 +31,7 @@ public class Main extends SpringBootServletInitializer {
|
||||
Path path = Paths.get("");
|
||||
String p = path.toAbsolutePath().toString();
|
||||
p = p.substring(p.lastIndexOf("/") + 1);
|
||||
LOGGER.info("running in {}", p);
|
||||
LOGGER.debug("running in {}", p);
|
||||
// TODO: put p + "properties" somehow into consideration to load the application.properties
|
||||
SpringApplication.run(Main.class, args);
|
||||
}
|
||||
|
@ -96,7 +96,7 @@ public class AdminRepository {
|
||||
.groupBy(T_DOCUMENT.PK, T_DOCUMENT.NAME, T_DOCUMENT.DOCTYPE, T_DOCUMENT.FILETYPE)
|
||||
.orderBy(T_DOCUMENT.PK);
|
||||
// @formatter:on
|
||||
LOGGER.debug(sql.toString());
|
||||
LOGGER.trace(sql);
|
||||
Record5<Integer, String, EnumDocument, EnumFiletype, EnumCamprole[]> r = sql.fetchOne();
|
||||
if (r != null) {
|
||||
DocumentBean bean = new DocumentBean();
|
||||
@ -129,7 +129,7 @@ public class AdminRepository {
|
||||
.groupBy(T_DOCUMENT.PK, T_DOCUMENT.NAME, T_DOCUMENT.DOCTYPE, T_DOCUMENT.FILETYPE)
|
||||
.orderBy(T_DOCUMENT.PK);
|
||||
// @formatter:on
|
||||
LOGGER.debug(sql.toString());
|
||||
LOGGER.trace(sql.toString());
|
||||
List<DocumentBean> list = new ArrayList<>();
|
||||
Iterator<Record5<Integer, String, EnumDocument, EnumFiletype, EnumCamprole[]>> i = sql.fetch().iterator();
|
||||
while (i.hasNext()) {
|
||||
@ -162,7 +162,7 @@ public class AdminRepository {
|
||||
.from(T_DOCUMENT)
|
||||
.where(condition);
|
||||
// @formatter:on
|
||||
LOGGER.debug(sql.toString());
|
||||
LOGGER.trace(sql);
|
||||
List<DocumentBean> list = new ArrayList<>();
|
||||
Iterator<Record4<Integer, String, EnumDocument, EnumFiletype>> i = sql.fetch().iterator();
|
||||
while (i.hasNext()) {
|
||||
@ -202,7 +202,7 @@ public class AdminRepository {
|
||||
.set(T_DOCUMENT.FILETYPE, bean.getFiletype())
|
||||
.where(T_DOCUMENT.PK.eq(bean.getPk()));
|
||||
// @formatter:on
|
||||
LOGGER.debug("{}", sql.toString());
|
||||
LOGGER.trace(sql);
|
||||
lrw.add(sql.execute());
|
||||
} else {
|
||||
InsertResultStep<TDocumentRecord> sql = DSL.using(c)
|
||||
@ -215,7 +215,7 @@ public class AdminRepository {
|
||||
.values(bean.getName(), bean.getDoctype(), bean.getDocument(), bean.getFiletype())
|
||||
.returning(T_DOCUMENT.PK);
|
||||
// @formatter:on
|
||||
LOGGER.debug("{}", sql.toString());
|
||||
LOGGER.trace(sql);
|
||||
pk = sql.fetchOne().get(T_DOCUMENT.PK);
|
||||
lrw.add(1);
|
||||
}
|
||||
@ -233,7 +233,7 @@ public class AdminRepository {
|
||||
.onConflict(T_DOCUMENTROLE.FK_DOCUMENT, T_DOCUMENTROLE.CAMPROLE)
|
||||
.doNothing();
|
||||
// @formatter:on
|
||||
LOGGER.debug("{}", sql.toString());
|
||||
LOGGER.trace(sql);
|
||||
lrw.add(sql.execute());
|
||||
removeCandidates.remove(role);
|
||||
} catch (IllegalArgumentException e) {
|
||||
@ -246,7 +246,7 @@ public class AdminRepository {
|
||||
.where(T_DOCUMENTROLE.FK_DOCUMENT.eq(pk))
|
||||
.and(T_DOCUMENTROLE.CAMPROLE.in(removeCandidates));
|
||||
// @formatter:on
|
||||
LOGGER.debug("{}", sql.toString());
|
||||
LOGGER.trace(sql);
|
||||
lrw.add(sql.execute());
|
||||
});
|
||||
return lrw.getCounter();
|
||||
@ -268,7 +268,7 @@ public class AdminRepository {
|
||||
.set(T_CAMP.FK_DOCUMENT, (Integer) null)
|
||||
.where(T_CAMP.FK_DOCUMENT.eq(pk));
|
||||
// @formatter:on
|
||||
LOGGER.debug("{}", sql.toString());
|
||||
LOGGER.trace(sql);
|
||||
lrw.add(sql.execute());
|
||||
|
||||
UpdateConditionStep<TLocationRecord> sql1 = DSL.using(t)
|
||||
@ -277,7 +277,7 @@ public class AdminRepository {
|
||||
.set(T_LOCATION.FK_DOCUMENT, (Integer) null)
|
||||
.where(T_LOCATION.FK_DOCUMENT.eq(pk));
|
||||
// @formatter:on
|
||||
LOGGER.debug("{}", sql1.toString());
|
||||
LOGGER.trace(sql1);
|
||||
lrw.add(sql1.execute());
|
||||
|
||||
DeleteConditionStep<TDocumentroleRecord> sql2 = DSL.using(t)
|
||||
@ -285,7 +285,7 @@ public class AdminRepository {
|
||||
.deleteFrom(T_DOCUMENTROLE)
|
||||
.where(T_DOCUMENTROLE.FK_DOCUMENT.eq(pk));
|
||||
// @formatter:on
|
||||
LOGGER.debug("{}", sql2.toString());
|
||||
LOGGER.trace(sql2);
|
||||
lrw.add(sql2.execute());
|
||||
|
||||
DeleteConditionStep<TDocumentRecord> sql3 = DSL.using(t)
|
||||
@ -293,7 +293,7 @@ public class AdminRepository {
|
||||
.deleteFrom(T_DOCUMENT)
|
||||
.where(T_DOCUMENT.PK.eq(pk));
|
||||
// @formatter:on
|
||||
LOGGER.debug("{}", sql3.toString());
|
||||
LOGGER.trace(sql3);
|
||||
lrw.add(sql3.execute());
|
||||
});
|
||||
return lrw.getCounter();
|
||||
@ -306,7 +306,7 @@ public class AdminRepository {
|
||||
*/
|
||||
public List<LocationBean> getLocations() {
|
||||
SelectWhereStep<TLocationRecord> sql = jooq.selectFrom(T_LOCATION);
|
||||
LOGGER.debug(sql.toString());
|
||||
LOGGER.trace(sql);
|
||||
List<LocationBean> list = new ArrayList<>();
|
||||
for (TLocationRecord r : sql.fetch()) {
|
||||
list.add(LocationBean.of(r));
|
||||
@ -322,7 +322,7 @@ public class AdminRepository {
|
||||
*/
|
||||
public LocationBean getLocation(Integer id) {
|
||||
SelectConditionStep<TLocationRecord> sql = jooq.selectFrom(T_LOCATION).where(T_LOCATION.PK.eq(id));
|
||||
LOGGER.debug(sql.toString());
|
||||
LOGGER.trace(sql);
|
||||
return LocationBean.of(sql.fetchOne());
|
||||
}
|
||||
|
||||
@ -334,7 +334,7 @@ public class AdminRepository {
|
||||
*/
|
||||
public Integer deleteLocation(Integer id) {
|
||||
DeleteConditionStep<TLocationRecord> sql = jooq.deleteFrom(T_LOCATION).where(T_LOCATION.PK.eq(id));
|
||||
LOGGER.debug(sql.toString());
|
||||
LOGGER.trace(sql);
|
||||
return sql.execute();
|
||||
}
|
||||
|
||||
@ -356,7 +356,7 @@ public class AdminRepository {
|
||||
T_LOCATION.URL)
|
||||
.values(bean.getName(), bean.getFkDocument(), bean.getUrl());
|
||||
// @formatter:on
|
||||
LOGGER.debug(sql.toString());
|
||||
LOGGER.trace(sql);
|
||||
lrw.add(sql.execute());
|
||||
} else {
|
||||
UpdateConditionStep<TLocationRecord> sql = DSL.using(t)
|
||||
@ -367,7 +367,7 @@ public class AdminRepository {
|
||||
.set(T_LOCATION.URL, bean.getUrl())
|
||||
.where(T_LOCATION.PK.eq(bean.getPk()));
|
||||
// @formatter:on
|
||||
LOGGER.debug(sql.toString());
|
||||
LOGGER.trace(sql);
|
||||
lrw.add(sql.execute());
|
||||
}
|
||||
});
|
||||
@ -381,7 +381,7 @@ public class AdminRepository {
|
||||
*/
|
||||
public List<CampBean> getAllCamps() {
|
||||
SelectWhereStep<TCampRecord> sql = jooq.selectFrom(T_CAMP);
|
||||
LOGGER.debug(sql.toString());
|
||||
LOGGER.trace(sql);
|
||||
List<CampBean> list = new ArrayList<>();
|
||||
for (TCampRecord r : sql.fetch()) {
|
||||
list.add(CampBean.of(r));
|
||||
@ -397,7 +397,7 @@ public class AdminRepository {
|
||||
*/
|
||||
public CampBean getCamp(Integer id) {
|
||||
SelectConditionStep<TCampRecord> sql = jooq.selectFrom(T_CAMP).where(T_CAMP.PK.eq(id));
|
||||
LOGGER.debug(sql.toString());
|
||||
LOGGER.trace(sql);
|
||||
return CampBean.of(sql.fetchOne());
|
||||
}
|
||||
|
||||
@ -411,11 +411,11 @@ public class AdminRepository {
|
||||
LambdaResultWrapper lrw = new LambdaResultWrapper();
|
||||
jooq.transaction(t -> {
|
||||
SelectConditionStep<TPersonRecord> sql1 = DSL.using(t).selectFrom(T_PERSON).where(T_PERSON.FK_CAMP.eq(id));
|
||||
LOGGER.debug(sql1.toString());
|
||||
LOGGER.trace(sql1);
|
||||
Integer registrations = sql1.fetch().size();
|
||||
if (registrations < 1) {
|
||||
DeleteConditionStep<TCampRecord> sql2 = DSL.using(t).deleteFrom(T_CAMP).where(T_CAMP.PK.eq(id));
|
||||
LOGGER.debug(sql2.toString());
|
||||
LOGGER.trace(sql2);
|
||||
sql2.execute();
|
||||
} else {
|
||||
lrw.putString("error", String
|
||||
@ -464,7 +464,7 @@ public class AdminRepository {
|
||||
bean.getLockSales() != null ? bean.getLockSales() : false, bean.getMaxAge(), bean.getMinAge(), bean.getName(), bean.getPrice(),
|
||||
bean.getBedsFemale(), bean.getBedsMale(), bean.getBlockedBedsFemale(), bean.getBlockedBedsMale(), startBooking);
|
||||
// @formatter:on
|
||||
LOGGER.debug(sql.toString());
|
||||
LOGGER.trace(sql);
|
||||
sql.execute();
|
||||
} else {
|
||||
UpdateConditionStep<TCampRecord> sql = DSL.using(t)
|
||||
@ -488,7 +488,7 @@ public class AdminRepository {
|
||||
.set(T_CAMP.START_BOOKING, startBooking)
|
||||
.where(T_CAMP.PK.eq(bean.getPk()));
|
||||
// @formatter:on
|
||||
LOGGER.debug(sql.toString());
|
||||
LOGGER.trace(sql);
|
||||
sql.execute();
|
||||
}
|
||||
});
|
||||
@ -502,7 +502,7 @@ public class AdminRepository {
|
||||
*/
|
||||
public List<ProfileBean> getProfiles() {
|
||||
SelectWhereStep<TProfileRecord> sql = jooq.selectFrom(T_PROFILE);
|
||||
LOGGER.debug(sql.toString());
|
||||
LOGGER.trace(sql);
|
||||
List<ProfileBean> list = new ArrayList<>();
|
||||
for (TProfileRecord r : sql.fetch()) {
|
||||
list.add(ProfileBean.of(r));
|
||||
@ -542,7 +542,7 @@ public class AdminRepository {
|
||||
.where(T_CAMPPROFILE.MODULE.eq(module))
|
||||
.orderBy(T_CAMP.ARRIVE, T_PROFILE.PK);
|
||||
// @formatter:on
|
||||
LOGGER.debug(sql.toString());
|
||||
LOGGER.trace(sql);
|
||||
PrivilegesContainerBean pcb = new PrivilegesContainerBean();
|
||||
Iterator<Record4<Integer, String, LocalDateTime, String>> i = sql.fetch().iterator();
|
||||
while (i.hasNext()) {
|
||||
@ -579,7 +579,7 @@ public class AdminRepository {
|
||||
.where(T_CAMPPROFILE.FK_PROFILE.eq(user))
|
||||
.orderBy(T_CAMP.ARRIVE);
|
||||
// @formatter:on
|
||||
LOGGER.debug(sql.toString());
|
||||
LOGGER.trace(sql);
|
||||
PrivilegesContainerBean pcb = new PrivilegesContainerBean();
|
||||
Iterator<Record4<Integer, String, LocalDateTime, EnumModule>> i = sql.fetch().iterator();
|
||||
while (i.hasNext()) {
|
||||
@ -618,7 +618,7 @@ public class AdminRepository {
|
||||
.where(T_CAMPPROFILE.FK_CAMP.eq(camp))
|
||||
.orderBy(T_PROFILE.SURNAME, T_PROFILE.FORENAME);
|
||||
// @formatter:on
|
||||
LOGGER.debug(sql.toString());
|
||||
LOGGER.trace(sql);
|
||||
PrivilegesContainerBean pcb = new PrivilegesContainerBean();
|
||||
Iterator<Record4<Integer, String, String, EnumModule>> i = sql.fetch().iterator();
|
||||
while (i.hasNext()) {
|
||||
@ -644,7 +644,7 @@ public class AdminRepository {
|
||||
*/
|
||||
public void deleteFromCampProfile(Integer id) {
|
||||
DeleteConditionStep<TCampprofileRecord> sql = jooq.deleteFrom(T_CAMPPROFILE).where(T_CAMPPROFILE.PK.eq(id));
|
||||
LOGGER.debug(sql.toString());
|
||||
LOGGER.trace(sql);
|
||||
sql.execute();
|
||||
}
|
||||
|
||||
@ -668,7 +668,7 @@ public class AdminRepository {
|
||||
T_CAMPPROFILE.MODULE)
|
||||
.doNothing();
|
||||
// @formatter:on
|
||||
LOGGER.debug(sql.toString());
|
||||
LOGGER.trace(sql);
|
||||
sql.execute();
|
||||
}
|
||||
}
|
||||
|
@ -1,8 +1,8 @@
|
||||
package de.jottyfan.camporganizer.module.business.bookings;
|
||||
|
||||
import static de.jottyfan.camporganizer.db.jooq.Tables.T_CAMPPROFILE;
|
||||
import static de.jottyfan.camporganizer.db.jooq.Tables.T_PERSON;
|
||||
import static de.jottyfan.camporganizer.db.jooq.Tables.T_PROFILE;
|
||||
import static de.jottyfan.camporganizer.db.jooq.Tables.T_CAMPPROFILE;
|
||||
import static de.jottyfan.camporganizer.db.jooq.Tables.V_CAMP;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
@ -27,6 +27,7 @@ import org.springframework.transaction.annotation.Transactional;
|
||||
import de.jottyfan.camporganizer.db.EnumConverter;
|
||||
import de.jottyfan.camporganizer.db.jooq.enums.EnumCamprole;
|
||||
import de.jottyfan.camporganizer.db.jooq.enums.EnumModule;
|
||||
import de.jottyfan.camporganizer.db.jooq.enums.EnumProgress;
|
||||
import de.jottyfan.camporganizer.db.jooq.enums.EnumSex;
|
||||
import de.jottyfan.camporganizer.db.jooq.tables.records.TPersonRecord;
|
||||
import de.jottyfan.camporganizer.module.business.bookings.model.BookerBean;
|
||||
@ -52,9 +53,9 @@ public class BookingsRepository {
|
||||
* @return a list of bookings; an empty one at least
|
||||
*/
|
||||
public List<BookerBean> getBookings(String username) {
|
||||
SelectSeekStep4<Record10<Integer, Boolean, BigDecimal, String, String, EnumCamprole, EnumSex, LocalDateTime, String, Double>, EnumCamprole, EnumSex, String, String> sql = jooq
|
||||
SelectSeekStep4<Record10<Integer, EnumProgress, BigDecimal, String, String, EnumCamprole, EnumSex, LocalDateTime, String, Double>, EnumCamprole, EnumSex, String, String> sql = jooq
|
||||
// @formatter:off
|
||||
.select(T_PERSON.PK, T_PERSON.ACCEPT, T_PERSON.PAID, T_PERSON.FORENAME, T_PERSON.SURNAME, T_PERSON.CAMPROLE, T_PERSON.SEX, T_PERSON.CREATED, V_CAMP.NAME, V_CAMP.YEAR)
|
||||
.select(T_PERSON.PK, T_PERSON.PROGRESS, T_PERSON.PAID, T_PERSON.FORENAME, T_PERSON.SURNAME, T_PERSON.CAMPROLE, T_PERSON.SEX, T_PERSON.CREATED, V_CAMP.NAME, V_CAMP.YEAR)
|
||||
.from(T_PERSON)
|
||||
.leftJoin(V_CAMP).on(V_CAMP.PK.eq(T_PERSON.FK_CAMP))
|
||||
.leftJoin(T_CAMPPROFILE).on(T_CAMPPROFILE.FK_CAMP.eq(T_PERSON.FK_CAMP)).and(T_CAMPPROFILE.MODULE.eq(EnumModule.business))
|
||||
@ -62,15 +63,16 @@ public class BookingsRepository {
|
||||
.where(T_PROFILE.USERNAME.eq(username))
|
||||
.orderBy(T_PERSON.CAMPROLE, T_PERSON.SEX, T_PERSON.SURNAME, T_PERSON.FORENAME);
|
||||
// @formatter:on
|
||||
LOGGER.debug(sql.toString());
|
||||
LOGGER.trace(sql);
|
||||
List<BookerBean> list = new ArrayList<>();
|
||||
Iterator<Record10<Integer, Boolean, BigDecimal, String, String, EnumCamprole, EnumSex, LocalDateTime, String, Double>> i = sql.fetch().iterator();
|
||||
Iterator<Record10<Integer, EnumProgress, BigDecimal, String, String, EnumCamprole, EnumSex, LocalDateTime, String, Double>> i = sql.fetch().iterator();
|
||||
while (i.hasNext()) {
|
||||
Record10<Integer, Boolean, BigDecimal, String, String, EnumCamprole, EnumSex, LocalDateTime, String, Double> r = i.next();
|
||||
Record10<Integer, EnumProgress, BigDecimal, String, String, EnumCamprole, EnumSex, LocalDateTime, String, Double> r = i.next();
|
||||
String forename = r.get(T_PERSON.FORENAME);
|
||||
String surname = r.get(T_PERSON.SURNAME);
|
||||
EnumCamprole role = r.get(T_PERSON.CAMPROLE);
|
||||
EnumSex sex = r.get(T_PERSON.SEX);
|
||||
EnumProgress progress = r.get(T_PERSON.PROGRESS);
|
||||
String campName = r.get(V_CAMP.NAME);
|
||||
Double campYear = r.get(V_CAMP.YEAR);
|
||||
BookerBean bean = new BookerBean();
|
||||
@ -79,7 +81,7 @@ public class BookingsRepository {
|
||||
bean.setRole(EnumConverter.role2GermanNames(role));
|
||||
bean.setSex(EnumConverter.sex2GermanNames(sex));
|
||||
bean.setBookingDate(r.get(T_PERSON.CREATED));
|
||||
bean.setAccept(r.get(T_PERSON.ACCEPT));
|
||||
bean.setProgress(progress == null ? null : progress.getLiteral());
|
||||
bean.setPaid(r.get(T_PERSON.PAID));
|
||||
bean.setCamp(String.format("%s %4.0f", campName, campYear));
|
||||
list.add(bean);
|
||||
@ -95,10 +97,10 @@ public class BookingsRepository {
|
||||
* @return the booker bean or null
|
||||
*/
|
||||
public BookerBean getBooking(Integer id, String username) {
|
||||
SelectConditionStep<Record13<Integer, Boolean, BigDecimal, String, String, EnumCamprole, EnumSex, LocalDateTime, BigDecimal, String, Double, String, Integer>> sql = jooq
|
||||
SelectConditionStep<Record13<Integer, EnumProgress, BigDecimal, String, String, EnumCamprole, EnumSex, LocalDateTime, BigDecimal, String, Double, String, Integer>> sql = jooq
|
||||
// @formatter:off
|
||||
.select(T_PERSON.PK,
|
||||
T_PERSON.ACCEPT,
|
||||
T_PERSON.PROGRESS,
|
||||
T_PERSON.PAID,
|
||||
T_PERSON.FORENAME,
|
||||
T_PERSON.SURNAME,
|
||||
@ -117,7 +119,7 @@ public class BookingsRepository {
|
||||
.where(T_PROFILE.USERNAME.eq(username))
|
||||
.and(T_PERSON.PK.eq(id));
|
||||
// @formatter:on
|
||||
LOGGER.debug(sql.toString());
|
||||
LOGGER.trace(sql);
|
||||
Record r = sql.fetchOne();
|
||||
if (r == null) {
|
||||
return null;
|
||||
@ -126,6 +128,7 @@ public class BookingsRepository {
|
||||
String surname = r.get(T_PERSON.SURNAME);
|
||||
EnumCamprole role = r.get(T_PERSON.CAMPROLE);
|
||||
EnumSex sex = r.get(T_PERSON.SEX);
|
||||
EnumProgress progress = r.get(T_PERSON.PROGRESS);
|
||||
BigDecimal requiredPrice = r.get(T_PERSON.REQUIRED_PRICE);
|
||||
String campName = r.get(V_CAMP.NAME);
|
||||
Double campYear = r.get(V_CAMP.YEAR);
|
||||
@ -136,7 +139,7 @@ public class BookingsRepository {
|
||||
bean.setRole(EnumConverter.role2GermanNames(role));
|
||||
bean.setSex(EnumConverter.sex2GermanNames(sex));
|
||||
bean.setBookingDate(r.get(T_PERSON.CREATED));
|
||||
bean.setAccept(r.get(T_PERSON.ACCEPT));
|
||||
bean.setProgress(progress == null ? null : progress.getLiteral());
|
||||
bean.setPaid(r.get(T_PERSON.PAID));
|
||||
bean.setCamp(String.format("%s %4.0f", campName, campYear));
|
||||
bean.setCampId(campId);
|
||||
@ -162,7 +165,7 @@ public class BookingsRepository {
|
||||
.set(T_PERSON.PAID, value)
|
||||
.where(T_PERSON.PK.eq(pk));
|
||||
// @formatter:on
|
||||
LOGGER.debug(sql.toString());
|
||||
LOGGER.trace(sql);
|
||||
return sql.execute();
|
||||
}
|
||||
}
|
||||
|
@ -10,13 +10,13 @@ import java.time.LocalDateTime;
|
||||
*
|
||||
*/
|
||||
public class BookerBean implements Serializable {
|
||||
private static final long serialVersionUID = 1L;
|
||||
private static final long serialVersionUID = 2L;
|
||||
|
||||
private Integer pk;
|
||||
private String name;
|
||||
private String role;
|
||||
private String sex;
|
||||
private Boolean accept;
|
||||
private String progress;
|
||||
private LocalDateTime bookingDate;
|
||||
private BigDecimal paid;
|
||||
private String camp;
|
||||
@ -24,20 +24,6 @@ public class BookerBean implements Serializable {
|
||||
private Integer campId;
|
||||
private BigDecimal requiredPrice;
|
||||
|
||||
/**
|
||||
* @return the accept
|
||||
*/
|
||||
public Boolean getAccept() {
|
||||
return accept;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param accept the accept to set
|
||||
*/
|
||||
public void setAccept(Boolean accept) {
|
||||
this.accept = accept;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return the paid
|
||||
*/
|
||||
@ -141,4 +127,18 @@ public class BookerBean implements Serializable {
|
||||
public void setRequiredPrice(BigDecimal requiredPrice) {
|
||||
this.requiredPrice = requiredPrice;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return the progress
|
||||
*/
|
||||
public String getProgress() {
|
||||
return progress;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param progress the progress to set
|
||||
*/
|
||||
public void setProgress(String progress) {
|
||||
this.progress = progress;
|
||||
}
|
||||
}
|
||||
|
@ -65,7 +65,7 @@ public class BusinessRepository {
|
||||
.where(T_PROFILE.USERNAME.eq(username))
|
||||
.orderBy(T_CAMP.ARRIVE);
|
||||
// @formatter:on
|
||||
LOGGER.debug(sql.toString());
|
||||
LOGGER.trace(sql);
|
||||
List<CampBudgetBean> list = new ArrayList<>();
|
||||
Iterator<Record4<BigDecimal, String, Double, Integer>> i = sql.fetch().iterator();
|
||||
while (i.hasNext()) {
|
||||
@ -105,7 +105,7 @@ public class BusinessRepository {
|
||||
.leftJoin(T_PROFILE).on(T_PROFILE.PK.eq(T_CAMPPROFILE.FK_PROFILE))
|
||||
.where(T_PROFILE.USERNAME.eq(username));
|
||||
// @formatter:on
|
||||
LOGGER.debug(sql.toString());
|
||||
LOGGER.trace(sql);
|
||||
List<BusinessBean> list = new ArrayList<>();
|
||||
Iterator<Record9<Integer, String, String, String, String, LocalDateTime, String, BigDecimal, BigDecimal>> i = sql.fetch().iterator();
|
||||
while (i.hasNext()) {
|
||||
@ -140,7 +140,7 @@ public class BusinessRepository {
|
||||
.set(T_PERSON.PAID, bean.getPaid())
|
||||
.where(T_PERSON.PK.eq(bean.getFkPerson()));
|
||||
// @formatter:on
|
||||
LOGGER.debug(sql.toString());
|
||||
LOGGER.trace(sql);
|
||||
count += sql.execute();
|
||||
}
|
||||
}
|
||||
|
@ -25,6 +25,7 @@ import org.springframework.transaction.annotation.Transactional;
|
||||
import de.jottyfan.camporganizer.db.EnumConverter;
|
||||
import de.jottyfan.camporganizer.db.jooq.enums.EnumCamprole;
|
||||
import de.jottyfan.camporganizer.db.jooq.enums.EnumModule;
|
||||
import de.jottyfan.camporganizer.db.jooq.enums.EnumProgress;
|
||||
import de.jottyfan.camporganizer.db.jooq.enums.EnumSex;
|
||||
import de.jottyfan.camporganizer.module.business.camp.model.CampBean;
|
||||
import de.jottyfan.camporganizer.module.business.camp.model.PersonBean;
|
||||
@ -60,7 +61,7 @@ public class CampRepository {
|
||||
.where(V_CAMP.PK.eq(pk))
|
||||
.and(T_PROFILE.USERNAME.eq(username));
|
||||
// @formatter:on
|
||||
LOGGER.debug(sql.toString());
|
||||
LOGGER.trace(sql);
|
||||
CampBean bean = new CampBean();
|
||||
Iterator<Record6<String, Double, LocalDateTime, LocalDateTime, String, String>> i = sql.fetch().iterator();
|
||||
while (i.hasNext()) {
|
||||
@ -84,9 +85,9 @@ public class CampRepository {
|
||||
* @return a list of bookings; an empty one at least
|
||||
*/
|
||||
public List<PersonBean> getBookings(Integer pk, String username) {
|
||||
SelectSeekStep4<Record8<Integer, Boolean, BigDecimal, String, String, EnumCamprole, EnumSex, LocalDateTime>, EnumCamprole, EnumSex, String, String> sql = jooq
|
||||
SelectSeekStep4<Record8<Integer, EnumProgress, BigDecimal, String, String, EnumCamprole, EnumSex, LocalDateTime>, EnumCamprole, EnumSex, String, String> sql = jooq
|
||||
// @formatter:off
|
||||
.select(T_PERSON.PK, T_PERSON.ACCEPT, T_PERSON.PAID, T_PERSON.FORENAME, T_PERSON.SURNAME, T_PERSON.CAMPROLE, T_PERSON.SEX, T_PERSON.CREATED)
|
||||
.select(T_PERSON.PK, T_PERSON.PROGRESS, T_PERSON.PAID, T_PERSON.FORENAME, T_PERSON.SURNAME, T_PERSON.CAMPROLE, T_PERSON.SEX, T_PERSON.CREATED)
|
||||
.from(T_PERSON)
|
||||
.leftJoin(T_CAMPPROFILE).on(T_CAMPPROFILE.FK_CAMP.eq(T_PERSON.FK_CAMP)).and(T_CAMPPROFILE.MODULE.eq(EnumModule.business))
|
||||
.leftJoin(T_PROFILE).on(T_PROFILE.PK.eq(T_CAMPPROFILE.FK_PROFILE))
|
||||
@ -94,22 +95,23 @@ public class CampRepository {
|
||||
.and(T_PROFILE.USERNAME.eq(username))
|
||||
.orderBy(T_PERSON.CAMPROLE, T_PERSON.SEX, T_PERSON.SURNAME, T_PERSON.FORENAME);
|
||||
// @formatter:on
|
||||
LOGGER.debug(sql.toString());
|
||||
LOGGER.trace(sql);
|
||||
List<PersonBean> list = new ArrayList<>();
|
||||
Iterator<Record8<Integer, Boolean, BigDecimal, String, String, EnumCamprole, EnumSex, LocalDateTime>> i = sql.fetch().iterator();
|
||||
Iterator<Record8<Integer, EnumProgress, BigDecimal, String, String, EnumCamprole, EnumSex, LocalDateTime>> i = sql.fetch().iterator();
|
||||
while (i.hasNext()) {
|
||||
Record8<Integer, Boolean, BigDecimal, String, String, EnumCamprole, EnumSex, LocalDateTime> r = i.next();
|
||||
Record8<Integer, EnumProgress, BigDecimal, String, String, EnumCamprole, EnumSex, LocalDateTime> r = i.next();
|
||||
String forename = r.get(T_PERSON.FORENAME);
|
||||
String surname = r.get(T_PERSON.SURNAME);
|
||||
EnumCamprole role = r.get(T_PERSON.CAMPROLE);
|
||||
EnumSex sex = r.get(T_PERSON.SEX);
|
||||
EnumProgress progress = r.get(T_PERSON.PROGRESS);
|
||||
PersonBean bean = new PersonBean();
|
||||
bean.setPk(r.get(T_PERSON.PK));
|
||||
bean.setName(String.format("%s %s", forename, surname));
|
||||
bean.setRole(EnumConverter.role2GermanNames(role));
|
||||
bean.setSex(EnumConverter.sex2GermanNames(sex));
|
||||
bean.setBookingDate(r.get(T_PERSON.CREATED));
|
||||
bean.setAccept(r.get(T_PERSON.ACCEPT));
|
||||
bean.setProgress(progress == null ? null : progress.getLiteral());
|
||||
bean.setPaid(r.get(T_PERSON.PAID));
|
||||
list.add(bean);
|
||||
}
|
||||
|
@ -6,6 +6,7 @@ import java.util.List;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import de.jottyfan.camporganizer.db.jooq.enums.EnumProgress;
|
||||
import de.jottyfan.camporganizer.module.business.camp.model.BookingBean;
|
||||
import de.jottyfan.camporganizer.module.business.camp.model.CampBean;
|
||||
import de.jottyfan.camporganizer.module.business.camp.model.PersonBean;
|
||||
@ -31,12 +32,12 @@ public class CampService {
|
||||
Integer rejected = 0;
|
||||
BigDecimal paid = new BigDecimal(0);
|
||||
for (PersonBean p : campGateway.getBookings(id, username)) {
|
||||
Boolean acceptence = p.getAccept();
|
||||
if (acceptence == null) {
|
||||
String progress = p.getProgress();
|
||||
if (EnumProgress.requested.getLiteral().equals(progress)) {
|
||||
open += 1;
|
||||
} else if (acceptence) {
|
||||
} else if (EnumProgress.approved.getLiteral().equals(progress)) {
|
||||
approved += 1;
|
||||
} else {
|
||||
} else if (EnumProgress.rejected.getLiteral().equals(progress)) {
|
||||
rejected += 1;
|
||||
}
|
||||
paid = paid.add(p.getPaid() == null ? new BigDecimal(0) : p.getPaid());
|
||||
|
@ -16,24 +16,10 @@ public class PersonBean implements Serializable {
|
||||
private String name;
|
||||
private String role;
|
||||
private String sex;
|
||||
private Boolean accept;
|
||||
private String progress;
|
||||
private LocalDateTime bookingDate;
|
||||
private BigDecimal paid;
|
||||
|
||||
/**
|
||||
* @return the accept
|
||||
*/
|
||||
public Boolean getAccept() {
|
||||
return accept;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param accept the accept to set
|
||||
*/
|
||||
public void setAccept(Boolean accept) {
|
||||
this.accept = accept;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return the paid
|
||||
*/
|
||||
@ -99,4 +85,18 @@ public class PersonBean implements Serializable {
|
||||
public void setBookingDate(LocalDateTime bookingDate) {
|
||||
this.bookingDate = bookingDate;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return the progress
|
||||
*/
|
||||
public String getProgress() {
|
||||
return progress;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param progress the progress to set
|
||||
*/
|
||||
public void setProgress(String progress) {
|
||||
this.progress = progress;
|
||||
}
|
||||
}
|
||||
|
@ -3,6 +3,10 @@ package de.jottyfan.camporganizer.module.business.outlay;
|
||||
import java.security.Principal;
|
||||
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.core.io.InputStreamResource;
|
||||
import org.springframework.core.io.Resource;
|
||||
import org.springframework.http.MediaType;
|
||||
import org.springframework.http.ResponseEntity;
|
||||
import org.springframework.stereotype.Controller;
|
||||
import org.springframework.ui.Model;
|
||||
import org.springframework.validation.BindingResult;
|
||||
@ -15,6 +19,7 @@ import de.jottyfan.camporganizer.module.business.outlay.model.OutlayBean;
|
||||
import de.jottyfan.camporganizer.module.camplist.CommonController;
|
||||
import jakarta.annotation.security.RolesAllowed;
|
||||
import jakarta.validation.Valid;
|
||||
import jakarta.ws.rs.core.HttpHeaders;
|
||||
|
||||
/**
|
||||
*
|
||||
@ -30,7 +35,8 @@ public class OutlayController extends CommonController {
|
||||
|
||||
@GetMapping("/business/outlay")
|
||||
public String getOutlayDashboard(Model model, Principal principal) {
|
||||
model.addAttribute("list", service.getListOfUser(super.getCurrentUser(principal)));
|
||||
model.addAttribute("list", service.getListOf(super.getCurrentUser(principal), null));
|
||||
model.addAttribute("camps", service.getAllCamps());
|
||||
return "/business/outlay/list";
|
||||
}
|
||||
|
||||
@ -63,4 +69,19 @@ public class OutlayController extends CommonController {
|
||||
service.deleteIfAllowedFor(super.getCurrentUser(principal), id);
|
||||
return "redirect:/business/outlay";
|
||||
}
|
||||
|
||||
@GetMapping("/business/outlay/summary/{campid}")
|
||||
public String getSummaryOfCamp(@PathVariable("campid") Integer campId, Model model, Principal principal) {
|
||||
model.addAttribute("campid", campId);
|
||||
model.addAttribute("list", service.getListOf(null, campId));
|
||||
return "/business/outlay/summary";
|
||||
}
|
||||
|
||||
@GetMapping("/business/outlay/download/{campid}")
|
||||
public ResponseEntity<Resource> generateCsv(@PathVariable("campid") Integer campId) {
|
||||
String filename = String.format("rechnung_camp_%d.csv", campId);
|
||||
InputStreamResource file = new InputStreamResource(service.getCsv(campId));
|
||||
return ResponseEntity.ok().header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=" + filename)
|
||||
.contentType(MediaType.parseMediaType("application/csv")).body(file);
|
||||
}
|
||||
}
|
||||
|
@ -16,11 +16,12 @@ import org.jooq.DSLContext;
|
||||
import org.jooq.DeleteConditionStep;
|
||||
import org.jooq.InsertValuesStep8;
|
||||
import org.jooq.Record10;
|
||||
import org.jooq.Record11;
|
||||
import org.jooq.Record4;
|
||||
import org.jooq.Record7;
|
||||
import org.jooq.SelectConditionStep;
|
||||
import org.jooq.SelectSeekStep1;
|
||||
import org.jooq.UpdateConditionStep;
|
||||
import org.jooq.impl.DSL;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.stereotype.Repository;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
@ -68,8 +69,8 @@ public class OutlayRepository {
|
||||
return list;
|
||||
}
|
||||
|
||||
public List<OutlayBean> getListOf(String username) {
|
||||
SelectConditionStep<Record7<Integer, String, String, LocalDateTime, String, BigDecimal, LocalDateTime>> sql = jooq
|
||||
public List<OutlayBean> getListOf(String username, Integer campId) {
|
||||
SelectConditionStep<Record11<Integer, String, String, LocalDateTime, String, BigDecimal, LocalDateTime, String, String, String, String>> sql = jooq
|
||||
// @formatter:off
|
||||
.select(T_SALES.PK,
|
||||
T_SALES.TRADER,
|
||||
@ -77,26 +78,35 @@ public class OutlayRepository {
|
||||
T_CAMP.ARRIVE,
|
||||
T_LOCATION.NAME,
|
||||
T_SALES.CASH,
|
||||
T_SALES.BUYDATE)
|
||||
T_SALES.BUYDATE,
|
||||
T_SALES.PROVIDER,
|
||||
T_SALES.RECIPENUMBER,
|
||||
T_SALES.INCREDIENTS,
|
||||
T_SALES.RECIPENOTE)
|
||||
.from(T_SALES)
|
||||
.leftJoin(T_CAMP).on(T_CAMP.PK.eq(T_SALES.FK_CAMP))
|
||||
.leftJoin(T_LOCATION).on(T_LOCATION.PK.eq(T_CAMP.FK_LOCATION))
|
||||
.where(T_SALES.PROVIDER.eq(username));
|
||||
.where(username == null ? DSL.trueCondition() : T_SALES.PROVIDER.eq(username))
|
||||
.and(campId == null ? DSL.trueCondition() : T_SALES.FK_CAMP.eq(campId));
|
||||
// @formatter:on
|
||||
LOGGER.trace(sql);
|
||||
List<OutlayBean> list = new ArrayList<>();
|
||||
Iterator<Record7<Integer, String, String, LocalDateTime, String, BigDecimal, LocalDateTime>> i = sql.fetch()
|
||||
Iterator<Record11<Integer, String, String, LocalDateTime, String, BigDecimal, LocalDateTime, String, String, String, String>> i = sql.fetch()
|
||||
.iterator();
|
||||
while (i.hasNext()) {
|
||||
Record7<Integer, String, String, LocalDateTime, String, BigDecimal, LocalDateTime> r = i.next();
|
||||
Record11<Integer, String, String, LocalDateTime, String, BigDecimal, LocalDateTime, String, String, String, String> r = i.next();
|
||||
String campname = String
|
||||
.format("%s %s %d", r.get(T_CAMP.NAME), r.get(T_LOCATION.NAME), r.get(T_CAMP.ARRIVE).getYear()).trim();
|
||||
OutlayBean bean = new OutlayBean();
|
||||
bean.setId(r.get(T_SALES.PK));
|
||||
bean.setTrader(r.get(T_SALES.TRADER));
|
||||
bean.setCampname(campname);
|
||||
bean.setProvider(r.get(T_SALES.PROVIDER));
|
||||
bean.setCash(r.get(T_SALES.CASH));
|
||||
bean.setBuydate(r.get(T_SALES.BUYDATE));
|
||||
bean.setRecipenumber(r.get(T_SALES.RECIPENUMBER));
|
||||
bean.setIngredients(r.get(T_SALES.INCREDIENTS));
|
||||
bean.setRecipenote(r.get(T_SALES.RECIPENOTE));
|
||||
list.add(bean);
|
||||
}
|
||||
return list;
|
||||
|
@ -1,5 +1,7 @@
|
||||
package de.jottyfan.camporganizer.module.business.outlay;
|
||||
|
||||
import java.io.ByteArrayInputStream;
|
||||
import java.io.InputStream;
|
||||
import java.util.List;
|
||||
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
@ -20,8 +22,8 @@ public class OutlayService {
|
||||
@Autowired
|
||||
private OutlayRepository repository;
|
||||
|
||||
public List<OutlayBean> getListOfUser(String username) {
|
||||
return repository.getListOf(username);
|
||||
public List<OutlayBean> getListOf(String username, Integer campId) {
|
||||
return repository.getListOf(username, campId);
|
||||
}
|
||||
|
||||
public List<CampBean> getAllCamps() {
|
||||
@ -43,4 +45,13 @@ public class OutlayService {
|
||||
public void deleteIfAllowedFor(String username, Integer id) {
|
||||
repository.deleteBeanIfAllowedFor(username, id);
|
||||
}
|
||||
|
||||
public InputStream getCsv(Integer campId) {
|
||||
List<OutlayBean> list = repository.getListOf(null, campId);
|
||||
StringBuilder buf = new StringBuilder("Beleg-Nummer;Einkauf bei;Freizeit;bezahlt von;Betrag;Bestandteile;Rechnungsdatum\n");
|
||||
for (OutlayBean bean : list) {
|
||||
buf.append(bean.toCsvLine());
|
||||
}
|
||||
return new ByteArrayInputStream(buf.toString().getBytes());
|
||||
}
|
||||
}
|
||||
|
@ -2,7 +2,9 @@ package de.jottyfan.camporganizer.module.business.outlay.model;
|
||||
|
||||
import java.io.Serializable;
|
||||
import java.math.BigDecimal;
|
||||
import java.text.NumberFormat;
|
||||
import java.time.LocalDateTime;
|
||||
import java.util.Locale;
|
||||
|
||||
import org.springframework.format.annotation.DateTimeFormat;
|
||||
|
||||
@ -38,6 +40,26 @@ public class OutlayBean implements Serializable {
|
||||
return this;
|
||||
}
|
||||
|
||||
private static final String quoted(String s) {
|
||||
return s == null ? "" : String.format("\"%s\"", s.replace("\"", "'"));
|
||||
}
|
||||
|
||||
private static final String cashed(BigDecimal money) {
|
||||
return money == null ? "" : String.format("%s €", NumberFormat.getNumberInstance(Locale.GERMAN).format(money));
|
||||
}
|
||||
|
||||
public String toCsvLine() {
|
||||
StringBuilder buf = new StringBuilder();
|
||||
buf.append(recipenumber).append(";");
|
||||
buf.append(quoted(trader)).append(";");
|
||||
buf.append(quoted(campname)).append(";");
|
||||
buf.append(quoted(provider)).append(";");
|
||||
buf.append(cashed(cash)).append(";");
|
||||
buf.append(quoted(ingredients)).append(";");
|
||||
buf.append(buydate).append("\n");
|
||||
return buf.toString();
|
||||
}
|
||||
|
||||
/**
|
||||
* @return the id
|
||||
*/
|
||||
|
@ -50,7 +50,7 @@ public class BusinessPrivilegesRepository {
|
||||
.leftJoin(T_PROFILE).on(T_PROFILE.PK.eq(T_CAMPPROFILE.FK_PROFILE))
|
||||
.orderBy(V_CAMP.ARRIVE, T_PROFILE.SURNAME, T_PROFILE.FORENAME);
|
||||
// @formatter:on
|
||||
LOGGER.debug(sql.toString());
|
||||
LOGGER.trace(sql);
|
||||
List<BusinessPrivilegesBean> list = new ArrayList<>();
|
||||
for (Record8<String, String, LocalDateTime, String, Integer, Integer, String, Double> r : sql.fetch()) {
|
||||
BusinessPrivilegesBean bean = new BusinessPrivilegesBean();
|
||||
@ -80,7 +80,7 @@ public class BusinessPrivilegesRepository {
|
||||
.where((allowed == null || allowed.size() < 1) ? DSL.trueCondition() : T_PERSON.CAMPROLE.in(allowed))
|
||||
.orderBy(T_PROFILE.SURNAME, T_PROFILE.FORENAME, T_PROFILE.DUEDATE);
|
||||
// @formatter:on
|
||||
LOGGER.debug(sql.toString());
|
||||
LOGGER.trace(sql);
|
||||
List<ProfileBean> list = new ArrayList<>();
|
||||
for (Record5<Integer, String, String, LocalDateTime, String> r : sql.fetch()) {
|
||||
ProfileBean bean = new ProfileBean();
|
||||
@ -102,7 +102,7 @@ public class BusinessPrivilegesRepository {
|
||||
.onConflict(T_CAMPPROFILE.FK_CAMP, T_CAMPPROFILE.FK_PROFILE, T_CAMPPROFILE.MODULE)
|
||||
.doNothing();
|
||||
// @formatter:on
|
||||
LOGGER.debug(sql.toString());
|
||||
LOGGER.trace(sql);
|
||||
return sql.execute();
|
||||
}
|
||||
|
||||
@ -118,7 +118,7 @@ public class BusinessPrivilegesRepository {
|
||||
.from(T_PROFILE)
|
||||
.where(T_PROFILE.USERNAME.eq(currentUser))));
|
||||
// @formatter:on
|
||||
LOGGER.debug(sql.toString());
|
||||
LOGGER.trace(sql);
|
||||
return sql.execute();
|
||||
}
|
||||
}
|
||||
|
@ -34,6 +34,7 @@ import org.springframework.transaction.annotation.Transactional;
|
||||
|
||||
import de.jottyfan.camporganizer.db.jooq.enums.EnumCamprole;
|
||||
import de.jottyfan.camporganizer.db.jooq.enums.EnumDocument;
|
||||
import de.jottyfan.camporganizer.db.jooq.enums.EnumProgress;
|
||||
import de.jottyfan.camporganizer.db.jooq.tables.TProfile;
|
||||
import de.jottyfan.camporganizer.db.jooq.tables.records.VCampRecord;
|
||||
import de.jottyfan.camporganizer.module.camplist.model.BookingBean;
|
||||
@ -54,7 +55,7 @@ public class CamplistRepository {
|
||||
|
||||
public Stream<VCampRecord> getAllCamps(Condition condition) {
|
||||
SelectSeekStep1<VCampRecord, LocalDateTime> sql = jooq.selectFrom(V_CAMP).where(condition).orderBy(V_CAMP.ARRIVE);
|
||||
LOGGER.debug(sql.toString());
|
||||
LOGGER.trace(sql);
|
||||
return sql.fetchStream();
|
||||
}
|
||||
|
||||
@ -76,7 +77,7 @@ public class CamplistRepository {
|
||||
T_PERSON.CREATED,
|
||||
T_PERSON.EMAIL,
|
||||
T_PERSON.SEX,
|
||||
T_PERSON.ACCEPT,
|
||||
T_PERSON.PROGRESS,
|
||||
T_PERSON.FK_CAMP,
|
||||
T_PROFILE.FORENAME,
|
||||
T_PROFILE.SURNAME,
|
||||
@ -99,13 +100,15 @@ public class CamplistRepository {
|
||||
.and(T_PERSON.PK.isNotNull())
|
||||
.orderBy(V_CAMP.ARRIVE.desc(), T_PERSON.CREATED);
|
||||
// @formatter:on
|
||||
LOGGER.debug(sql.toString());
|
||||
LOGGER.trace(sql);
|
||||
List<BookingBean> list = new ArrayList<>();
|
||||
Iterator<Record> i = sql.fetch().iterator();
|
||||
while (i.hasNext()) {
|
||||
Record r = i.next();
|
||||
Integer fkCamp = r.get(T_PERSON.FK_CAMP);
|
||||
BookingBean bean = new BookingBean();
|
||||
EnumProgress progress = r.get(T_PERSON.PROGRESS);
|
||||
bean.setProgress(progress == null ? null : progress.getLiteral());
|
||||
bean.setPk(r.get(T_PERSON.PK));
|
||||
bean.setForename(r.get(T_PERSON.FORENAME));
|
||||
bean.setSurname(r.get(T_PERSON.SURNAME));
|
||||
@ -129,7 +132,6 @@ public class CamplistRepository {
|
||||
bean.setUrl(r.get(V_CAMP.URL));
|
||||
bean.setIsOver(r.get(V_CAMP.IS_OVER));
|
||||
bean.setCampName(r.get(V_CAMP.NAME));
|
||||
bean.setAccept(r.get(T_PERSON.ACCEPT));
|
||||
StringBuilder buf = new StringBuilder();
|
||||
String forename = r.get(REGISTRATOR.FORENAME);
|
||||
String surname = r.get(REGISTRATOR.SURNAME);
|
||||
@ -185,7 +187,7 @@ public class CamplistRepository {
|
||||
.from(T_DOCUMENT)
|
||||
.where(T_DOCUMENT.DOCTYPE.eq(EnumDocument.camppass)));
|
||||
// @formatter:on
|
||||
LOGGER.debug(sql.toString());
|
||||
LOGGER.trace(sql);
|
||||
Map<Integer, String> map = new HashMap<>(); // no duplicate on using a map
|
||||
Iterator<Record2<String, Integer>> i = sql.fetch().iterator();
|
||||
while (i.hasNext()) {
|
||||
|
@ -41,7 +41,7 @@ public class BookingBean implements Serializable {
|
||||
private Boolean isOver;
|
||||
private String campName;
|
||||
private String registrator;
|
||||
private Boolean accept;
|
||||
private String progress;
|
||||
private String subscriber;
|
||||
|
||||
private List<DocumentBean> documents;
|
||||
@ -396,14 +396,6 @@ public class BookingBean implements Serializable {
|
||||
this.registrator = registrator;
|
||||
}
|
||||
|
||||
public Boolean getAccept() {
|
||||
return accept;
|
||||
}
|
||||
|
||||
public void setAccept(Boolean accept) {
|
||||
this.accept = accept;
|
||||
}
|
||||
|
||||
public String getSubscriber() {
|
||||
return subscriber;
|
||||
}
|
||||
@ -416,4 +408,18 @@ public class BookingBean implements Serializable {
|
||||
return documents;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return the progress
|
||||
*/
|
||||
public String getProgress() {
|
||||
return progress;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param progress the progress to set
|
||||
*/
|
||||
public void setProgress(String progress) {
|
||||
this.progress = progress;
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -22,6 +22,7 @@ import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.stereotype.Repository;
|
||||
|
||||
import de.jottyfan.camporganizer.db.jooq.enums.EnumModule;
|
||||
import de.jottyfan.camporganizer.db.jooq.enums.EnumProgress;
|
||||
import de.jottyfan.camporganizer.db.jooq.enums.EnumSex;
|
||||
import de.jottyfan.camporganizer.module.confirmation.board.model.CampBean;
|
||||
import de.jottyfan.camporganizer.module.confirmation.board.model.PersonBean;
|
||||
@ -93,7 +94,8 @@ public class ConfirmationBoardRepository {
|
||||
while (i.hasNext()) {
|
||||
Record r = i.next();
|
||||
PersonBean bean = new PersonBean();
|
||||
bean.setAccept(r.get(T_PERSON.ACCEPT));
|
||||
EnumProgress progress = r.get(T_PERSON.PROGRESS);
|
||||
bean.setProgress(progress == null ? null : progress.getLiteral());
|
||||
bean.setBirthDate(r.get(T_PERSON.BIRTHDATE));
|
||||
bean.setCamprole(r.get(T_PERSON.CAMPROLE) == null ? null : r.get(T_PERSON.CAMPROLE).getLiteral());
|
||||
bean.setCity(r.get(T_PERSON.CITY));
|
||||
|
@ -61,7 +61,7 @@ public class List2CSVService {
|
||||
append(buf, bean.getSex());
|
||||
append(buf, bean.getCamprolle());
|
||||
append(buf, bean.getBirthDate());
|
||||
append(buf, bean.getAccept());
|
||||
append(buf, bean.getProgress());
|
||||
append(buf, bean.getCreated());
|
||||
append(buf, bean.getConsentCatalogPhoto());
|
||||
append(buf, bean.getComment());
|
||||
|
@ -22,7 +22,7 @@ public class PersonBean implements Serializable {
|
||||
private String email;
|
||||
private LocalDate birthDate;
|
||||
private String camprole;
|
||||
private Boolean accept;
|
||||
private String progress;
|
||||
private LocalDateTime created;
|
||||
private String sex;
|
||||
private Double paid;
|
||||
@ -181,20 +181,6 @@ public class PersonBean implements Serializable {
|
||||
this.camprole = camprole;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return the accept
|
||||
*/
|
||||
public Boolean getAccept() {
|
||||
return accept;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param accept the accept to set
|
||||
*/
|
||||
public void setAccept(Boolean accept) {
|
||||
this.accept = accept;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return the created
|
||||
*/
|
||||
@ -264,4 +250,18 @@ public class PersonBean implements Serializable {
|
||||
public void setConsentCatalogPhoto(Boolean consentCatalogPhoto) {
|
||||
this.consentCatalogPhoto = consentCatalogPhoto;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return the progress
|
||||
*/
|
||||
public String getProgress() {
|
||||
return progress;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param progress the progress to set
|
||||
*/
|
||||
public void setProgress(String progress) {
|
||||
this.progress = progress;
|
||||
}
|
||||
}
|
||||
|
@ -7,6 +7,7 @@ import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.stereotype.Controller;
|
||||
import org.springframework.ui.Model;
|
||||
import org.springframework.web.bind.annotation.GetMapping;
|
||||
import org.springframework.web.bind.annotation.PathVariable;
|
||||
|
||||
import de.jottyfan.camporganizer.module.camplist.CommonController;
|
||||
import de.jottyfan.camporganizer.module.confirmation.confirmation.model.CampOverviewBean;
|
||||
@ -20,22 +21,32 @@ import de.jottyfan.camporganizer.module.confirmation.confirmation.model.CampOver
|
||||
public class ConfirmationController extends CommonController {
|
||||
|
||||
@Autowired
|
||||
private ConfirmationService indexService;
|
||||
private ConfirmationService service;
|
||||
|
||||
@GetMapping("/confirmation")
|
||||
public String getIndex(Model model) {
|
||||
List<CampOverviewBean> campoverview = indexService.getCampOverview(super.getCurrentUser());
|
||||
List<CampOverviewBean> campoverview = service.getCampOverview(super.getCurrentUser());
|
||||
CampOverviewBean campoverviewsummary = new CampOverviewBean(LocalDate.now(), "summary");
|
||||
for (CampOverviewBean bean : campoverview) {
|
||||
campoverviewsummary.setApproved(bean.getApproved() + campoverviewsummary.getApproved());
|
||||
campoverviewsummary.setRejected(bean.getRejected() + campoverviewsummary.getRejected());
|
||||
campoverviewsummary.setUntouched(bean.getUntouched() + campoverviewsummary.getUntouched());
|
||||
campoverviewsummary.setRevoked(bean.getRevoked() + campoverviewsummary.getRevoked());
|
||||
}
|
||||
model.addAttribute("campoverview", campoverview);
|
||||
model.addAttribute("campoverviewsummary", campoverviewsummary);
|
||||
model.addAttribute("untouched", indexService.getUntouched(super.getCurrentUser()));
|
||||
model.addAttribute("approved", indexService.getApproved(super.getCurrentUser()));
|
||||
model.addAttribute("rejected", indexService.getRejected(super.getCurrentUser()));
|
||||
model.addAttribute("untouched", service.getUntouched(super.getCurrentUser()));
|
||||
model.addAttribute("approved", service.getApproved(super.getCurrentUser()));
|
||||
model.addAttribute("rejected", service.getRejected(super.getCurrentUser()));
|
||||
model.addAttribute("revoked", service.getRevoked(super.getCurrentUser()));
|
||||
return "confirmation/confirmation";
|
||||
}
|
||||
|
||||
|
||||
@GetMapping("/registration/remove/{id}")
|
||||
public String revoke(@PathVariable("id") Integer id, final Model model) {
|
||||
service.removeBooking(id);
|
||||
return "redirect:/confirmation";
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -3,10 +3,13 @@ package de.jottyfan.camporganizer.module.confirmation.confirmation;
|
||||
import static de.jottyfan.camporganizer.db.jooq.Tables.T_CAMP;
|
||||
import static de.jottyfan.camporganizer.db.jooq.Tables.T_CAMPPROFILE;
|
||||
import static de.jottyfan.camporganizer.db.jooq.Tables.T_PERSON;
|
||||
import static de.jottyfan.camporganizer.db.jooq.Tables.T_PERSONDOCUMENT;
|
||||
import static de.jottyfan.camporganizer.db.jooq.Tables.T_PROFILE;
|
||||
import static de.jottyfan.camporganizer.db.jooq.Tables.T_RSS;
|
||||
import static de.jottyfan.camporganizer.db.jooq.Tables.V_CAMP;
|
||||
|
||||
import java.time.LocalDateTime;
|
||||
import java.time.format.DateTimeFormatter;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.HashMap;
|
||||
@ -18,12 +21,17 @@ import org.apache.logging.log4j.LogManager;
|
||||
import org.apache.logging.log4j.Logger;
|
||||
import org.jooq.Condition;
|
||||
import org.jooq.DSLContext;
|
||||
import org.jooq.DeleteConditionStep;
|
||||
import org.jooq.InsertValuesStep2;
|
||||
import org.jooq.Name;
|
||||
import org.jooq.Record4;
|
||||
import org.jooq.Record5;
|
||||
import org.jooq.Record7;
|
||||
import org.jooq.Record8;
|
||||
import org.jooq.SelectConditionStep;
|
||||
import org.jooq.SelectHavingStep;
|
||||
import org.jooq.SelectSeekStep1;
|
||||
import org.jooq.exception.DataAccessException;
|
||||
import org.jooq.impl.DSL;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.stereotype.Repository;
|
||||
@ -31,6 +39,11 @@ import org.springframework.transaction.annotation.Transactional;
|
||||
|
||||
import de.jottyfan.camporganizer.db.jooq.enums.EnumCamprole;
|
||||
import de.jottyfan.camporganizer.db.jooq.enums.EnumModule;
|
||||
import de.jottyfan.camporganizer.db.jooq.enums.EnumProgress;
|
||||
import de.jottyfan.camporganizer.db.jooq.tables.records.TPersonRecord;
|
||||
import de.jottyfan.camporganizer.db.jooq.tables.records.TPersondocumentRecord;
|
||||
import de.jottyfan.camporganizer.db.jooq.tables.records.TRssRecord;
|
||||
import de.jottyfan.camporganizer.module.camplist.model.LambdaResultWrapper;
|
||||
import de.jottyfan.camporganizer.module.confirmation.confirmation.model.BookingBean;
|
||||
import de.jottyfan.camporganizer.module.confirmation.confirmation.model.CampOverviewBean;
|
||||
|
||||
@ -55,10 +68,10 @@ public class ConfirmationRepository {
|
||||
*/
|
||||
public List<CampOverviewBean> getCampOverviewBeans(String currentUser) {
|
||||
Name COUNT = DSL.name("count");
|
||||
SelectHavingStep<Record4<Integer, Boolean, String, LocalDateTime>> sql = jooq
|
||||
SelectHavingStep<Record4<Integer, EnumProgress, String, LocalDateTime>> sql = jooq
|
||||
// @formatter:off
|
||||
.select(DSL.count(T_PERSON.PK).as(COUNT),
|
||||
T_PERSON.ACCEPT,
|
||||
T_PERSON.PROGRESS,
|
||||
T_CAMP.NAME,
|
||||
T_CAMP.ARRIVE)
|
||||
.from(T_PERSON)
|
||||
@ -68,15 +81,15 @@ public class ConfirmationRepository {
|
||||
.where(T_CAMP.ARRIVE.isNotNull())
|
||||
.and(T_CAMPPROFILE.MODULE.eq(EnumModule.registration))
|
||||
.and(T_PROFILE.USERNAME.eq(currentUser))
|
||||
.groupBy(T_CAMP.NAME, T_CAMP.ARRIVE, T_PERSON.ACCEPT);
|
||||
.groupBy(T_CAMP.NAME, T_CAMP.ARRIVE, T_PERSON.PROGRESS);
|
||||
// @formatter:on
|
||||
LOGGER.debug(sql.toString());
|
||||
LOGGER.trace(sql);
|
||||
Map<LocalDateTime, CampOverviewBean> map = new HashMap<>();
|
||||
Iterator<Record4<Integer, Boolean, String, LocalDateTime>> i = sql.fetch().iterator();
|
||||
Iterator<Record4<Integer, EnumProgress, String, LocalDateTime>> i = sql.fetch().iterator();
|
||||
while (i.hasNext()) {
|
||||
Record4<Integer, Boolean, String, LocalDateTime> r = i.next();
|
||||
Record4<Integer, EnumProgress, String, LocalDateTime> r = i.next();
|
||||
Integer count = r.get(COUNT, Integer.class);
|
||||
Boolean accept = r.get(T_PERSON.ACCEPT);
|
||||
EnumProgress progress = r.get(T_PERSON.PROGRESS);
|
||||
String campname = r.get(T_CAMP.NAME);
|
||||
LocalDateTime arrive = r.get(T_CAMP.ARRIVE);
|
||||
CampOverviewBean bean = map.get(arrive);
|
||||
@ -84,12 +97,14 @@ public class ConfirmationRepository {
|
||||
bean = new CampOverviewBean(arrive.toLocalDate(), campname);
|
||||
map.put(arrive, bean);
|
||||
}
|
||||
if (accept == null) {
|
||||
if (progress == null || EnumProgress.requested.equals(progress)) {
|
||||
bean.setUntouched(count);
|
||||
} else if (accept) {
|
||||
} else if (EnumProgress.approved.equals(progress)) {
|
||||
bean.setApproved(count);
|
||||
} else {
|
||||
} else if (EnumProgress.rejected.equals(progress)) {
|
||||
bean.setRejected(count);
|
||||
} else if (EnumProgress.revoked.equals(progress)) {
|
||||
bean.setRevoked(count);
|
||||
}
|
||||
}
|
||||
List<CampOverviewBean> list = new ArrayList<>(map.values());
|
||||
@ -117,7 +132,7 @@ public class ConfirmationRepository {
|
||||
.and(T_PROFILE.USERNAME.eq(currentUser))
|
||||
.orderBy(T_PERSON.CREATED.desc());
|
||||
// @formatter:on
|
||||
LOGGER.debug(sql.toString());
|
||||
LOGGER.trace(sql);
|
||||
List<BookingBean> list = new ArrayList<>();
|
||||
Iterator<Record7<Integer, String, String, String, LocalDateTime, EnumCamprole, LocalDateTime>> i = sql.fetch().iterator();
|
||||
while (i.hasNext()) {
|
||||
@ -145,7 +160,7 @@ public class ConfirmationRepository {
|
||||
* @return a list of booking beans; an empty one at least
|
||||
*/
|
||||
public List<BookingBean> getUntouched(String currentUser) {
|
||||
return getListWithCondition(currentUser, T_PERSON.ACCEPT.isNull());
|
||||
return getListWithCondition(currentUser, T_PERSON.PROGRESS.eq(EnumProgress.requested));
|
||||
}
|
||||
|
||||
/**
|
||||
@ -155,7 +170,7 @@ public class ConfirmationRepository {
|
||||
* @return a list of booking beans; an empty one at least
|
||||
*/
|
||||
public List<BookingBean> getApproved(String currentUser) {
|
||||
return getListWithCondition(currentUser, T_PERSON.ACCEPT.isTrue());
|
||||
return getListWithCondition(currentUser, T_PERSON.PROGRESS.eq(EnumProgress.approved));
|
||||
}
|
||||
|
||||
/**
|
||||
@ -165,7 +180,17 @@ public class ConfirmationRepository {
|
||||
* @return a list of booking beans; an empty one at least
|
||||
*/
|
||||
public List<BookingBean> getRejected(String currentUser) {
|
||||
return getListWithCondition(currentUser, T_PERSON.ACCEPT.isFalse());
|
||||
return getListWithCondition(currentUser, T_PERSON.PROGRESS.eq(EnumProgress.rejected));
|
||||
}
|
||||
|
||||
/**
|
||||
* get all revoked bookings that this user can manage
|
||||
*
|
||||
* @param currentUser the current user
|
||||
* @return a list of booking beans; an empty one at least
|
||||
*/
|
||||
public List<BookingBean> getRevoked(String currentUser) {
|
||||
return getListWithCondition(currentUser, T_PERSON.PROGRESS.eq(EnumProgress.revoked));
|
||||
}
|
||||
|
||||
/**
|
||||
@ -183,9 +208,9 @@ public class ConfirmationRepository {
|
||||
.or(V_CAMP.YEAR.cast(String.class).containsIgnoreCase(needle));
|
||||
// @formatter:on
|
||||
|
||||
SelectSeekStep1<Record8<Integer, String, String, EnumCamprole, String, Double, String, Boolean>, LocalDateTime> sql = jooq
|
||||
SelectSeekStep1<Record8<Integer, String, String, EnumCamprole, String, Double, String, EnumProgress>, LocalDateTime> sql = jooq
|
||||
// @formatter:off
|
||||
.select(T_PERSON.PK, T_PERSON.FORENAME, T_PERSON.SURNAME, T_PERSON.CAMPROLE, V_CAMP.NAME, V_CAMP.YEAR, V_CAMP.LOCATION_NAME, T_PERSON.ACCEPT)
|
||||
.select(T_PERSON.PK, T_PERSON.FORENAME, T_PERSON.SURNAME, T_PERSON.CAMPROLE, V_CAMP.NAME, V_CAMP.YEAR, V_CAMP.LOCATION_NAME, T_PERSON.PROGRESS)
|
||||
.from(T_PERSON)
|
||||
.leftJoin(V_CAMP).on(V_CAMP.PK.eq(T_PERSON.FK_CAMP))
|
||||
.leftJoin(T_CAMPPROFILE).on(T_CAMPPROFILE.FK_CAMP.eq(T_PERSON.FK_CAMP))
|
||||
@ -195,24 +220,82 @@ public class ConfirmationRepository {
|
||||
.and(T_PROFILE.USERNAME.eq(currentUser))
|
||||
.orderBy(T_PERSON.CREATED.desc());
|
||||
// @formatter:on
|
||||
LOGGER.debug(sql.toString());
|
||||
LOGGER.trace(sql);
|
||||
List<BookingBean> list = new ArrayList<>();
|
||||
Iterator<Record8<Integer, String, String, EnumCamprole, String, Double, String, Boolean>> i = sql.fetch().iterator();
|
||||
Iterator<Record8<Integer, String, String, EnumCamprole, String, Double, String, EnumProgress>> i = sql.fetch().iterator();
|
||||
while (i.hasNext()) {
|
||||
Record8<Integer, String, String, EnumCamprole, String, Double, String, Boolean> r = i.next();
|
||||
Record8<Integer, String, String, EnumCamprole, String, Double, String, EnumProgress> r = i.next();
|
||||
Integer pkPerson = r.get(T_PERSON.PK);
|
||||
String forename = r.get(T_PERSON.FORENAME);
|
||||
String surname = r.get(T_PERSON.SURNAME);
|
||||
EnumCamprole role = r.get(T_PERSON.CAMPROLE);
|
||||
String campname = r.get(V_CAMP.NAME);
|
||||
Double year = r.get(V_CAMP.YEAR);
|
||||
Boolean accept = r.get(T_PERSON.ACCEPT);
|
||||
EnumProgress progress = r.get(T_PERSON.PROGRESS);
|
||||
BookingBean bean = new BookingBean(pkPerson, null, String.format("%s %4.0f", campname, year));
|
||||
bean.setRole(role == null ? null : role.getLiteral());
|
||||
bean.setFullname(new StringBuilder().append(forename).append(" ").append(surname).toString());
|
||||
bean.setAccept(accept);
|
||||
bean.setProgress(progress == null ? null : progress.getLiteral());
|
||||
list.add(bean);
|
||||
}
|
||||
return list;
|
||||
}
|
||||
|
||||
/**
|
||||
* remove the booking and all of its dependencies
|
||||
*
|
||||
* @param id the pk of t_person
|
||||
* @return number of affected database rows, should be 1
|
||||
*/
|
||||
public Integer removeBooking(Integer id) {
|
||||
LambdaResultWrapper lrw = new LambdaResultWrapper();
|
||||
jooq.transaction(t -> {
|
||||
SelectConditionStep<Record5<String, String, String, String, LocalDateTime>> sql0 = DSL.using(t)
|
||||
// @formatter:off
|
||||
.select(T_PROFILE.USERNAME, T_PERSON.FORENAME, T_PERSON.SURNAME, T_CAMP.NAME, T_CAMP.ARRIVE)
|
||||
.from(T_PERSON)
|
||||
.leftJoin(T_CAMP).on(T_CAMP.PK.eq(T_PERSON.FK_CAMP))
|
||||
.leftJoin(T_PROFILE).on(T_PROFILE.PK.eq(T_PERSON.FK_PROFILE))
|
||||
.where(T_PERSON.PK.eq(id));
|
||||
// @formatter:on
|
||||
LOGGER.trace(sql0.toString());
|
||||
Record5<String, String, String, String, LocalDateTime> r = sql0.fetchOne();
|
||||
if (r == null) {
|
||||
throw new DataAccessException("no such entry in t_person with id = " + id);
|
||||
}
|
||||
String username = r.get(T_PROFILE.USERNAME);
|
||||
String forename = r.get(T_PERSON.FORENAME);
|
||||
String surname = r.get(T_PERSON.SURNAME);
|
||||
String campname = r.get(T_CAMP.NAME);
|
||||
LocalDateTime arrive = r.get(T_CAMP.ARRIVE);
|
||||
|
||||
StringBuilder rssMessage = new StringBuilder(username);
|
||||
rssMessage.append(" hat die Stornierung der Buchung von ");
|
||||
rssMessage.append(forename).append(" ").append(surname);
|
||||
rssMessage.append(" an ");
|
||||
rssMessage.append(campname).append(" ")
|
||||
.append(arrive == null ? "" : arrive.format(DateTimeFormatter.ofPattern("YYYY")));
|
||||
rssMessage.append(" bestätigt und den Datensatz gelöscht.");
|
||||
|
||||
DeleteConditionStep<TPersondocumentRecord> sql1 = DSL.using(t).deleteFrom(T_PERSONDOCUMENT)
|
||||
.where(T_PERSONDOCUMENT.FK_PERSON.eq(id));
|
||||
LOGGER.trace(sql1.toString());
|
||||
sql1.execute();
|
||||
|
||||
DeleteConditionStep<TPersonRecord> sql2 = DSL.using(t).deleteFrom(T_PERSON).where(T_PERSON.PK.eq(id));
|
||||
LOGGER.trace(sql2.toString());
|
||||
lrw.add(sql2.execute());
|
||||
|
||||
InsertValuesStep2<TRssRecord, String, String> sql3 = DSL.using(t)
|
||||
// @formatter:off
|
||||
.insertInto(T_RSS,
|
||||
T_RSS.MSG,
|
||||
T_RSS.RECIPIENT)
|
||||
.values(rssMessage.toString(), "registrator");
|
||||
// @formatter:on
|
||||
LOGGER.trace("{}", sql3.toString());
|
||||
sql3.execute();
|
||||
});
|
||||
return lrw.getCounter();
|
||||
}
|
||||
}
|
||||
|
@ -5,6 +5,7 @@ import java.util.List;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import de.jottyfan.camporganizer.db.jooq.enums.EnumProgress;
|
||||
import de.jottyfan.camporganizer.module.confirmation.confirmation.model.BookingBean;
|
||||
import de.jottyfan.camporganizer.module.confirmation.confirmation.model.CampOverviewBean;
|
||||
|
||||
@ -16,35 +17,41 @@ import de.jottyfan.camporganizer.module.confirmation.confirmation.model.CampOver
|
||||
@Service
|
||||
public class ConfirmationService {
|
||||
@Autowired
|
||||
private ConfirmationRepository gateway;
|
||||
private ConfirmationRepository repository;
|
||||
|
||||
public List<CampOverviewBean> getCampOverview(String currentUser) {
|
||||
return gateway.getCampOverviewBeans(currentUser);
|
||||
return repository.getCampOverviewBeans(currentUser);
|
||||
}
|
||||
|
||||
public List<BookingBean> getUntouched(String currentUser) {
|
||||
return gateway.getUntouched(currentUser);
|
||||
return repository.getUntouched(currentUser);
|
||||
}
|
||||
|
||||
public List<BookingBean> getApproved(String currentUser) {
|
||||
return gateway.getApproved(currentUser);
|
||||
return repository.getApproved(currentUser);
|
||||
}
|
||||
|
||||
public List<BookingBean> getRejected(String currentUser) {
|
||||
return gateway.getRejected(currentUser);
|
||||
return repository.getRejected(currentUser);
|
||||
}
|
||||
|
||||
public List<BookingBean> getRevoked(String currentUser) {
|
||||
return repository.getRevoked(currentUser);
|
||||
}
|
||||
|
||||
public String search(String needle, String linkURL, String currentUser) {
|
||||
StringBuilder buf = new StringBuilder(
|
||||
"<table class=\"table table-striped\"><thead><tr><th>Dabei</th><th>Name</th><th>Freizeit</th><th>Rolle</th></tr><tbody>");
|
||||
for (BookingBean bean : gateway.getSearchResult(needle, currentUser)) {
|
||||
for (BookingBean bean : repository.getSearchResult(needle, currentUser)) {
|
||||
String acceptHtml = "";
|
||||
if (bean.getAccept() == null) {
|
||||
if (EnumProgress.requested.equals(bean.getProgress())) {
|
||||
acceptHtml = "<i class=\"fas fa-question framed framed-orange\"></i>";
|
||||
} else if (bean.getAccept()) {
|
||||
} else if (EnumProgress.approved.equals(bean.getProgress())) {
|
||||
acceptHtml = "<i class=\"fas fa-check framed framed-green\"></i>";
|
||||
} else {
|
||||
} else if (EnumProgress.rejected.equals(bean.getProgress())) {
|
||||
acceptHtml = "<i class=\"fas fa-ban framed framed-red\"></i>";
|
||||
} else if (EnumProgress.revoked.equals(bean.getProgress())) {
|
||||
acceptHtml = "<i class=\"fas fa-skull framed framed-pink\"></i>";
|
||||
}
|
||||
buf.append(String.format("<tr><td>%s</td><td><a href=\"%s/%d\">%s</a></td><td>%s</td><td>%s</td></tr>",
|
||||
acceptHtml, linkURL, bean.getPkPerson(), bean.getFullname(), bean.getCamp(), bean.getRolename()));
|
||||
@ -52,4 +59,14 @@ public class ConfirmationService {
|
||||
buf.append("</tbody></table>");
|
||||
return buf.toString();
|
||||
}
|
||||
|
||||
/**
|
||||
* remove the booking and all of its dependencies
|
||||
*
|
||||
* @param id the id of the booking (t_person.pk)
|
||||
*/
|
||||
public Boolean removeBooking(Integer id) {
|
||||
return repository.removeBooking(id) > 0;
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -20,7 +20,7 @@ public class BookingBean implements Serializable, Comparable<BookingBean> {
|
||||
private String fullname;
|
||||
private String role;
|
||||
private LocalDateTime registered;
|
||||
private Boolean accept;
|
||||
private String progress;
|
||||
|
||||
public BookingBean(Integer pkPerson, LocalDate date, String camp) {
|
||||
this.pkPerson = pkPerson;
|
||||
@ -114,11 +114,17 @@ public class BookingBean implements Serializable, Comparable<BookingBean> {
|
||||
return pkPerson;
|
||||
}
|
||||
|
||||
public Boolean getAccept() {
|
||||
return accept;
|
||||
/**
|
||||
* @return the progress
|
||||
*/
|
||||
public String getProgress() {
|
||||
return progress;
|
||||
}
|
||||
|
||||
public void setAccept(Boolean accept) {
|
||||
this.accept = accept;
|
||||
/**
|
||||
* @param progress the progress to set
|
||||
*/
|
||||
public void setProgress(String progress) {
|
||||
this.progress = progress;
|
||||
}
|
||||
}
|
||||
|
@ -16,6 +16,7 @@ public class CampOverviewBean implements Serializable, Comparable<CampOverviewBe
|
||||
private Integer approved;
|
||||
private Integer rejected;
|
||||
private Integer untouched;
|
||||
private Integer revoked;
|
||||
|
||||
public CampOverviewBean(LocalDate date, String camp) {
|
||||
this.date = date;
|
||||
@ -23,6 +24,7 @@ public class CampOverviewBean implements Serializable, Comparable<CampOverviewBe
|
||||
this.approved = 0;
|
||||
this.rejected = 0;
|
||||
this.untouched = 0;
|
||||
this.revoked = 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -85,4 +87,18 @@ public class CampOverviewBean implements Serializable, Comparable<CampOverviewBe
|
||||
public LocalDate getDate() {
|
||||
return date;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return the revoked
|
||||
*/
|
||||
public Integer getRevoked() {
|
||||
return revoked;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param revoked the revoked to set
|
||||
*/
|
||||
public void setRevoked(Integer revoked) {
|
||||
this.revoked = revoked;
|
||||
}
|
||||
}
|
||||
|
@ -32,6 +32,7 @@ public class PersonController extends CommonController {
|
||||
model.addAttribute("camps", personService.getCamps(username));
|
||||
model.addAttribute("annotations", personService.getAnnotations(pk));
|
||||
model.addAttribute("campPrice", personService.getCampPrice(pk));
|
||||
model.addAttribute("progresses", personService.getProgresses());
|
||||
return "confirmation/person";
|
||||
}
|
||||
|
||||
@ -43,6 +44,7 @@ public class PersonController extends CommonController {
|
||||
model.addAttribute("camps", personService.getCamps(username));
|
||||
model.addAttribute("annotations", personService.getAnnotations(bean.getPk()));
|
||||
model.addAttribute("campPrice", personService.getCampPrice(bean.getPk()));
|
||||
model.addAttribute("progresses", personService.getProgresses());
|
||||
return "confirmation/person";
|
||||
}
|
||||
personService.updatePerson(bean, username);
|
||||
|
@ -33,6 +33,7 @@ import org.springframework.transaction.annotation.Transactional;
|
||||
|
||||
import de.jottyfan.camporganizer.db.jooq.enums.EnumCamprole;
|
||||
import de.jottyfan.camporganizer.db.jooq.enums.EnumModule;
|
||||
import de.jottyfan.camporganizer.db.jooq.enums.EnumProgress;
|
||||
import de.jottyfan.camporganizer.db.jooq.tables.TProfile;
|
||||
import de.jottyfan.camporganizer.db.jooq.tables.records.TCampRecord;
|
||||
import de.jottyfan.camporganizer.db.jooq.tables.records.TPersonRecord;
|
||||
@ -78,7 +79,7 @@ public class PersonRepository {
|
||||
.and(T_PROFILE.USERNAME.eq(username))
|
||||
.orderBy(T_CAMP.ARRIVE.desc());
|
||||
// @formatter:on
|
||||
LOGGER.debug(sql.toString());
|
||||
LOGGER.trace(sql);
|
||||
List<CampBean> list = new ArrayList<>();
|
||||
Iterator<Record4<Integer, String, LocalDateTime, String>> i = sql.fetch().iterator();
|
||||
while (i.hasNext()) {
|
||||
@ -112,13 +113,14 @@ public class PersonRepository {
|
||||
.and(T_CAMPPROFILE.MODULE.eq(EnumModule.registration))
|
||||
.and(T_PROFILE.USERNAME.eq(username));
|
||||
// @formatter:on
|
||||
LOGGER.debug(sql.toString());
|
||||
LOGGER.trace(sql);
|
||||
Iterator<Record> i = sql.fetch().iterator();
|
||||
while (i.hasNext()) {
|
||||
Record r = i.next();
|
||||
PersonBean bean = new PersonBean();
|
||||
bean.setPk(pk);
|
||||
bean.setAccept(r.get(T_PERSON.ACCEPT));
|
||||
EnumProgress progress = r.get(T_PERSON.PROGRESS);
|
||||
bean.setProgress(progress == null ? null : progress.getLiteral());
|
||||
bean.setBirthdate(r.get(T_PERSON.BIRTHDATE));
|
||||
bean.setCamprole(r.get(T_PERSON.CAMPROLE));
|
||||
bean.setCity(r.get(T_PERSON.CITY));
|
||||
@ -151,21 +153,21 @@ public class PersonRepository {
|
||||
jooq.transaction(t -> {
|
||||
|
||||
SelectConditionStep<TProfileRecord> sql0 = jooq.selectFrom(T_PROFILE).where(T_PROFILE.USERNAME.eq(registrator));
|
||||
LOGGER.debug(sql0.toString());
|
||||
LOGGER.trace(sql0);
|
||||
Integer fkRegistrator = sql0.fetchOne(T_PROFILE.PK);
|
||||
|
||||
// get old accept value for comparison
|
||||
SelectConditionStep<TPersonRecord> sql1 = jooq.selectFrom(T_PERSON).where(T_PERSON.PK.eq(bean.getPk()));
|
||||
LOGGER.debug(sql1.toString());
|
||||
LOGGER.trace(sql1);
|
||||
TPersonRecord r = sql1.fetchOne();
|
||||
lrw.putBoolean("acceptOld", r == null ? null : r.getAccept());
|
||||
lrw.putBoolean("acceptNew", bean.getAccept());
|
||||
lrw.putBoolean("acceptOld", r == null ? null : EnumProgress.approved.equals(r.getProgress()));
|
||||
lrw.putBoolean("acceptNew", EnumProgress.approved.getLiteral().equals(bean.getProgress()));
|
||||
Integer fkCamp = r == null ? null : r.getFkCamp();
|
||||
String email = r.getEmail(); // use the old one, too
|
||||
lrw.putString("oldEmail", email);
|
||||
|
||||
SelectConditionStep<TCampRecord> sql2 = jooq.selectFrom(T_CAMP).where(T_CAMP.PK.eq(fkCamp));
|
||||
LOGGER.debug(sql2.toString());
|
||||
LOGGER.trace(sql2);
|
||||
TCampRecord rc = sql2.fetchOne();
|
||||
String campName = rc == null ? null : rc.getName();
|
||||
LocalDateTime arrive = rc == null ? null : rc.getArrive();
|
||||
@ -186,13 +188,13 @@ public class PersonRepository {
|
||||
.set(T_PERSON.PHONE, bean.getPhone())
|
||||
.set(T_PERSON.EMAIL, bean.getEmail())
|
||||
.set(T_PERSON.COMMENT, bean.getComment())
|
||||
.set(T_PERSON.ACCEPT, bean.getAccept())
|
||||
.set(T_PERSON.PROGRESS, EnumProgress.lookupLiteral(bean.getProgress()))
|
||||
.set(T_PERSON.CAMPROLE, bean.getCamprole())
|
||||
.set(T_PERSON.FK_REGISTRATOR, fkRegistrator)
|
||||
.set(T_PERSON.REQUIRED_PRICE, bean.getRequiredPrice())
|
||||
.where(T_PERSON.PK.eq(bean.getPk()));
|
||||
// @formatter:on
|
||||
LOGGER.debug(sql3.toString());
|
||||
LOGGER.trace(sql3);
|
||||
lrw.add(sql3.execute());
|
||||
|
||||
// always
|
||||
@ -208,7 +210,7 @@ public class PersonRepository {
|
||||
T_RSS.RECIPIENT)
|
||||
.values(buf.toString(), "registrator");
|
||||
// @formatter:on
|
||||
LOGGER.debug("{}", sql4.toString());
|
||||
LOGGER.trace(sql4);
|
||||
sql4.execute();
|
||||
});
|
||||
|
||||
@ -301,7 +303,7 @@ public class PersonRepository {
|
||||
.leftJoin(REGISTRATOR).on(REGISTRATOR.PK.eq(T_PERSON.FK_REGISTRATOR))
|
||||
.where(T_PERSON.PK.eq(pk));
|
||||
// @formatter:on
|
||||
LOGGER.debug(sql.toString());
|
||||
LOGGER.trace(sql);
|
||||
StringBuilder buf = new StringBuilder();
|
||||
Iterator<Record11<LocalDate, LocalDateTime, EnumCamprole, LocalDateTime, LocalDateTime, Integer, Integer, String, String, String, String>> i = sql
|
||||
.fetch().iterator();
|
||||
|
@ -1,10 +1,12 @@
|
||||
package de.jottyfan.camporganizer.module.confirmation.person;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import de.jottyfan.camporganizer.db.jooq.enums.EnumProgress;
|
||||
import de.jottyfan.camporganizer.module.confirmation.person.model.CampBean;
|
||||
import de.jottyfan.camporganizer.module.confirmation.person.model.PersonBean;
|
||||
|
||||
@ -43,4 +45,12 @@ public class PersonService {
|
||||
public String getCampPrice(Integer pk) {
|
||||
return gateway.getCampprice(pk);
|
||||
}
|
||||
|
||||
public List<String> getProgresses() {
|
||||
List<String> list = new ArrayList<>();
|
||||
for (EnumProgress p : EnumProgress.values()) {
|
||||
list.add(p.getLiteral());
|
||||
}
|
||||
return list;
|
||||
}
|
||||
}
|
||||
|
@ -32,7 +32,7 @@ public class PersonBean implements Serializable {
|
||||
private String email;
|
||||
private Integer fkCamp;
|
||||
private Integer fkProfile;
|
||||
private Boolean accept;
|
||||
private String progress;
|
||||
private LocalDateTime created;
|
||||
private EnumSex sex;
|
||||
private Integer fkRegistrator;
|
||||
@ -194,20 +194,6 @@ public class PersonBean implements Serializable {
|
||||
this.fkProfile = fkProfile;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return the accept
|
||||
*/
|
||||
public Boolean getAccept() {
|
||||
return accept;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param accept the accept to set
|
||||
*/
|
||||
public void setAccept(Boolean accept) {
|
||||
this.accept = accept;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return the created
|
||||
*/
|
||||
@ -291,4 +277,18 @@ public class PersonBean implements Serializable {
|
||||
public void setRequiredPrice(BigDecimal requiredPrice) {
|
||||
this.requiredPrice = requiredPrice;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return the progress
|
||||
*/
|
||||
public String getProgress() {
|
||||
return progress;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param progress the progress to set
|
||||
*/
|
||||
public void setProgress(String progress) {
|
||||
this.progress = progress;
|
||||
}
|
||||
}
|
||||
|
@ -79,7 +79,7 @@ public class DashboardRepository {
|
||||
.deleteFrom(T_PERSONDOCUMENT)
|
||||
.where(T_PERSONDOCUMENT.PK.eq(bean.getPk()));
|
||||
// @formatter:on
|
||||
LOGGER.debug("{}", sql.toString());
|
||||
LOGGER.trace(sql);
|
||||
lrw.add(sql.execute());
|
||||
|
||||
StringBuilder buf = new StringBuilder("Dokument ");
|
||||
@ -92,7 +92,7 @@ public class DashboardRepository {
|
||||
T_RSS.RECIPIENT)
|
||||
.values(buf.toString(), "registrator");
|
||||
// @formatter:on
|
||||
LOGGER.debug("{}", sql2.toString());
|
||||
LOGGER.trace(sql);
|
||||
sql2.execute();
|
||||
});
|
||||
return lrw.getCounter();
|
||||
@ -117,7 +117,7 @@ public class DashboardRepository {
|
||||
)
|
||||
.values(bean.getName(), bean.getFiletype(), bean.getFkPerson(), bean.getDocument());
|
||||
// @formatter:on
|
||||
LOGGER.debug("{}", sql.toString());
|
||||
LOGGER.trace(sql);
|
||||
sql.execute();
|
||||
|
||||
StringBuilder buf = new StringBuilder("Dokument ");
|
||||
@ -130,7 +130,7 @@ public class DashboardRepository {
|
||||
T_RSS.RECIPIENT)
|
||||
.values(buf.toString(), "registrator");
|
||||
// @formatter:on
|
||||
LOGGER.debug("{}", sql2.toString());
|
||||
LOGGER.trace(sql2);
|
||||
sql2.execute();
|
||||
});
|
||||
}
|
||||
|
@ -37,7 +37,7 @@ public class DocumentRepository {
|
||||
.selectFrom(T_DOCUMENT)
|
||||
.where(T_DOCUMENT.PK.eq(id));
|
||||
// @formatter:on
|
||||
LOGGER.debug(sql.toString());
|
||||
LOGGER.trace(sql);
|
||||
TDocumentRecord r = sql.fetchOne();
|
||||
if (r == null) {
|
||||
return null;
|
||||
|
@ -54,7 +54,7 @@ public class ICalRepository {
|
||||
.from(T_CAMP)
|
||||
.leftJoin(T_LOCATION).on(T_LOCATION.PK.eq(T_CAMP.FK_LOCATION));
|
||||
// @formatter:on
|
||||
LOGGER.debug(sql.toString());
|
||||
LOGGER.trace(sql);
|
||||
ICalendar ical = new ICalendar();
|
||||
ical.getTimezoneInfo().setDefaultTimezone(TimezoneAssignment.download(TimeZone.getTimeZone("Europe/Berlin"), false));
|
||||
Iterator<Record5<String, LocalDateTime, LocalDateTime, String, String>> i = sql.fetch().iterator();
|
||||
|
@ -37,7 +37,7 @@ public class MigrationRepository {
|
||||
.from(T_PROFILE)
|
||||
.where(T_PROFILE.USERNAME.eq(username));
|
||||
// @formatter:on
|
||||
LOGGER.debug(sql.toString());
|
||||
LOGGER.trace(sql);
|
||||
return sql.fetchOne(T_PROFILE.PASSWORD);
|
||||
}
|
||||
}
|
||||
|
@ -119,7 +119,7 @@ public class KeycloakRepository {
|
||||
Response response = resource.create(user);
|
||||
Boolean success = Status.CREATED.equals(response.getStatusInfo());
|
||||
if (success) {
|
||||
LOGGER.info("created new keycloak user {}", user.getUsername());
|
||||
LOGGER.debug("created new keycloak user {}", user.getUsername());
|
||||
} else {
|
||||
LOGGER.error("error on creating keycloak user {}: {}", user.getUsername(), response.getStatus());
|
||||
}
|
||||
|
@ -99,9 +99,15 @@ public class RegistrationController extends CommonController {
|
||||
return "/registration/cancellation";
|
||||
}
|
||||
|
||||
@GetMapping("/registration/remove/{id}")
|
||||
public String remove(@PathVariable("id") Integer id, final Model model) {
|
||||
service.removeBooking(id);
|
||||
@GetMapping("/registration/revoke/{id}")
|
||||
public String revoke(@PathVariable("id") Integer id, final Model model) {
|
||||
service.revokeBooking(id, true);
|
||||
return "redirect:/dashboard";
|
||||
}
|
||||
|
||||
@GetMapping("/registration/unrevoke/{id}")
|
||||
public String unrevoke(@PathVariable("id") Integer id, final Model model) {
|
||||
service.revokeBooking(id, false);
|
||||
return "redirect:/dashboard";
|
||||
}
|
||||
|
||||
|
@ -2,7 +2,6 @@ package de.jottyfan.camporganizer.module.registration;
|
||||
|
||||
import static de.jottyfan.camporganizer.db.jooq.Tables.T_CAMP;
|
||||
import static de.jottyfan.camporganizer.db.jooq.Tables.T_PERSON;
|
||||
import static de.jottyfan.camporganizer.db.jooq.Tables.T_PERSONDOCUMENT;
|
||||
import static de.jottyfan.camporganizer.db.jooq.Tables.T_PROFILE;
|
||||
import static de.jottyfan.camporganizer.db.jooq.Tables.T_PROFILEROLE;
|
||||
import static de.jottyfan.camporganizer.db.jooq.Tables.T_RSS;
|
||||
@ -41,9 +40,9 @@ import org.springframework.stereotype.Repository;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
|
||||
import de.jottyfan.camporganizer.db.jooq.enums.EnumCamprole;
|
||||
import de.jottyfan.camporganizer.db.jooq.enums.EnumProgress;
|
||||
import de.jottyfan.camporganizer.db.jooq.enums.EnumSex;
|
||||
import de.jottyfan.camporganizer.db.jooq.tables.records.TPersonRecord;
|
||||
import de.jottyfan.camporganizer.db.jooq.tables.records.TPersondocumentRecord;
|
||||
import de.jottyfan.camporganizer.db.jooq.tables.records.TProfileRecord;
|
||||
import de.jottyfan.camporganizer.db.jooq.tables.records.TRssRecord;
|
||||
import de.jottyfan.camporganizer.db.jooq.tables.records.VCampRecord;
|
||||
@ -147,7 +146,7 @@ public class RegistrationRepository {
|
||||
T_RSS.RECIPIENT)
|
||||
.values(new StringBuilder(bean.getFullname()).append(" hat sich als Nutzer im CampOrganizer2 registriert.").toString(), "admin");
|
||||
// @formatter:on
|
||||
LOGGER.debug("{}", sql2.toString());
|
||||
LOGGER.trace(sql2);
|
||||
sql2.execute();
|
||||
} else {
|
||||
SelectConditionStep<Record1<Integer>> sql1 = DSL.using(t)
|
||||
@ -251,13 +250,11 @@ public class RegistrationRepository {
|
||||
}
|
||||
|
||||
/**
|
||||
* remove the booking and all of its dependencies
|
||||
* set the revoke state of a booking
|
||||
*
|
||||
* @param id the pk of t_person
|
||||
* @return number of affected database rows, should be 1
|
||||
* @param id the ID of the booking
|
||||
*/
|
||||
public Integer removeBooking(Integer id) {
|
||||
LambdaResultWrapper lrw = new LambdaResultWrapper();
|
||||
public void revokeBooking(Integer id) {
|
||||
jooq.transaction(t -> {
|
||||
SelectConditionStep<Record5<String, String, String, String, LocalDateTime>> sql0 = DSL.using(t)
|
||||
// @formatter:off
|
||||
@ -279,33 +276,32 @@ public class RegistrationRepository {
|
||||
LocalDateTime arrive = r.get(T_CAMP.ARRIVE);
|
||||
|
||||
StringBuilder rssMessage = new StringBuilder(username);
|
||||
rssMessage.append(" hat die Buchung von ");
|
||||
rssMessage.append(" hat die Stornierung der Buchung von ");
|
||||
rssMessage.append(forename).append(" ").append(surname);
|
||||
rssMessage.append(" an ");
|
||||
rssMessage.append(campname).append(" ")
|
||||
.append(arrive == null ? "" : arrive.format(DateTimeFormatter.ofPattern("YYYY")));
|
||||
rssMessage.append(" storniert.");
|
||||
rssMessage.append(" ausgelöst.");
|
||||
|
||||
DeleteConditionStep<TPersondocumentRecord> sql1 = DSL.using(t).deleteFrom(T_PERSONDOCUMENT)
|
||||
.where(T_PERSONDOCUMENT.FK_PERSON.eq(id));
|
||||
LOGGER.trace(sql1.toString());
|
||||
UpdateConditionStep<TPersonRecord> sql1 = jooq
|
||||
// @formatter:off
|
||||
.update(T_PERSON)
|
||||
.set(T_PERSON.PROGRESS, EnumProgress.revoked)
|
||||
.where(T_PERSON.PK.eq(id));
|
||||
// @formatter:on
|
||||
LOGGER.trace(sql1);
|
||||
sql1.execute();
|
||||
|
||||
DeleteConditionStep<TPersonRecord> sql2 = DSL.using(t).deleteFrom(T_PERSON).where(T_PERSON.PK.eq(id));
|
||||
LOGGER.trace(sql2.toString());
|
||||
lrw.add(sql2.execute());
|
||||
|
||||
InsertValuesStep2<TRssRecord, String, String> sql3 = DSL.using(t)
|
||||
InsertValuesStep2<TRssRecord, String, String> sql2 = DSL.using(t)
|
||||
// @formatter:off
|
||||
.insertInto(T_RSS,
|
||||
T_RSS.MSG,
|
||||
T_RSS.RECIPIENT)
|
||||
.values(rssMessage.toString(), "registrator");
|
||||
// @formatter:on
|
||||
LOGGER.trace("{}", sql3.toString());
|
||||
sql3.execute();
|
||||
LOGGER.trace("{}", sql2.toString());
|
||||
sql2.execute();
|
||||
});
|
||||
return lrw.getCounter();
|
||||
}
|
||||
|
||||
/**
|
||||
@ -494,4 +490,59 @@ public class RegistrationRepository {
|
||||
Iterator<Integer> i = sql.fetch(T_PERSON.PK).iterator();
|
||||
return i.hasNext();
|
||||
}
|
||||
|
||||
/**
|
||||
* turn back the revocation and set state to requested
|
||||
*
|
||||
* @param id
|
||||
*/
|
||||
public void unrevokeBooking(Integer id) {
|
||||
jooq.transaction(t -> {
|
||||
SelectConditionStep<Record5<String, String, String, String, LocalDateTime>> sql0 = DSL.using(t)
|
||||
// @formatter:off
|
||||
.select(T_PROFILE.USERNAME, T_PERSON.FORENAME, T_PERSON.SURNAME, T_CAMP.NAME, T_CAMP.ARRIVE)
|
||||
.from(T_PERSON)
|
||||
.leftJoin(T_CAMP).on(T_CAMP.PK.eq(T_PERSON.FK_CAMP))
|
||||
.leftJoin(T_PROFILE).on(T_PROFILE.PK.eq(T_PERSON.FK_PROFILE))
|
||||
.where(T_PERSON.PK.eq(id));
|
||||
// @formatter:on
|
||||
LOGGER.trace(sql0.toString());
|
||||
Record5<String, String, String, String, LocalDateTime> r = sql0.fetchOne();
|
||||
if (r == null) {
|
||||
throw new DataAccessException("no such entry in t_person with id = " + id);
|
||||
}
|
||||
String username = r.get(T_PROFILE.USERNAME);
|
||||
String forename = r.get(T_PERSON.FORENAME);
|
||||
String surname = r.get(T_PERSON.SURNAME);
|
||||
String campname = r.get(T_CAMP.NAME);
|
||||
LocalDateTime arrive = r.get(T_CAMP.ARRIVE);
|
||||
|
||||
StringBuilder rssMessage = new StringBuilder(username);
|
||||
rssMessage.append(" hat die Stornierung der Buchung von ");
|
||||
rssMessage.append(forename).append(" ").append(surname);
|
||||
rssMessage.append(" an ");
|
||||
rssMessage.append(campname).append(" ")
|
||||
.append(arrive == null ? "" : arrive.format(DateTimeFormatter.ofPattern("YYYY")));
|
||||
rssMessage.append(" rückgängig gemacht.");
|
||||
|
||||
UpdateConditionStep<TPersonRecord> sql1 = jooq
|
||||
// @formatter:off
|
||||
.update(T_PERSON)
|
||||
.set(T_PERSON.PROGRESS, EnumProgress.requested)
|
||||
.where(T_PERSON.PK.eq(id));
|
||||
// @formatter:on
|
||||
LOGGER.trace(sql1);
|
||||
sql1.execute();
|
||||
|
||||
InsertValuesStep2<TRssRecord, String, String> sql2 = DSL.using(t)
|
||||
// @formatter:off
|
||||
.insertInto(T_RSS,
|
||||
T_RSS.MSG,
|
||||
T_RSS.RECIPIENT)
|
||||
.values(rssMessage.toString(), "registrator");
|
||||
// @formatter:on
|
||||
LOGGER.trace("{}", sql2.toString());
|
||||
sql2.execute();
|
||||
});
|
||||
}
|
||||
}
|
||||
|
@ -75,12 +75,18 @@ public class RegistrationService {
|
||||
}
|
||||
|
||||
/**
|
||||
* remove the booking and all of its dependencies
|
||||
* revoke a booking
|
||||
*
|
||||
* @param id the id of the booking (t_person.pk)
|
||||
* @param id the ID of the booking
|
||||
* @parem doRevoke if true, revoke the booking; if false, unrevoke and set it to
|
||||
* requested again
|
||||
*/
|
||||
public Boolean removeBooking(Integer id) {
|
||||
return repository.removeBooking(id) > 0;
|
||||
public void revokeBooking(Integer id, Boolean doRevoke) {
|
||||
if (doRevoke) {
|
||||
repository.revokeBooking(id);
|
||||
} else {
|
||||
repository.unrevokeBooking(id);
|
||||
}
|
||||
}
|
||||
|
||||
public void toggleConsent(Integer id) {
|
||||
|
@ -47,7 +47,7 @@ public class RssRepository {
|
||||
.from(T_RSS)
|
||||
.where(T_RSS.RECIPIENT.eq(recipientCode));
|
||||
// @formatter:on
|
||||
LOGGER.debug("{}", sql.toString());
|
||||
LOGGER.trace(sql);
|
||||
List<RssBean> list = new ArrayList<>();
|
||||
Iterator<Record3<Integer, String, LocalDateTime>> i = sql.fetch().iterator();
|
||||
while (i.hasNext()) {
|
||||
@ -63,7 +63,7 @@ public class RssRepository {
|
||||
|
||||
public List<String> getAllFeeds() {
|
||||
SelectJoinStep<Record1<String>> sql = jooq.selectDistinct(T_RSS.RECIPIENT).from(T_RSS);
|
||||
LOGGER.debug(sql.toString());
|
||||
LOGGER.trace(sql);
|
||||
return sql.fetch(T_RSS.RECIPIENT);
|
||||
}
|
||||
|
||||
@ -76,7 +76,7 @@ public class RssRepository {
|
||||
T_RSS.REGDATE)
|
||||
.from(T_RSS);
|
||||
// @formatter:on
|
||||
LOGGER.debug("{}", sql.toString());
|
||||
LOGGER.trace(sql);
|
||||
List<RssBean> list = new ArrayList<>();
|
||||
Iterator<Record4<Integer, String, String, LocalDateTime>> i = sql.fetch().iterator();
|
||||
while (i.hasNext()) {
|
||||
@ -96,7 +96,7 @@ public class RssRepository {
|
||||
.deleteFrom(T_RSS)
|
||||
.where(T_RSS.PK.eq(bean.getPk()));
|
||||
// @formatter:on
|
||||
LOGGER.debug("{}", sql.toString());
|
||||
LOGGER.trace(sql);
|
||||
sql.execute();
|
||||
}
|
||||
|
||||
@ -107,7 +107,7 @@ public class RssRepository {
|
||||
.set(T_RSS.MSG, bean.getMessage())
|
||||
.where(T_RSS.PK.eq(bean.getPk()));
|
||||
// @formatter:on
|
||||
LOGGER.debug("{}", sql.toString());
|
||||
LOGGER.trace(sql);
|
||||
sql.execute();
|
||||
}
|
||||
}
|
||||
|
@ -121,19 +121,20 @@ div {
|
||||
!important;
|
||||
}
|
||||
|
||||
.acc_true {
|
||||
background-image: linear-gradient(to bottom right, #cfc, #afa)
|
||||
!important;
|
||||
.acc_approved {
|
||||
background: #aaffaa !important;
|
||||
}
|
||||
|
||||
.acc_false {
|
||||
background-image: linear-gradient(to bottom right, #fcc, #faa)
|
||||
!important;
|
||||
.acc_rejected {
|
||||
background: #ffaaaa !important;
|
||||
}
|
||||
|
||||
.acc_null {
|
||||
background-image: linear-gradient(to bottom right, #fdb, #fca)
|
||||
!important;
|
||||
.acc_revoked {
|
||||
background: rgb(220, 138, 221) !important;
|
||||
}
|
||||
|
||||
.acc_requested {
|
||||
background: rgb(255, 190, 111) !important;
|
||||
}
|
||||
|
||||
.right-dist {
|
||||
@ -303,6 +304,17 @@ div {
|
||||
margin: 0px 2px 0px 2px;
|
||||
}
|
||||
|
||||
.badgeerror {
|
||||
border-radius: 8px;
|
||||
border: 1px solid black;
|
||||
color: white;
|
||||
font-weight: bolder;
|
||||
background-image: linear-gradient(to right bottom, rgb(246, 97, 81),
|
||||
rgb(165, 29, 45));
|
||||
padding: 2px 4px 2px 4px;
|
||||
margin: 0px 2px 0px 2px;
|
||||
}
|
||||
|
||||
.dist8 {
|
||||
margin: 8px;
|
||||
}
|
||||
@ -333,19 +345,19 @@ div {
|
||||
}
|
||||
|
||||
.framed-green {
|
||||
background: linear-gradient(to bottom right, lime, darkgreen);
|
||||
background: linear-gradient(to bottom right, darkgreen, lime);
|
||||
color: white;
|
||||
border: 1px solid green;
|
||||
}
|
||||
|
||||
.framed-red {
|
||||
background: linear-gradient(to bottom right, red, darkred);
|
||||
background: linear-gradient(to bottom right, darkred, red);
|
||||
color: white;
|
||||
border: 1px solid red;
|
||||
}
|
||||
|
||||
.framed-orange {
|
||||
background: linear-gradient(to bottom right, orange, #bf6c06);
|
||||
background: linear-gradient(to bottom right, #bf6c06, orange);
|
||||
color: white;
|
||||
border: 1px solid orange;
|
||||
}
|
||||
@ -356,6 +368,12 @@ div {
|
||||
border: 1px solid black;
|
||||
}
|
||||
|
||||
.framed-pink {
|
||||
background: linear-gradient(to bottom right, #3b115b, #d18be8);
|
||||
color: #f8effb;
|
||||
border: 1px solid #4a0084;
|
||||
}
|
||||
|
||||
.nomaxwidth {
|
||||
max-width: none !important;
|
||||
}
|
||||
|
@ -36,8 +36,8 @@
|
||||
<td th:text="${#temporals.format(booker.bookingDate, 'dd.MM.yyyy')}"></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>Bestätigt</th>
|
||||
<td th:text="${booker.accept == null ? '' : (booker.accept ? 'Ja' : 'abgelehnt')}"></td>
|
||||
<th>Status</th>
|
||||
<td th:text="${booker.progress}"></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>Freizeitpreis</th>
|
||||
|
@ -18,7 +18,7 @@
|
||||
<th>Freizeit</th>
|
||||
<th>Rolle</th>
|
||||
<th>Kontostand</th>
|
||||
<th>Angemeldet</th>
|
||||
<th>Status</th>
|
||||
<th>Bestätigt</th>
|
||||
</tr>
|
||||
</thead>
|
||||
@ -48,7 +48,7 @@
|
||||
</form>
|
||||
</td>
|
||||
<td class="middled" th:text="${#temporals.format(b.bookingDate, 'dd.MM.yyyy')}"></td>
|
||||
<td class="middled" th:text="${b.accept == null ? '' : (b.accept ? 'Ja' : 'abgelehnt')}"></td>
|
||||
<td class="middled" th:text="${b.progress}"></td>
|
||||
</tr>
|
||||
</th:block>
|
||||
</tbody>
|
||||
|
@ -63,7 +63,7 @@
|
||||
<th>Geschlecht</th>
|
||||
<th>Rolle</th>
|
||||
<th>Kontostand</th>
|
||||
<th>Angemeldet</th>
|
||||
<th>Status</th>
|
||||
<th>Bestätigt</th>
|
||||
</tr>
|
||||
</thead>
|
||||
@ -75,7 +75,7 @@
|
||||
<td th:text="${b.role}"></td>
|
||||
<td><span th:text="${#numbers.formatDecimal(b.paid, 1, 2) + ' €'}" th:if="${b.paid != null}"></span></td>
|
||||
<td th:text="${#temporals.format(b.bookingDate, 'dd.MM.yyyy')}"></td>
|
||||
<td th:text="${b.accept == null ? '' : (b.accept ? 'Ja' : 'abgelehnt')}"></td>
|
||||
<td th:text="${b.progress}"></td>
|
||||
</tr>
|
||||
</th:block>
|
||||
</tbody>
|
||||
|
@ -31,6 +31,11 @@
|
||||
</tr>
|
||||
</tfoot>
|
||||
</table>
|
||||
<div class="row">
|
||||
<div class="col" th:each="c : ${camps}">
|
||||
<a th:href="@{/business/outlay/summary/{id}(id=${c.id})}" class="btn btn-outline-primary" th:text="${c.campname}"></a>
|
||||
</div>
|
||||
</div>
|
||||
<script>
|
||||
$(document).ready(function() {
|
||||
$("#table").DataTable({
|
||||
|
53
src/main/resources/templates/business/outlay/summary.html
Normal file
53
src/main/resources/templates/business/outlay/summary.html
Normal file
@ -0,0 +1,53 @@
|
||||
<!DOCTYPE html>
|
||||
<html xmlns:th="http://www.thymeleaf.org" layout:decorate="~{template}" xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout" xmlns:sec="http://www.thymeleaf.org/extras/spring-security">
|
||||
<head>
|
||||
<title>Camp Organizer Business</title>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
|
||||
</head>
|
||||
<body>
|
||||
<th:block layout:fragment="content">
|
||||
<div class="mainpage">
|
||||
<div class="container" style="max-width: 100%" sec:authorize="hasRole('business_outlay')">
|
||||
<table id="table" class="table table-striped">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Kassenzettelnummer</th>
|
||||
<th>Händler / Shop</th>
|
||||
<th>Freizeit</th>
|
||||
<th>Auslegender</th>
|
||||
<th>Betrag</th>
|
||||
<th>Tag / Uhrzeit</th>
|
||||
<th>Kurzbeschreibung</th>
|
||||
<th>Bemerkungen</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr th:each="o : ${list}">
|
||||
<td><a th:href="@{/business/outlay/edit/{id}(id=${o.id})}" th:text="${o.recipenumber}"></a></td>
|
||||
<td><a th:href="@{/business/outlay/edit/{id}(id=${o.id})}" th:text="${o.trader}"></a></td>
|
||||
<td><a th:href="@{/business/outlay/edit/{id}(id=${o.id})}" th:text="${o.campname}"></a></td>
|
||||
<td><a th:href="@{/business/outlay/edit/{id}(id=${o.id})}" th:text="${o.provider}"></a></td>
|
||||
<td><a th:href="@{/business/outlay/edit/{id}(id=${o.id})}" th:text="${#numbers.formatDecimal(o.cash, 1, 2, 'COMMA')} + ' €'"></a></td>
|
||||
<td><a th:href="@{/business/outlay/edit/{id}(id=${o.id})}" th:text="${#temporals.format(o.buydate, 'dd.MM.yyyy, HH:mm.ss')}"></a></td>
|
||||
<td><a th:href="@{/business/outlay/edit/{id}(id=${o.id})}" th:text="${o.ingredients}"></a></td>
|
||||
<td><a th:href="@{/business/outlay/edit/{id}(id=${o.id})}" th:text="${o.recipenote}"></a></td>
|
||||
</tr>
|
||||
</tbody>
|
||||
<tfoot>
|
||||
<tr>
|
||||
<td colspan="8"><a th:href="@{/business/outlay/download/{campid}(campid=${campid})}" class="btn btn-outline-primary form-control">herunterladen</a></td>
|
||||
</tr>
|
||||
</tfoot>
|
||||
</table>
|
||||
<script>
|
||||
$(document).ready(function() {
|
||||
$("#table").DataTable({
|
||||
language : locale_de
|
||||
});
|
||||
});
|
||||
</script>
|
||||
</div>
|
||||
</div>
|
||||
</th:block>
|
||||
</body>
|
||||
</html>
|
@ -39,7 +39,7 @@
|
||||
<div th:text="${p.camprolle}"></div></td>
|
||||
<td><div th:text="${#temporals.format(p.birthDate, 'dd.MM.yyyy')}"></div>
|
||||
<div th:text="${p.getAge(campStartDate)} + ' Jahre'"></div></td>
|
||||
<td th:text="${p.accept}"></td>
|
||||
<td th:text="${p.progress}"></td>
|
||||
<td th:text="${#temporals.format(p.created, 'dd.MM.yyyy HH:mm')}"></td>
|
||||
<td><span th:text="${p.consentCatalogPhoto ? 'ja' : 'nein'}" th:if="${p.consentCatalogPhoto}"></span></td>
|
||||
<td th:text="${p.comment}"></td>
|
||||
|
@ -44,7 +44,7 @@
|
||||
</div>
|
||||
<div class="accordion-item">
|
||||
<h2 class="accordion-header" id="approvedpanel">
|
||||
<button class="accordion-button" type="button" data-bs-toggle="collapse" data-bs-target="#approveddiv" aria-expanded="true" aria-control="approveddiv">kürzlich bestätigte
|
||||
<button class="accordion-button" type="button" data-bs-toggle="collapse" data-bs-target="#approveddiv" aria-expanded="true" aria-control="approveddiv">bestätigte
|
||||
Anmeldungen</button>
|
||||
</h2>
|
||||
<div id="approveddiv" class="accordion-collapse collapse dist8" aria-labelled="approvedpanel" data-bs-parent="#mainacc">
|
||||
@ -79,7 +79,7 @@
|
||||
</div>
|
||||
<div class="accordion-item">
|
||||
<h2 class="accordion-header" id="rejectedpanel">
|
||||
<button class="accordion-button" type="button" data-bs-toggle="collapse" data-bs-target="#rejecteddiv" aria-expanded="true" aria-control="rejecteddiv">kürzlich abgelehnte
|
||||
<button class="accordion-button" type="button" data-bs-toggle="collapse" data-bs-target="#rejecteddiv" aria-expanded="true" aria-control="rejecteddiv">abgelehnte
|
||||
Anmeldungen</button>
|
||||
</h2>
|
||||
<div id="rejecteddiv" class="accordion-collapse collapse dist8" aria-labelled="rejectedpanel" data-bs-parent="#mainacc">
|
||||
@ -112,6 +112,41 @@
|
||||
</script>
|
||||
</div>
|
||||
</div>
|
||||
<div class="accordion-item">
|
||||
<h2 class="accordion-header" id="revokedpanel">
|
||||
<button class="accordion-button" type="button" data-bs-toggle="collapse" data-bs-target="#revokeddiv" aria-expanded="true" aria-control="revokeddiv">stornierte
|
||||
Anmeldungen</button>
|
||||
</h2>
|
||||
<div id="revokeddiv" class="accordion-collapse collapse dist8" aria-labelled="revokedpanel" data-bs-parent="#mainacc">
|
||||
<table id="revoked">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Freizeit</th>
|
||||
<th>Name</th>
|
||||
<th>Rolle</th>
|
||||
<th>Anmeldedatum</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr th:each="u : ${revoked}">
|
||||
<td><a th:href="@{'/confirmation/person/' + ${u.pkPerson}}" th:text="${u.camp} + ' ' + ${#temporals.format(u.date, 'yyyy')}"></a></td>
|
||||
<td><a th:href="@{'/confirmation/person/' + ${u.pkPerson}}" th:text="${u.fullname}"></a></td>
|
||||
<td><a th:href="@{'/confirmation/person/' + ${u.pkPerson}}" th:text="${u.rolename}"></a></td>
|
||||
<td><a th:href="@{'/confirmation/person/' + ${u.pkPerson}}" th:text="${#temporals.format(u.registered, 'yyyy-MM-dd')}"></a></td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<script type="text/javascript">
|
||||
$(document).ready(function() {
|
||||
$("#revoked").DataTable({
|
||||
language : locale_de,
|
||||
pageLength : 5,
|
||||
lengthMenu : [ [ 5, 25, 50, -1 ], [ 5, 25, 50, "Alle" ] ]
|
||||
});
|
||||
});
|
||||
</script>
|
||||
</div>
|
||||
</div>
|
||||
<div class="accordion-item">
|
||||
<h2 class="accordion-header" id="overviewpanel">
|
||||
<button class="accordion-button" type="button" data-bs-toggle="collapse" data-bs-target="#overviewdiv" aria-expanded="true" aria-control="overviewdiv">Freizeitenübersicht</button>
|
||||
@ -127,14 +162,14 @@
|
||||
<tbody>
|
||||
<tr th:each="o : ${campoverview}">
|
||||
<td th:text="${o.camp} + ' ' + ${#temporals.format(o.date, 'yyyy')}"></td>
|
||||
<td><span th:text="${o.untouched}" class="badgetodo"></span> / <span th:text="${o.rejected}" class="badgewarn"></span> / <span th:text="${o.approved}" class="badgeinfo"></span></td>
|
||||
<td><span th:text="${o.untouched}" class="badgetodo"></span> / <span th:text="${o.rejected}" class="badgewarn"></span> / <span th:text="${o.approved}" class="badgeinfo"></span> / <span th:text="${o.revoked}" class="badgeerror"></span></td>
|
||||
</tr>
|
||||
</tbody>
|
||||
<tfoot>
|
||||
<tr>
|
||||
<td>Zusammenfassung</td>
|
||||
<td><span th:text="${campoverviewsummary.untouched}" class="badgetodo"></span> / <span th:text="${campoverviewsummary.rejected}" class="badgewarn"></span> / <span
|
||||
th:text="${campoverviewsummary.approved}" class="badgeinfo"></span></td>
|
||||
th:text="${campoverviewsummary.approved}" class="badgeinfo"></span> / <span th:text="${campoverviewsummary.revoked}" class="badgeerror"></span></td>
|
||||
</tfoot>
|
||||
</table>
|
||||
<script type="text/javascript">
|
||||
@ -146,7 +181,7 @@
|
||||
});
|
||||
});
|
||||
</script>
|
||||
<span>Legende:</span><span class="badgetodo">unbearbeitet</span><span class="badgewarn">abgelehnt</span><span class="badgeinfo">bestätigt</span>
|
||||
<span>Legende:</span><span class="badgetodo">unbearbeitet</span><span class="badgewarn">abgelehnt</span><span class="badgeinfo">bestätigt</span><span class="badgeerror">storniert</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="accordion-item">
|
||||
|
@ -8,7 +8,7 @@
|
||||
<th:block layout:fragment="content">
|
||||
<div class="mainpage">
|
||||
<div class="container" style="max-width: 100%" sec:authorize="hasRole('registrator')">
|
||||
<form action="#" th:action="@{/confirmation/person/update}" th:object="${person}" method="post" th:if="${person != null}">
|
||||
<form id="form" action="#" th:action="@{/confirmation/person/update}" th:object="${person}" method="post" th:if="${person != null}">
|
||||
<div class="row mb-2">
|
||||
<label for="outputPk" class="col-sm-2 col-form-label">ID</label>
|
||||
<div class="col-sm-10">
|
||||
@ -112,26 +112,65 @@
|
||||
</div>
|
||||
<div class="row mb-2">
|
||||
<label for="inputAccept" class="col-sm-2 col-form-label">Status</label>
|
||||
<div class="col-sm-10">
|
||||
<div class="form-group">
|
||||
<input type="radio" class="btn-check" id="accept1" name="accept1" value="" th:field="*{accept}" /> <label class="btn btn-outline-primary" for="accept1"><i
|
||||
class="fas fa-question"></i> offen</label> <input type="radio" class="btn-check" id="accept2" name="accept2" value="true" th:field="*{accept}" /> <label class="btn btn-outline-success"
|
||||
for="accept2"><i class="fas fa-check"></i> bestätigt</label> <input type="radio" class="btn-check" id="accept3" name="accept3" value="false" th:field="*{accept}" /> <label
|
||||
class="btn btn-outline-danger" for="accept3"><i class="fas fa-ban"></i> abgelehnt</label>
|
||||
<span class="col-sm-2 btn btn-outline-warning" th:if="${person.progress} == 'requested'">offen</span>
|
||||
<span class="col-sm-2 btn btn-outline-success" th:if="${person.progress} == 'approved'">bestätigt</span>
|
||||
<span class="col-sm-2 btn btn-outline-danger" th:if="${person.progress} == 'rejected'">abgelehnt</span>
|
||||
<span class="col-sm-2 btn btn-outline-secondary" th:if="${person.progress} == 'revoked'">storniert</span>
|
||||
<div class="col-sm-8" th:if="${#lists.contains({'requested', 'approved', 'rejected'}, person.progress)}">
|
||||
<select th:field="*{progress}" class="form-select">
|
||||
<option value="requested">offen</option>
|
||||
<option value="approved">bestätigt</option>
|
||||
<option value="rejected">abgelehnt</option>
|
||||
</select>
|
||||
</div>
|
||||
<div class="col-sm-8" th:if="${person.progress} == 'revoked'">
|
||||
<button type="button" class="btn btn-danger" data-bs-toggle="modal" data-bs-target="#deleteModal">
|
||||
<i class="fas fa-trash"></i> endgültig löschen
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row mb-2">
|
||||
<label for="inputAccept" class="col-sm-2 col-form-label"></label>
|
||||
<div class="col-sm-10">
|
||||
<button type="submit" class="btn btn-primary" onclick="progress.start()">Ok</button>
|
||||
<button type="submit" class="btn btn-primary" onclick="progress.start()" th:if="${person.progress} != 'revoked'">Ok</button>
|
||||
<a th:href="@{/confirmation}" class="btn btn-secondary">Abbrechen</a>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
<div class="modal fade" id="deleteModal" tabindex="-1" aria-labelledby="deleteModalLabel" aria-hidden="true">
|
||||
<div class="modal-dialog">
|
||||
<div class="modal-content">
|
||||
<div class="modal-header bg-danger">
|
||||
<h1 class="modal-title fs-5" id="deleteModalLabel">Löschen der Anmeldung</h1>
|
||||
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
|
||||
</div>
|
||||
<div class="modal-body">
|
||||
Willst du wirklich die Anmeldung von <span th:text="${person.forename}" class="text-danger"></span> <span th:text="${person.surname}" class="text-danger"></span> an der Freizeit
|
||||
<select class="form-select locked" th:field="${person.fkCamp}" disabled="disabled">
|
||||
<option th:each="c : ${camps}" th:value="${c.pk}" th:text="${c.name} + ' ' + ${#temporals.format(c.arrive, 'yyyy')} + ' in ' + ${c.location}"></option>
|
||||
</select> löschen? Sie geht damit unwiederbringlich verloren.
|
||||
</div>
|
||||
<div class="modal-footer">
|
||||
<button type="button" class="btn btn-outline-secondary" data-bs-dismiss="modal">Abbrechen</button>
|
||||
<a th:href="@{/registration/remove/{id}(id=${person.pk})}" class="btn btn-danger">ja, wirklich löschen</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div th:if="${person == null}" class="error">In der Datenbank wurde keine Person mit entsprechender ID gefunden.</div>
|
||||
</div>
|
||||
</div>
|
||||
<script type="text/javascript">
|
||||
/**
|
||||
* forbid enter in form to allow disabling the ok button for revoked bookings
|
||||
*/
|
||||
$(document).on('keyup keypress', 'form', function(e) {
|
||||
if (e.keyCode == 13) {
|
||||
e.preventDefault();
|
||||
return false;
|
||||
}
|
||||
});
|
||||
</script>
|
||||
</th:block>
|
||||
</body>
|
||||
</html>
|
||||
|
@ -32,11 +32,13 @@
|
||||
<div class="accordion" id="acc" th:if="${mybookings.size() > 0}" style="max-width: 800px; margin-left: auto; margin-right: auto">
|
||||
<div class="accordion-item" th:each="b : ${mybookings}">
|
||||
<h2 class="accordion-header" th:id="'acc-head-' + ${b.pk}" th:if="${b.pk}">
|
||||
<button th:class="'accordion-button collapsed acc_' + ${b.isOver ? 'over' : b.accept}" type="button" data-bs-toggle="collapse" th:data-bs-target="'#acc-body-' + ${b.pk}"
|
||||
<button th:class="'accordion-button collapsed acc_' + ${b.isOver ? 'over' : b.progress}" type="button" data-bs-toggle="collapse" th:data-bs-target="'#acc-body-' + ${b.pk}"
|
||||
aria-expanded="true" th:aria-controls="'#acc-body-' + ${b.pk}">
|
||||
<i class="fas fa-check framed framed-green" th:if="${b.accept}"></i> <i class="fas fa-ban framed framed-red" th:if="${b.accept} == false"></i> <i
|
||||
class="fas fa-question framed framed-orange" th:if="${b.accept} == null"></i>
|
||||
<span th:text="${b.forename + ' ' + b.surname + ' für ' + b.campName + ' ' + #numbers.formatInteger(b.year, 4)}" class="headlinefont"></span>
|
||||
<i class="fas fa-check framed framed-green" th:if="${b.progress} == 'approved'"></i>
|
||||
<i class="fas fa-ban framed framed-red" th:if="${b.progress} == 'rejected'"></i>
|
||||
<i class="fas fa-question framed framed-orange" th:if="${b.progress} == 'requested'"></i>
|
||||
<i class="fas fa-trash framed framed-pink" th:if="${b.progress} == 'revoked'"></i>
|
||||
<span th:text="${b.forename + ' ' + b.surname + ' @ ' + b.campName + ' ' + #numbers.formatInteger(b.year, 4)}" class="headlinefont"></span>
|
||||
</button>
|
||||
</h2>
|
||||
<div th:id="'acc-body-' + ${b.pk}" class="accordion-collapse collapse" th:aria-labelledby="'acc-head-' + ${b.pk}">
|
||||
@ -62,7 +64,7 @@
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="card" th:if="${b.accept}">
|
||||
<div class="card" th:if="${b.progress} == 'approved'">
|
||||
<div class="card-header">Dokumente</div>
|
||||
<div class="card-body">
|
||||
<div class="container">
|
||||
@ -139,8 +141,11 @@
|
||||
<div class="col-sm-8">
|
||||
<input type="submit" class="btn btn-primary" value="Änderungen übernehmen" />
|
||||
</div>
|
||||
<div class="col-sm-2">
|
||||
<a th:href="@{/registration/cancel/{id}(id=${b.pk})}" class="btn btn-outline-danger" th:if="${!b.isOver}">stornieren</a>
|
||||
<div class="col-sm-2" th:if="${b.progress != 'revoked'}">
|
||||
<a th:href="@{/registration/revoke/{id}(id=${b.pk})}" class="btn btn-outline-danger" th:if="${!b.isOver}">stornieren</a>
|
||||
</div>
|
||||
<div class="col-sm-2" th:if="${b.progress == 'revoked'}">
|
||||
<a th:href="@{/registration/unrevoke/{id}(id=${b.pk})}" class="btn btn-outline-success" th:if="${!b.isOver}">Stornierung aufheben</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@ -150,8 +155,12 @@
|
||||
<div class="alert alert-primary" th:if="${b.created != null}">
|
||||
angemeldet am <span th:text="${#temporals.format(b.created, 'dd.MM.yyyy')}"></span> von <span th:text="${b.subscriber}"></span>
|
||||
</div>
|
||||
<div th:class="'alert ' + ${b.accept ? 'alert-success' : 'alert-danger'}" th:if="${b.accept != null}">
|
||||
<span th:text="${b.accept ? 'bestätigt' : 'abgelehnt'}"></span> von <span th:text="${b.registrator}"></span>
|
||||
<div class="alert alert-danger" th:if="${b.progress == 'revoked'}">
|
||||
storniert von <span th:text="${b.subscriber}"></span>
|
||||
</div>
|
||||
<div th:class="'alert alert-' + (${b.progress} == 'approved' ? 'success' : 'danger')" th:if="${#lists.contains({'approved', 'rejected'}, b.progress)}">
|
||||
<span th:if="${b.progress} == 'approved'">bestätigt</span>
|
||||
<span th:if="${b.progress} == 'rejected'">abgelehnt</span> von <span th:text="${b.registrator}"></span>
|
||||
</div>
|
||||
<div class="alert alert-warning" th:if="${b.isOver}">Die Freizeit ist bereits vorbei.</div>
|
||||
</div>
|
||||
|
@ -21,7 +21,7 @@
|
||||
th:if="${bean.isDirector}">Leiter</span><span th:if="${bean.isFeeder}">Küchenhilfe</span>
|
||||
</div>
|
||||
<div class="card-footer">
|
||||
<a th:href="@{/registration/remove/{id}(id=${bean.pk})}" class="btn btn-danger">Ja, stornieren</a> <a th:href="@{/dashboard}" class="btn btn-outline-success">Stornierung abbrechen</a>
|
||||
<a th:href="@{/registration/revoke/{id}(id=${bean.pk})}" class="btn btn-danger">Ja, stornieren</a> <a th:href="@{/dashboard}" class="btn btn-outline-success">Stornierung abbrechen</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
@ -1,17 +1,17 @@
|
||||
<!DOCTYPE html>
|
||||
<html xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout" xmlns:th="http://www.thymeleaf.org" xmlns:sec="http://www.thymeleaf.org/extras/spring-security">
|
||||
<html xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout" xmlns:th="http://www.thymeleaf.org" xmlns:sec="http://www.thymeleaf.org/extras/spring-security" data-bs-theme="light">
|
||||
<head>
|
||||
<title>Camp Organizer 2</title>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
||||
<link th:rel="stylesheet" type="text/css" media="all" th:href="@{/webjars/bootstrap/5.3.2/css/bootstrap.min.css} " />
|
||||
<link th:rel="stylesheet" type="text/css" media="all" th:href="@{/webjars/font-awesome/6.5.1/css/all.min.css} " />
|
||||
<link th:rel="stylesheet" type="text/css" media="all" th:href="@{/webjars/bootstrap/5.3.3/css/bootstrap.min.css} " />
|
||||
<link th:rel="stylesheet" type="text/css" media="all" th:href="@{/webjars/font-awesome/6.5.2/css/all.min.css} " />
|
||||
<link th:rel="stylesheet" type="text/css" media="all" th:href="@{/webjars/datatables/1.13.5/css/jquery.dataTables.min.css}" />
|
||||
<link th:rel="stylesheet" type="text/css" media="all" th:href="@{/webjars/select2/4.0.13/css/select2.min.css}" />
|
||||
<link th:rel="stylesheet" type="text/css" media="all" th:href="@{/css/style.css}" />
|
||||
<link th:rel="stylesheet" type="text/css" media="all" th:href="@{/css/select2-bootstrap-5-theme.min.css}" />
|
||||
<script th:src="@{/webjars/jquery/3.7.1/jquery.min.js}"></script>
|
||||
<script th:src="@{/webjars/bootstrap/5.3.2/js/bootstrap.bundle.min.js}"></script>
|
||||
<script th:src="@{/webjars/bootstrap/5.3.3/js/bootstrap.bundle.min.js}"></script>
|
||||
<script th:src="@{/webjars/datatables/1.13.5/js/jquery.dataTables.min.js}"></script>
|
||||
<script th:src="@{/webjars/select2/4.0.13/js/select2.full.min.js}"></script>
|
||||
<script th:src="@{/js/dataTables.de.js}"></script>
|
||||
|
Reference in New Issue
Block a user