From a875c9250096af16e61d841b74e42962f54a8190 Mon Sep 17 00:00:00 2001
From: aboeckle <alexander.boeckle@frentix.com>
Date: Tue, 10 Mar 2020 10:29:33 +0100
Subject: [PATCH] OO-4402: Overlapping booking methods warning

---
 .../ui/AccessConfigurationController.java     | 31 +++++++++++++++++++
 .../ui/_content/configuration_list.html       |  4 +++
 .../ui/_i18n/LocalStrings_de.properties       |  1 +
 .../ui/_i18n/LocalStrings_en.properties       |  1 +
 4 files changed, 37 insertions(+)

diff --git a/src/main/java/org/olat/resource/accesscontrol/ui/AccessConfigurationController.java b/src/main/java/org/olat/resource/accesscontrol/ui/AccessConfigurationController.java
index b141f73ec7d..c25c69f6465 100644
--- a/src/main/java/org/olat/resource/accesscontrol/ui/AccessConfigurationController.java
+++ b/src/main/java/org/olat/resource/accesscontrol/ui/AccessConfigurationController.java
@@ -211,6 +211,7 @@ public class AccessConfigurationController extends FormBasicController {
 				OfferAccess newLink = editMethodCtrl.commitChanges();
 				newLink = acService.saveOfferAccess(newLink);
 				replace(newLink);
+				checkOverlap();
 				fireEvent(ureq, Event.CHANGED_EVENT);
 			}
 			cmc.deactivate();
