Compare commits
	
		
			2 Commits
		
	
	
		
			ae9e2018a8
			...
			2abb937725
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|  | 2abb937725 | ||
|  | b5403ae20c | 
							
								
								
									
										20
									
								
								build.gradle
									
									
									
									
									
								
							
							
						
						
									
										20
									
								
								build.gradle
									
									
									
									
									
								
							| @@ -1,5 +1,5 @@ | |||||||
| plugins { | 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 "io.spring.dependency-management" version "1.1.4" | ||||||
| 	id 'java' | 	id 'java' | ||||||
| 	id 'war' | 	id 'war' | ||||||
| @@ -8,7 +8,7 @@ plugins { | |||||||
| } | } | ||||||
|  |  | ||||||
| group = 'de.jottyfan.camporganizer' | group = 'de.jottyfan.camporganizer' | ||||||
| version = '0.8.6' | version = '0.8.7' | ||||||
|  |  | ||||||
| description = """CampOrganizer2""" | description = """CampOrganizer2""" | ||||||
|  |  | ||||||
| @@ -40,15 +40,15 @@ war { | |||||||
| } | } | ||||||
|  |  | ||||||
| dependencies { | dependencies { | ||||||
|   implementation 'org.jooq:jooq:3.19.6' |   implementation 'org.jooq:jooq:3.19.14' | ||||||
| 	implementation 'de.jottyfan:COJooq:2024.03.16c' | 	implementation 'de.jottyfan:COJooq:2024.10.24' | ||||||
|  |  | ||||||
| 	implementation 'org.apache.logging.log4j:log4j-api:2.23.1' | 	implementation 'org.apache.logging.log4j:log4j-api:2.24.1' | ||||||
| 	implementation 'org.apache.logging.log4j:log4j-core:2.23.1' | 	implementation 'org.apache.logging.log4j:log4j-core:2.24.1' | ||||||
| 	implementation 'org.apache.logging.log4j:log4j-to-slf4j:2.23.1' | 	implementation 'org.apache.logging.log4j:log4j-to-slf4j:2.24.1' | ||||||
|  |  | ||||||
| 	implementation 'org.webjars:bootstrap:5.3.2' | 	implementation 'org.webjars:bootstrap:5.3.3' | ||||||
| 	implementation 'org.webjars:font-awesome:6.5.1' | 	implementation 'org.webjars:font-awesome:6.5.2' | ||||||
| 	implementation 'org.webjars:jquery:3.7.1' | 	implementation 'org.webjars:jquery:3.7.1' | ||||||
| 	implementation 'org.webjars:popper.js:2.11.7' | 	implementation 'org.webjars:popper.js:2.11.7' | ||||||
|   implementation 'org.webjars:datatables:1.13.5' |   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-jooq' | ||||||
| 	implementation 'org.springframework.boot:spring-boot-starter-security' | 	implementation 'org.springframework.boot:spring-boot-starter-security' | ||||||
| 	implementation "org.springframework.boot:spring-boot-starter-oauth2-client" | 	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-thymeleaf' | ||||||
| 	implementation 'org.springframework.boot:spring-boot-starter-web' | 	implementation 'org.springframework.boot:spring-boot-starter-web' | ||||||
| 	implementation 'org.springframework.boot:spring-boot-starter-validation' | 	implementation 'org.springframework.boot:spring-boot-starter-validation' | ||||||
|   | |||||||
| @@ -31,7 +31,7 @@ public class Main extends SpringBootServletInitializer { | |||||||
| 		Path path = Paths.get(""); | 		Path path = Paths.get(""); | ||||||
| 		String p = path.toAbsolutePath().toString(); | 		String p = path.toAbsolutePath().toString(); | ||||||
| 		p = p.substring(p.lastIndexOf("/") + 1); | 		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 | 		// TODO: put p + "properties" somehow into consideration to load the application.properties | ||||||
| 		SpringApplication.run(Main.class, args); | 		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) | 			.groupBy(T_DOCUMENT.PK, T_DOCUMENT.NAME, T_DOCUMENT.DOCTYPE, T_DOCUMENT.FILETYPE) | ||||||
| 			.orderBy(T_DOCUMENT.PK); | 			.orderBy(T_DOCUMENT.PK); | ||||||
| 		// @formatter:on | 		// @formatter:on | ||||||
| 		LOGGER.debug(sql.toString()); | 		LOGGER.trace(sql); | ||||||
| 		Record5<Integer, String, EnumDocument, EnumFiletype, EnumCamprole[]> r = sql.fetchOne(); | 		Record5<Integer, String, EnumDocument, EnumFiletype, EnumCamprole[]> r = sql.fetchOne(); | ||||||
| 		if (r != null) { | 		if (r != null) { | ||||||
| 			DocumentBean bean = new DocumentBean(); | 			DocumentBean bean = new DocumentBean(); | ||||||
| @@ -129,7 +129,7 @@ public class AdminRepository { | |||||||
| 			.groupBy(T_DOCUMENT.PK, T_DOCUMENT.NAME, T_DOCUMENT.DOCTYPE, T_DOCUMENT.FILETYPE) | 			.groupBy(T_DOCUMENT.PK, T_DOCUMENT.NAME, T_DOCUMENT.DOCTYPE, T_DOCUMENT.FILETYPE) | ||||||
| 			.orderBy(T_DOCUMENT.PK); | 			.orderBy(T_DOCUMENT.PK); | ||||||
| 		// @formatter:on | 		// @formatter:on | ||||||
| 		LOGGER.debug(sql.toString()); | 		LOGGER.trace(sql.toString()); | ||||||
| 		List<DocumentBean> list = new ArrayList<>(); | 		List<DocumentBean> list = new ArrayList<>(); | ||||||
| 		Iterator<Record5<Integer, String, EnumDocument, EnumFiletype, EnumCamprole[]>> i = sql.fetch().iterator(); | 		Iterator<Record5<Integer, String, EnumDocument, EnumFiletype, EnumCamprole[]>> i = sql.fetch().iterator(); | ||||||
| 		while (i.hasNext()) { | 		while (i.hasNext()) { | ||||||
| @@ -162,7 +162,7 @@ public class AdminRepository { | |||||||
| 			.from(T_DOCUMENT) | 			.from(T_DOCUMENT) | ||||||
| 			.where(condition); | 			.where(condition); | ||||||
| 		// @formatter:on | 		// @formatter:on | ||||||
| 		LOGGER.debug(sql.toString()); | 		LOGGER.trace(sql); | ||||||
| 		List<DocumentBean> list = new ArrayList<>(); | 		List<DocumentBean> list = new ArrayList<>(); | ||||||
| 		Iterator<Record4<Integer, String, EnumDocument, EnumFiletype>> i = sql.fetch().iterator(); | 		Iterator<Record4<Integer, String, EnumDocument, EnumFiletype>> i = sql.fetch().iterator(); | ||||||
| 		while (i.hasNext()) { | 		while (i.hasNext()) { | ||||||
| @@ -202,7 +202,7 @@ public class AdminRepository { | |||||||
| 				  .set(T_DOCUMENT.FILETYPE, bean.getFiletype()) | 				  .set(T_DOCUMENT.FILETYPE, bean.getFiletype()) | ||||||
| 				  .where(T_DOCUMENT.PK.eq(bean.getPk())); | 				  .where(T_DOCUMENT.PK.eq(bean.getPk())); | ||||||
| 			  // @formatter:on | 			  // @formatter:on | ||||||
| 				LOGGER.debug("{}", sql.toString()); | 				LOGGER.trace(sql); | ||||||
| 				lrw.add(sql.execute()); | 				lrw.add(sql.execute()); | ||||||
| 			} else { | 			} else { | ||||||
| 				InsertResultStep<TDocumentRecord> sql = DSL.using(c) | 				InsertResultStep<TDocumentRecord> sql = DSL.using(c) | ||||||
| @@ -215,7 +215,7 @@ public class AdminRepository { | |||||||
| 				  .values(bean.getName(), bean.getDoctype(), bean.getDocument(), bean.getFiletype()) | 				  .values(bean.getName(), bean.getDoctype(), bean.getDocument(), bean.getFiletype()) | ||||||
| 				  .returning(T_DOCUMENT.PK); | 				  .returning(T_DOCUMENT.PK); | ||||||
| 		  	// @formatter:on | 		  	// @formatter:on | ||||||
| 				LOGGER.debug("{}", sql.toString()); | 				LOGGER.trace(sql); | ||||||
| 				pk = sql.fetchOne().get(T_DOCUMENT.PK); | 				pk = sql.fetchOne().get(T_DOCUMENT.PK); | ||||||
| 				lrw.add(1); | 				lrw.add(1); | ||||||
| 			} | 			} | ||||||
| @@ -233,7 +233,7 @@ public class AdminRepository { | |||||||
| 				  	.onConflict(T_DOCUMENTROLE.FK_DOCUMENT, T_DOCUMENTROLE.CAMPROLE) | 				  	.onConflict(T_DOCUMENTROLE.FK_DOCUMENT, T_DOCUMENTROLE.CAMPROLE) | ||||||
| 				  	.doNothing(); | 				  	.doNothing(); | ||||||
| 				  // @formatter:on | 				  // @formatter:on | ||||||
| 					LOGGER.debug("{}", sql.toString()); | 					LOGGER.trace(sql); | ||||||
| 					lrw.add(sql.execute()); | 					lrw.add(sql.execute()); | ||||||
| 					removeCandidates.remove(role); | 					removeCandidates.remove(role); | ||||||
| 				} catch (IllegalArgumentException e) { | 				} catch (IllegalArgumentException e) { | ||||||
| @@ -246,7 +246,7 @@ public class AdminRepository { | |||||||
| 				.where(T_DOCUMENTROLE.FK_DOCUMENT.eq(pk)) | 				.where(T_DOCUMENTROLE.FK_DOCUMENT.eq(pk)) | ||||||
| 				.and(T_DOCUMENTROLE.CAMPROLE.in(removeCandidates)); | 				.and(T_DOCUMENTROLE.CAMPROLE.in(removeCandidates)); | ||||||
| 			// @formatter:on | 			// @formatter:on | ||||||
| 			LOGGER.debug("{}", sql.toString()); | 			LOGGER.trace(sql); | ||||||
| 			lrw.add(sql.execute()); | 			lrw.add(sql.execute()); | ||||||
| 		}); | 		}); | ||||||
| 		return lrw.getCounter(); | 		return lrw.getCounter(); | ||||||
| @@ -268,7 +268,7 @@ public class AdminRepository { | |||||||
| 			  .set(T_CAMP.FK_DOCUMENT, (Integer) null) | 			  .set(T_CAMP.FK_DOCUMENT, (Integer) null) | ||||||
| 			  .where(T_CAMP.FK_DOCUMENT.eq(pk)); | 			  .where(T_CAMP.FK_DOCUMENT.eq(pk)); | ||||||
| 		  // @formatter:on | 		  // @formatter:on | ||||||
| 			LOGGER.debug("{}", sql.toString()); | 			LOGGER.trace(sql); | ||||||
| 			lrw.add(sql.execute()); | 			lrw.add(sql.execute()); | ||||||
|  |  | ||||||
| 			UpdateConditionStep<TLocationRecord> sql1 = DSL.using(t) | 			UpdateConditionStep<TLocationRecord> sql1 = DSL.using(t) | ||||||
| @@ -277,7 +277,7 @@ public class AdminRepository { | |||||||
| 			  .set(T_LOCATION.FK_DOCUMENT, (Integer) null) | 			  .set(T_LOCATION.FK_DOCUMENT, (Integer) null) | ||||||
| 			  .where(T_LOCATION.FK_DOCUMENT.eq(pk)); | 			  .where(T_LOCATION.FK_DOCUMENT.eq(pk)); | ||||||
| 		  // @formatter:on | 		  // @formatter:on | ||||||
| 			LOGGER.debug("{}", sql1.toString()); | 			LOGGER.trace(sql1); | ||||||
| 			lrw.add(sql1.execute()); | 			lrw.add(sql1.execute()); | ||||||
|  |  | ||||||
| 			DeleteConditionStep<TDocumentroleRecord> sql2 = DSL.using(t) | 			DeleteConditionStep<TDocumentroleRecord> sql2 = DSL.using(t) | ||||||
| @@ -285,7 +285,7 @@ public class AdminRepository { | |||||||
| 				.deleteFrom(T_DOCUMENTROLE) | 				.deleteFrom(T_DOCUMENTROLE) | ||||||
| 				.where(T_DOCUMENTROLE.FK_DOCUMENT.eq(pk)); | 				.where(T_DOCUMENTROLE.FK_DOCUMENT.eq(pk)); | ||||||
| 			// @formatter:on | 			// @formatter:on | ||||||
| 			LOGGER.debug("{}", sql2.toString()); | 			LOGGER.trace(sql2); | ||||||
| 			lrw.add(sql2.execute()); | 			lrw.add(sql2.execute()); | ||||||
|  |  | ||||||
| 			DeleteConditionStep<TDocumentRecord> sql3 = DSL.using(t) | 			DeleteConditionStep<TDocumentRecord> sql3 = DSL.using(t) | ||||||
| @@ -293,7 +293,7 @@ public class AdminRepository { | |||||||
| 				.deleteFrom(T_DOCUMENT) | 				.deleteFrom(T_DOCUMENT) | ||||||
| 				.where(T_DOCUMENT.PK.eq(pk)); | 				.where(T_DOCUMENT.PK.eq(pk)); | ||||||
| 			// @formatter:on | 			// @formatter:on | ||||||
| 			LOGGER.debug("{}", sql3.toString()); | 			LOGGER.trace(sql3); | ||||||
| 			lrw.add(sql3.execute()); | 			lrw.add(sql3.execute()); | ||||||
| 		}); | 		}); | ||||||
| 		return lrw.getCounter(); | 		return lrw.getCounter(); | ||||||
| @@ -306,7 +306,7 @@ public class AdminRepository { | |||||||
| 	 */ | 	 */ | ||||||
| 	public List<LocationBean> getLocations() { | 	public List<LocationBean> getLocations() { | ||||||
| 		SelectWhereStep<TLocationRecord> sql = jooq.selectFrom(T_LOCATION); | 		SelectWhereStep<TLocationRecord> sql = jooq.selectFrom(T_LOCATION); | ||||||
| 		LOGGER.debug(sql.toString()); | 		LOGGER.trace(sql); | ||||||
| 		List<LocationBean> list = new ArrayList<>(); | 		List<LocationBean> list = new ArrayList<>(); | ||||||
| 		for (TLocationRecord r : sql.fetch()) { | 		for (TLocationRecord r : sql.fetch()) { | ||||||
| 			list.add(LocationBean.of(r)); | 			list.add(LocationBean.of(r)); | ||||||
| @@ -322,7 +322,7 @@ public class AdminRepository { | |||||||
| 	 */ | 	 */ | ||||||
| 	public LocationBean getLocation(Integer id) { | 	public LocationBean getLocation(Integer id) { | ||||||
| 		SelectConditionStep<TLocationRecord> sql = jooq.selectFrom(T_LOCATION).where(T_LOCATION.PK.eq(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()); | 		return LocationBean.of(sql.fetchOne()); | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| @@ -334,7 +334,7 @@ public class AdminRepository { | |||||||
| 	 */ | 	 */ | ||||||
| 	public Integer deleteLocation(Integer id) { | 	public Integer deleteLocation(Integer id) { | ||||||
| 		DeleteConditionStep<TLocationRecord> sql = jooq.deleteFrom(T_LOCATION).where(T_LOCATION.PK.eq(id)); | 		DeleteConditionStep<TLocationRecord> sql = jooq.deleteFrom(T_LOCATION).where(T_LOCATION.PK.eq(id)); | ||||||
| 		LOGGER.debug(sql.toString()); | 		LOGGER.trace(sql); | ||||||
| 		return sql.execute(); | 		return sql.execute(); | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| @@ -356,7 +356,7 @@ public class AdminRepository { | |||||||
| 							    T_LOCATION.URL) | 							    T_LOCATION.URL) | ||||||
| 					.values(bean.getName(), bean.getFkDocument(), bean.getUrl()); | 					.values(bean.getName(), bean.getFkDocument(), bean.getUrl()); | ||||||
| 				// @formatter:on | 				// @formatter:on | ||||||
| 				LOGGER.debug(sql.toString()); | 				LOGGER.trace(sql); | ||||||
| 				lrw.add(sql.execute()); | 				lrw.add(sql.execute()); | ||||||
| 			} else { | 			} else { | ||||||
| 				UpdateConditionStep<TLocationRecord> sql = DSL.using(t) | 				UpdateConditionStep<TLocationRecord> sql = DSL.using(t) | ||||||
| @@ -367,7 +367,7 @@ public class AdminRepository { | |||||||
| 					.set(T_LOCATION.URL, bean.getUrl()) | 					.set(T_LOCATION.URL, bean.getUrl()) | ||||||
| 					.where(T_LOCATION.PK.eq(bean.getPk())); | 					.where(T_LOCATION.PK.eq(bean.getPk())); | ||||||
| 				// @formatter:on | 				// @formatter:on | ||||||
| 				LOGGER.debug(sql.toString()); | 				LOGGER.trace(sql); | ||||||
| 				lrw.add(sql.execute()); | 				lrw.add(sql.execute()); | ||||||
| 			} | 			} | ||||||
| 		}); | 		}); | ||||||
| @@ -381,7 +381,7 @@ public class AdminRepository { | |||||||
| 	 */ | 	 */ | ||||||
| 	public List<CampBean> getAllCamps() { | 	public List<CampBean> getAllCamps() { | ||||||
| 		SelectWhereStep<TCampRecord> sql = jooq.selectFrom(T_CAMP); | 		SelectWhereStep<TCampRecord> sql = jooq.selectFrom(T_CAMP); | ||||||
| 		LOGGER.debug(sql.toString()); | 		LOGGER.trace(sql); | ||||||
| 		List<CampBean> list = new ArrayList<>(); | 		List<CampBean> list = new ArrayList<>(); | ||||||
| 		for (TCampRecord r : sql.fetch()) { | 		for (TCampRecord r : sql.fetch()) { | ||||||
| 			list.add(CampBean.of(r)); | 			list.add(CampBean.of(r)); | ||||||
| @@ -397,7 +397,7 @@ public class AdminRepository { | |||||||
| 	 */ | 	 */ | ||||||
| 	public CampBean getCamp(Integer id) { | 	public CampBean getCamp(Integer id) { | ||||||
| 		SelectConditionStep<TCampRecord> sql = jooq.selectFrom(T_CAMP).where(T_CAMP.PK.eq(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()); | 		return CampBean.of(sql.fetchOne()); | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| @@ -411,11 +411,11 @@ public class AdminRepository { | |||||||
| 		LambdaResultWrapper lrw = new LambdaResultWrapper(); | 		LambdaResultWrapper lrw = new LambdaResultWrapper(); | ||||||
| 		jooq.transaction(t -> { | 		jooq.transaction(t -> { | ||||||
| 			SelectConditionStep<TPersonRecord> sql1 = DSL.using(t).selectFrom(T_PERSON).where(T_PERSON.FK_CAMP.eq(id)); | 			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(); | 			Integer registrations = sql1.fetch().size(); | ||||||
| 			if (registrations < 1) { | 			if (registrations < 1) { | ||||||
| 				DeleteConditionStep<TCampRecord> sql2 = DSL.using(t).deleteFrom(T_CAMP).where(T_CAMP.PK.eq(id)); | 				DeleteConditionStep<TCampRecord> sql2 = DSL.using(t).deleteFrom(T_CAMP).where(T_CAMP.PK.eq(id)); | ||||||
| 				LOGGER.debug(sql2.toString()); | 				LOGGER.trace(sql2); | ||||||
| 				sql2.execute(); | 				sql2.execute(); | ||||||
| 			} else { | 			} else { | ||||||
| 				lrw.putString("error", String | 				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.getLockSales() != null ? bean.getLockSales() : false, bean.getMaxAge(), bean.getMinAge(), bean.getName(), bean.getPrice(), | ||||||
| 						  bean.getBedsFemale(), bean.getBedsMale(), bean.getBlockedBedsFemale(), bean.getBlockedBedsMale(), startBooking); | 						  bean.getBedsFemale(), bean.getBedsMale(), bean.getBlockedBedsFemale(), bean.getBlockedBedsMale(), startBooking); | ||||||
| 				// @formatter:on | 				// @formatter:on | ||||||
| 				LOGGER.debug(sql.toString()); | 				LOGGER.trace(sql); | ||||||
| 				sql.execute(); | 				sql.execute(); | ||||||
| 			} else { | 			} else { | ||||||
| 				UpdateConditionStep<TCampRecord> sql = DSL.using(t) | 				UpdateConditionStep<TCampRecord> sql = DSL.using(t) | ||||||
| @@ -488,7 +488,7 @@ public class AdminRepository { | |||||||
| 					.set(T_CAMP.START_BOOKING, startBooking) | 					.set(T_CAMP.START_BOOKING, startBooking) | ||||||
| 					.where(T_CAMP.PK.eq(bean.getPk())); | 					.where(T_CAMP.PK.eq(bean.getPk())); | ||||||
| 				// @formatter:on | 				// @formatter:on | ||||||
| 				LOGGER.debug(sql.toString()); | 				LOGGER.trace(sql); | ||||||
| 				sql.execute(); | 				sql.execute(); | ||||||
| 			} | 			} | ||||||
| 		}); | 		}); | ||||||
| @@ -502,7 +502,7 @@ public class AdminRepository { | |||||||
| 	 */ | 	 */ | ||||||
| 	public List<ProfileBean> getProfiles() { | 	public List<ProfileBean> getProfiles() { | ||||||
| 		SelectWhereStep<TProfileRecord> sql = jooq.selectFrom(T_PROFILE); | 		SelectWhereStep<TProfileRecord> sql = jooq.selectFrom(T_PROFILE); | ||||||
| 		LOGGER.debug(sql.toString()); | 		LOGGER.trace(sql); | ||||||
| 		List<ProfileBean> list = new ArrayList<>(); | 		List<ProfileBean> list = new ArrayList<>(); | ||||||
| 		for (TProfileRecord r : sql.fetch()) { | 		for (TProfileRecord r : sql.fetch()) { | ||||||
| 			list.add(ProfileBean.of(r)); | 			list.add(ProfileBean.of(r)); | ||||||
| @@ -542,7 +542,7 @@ public class AdminRepository { | |||||||
| 			.where(T_CAMPPROFILE.MODULE.eq(module)) | 			.where(T_CAMPPROFILE.MODULE.eq(module)) | ||||||
| 			.orderBy(T_CAMP.ARRIVE, T_PROFILE.PK); | 			.orderBy(T_CAMP.ARRIVE, T_PROFILE.PK); | ||||||
| 		// @formatter:on | 		// @formatter:on | ||||||
| 		LOGGER.debug(sql.toString()); | 		LOGGER.trace(sql); | ||||||
| 		PrivilegesContainerBean pcb = new PrivilegesContainerBean(); | 		PrivilegesContainerBean pcb = new PrivilegesContainerBean(); | ||||||
| 		Iterator<Record4<Integer, String, LocalDateTime, String>> i = sql.fetch().iterator(); | 		Iterator<Record4<Integer, String, LocalDateTime, String>> i = sql.fetch().iterator(); | ||||||
| 		while (i.hasNext()) { | 		while (i.hasNext()) { | ||||||
| @@ -579,7 +579,7 @@ public class AdminRepository { | |||||||
| 			.where(T_CAMPPROFILE.FK_PROFILE.eq(user)) | 			.where(T_CAMPPROFILE.FK_PROFILE.eq(user)) | ||||||
| 			.orderBy(T_CAMP.ARRIVE); | 			.orderBy(T_CAMP.ARRIVE); | ||||||
| 		// @formatter:on | 		// @formatter:on | ||||||
| 		LOGGER.debug(sql.toString()); | 		LOGGER.trace(sql); | ||||||
| 		PrivilegesContainerBean pcb = new PrivilegesContainerBean(); | 		PrivilegesContainerBean pcb = new PrivilegesContainerBean(); | ||||||
| 		Iterator<Record4<Integer, String, LocalDateTime, EnumModule>> i = sql.fetch().iterator(); | 		Iterator<Record4<Integer, String, LocalDateTime, EnumModule>> i = sql.fetch().iterator(); | ||||||
| 		while (i.hasNext()) { | 		while (i.hasNext()) { | ||||||
| @@ -618,7 +618,7 @@ public class AdminRepository { | |||||||
| 			.where(T_CAMPPROFILE.FK_CAMP.eq(camp)) | 			.where(T_CAMPPROFILE.FK_CAMP.eq(camp)) | ||||||
| 			.orderBy(T_PROFILE.SURNAME, T_PROFILE.FORENAME); | 			.orderBy(T_PROFILE.SURNAME, T_PROFILE.FORENAME); | ||||||
| 		// @formatter:on | 		// @formatter:on | ||||||
| 		LOGGER.debug(sql.toString()); | 		LOGGER.trace(sql); | ||||||
| 		PrivilegesContainerBean pcb = new PrivilegesContainerBean(); | 		PrivilegesContainerBean pcb = new PrivilegesContainerBean(); | ||||||
| 		Iterator<Record4<Integer, String, String, EnumModule>> i = sql.fetch().iterator(); | 		Iterator<Record4<Integer, String, String, EnumModule>> i = sql.fetch().iterator(); | ||||||
| 		while (i.hasNext()) { | 		while (i.hasNext()) { | ||||||
| @@ -644,7 +644,7 @@ public class AdminRepository { | |||||||
| 	 */ | 	 */ | ||||||
| 	public void deleteFromCampProfile(Integer id) { | 	public void deleteFromCampProfile(Integer id) { | ||||||
| 		DeleteConditionStep<TCampprofileRecord> sql = jooq.deleteFrom(T_CAMPPROFILE).where(T_CAMPPROFILE.PK.eq(id)); | 		DeleteConditionStep<TCampprofileRecord> sql = jooq.deleteFrom(T_CAMPPROFILE).where(T_CAMPPROFILE.PK.eq(id)); | ||||||
| 		LOGGER.debug(sql.toString()); | 		LOGGER.trace(sql); | ||||||
| 		sql.execute(); | 		sql.execute(); | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| @@ -668,7 +668,7 @@ public class AdminRepository { | |||||||
| 				  T_CAMPPROFILE.MODULE) | 				  T_CAMPPROFILE.MODULE) | ||||||
| 			.doNothing(); | 			.doNothing(); | ||||||
| 		// @formatter:on | 		// @formatter:on | ||||||
| 		LOGGER.debug(sql.toString()); | 		LOGGER.trace(sql); | ||||||
| 		sql.execute(); | 		sql.execute(); | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
|   | |||||||
| @@ -1,8 +1,8 @@ | |||||||
| package de.jottyfan.camporganizer.module.business.bookings; | 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_PERSON; | ||||||
| import static de.jottyfan.camporganizer.db.jooq.Tables.T_PROFILE; | 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 static de.jottyfan.camporganizer.db.jooq.Tables.V_CAMP; | ||||||
|  |  | ||||||
| import java.math.BigDecimal; | 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.EnumConverter; | ||||||
| import de.jottyfan.camporganizer.db.jooq.enums.EnumCamprole; | import de.jottyfan.camporganizer.db.jooq.enums.EnumCamprole; | ||||||
| import de.jottyfan.camporganizer.db.jooq.enums.EnumModule; | 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.enums.EnumSex; | ||||||
| import de.jottyfan.camporganizer.db.jooq.tables.records.TPersonRecord; | import de.jottyfan.camporganizer.db.jooq.tables.records.TPersonRecord; | ||||||
| import de.jottyfan.camporganizer.module.business.bookings.model.BookerBean; | 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 | 	 * @return a list of bookings; an empty one at least | ||||||
| 	 */ | 	 */ | ||||||
| 	public List<BookerBean> getBookings(String username) { | 	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 | 		// @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) | 		  .from(T_PERSON) | ||||||
| 		  .leftJoin(V_CAMP).on(V_CAMP.PK.eq(T_PERSON.FK_CAMP)) | 		  .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)) | 			.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)) | 		  .where(T_PROFILE.USERNAME.eq(username)) | ||||||
| 		  .orderBy(T_PERSON.CAMPROLE, T_PERSON.SEX, T_PERSON.SURNAME, T_PERSON.FORENAME); | 		  .orderBy(T_PERSON.CAMPROLE, T_PERSON.SEX, T_PERSON.SURNAME, T_PERSON.FORENAME); | ||||||
| 		// @formatter:on | 		// @formatter:on | ||||||
| 		LOGGER.debug(sql.toString()); | 		LOGGER.trace(sql); | ||||||
| 		List<BookerBean> list = new ArrayList<>(); | 		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()) { | 		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 forename = r.get(T_PERSON.FORENAME); | ||||||
| 			String surname = r.get(T_PERSON.SURNAME); | 			String surname = r.get(T_PERSON.SURNAME); | ||||||
| 			EnumCamprole role = r.get(T_PERSON.CAMPROLE); | 			EnumCamprole role = r.get(T_PERSON.CAMPROLE); | ||||||
| 			EnumSex sex = r.get(T_PERSON.SEX); | 			EnumSex sex = r.get(T_PERSON.SEX); | ||||||
|  | 			EnumProgress progress = r.get(T_PERSON.PROGRESS); | ||||||
| 			String campName = r.get(V_CAMP.NAME); | 			String campName = r.get(V_CAMP.NAME); | ||||||
| 			Double campYear = r.get(V_CAMP.YEAR); | 			Double campYear = r.get(V_CAMP.YEAR); | ||||||
| 			BookerBean bean = new BookerBean(); | 			BookerBean bean = new BookerBean(); | ||||||
| @@ -79,7 +81,7 @@ public class BookingsRepository { | |||||||
| 			bean.setRole(EnumConverter.role2GermanNames(role)); | 			bean.setRole(EnumConverter.role2GermanNames(role)); | ||||||
| 			bean.setSex(EnumConverter.sex2GermanNames(sex)); | 			bean.setSex(EnumConverter.sex2GermanNames(sex)); | ||||||
| 			bean.setBookingDate(r.get(T_PERSON.CREATED)); | 			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.setPaid(r.get(T_PERSON.PAID)); | ||||||
| 			bean.setCamp(String.format("%s %4.0f", campName, campYear)); | 			bean.setCamp(String.format("%s %4.0f", campName, campYear)); | ||||||
| 			list.add(bean); | 			list.add(bean); | ||||||
| @@ -95,10 +97,10 @@ public class BookingsRepository { | |||||||
| 	 * @return the booker bean or null | 	 * @return the booker bean or null | ||||||
| 	 */ | 	 */ | ||||||
| 	public BookerBean getBooking(Integer id, String username) { | 	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 | 		// @formatter:off | ||||||
| 		  .select(T_PERSON.PK, | 		  .select(T_PERSON.PK, | ||||||
| 		  		    T_PERSON.ACCEPT, | 		  		    T_PERSON.PROGRESS, | ||||||
| 		  		    T_PERSON.PAID, | 		  		    T_PERSON.PAID, | ||||||
| 		  		    T_PERSON.FORENAME, | 		  		    T_PERSON.FORENAME, | ||||||
| 		  		    T_PERSON.SURNAME, | 		  		    T_PERSON.SURNAME, | ||||||
| @@ -117,7 +119,7 @@ public class BookingsRepository { | |||||||
| 		  .where(T_PROFILE.USERNAME.eq(username)) | 		  .where(T_PROFILE.USERNAME.eq(username)) | ||||||
| 		  .and(T_PERSON.PK.eq(id)); | 		  .and(T_PERSON.PK.eq(id)); | ||||||
| 		// @formatter:on | 		// @formatter:on | ||||||
| 		LOGGER.debug(sql.toString()); | 		LOGGER.trace(sql); | ||||||
| 		Record r = sql.fetchOne(); | 		Record r = sql.fetchOne(); | ||||||
| 		if (r == null) { | 		if (r == null) { | ||||||
| 			return null; | 			return null; | ||||||
| @@ -126,6 +128,7 @@ public class BookingsRepository { | |||||||
| 			String surname = r.get(T_PERSON.SURNAME); | 			String surname = r.get(T_PERSON.SURNAME); | ||||||
| 			EnumCamprole role = r.get(T_PERSON.CAMPROLE); | 			EnumCamprole role = r.get(T_PERSON.CAMPROLE); | ||||||
| 			EnumSex sex = r.get(T_PERSON.SEX); | 			EnumSex sex = r.get(T_PERSON.SEX); | ||||||
|  | 			EnumProgress progress = r.get(T_PERSON.PROGRESS); | ||||||
| 			BigDecimal requiredPrice = r.get(T_PERSON.REQUIRED_PRICE); | 			BigDecimal requiredPrice = r.get(T_PERSON.REQUIRED_PRICE); | ||||||
| 			String campName = r.get(V_CAMP.NAME); | 			String campName = r.get(V_CAMP.NAME); | ||||||
| 			Double campYear = r.get(V_CAMP.YEAR); | 			Double campYear = r.get(V_CAMP.YEAR); | ||||||
| @@ -136,7 +139,7 @@ public class BookingsRepository { | |||||||
| 			bean.setRole(EnumConverter.role2GermanNames(role)); | 			bean.setRole(EnumConverter.role2GermanNames(role)); | ||||||
| 			bean.setSex(EnumConverter.sex2GermanNames(sex)); | 			bean.setSex(EnumConverter.sex2GermanNames(sex)); | ||||||
| 			bean.setBookingDate(r.get(T_PERSON.CREATED)); | 			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.setPaid(r.get(T_PERSON.PAID)); | ||||||
| 			bean.setCamp(String.format("%s %4.0f", campName, campYear)); | 			bean.setCamp(String.format("%s %4.0f", campName, campYear)); | ||||||
| 			bean.setCampId(campId); | 			bean.setCampId(campId); | ||||||
| @@ -162,7 +165,7 @@ public class BookingsRepository { | |||||||
| 			.set(T_PERSON.PAID, value) | 			.set(T_PERSON.PAID, value) | ||||||
| 			.where(T_PERSON.PK.eq(pk)); | 			.where(T_PERSON.PK.eq(pk)); | ||||||
| 		// @formatter:on | 		// @formatter:on | ||||||
| 		LOGGER.debug(sql.toString()); | 		LOGGER.trace(sql); | ||||||
| 		return sql.execute(); | 		return sql.execute(); | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
|   | |||||||
| @@ -10,13 +10,13 @@ import java.time.LocalDateTime; | |||||||
|  * |  * | ||||||
|  */ |  */ | ||||||
| public class BookerBean implements Serializable { | public class BookerBean implements Serializable { | ||||||
| 	private static final long serialVersionUID = 1L; | 	private static final long serialVersionUID = 2L; | ||||||
|  |  | ||||||
| 	private Integer pk; | 	private Integer pk; | ||||||
| 	private String name; | 	private String name; | ||||||
| 	private String role; | 	private String role; | ||||||
| 	private String sex; | 	private String sex; | ||||||
| 	private Boolean accept; | 	private String progress; | ||||||
| 	private LocalDateTime bookingDate; | 	private LocalDateTime bookingDate; | ||||||
| 	private BigDecimal paid; | 	private BigDecimal paid; | ||||||
| 	private String camp; | 	private String camp; | ||||||
| @@ -24,20 +24,6 @@ public class BookerBean implements Serializable { | |||||||
| 	private Integer campId; | 	private Integer campId; | ||||||
| 	private BigDecimal requiredPrice; | 	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 | 	 * @return the paid | ||||||
| 	 */ | 	 */ | ||||||
| @@ -141,4 +127,18 @@ public class BookerBean implements Serializable { | |||||||
| 	public void setRequiredPrice(BigDecimal requiredPrice) { | 	public void setRequiredPrice(BigDecimal requiredPrice) { | ||||||
| 		this.requiredPrice = 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)) | 			.where(T_PROFILE.USERNAME.eq(username)) | ||||||
| 			.orderBy(T_CAMP.ARRIVE); | 			.orderBy(T_CAMP.ARRIVE); | ||||||
| 		// @formatter:on | 		// @formatter:on | ||||||
| 		LOGGER.debug(sql.toString()); | 		LOGGER.trace(sql); | ||||||
| 		List<CampBudgetBean> list = new ArrayList<>(); | 		List<CampBudgetBean> list = new ArrayList<>(); | ||||||
| 		Iterator<Record4<BigDecimal, String, Double, Integer>> i = sql.fetch().iterator(); | 		Iterator<Record4<BigDecimal, String, Double, Integer>> i = sql.fetch().iterator(); | ||||||
| 		while (i.hasNext()) { | 		while (i.hasNext()) { | ||||||
| @@ -105,7 +105,7 @@ public class BusinessRepository { | |||||||
| 			.leftJoin(T_PROFILE).on(T_PROFILE.PK.eq(T_CAMPPROFILE.FK_PROFILE)) | 			.leftJoin(T_PROFILE).on(T_PROFILE.PK.eq(T_CAMPPROFILE.FK_PROFILE)) | ||||||
| 			.where(T_PROFILE.USERNAME.eq(username)); | 			.where(T_PROFILE.USERNAME.eq(username)); | ||||||
| 	  // @formatter:on | 	  // @formatter:on | ||||||
| 		LOGGER.debug(sql.toString()); | 		LOGGER.trace(sql); | ||||||
| 		List<BusinessBean> list = new ArrayList<>(); | 		List<BusinessBean> list = new ArrayList<>(); | ||||||
| 		Iterator<Record9<Integer, String, String, String, String, LocalDateTime, String, BigDecimal, BigDecimal>> i = sql.fetch().iterator(); | 		Iterator<Record9<Integer, String, String, String, String, LocalDateTime, String, BigDecimal, BigDecimal>> i = sql.fetch().iterator(); | ||||||
| 		while (i.hasNext()) { | 		while (i.hasNext()) { | ||||||
| @@ -140,7 +140,7 @@ public class BusinessRepository { | |||||||
| 					.set(T_PERSON.PAID, bean.getPaid()) | 					.set(T_PERSON.PAID, bean.getPaid()) | ||||||
| 					.where(T_PERSON.PK.eq(bean.getFkPerson())); | 					.where(T_PERSON.PK.eq(bean.getFkPerson())); | ||||||
| 				// @formatter:on | 				// @formatter:on | ||||||
| 				LOGGER.debug(sql.toString()); | 				LOGGER.trace(sql); | ||||||
| 				count += sql.execute(); | 				count += sql.execute(); | ||||||
| 			} | 			} | ||||||
| 		} | 		} | ||||||
|   | |||||||
| @@ -25,6 +25,7 @@ import org.springframework.transaction.annotation.Transactional; | |||||||
| import de.jottyfan.camporganizer.db.EnumConverter; | import de.jottyfan.camporganizer.db.EnumConverter; | ||||||
| import de.jottyfan.camporganizer.db.jooq.enums.EnumCamprole; | import de.jottyfan.camporganizer.db.jooq.enums.EnumCamprole; | ||||||
| import de.jottyfan.camporganizer.db.jooq.enums.EnumModule; | 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.enums.EnumSex; | ||||||
| import de.jottyfan.camporganizer.module.business.camp.model.CampBean; | import de.jottyfan.camporganizer.module.business.camp.model.CampBean; | ||||||
| import de.jottyfan.camporganizer.module.business.camp.model.PersonBean; | import de.jottyfan.camporganizer.module.business.camp.model.PersonBean; | ||||||
| @@ -60,7 +61,7 @@ public class CampRepository { | |||||||
| 			.where(V_CAMP.PK.eq(pk)) | 			.where(V_CAMP.PK.eq(pk)) | ||||||
| 			.and(T_PROFILE.USERNAME.eq(username)); | 			.and(T_PROFILE.USERNAME.eq(username)); | ||||||
| 		// @formatter:on | 		// @formatter:on | ||||||
| 		LOGGER.debug(sql.toString()); | 		LOGGER.trace(sql); | ||||||
| 		CampBean bean = new CampBean(); | 		CampBean bean = new CampBean(); | ||||||
| 		Iterator<Record6<String, Double, LocalDateTime, LocalDateTime, String, String>> i = sql.fetch().iterator(); | 		Iterator<Record6<String, Double, LocalDateTime, LocalDateTime, String, String>> i = sql.fetch().iterator(); | ||||||
| 		while (i.hasNext()) { | 		while (i.hasNext()) { | ||||||
| @@ -84,9 +85,9 @@ public class CampRepository { | |||||||
| 	 * @return a list of bookings; an empty one at least | 	 * @return a list of bookings; an empty one at least | ||||||
| 	 */ | 	 */ | ||||||
| 	public List<PersonBean> getBookings(Integer pk, String username) { | 	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 | 		// @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) | 		  .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_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)) | 			.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)) | 		  .and(T_PROFILE.USERNAME.eq(username)) | ||||||
| 		  .orderBy(T_PERSON.CAMPROLE, T_PERSON.SEX, T_PERSON.SURNAME, T_PERSON.FORENAME); | 		  .orderBy(T_PERSON.CAMPROLE, T_PERSON.SEX, T_PERSON.SURNAME, T_PERSON.FORENAME); | ||||||
| 		// @formatter:on | 		// @formatter:on | ||||||
| 		LOGGER.debug(sql.toString()); | 		LOGGER.trace(sql); | ||||||
| 		List<PersonBean> list = new ArrayList<>(); | 		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()) { | 		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 forename = r.get(T_PERSON.FORENAME); | ||||||
| 			String surname = r.get(T_PERSON.SURNAME); | 			String surname = r.get(T_PERSON.SURNAME); | ||||||
| 			EnumCamprole role = r.get(T_PERSON.CAMPROLE); | 			EnumCamprole role = r.get(T_PERSON.CAMPROLE); | ||||||
| 			EnumSex sex = r.get(T_PERSON.SEX); | 			EnumSex sex = r.get(T_PERSON.SEX); | ||||||
|  | 			EnumProgress progress = r.get(T_PERSON.PROGRESS); | ||||||
| 			PersonBean bean = new PersonBean(); | 			PersonBean bean = new PersonBean(); | ||||||
| 			bean.setPk(r.get(T_PERSON.PK)); | 			bean.setPk(r.get(T_PERSON.PK)); | ||||||
| 			bean.setName(String.format("%s %s", forename, surname)); | 			bean.setName(String.format("%s %s", forename, surname)); | ||||||
| 			bean.setRole(EnumConverter.role2GermanNames(role)); | 			bean.setRole(EnumConverter.role2GermanNames(role)); | ||||||
| 			bean.setSex(EnumConverter.sex2GermanNames(sex)); | 			bean.setSex(EnumConverter.sex2GermanNames(sex)); | ||||||
| 			bean.setBookingDate(r.get(T_PERSON.CREATED)); | 			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.setPaid(r.get(T_PERSON.PAID)); | ||||||
| 			list.add(bean); | 			list.add(bean); | ||||||
| 		} | 		} | ||||||
|   | |||||||
| @@ -6,6 +6,7 @@ import java.util.List; | |||||||
| import org.springframework.beans.factory.annotation.Autowired; | import org.springframework.beans.factory.annotation.Autowired; | ||||||
| import org.springframework.stereotype.Service; | 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.BookingBean; | ||||||
| import de.jottyfan.camporganizer.module.business.camp.model.CampBean; | import de.jottyfan.camporganizer.module.business.camp.model.CampBean; | ||||||
| import de.jottyfan.camporganizer.module.business.camp.model.PersonBean; | import de.jottyfan.camporganizer.module.business.camp.model.PersonBean; | ||||||
| @@ -31,12 +32,12 @@ public class CampService { | |||||||
| 		Integer rejected = 0; | 		Integer rejected = 0; | ||||||
| 		BigDecimal paid = new BigDecimal(0); | 		BigDecimal paid = new BigDecimal(0); | ||||||
| 		for (PersonBean p : campGateway.getBookings(id, username)) { | 		for (PersonBean p : campGateway.getBookings(id, username)) { | ||||||
| 			Boolean acceptence = p.getAccept(); | 			String progress = p.getProgress(); | ||||||
| 			if (acceptence == null) { | 			if (EnumProgress.requested.getLiteral().equals(progress)) { | ||||||
| 				open += 1; | 				open += 1; | ||||||
| 			} else if (acceptence) { | 			} else if (EnumProgress.approved.getLiteral().equals(progress)) { | ||||||
| 				approved += 1; | 				approved += 1; | ||||||
| 			} else { | 			} else if (EnumProgress.rejected.getLiteral().equals(progress)) { | ||||||
| 				rejected += 1; | 				rejected += 1; | ||||||
| 			} | 			} | ||||||
| 			paid = paid.add(p.getPaid() == null ? new BigDecimal(0) : p.getPaid()); | 			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 name; | ||||||
| 	private String role; | 	private String role; | ||||||
| 	private String sex; | 	private String sex; | ||||||
| 	private Boolean accept; | 	private String progress; | ||||||
| 	private LocalDateTime bookingDate; | 	private LocalDateTime bookingDate; | ||||||
| 	private BigDecimal paid; | 	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 | 	 * @return the paid | ||||||
| 	 */ | 	 */ | ||||||
| @@ -99,4 +85,18 @@ public class PersonBean implements Serializable { | |||||||
| 	public void setBookingDate(LocalDateTime bookingDate) { | 	public void setBookingDate(LocalDateTime bookingDate) { | ||||||
| 		this.bookingDate = 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; | ||||||
|  | 	} | ||||||
| } | } | ||||||
|   | |||||||
| @@ -50,7 +50,7 @@ public class BusinessPrivilegesRepository { | |||||||
| 			.leftJoin(T_PROFILE).on(T_PROFILE.PK.eq(T_CAMPPROFILE.FK_PROFILE)) | 			.leftJoin(T_PROFILE).on(T_PROFILE.PK.eq(T_CAMPPROFILE.FK_PROFILE)) | ||||||
| 			.orderBy(V_CAMP.ARRIVE, T_PROFILE.SURNAME, T_PROFILE.FORENAME); | 			.orderBy(V_CAMP.ARRIVE, T_PROFILE.SURNAME, T_PROFILE.FORENAME); | ||||||
| 		// @formatter:on | 		// @formatter:on | ||||||
| 		LOGGER.debug(sql.toString()); | 		LOGGER.trace(sql); | ||||||
| 		List<BusinessPrivilegesBean> list = new ArrayList<>(); | 		List<BusinessPrivilegesBean> list = new ArrayList<>(); | ||||||
| 		for (Record8<String, String, LocalDateTime, String, Integer, Integer, String, Double> r : sql.fetch()) { | 		for (Record8<String, String, LocalDateTime, String, Integer, Integer, String, Double> r : sql.fetch()) { | ||||||
| 			BusinessPrivilegesBean bean = new BusinessPrivilegesBean(); | 			BusinessPrivilegesBean bean = new BusinessPrivilegesBean(); | ||||||
| @@ -80,7 +80,7 @@ public class BusinessPrivilegesRepository { | |||||||
| 			.where((allowed == null || allowed.size() < 1) ? DSL.trueCondition() : T_PERSON.CAMPROLE.in(allowed)) | 			.where((allowed == null || allowed.size() < 1) ? DSL.trueCondition() : T_PERSON.CAMPROLE.in(allowed)) | ||||||
| 			.orderBy(T_PROFILE.SURNAME, T_PROFILE.FORENAME, T_PROFILE.DUEDATE); | 			.orderBy(T_PROFILE.SURNAME, T_PROFILE.FORENAME, T_PROFILE.DUEDATE); | ||||||
| 		// @formatter:on | 		// @formatter:on | ||||||
| 		LOGGER.debug(sql.toString()); | 		LOGGER.trace(sql); | ||||||
| 		List<ProfileBean> list = new ArrayList<>(); | 		List<ProfileBean> list = new ArrayList<>(); | ||||||
| 		for (Record5<Integer, String, String, LocalDateTime, String> r : sql.fetch()) { | 		for (Record5<Integer, String, String, LocalDateTime, String> r : sql.fetch()) { | ||||||
| 			ProfileBean bean = new ProfileBean(); | 			ProfileBean bean = new ProfileBean(); | ||||||
| @@ -102,7 +102,7 @@ public class BusinessPrivilegesRepository { | |||||||
| 			.onConflict(T_CAMPPROFILE.FK_CAMP, T_CAMPPROFILE.FK_PROFILE, T_CAMPPROFILE.MODULE) | 			.onConflict(T_CAMPPROFILE.FK_CAMP, T_CAMPPROFILE.FK_PROFILE, T_CAMPPROFILE.MODULE) | ||||||
| 			.doNothing(); | 			.doNothing(); | ||||||
| 		// @formatter:on | 		// @formatter:on | ||||||
| 		LOGGER.debug(sql.toString()); | 		LOGGER.trace(sql); | ||||||
| 		return sql.execute(); | 		return sql.execute(); | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| @@ -118,7 +118,7 @@ public class BusinessPrivilegesRepository { | |||||||
| 				.from(T_PROFILE) | 				.from(T_PROFILE) | ||||||
| 				.where(T_PROFILE.USERNAME.eq(currentUser)))); | 				.where(T_PROFILE.USERNAME.eq(currentUser)))); | ||||||
| 		// @formatter:on | 		// @formatter:on | ||||||
| 		LOGGER.debug(sql.toString()); | 		LOGGER.trace(sql); | ||||||
| 		return sql.execute(); | 		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.EnumCamprole; | ||||||
| import de.jottyfan.camporganizer.db.jooq.enums.EnumDocument; | 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.TProfile; | ||||||
| import de.jottyfan.camporganizer.db.jooq.tables.records.VCampRecord; | import de.jottyfan.camporganizer.db.jooq.tables.records.VCampRecord; | ||||||
| import de.jottyfan.camporganizer.module.camplist.model.BookingBean; | import de.jottyfan.camporganizer.module.camplist.model.BookingBean; | ||||||
| @@ -54,7 +55,7 @@ public class CamplistRepository { | |||||||
|  |  | ||||||
| 	public Stream<VCampRecord> getAllCamps(Condition condition) { | 	public Stream<VCampRecord> getAllCamps(Condition condition) { | ||||||
| 		SelectSeekStep1<VCampRecord, LocalDateTime> sql = jooq.selectFrom(V_CAMP).where(condition).orderBy(V_CAMP.ARRIVE); | 		SelectSeekStep1<VCampRecord, LocalDateTime> sql = jooq.selectFrom(V_CAMP).where(condition).orderBy(V_CAMP.ARRIVE); | ||||||
| 		LOGGER.debug(sql.toString()); | 		LOGGER.trace(sql); | ||||||
| 		return sql.fetchStream(); | 		return sql.fetchStream(); | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| @@ -76,7 +77,7 @@ public class CamplistRepository { | |||||||
| 					    T_PERSON.CREATED, | 					    T_PERSON.CREATED, | ||||||
| 					    T_PERSON.EMAIL, | 					    T_PERSON.EMAIL, | ||||||
| 					    T_PERSON.SEX, | 					    T_PERSON.SEX, | ||||||
| 					    T_PERSON.ACCEPT, | 					    T_PERSON.PROGRESS, | ||||||
| 					    T_PERSON.FK_CAMP, | 					    T_PERSON.FK_CAMP, | ||||||
| 					    T_PROFILE.FORENAME, | 					    T_PROFILE.FORENAME, | ||||||
| 					    T_PROFILE.SURNAME, | 					    T_PROFILE.SURNAME, | ||||||
| @@ -99,13 +100,15 @@ public class CamplistRepository { | |||||||
| 			.and(T_PERSON.PK.isNotNull()) | 			.and(T_PERSON.PK.isNotNull()) | ||||||
| 			.orderBy(V_CAMP.ARRIVE.desc(), T_PERSON.CREATED); | 			.orderBy(V_CAMP.ARRIVE.desc(), T_PERSON.CREATED); | ||||||
| 		// @formatter:on | 		// @formatter:on | ||||||
| 		LOGGER.debug(sql.toString()); | 		LOGGER.trace(sql); | ||||||
| 		List<BookingBean> list = new ArrayList<>(); | 		List<BookingBean> list = new ArrayList<>(); | ||||||
| 		Iterator<Record> i = sql.fetch().iterator(); | 		Iterator<Record> i = sql.fetch().iterator(); | ||||||
| 		while (i.hasNext()) { | 		while (i.hasNext()) { | ||||||
| 			Record r = i.next(); | 			Record r = i.next(); | ||||||
| 			Integer fkCamp = r.get(T_PERSON.FK_CAMP); | 			Integer fkCamp = r.get(T_PERSON.FK_CAMP); | ||||||
| 			BookingBean bean = new BookingBean(); | 			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.setPk(r.get(T_PERSON.PK)); | ||||||
| 			bean.setForename(r.get(T_PERSON.FORENAME)); | 			bean.setForename(r.get(T_PERSON.FORENAME)); | ||||||
| 			bean.setSurname(r.get(T_PERSON.SURNAME)); | 			bean.setSurname(r.get(T_PERSON.SURNAME)); | ||||||
| @@ -129,7 +132,6 @@ public class CamplistRepository { | |||||||
| 			bean.setUrl(r.get(V_CAMP.URL)); | 			bean.setUrl(r.get(V_CAMP.URL)); | ||||||
| 			bean.setIsOver(r.get(V_CAMP.IS_OVER)); | 			bean.setIsOver(r.get(V_CAMP.IS_OVER)); | ||||||
| 			bean.setCampName(r.get(V_CAMP.NAME)); | 			bean.setCampName(r.get(V_CAMP.NAME)); | ||||||
| 			bean.setAccept(r.get(T_PERSON.ACCEPT)); |  | ||||||
| 			StringBuilder buf = new StringBuilder(); | 			StringBuilder buf = new StringBuilder(); | ||||||
| 			String forename = r.get(REGISTRATOR.FORENAME); | 			String forename = r.get(REGISTRATOR.FORENAME); | ||||||
| 			String surname = r.get(REGISTRATOR.SURNAME); | 			String surname = r.get(REGISTRATOR.SURNAME); | ||||||
| @@ -185,7 +187,7 @@ public class CamplistRepository { | |||||||
| 				.from(T_DOCUMENT) | 				.from(T_DOCUMENT) | ||||||
| 				.where(T_DOCUMENT.DOCTYPE.eq(EnumDocument.camppass))); | 				.where(T_DOCUMENT.DOCTYPE.eq(EnumDocument.camppass))); | ||||||
| 		// @formatter:on | 		// @formatter:on | ||||||
| 		LOGGER.debug(sql.toString()); | 		LOGGER.trace(sql); | ||||||
| 		Map<Integer, String> map = new HashMap<>(); // no duplicate on using a map | 		Map<Integer, String> map = new HashMap<>(); // no duplicate on using a map | ||||||
| 		Iterator<Record2<String, Integer>> i = sql.fetch().iterator(); | 		Iterator<Record2<String, Integer>> i = sql.fetch().iterator(); | ||||||
| 		while (i.hasNext()) { | 		while (i.hasNext()) { | ||||||
|   | |||||||
| @@ -41,7 +41,7 @@ public class BookingBean implements Serializable { | |||||||
| 	private Boolean isOver; | 	private Boolean isOver; | ||||||
| 	private String campName; | 	private String campName; | ||||||
| 	private String registrator; | 	private String registrator; | ||||||
| 	private Boolean accept; | 	private String progress; | ||||||
| 	private String subscriber; | 	private String subscriber; | ||||||
|  |  | ||||||
| 	private List<DocumentBean> documents; | 	private List<DocumentBean> documents; | ||||||
| @@ -396,14 +396,6 @@ public class BookingBean implements Serializable { | |||||||
| 		this.registrator = registrator; | 		this.registrator = registrator; | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	public Boolean getAccept() { |  | ||||||
| 		return accept; |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	public void setAccept(Boolean accept) { |  | ||||||
| 		this.accept = accept; |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	public String getSubscriber() { | 	public String getSubscriber() { | ||||||
| 		return subscriber; | 		return subscriber; | ||||||
| 	} | 	} | ||||||
| @@ -416,4 +408,18 @@ public class BookingBean implements Serializable { | |||||||
| 		return documents; | 		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 org.springframework.stereotype.Repository; | ||||||
|  |  | ||||||
| import de.jottyfan.camporganizer.db.jooq.enums.EnumModule; | 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.enums.EnumSex; | ||||||
| import de.jottyfan.camporganizer.module.confirmation.board.model.CampBean; | import de.jottyfan.camporganizer.module.confirmation.board.model.CampBean; | ||||||
| import de.jottyfan.camporganizer.module.confirmation.board.model.PersonBean; | import de.jottyfan.camporganizer.module.confirmation.board.model.PersonBean; | ||||||
| @@ -93,7 +94,8 @@ public class ConfirmationBoardRepository { | |||||||
| 		while (i.hasNext()) { | 		while (i.hasNext()) { | ||||||
| 			Record r = i.next(); | 			Record r = i.next(); | ||||||
| 			PersonBean bean = new PersonBean(); | 			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.setBirthDate(r.get(T_PERSON.BIRTHDATE)); | ||||||
| 			bean.setCamprole(r.get(T_PERSON.CAMPROLE) == null ? null : r.get(T_PERSON.CAMPROLE).getLiteral()); | 			bean.setCamprole(r.get(T_PERSON.CAMPROLE) == null ? null : r.get(T_PERSON.CAMPROLE).getLiteral()); | ||||||
| 			bean.setCity(r.get(T_PERSON.CITY)); | 			bean.setCity(r.get(T_PERSON.CITY)); | ||||||
|   | |||||||
| @@ -61,7 +61,7 @@ public class List2CSVService { | |||||||
| 			append(buf, bean.getSex()); | 			append(buf, bean.getSex()); | ||||||
| 			append(buf, bean.getCamprolle()); | 			append(buf, bean.getCamprolle()); | ||||||
| 			append(buf, bean.getBirthDate()); | 			append(buf, bean.getBirthDate()); | ||||||
| 			append(buf, bean.getAccept()); | 			append(buf, bean.getProgress()); | ||||||
| 			append(buf, bean.getCreated()); | 			append(buf, bean.getCreated()); | ||||||
| 			append(buf, bean.getConsentCatalogPhoto()); | 			append(buf, bean.getConsentCatalogPhoto()); | ||||||
| 			append(buf, bean.getComment()); | 			append(buf, bean.getComment()); | ||||||
|   | |||||||
| @@ -22,7 +22,7 @@ public class PersonBean implements Serializable { | |||||||
| 	private String email; | 	private String email; | ||||||
| 	private LocalDate birthDate; | 	private LocalDate birthDate; | ||||||
| 	private String camprole; | 	private String camprole; | ||||||
| 	private Boolean accept; | 	private String progress; | ||||||
| 	private LocalDateTime created; | 	private LocalDateTime created; | ||||||
| 	private String sex; | 	private String sex; | ||||||
| 	private Double paid; | 	private Double paid; | ||||||
| @@ -181,20 +181,6 @@ public class PersonBean implements Serializable { | |||||||
| 		this.camprole = camprole; | 		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 | 	 * @return the created | ||||||
| 	 */ | 	 */ | ||||||
| @@ -264,4 +250,18 @@ public class PersonBean implements Serializable { | |||||||
| 	public void setConsentCatalogPhoto(Boolean consentCatalogPhoto) { | 	public void setConsentCatalogPhoto(Boolean consentCatalogPhoto) { | ||||||
| 		this.consentCatalogPhoto = 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.stereotype.Controller; | ||||||
| import org.springframework.ui.Model; | import org.springframework.ui.Model; | ||||||
| import org.springframework.web.bind.annotation.GetMapping; | 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.camplist.CommonController; | ||||||
| import de.jottyfan.camporganizer.module.confirmation.confirmation.model.CampOverviewBean; | 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 { | public class ConfirmationController extends CommonController { | ||||||
|  |  | ||||||
| 	@Autowired | 	@Autowired | ||||||
| 	private ConfirmationService indexService; | 	private ConfirmationService service; | ||||||
|  |  | ||||||
| 	@GetMapping("/confirmation") | 	@GetMapping("/confirmation") | ||||||
| 	public String getIndex(Model model) { | 	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"); | 		CampOverviewBean campoverviewsummary = new CampOverviewBean(LocalDate.now(), "summary"); | ||||||
| 		for (CampOverviewBean bean : campoverview) { | 		for (CampOverviewBean bean : campoverview) { | ||||||
| 			campoverviewsummary.setApproved(bean.getApproved() + campoverviewsummary.getApproved()); | 			campoverviewsummary.setApproved(bean.getApproved() + campoverviewsummary.getApproved()); | ||||||
| 			campoverviewsummary.setRejected(bean.getRejected() + campoverviewsummary.getRejected()); | 			campoverviewsummary.setRejected(bean.getRejected() + campoverviewsummary.getRejected()); | ||||||
| 			campoverviewsummary.setUntouched(bean.getUntouched() + campoverviewsummary.getUntouched()); | 			campoverviewsummary.setUntouched(bean.getUntouched() + campoverviewsummary.getUntouched()); | ||||||
|  | 			campoverviewsummary.setRevoked(bean.getRevoked() + campoverviewsummary.getRevoked()); | ||||||
| 		} | 		} | ||||||
| 		model.addAttribute("campoverview", campoverview); | 		model.addAttribute("campoverview", campoverview); | ||||||
| 		model.addAttribute("campoverviewsummary", campoverviewsummary); | 		model.addAttribute("campoverviewsummary", campoverviewsummary); | ||||||
| 		model.addAttribute("untouched", indexService.getUntouched(super.getCurrentUser())); | 		model.addAttribute("untouched", service.getUntouched(super.getCurrentUser())); | ||||||
| 		model.addAttribute("approved", indexService.getApproved(super.getCurrentUser())); | 		model.addAttribute("approved", service.getApproved(super.getCurrentUser())); | ||||||
| 		model.addAttribute("rejected", indexService.getRejected(super.getCurrentUser())); | 		model.addAttribute("rejected", service.getRejected(super.getCurrentUser())); | ||||||
|  | 		model.addAttribute("revoked", service.getRevoked(super.getCurrentUser())); | ||||||
| 		return "confirmation/confirmation"; | 		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_CAMP; | ||||||
| import static de.jottyfan.camporganizer.db.jooq.Tables.T_CAMPPROFILE; | 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_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_PROFILE; | ||||||
|  | import static de.jottyfan.camporganizer.db.jooq.Tables.T_RSS; | ||||||
| import static de.jottyfan.camporganizer.db.jooq.Tables.V_CAMP; | import static de.jottyfan.camporganizer.db.jooq.Tables.V_CAMP; | ||||||
|  |  | ||||||
| import java.time.LocalDateTime; | import java.time.LocalDateTime; | ||||||
|  | import java.time.format.DateTimeFormatter; | ||||||
| import java.util.ArrayList; | import java.util.ArrayList; | ||||||
| import java.util.Collections; | import java.util.Collections; | ||||||
| import java.util.HashMap; | import java.util.HashMap; | ||||||
| @@ -18,12 +21,17 @@ import org.apache.logging.log4j.LogManager; | |||||||
| import org.apache.logging.log4j.Logger; | import org.apache.logging.log4j.Logger; | ||||||
| import org.jooq.Condition; | import org.jooq.Condition; | ||||||
| import org.jooq.DSLContext; | import org.jooq.DSLContext; | ||||||
|  | import org.jooq.DeleteConditionStep; | ||||||
|  | import org.jooq.InsertValuesStep2; | ||||||
| import org.jooq.Name; | import org.jooq.Name; | ||||||
| import org.jooq.Record4; | import org.jooq.Record4; | ||||||
|  | import org.jooq.Record5; | ||||||
| import org.jooq.Record7; | import org.jooq.Record7; | ||||||
| import org.jooq.Record8; | import org.jooq.Record8; | ||||||
|  | import org.jooq.SelectConditionStep; | ||||||
| import org.jooq.SelectHavingStep; | import org.jooq.SelectHavingStep; | ||||||
| import org.jooq.SelectSeekStep1; | import org.jooq.SelectSeekStep1; | ||||||
|  | import org.jooq.exception.DataAccessException; | ||||||
| import org.jooq.impl.DSL; | import org.jooq.impl.DSL; | ||||||
| import org.springframework.beans.factory.annotation.Autowired; | import org.springframework.beans.factory.annotation.Autowired; | ||||||
| import org.springframework.stereotype.Repository; | 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.EnumCamprole; | ||||||
| import de.jottyfan.camporganizer.db.jooq.enums.EnumModule; | 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.BookingBean; | ||||||
| import de.jottyfan.camporganizer.module.confirmation.confirmation.model.CampOverviewBean; | import de.jottyfan.camporganizer.module.confirmation.confirmation.model.CampOverviewBean; | ||||||
|  |  | ||||||
| @@ -55,10 +68,10 @@ public class ConfirmationRepository { | |||||||
| 	 */ | 	 */ | ||||||
| 	public List<CampOverviewBean> getCampOverviewBeans(String currentUser) { | 	public List<CampOverviewBean> getCampOverviewBeans(String currentUser) { | ||||||
| 		Name COUNT = DSL.name("count"); | 		Name COUNT = DSL.name("count"); | ||||||
| 		SelectHavingStep<Record4<Integer, Boolean, String, LocalDateTime>> sql = jooq | 		SelectHavingStep<Record4<Integer, EnumProgress, String, LocalDateTime>> sql = jooq | ||||||
| 		// @formatter:off | 		// @formatter:off | ||||||
| 			.select(DSL.count(T_PERSON.PK).as(COUNT), | 			.select(DSL.count(T_PERSON.PK).as(COUNT), | ||||||
| 					    T_PERSON.ACCEPT, | 					    T_PERSON.PROGRESS, | ||||||
| 					    T_CAMP.NAME, | 					    T_CAMP.NAME, | ||||||
| 					    T_CAMP.ARRIVE) | 					    T_CAMP.ARRIVE) | ||||||
| 			.from(T_PERSON) | 			.from(T_PERSON) | ||||||
| @@ -68,15 +81,15 @@ public class ConfirmationRepository { | |||||||
| 			.where(T_CAMP.ARRIVE.isNotNull()) | 			.where(T_CAMP.ARRIVE.isNotNull()) | ||||||
| 			.and(T_CAMPPROFILE.MODULE.eq(EnumModule.registration)) | 			.and(T_CAMPPROFILE.MODULE.eq(EnumModule.registration)) | ||||||
| 			.and(T_PROFILE.USERNAME.eq(currentUser)) | 			.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 | 		// @formatter:on | ||||||
| 		LOGGER.debug(sql.toString()); | 		LOGGER.trace(sql); | ||||||
| 		Map<LocalDateTime, CampOverviewBean> map = new HashMap<>(); | 		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()) { | 		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); | 			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); | 			String campname = r.get(T_CAMP.NAME); | ||||||
| 			LocalDateTime arrive = r.get(T_CAMP.ARRIVE); | 			LocalDateTime arrive = r.get(T_CAMP.ARRIVE); | ||||||
| 			CampOverviewBean bean = map.get(arrive); | 			CampOverviewBean bean = map.get(arrive); | ||||||
| @@ -84,12 +97,14 @@ public class ConfirmationRepository { | |||||||
| 				bean = new CampOverviewBean(arrive.toLocalDate(), campname); | 				bean = new CampOverviewBean(arrive.toLocalDate(), campname); | ||||||
| 				map.put(arrive, bean); | 				map.put(arrive, bean); | ||||||
| 			} | 			} | ||||||
| 			if (accept == null) { | 			if (progress == null || EnumProgress.requested.equals(progress)) { | ||||||
| 				bean.setUntouched(count); | 				bean.setUntouched(count); | ||||||
| 			} else if (accept) { | 			} else if (EnumProgress.approved.equals(progress)) { | ||||||
| 				bean.setApproved(count); | 				bean.setApproved(count); | ||||||
| 			} else { | 			} else if (EnumProgress.rejected.equals(progress)) { | ||||||
| 				bean.setRejected(count); | 				bean.setRejected(count); | ||||||
|  | 			} else if (EnumProgress.revoked.equals(progress)) { | ||||||
|  | 				bean.setRevoked(count); | ||||||
| 			} | 			} | ||||||
| 		} | 		} | ||||||
| 		List<CampOverviewBean> list = new ArrayList<>(map.values()); | 		List<CampOverviewBean> list = new ArrayList<>(map.values()); | ||||||
| @@ -117,7 +132,7 @@ public class ConfirmationRepository { | |||||||
| 			.and(T_PROFILE.USERNAME.eq(currentUser)) | 			.and(T_PROFILE.USERNAME.eq(currentUser)) | ||||||
| 			.orderBy(T_PERSON.CREATED.desc()); | 			.orderBy(T_PERSON.CREATED.desc()); | ||||||
| 		// @formatter:on | 		// @formatter:on | ||||||
| 		LOGGER.debug(sql.toString()); | 		LOGGER.trace(sql); | ||||||
| 		List<BookingBean> list = new ArrayList<>(); | 		List<BookingBean> list = new ArrayList<>(); | ||||||
| 		Iterator<Record7<Integer, String, String, String, LocalDateTime, EnumCamprole, LocalDateTime>> i = sql.fetch().iterator(); | 		Iterator<Record7<Integer, String, String, String, LocalDateTime, EnumCamprole, LocalDateTime>> i = sql.fetch().iterator(); | ||||||
| 		while (i.hasNext()) { | 		while (i.hasNext()) { | ||||||
| @@ -145,7 +160,7 @@ public class ConfirmationRepository { | |||||||
| 	 * @return a list of booking beans; an empty one at least | 	 * @return a list of booking beans; an empty one at least | ||||||
| 	 */ | 	 */ | ||||||
| 	public List<BookingBean> getUntouched(String currentUser) { | 	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 | 	 * @return a list of booking beans; an empty one at least | ||||||
| 	 */ | 	 */ | ||||||
| 	public List<BookingBean> getApproved(String currentUser) { | 	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 | 	 * @return a list of booking beans; an empty one at least | ||||||
| 	 */ | 	 */ | ||||||
| 	public List<BookingBean> getRejected(String currentUser) { | 	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)); | 				.or(V_CAMP.YEAR.cast(String.class).containsIgnoreCase(needle)); | ||||||
| 		// @formatter:on | 		// @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 | 		// @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) | 			.from(T_PERSON) | ||||||
| 			.leftJoin(V_CAMP).on(V_CAMP.PK.eq(T_PERSON.FK_CAMP)) | 			.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)) | 			.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)) | 			.and(T_PROFILE.USERNAME.eq(currentUser)) | ||||||
| 			.orderBy(T_PERSON.CREATED.desc()); | 			.orderBy(T_PERSON.CREATED.desc()); | ||||||
| 		// @formatter:on | 		// @formatter:on | ||||||
| 		LOGGER.debug(sql.toString()); | 		LOGGER.trace(sql); | ||||||
| 		List<BookingBean> list = new ArrayList<>(); | 		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()) { | 		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); | 			Integer pkPerson = r.get(T_PERSON.PK); | ||||||
| 			String forename = r.get(T_PERSON.FORENAME); | 			String forename = r.get(T_PERSON.FORENAME); | ||||||
| 			String surname = r.get(T_PERSON.SURNAME); | 			String surname = r.get(T_PERSON.SURNAME); | ||||||
| 			EnumCamprole role = r.get(T_PERSON.CAMPROLE); | 			EnumCamprole role = r.get(T_PERSON.CAMPROLE); | ||||||
| 			String campname = r.get(V_CAMP.NAME); | 			String campname = r.get(V_CAMP.NAME); | ||||||
| 			Double year = r.get(V_CAMP.YEAR); | 			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)); | 			BookingBean bean = new BookingBean(pkPerson, null, String.format("%s %4.0f", campname, year)); | ||||||
| 			bean.setRole(role == null ? null : role.getLiteral()); | 			bean.setRole(role == null ? null : role.getLiteral()); | ||||||
| 			bean.setFullname(new StringBuilder().append(forename).append(" ").append(surname).toString()); | 			bean.setFullname(new StringBuilder().append(forename).append(" ").append(surname).toString()); | ||||||
| 			bean.setAccept(accept); | 			bean.setProgress(progress == null ? null : progress.getLiteral()); | ||||||
| 			list.add(bean); | 			list.add(bean); | ||||||
| 		} | 		} | ||||||
| 		return list; | 		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.beans.factory.annotation.Autowired; | ||||||
| import org.springframework.stereotype.Service; | 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.BookingBean; | ||||||
| import de.jottyfan.camporganizer.module.confirmation.confirmation.model.CampOverviewBean; | import de.jottyfan.camporganizer.module.confirmation.confirmation.model.CampOverviewBean; | ||||||
|  |  | ||||||
| @@ -16,35 +17,41 @@ import de.jottyfan.camporganizer.module.confirmation.confirmation.model.CampOver | |||||||
| @Service | @Service | ||||||
| public class ConfirmationService { | public class ConfirmationService { | ||||||
| 	@Autowired | 	@Autowired | ||||||
| 	private ConfirmationRepository gateway; | 	private ConfirmationRepository repository; | ||||||
|  |  | ||||||
| 	public List<CampOverviewBean> getCampOverview(String currentUser) { | 	public List<CampOverviewBean> getCampOverview(String currentUser) { | ||||||
| 		return gateway.getCampOverviewBeans(currentUser); | 		return repository.getCampOverviewBeans(currentUser); | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	public List<BookingBean> getUntouched(String currentUser) { | 	public List<BookingBean> getUntouched(String currentUser) { | ||||||
| 		return gateway.getUntouched(currentUser); | 		return repository.getUntouched(currentUser); | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	public List<BookingBean> getApproved(String currentUser) { | 	public List<BookingBean> getApproved(String currentUser) { | ||||||
| 		return gateway.getApproved(currentUser); | 		return repository.getApproved(currentUser); | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	public List<BookingBean> getRejected(String 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) { | 	public String search(String needle, String linkURL, String currentUser) { | ||||||
| 		StringBuilder buf = new StringBuilder( | 		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>"); | 				"<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 = ""; | 			String acceptHtml = ""; | ||||||
| 			if (bean.getAccept() == null) { | 			if (EnumProgress.requested.equals(bean.getProgress())) { | ||||||
| 				acceptHtml = "<i class=\"fas fa-question framed framed-orange\"></i>"; | 				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>"; | 				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>"; | 				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>", | 			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())); | 					acceptHtml, linkURL, bean.getPkPerson(), bean.getFullname(), bean.getCamp(), bean.getRolename())); | ||||||
| @@ -52,4 +59,14 @@ public class ConfirmationService { | |||||||
| 		buf.append("</tbody></table>"); | 		buf.append("</tbody></table>"); | ||||||
| 		return buf.toString(); | 		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 fullname; | ||||||
| 	private String role; | 	private String role; | ||||||
| 	private LocalDateTime registered; | 	private LocalDateTime registered; | ||||||
| 	private Boolean accept; | 	private String progress; | ||||||
|  |  | ||||||
| 	public BookingBean(Integer pkPerson, LocalDate date, String camp) { | 	public BookingBean(Integer pkPerson, LocalDate date, String camp) { | ||||||
| 		this.pkPerson = pkPerson; | 		this.pkPerson = pkPerson; | ||||||
| @@ -114,11 +114,17 @@ public class BookingBean implements Serializable, Comparable<BookingBean> { | |||||||
| 		return pkPerson; | 		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 approved; | ||||||
| 	private Integer rejected; | 	private Integer rejected; | ||||||
| 	private Integer untouched; | 	private Integer untouched; | ||||||
|  | 	private Integer revoked; | ||||||
|  |  | ||||||
| 	public CampOverviewBean(LocalDate date, String camp) { | 	public CampOverviewBean(LocalDate date, String camp) { | ||||||
| 		this.date = date; | 		this.date = date; | ||||||
| @@ -23,6 +24,7 @@ public class CampOverviewBean implements Serializable, Comparable<CampOverviewBe | |||||||
| 		this.approved = 0; | 		this.approved = 0; | ||||||
| 		this.rejected = 0; | 		this.rejected = 0; | ||||||
| 		this.untouched = 0; | 		this.untouched = 0; | ||||||
|  | 		this.revoked = 0; | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	@Override | 	@Override | ||||||
| @@ -85,4 +87,18 @@ public class CampOverviewBean implements Serializable, Comparable<CampOverviewBe | |||||||
| 	public LocalDate getDate() { | 	public LocalDate getDate() { | ||||||
| 		return date; | 		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("camps", personService.getCamps(username)); | ||||||
| 		model.addAttribute("annotations", personService.getAnnotations(pk)); | 		model.addAttribute("annotations", personService.getAnnotations(pk)); | ||||||
| 		model.addAttribute("campPrice", personService.getCampPrice(pk)); | 		model.addAttribute("campPrice", personService.getCampPrice(pk)); | ||||||
|  | 		model.addAttribute("progresses", personService.getProgresses()); | ||||||
| 		return "confirmation/person"; | 		return "confirmation/person"; | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| @@ -43,6 +44,7 @@ public class PersonController extends CommonController { | |||||||
| 			model.addAttribute("camps", personService.getCamps(username)); | 			model.addAttribute("camps", personService.getCamps(username)); | ||||||
| 			model.addAttribute("annotations", personService.getAnnotations(bean.getPk())); | 			model.addAttribute("annotations", personService.getAnnotations(bean.getPk())); | ||||||
| 			model.addAttribute("campPrice", personService.getCampPrice(bean.getPk())); | 			model.addAttribute("campPrice", personService.getCampPrice(bean.getPk())); | ||||||
|  | 			model.addAttribute("progresses", personService.getProgresses()); | ||||||
| 			return "confirmation/person"; | 			return "confirmation/person"; | ||||||
| 		} | 		} | ||||||
| 		personService.updatePerson(bean, username); | 		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.EnumCamprole; | ||||||
| import de.jottyfan.camporganizer.db.jooq.enums.EnumModule; | 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.TProfile; | ||||||
| import de.jottyfan.camporganizer.db.jooq.tables.records.TCampRecord; | import de.jottyfan.camporganizer.db.jooq.tables.records.TCampRecord; | ||||||
| import de.jottyfan.camporganizer.db.jooq.tables.records.TPersonRecord; | import de.jottyfan.camporganizer.db.jooq.tables.records.TPersonRecord; | ||||||
| @@ -78,7 +79,7 @@ public class PersonRepository { | |||||||
| 			.and(T_PROFILE.USERNAME.eq(username)) | 			.and(T_PROFILE.USERNAME.eq(username)) | ||||||
| 			.orderBy(T_CAMP.ARRIVE.desc()); | 			.orderBy(T_CAMP.ARRIVE.desc()); | ||||||
| 		// @formatter:on | 		// @formatter:on | ||||||
| 		LOGGER.debug(sql.toString()); | 		LOGGER.trace(sql); | ||||||
| 		List<CampBean> list = new ArrayList<>(); | 		List<CampBean> list = new ArrayList<>(); | ||||||
| 		Iterator<Record4<Integer, String, LocalDateTime, String>> i = sql.fetch().iterator(); | 		Iterator<Record4<Integer, String, LocalDateTime, String>> i = sql.fetch().iterator(); | ||||||
| 		while (i.hasNext()) { | 		while (i.hasNext()) { | ||||||
| @@ -112,13 +113,14 @@ public class PersonRepository { | |||||||
| 			.and(T_CAMPPROFILE.MODULE.eq(EnumModule.registration)) | 			.and(T_CAMPPROFILE.MODULE.eq(EnumModule.registration)) | ||||||
| 			.and(T_PROFILE.USERNAME.eq(username)); | 			.and(T_PROFILE.USERNAME.eq(username)); | ||||||
| 		// @formatter:on | 		// @formatter:on | ||||||
| 		LOGGER.debug(sql.toString()); | 		LOGGER.trace(sql); | ||||||
| 		Iterator<Record> i = sql.fetch().iterator(); | 		Iterator<Record> i = sql.fetch().iterator(); | ||||||
| 		while (i.hasNext()) { | 		while (i.hasNext()) { | ||||||
| 			Record r = i.next(); | 			Record r = i.next(); | ||||||
| 			PersonBean bean = new PersonBean(); | 			PersonBean bean = new PersonBean(); | ||||||
| 			bean.setPk(pk); | 			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.setBirthdate(r.get(T_PERSON.BIRTHDATE)); | ||||||
| 			bean.setCamprole(r.get(T_PERSON.CAMPROLE)); | 			bean.setCamprole(r.get(T_PERSON.CAMPROLE)); | ||||||
| 			bean.setCity(r.get(T_PERSON.CITY)); | 			bean.setCity(r.get(T_PERSON.CITY)); | ||||||
| @@ -151,21 +153,21 @@ public class PersonRepository { | |||||||
| 		jooq.transaction(t -> { | 		jooq.transaction(t -> { | ||||||
|  |  | ||||||
| 			SelectConditionStep<TProfileRecord> sql0 = jooq.selectFrom(T_PROFILE).where(T_PROFILE.USERNAME.eq(registrator)); | 			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); | 			Integer fkRegistrator = sql0.fetchOne(T_PROFILE.PK); | ||||||
|  |  | ||||||
| 			// get old accept value for comparison | 			// get old accept value for comparison | ||||||
| 			SelectConditionStep<TPersonRecord> sql1 = jooq.selectFrom(T_PERSON).where(T_PERSON.PK.eq(bean.getPk())); | 			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(); | 			TPersonRecord r = sql1.fetchOne(); | ||||||
| 			lrw.putBoolean("acceptOld", r == null ? null : r.getAccept()); | 			lrw.putBoolean("acceptOld", r == null ? null : EnumProgress.approved.equals(r.getProgress())); | ||||||
| 			lrw.putBoolean("acceptNew", bean.getAccept()); | 			lrw.putBoolean("acceptNew", EnumProgress.approved.getLiteral().equals(bean.getProgress())); | ||||||
| 			Integer fkCamp = r == null ? null : r.getFkCamp(); | 			Integer fkCamp = r == null ? null : r.getFkCamp(); | ||||||
| 			String email = r.getEmail(); // use the old one, too | 			String email = r.getEmail(); // use the old one, too | ||||||
| 			lrw.putString("oldEmail", email); | 			lrw.putString("oldEmail", email); | ||||||
|  |  | ||||||
| 			SelectConditionStep<TCampRecord> sql2 = jooq.selectFrom(T_CAMP).where(T_CAMP.PK.eq(fkCamp)); | 			SelectConditionStep<TCampRecord> sql2 = jooq.selectFrom(T_CAMP).where(T_CAMP.PK.eq(fkCamp)); | ||||||
| 			LOGGER.debug(sql2.toString()); | 			LOGGER.trace(sql2); | ||||||
| 			TCampRecord rc = sql2.fetchOne(); | 			TCampRecord rc = sql2.fetchOne(); | ||||||
| 			String campName = rc == null ? null : rc.getName(); | 			String campName = rc == null ? null : rc.getName(); | ||||||
| 			LocalDateTime arrive = rc == null ? null : rc.getArrive(); | 			LocalDateTime arrive = rc == null ? null : rc.getArrive(); | ||||||
| @@ -186,13 +188,13 @@ public class PersonRepository { | |||||||
| 				.set(T_PERSON.PHONE, bean.getPhone()) | 				.set(T_PERSON.PHONE, bean.getPhone()) | ||||||
| 				.set(T_PERSON.EMAIL, bean.getEmail()) | 				.set(T_PERSON.EMAIL, bean.getEmail()) | ||||||
| 				.set(T_PERSON.COMMENT, bean.getComment()) | 				.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.CAMPROLE, bean.getCamprole()) | ||||||
| 				.set(T_PERSON.FK_REGISTRATOR, fkRegistrator) | 				.set(T_PERSON.FK_REGISTRATOR, fkRegistrator) | ||||||
| 				.set(T_PERSON.REQUIRED_PRICE, bean.getRequiredPrice()) | 				.set(T_PERSON.REQUIRED_PRICE, bean.getRequiredPrice()) | ||||||
| 				.where(T_PERSON.PK.eq(bean.getPk())); | 				.where(T_PERSON.PK.eq(bean.getPk())); | ||||||
| 			// @formatter:on | 			// @formatter:on | ||||||
| 			LOGGER.debug(sql3.toString()); | 			LOGGER.trace(sql3); | ||||||
| 			lrw.add(sql3.execute()); | 			lrw.add(sql3.execute()); | ||||||
|  |  | ||||||
| 			// always | 			// always | ||||||
| @@ -208,7 +210,7 @@ public class PersonRepository { | |||||||
| 				            T_RSS.RECIPIENT) | 				            T_RSS.RECIPIENT) | ||||||
| 		    .values(buf.toString(), "registrator"); | 		    .values(buf.toString(), "registrator"); | ||||||
| 		  // @formatter:on | 		  // @formatter:on | ||||||
| 			LOGGER.debug("{}", sql4.toString()); | 			LOGGER.trace(sql4); | ||||||
| 			sql4.execute(); | 			sql4.execute(); | ||||||
| 		}); | 		}); | ||||||
|  |  | ||||||
| @@ -301,7 +303,7 @@ public class PersonRepository { | |||||||
| 			.leftJoin(REGISTRATOR).on(REGISTRATOR.PK.eq(T_PERSON.FK_REGISTRATOR)) | 			.leftJoin(REGISTRATOR).on(REGISTRATOR.PK.eq(T_PERSON.FK_REGISTRATOR)) | ||||||
| 			.where(T_PERSON.PK.eq(pk)); | 			.where(T_PERSON.PK.eq(pk)); | ||||||
| 		// @formatter:on | 		// @formatter:on | ||||||
| 		LOGGER.debug(sql.toString()); | 		LOGGER.trace(sql); | ||||||
| 		StringBuilder buf = new StringBuilder(); | 		StringBuilder buf = new StringBuilder(); | ||||||
| 		Iterator<Record11<LocalDate, LocalDateTime, EnumCamprole, LocalDateTime, LocalDateTime, Integer, Integer, String, String, String, String>> i = sql | 		Iterator<Record11<LocalDate, LocalDateTime, EnumCamprole, LocalDateTime, LocalDateTime, Integer, Integer, String, String, String, String>> i = sql | ||||||
| 				.fetch().iterator(); | 				.fetch().iterator(); | ||||||
|   | |||||||
| @@ -1,10 +1,12 @@ | |||||||
| package de.jottyfan.camporganizer.module.confirmation.person; | package de.jottyfan.camporganizer.module.confirmation.person; | ||||||
|  |  | ||||||
|  | import java.util.ArrayList; | ||||||
| import java.util.List; | import java.util.List; | ||||||
|  |  | ||||||
| import org.springframework.beans.factory.annotation.Autowired; | import org.springframework.beans.factory.annotation.Autowired; | ||||||
| import org.springframework.stereotype.Service; | 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.CampBean; | ||||||
| import de.jottyfan.camporganizer.module.confirmation.person.model.PersonBean; | import de.jottyfan.camporganizer.module.confirmation.person.model.PersonBean; | ||||||
|  |  | ||||||
| @@ -43,4 +45,12 @@ public class PersonService { | |||||||
| 	public String getCampPrice(Integer pk) { | 	public String getCampPrice(Integer pk) { | ||||||
| 		return gateway.getCampprice(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 String email; | ||||||
| 	private Integer fkCamp; | 	private Integer fkCamp; | ||||||
| 	private Integer fkProfile; | 	private Integer fkProfile; | ||||||
| 	private Boolean accept; | 	private String progress; | ||||||
| 	private LocalDateTime created; | 	private LocalDateTime created; | ||||||
| 	private EnumSex sex; | 	private EnumSex sex; | ||||||
| 	private Integer fkRegistrator; | 	private Integer fkRegistrator; | ||||||
| @@ -194,20 +194,6 @@ public class PersonBean implements Serializable { | |||||||
| 		this.fkProfile = fkProfile; | 		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 | 	 * @return the created | ||||||
| 	 */ | 	 */ | ||||||
| @@ -291,4 +277,18 @@ public class PersonBean implements Serializable { | |||||||
| 	public void setRequiredPrice(BigDecimal requiredPrice) { | 	public void setRequiredPrice(BigDecimal requiredPrice) { | ||||||
| 		this.requiredPrice = 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) | 				.deleteFrom(T_PERSONDOCUMENT) | ||||||
| 				.where(T_PERSONDOCUMENT.PK.eq(bean.getPk())); | 				.where(T_PERSONDOCUMENT.PK.eq(bean.getPk())); | ||||||
| 			// @formatter:on | 			// @formatter:on | ||||||
| 			LOGGER.debug("{}", sql.toString()); | 			LOGGER.trace(sql); | ||||||
| 			lrw.add(sql.execute()); | 			lrw.add(sql.execute()); | ||||||
|  |  | ||||||
| 			StringBuilder buf = new StringBuilder("Dokument "); | 			StringBuilder buf = new StringBuilder("Dokument "); | ||||||
| @@ -92,7 +92,7 @@ public class DashboardRepository { | |||||||
| 		    		         T_RSS.RECIPIENT) | 		    		         T_RSS.RECIPIENT) | ||||||
| 		    .values(buf.toString(), "registrator"); | 		    .values(buf.toString(), "registrator"); | ||||||
| 		  // @formatter:on | 		  // @formatter:on | ||||||
| 			LOGGER.debug("{}", sql2.toString()); | 			LOGGER.trace(sql); | ||||||
| 			sql2.execute(); | 			sql2.execute(); | ||||||
| 		}); | 		}); | ||||||
| 		return lrw.getCounter(); | 		return lrw.getCounter(); | ||||||
| @@ -117,7 +117,7 @@ public class DashboardRepository { | |||||||
| 		    			       ) | 		    			       ) | ||||||
| 		    	.values(bean.getName(), bean.getFiletype(), bean.getFkPerson(), bean.getDocument()); | 		    	.values(bean.getName(), bean.getFiletype(), bean.getFkPerson(), bean.getDocument()); | ||||||
| 		  // @formatter:on | 		  // @formatter:on | ||||||
| 			LOGGER.debug("{}", sql.toString()); | 			LOGGER.trace(sql); | ||||||
| 			sql.execute(); | 			sql.execute(); | ||||||
|  |  | ||||||
| 			StringBuilder buf = new StringBuilder("Dokument "); | 			StringBuilder buf = new StringBuilder("Dokument "); | ||||||
| @@ -130,7 +130,7 @@ public class DashboardRepository { | |||||||
| 	      		         T_RSS.RECIPIENT) | 	      		         T_RSS.RECIPIENT) | ||||||
| 	      .values(buf.toString(), "registrator"); | 	      .values(buf.toString(), "registrator"); | ||||||
| 	    // @formatter:on | 	    // @formatter:on | ||||||
| 			LOGGER.debug("{}", sql2.toString()); | 			LOGGER.trace(sql2); | ||||||
| 			sql2.execute(); | 			sql2.execute(); | ||||||
| 		}); | 		}); | ||||||
| 	} | 	} | ||||||
|   | |||||||
| @@ -37,7 +37,7 @@ public class DocumentRepository { | |||||||
| 			.selectFrom(T_DOCUMENT) | 			.selectFrom(T_DOCUMENT) | ||||||
| 			.where(T_DOCUMENT.PK.eq(id)); | 			.where(T_DOCUMENT.PK.eq(id)); | ||||||
| 		// @formatter:on | 		// @formatter:on | ||||||
| 		LOGGER.debug(sql.toString()); | 		LOGGER.trace(sql); | ||||||
| 		TDocumentRecord r = sql.fetchOne(); | 		TDocumentRecord r = sql.fetchOne(); | ||||||
| 		if (r == null) { | 		if (r == null) { | ||||||
| 			return null; | 			return null; | ||||||
|   | |||||||
| @@ -54,7 +54,7 @@ public class ICalRepository { | |||||||
| 			.from(T_CAMP) | 			.from(T_CAMP) | ||||||
| 		  .leftJoin(T_LOCATION).on(T_LOCATION.PK.eq(T_CAMP.FK_LOCATION)); | 		  .leftJoin(T_LOCATION).on(T_LOCATION.PK.eq(T_CAMP.FK_LOCATION)); | ||||||
| 		// @formatter:on | 		// @formatter:on | ||||||
| 		LOGGER.debug(sql.toString()); | 		LOGGER.trace(sql); | ||||||
| 		ICalendar ical = new ICalendar(); | 		ICalendar ical = new ICalendar(); | ||||||
| 		ical.getTimezoneInfo().setDefaultTimezone(TimezoneAssignment.download(TimeZone.getTimeZone("Europe/Berlin"), false)); | 		ical.getTimezoneInfo().setDefaultTimezone(TimezoneAssignment.download(TimeZone.getTimeZone("Europe/Berlin"), false)); | ||||||
| 		Iterator<Record5<String, LocalDateTime, LocalDateTime, String, String>> i = sql.fetch().iterator(); | 		Iterator<Record5<String, LocalDateTime, LocalDateTime, String, String>> i = sql.fetch().iterator(); | ||||||
|   | |||||||
| @@ -37,7 +37,7 @@ public class MigrationRepository { | |||||||
| 			.from(T_PROFILE) | 			.from(T_PROFILE) | ||||||
| 			.where(T_PROFILE.USERNAME.eq(username)); | 			.where(T_PROFILE.USERNAME.eq(username)); | ||||||
| 		// @formatter:on | 		// @formatter:on | ||||||
| 		LOGGER.debug(sql.toString()); | 		LOGGER.trace(sql); | ||||||
| 		return sql.fetchOne(T_PROFILE.PASSWORD); | 		return sql.fetchOne(T_PROFILE.PASSWORD); | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
|   | |||||||
| @@ -119,7 +119,7 @@ public class KeycloakRepository { | |||||||
| 		Response response = resource.create(user); | 		Response response = resource.create(user); | ||||||
| 		Boolean success = Status.CREATED.equals(response.getStatusInfo()); | 		Boolean success = Status.CREATED.equals(response.getStatusInfo()); | ||||||
| 		if (success) { | 		if (success) { | ||||||
| 			LOGGER.info("created new keycloak user {}", user.getUsername()); | 			LOGGER.debug("created new keycloak user {}", user.getUsername()); | ||||||
| 		} else { | 		} else { | ||||||
| 			LOGGER.error("error on creating keycloak user {}: {}", user.getUsername(), response.getStatus()); | 			LOGGER.error("error on creating keycloak user {}: {}", user.getUsername(), response.getStatus()); | ||||||
| 		} | 		} | ||||||
|   | |||||||
| @@ -99,9 +99,15 @@ public class RegistrationController extends CommonController { | |||||||
| 		return "/registration/cancellation"; | 		return "/registration/cancellation"; | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	@GetMapping("/registration/remove/{id}") | 	@GetMapping("/registration/revoke/{id}") | ||||||
| 	public String remove(@PathVariable("id") Integer id, final Model model) { | 	public String revoke(@PathVariable("id") Integer id, final Model model) { | ||||||
| 		service.removeBooking(id); | 		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"; | 		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_CAMP; | ||||||
| import static de.jottyfan.camporganizer.db.jooq.Tables.T_PERSON; | 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_PROFILE; | ||||||
| import static de.jottyfan.camporganizer.db.jooq.Tables.T_PROFILEROLE; | import static de.jottyfan.camporganizer.db.jooq.Tables.T_PROFILEROLE; | ||||||
| import static de.jottyfan.camporganizer.db.jooq.Tables.T_RSS; | 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 org.springframework.transaction.annotation.Transactional; | ||||||
|  |  | ||||||
| import de.jottyfan.camporganizer.db.jooq.enums.EnumCamprole; | 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.enums.EnumSex; | ||||||
| import de.jottyfan.camporganizer.db.jooq.tables.records.TPersonRecord; | 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.TProfileRecord; | ||||||
| import de.jottyfan.camporganizer.db.jooq.tables.records.TRssRecord; | import de.jottyfan.camporganizer.db.jooq.tables.records.TRssRecord; | ||||||
| import de.jottyfan.camporganizer.db.jooq.tables.records.VCampRecord; | import de.jottyfan.camporganizer.db.jooq.tables.records.VCampRecord; | ||||||
| @@ -147,7 +146,7 @@ public class RegistrationRepository { | |||||||
| 					  		        T_RSS.RECIPIENT) | 					  		        T_RSS.RECIPIENT) | ||||||
| 					  .values(new StringBuilder(bean.getFullname()).append(" hat sich als Nutzer im CampOrganizer2 registriert.").toString(), "admin"); | 					  .values(new StringBuilder(bean.getFullname()).append(" hat sich als Nutzer im CampOrganizer2 registriert.").toString(), "admin"); | ||||||
| 					// @formatter:on | 					// @formatter:on | ||||||
| 					LOGGER.debug("{}", sql2.toString()); | 					LOGGER.trace(sql2); | ||||||
| 					sql2.execute(); | 					sql2.execute(); | ||||||
| 				} else { | 				} else { | ||||||
| 					SelectConditionStep<Record1<Integer>> sql1 = DSL.using(t) | 					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 | 	 * @param id the ID of the booking | ||||||
| 	 * @return number of affected database rows, should be 1 |  | ||||||
| 	 */ | 	 */ | ||||||
| 	public Integer removeBooking(Integer id) { | 	public void revokeBooking(Integer id) { | ||||||
| 		LambdaResultWrapper lrw = new LambdaResultWrapper(); |  | ||||||
| 		jooq.transaction(t -> { | 		jooq.transaction(t -> { | ||||||
| 			SelectConditionStep<Record5<String, String, String, String, LocalDateTime>> sql0 = DSL.using(t) | 			SelectConditionStep<Record5<String, String, String, String, LocalDateTime>> sql0 = DSL.using(t) | ||||||
| 			// @formatter:off | 			// @formatter:off | ||||||
| @@ -279,33 +276,32 @@ public class RegistrationRepository { | |||||||
| 			LocalDateTime arrive = r.get(T_CAMP.ARRIVE); | 			LocalDateTime arrive = r.get(T_CAMP.ARRIVE); | ||||||
|  |  | ||||||
| 			StringBuilder rssMessage = new StringBuilder(username); | 			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(forename).append(" ").append(surname); | ||||||
| 			rssMessage.append(" an "); | 			rssMessage.append(" an "); | ||||||
| 			rssMessage.append(campname).append(" ") | 			rssMessage.append(campname).append(" ") | ||||||
| 					.append(arrive == null ? "" : arrive.format(DateTimeFormatter.ofPattern("YYYY"))); | 					.append(arrive == null ? "" : arrive.format(DateTimeFormatter.ofPattern("YYYY"))); | ||||||
| 			rssMessage.append(" storniert."); | 			rssMessage.append(" ausgelöst."); | ||||||
|  |  | ||||||
| 			DeleteConditionStep<TPersondocumentRecord> sql1 = DSL.using(t).deleteFrom(T_PERSONDOCUMENT) | 			UpdateConditionStep<TPersonRecord> sql1 = jooq | ||||||
| 					.where(T_PERSONDOCUMENT.FK_PERSON.eq(id)); | 			// @formatter:off | ||||||
| 			LOGGER.trace(sql1.toString()); | 				.update(T_PERSON) | ||||||
|  | 				.set(T_PERSON.PROGRESS, EnumProgress.revoked) | ||||||
|  | 				.where(T_PERSON.PK.eq(id)); | ||||||
|  | 			// @formatter:on | ||||||
|  | 			LOGGER.trace(sql1); | ||||||
| 			sql1.execute(); | 			sql1.execute(); | ||||||
|  |  | ||||||
| 			DeleteConditionStep<TPersonRecord> sql2 = DSL.using(t).deleteFrom(T_PERSON).where(T_PERSON.PK.eq(id)); | 			InsertValuesStep2<TRssRecord, String, String> sql2 = DSL.using(t) | ||||||
| 			LOGGER.trace(sql2.toString()); |  | ||||||
| 			lrw.add(sql2.execute()); |  | ||||||
|  |  | ||||||
| 			InsertValuesStep2<TRssRecord, String, String> sql3 = DSL.using(t) |  | ||||||
| 			// @formatter:off | 			// @formatter:off | ||||||
| 				.insertInto(T_RSS, | 				.insertInto(T_RSS, | ||||||
|                     T_RSS.MSG, |                     T_RSS.MSG, | ||||||
|                     T_RSS.RECIPIENT) |                     T_RSS.RECIPIENT) | ||||||
| 				.values(rssMessage.toString(), "registrator"); | 				.values(rssMessage.toString(), "registrator"); | ||||||
| 			// @formatter:on | 			// @formatter:on | ||||||
| 			LOGGER.trace("{}", sql3.toString()); | 			LOGGER.trace("{}", sql2.toString()); | ||||||
| 			sql3.execute(); | 			sql2.execute(); | ||||||
| 		}); | 		}); | ||||||
| 		return lrw.getCounter(); |  | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	/** | 	/** | ||||||
| @@ -494,4 +490,59 @@ public class RegistrationRepository { | |||||||
| 		Iterator<Integer> i = sql.fetch(T_PERSON.PK).iterator(); | 		Iterator<Integer> i = sql.fetch(T_PERSON.PK).iterator(); | ||||||
| 		return i.hasNext(); | 		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) { | 	public void revokeBooking(Integer id, Boolean doRevoke) { | ||||||
| 		return repository.removeBooking(id) > 0; | 		if (doRevoke) { | ||||||
|  | 			repository.revokeBooking(id); | ||||||
|  | 		} else { | ||||||
|  | 			repository.unrevokeBooking(id); | ||||||
|  | 		} | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	public void toggleConsent(Integer id) { | 	public void toggleConsent(Integer id) { | ||||||
|   | |||||||
| @@ -47,7 +47,7 @@ public class RssRepository { | |||||||
| 		  .from(T_RSS) | 		  .from(T_RSS) | ||||||
| 		  .where(T_RSS.RECIPIENT.eq(recipientCode)); | 		  .where(T_RSS.RECIPIENT.eq(recipientCode)); | ||||||
| 		// @formatter:on | 		// @formatter:on | ||||||
| 		LOGGER.debug("{}", sql.toString()); | 		LOGGER.trace(sql); | ||||||
| 		List<RssBean> list = new ArrayList<>(); | 		List<RssBean> list = new ArrayList<>(); | ||||||
| 		Iterator<Record3<Integer, String, LocalDateTime>> i = sql.fetch().iterator(); | 		Iterator<Record3<Integer, String, LocalDateTime>> i = sql.fetch().iterator(); | ||||||
| 		while (i.hasNext()) { | 		while (i.hasNext()) { | ||||||
| @@ -63,7 +63,7 @@ public class RssRepository { | |||||||
|  |  | ||||||
| 	public List<String> getAllFeeds() { | 	public List<String> getAllFeeds() { | ||||||
| 		SelectJoinStep<Record1<String>> sql = jooq.selectDistinct(T_RSS.RECIPIENT).from(T_RSS); | 		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); | 		return sql.fetch(T_RSS.RECIPIENT); | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| @@ -76,7 +76,7 @@ public class RssRepository { | |||||||
| 		  	      T_RSS.REGDATE) | 		  	      T_RSS.REGDATE) | ||||||
| 		  .from(T_RSS); | 		  .from(T_RSS); | ||||||
| 		// @formatter:on | 		// @formatter:on | ||||||
| 		LOGGER.debug("{}", sql.toString()); | 		LOGGER.trace(sql); | ||||||
| 		List<RssBean> list = new ArrayList<>(); | 		List<RssBean> list = new ArrayList<>(); | ||||||
| 		Iterator<Record4<Integer, String, String, LocalDateTime>> i = sql.fetch().iterator(); | 		Iterator<Record4<Integer, String, String, LocalDateTime>> i = sql.fetch().iterator(); | ||||||
| 		while (i.hasNext()) { | 		while (i.hasNext()) { | ||||||
| @@ -96,7 +96,7 @@ public class RssRepository { | |||||||
| 			.deleteFrom(T_RSS) | 			.deleteFrom(T_RSS) | ||||||
| 			.where(T_RSS.PK.eq(bean.getPk())); | 			.where(T_RSS.PK.eq(bean.getPk())); | ||||||
| 		// @formatter:on | 		// @formatter:on | ||||||
| 		LOGGER.debug("{}", sql.toString()); | 		LOGGER.trace(sql); | ||||||
| 		sql.execute(); | 		sql.execute(); | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| @@ -107,7 +107,7 @@ public class RssRepository { | |||||||
| 			.set(T_RSS.MSG, bean.getMessage()) | 			.set(T_RSS.MSG, bean.getMessage()) | ||||||
| 			.where(T_RSS.PK.eq(bean.getPk())); | 			.where(T_RSS.PK.eq(bean.getPk())); | ||||||
| 		// @formatter:on | 		// @formatter:on | ||||||
| 		LOGGER.debug("{}", sql.toString()); | 		LOGGER.trace(sql); | ||||||
| 		sql.execute(); | 		sql.execute(); | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
|   | |||||||
| @@ -121,19 +121,20 @@ div { | |||||||
| 		!important; | 		!important; | ||||||
| } | } | ||||||
|  |  | ||||||
| .acc_true { | .acc_approved { | ||||||
| 	background-image: linear-gradient(to bottom right, #cfc, #afa) | 	background: #aaffaa !important; | ||||||
| 		!important; |  | ||||||
| } | } | ||||||
|  |  | ||||||
| .acc_false { | .acc_rejected { | ||||||
| 	background-image: linear-gradient(to bottom right, #fcc, #faa) | 	background: #ffaaaa !important; | ||||||
| 		!important; |  | ||||||
| } | } | ||||||
|  |  | ||||||
| .acc_null { | .acc_revoked { | ||||||
| 	background-image: linear-gradient(to bottom right, #fdb, #fca) | 	background:  rgb(220, 138, 221) !important; | ||||||
| 		!important; | } | ||||||
|  |  | ||||||
|  | .acc_requested { | ||||||
|  | 	background:  rgb(255, 190, 111) !important; | ||||||
| } | } | ||||||
|  |  | ||||||
| .right-dist { | .right-dist { | ||||||
| @@ -303,6 +304,17 @@ div { | |||||||
| 	margin: 0px 2px 0px 2px; | 	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 { | .dist8 { | ||||||
| 	margin: 8px; | 	margin: 8px; | ||||||
| } | } | ||||||
| @@ -333,19 +345,19 @@ div { | |||||||
| } | } | ||||||
|  |  | ||||||
| .framed-green { | .framed-green { | ||||||
| 	background: linear-gradient(to bottom right, lime, darkgreen); | 	background: linear-gradient(to bottom right, darkgreen, lime); | ||||||
| 	color: white; | 	color: white; | ||||||
| 	border: 1px solid green; | 	border: 1px solid green; | ||||||
| } | } | ||||||
|  |  | ||||||
| .framed-red { | .framed-red { | ||||||
| 	background: linear-gradient(to bottom right, red, darkred); | 	background: linear-gradient(to bottom right, darkred, red); | ||||||
| 	color: white; | 	color: white; | ||||||
| 	border: 1px solid red; | 	border: 1px solid red; | ||||||
| } | } | ||||||
|  |  | ||||||
| .framed-orange { | .framed-orange { | ||||||
| 	background: linear-gradient(to bottom right, orange, #bf6c06); | 	background: linear-gradient(to bottom right, #bf6c06, orange); | ||||||
| 	color: white; | 	color: white; | ||||||
| 	border: 1px solid orange; | 	border: 1px solid orange; | ||||||
| } | } | ||||||
| @@ -356,6 +368,12 @@ div { | |||||||
| 	border: 1px solid black; | 	border: 1px solid black; | ||||||
| } | } | ||||||
|  |  | ||||||
|  | .framed-pink { | ||||||
|  | 	background: linear-gradient(to bottom right, #3b115b, #d18be8); | ||||||
|  | 	color: #f8effb; | ||||||
|  | 	border: 1px solid #4a0084; | ||||||
|  | } | ||||||
|  |  | ||||||
| .nomaxwidth { | .nomaxwidth { | ||||||
| 	max-width: none !important; | 	max-width: none !important; | ||||||
| } | } | ||||||
|   | |||||||
| @@ -36,8 +36,8 @@ | |||||||
| 											<td th:text="${#temporals.format(booker.bookingDate, 'dd.MM.yyyy')}"></td> | 											<td th:text="${#temporals.format(booker.bookingDate, 'dd.MM.yyyy')}"></td> | ||||||
| 										</tr> | 										</tr> | ||||||
| 										<tr> | 										<tr> | ||||||
| 											<th>Bestätigt</th> | 											<th>Status</th> | ||||||
| 											<td th:text="${booker.accept == null ? '' : (booker.accept ? 'Ja' : 'abgelehnt')}"></td> | 											<td th:text="${booker.progress}"></td> | ||||||
| 										</tr> | 										</tr> | ||||||
| 										<tr> | 										<tr> | ||||||
| 											<th>Freizeitpreis</th> | 											<th>Freizeitpreis</th> | ||||||
|   | |||||||
| @@ -18,7 +18,7 @@ | |||||||
| 								<th>Freizeit</th> | 								<th>Freizeit</th> | ||||||
| 								<th>Rolle</th> | 								<th>Rolle</th> | ||||||
| 								<th>Kontostand</th> | 								<th>Kontostand</th> | ||||||
| 								<th>Angemeldet</th> | 								<th>Status</th> | ||||||
| 								<th>Bestätigt</th> | 								<th>Bestätigt</th> | ||||||
| 							</tr> | 							</tr> | ||||||
| 						</thead> | 						</thead> | ||||||
| @@ -48,7 +48,7 @@ | |||||||
| 										</form> | 										</form> | ||||||
| 									</td> | 									</td> | ||||||
| 									<td class="middled" th:text="${#temporals.format(b.bookingDate, 'dd.MM.yyyy')}"></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> | 								</tr> | ||||||
| 							</th:block> | 							</th:block> | ||||||
| 						</tbody> | 						</tbody> | ||||||
|   | |||||||
| @@ -63,7 +63,7 @@ | |||||||
| 											<th>Geschlecht</th> | 											<th>Geschlecht</th> | ||||||
| 											<th>Rolle</th> | 											<th>Rolle</th> | ||||||
| 											<th>Kontostand</th> | 											<th>Kontostand</th> | ||||||
| 											<th>Angemeldet</th> | 											<th>Status</th> | ||||||
| 											<th>Bestätigt</th> | 											<th>Bestätigt</th> | ||||||
| 										</tr> | 										</tr> | ||||||
| 									</thead> | 									</thead> | ||||||
| @@ -75,7 +75,7 @@ | |||||||
| 												<td th:text="${b.role}"></td> | 												<td th:text="${b.role}"></td> | ||||||
| 												<td><span th:text="${#numbers.formatDecimal(b.paid, 1, 2) + ' €'}" th:if="${b.paid != null}"></span></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="${#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> | 											</tr> | ||||||
| 										</th:block> | 										</th:block> | ||||||
| 									</tbody> | 									</tbody> | ||||||
|   | |||||||
| @@ -39,7 +39,7 @@ | |||||||
| 							<div th:text="${p.camprolle}"></div></td> | 							<div th:text="${p.camprolle}"></div></td> | ||||||
| 						<td><div th:text="${#temporals.format(p.birthDate, 'dd.MM.yyyy')}"></div> | 						<td><div th:text="${#temporals.format(p.birthDate, 'dd.MM.yyyy')}"></div> | ||||||
| 							<div th:text="${p.getAge(campStartDate)} + ' Jahre'"></div></td> | 							<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 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><span th:text="${p.consentCatalogPhoto ? 'ja' : 'nein'}" th:if="${p.consentCatalogPhoto}"></span></td> | ||||||
| 						<td th:text="${p.comment}"></td> | 						<td th:text="${p.comment}"></td> | ||||||
|   | |||||||
| @@ -44,7 +44,7 @@ | |||||||
| 			</div> | 			</div> | ||||||
| 			<div class="accordion-item"> | 			<div class="accordion-item"> | ||||||
| 				<h2 class="accordion-header" id="approvedpanel"> | 				<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> | 						Anmeldungen</button> | ||||||
| 				</h2> | 				</h2> | ||||||
| 				<div id="approveddiv" class="accordion-collapse collapse dist8" aria-labelled="approvedpanel" data-bs-parent="#mainacc"> | 				<div id="approveddiv" class="accordion-collapse collapse dist8" aria-labelled="approvedpanel" data-bs-parent="#mainacc"> | ||||||
| @@ -79,7 +79,7 @@ | |||||||
| 			</div> | 			</div> | ||||||
| 			<div class="accordion-item"> | 			<div class="accordion-item"> | ||||||
| 				<h2 class="accordion-header" id="rejectedpanel"> | 				<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> | 						Anmeldungen</button> | ||||||
| 				</h2> | 				</h2> | ||||||
| 				<div id="rejecteddiv" class="accordion-collapse collapse dist8" aria-labelled="rejectedpanel" data-bs-parent="#mainacc"> | 				<div id="rejecteddiv" class="accordion-collapse collapse dist8" aria-labelled="rejectedpanel" data-bs-parent="#mainacc"> | ||||||
| @@ -112,6 +112,41 @@ | |||||||
| 					</script> | 					</script> | ||||||
| 				</div> | 				</div> | ||||||
| 			</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"> | 			<div class="accordion-item"> | ||||||
| 				<h2 class="accordion-header" id="overviewpanel"> | 				<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> | 					<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> | 						<tbody> | ||||||
| 							<tr th:each="o : ${campoverview}"> | 							<tr th:each="o : ${campoverview}"> | ||||||
| 								<td th:text="${o.camp} + ' ' + ${#temporals.format(o.date, 'yyyy')}"></td> | 								<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> | 							</tr> | ||||||
| 						</tbody> | 						</tbody> | ||||||
| 						<tfoot> | 						<tfoot> | ||||||
| 							<tr> | 							<tr> | ||||||
| 								<td>Zusammenfassung</td> | 								<td>Zusammenfassung</td> | ||||||
| 								<td><span th:text="${campoverviewsummary.untouched}" class="badgetodo"></span> / <span th:text="${campoverviewsummary.rejected}" class="badgewarn"></span> / <span | 								<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> | 						</tfoot> | ||||||
| 					</table> | 					</table> | ||||||
| 					<script type="text/javascript"> | 					<script type="text/javascript"> | ||||||
| @@ -146,7 +181,7 @@ | |||||||
| 							}); | 							}); | ||||||
| 						}); | 						}); | ||||||
| 					</script> | 					</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> | 			</div> | ||||||
| 			<div class="accordion-item"> | 			<div class="accordion-item"> | ||||||
|   | |||||||
| @@ -112,13 +112,21 @@ | |||||||
|           </div> |           </div> | ||||||
|           <div class="row mb-2"> |           <div class="row mb-2"> | ||||||
|             <label for="inputAccept" class="col-sm-2 col-form-label">Status</label> |             <label for="inputAccept" class="col-sm-2 col-form-label">Status</label> | ||||||
|             <div class="col-sm-10"> |             <span class="col-sm-2 btn btn-outline-warning" th:if="${person.progress} == 'requested'">offen</span> | ||||||
|               <div class="form-group"> |             <span class="col-sm-2 btn btn-outline-success" th:if="${person.progress} == 'approved'">bestätigt</span> | ||||||
|                 <input type="radio" class="btn-check" id="accept1" name="accept1" value="" th:field="*{accept}" /> <label class="btn btn-outline-primary" for="accept1"><i |             <span class="col-sm-2 btn btn-outline-danger" th:if="${person.progress} == 'rejected'">abgelehnt</span> | ||||||
|                   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" |             <span class="col-sm-2 btn btn-outline-secondary" th:if="${person.progress} == 'revoked'">storniert</span> | ||||||
|                   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 |             <div class="col-sm-8" th:if="${#lists.contains({'requested', 'approved', 'rejected'}, person.progress)}"> | ||||||
|                   class="btn btn-outline-danger" for="accept3"><i class="fas fa-ban"></i> abgelehnt</label> |               <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> | ||||||
|  |             <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> |           </div> | ||||||
|           <div class="row mb-2"> |           <div class="row mb-2"> | ||||||
| @@ -129,6 +137,26 @@ | |||||||
|             </div> |             </div> | ||||||
|           </div> |           </div> | ||||||
|         </form> |         </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 th:if="${person == null}" class="error">In der Datenbank wurde keine Person mit entsprechender ID gefunden.</div> | ||||||
|       </div> |       </div> | ||||||
|     </div> |     </div> | ||||||
|   | |||||||
| @@ -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" 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}"> | 				<div class="accordion-item" th:each="b : ${mybookings}"> | ||||||
| 					<h2 class="accordion-header" th:id="'acc-head-' + ${b.pk}" th:if="${b.pk}"> | 					<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}"> | 							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 | 							<i class="fas fa-check framed framed-green" th:if="${b.progress} == 'approved'"></i> | ||||||
| 								class="fas fa-question framed framed-orange" th:if="${b.accept} == null"></i> | 							<i class="fas fa-ban framed framed-red" th:if="${b.progress} == 'rejected'"></i> | ||||||
| 								<span	th:text="${b.forename + ' ' + b.surname + ' für ' + b.campName + ' ' + #numbers.formatInteger(b.year, 4)}" class="headlinefont"></span> | 							<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> | 						</button> | ||||||
| 					</h2> | 					</h2> | ||||||
| 					<div th:id="'acc-body-' + ${b.pk}" class="accordion-collapse collapse" th:aria-labelledby="'acc-head-' + ${b.pk}"> | 					<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> | ||||||
| 							</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-header">Dokumente</div> | ||||||
| 								<div class="card-body"> | 								<div class="card-body"> | ||||||
| 									<div class="container"> | 									<div class="container"> | ||||||
| @@ -139,8 +141,11 @@ | |||||||
| 												<div class="col-sm-8"> | 												<div class="col-sm-8"> | ||||||
| 													<input type="submit" class="btn btn-primary" value="Änderungen übernehmen" /> | 													<input type="submit" class="btn btn-primary" value="Änderungen übernehmen" /> | ||||||
| 												</div> | 												</div> | ||||||
| 												<div class="col-sm-2"> | 												<div class="col-sm-2" th:if="${b.progress != 'revoked'}"> | ||||||
| 													<a th:href="@{/registration/cancel/{id}(id=${b.pk})}" class="btn btn-outline-danger" th:if="${!b.isOver}">stornieren</a> | 													<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> | 											</div> | ||||||
| 										</div> | 										</div> | ||||||
| @@ -150,8 +155,12 @@ | |||||||
| 							<div class="alert alert-primary" th:if="${b.created != null}"> | 							<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> | 								angemeldet am <span th:text="${#temporals.format(b.created, 'dd.MM.yyyy')}"></span> von <span th:text="${b.subscriber}"></span> | ||||||
| 							</div> | 							</div> | ||||||
| 							<div th:class="'alert ' + ${b.accept ? 'alert-success' : 'alert-danger'}" th:if="${b.accept != null}"> | 							<div class="alert alert-danger" th:if="${b.progress == 'revoked'}"> | ||||||
| 								<span th:text="${b.accept ? 'bestätigt' : 'abgelehnt'}"></span> von <span th:text="${b.registrator}"></span> | 								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> | ||||||
| 							<div class="alert alert-warning" th:if="${b.isOver}">Die Freizeit ist bereits vorbei.</div> | 							<div class="alert alert-warning" th:if="${b.isOver}">Die Freizeit ist bereits vorbei.</div> | ||||||
| 						</div> | 						</div> | ||||||
|   | |||||||
| @@ -21,7 +21,7 @@ | |||||||
| 						th:if="${bean.isDirector}">Leiter</span><span th:if="${bean.isFeeder}">Küchenhilfe</span> | 						th:if="${bean.isDirector}">Leiter</span><span th:if="${bean.isFeeder}">Küchenhilfe</span> | ||||||
| 				</div> | 				</div> | ||||||
| 				<div class="card-footer"> | 				<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> | 			</div> | ||||||
| 		</div> | 		</div> | ||||||
|   | |||||||
| @@ -1,17 +1,17 @@ | |||||||
| <!DOCTYPE html> | <!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> | <head> | ||||||
| <title>Camp Organizer 2</title> | <title>Camp Organizer 2</title> | ||||||
| <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> | <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> | ||||||
| <meta name="viewport" content="width=device-width, initial-scale=1" /> | <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/bootstrap/5.3.3/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/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/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="@{/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/style.css}" /> | ||||||
| <link th:rel="stylesheet" type="text/css" media="all" th:href="@{/css/select2-bootstrap-5-theme.min.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/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/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="@{/webjars/select2/4.0.13/js/select2.full.min.js}"></script> | ||||||
| <script th:src="@{/js/dataTables.de.js}"></script> | <script th:src="@{/js/dataTables.de.js}"></script> | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user