From d91620bb4f025fa78bd84cf6702f2804e2ef1efe Mon Sep 17 00:00:00 2001
From: Michael Simon <simon@kit.edu>
Date: Tue, 9 May 2023 08:47:25 +0200
Subject: [PATCH] show policies on service connect

---
 .../ConnectLocalProjectToServiceBean.java     | 74 +++++++++++++++++++
 .../connect-local-project-to-service.xhtml    | 22 +++++-
 2 files changed, 94 insertions(+), 2 deletions(-)

diff --git a/bwreg-webapp/src/main/java/edu/kit/scc/webreg/bean/project/ConnectLocalProjectToServiceBean.java b/bwreg-webapp/src/main/java/edu/kit/scc/webreg/bean/project/ConnectLocalProjectToServiceBean.java
index 577369dd2..aa0fe192e 100644
--- a/bwreg-webapp/src/main/java/edu/kit/scc/webreg/bean/project/ConnectLocalProjectToServiceBean.java
+++ b/bwreg-webapp/src/main/java/edu/kit/scc/webreg/bean/project/ConnectLocalProjectToServiceBean.java
@@ -19,29 +19,41 @@ import javax.faces.view.ViewScoped;
 import javax.inject.Inject;
 import javax.inject.Named;
 
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import edu.kit.scc.webreg.entity.PolicyEntity;
 import edu.kit.scc.webreg.entity.ServiceEntity;
 import edu.kit.scc.webreg.entity.project.LocalProjectEntity;
 import edu.kit.scc.webreg.entity.project.LocalProjectEntity_;
 import edu.kit.scc.webreg.entity.project.ProjectAdminType;
 import edu.kit.scc.webreg.entity.project.ProjectIdentityAdminEntity;
+import edu.kit.scc.webreg.entity.project.ProjectPolicyType;
 import edu.kit.scc.webreg.entity.project.ProjectServiceEntity;
 import edu.kit.scc.webreg.entity.project.ProjectServiceStatusType;
 import edu.kit.scc.webreg.entity.project.ProjectServiceType;
 import edu.kit.scc.webreg.exc.NotAuthorizedException;
+import edu.kit.scc.webreg.service.PolicyService;
 import edu.kit.scc.webreg.service.ServiceService;
 import edu.kit.scc.webreg.service.project.LocalProjectService;
 import edu.kit.scc.webreg.service.project.ProjectService;
 import edu.kit.scc.webreg.session.SessionManager;