@@ -242,6 +243,7 @@ public class AccessConfigurationController extends FormBasicController {
 			if("delete".equals(cmd)) {
 				AccessInfo infos = (AccessInfo)source.getUserObject();
 				removeMethod(infos);
+				checkOverlap();
 				fireEvent(ureq, Event.CHANGED_EVENT);
 			} else if("edit".equals(cmd)) {
 				AccessInfo infos = (AccessInfo)source.getUserObject();
@@ -302,6 +304,7 @@ public class AccessConfigurationController extends FormBasicController {
 		}
 		
 		updateConfirmationEmail();
+		checkOverlap();
 	}
 	
 	private void updateConfirmationEmail() {
@@ -397,6 +400,34 @@ public class AccessConfigurationController extends FormBasicController {
 		dbInstance.commit();
 		loadConfigurations();
 	}
+	
+	private void checkOverlap() {
+		boolean overlap = false;
+		
+		for (AccessInfo confControllerA : confControllers) {
+			for (AccessInfo confControllerB : confControllers) {
+				// Dont compare a confController with itself
+				if (!confControllerA.equals(confControllerB)) {
+					Date aFrom = confControllerA.getLink().getValidFrom();
+					Date aTo = confControllerA.getLink().getValidTo();
+					Date bFrom = confControllerB.getLink().getValidFrom();
+					Date bTo = confControllerB.getLink().getValidTo();
+					
+					// Options: Dates cross each other or on date range is within another
+					if ((aFrom.compareTo(bFrom) <= 0 &&
+							aTo.compareTo(bTo) <= 0 && 
+							bFrom.compareTo(aTo) <= 0) ||
+						(aFrom.compareTo(bFrom) <= 0) &&
+							bTo.compareTo(aTo) <= 0 && 
+							bTo.compareTo(aFrom) >= 0) {
+						overlap = true;
+					} 
+				}
+			}
+		}
+		confControllerContainer.contextPut("overlappingConfigs", overlap);
+		confControllerContainer.setDirty(true);
+	}
 
 	public class AccessInfo {
 		private String name;
diff --git a/src/main/java/org/olat/resource/accesscontrol/ui/_content/configuration_list.html b/src/main/java/org/olat/resource/accesscontrol/ui/_content/configuration_list.html
index 6c7e73dd2c7..925f0a8a42c 100644
--- a/src/main/java/org/olat/resource/accesscontrol/ui/_content/configuration_list.html
+++ b/src/main/java/org/olat/resource/accesscontrol/ui/_content/configuration_list.html
@@ -1,3 +1,7 @@
+#if($overlappingConfigs)
+	<div class="o_important"><i class="o_icon o_icon_important"> </i> $r.translate("accesscontrol.overlap.found")</div>
+#end
+
 #if ($confControllers && $confControllers.size() > 0)
 	#foreach($confController in $confControllers)
 		#set($css = $confController.getLink().getMethod().getMethodCssClass())
diff --git a/src/main/java/org/olat/resource/accesscontrol/ui/_i18n/LocalStrings_de.properties b/src/main/java/org/olat/resource/accesscontrol/ui/_i18n/LocalStrings_de.properties
index c7a441396c7..a9fdeaf9c92 100644
--- a/src/main/java/org/olat/resource/accesscontrol/ui/_i18n/LocalStrings_de.properties
+++ b/src/main/java/org/olat/resource/accesscontrol/ui/_i18n/LocalStrings_de.properties
@@ -23,6 +23,7 @@ accesscontrol.desc=Sie k\u00F6nnen die Buchungsmethoden f\u00FCr den Zugang zu d
 accesscontrol.desc.end=W\u00E4hlen Sie die Schaltfl\u00E4che "$\:add.accesscontrol" um aus der Liste der verf\u00FCgbaren Buchungsmethoden eine oder mehrere auszuw\u00E4hlen. Optional k\u00F6nnen Buchungsmethoden mit einem G\u00FCltigkeitsdatum versehen werden.
 accesscontrol.no.methods.full.access=Es ist noch keine Buchungsmethode konfiguriert.<br />Der Zugang zu dieser Ressource steht allen Systembenutzern ohne Buchung offen. W\u00E4hlen Sie die Schaltfl\u00E4che "$\:add.accesscontrol" um den Zugang einzuschr\u00E4nken und/oder eine Buchung zu erzwingen.
 accesscontrol.no.methods.no.access=Es ist noch keine Buchungsmethode konfiguriert.<br />Diese Ressource kann nur von den Teilnehmer der Ressource verwendet werden. W\u00E4hlen Sie die Schaltfl\u00E4che "$\:add.accesscontrol" um eine Buchungsmethode zu w\u00E4hlen und die Ressource zu ver\u00F6ffentlichen.
+accesscontrol.overlap.found=Es wurden \u00FCberlappende Buchungsmethoden gefunden. Bitte stellen Sie sicher, dass dies beabsichtig und korrekt ist.
 accesscontrol.table.from=g\u00FCltig von
 accesscontrol.table.method=Buchungsmethode
 accesscontrol.table.to=bis
diff --git a/src/main/java/org/olat/resource/accesscontrol/ui/_i18n/LocalStrings_en.properties b/src/main/java/org/olat/resource/accesscontrol/ui/_i18n/LocalStrings_en.properties
index a47f66b45d1..f0be1239b7f 100644
--- a/src/main/java/org/olat/resource/accesscontrol/ui/_i18n/LocalStrings_en.properties
+++ b/src/main/java/org/olat/resource/accesscontrol/ui/_i18n/LocalStrings_en.properties
@@ -23,6 +23,7 @@ accesscontrol.desc=You can configure booking methods for accessing this resource
 accesscontrol.desc.end=Select the button "$\:add.accesscontrol" to select one or more booking methods. As an option you can also define the period in which each booking method is valid.
 accesscontrol.no.methods.full.access=There is no booking method configured to restrict access. This resource can be accessed by all known users without an explicit booking. Select the button "$\:add.accesscontrol"  to restrict access and/or to require an explicit booking.
 accesscontrol.no.methods.no.access=There is no booking method configured. This resource can only be accessed by explicit members of this resource. Select the button "$\:add.accesscontrol" to add a booking method and to publish the resource.
+accesscontrol.overlap.found=There are overlapping booking methods. Please make sure this is intended and correct.
 accesscontrol.table.from=valid from
 accesscontrol.table.method=Booking method
 accesscontrol.table.to=to
-- 
GitLab