+import edu.kit.scc.webreg.util.FacesMessageGenerator;
+import edu.kit.scc.webreg.util.PolicyHolder;
 
 @Named
 @ViewScoped
 public class ConnectLocalProjectToServiceBean implements Serializable {
 
 	private static final long serialVersionUID = 1L;
+	private static final Logger logger = LoggerFactory.getLogger(ConnectLocalProjectToServiceBean.class);
 
 	@Inject
 	private SessionManager session;
 
+	@Inject
+	private FacesMessageGenerator messageGenerator;
+
 	@Inject
 	private LocalProjectService service;
 
@@ -51,6 +63,9 @@ public class ConnectLocalProjectToServiceBean implements Serializable {
 	@Inject
 	private ProjectService projectService;
 
+	@Inject
+	private PolicyService policyService;
+
 	private LocalProjectEntity entity;
 
 	private List<ServiceEntity> serviceList;
@@ -62,6 +77,10 @@ public class ConnectLocalProjectToServiceBean implements Serializable {
 	private List<ProjectIdentityAdminEntity> adminList;
 	private ProjectIdentityAdminEntity adminIdentity;
 
+	private List<PolicyHolder> policyHolderList;
+
+	private Boolean savePossible = false;
+	
 	public void preRenderView(ComponentSystemEvent ev) {
 		selectedServices = new ArrayList<ServiceEntity>();
 
@@ -82,6 +101,29 @@ public class ConnectLocalProjectToServiceBean implements Serializable {
 		}
 	}
 
+	public void connectionAdded() {
+		policyHolderList = new ArrayList<PolicyHolder>();
+		if (selectedServices.size() > 0) {
+			setSavePossible(true);
+		}
+		else {
+			setSavePossible(false);
+		}
+		
+		for (ServiceEntity s : selectedServices) {
+			List<PolicyEntity> policyList = policyService.findAllByAttr("projectPolicy", s);
+
+			policyList.stream().forEach(policy -> {
+				if (ProjectPolicyType.SERVICE_CONNECT.equals(policy.getProjectPolicyType())) {
+					PolicyHolder ph = new PolicyHolder();
+					ph.setPolicy(policy);
+					policyHolderList.add(ph);
+				}
+			});
+
+		}
+	}
+
 	public List<ProjectIdentityAdminEntity> getAdminList() {
 		if (adminList == null) {
 			adminList = projectService.findAdminsForProject(getEntity());
@@ -90,6 +132,23 @@ public class ConnectLocalProjectToServiceBean implements Serializable {
 	}
 
 	public String save() {
+		logger.debug("testing all checkboxes");
+		for (PolicyHolder ph : policyHolderList) {
+			if (ph.getPolicy() != null && ph.getPolicy().getShowOnly() != null && ph.getPolicy().getShowOnly()) {
+				logger.debug("Policy {} in Service {} is just for show", ph.getPolicy().getId(),
+						ph.getPolicy().getProjectPolicy().getId());
+			} else if (!ph.getChecked()) {
+				logger.debug("Policy {} in Service {} is not checked", ph.getPolicy().getId(),
+						ph.getPolicy().getProjectPolicy().getId());
+				messageGenerator.addWarningMessage("need_check", "Zustimmung fehlt!",
+						"Sie müssen allen Nutzungbedingungen zustimmen.");
+				return "";
+			} else {
+				logger.debug("Policy {} in Service {} is checked", ph.getPolicy().getId(),
+						ph.getPolicy().getProjectPolicy().getId());
+			}
+		}
+
 		for (ServiceEntity s : selectedServices) {
 			projectService.addOrChangeService(entity, s, ProjectServiceType.PASSIVE_GROUP,
 					ProjectServiceStatusType.APPROVAL_PENDING, "idty-" + session.getIdentityId());
@@ -145,4 +204,19 @@ public class ConnectLocalProjectToServiceBean implements Serializable {
 	public void setProjectServiceList(List<ProjectServiceEntity> projectServiceList) {
 		this.projectServiceList = projectServiceList;
 	}
+
+	public List<PolicyHolder> getPolicyHolderList() {
+		if (policyHolderList == null) {
+			policyHolderList = new ArrayList<PolicyHolder>();
+		}
+		return policyHolderList;
+	}
+
+	public Boolean getSavePossible() {
+		return savePossible;
+	}
+
+	public void setSavePossible(Boolean savePossible) {
+		this.savePossible = savePossible;
+	}
 }
diff --git a/bwreg-webapp/src/main/webapp/project/connect-local-project-to-service.xhtml b/bwreg-webapp/src/main/webapp/project/connect-local-project-to-service.xhtml
index 2943f285b..5c47b568e 100644
--- a/bwreg-webapp/src/main/webapp/project/connect-local-project-to-service.xhtml
+++ b/bwreg-webapp/src/main/webapp/project/connect-local-project-to-service.xhtml
@@ -39,6 +39,7 @@
 		        <p:selectManyMenu id="servicePicker" value="#{connectLocalProjectToServiceBean.selectedServices}"
                             converter="#{serviceConverter}" style="min-width: 300px;"
                             var="s" showCheckbox="true">
+					<p:ajax listener="#{connectLocalProjectToServiceBean.connectionAdded()}" update="btnPanel policyHolderList" />                            
 					<f:selectItems value="#{connectLocalProjectToServiceBean.serviceList}" var="service" itemLabel="#{service.name}"
                             itemValue="#{service}"/>
 					<p:column>
@@ -57,9 +58,26 @@
 		<p:panel>
 			<h:outputText value="#{messages['project.connect_to_service_connect_text']}" />
 		</p:panel>
+
+
+		<p:panel id="policyHolderList">
+  		  <p:panel style="margin: 1.5em 0.5em;" rendered="#{connectLocalProjectToServiceBean.policyHolderList.size() != 0}">
+			<ui:repeat var="policyHolder" value="#{connectLocalProjectToServiceBean.policyHolderList}">
+				<b><h:outputText value="#{policyHolder.policy.name} - #{policyHolder.policy.actualAgreement.name}" /></b>
+				<div style="margin-top: 1em;">
+					<h:outputText value="#{bbCodeConverter.convert(policyHolder.policy.actualAgreement.agreement)}" escape="false"/>
+				</div>
+				<p:outputPanel rendered="#{not policyHolder.policy.showOnly}" style="margin-top: 1em;">
+					<h:selectBooleanCheckbox value="#{policyHolder.checked}" />
+					<h:outputText value="#{messages.accept_tou}" />
+				</p:outputPanel>
+			</ui:repeat>
+  		  </p:panel>
+		</p:panel>
 		
-		<p:panel>
-			<p:commandButton id="save" action="#{connectLocalProjectToServiceBean.save}" value="#{messages['project.connect_to_service_connect_button']}" />
+		<p:panel id="btnPanel">
+			<p:commandButton id="saveBtn" action="#{connectLocalProjectToServiceBean.save}" value="#{messages['project.connect_to_service_connect_button']}" 
+				update="messageBox" disabled="#{not connectLocalProjectToServiceBean.savePossible}" />
 		</p:panel>
 
 		<div class="text full" style="margin-top: 0.4em;">
-- 
GitLab