From 0ab8f82c8bf829737d6bd6c57ad1f35dcee58df1 Mon Sep 17 00:00:00 2001
From: Erik Hoogland <erik.hoogland@contezza.nl>
Date: Tue, 5 Nov 2024 17:19:25 +0100
Subject: [PATCH 1/9] Verplaatsing logica formSubmission, toevoeging copy en
 start proces in bean

---
 .../TezzaResourceAutoConfiguration.java       |  13 +-
 .../gzac/tezza/bean/TezzaUploadFileBean.java  | 212 +++++++++++++-----
 .../gzac/tezza/service/TezzaService.java      |  70 +++++-
 .../gzac/tezza/web/rest/TezzaResource.java    |  39 +---
 4 files changed, 233 insertions(+), 101 deletions(-)

diff --git a/backend/src/main/java/nl/contezza/gzac/tezza/autoconfigure/TezzaResourceAutoConfiguration.java b/backend/src/main/java/nl/contezza/gzac/tezza/autoconfigure/TezzaResourceAutoConfiguration.java
index e5accf2..0d01533 100644
--- a/backend/src/main/java/nl/contezza/gzac/tezza/autoconfigure/TezzaResourceAutoConfiguration.java
+++ b/backend/src/main/java/nl/contezza/gzac/tezza/autoconfigure/TezzaResourceAutoConfiguration.java
@@ -16,6 +16,7 @@ import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder;
 import com.ritense.authorization.role.RoleRepository;
 import com.ritense.processdocument.service.ProcessDocumentAssociationService;
 import com.ritense.processlink.service.ProcessLinkActivityService;
+import com.ritense.processlink.service.ProcessLinkService;
 import com.ritense.valtimo.contract.annotation.ProcessBean;
 import com.ritense.valtimo.contract.authentication.UserManagementService;
 import com.ritense.valtimo.jackson.ZonedLocalDateTimeDeserializer;
@@ -60,7 +61,10 @@ public class TezzaResourceAutoConfiguration {
             ZaakInstanceLinkService zaakInstanceLinkService,
             ZaakTypeLinkService zaakTypeLinkService,
             UserManagementService userManagementService,
-            KeycloakService keycloakService) {
+            KeycloakService keycloakService,
+            FormSubmissionService formSubmissionService,
+            ProcessLinkService processLinkService,
+            ProcessDocumentAssociationService processDocumentAssociationService) {
         return new TezzaService(
                 zaakTypeLinkRepository,
                 pluginService,
@@ -68,7 +72,10 @@ public class TezzaResourceAutoConfiguration {
                 documentSearchService,
                 zaakInstanceLinkService,
                 zaakTypeLinkService,
-                userManagementService, keycloakService);
+                userManagementService, keycloakService,
+                formSubmissionService,
+                processLinkService,
+                processDocumentAssociationService);
     }
 
     @Bean
@@ -87,14 +94,12 @@ public class TezzaResourceAutoConfiguration {
             CamundaTaskService camundaTaskService,
             TezzaService tezzaService,
             ProcessLinkActivityService processLinkActivityService,
-            FormSubmissionService formSubmissionService,
             HistoryService historyService) {
         return new TezzaResource(
                 processDocumentAssociationService, camundaProcessService,
                 camundaTaskService,
                 tezzaService,
                 processLinkActivityService,
-                formSubmissionService,
                 historyService);
     }
 
diff --git a/backend/src/main/java/nl/contezza/gzac/tezza/bean/TezzaUploadFileBean.java b/backend/src/main/java/nl/contezza/gzac/tezza/bean/TezzaUploadFileBean.java
index 652e972..6fdd7e6 100644
--- a/backend/src/main/java/nl/contezza/gzac/tezza/bean/TezzaUploadFileBean.java
+++ b/backend/src/main/java/nl/contezza/gzac/tezza/bean/TezzaUploadFileBean.java
@@ -12,6 +12,7 @@ import java.util.stream.Collectors;
 
 import org.alfresco.extension.acs.ApiException;
 import org.alfresco.extension.acs.api.NodesApi;
+import org.alfresco.extension.acs.model.NodeBodyCopy;
 import org.alfresco.extension.acs.model.NodeBodyCreate;
 import org.alfresco.extension.acs.model.NodeBodyMove;
 import org.alfresco.extension.acs.model.NodeBodyUpdate;
@@ -22,6 +23,14 @@ import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.camunda.bpm.engine.impl.pvm.delegate.ActivityExecution;
 
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.node.BooleanNode;
+import com.fasterxml.jackson.databind.node.ObjectNode;
+import com.ritense.processdocument.domain.ProcessDefinitionKey;
+import com.ritense.processdocument.domain.impl.CamundaProcessDefinitionKey;
+
+import nl.contezza.gzac.tezza.domain.FormSubmissionRequest;
 import nl.contezza.gzac.tezza.service.AlfrescoService;
 import nl.contezza.gzac.tezza.service.TezzaService;
 
@@ -56,24 +65,29 @@ public class TezzaUploadFileBean {
     public void updateNodeWithWorkflowIds(ActivityExecution execution) throws ApiException {
         List<String> relatedNodeIds = getStringList(execution, "relatedNodeIds");
         if (relatedNodeIds.size() > 0) {
-            NodesApi api = alfrescoService.getNodesApi();
-            for (String nodeId : relatedNodeIds) {
-                NodeBodyUpdate body = new NodeBodyUpdate();
-
-                NodeEntry node = api.getNode(nodeId, null, null, null);
-                Object propertiesObject = node.getEntry().getProperties();
-                Map<String, Object> properties = null;
-                if (propertiesObject instanceof Map) {
-                    properties = (Map<String, Object>) propertiesObject;
-                    Object workflowIdsObject = properties.get("tza:workflowIds");
-                    List<String> workflowIds = new ArrayList<>();
-                    if (workflowIdsObject instanceof List) {
-                        workflowIds = (List<String>) workflowIdsObject;
+            try {
+                NodesApi api = alfrescoService.getNodesApi();
+                for (String nodeId : relatedNodeIds) {
+                    NodeBodyUpdate body = new NodeBodyUpdate();
+
+                    NodeEntry node = api.getNode(nodeId, null, null, null);
+                    Object propertiesObject = node.getEntry().getProperties();
+                    Map<String, Object> properties = null;
+                    if (propertiesObject instanceof Map) {
+                        properties = (Map<String, Object>) propertiesObject;
+                        Object workflowIdsObject = properties.get("tza:workflowIds");
+                        List<String> workflowIds = new ArrayList<>();
+                        if (workflowIdsObject instanceof List) {
+                            workflowIds = (List<String>) workflowIdsObject;
+                        }
+                        workflowIds.add(execution.getProcessInstanceId());
+                        body.putPropertiesItem("tza:workflowIds", workflowIds);
                     }
-                    workflowIds.add(execution.getProcessInstanceId());
-                    body.putPropertiesItem("tza:workflowIds", workflowIds);
+                    api.updateNode(nodeId, body, null, null);
                 }
-                api.updateNode(nodeId, body, null, null);
+            } catch (ApiException e) {
+                logger.error("updateNodeWithWorkflowIds:" + e.getResponseBody());
+                throw e;
             }
         }
     }
@@ -93,37 +107,43 @@ public class TezzaUploadFileBean {
     public void removeWorkflowId(ActivityExecution execution) throws ApiException {
         List<String> relatedNodeIds = getStringList(execution, "relatedNodeIds");
         if (relatedNodeIds.size() > 0) {
-            NodesApi api = alfrescoService.getNodesApi();
-            for (String nodeId : relatedNodeIds) {
-                NodeBodyUpdate body = new NodeBodyUpdate();
-                NodeEntry node = api.getNode(nodeId, null, null, null);
-                Object propertiesObject = node.getEntry().getProperties();
-
-                if (propertiesObject instanceof Map) {
-                    Map<String, Object> properties = (Map<String, Object>) propertiesObject;
-
-                    // Verwijderen processInstanceId uit workflowIds
-                    Object workflowIdsObject = properties.get("tza:workflowIds");
-                    List<String> workflowIds = new ArrayList<>();
-                    if (workflowIdsObject instanceof List) {
-                        workflowIds = (List<String>) workflowIdsObject;
-                    }
-                    String processInstanceId = execution.getProcessInstanceId();
-                    workflowIds.removeIf(id -> id.equals(processInstanceId));
-                    body.putPropertiesItem("tza:workflowIds", workflowIds);
-
-                    // Toevoegen processInstanceId aan historicWorkfowId
-                    List<String> historicWorkflowIds = new ArrayList<>();
-                    if (properties.containsKey("tza:historicWorkflowIds")) {
-                        Object historicWorkflowIdsObject = properties.get("tza:historicWorkflowIds");
-                        if (historicWorkflowIdsObject instanceof List) {
-                            historicWorkflowIds = (List<String>) historicWorkflowIdsObject;
+            try {
+                NodesApi api = alfrescoService.getNodesApi();
+                for (String nodeId : relatedNodeIds) {
+                    NodeBodyUpdate body = new NodeBodyUpdate();
+                    NodeEntry node = api.getNode(nodeId, null, null, null);
+                    Object propertiesObject = node.getEntry().getProperties();
+
+                    if (propertiesObject instanceof Map) {
+                        Map<String, Object> properties = (Map<String, Object>) propertiesObject;
+
+                        // Verwijderen processInstanceId uit workflowIds
+                        Object workflowIdsObject = properties.get("tza:workflowIds");
+                        List<String> workflowIds = new ArrayList<>();
+                        if (workflowIdsObject instanceof List) {
+                            workflowIds = (List<String>) workflowIdsObject;
                         }
+                        String processInstanceId = execution.getProcessInstanceId();
+                        workflowIds.removeIf(id -> id.equals(processInstanceId));
+                        body.putPropertiesItem("tza:workflowIds", workflowIds);
+
+                        // Toevoegen processInstanceId aan historicWorkfowId
+                        // List<String> historicWorkflowIds = new ArrayList<>();
+                        // if (properties.containsKey("tza:historicWorkflowIds")) {
+                        // Object historicWorkflowIdsObject = properties.get("tza:historicWorkflowIds");
+                        // if (historicWorkflowIdsObject instanceof List) {
+                        // historicWorkflowIds = (List<String>) historicWorkflowIdsObject;
+                        // }
+                        // }
+                        // historicWorkflowIds.add(processInstanceId);
+                        // body.putPropertiesItem("tza:historicWorkflowIds", historicWorkflowIds);
                     }
-                    historicWorkflowIds.add(processInstanceId);
-                    body.putPropertiesItem("tza:historicWorkflowIds", historicWorkflowIds);
+                    api.updateNode(nodeId, body, null, null);
+
                 }
-                api.updateNode(nodeId, body, null, null);
+            } catch (ApiException e) {
+                logger.error(e.getResponseBody());
+                throw e;
             }
         }
     }
@@ -131,11 +151,15 @@ public class TezzaUploadFileBean {
     /**
      * Dit maakt een folder aan in shared, en verplaats alle bestanden aangegeven in
      * relatedNodeIds.
-     * Toegang tot de nieuwe folder wordt alleen gezet voor initiator en
-     * bpm_assignee;
+     * Toegang tot de nieuwe folder wordt alleen gezet voor gebruikers in
+     * workflowUsers;
      * Een list met orginele locaties wordt toegevoegd aan de proces variabelen.
+     * Dit kan ook processen in andere dossier starten, als er gerelateerde dossiers
+     * zijn meegegeven.
      * 
-     * @param execution De excecutie van het proces
+     * @param execution     De excecutie van het proces
+     * @param workflowUsers Een lijst gebvreuiker die toegang krijgt tot de
+     *                      documenten
      * @throws URISyntaxException
      * @throws ApiException
      */
@@ -157,6 +181,12 @@ public class TezzaUploadFileBean {
                 api.moveNode(nodeId, body, null, null);
             }
             execution.setVariable("originalNodes", originalNodes);
+
+            // Check voor gerelateerde dossiers, en start voor elk een nieuw proces op
+            List<String> relatedDossierIds = getStringList(execution, "relatedDossierIds");
+            for (String relatedDosierId : relatedDossierIds) {
+                copyToDossier(execution, relatedDosierId, api);
+            }
         }
     }
 
@@ -178,21 +208,26 @@ public class TezzaUploadFileBean {
             } catch (NoSuchElementException e) {
                 logger.info("No nodeId found within document " + execution.getBusinessKey());
             }
-            NodesApi api = alfrescoService.getNodesApi();
-            for (String nodeId : originalNodes) {
-                String[] nodeArray = nodeId.split(",");
-
-                NodeBodyMove body = new NodeBodyMove();
-                // If there is a nodeId given for the dossier, use that, if not, use the
-                // original nodeId of the file
-                if (originalNodeId != null) {
-                    body.setTargetParentId(originalNodeId);
-                } else {
-                    body.setTargetParentId(nodeArray[1]);
+            try {
+                NodesApi api = alfrescoService.getNodesApi();
+                for (String nodeId : originalNodes) {
+                    String[] nodeArray = nodeId.split(",");
+
+                    NodeBodyMove body = new NodeBodyMove();
+                    // If there is a nodeId given for the dossier, use that, if not, use the
+                    // original nodeId of the file
+                    if (originalNodeId != null) {
+                        body.setTargetParentId(originalNodeId);
+                    } else {
+                        body.setTargetParentId(nodeArray[1]);
+                    }
+                    api.moveNode(nodeArray[0], body, null, null);
                 }
-                api.moveNode(nodeArray[0], body, null, null);
+                api.deleteNode((String) execution.getVariable("documentFolderId"), true);
+            } catch (ApiException e) {
+                logger.error(e.getResponseBody());
+                throw e;
             }
-            api.deleteNode((String) execution.getVariable("documentFolderId"), true);
         }
     }
 
@@ -380,4 +415,61 @@ public class TezzaUploadFileBean {
         }
         return null; // Return null if the UUID can't be found
     }
+
+    /**
+     * Deze functie start een documentToevoegen proces in een nieuw dossier, met een
+     * kopie van de orginele documenten.
+     * 
+     * @param execution        De excecutie van het proce
+     * @param relatedDossierId Het ID van het gerelateerde dossier in Alfresco
+     * @param api              Een instantie van de NodesApi voor Alfresco
+     * @throws ApiException
+     */
+    private void copyToDossier(ActivityExecution execution, String relatedDossierId, NodesApi api)
+            throws ApiException {
+        List<String> relatedNodeIds = getStringList(execution, "relatedNodeIds");
+        List<String> copiedNodeIds = new ArrayList<>();
+
+        // Kopieer bijgevoegde documenten naar nieuw dossier in Alfresco
+        for (String nodeId : relatedNodeIds) {
+            NodeEntry node = api.getNode(nodeId, null, null, null);
+
+            NodeBodyCopy nodeBodyCopy = new NodeBodyCopy();
+            nodeBodyCopy.setName(node.getEntry().getName());
+            nodeBodyCopy.setTargetParentId(relatedDossierId);
+            NodeEntry copiedNode = api.copyNode(nodeId, nodeBodyCopy, null, null);
+            copiedNodeIds.add(copiedNode.getEntry().getId());
+        }
+
+        // Start nieuw proces in gerelateerd dossier, met gekopieerde documenten
+        JsonNode submission = createProcessToevoegenSubmission(execution);
+        FormSubmissionRequest request = new FormSubmissionRequest("tezzaAlgemeen", null, null, copiedNodeIds,
+                submission);
+        ProcessDefinitionKey processDefinitionKey = ProcessDefinitionKey.fromExecution(execution,
+                CamundaProcessDefinitionKey.class);
+
+        tezzaService.startProcess(relatedDossierId, processDefinitionKey, request);
+    }
+
+    private JsonNode createProcessToevoegenSubmission(ActivityExecution execution) {
+        // TODO hardcoded waardes verplaatsen naar static variables, afronding van
+        // ticket #29141 nodig
+        ObjectMapper objectMapper = new ObjectMapper();
+
+        // Create "pv" node
+        ObjectNode pvNode = objectMapper.createObjectNode();
+        pvNode.put("workflowDescription", (String) execution.getVariable("workflowDescription"));
+        pvNode.put("documentBeheerder", (String) execution.getVariable("documentBeheerder"));
+        pvNode.put("documentReviewer", (String) execution.getVariable("documentReviewer"));
+        pvNode.put("workflowDueDate", (String) execution.getVariable("workflowDueDate"));
+        pvNode.put("workflowPriority", (int) execution.getVariable("workflowPriority"));
+        pvNode.put("sendEmailNotifications", (Boolean) execution.getVariable("sendEmailNotifications"));
+
+        // Create root node
+        ObjectNode rootNode = objectMapper.createObjectNode();
+        rootNode.set("pv", pvNode);
+        rootNode.set("submit", BooleanNode.TRUE);
+        JsonNode submission = rootNode;
+        return submission;
+    }
 }
diff --git a/backend/src/main/java/nl/contezza/gzac/tezza/service/TezzaService.java b/backend/src/main/java/nl/contezza/gzac/tezza/service/TezzaService.java
index a4f03f1..127865e 100644
--- a/backend/src/main/java/nl/contezza/gzac/tezza/service/TezzaService.java
+++ b/backend/src/main/java/nl/contezza/gzac/tezza/service/TezzaService.java
@@ -1,13 +1,18 @@
 package nl.contezza.gzac.tezza.service;
 
 import com.fasterxml.jackson.core.JsonPointer;
+import com.fasterxml.jackson.databind.JsonNode;
 import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.node.ArrayNode;
+import com.fasterxml.jackson.databind.node.ObjectNode;
 import com.ritense.document.domain.Document;
 import com.ritense.document.domain.impl.request.NewDocumentRequest;
 import com.ritense.document.service.DocumentSearchService;
 import com.ritense.document.service.DocumentService;
 import com.ritense.document.service.impl.SearchCriteria;
 import com.ritense.document.service.impl.SearchRequest;
+import com.ritense.form.service.FormSubmissionService;
+import com.ritense.form.web.rest.dto.FormSubmissionResult;
 import com.ritense.objecttypenapi.ObjecttypenApiPlugin;
 import com.ritense.objecttypenapi.client.Objecttype;
 import com.ritense.zakenapi.domain.ZaakTypeLink;
@@ -15,6 +20,12 @@ import com.ritense.zakenapi.service.ZaakTypeLinkService;
 import com.ritense.plugin.domain.PluginConfiguration;
 import com.ritense.plugin.service.PluginConfigurationSearchParameters;
 import com.ritense.plugin.service.PluginService;
+import com.ritense.processdocument.domain.ProcessDefinitionKey;
+import com.ritense.processdocument.domain.impl.CamundaProcessJsonSchemaDocumentDefinition;
+import com.ritense.processdocument.service.ProcessDocumentAssociationService;
+import com.ritense.processlink.domain.ActivityTypeWithEventName;
+import com.ritense.processlink.domain.ProcessLink;
+import com.ritense.processlink.service.ProcessLinkService;
 import com.ritense.valtimo.contract.authentication.ManageableUser;
 import com.ritense.valtimo.contract.authentication.UserManagementService;
 import com.ritense.zakenapi.link.ZaakInstanceLinkService;
@@ -22,6 +33,7 @@ import com.ritense.zakenapi.link.ZaakInstanceLinkService;
 import com.valtimo.keycloak.service.KeycloakService;
 
 import nl.contezza.gzac.tezza.TezzaPlugin;
+import nl.contezza.gzac.tezza.domain.FormSubmissionRequest;
 import nl.contezza.gzac.tezza.domain.TezzaNode;
 import nl.contezza.gzac.tezza.repository.CustomZaakTypeLinkRepository;
 
@@ -58,6 +70,9 @@ public class TezzaService {
     private final ZaakTypeLinkService zaakTypeLinkService;
     private final UserManagementService userManagementService;
     private final KeycloakService keycloakService;
+    private final FormSubmissionService formSubmissionService;
+    private final ProcessLinkService processLinkService;
+    private final ProcessDocumentAssociationService processDocumentAssociationService;
 
     private TezzaPlugin tezzaPlugin;
 
@@ -67,7 +82,10 @@ public class TezzaService {
             ZaakInstanceLinkService zaakInstanceLinkService,
             ZaakTypeLinkService zaakTypeLinkService,
             UserManagementService userManagementService,
-            KeycloakService keycloakService) {
+            KeycloakService keycloakService,
+            FormSubmissionService formSubmissionService,
+            ProcessLinkService processLinkService,
+            ProcessDocumentAssociationService processDocumentAssociationService) {
         this.zaakTypeLinkRepository = zaakTypeLinkRepository;
         this.pluginService = pluginService;
         this.documentService = documentService;
@@ -76,6 +94,9 @@ public class TezzaService {
         this.zaakTypeLinkService = zaakTypeLinkService;
         this.userManagementService = userManagementService;
         this.keycloakService = keycloakService;
+        this.formSubmissionService = formSubmissionService;
+        this.processLinkService = processLinkService;
+        this.processDocumentAssociationService = processDocumentAssociationService;
     }
 
     public List<ZaakTypeLink> findDossierDefinitionsByZaakTypeUrl(URI zaakTypeUrl) {
@@ -257,4 +278,51 @@ public class TezzaService {
                 .createInstance(pluginConfigurations.get(0).getId());
         return plugin.getObjecttype(new URI(objecttypeUrl));
     }
+
+    public FormSubmissionResult formSubmission(
+            String nodeId,
+            UUID processLinkId,
+            FormSubmissionRequest request) {
+        Document document = findOrCreateDocument(nodeId, request.getDocumentDefinitionName());
+        handleZaakInstanceLink(request.getDocumentDefinitionName(), request.getZaakUrl(),
+                request.getZaaktypeUrl(), document);
+        JsonNode submission = request.getSubmission();
+
+        // Voeg relatedNodeIds toe aan submission data
+        List<String> relatedNodeIds = request.getRelatedNodeIds();
+        if (relatedNodeIds != null && !relatedNodeIds.isEmpty()) {
+            ObjectNode submissionObject = (ObjectNode) submission;
+            if (!submissionObject.has("pv")) {
+                submissionObject.putObject("pv").putArray("relatedNodeIds");
+            }
+            ObjectNode pvNode = (ObjectNode) submissionObject.path("pv");
+            ArrayNode relatedNodeIdsArray = pvNode.has("relatedNodeIds")
+                    && pvNode.get("relatedNodeIds").isArray()
+                            ? (ArrayNode) pvNode.get("relatedNodeIds")
+                            : pvNode
+                                    .putArray("relatedNodeIds");
+            for (String relatedNodeId : relatedNodeIds) {
+                relatedNodeIdsArray.add(relatedNodeId);
+            }
+        }
+
+        return formSubmissionService.handleSubmission(
+                processLinkId,
+                submission,
+                null,
+                document.id().getId().toString(),
+                null);
+    }
+
+    public void startProcess(String nodeId, ProcessDefinitionKey processDefinitionKey, FormSubmissionRequest request) {
+        CamundaProcessJsonSchemaDocumentDefinition processDocumentDefinition = (CamundaProcessJsonSchemaDocumentDefinition) processDocumentAssociationService
+                .getProcessDocumentDefinition(processDefinitionKey);
+
+        ProcessLink processLink = processLinkService.getProcessLinksByProcessDefinitionIdAndActivityType(
+                processDocumentDefinition.getLatestVersionId(),
+                ActivityTypeWithEventName.START_EVENT_START);
+
+        formSubmission(nodeId, processLink.getId(), request);
+
+    }
 }
\ No newline at end of file
diff --git a/backend/src/main/java/nl/contezza/gzac/tezza/web/rest/TezzaResource.java b/backend/src/main/java/nl/contezza/gzac/tezza/web/rest/TezzaResource.java
index 2190da7..cb2dc96 100644
--- a/backend/src/main/java/nl/contezza/gzac/tezza/web/rest/TezzaResource.java
+++ b/backend/src/main/java/nl/contezza/gzac/tezza/web/rest/TezzaResource.java
@@ -30,13 +30,9 @@ import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.RestController;
 
-import com.fasterxml.jackson.databind.JsonNode;
-import com.fasterxml.jackson.databind.node.ArrayNode;
-import com.fasterxml.jackson.databind.node.ObjectNode;
 import com.ritense.authorization.AuthorizationContext;
 import com.ritense.document.domain.Document;
 import com.ritense.document.domain.impl.JsonSchemaDocumentId;
-import com.ritense.form.service.FormSubmissionService;
 import com.ritense.form.web.rest.dto.FormSubmissionResult;
 import com.ritense.zakenapi.domain.ZaakTypeLink;
 import com.ritense.processdocument.domain.ProcessDocumentDefinition;
@@ -62,7 +58,6 @@ public class TezzaResource {
     private final CamundaTaskService camundaTaskService;
     private final TezzaService tezzaService;
     private final ProcessLinkActivityService processLinkActivityService;
-    private final FormSubmissionService formSubmissionService;
     private final HistoryService historyService;
 
     private static final String GENERAL_DOSSIER_DEFINITION = "tezzaAlgemeen";
@@ -76,14 +71,12 @@ public class TezzaResource {
             CamundaTaskService camundaTaskService,
             TezzaService tezzaService,
             ProcessLinkActivityService processLinkActivityService,
-            FormSubmissionService formSubmissionService,
             HistoryService historyService) {
         this.processDocumentAssociationService = processDocumentAssociationService;
         this.camundaProcessService = camundaProcessService;
         this.camundaTaskService = camundaTaskService;
         this.tezzaService = tezzaService;
         this.processLinkActivityService = processLinkActivityService;
-        this.formSubmissionService = formSubmissionService;
         this.historyService = historyService;
     }
 
@@ -167,37 +160,11 @@ public class TezzaResource {
         Document document = tezzaService.findOrCreateDocument(nodeId, request.getDocumentDefinitionName());
         tezzaService.handleZaakInstanceLink(request.getDocumentDefinitionName(), request.getZaakUrl(),
                 request.getZaaktypeUrl(), document);
-        JsonNode submission = request.getSubmission();
+        FormSubmissionResult result = tezzaService.formSubmission(nodeId, processLinkId, request);
 
-        // Voeg relatedNodeIds toe aan submission data
-        List<String> relatedNodeIds = request.getRelatedNodeIds();
-        if (relatedNodeIds != null && !relatedNodeIds.isEmpty()) {
-            ObjectNode submissionObject = (ObjectNode) submission;
-            if (!submissionObject.has("pv")) {
-                submissionObject.putObject("pv").putArray("relatedNodeIds");
-            }
-            ObjectNode pvNode = (ObjectNode) submissionObject.path("pv");
-            ArrayNode relatedNodeIdsArray = pvNode.has("relatedNodeIds")
-                    && pvNode.get("relatedNodeIds").isArray()
-                            ? (ArrayNode) pvNode.get("relatedNodeIds")
-                            : pvNode
-                                    .putArray("relatedNodeIds");
-            for (String relatedNodeId : relatedNodeIds) {
-                relatedNodeIdsArray.add(relatedNodeId);
-            }
-        }
-
-        FormSubmissionResult result = formSubmissionService.handleSubmission(
-                processLinkId,
-                submission,
-                null,
-                document.id().getId().toString(),
-                null);
-
-        // val httpStatus = if (result!!.errors().isEmpty()) HttpStatus.OK else
-        // HttpStatus.BAD_REQUEST
         if (!result.errors().isEmpty()) {
-            return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(new TezzaFormSubmissionResult(result, null));
+            return ResponseEntity.status(HttpStatus.BAD_REQUEST)
+                    .body(new TezzaFormSubmissionResult(result, null));
         }
 
         // Haal de processInstance van het laaste proces dat is gestart door de
-- 
GitLab


From 123c649865d4bde0c7d890dc7461b97fb2a5f0a5 Mon Sep 17 00:00:00 2001
From: Erik Hoogland <erik.hoogland@contezza.nl>
Date: Tue, 5 Nov 2024 17:24:16 +0100
Subject: [PATCH 2/9] Update formatting

---
 .../tezzaAlgemeen/bpmn/documentToevoegen.bpmn | 289 +++++++++++-------
 1 file changed, 173 insertions(+), 116 deletions(-)

diff --git a/backend/projects/tezzaAlgemeen/bpmn/documentToevoegen.bpmn b/backend/projects/tezzaAlgemeen/bpmn/documentToevoegen.bpmn
index c477e6e..7748456 100644
--- a/backend/projects/tezzaAlgemeen/bpmn/documentToevoegen.bpmn
+++ b/backend/projects/tezzaAlgemeen/bpmn/documentToevoegen.bpmn
@@ -1,47 +1,71 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<bpmn:definitions xmlns:bpmn="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:bioc="http://bpmn.io/schema/bpmn/biocolor/1.0" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:camunda="http://camunda.org/schema/1.0/bpmn" xmlns:dc="http://www.omg.org/spec/DD/20100524/DC" xmlns:di="http://www.omg.org/spec/DD/20100524/DI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:color="http://www.omg.org/spec/BPMN/non-normative/color/1.0" xmlns:modeler="http://camunda.org/schema/modeler/1.0" id="Definitions_0k641ll" targetNamespace="http://bpmn.io/schema/bpmn" exporter="Camunda Modeler" exporterVersion="5.24.0" modeler:executionPlatform="Camunda Platform" modeler:executionPlatformVersion="7.19.0">
+<bpmn:definitions xmlns:bpmn="http://www.omg.org/spec/BPMN/20100524/MODEL"
+  xmlns:bioc="http://bpmn.io/schema/bpmn/biocolor/1.0"
+  xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI"
+  xmlns:camunda="http://camunda.org/schema/1.0/bpmn"
+  xmlns:dc="http://www.omg.org/spec/DD/20100524/DC"
+  xmlns:di="http://www.omg.org/spec/DD/20100524/DI"
+  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+  xmlns:color="http://www.omg.org/spec/BPMN/non-normative/color/1.0"
+  xmlns:modeler="http://camunda.org/schema/modeler/1.0" id="Definitions_0k641ll"
+  targetNamespace="http://bpmn.io/schema/bpmn" exporter="Camunda Modeler" exporterVersion="5.24.0"
+  modeler:executionPlatform="Camunda Platform" modeler:executionPlatformVersion="7.19.0">
   <bpmn:collaboration id="Collaboration_1utmn3u" isClosed="false">
-    <bpmn:participant id="Participant_0k8485l" name="Document Toevoegen" processRef="documentToevoegen" />
+    <bpmn:participant id="Participant_0k8485l" name="Document Toevoegen"
+      processRef="documentToevoegen" />
     <bpmn:textAnnotation id="TextAnnotation_0vwtvmv">
       <bpmn:text>Deze taak zal het document uit het objectdossier plaatsen, en een gedeelde map voor
         de betrokkenen. Dit is een automatische systeem taak.</bpmn:text>
     </bpmn:textAnnotation>
     <bpmn:textAnnotation id="TextAnnotation_1nyaeic">
-      <bpmn:text>Deze taak geeft de Specialist de mogelijkheid de metadata van het document aan te passen of te corrigeren, o.a. vertrouwelijkheid. Doorzetten naar documentbeheerder voor afronding.</bpmn:text>
+      <bpmn:text>Deze taak geeft de Specialist de mogelijkheid de metadata van het document aan te
+        passen of te corrigeren, o.a. vertrouwelijkheid. Doorzetten naar documentbeheerder voor
+        afronding.</bpmn:text>
     </bpmn:textAnnotation>
     <bpmn:textAnnotation id="TextAnnotation_11mtxwx">
-      <bpmn:text>Indien metadata niet goed ingevuld is hier een mogelijkheid om document terug te sturen naar de aanbieder.
-Check of document uberhaupt in het dossier hoort, indien Nee dan proces afbreken en melding terug naar aanbieder.
-Mogelijkheid tot toevoegen restant metadata.
-Indien correct, doorzetten naar goedkeurder voor afronding</bpmn:text>
+      <bpmn:text>Indien metadata niet goed ingevuld is hier een mogelijkheid om document terug te
+        sturen naar de aanbieder.
+        Check of document uberhaupt in het dossier hoort, indien Nee dan proces afbreken en melding
+        terug naar aanbieder.
+        Mogelijkheid tot toevoegen restant metadata.
+        Indien correct, doorzetten naar goedkeurder voor afronding</bpmn:text>
     </bpmn:textAnnotation>
-    <bpmn:association id="Association_0rgvcu6" associationDirection="None" sourceRef="System_Verplaats" targetRef="TextAnnotation_0vwtvmv" />
-    <bpmn:association id="Association_1gd62l9" associationDirection="None" sourceRef="Activity_Corrigeren" targetRef="TextAnnotation_1nyaeic" />
-    <bpmn:association id="Association_1gqnp5t" associationDirection="None" sourceRef="Activity_BeoordelenAanvullen" targetRef="TextAnnotation_11mtxwx" />
+    <bpmn:association id="Association_0rgvcu6" associationDirection="None"
+      sourceRef="System_Verplaats" targetRef="TextAnnotation_0vwtvmv" />
+    <bpmn:association id="Association_1gd62l9" associationDirection="None"
+      sourceRef="Activity_Corrigeren" targetRef="TextAnnotation_1nyaeic" />
+    <bpmn:association id="Association_1gqnp5t" associationDirection="None"
+      sourceRef="Activity_BeoordelenAanvullen" targetRef="TextAnnotation_11mtxwx" />
     <bpmn:textAnnotation id="TextAnnotation_15azulp">
       <bpmn:text>Document wordt aangeboden voor 'acceptatie'.
-Indien niet akkoord dan stuurt de verantwoordelijk terug naar de documentbeheerder.
-Indien akkoord, Document definitief in tDMS</bpmn:text>
+        Indien niet akkoord dan stuurt de verantwoordelijk terug naar de documentbeheerder.
+        Indien akkoord, Document definitief in tDMS</bpmn:text>
     </bpmn:textAnnotation>
-    <bpmn:association id="Association_0l2ll8x" associationDirection="None" sourceRef="Activity_Goedkeuring" targetRef="TextAnnotation_15azulp" />
+    <bpmn:association id="Association_0l2ll8x" associationDirection="None"
+      sourceRef="Activity_Goedkeuring" targetRef="TextAnnotation_15azulp" />
     <bpmn:textAnnotation id="TextAnnotation_1j0a1go">
       <bpmn:text>Hier wordt het document teruggeplaatst in het objectdossier, en wordt de gedeelde
         map verwijderd. Het document is dan toegankelijk voor alle rechthebbende van het
         objectdossier. Dit is een automatische systeem taak.</bpmn:text>
     </bpmn:textAnnotation>
-    <bpmn:association id="Association_11uwvb7" associationDirection="None" sourceRef="Activity_0faxr8f" targetRef="TextAnnotation_1j0a1go" />
+    <bpmn:association id="Association_11uwvb7" associationDirection="None"
+      sourceRef="Activity_0faxr8f" targetRef="TextAnnotation_1j0a1go" />
     <bpmn:textAnnotation id="TextAnnotation_1p298nv">
       <bpmn:text>Aanbieder zoekt/selecteerd van juiste dossier (object) en start dit proces.
-Aanbieder sleept of plaatst of kopieert document vanaf locatie.
-Hier worden ook de personen van de rollen Document beheerder en Goedkeurder gekozen.</bpmn:text>
+        Aanbieder sleept of plaatst of kopieert document vanaf locatie.
+        Hier worden ook de personen van de rollen Document beheerder en Goedkeurder gekozen.</bpmn:text>
     </bpmn:textAnnotation>
-    <bpmn:association id="Association_1i9iyn5" associationDirection="None" sourceRef="StartEvent_1" targetRef="TextAnnotation_1p298nv" />
+    <bpmn:association id="Association_1i9iyn5" associationDirection="None" sourceRef="StartEvent_1"
+      targetRef="TextAnnotation_1p298nv" />
     <bpmn:textAnnotation id="TextAnnotation_09hzhyv">
-      <bpmn:text>Indien het document is afgekeurd, wordt het document verwijderd door het systeem. Dit document zal nog wel terug te vinden zijn in de prullenbak, tot deze wordt geleegd.</bpmn:text>
+      <bpmn:text>Indien het document is afgekeurd, wordt het document verwijderd door het systeem.
+        Dit document zal nog wel terug te vinden zijn in de prullenbak, tot deze wordt geleegd.</bpmn:text>
     </bpmn:textAnnotation>
-    <bpmn:association id="Association_0o8wfbk" associationDirection="None" sourceRef="Systeem_Verwijder" targetRef="TextAnnotation_09hzhyv" />
+    <bpmn:association id="Association_0o8wfbk" associationDirection="None"
+      sourceRef="Systeem_Verwijder" targetRef="TextAnnotation_09hzhyv" />
   </bpmn:collaboration>
-  <bpmn:process id="documentToevoegen" name="Document Toevoegen" processType="None" isClosed="false" isExecutable="true">
+  <bpmn:process id="documentToevoegen" name="Document Toevoegen" processType="None" isClosed="false"
+    isExecutable="true">
     <bpmn:laneSet id="LaneSet_0ghcgsr">
       <bpmn:lane id="Lane_0gg35cm" name="Goedkeurder">
         <bpmn:flowNodeRef>Gateway_Goedkeuring</bpmn:flowNodeRef>
@@ -61,7 +85,9 @@ Hier worden ook de personen van de rollen Document beheerder en Goedkeurder geko
         <bpmn:flowNodeRef>Activity_Corrigeren</bpmn:flowNodeRef>
       </bpmn:lane>
     </bpmn:laneSet>
-    <bpmn:serviceTask id="System_Verplaats" name="Document verplaatsen" implementation="##WebService" camunda:expression="${tezzaUploadFileBean.moveNode(execution, workflowUsers)}">
+    <bpmn:serviceTask id="System_Verplaats" name="Document verplaatsen"
+      implementation="##WebService"
+      camunda:expression="${tezzaUploadFileBean.moveNode(execution, workflowUsers)}">
       <bpmn:extensionElements>
         <camunda:executionListener event="start">
           <camunda:script scriptFormat="JavaScript">var ArrayList =
@@ -76,7 +102,8 @@ Hier worden ook de personen van de rollen Document beheerder en Goedkeurder geko
       <bpmn:incoming>Flow_0fbcwbp</bpmn:incoming>
       <bpmn:outgoing>Flow_1yua9gv</bpmn:outgoing>
     </bpmn:serviceTask>
-    <bpmn:exclusiveGateway id="Gateway_MetadataGevult" name="Metadata volledig?" default="Flow_Correctie">
+    <bpmn:exclusiveGateway id="Gateway_MetadataGevult" name="Metadata volledig?"
+      default="Flow_Correctie">
       <bpmn:incoming>Flow_0wh24tv</bpmn:incoming>
       <bpmn:outgoing>Flow_Volledig</bpmn:outgoing>
       <bpmn:outgoing>Flow_Correctie</bpmn:outgoing>
@@ -89,22 +116,28 @@ Hier worden ook de personen van de rollen Document beheerder en Goedkeurder geko
       </bpmn:extensionElements>
       <bpmn:outgoing>Flow_0fbcwbp</bpmn:outgoing>
     </bpmn:startEvent>
-    <bpmn:exclusiveGateway id="Gateway_Goedkeuring" name="Document Goedgekeurd?" default="Flow_Afgekeurd">
+    <bpmn:exclusiveGateway id="Gateway_Goedkeuring" name="Document Goedgekeurd?"
+      default="Flow_Afgekeurd">
       <bpmn:incoming>Flow_052zkgn</bpmn:incoming>
       <bpmn:outgoing>Flow_Goedgekeurd</bpmn:outgoing>
       <bpmn:outgoing>Flow_Afgekeurd</bpmn:outgoing>
     </bpmn:exclusiveGateway>
-    <bpmn:serviceTask id="Activity_0faxr8f" name="Document terugplaatsen" implementation="##WebService" camunda:expression="${tezzaUploadFileBean.restoreNodes(execution)}">
+    <bpmn:serviceTask id="Activity_0faxr8f" name="Document terugplaatsen"
+      implementation="##WebService"
+      camunda:expression="${tezzaUploadFileBean.restoreNodes(execution)}">
       <bpmn:incoming>Flow_Goedgekeurd</bpmn:incoming>
       <bpmn:outgoing>Flow_0c0my00</bpmn:outgoing>
     </bpmn:serviceTask>
     <bpmn:endEvent id="Event_0cwn98c">
       <bpmn:extensionElements>
-        <camunda:executionListener expression="${tezzaUploadFileBean.removeWorkflowId(execution)}" event="start" />
+        <camunda:executionListener expression="${tezzaUploadFileBean.removeWorkflowId(execution)}"
+          event="start" />
       </bpmn:extensionElements>
       <bpmn:incoming>Flow_0c0my00</bpmn:incoming>
     </bpmn:endEvent>
-    <bpmn:userTask id="Activity_Goedkeuring" name="Goedkeuring en afronding" implementation="##unspecified" camunda:assignee="${documentReviewer}" camunda:candidateGroups="ROLE_USER" camunda:dueDate="${workflowDueDate}">
+    <bpmn:userTask id="Activity_Goedkeuring" name="Goedkeuring en afronding"
+      implementation="##unspecified" camunda:assignee="${documentReviewer}"
+      camunda:candidateGroups="ROLE_USER" camunda:dueDate="${workflowDueDate}">
       <bpmn:extensionElements>
         <camunda:taskListener event="create">
           <camunda:script scriptFormat="JavaScript">if (typeof workflowDescription !=
@@ -120,7 +153,9 @@ Hier worden ook de personen van de rollen Document beheerder en Goedkeurder geko
       <bpmn:incoming>Flow_Volledig</bpmn:incoming>
       <bpmn:outgoing>Flow_052zkgn</bpmn:outgoing>
     </bpmn:userTask>
-    <bpmn:userTask id="Activity_Corrigeren" name="Corrigeren Metadata" implementation="##unspecified" camunda:assignee="${initiator}" camunda:candidateGroups="ROLE_USER" camunda:dueDate="${workflowDueDate}">
+    <bpmn:userTask id="Activity_Corrigeren" name="Corrigeren Metadata"
+      implementation="##unspecified" camunda:assignee="${initiator}"
+      camunda:candidateGroups="ROLE_USER" camunda:dueDate="${workflowDueDate}">
       <bpmn:extensionElements>
         <camunda:taskListener event="create">
           <camunda:script scriptFormat="JavaScript">if (typeof workflowDescription !=
@@ -136,7 +171,9 @@ Hier worden ook de personen van de rollen Document beheerder en Goedkeurder geko
       <bpmn:incoming>Flow_1yua9gv</bpmn:incoming>
       <bpmn:outgoing>Flow_182hkx9</bpmn:outgoing>
     </bpmn:userTask>
-    <bpmn:userTask id="Activity_BeoordelenAanvullen" name="Beoordelen &#38; aanvullen metadata" implementation="##unspecified" camunda:assignee="${documentBeheerder}" camunda:candidateGroups="ROLE_USER" camunda:dueDate="${workflowDueDate}">
+    <bpmn:userTask id="Activity_BeoordelenAanvullen" name="Beoordelen &#38; aanvullen metadata"
+      implementation="##unspecified" camunda:assignee="${documentBeheerder}"
+      camunda:candidateGroups="ROLE_USER" camunda:dueDate="${workflowDueDate}">
       <bpmn:extensionElements>
         <camunda:taskListener event="create">
           <camunda:script scriptFormat="JavaScript">if (typeof workflowDescription !=
@@ -163,22 +200,31 @@ Hier worden ook de personen van de rollen Document beheerder en Goedkeurder geko
       <bpmn:outgoing>Flow_0wh24tv</bpmn:outgoing>
     </bpmn:userTask>
     <bpmn:sequenceFlow id="Flow_0fbcwbp" sourceRef="StartEvent_1" targetRef="System_Verplaats" />
-    <bpmn:sequenceFlow id="Flow_1yua9gv" sourceRef="System_Verplaats" targetRef="Activity_Corrigeren" />
-    <bpmn:sequenceFlow id="Flow_0wh24tv" sourceRef="Activity_BeoordelenAanvullen" targetRef="Gateway_MetadataGevult" />
-    <bpmn:sequenceFlow id="Flow_Volledig" name="Volledig" sourceRef="Gateway_MetadataGevult" targetRef="Activity_Goedkeuring">
+    <bpmn:sequenceFlow id="Flow_1yua9gv" sourceRef="System_Verplaats"
+      targetRef="Activity_Corrigeren" />
+    <bpmn:sequenceFlow id="Flow_0wh24tv" sourceRef="Activity_BeoordelenAanvullen"
+      targetRef="Gateway_MetadataGevult" />
+    <bpmn:sequenceFlow id="Flow_Volledig" name="Volledig" sourceRef="Gateway_MetadataGevult"
+      targetRef="Activity_Goedkeuring">
       <bpmn:conditionExpression xsi:type="bpmn:tFormalExpression">${outcomeDocumentBeheerder ==
         'Approve'}</bpmn:conditionExpression>
     </bpmn:sequenceFlow>
-    <bpmn:sequenceFlow id="Flow_Correctie" name="Correctie/aanvulling" sourceRef="Gateway_MetadataGevult" targetRef="Activity_Corrigeren" />
-    <bpmn:sequenceFlow id="Flow_052zkgn" sourceRef="Activity_Goedkeuring" targetRef="Gateway_Goedkeuring" />
-    <bpmn:sequenceFlow id="Flow_Goedgekeurd" name="Goedgekeurd" sourceRef="Gateway_Goedkeuring" targetRef="Activity_0faxr8f">
+    <bpmn:sequenceFlow id="Flow_Correctie" name="Correctie/aanvulling"
+      sourceRef="Gateway_MetadataGevult" targetRef="Activity_Corrigeren" />
+    <bpmn:sequenceFlow id="Flow_052zkgn" sourceRef="Activity_Goedkeuring"
+      targetRef="Gateway_Goedkeuring" />
+    <bpmn:sequenceFlow id="Flow_Goedgekeurd" name="Goedgekeurd" sourceRef="Gateway_Goedkeuring"
+      targetRef="Activity_0faxr8f">
       <bpmn:conditionExpression xsi:type="bpmn:tFormalExpression">${outcomeDocumentReviewer ==
         'Approve'}</bpmn:conditionExpression>
     </bpmn:sequenceFlow>
-    <bpmn:sequenceFlow id="Flow_Afgekeurd" name="Afgekeurd" sourceRef="Gateway_Goedkeuring" targetRef="Activity_BeoordelenAanvullen" />
+    <bpmn:sequenceFlow id="Flow_Afgekeurd" name="Afgekeurd" sourceRef="Gateway_Goedkeuring"
+      targetRef="Activity_BeoordelenAanvullen" />
     <bpmn:sequenceFlow id="Flow_0c0my00" sourceRef="Activity_0faxr8f" targetRef="Event_0cwn98c" />
-    <bpmn:sequenceFlow id="Flow_182hkx9" sourceRef="Activity_Corrigeren" targetRef="Activity_BeoordelenAanvullen" />
-    <bpmn:sequenceFlow id="Flow_1nv3atg" sourceRef="Gateway_MetadataGevult" targetRef="Systeem_Verwijder">
+    <bpmn:sequenceFlow id="Flow_182hkx9" sourceRef="Activity_Corrigeren"
+      targetRef="Activity_BeoordelenAanvullen" />
+    <bpmn:sequenceFlow id="Flow_1nv3atg" sourceRef="Gateway_MetadataGevult"
+      targetRef="Systeem_Verwijder">
       <bpmn:conditionExpression xsi:type="bpmn:tFormalExpression">${outcomeDocumentBeheerder ==
         'Cancel'}</bpmn:conditionExpression>
     </bpmn:sequenceFlow>
@@ -186,33 +232,106 @@ Hier worden ook de personen van de rollen Document beheerder en Goedkeurder geko
       <bpmn:incoming>Flow_1e0rwbr</bpmn:incoming>
     </bpmn:endEvent>
     <bpmn:sequenceFlow id="Flow_1e0rwbr" sourceRef="Systeem_Verwijder" targetRef="Event_0r526j8" />
-    <bpmn:serviceTask id="Systeem_Verwijder" name="Document verwijderen" implementation="##WebService" camunda:expression="${tezzaUploadFileBean.deleteNodes(execution)}">
+    <bpmn:serviceTask id="Systeem_Verwijder" name="Document verwijderen"
+      implementation="##WebService"
+      camunda:expression="${tezzaUploadFileBean.deleteNodes(execution)}">
       <bpmn:incoming>Flow_1nv3atg</bpmn:incoming>
       <bpmn:outgoing>Flow_1e0rwbr</bpmn:outgoing>
     </bpmn:serviceTask>
   </bpmn:process>
   <bpmndi:BPMNDiagram id="BPMNDiagram_1">
     <bpmndi:BPMNPlane id="BPMNPlane_1" bpmnElement="Collaboration_1utmn3u">
-      <bpmndi:BPMNShape id="Participant_0k8485l_di" bpmnElement="Participant_0k8485l" isHorizontal="true">
+      <bpmndi:BPMNShape id="Participant_0k8485l_di" bpmnElement="Participant_0k8485l"
+        isHorizontal="true">
         <dc:Bounds x="129" y="187" width="969" height="433" />
         <bpmndi:BPMNLabel />
       </bpmndi:BPMNShape>
-      <bpmndi:BPMNShape id="Lane_16e6ro1_di" bpmnElement="Lane_16e6ro1" isHorizontal="true" bioc:stroke="#0d4372" bioc:fill="#bbdefb" color:background-color="#bbdefb" color:border-color="#0d4372">
+      <bpmndi:BPMNShape id="Lane_16e6ro1_di" bpmnElement="Lane_16e6ro1" isHorizontal="true"
+        bioc:stroke="#0d4372" bioc:fill="#bbdefb" color:background-color="#bbdefb"
+        color:border-color="#0d4372">
         <dc:Bounds x="159" y="187" width="939" height="113" />
         <bpmndi:BPMNLabel />
       </bpmndi:BPMNShape>
-      <bpmndi:BPMNShape id="Lane_1i6drtn_di" bpmnElement="Lane_1i6drtn" isHorizontal="true" bioc:stroke="#6b3c00" bioc:fill="#ffe0b2" color:background-color="#ffe0b2" color:border-color="#6b3c00">
+      <bpmndi:BPMNShape id="Lane_1i6drtn_di" bpmnElement="Lane_1i6drtn" isHorizontal="true"
+        bioc:stroke="#6b3c00" bioc:fill="#ffe0b2" color:background-color="#ffe0b2"
+        color:border-color="#6b3c00">
         <dc:Bounds x="159" y="300" width="939" height="130" />
         <bpmndi:BPMNLabel />
       </bpmndi:BPMNShape>
-      <bpmndi:BPMNShape id="Lane_0gg35cm_di" bpmnElement="Lane_0gg35cm" isHorizontal="true" bioc:stroke="#205022" bioc:fill="#c8e6c9" color:background-color="#c8e6c9" color:border-color="#205022">
+      <bpmndi:BPMNShape id="Lane_0gg35cm_di" bpmnElement="Lane_0gg35cm" isHorizontal="true"
+        bioc:stroke="#205022" bioc:fill="#c8e6c9" color:background-color="#c8e6c9"
+        color:border-color="#205022">
         <dc:Bounds x="159" y="430" width="939" height="190" />
         <bpmndi:BPMNLabel />
       </bpmndi:BPMNShape>
+      <bpmndi:BPMNEdge id="Flow_1e0rwbr_di" bpmnElement="Flow_1e0rwbr">
+        <di:waypoint x="830" y="360" />
+        <di:waypoint x="892" y="360" />
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge id="Flow_1nv3atg_di" bpmnElement="Flow_1nv3atg">
+        <di:waypoint x="675" y="360" />
+        <di:waypoint x="730" y="360" />
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge id="Flow_182hkx9_di" bpmnElement="Flow_182hkx9">
+        <di:waypoint x="520" y="287" />
+        <di:waypoint x="520" y="320" />
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge id="Flow_0c0my00_di" bpmnElement="Flow_0c0my00">
+        <di:waypoint x="1000" y="520" />
+        <di:waypoint x="1042" y="520" />
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge id="Flow_1kzr483_di" bpmnElement="Flow_Afgekeurd">
+        <di:waypoint x="780" y="545" />
+        <di:waypoint x="780" y="610" />
+        <di:waypoint x="520" y="610" />
+        <di:waypoint x="520" y="400" />
+        <bpmndi:BPMNLabel>
+          <dc:Bounds x="629" y="643" width="51" height="14" />
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge id="Flow_1b2jfo6_di" bpmnElement="Flow_Goedgekeurd">
+        <di:waypoint x="805" y="520" />
+        <di:waypoint x="900" y="520" />
+        <bpmndi:BPMNLabel>
+          <dc:Bounds x="822" y="502" width="67" height="14" />
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge id="Flow_052zkgn_di" bpmnElement="Flow_052zkgn">
+        <di:waypoint x="700" y="520" />
+        <di:waypoint x="755" y="520" />
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge id="Flow_1vq5xib_di" bpmnElement="Flow_Correctie">
+        <di:waypoint x="650" y="335" />
+        <di:waypoint x="650" y="247" />
+        <di:waypoint x="570" y="247" />
+        <bpmndi:BPMNLabel>
+          <dc:Bounds x="657" y="246" width="85" height="27" />
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge id="Flow_1s8dy3s_di" bpmnElement="Flow_Volledig">
+        <di:waypoint x="650" y="385" />
+        <di:waypoint x="650" y="480" />
+        <bpmndi:BPMNLabel>
+          <dc:Bounds x="660" y="431" width="39" height="14" />
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge id="Flow_0wh24tv_di" bpmnElement="Flow_0wh24tv">
+        <di:waypoint x="570" y="360" />
+        <di:waypoint x="625" y="360" />
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge id="Flow_1yua9gv_di" bpmnElement="Flow_1yua9gv">
+        <di:waypoint x="390" y="247" />
+        <di:waypoint x="470" y="247" />
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge id="Flow_0fbcwbp_di" bpmnElement="Flow_0fbcwbp">
+        <di:waypoint x="248" y="247" />
+        <di:waypoint x="290" y="247" />
+      </bpmndi:BPMNEdge>
       <bpmndi:BPMNShape id="Activity_1yv8x57_di" bpmnElement="System_Verplaats">
         <dc:Bounds x="290" y="207" width="100" height="80" />
       </bpmndi:BPMNShape>
-      <bpmndi:BPMNShape id="Gateway_1p0yzaj_di" bpmnElement="Gateway_MetadataGevult" isMarkerVisible="true">
+      <bpmndi:BPMNShape id="Gateway_1p0yzaj_di" bpmnElement="Gateway_MetadataGevult"
+        isMarkerVisible="true">
         <dc:Bounds x="625" y="335" width="50" height="50" />
         <bpmndi:BPMNLabel>
           <dc:Bounds x="675" y="376" width="49" height="27" />
@@ -221,7 +340,8 @@ Hier worden ook de personen van de rollen Document beheerder en Goedkeurder geko
       <bpmndi:BPMNShape id="_BPMNShape_StartEvent_2" bpmnElement="StartEvent_1">
         <dc:Bounds x="212" y="229" width="36" height="36" />
       </bpmndi:BPMNShape>
-      <bpmndi:BPMNShape id="Gateway_015ixd0_di" bpmnElement="Gateway_Goedkeuring" isMarkerVisible="true">
+      <bpmndi:BPMNShape id="Gateway_015ixd0_di" bpmnElement="Gateway_Goedkeuring"
+        isMarkerVisible="true">
         <dc:Bounds x="755" y="495" width="50" height="50" />
         <bpmndi:BPMNLabel>
           <dc:Bounds x="743" y="457.5" width="73" height="27" />
@@ -248,73 +368,6 @@ Hier worden ook de personen van de rollen Document beheerder en Goedkeurder geko
       <bpmndi:BPMNShape id="Activity_0s3pet7_di" bpmnElement="Systeem_Verwijder">
         <dc:Bounds x="730" y="320" width="100" height="80" />
       </bpmndi:BPMNShape>
-      <bpmndi:BPMNEdge id="Flow_0fbcwbp_di" bpmnElement="Flow_0fbcwbp">
-        <di:waypoint x="248" y="247" />
-        <di:waypoint x="290" y="247" />
-      </bpmndi:BPMNEdge>
-      <bpmndi:BPMNEdge id="Flow_1yua9gv_di" bpmnElement="Flow_1yua9gv">
-        <di:waypoint x="390" y="247" />
-        <di:waypoint x="470" y="247" />
-      </bpmndi:BPMNEdge>
-      <bpmndi:BPMNEdge id="Flow_0wh24tv_di" bpmnElement="Flow_0wh24tv">
-        <di:waypoint x="570" y="360" />
-        <di:waypoint x="625" y="360" />
-      </bpmndi:BPMNEdge>
-      <bpmndi:BPMNEdge id="Flow_1s8dy3s_di" bpmnElement="Flow_Volledig">
-        <di:waypoint x="650" y="385" />
-        <di:waypoint x="650" y="480" />
-        <bpmndi:BPMNLabel>
-          <dc:Bounds x="660" y="431" width="39" height="14" />
-        </bpmndi:BPMNLabel>
-      </bpmndi:BPMNEdge>
-      <bpmndi:BPMNEdge id="Flow_1vq5xib_di" bpmnElement="Flow_Correctie">
-        <di:waypoint x="650" y="335" />
-        <di:waypoint x="650" y="247" />
-        <di:waypoint x="570" y="247" />
-        <bpmndi:BPMNLabel>
-          <dc:Bounds x="657" y="246" width="85" height="27" />
-        </bpmndi:BPMNLabel>
-      </bpmndi:BPMNEdge>
-      <bpmndi:BPMNEdge id="Flow_052zkgn_di" bpmnElement="Flow_052zkgn">
-        <di:waypoint x="700" y="520" />
-        <di:waypoint x="755" y="520" />
-      </bpmndi:BPMNEdge>
-      <bpmndi:BPMNEdge id="Flow_1b2jfo6_di" bpmnElement="Flow_Goedgekeurd">
-        <di:waypoint x="805" y="520" />
-        <di:waypoint x="900" y="520" />
-        <bpmndi:BPMNLabel>
-          <dc:Bounds x="822" y="502" width="67" height="14" />
-        </bpmndi:BPMNLabel>
-      </bpmndi:BPMNEdge>
-      <bpmndi:BPMNEdge id="Flow_1kzr483_di" bpmnElement="Flow_Afgekeurd">
-        <di:waypoint x="780" y="545" />
-        <di:waypoint x="780" y="610" />
-        <di:waypoint x="520" y="610" />
-        <di:waypoint x="520" y="400" />
-        <bpmndi:BPMNLabel>
-          <dc:Bounds x="629" y="643" width="51" height="14" />
-        </bpmndi:BPMNLabel>
-      </bpmndi:BPMNEdge>
-      <bpmndi:BPMNEdge id="Flow_0c0my00_di" bpmnElement="Flow_0c0my00">
-        <di:waypoint x="1000" y="520" />
-        <di:waypoint x="1042" y="520" />
-      </bpmndi:BPMNEdge>
-      <bpmndi:BPMNEdge id="Flow_182hkx9_di" bpmnElement="Flow_182hkx9">
-        <di:waypoint x="520" y="287" />
-        <di:waypoint x="520" y="320" />
-      </bpmndi:BPMNEdge>
-      <bpmndi:BPMNEdge id="Flow_1nv3atg_di" bpmnElement="Flow_1nv3atg">
-        <di:waypoint x="675" y="360" />
-        <di:waypoint x="730" y="360" />
-      </bpmndi:BPMNEdge>
-      <bpmndi:BPMNEdge id="Flow_1e0rwbr_di" bpmnElement="Flow_1e0rwbr">
-        <di:waypoint x="830" y="360" />
-        <di:waypoint x="892" y="360" />
-      </bpmndi:BPMNEdge>
-      <bpmndi:BPMNEdge id="Association_0o8wfbk_di" bpmnElement="Association_0o8wfbk">
-        <di:waypoint x="809" y="320" />
-        <di:waypoint x="830" y="290" />
-      </bpmndi:BPMNEdge>
       <bpmndi:BPMNShape id="TextAnnotation_0vwtvmv_di" bpmnElement="TextAnnotation_0vwtvmv">
         <dc:Bounds x="480" y="87" width="210" height="80" />
         <bpmndi:BPMNLabel />
@@ -339,6 +392,10 @@ Hier worden ook de personen van de rollen Document beheerder en Goedkeurder geko
         <dc:Bounds x="140" y="87" width="270" height="96" />
         <bpmndi:BPMNLabel />
       </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape id="TextAnnotation_09hzhyv_di" bpmnElement="TextAnnotation_09hzhyv">
+        <dc:Bounds x="820" y="220" width="268" height="70" />
+        <bpmndi:BPMNLabel />
+      </bpmndi:BPMNShape>
       <bpmndi:BPMNEdge id="Association_0rgvcu6_di" bpmnElement="Association_0rgvcu6">
         <di:waypoint x="387" y="211" />
         <di:waypoint x="480" y="140" />
@@ -363,10 +420,10 @@ Hier worden ook de personen van de rollen Document beheerder en Goedkeurder geko
         <di:waypoint x="225" y="230" />
         <di:waypoint x="212" y="183" />
       </bpmndi:BPMNEdge>
-      <bpmndi:BPMNShape id="TextAnnotation_09hzhyv_di" bpmnElement="TextAnnotation_09hzhyv">
-        <dc:Bounds x="820" y="220" width="268" height="70" />
-        <bpmndi:BPMNLabel />
-      </bpmndi:BPMNShape>
+      <bpmndi:BPMNEdge id="Association_0o8wfbk_di" bpmnElement="Association_0o8wfbk">
+        <di:waypoint x="809" y="320" />
+        <di:waypoint x="830" y="290" />
+      </bpmndi:BPMNEdge>
     </bpmndi:BPMNPlane>
   </bpmndi:BPMNDiagram>
-</bpmn:definitions>
+</bpmn:definitions>
\ No newline at end of file
-- 
GitLab


From 6d88970fd07a12d81bf6fd161178073fa5756a54 Mon Sep 17 00:00:00 2001
From: Erik Hoogland <erik.hoogland@contezza.nl>
Date: Tue, 5 Nov 2024 17:24:42 +0100
Subject: [PATCH 3/9] Verplaatsing update workflowId naar einde systeem taak

---
 backend/projects/tezzaAlgemeen/bpmn/documentToevoegen.bpmn | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/backend/projects/tezzaAlgemeen/bpmn/documentToevoegen.bpmn b/backend/projects/tezzaAlgemeen/bpmn/documentToevoegen.bpmn
index 7748456..9d64c59 100644
--- a/backend/projects/tezzaAlgemeen/bpmn/documentToevoegen.bpmn
+++ b/backend/projects/tezzaAlgemeen/bpmn/documentToevoegen.bpmn
@@ -98,6 +98,8 @@
             workflowUsers.add(execution.getVariable("documentReviewer"));
             execution.setVariable("workflowUsers", workflowUsers);</camunda:script>
         </camunda:executionListener>
+        <camunda:executionListener
+          expression="${tezzaUploadFileBean.updateNodeWithWorkflowIds(execution)}" event="end" />
       </bpmn:extensionElements>
       <bpmn:incoming>Flow_0fbcwbp</bpmn:incoming>
       <bpmn:outgoing>Flow_1yua9gv</bpmn:outgoing>
@@ -111,7 +113,6 @@
     </bpmn:exclusiveGateway>
     <bpmn:startEvent id="StartEvent_1" camunda:initiator="initiator">
       <bpmn:extensionElements>
-        <camunda:executionListener expression="${tezzaUploadFileBean.updateNodeWithWorkflowIds(execution)}" event="end" />
         <camunda:executionListener delegateExpression="${initiatorListener}" event="start" />
       </bpmn:extensionElements>
       <bpmn:outgoing>Flow_0fbcwbp</bpmn:outgoing>
-- 
GitLab


From 49770d69205de7442cab1cf9ed3068229f01dfc2 Mon Sep 17 00:00:00 2001
From: Erik Hoogland <erik.hoogland@contezza.nl>
Date: Tue, 5 Nov 2024 17:25:12 +0100
Subject: [PATCH 4/9] Toevoeging relatedDossierIds aan
 documentToevoegen-start-form

---
 .../form/documentToevoegen-start-form.json    | 49 +++++++++++++++++++
 1 file changed, 49 insertions(+)

diff --git a/backend/projects/tezzaAlgemeen/form/documentToevoegen-start-form.json b/backend/projects/tezzaAlgemeen/form/documentToevoegen-start-form.json
index 7cc59fb..23d272f 100644
--- a/backend/projects/tezzaAlgemeen/form/documentToevoegen-start-form.json
+++ b/backend/projects/tezzaAlgemeen/form/documentToevoegen-start-form.json
@@ -686,6 +686,55 @@
       "customDefaultValue": "",
       "allowCalculateOverride": false
     },
+    {
+      "id": "ul5hc65",
+      "key": "pv.relatedDossierIds",
+      "type": "hidden",
+      "input": true,
+      "label": "relatedDossierIds",
+      "addons": [],
+      "hidden": false,
+      "prefix": "",
+      "suffix": "",
+      "unique": false,
+      "widget": { "type": "input" },
+      "dbIndex": false,
+      "overlay": { "top": "", "left": "", "style": "", "width": "", "height": "" },
+      "tooltip": "",
+      "disabled": false,
+      "multiple": false,
+      "redrawOn": "",
+      "tabindex": "",
+      "validate": { "custom": "", "unique": false, "multiple": false, "required": false, "customPrivate": false, "strictDateValidation": false },
+      "autofocus": false,
+      "encrypted": false,
+      "hideLabel": false,
+      "inputType": "hidden",
+      "modalEdit": false,
+      "protected": false,
+      "refreshOn": "",
+      "tableView": false,
+      "attributes": { "data-testid": "documentToevoegen-start-form-pv.relatedDossierIds" },
+      "errorLabel": "",
+      "persistent": true,
+      "properties": {},
+      "validateOn": "change",
+      "clearOnHide": true,
+      "conditional": { "eq": "", "show": null, "when": null },
+      "customClass": "",
+      "description": "",
+      "placeholder": "",
+      "defaultValue": null,
+      "dataGridLabel": false,
+      "labelPosition": "top",
+      "showCharCount": false,
+      "showWordCount": false,
+      "calculateValue": "",
+      "calculateServer": false,
+      "allowMultipleMasks": false,
+      "customDefaultValue": "",
+      "allowCalculateOverride": false
+    },
     {
       "id": "e67rexg",
       "key": "submit",
-- 
GitLab


From b831a59906730987fd895b8ec17cea4f4da914f4 Mon Sep 17 00:00:00 2001
From: Erik Hoogland <erik.hoogland@contezza.nl>
Date: Wed, 6 Nov 2024 09:20:02 +0100
Subject: [PATCH 5/9] tza:historicWorkflowIdsupdate uitgezet voor debug
 mogelijkheden, nu weer aan

---
 .../gzac/tezza/bean/TezzaUploadFileBean.java   | 18 +++++++++---------
 1 file changed, 9 insertions(+), 9 deletions(-)

diff --git a/backend/src/main/java/nl/contezza/gzac/tezza/bean/TezzaUploadFileBean.java b/backend/src/main/java/nl/contezza/gzac/tezza/bean/TezzaUploadFileBean.java
index 6fdd7e6..a83ca5d 100644
--- a/backend/src/main/java/nl/contezza/gzac/tezza/bean/TezzaUploadFileBean.java
+++ b/backend/src/main/java/nl/contezza/gzac/tezza/bean/TezzaUploadFileBean.java
@@ -128,15 +128,15 @@ public class TezzaUploadFileBean {
                         body.putPropertiesItem("tza:workflowIds", workflowIds);
 
                         // Toevoegen processInstanceId aan historicWorkfowId
-                        // List<String> historicWorkflowIds = new ArrayList<>();
-                        // if (properties.containsKey("tza:historicWorkflowIds")) {
-                        // Object historicWorkflowIdsObject = properties.get("tza:historicWorkflowIds");
-                        // if (historicWorkflowIdsObject instanceof List) {
-                        // historicWorkflowIds = (List<String>) historicWorkflowIdsObject;
-                        // }
-                        // }
-                        // historicWorkflowIds.add(processInstanceId);
-                        // body.putPropertiesItem("tza:historicWorkflowIds", historicWorkflowIds);
+                        List<String> historicWorkflowIds = new ArrayList<>();
+                        if (properties.containsKey("tza:historicWorkflowIds")) {
+                            Object historicWorkflowIdsObject = properties.get("tza:historicWorkflowIds");
+                            if (historicWorkflowIdsObject instanceof List) {
+                                historicWorkflowIds = (List<String>) historicWorkflowIdsObject;
+                            }
+                        }
+                        historicWorkflowIds.add(processInstanceId);
+                        body.putPropertiesItem("tza:historicWorkflowIds", historicWorkflowIds);
                     }
                     api.updateNode(nodeId, body, null, null);
 
-- 
GitLab


From c358dcb0a17a642c5bc065b983b2fe7dec1359bc Mon Sep 17 00:00:00 2001
From: Erik Hoogland <erik.hoogland@contezza.nl>
Date: Wed, 6 Nov 2024 10:42:27 +0100
Subject: [PATCH 6/9] Verwijderen dubbel ophalen relatedNodeIds

---
 .../nl/contezza/gzac/tezza/bean/TezzaUploadFileBean.java    | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/backend/src/main/java/nl/contezza/gzac/tezza/bean/TezzaUploadFileBean.java b/backend/src/main/java/nl/contezza/gzac/tezza/bean/TezzaUploadFileBean.java
index a83ca5d..bc4c6d3 100644
--- a/backend/src/main/java/nl/contezza/gzac/tezza/bean/TezzaUploadFileBean.java
+++ b/backend/src/main/java/nl/contezza/gzac/tezza/bean/TezzaUploadFileBean.java
@@ -185,7 +185,7 @@ public class TezzaUploadFileBean {
             // Check voor gerelateerde dossiers, en start voor elk een nieuw proces op
             List<String> relatedDossierIds = getStringList(execution, "relatedDossierIds");
             for (String relatedDosierId : relatedDossierIds) {
-                copyToDossier(execution, relatedDosierId, api);
+                copyToDossier(execution, relatedDosierId, api, relatedNodeIds);
             }
         }
     }
@@ -425,9 +425,9 @@ public class TezzaUploadFileBean {
      * @param api              Een instantie van de NodesApi voor Alfresco
      * @throws ApiException
      */
-    private void copyToDossier(ActivityExecution execution, String relatedDossierId, NodesApi api)
+    private void copyToDossier(ActivityExecution execution, String relatedDossierId, NodesApi api,
+            List<String> relatedNodeIds)
             throws ApiException {
-        List<String> relatedNodeIds = getStringList(execution, "relatedNodeIds");
         List<String> copiedNodeIds = new ArrayList<>();
 
         // Kopieer bijgevoegde documenten naar nieuw dossier in Alfresco
-- 
GitLab


From 60fa45e26941913677d8fc0145fee754c06d8526 Mon Sep 17 00:00:00 2001
From: Erik Hoogland <erik.hoogland@contezza.nl>
Date: Thu, 7 Nov 2024 11:37:52 +0100
Subject: [PATCH 7/9] Verwijderen onnodige annotatie

---
 .../java/nl/contezza/gzac/tezza/web/rest/TezzaTaskResource.java  | 1 -
 1 file changed, 1 deletion(-)

diff --git a/backend/src/main/java/nl/contezza/gzac/tezza/web/rest/TezzaTaskResource.java b/backend/src/main/java/nl/contezza/gzac/tezza/web/rest/TezzaTaskResource.java
index f7d0012..93fd1d2 100644
--- a/backend/src/main/java/nl/contezza/gzac/tezza/web/rest/TezzaTaskResource.java
+++ b/backend/src/main/java/nl/contezza/gzac/tezza/web/rest/TezzaTaskResource.java
@@ -44,7 +44,6 @@ public class TezzaTaskResource {
 	private final TezzaService tezzaService;
 	private final AlfrescoService alfrescoService;
 
-	@SuppressWarnings("unused")
 	private static final Logger logger = LoggerFactory.getLogger(TezzaTaskResource.class);
 
 	public TezzaTaskResource(
-- 
GitLab


From 74b46257125a112b427f0fbb1bce2fbb34bed739 Mon Sep 17 00:00:00 2001
From: Erik Hoogland <erik.hoogland@contezza.nl>
Date: Thu, 7 Nov 2024 11:44:51 +0100
Subject: [PATCH 8/9] Inhoud van submission object wordt nu dynamish opgehald
 en geconverteerd

---
 .../gzac/tezza/bean/TezzaUploadFileBean.java  | 73 ++++++++++++++-----
 .../gzac/tezza/service/TezzaService.java      |  3 +
 2 files changed, 59 insertions(+), 17 deletions(-)

diff --git a/backend/src/main/java/nl/contezza/gzac/tezza/bean/TezzaUploadFileBean.java b/backend/src/main/java/nl/contezza/gzac/tezza/bean/TezzaUploadFileBean.java
index bc4c6d3..f3544f9 100644
--- a/backend/src/main/java/nl/contezza/gzac/tezza/bean/TezzaUploadFileBean.java
+++ b/backend/src/main/java/nl/contezza/gzac/tezza/bean/TezzaUploadFileBean.java
@@ -4,10 +4,12 @@ import java.io.IOException;
 import java.net.URISyntaxException;
 import java.util.ArrayList;
 import java.util.Collections;
+import java.util.Date;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.NoSuchElementException;
+import java.util.Set;
 import java.util.stream.Collectors;
 
 import org.alfresco.extension.acs.ApiException;
@@ -25,6 +27,7 @@ import org.camunda.bpm.engine.impl.pvm.delegate.ActivityExecution;
 
 import com.fasterxml.jackson.databind.JsonNode;
 import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.node.ArrayNode;
 import com.fasterxml.jackson.databind.node.BooleanNode;
 import com.fasterxml.jackson.databind.node.ObjectNode;
 import com.ritense.processdocument.domain.ProcessDefinitionKey;
@@ -314,7 +317,6 @@ public class TezzaUploadFileBean {
 
     public void updatePermissions(ActivityExecution execution, List<String> workflowUsers) throws ApiException {
         String documentFolderId = (String) execution.getVariable("documentFolderId");
-        logger.debug("documentFolderId: " + documentFolderId);
         if (documentFolderId != null && !documentFolderId.isEmpty()) {
             NodesApi api = alfrescoService.getNodesApi();
             List<String> listInclude = new ArrayList<>(Collections.singletonList("permissions"));
@@ -385,7 +387,6 @@ public class TezzaUploadFileBean {
         List<PermissionElement> permissionList = new ArrayList<>();
 
         for (String user : uniqueWorkflowUsers) {
-            logger.debug("user: " + user);
             PermissionElement permissionElement = new PermissionElement();
             permissionElement.setAuthorityId(user);
             permissionElement.setName("Coordinator");
@@ -420,9 +421,10 @@ public class TezzaUploadFileBean {
      * Deze functie start een documentToevoegen proces in een nieuw dossier, met een
      * kopie van de orginele documenten.
      * 
-     * @param execution        De excecutie van het proce
+     * @param execution        De excecutie van het proces
      * @param relatedDossierId Het ID van het gerelateerde dossier in Alfresco
      * @param api              Een instantie van de NodesApi voor Alfresco
+     * @param relatedNodeIds   De documenten voor de bijlage van het nieuwe proces
      * @throws ApiException
      */
     private void copyToDossier(ActivityExecution execution, String relatedDossierId, NodesApi api,
@@ -442,30 +444,67 @@ public class TezzaUploadFileBean {
         }
 
         // Start nieuw proces in gerelateerd dossier, met gekopieerde documenten
-        JsonNode submission = createProcessToevoegenSubmission(execution);
-        FormSubmissionRequest request = new FormSubmissionRequest("tezzaAlgemeen", null, null, copiedNodeIds,
-                submission);
+        JsonNode submission = createProcessToevoegenSubmission(execution, copiedNodeIds);
+        FormSubmissionRequest request = new FormSubmissionRequest(null, null, null, null, submission);
         ProcessDefinitionKey processDefinitionKey = ProcessDefinitionKey.fromExecution(execution,
                 CamundaProcessDefinitionKey.class);
 
         tezzaService.startProcess(relatedDossierId, processDefinitionKey, request);
     }
 
-    private JsonNode createProcessToevoegenSubmission(ActivityExecution execution) {
+    /**
+     * Dit maak een submission object voor het starten van een nieuw proces.
+     * Hiervoor worden de variabele van het huidige proces voor gebruikt, met een
+     * aparte lijst voor relatedNodeIds.
+     * 
+     * @param execution      De excecutie van het proces
+     * @param relatedNodeIds De documenten voor de bijlage van het nieuwe proces
+     * @return een JsonNode submission object
+     */
+    private JsonNode createProcessToevoegenSubmission(ActivityExecution execution, List<String> relatedNodeIds) {
         // TODO hardcoded waardes verplaatsen naar static variables, afronding van
         // ticket #29141 nodig
         ObjectMapper objectMapper = new ObjectMapper();
-
-        // Create "pv" node
         ObjectNode pvNode = objectMapper.createObjectNode();
-        pvNode.put("workflowDescription", (String) execution.getVariable("workflowDescription"));
-        pvNode.put("documentBeheerder", (String) execution.getVariable("documentBeheerder"));
-        pvNode.put("documentReviewer", (String) execution.getVariable("documentReviewer"));
-        pvNode.put("workflowDueDate", (String) execution.getVariable("workflowDueDate"));
-        pvNode.put("workflowPriority", (int) execution.getVariable("workflowPriority"));
-        pvNode.put("sendEmailNotifications", (Boolean) execution.getVariable("sendEmailNotifications"));
-
-        // Create root node
+
+        Map<String, Object> processVariables = execution.getVariables();
+        Set<String> variablesToIgnore = Set.of("relatedNodeIds", "relatedDossierIds");
+
+        // Voeg huidige process variables toe aan submission object, met uitzondering
+        // van variablesToIgnore Set
+        for (Map.Entry<String, Object> entry : processVariables.entrySet()) {
+            String key = entry.getKey();
+            Object value = entry.getValue();
+
+            if (!variablesToIgnore.contains(key)) {
+                if (value instanceof String) {
+                    pvNode.put(key, (String) value);
+                } else if (value instanceof Integer) {
+                    pvNode.put(key, (int) value);
+                } else if (value instanceof Boolean) {
+                    pvNode.put(key, (Boolean) value);
+                } else if (value instanceof Date) {
+                    pvNode.put(key, (String) value);
+                } else if (value instanceof ArrayList) {
+                    pvNode.putArray(key);
+                    ArrayNode processVariableArray = (ArrayNode) pvNode.get(key);
+                    List<String> itemList = getStringList(execution, key);
+                    for (String item : itemList) {
+                        processVariableArray.add(item);
+                    }
+                } else {
+                    logger.debug("Unknown type for varriable : " + key);
+                }
+            }
+        }
+
+        // Toevoegen relatedNodeId
+        pvNode.putArray("relatedNodeIds");
+        ArrayNode relatedNodeIdsArray = (ArrayNode) pvNode.get("relatedNodeIds");
+        for (String item : relatedNodeIds) {
+            relatedNodeIdsArray.add(item);
+        }
+
         ObjectNode rootNode = objectMapper.createObjectNode();
         rootNode.set("pv", pvNode);
         rootNode.set("submit", BooleanNode.TRUE);
diff --git a/backend/src/main/java/nl/contezza/gzac/tezza/service/TezzaService.java b/backend/src/main/java/nl/contezza/gzac/tezza/service/TezzaService.java
index 127865e..572094d 100644
--- a/backend/src/main/java/nl/contezza/gzac/tezza/service/TezzaService.java
+++ b/backend/src/main/java/nl/contezza/gzac/tezza/service/TezzaService.java
@@ -318,6 +318,9 @@ public class TezzaService {
         CamundaProcessJsonSchemaDocumentDefinition processDocumentDefinition = (CamundaProcessJsonSchemaDocumentDefinition) processDocumentAssociationService
                 .getProcessDocumentDefinition(processDefinitionKey);
 
+        request.setDocumentDefinitionName(
+                processDocumentDefinition.processDocumentDefinitionId().documentDefinitionId().name());
+
         ProcessLink processLink = processLinkService.getProcessLinksByProcessDefinitionIdAndActivityType(
                 processDocumentDefinition.getLatestVersionId(),
                 ActivityTypeWithEventName.START_EVENT_START);
-- 
GitLab


From f1e3dee7a0ff1a2649929c3fcb92bb9baac6769d Mon Sep 17 00:00:00 2001
From: Erik Hoogland <erik.hoogland@contezza.nl>
Date: Thu, 7 Nov 2024 14:43:06 +0100
Subject: [PATCH 9/9] parameter relatedNodeIds verwijderd uit
 FormSubmissionRequest, dit gaat nu direct in het submission object

---
 .../gzac/tezza/bean/TezzaUploadFileBean.java  |  2 +-
 .../tezza/domain/FormSubmissionRequest.java   | 15 ++----------
 .../gzac/tezza/service/TezzaService.java      | 24 +------------------
 3 files changed, 4 insertions(+), 37 deletions(-)

diff --git a/backend/src/main/java/nl/contezza/gzac/tezza/bean/TezzaUploadFileBean.java b/backend/src/main/java/nl/contezza/gzac/tezza/bean/TezzaUploadFileBean.java
index f3544f9..b339a9b 100644
--- a/backend/src/main/java/nl/contezza/gzac/tezza/bean/TezzaUploadFileBean.java
+++ b/backend/src/main/java/nl/contezza/gzac/tezza/bean/TezzaUploadFileBean.java
@@ -445,7 +445,7 @@ public class TezzaUploadFileBean {
 
         // Start nieuw proces in gerelateerd dossier, met gekopieerde documenten
         JsonNode submission = createProcessToevoegenSubmission(execution, copiedNodeIds);
-        FormSubmissionRequest request = new FormSubmissionRequest(null, null, null, null, submission);
+        FormSubmissionRequest request = new FormSubmissionRequest(null, null, null, submission);
         ProcessDefinitionKey processDefinitionKey = ProcessDefinitionKey.fromExecution(execution,
                 CamundaProcessDefinitionKey.class);
 
diff --git a/backend/src/main/java/nl/contezza/gzac/tezza/domain/FormSubmissionRequest.java b/backend/src/main/java/nl/contezza/gzac/tezza/domain/FormSubmissionRequest.java
index 1afb585..b8305a9 100644
--- a/backend/src/main/java/nl/contezza/gzac/tezza/domain/FormSubmissionRequest.java
+++ b/backend/src/main/java/nl/contezza/gzac/tezza/domain/FormSubmissionRequest.java
@@ -1,7 +1,6 @@
 package nl.contezza.gzac.tezza.domain;
 
 import java.net.URI;
-import java.util.List;
 
 import jakarta.validation.constraints.NotBlank;
 import jakarta.validation.constraints.NotNull;
@@ -13,7 +12,6 @@ public class FormSubmissionRequest {
     private String documentDefinitionName;
     private URI zaakUrl;
     private URI zaaktypeUrl;
-    private List<String> relatedNodeIds;
 
     @NotNull(message = "Form submission data is required")
     private JsonNode submission;
@@ -24,12 +22,11 @@ public class FormSubmissionRequest {
 
     public FormSubmissionRequest(
             @NotBlank(message = "documentDefinitionName is required") String documentDefinitionName, URI zaakUrl,
-            URI zaaktypeUrl, List<String> relatedNodeIds,
+            URI zaaktypeUrl,
             @NotNull(message = "Form submission data is required") JsonNode submission) {
         this.documentDefinitionName = documentDefinitionName;
         this.zaakUrl = zaakUrl;
         this.zaaktypeUrl = zaaktypeUrl;
-        this.relatedNodeIds = relatedNodeIds;
         this.submission = submission;
     }
 
@@ -57,14 +54,6 @@ public class FormSubmissionRequest {
         this.zaaktypeUrl = zaakTypeUrl;
     }
 
-    public List<String> getRelatedNodeIds() {
-        return relatedNodeIds;
-    }
-
-    public void setRelatedNodeIds(List<String> relatedNodeIds) {
-        this.relatedNodeIds = relatedNodeIds;
-    }
-
     public JsonNode getSubmission() {
         return submission;
     }
@@ -75,7 +64,7 @@ public class FormSubmissionRequest {
 
     public String toString() {
         return "FormSubmissionRequest [documentDefinitionName=" + documentDefinitionName + ", zaakUrl=" + zaakUrl
-                + ", zaaktypeUrl=" + zaaktypeUrl + ", relatedNodeIds=" + relatedNodeIds + ", submission=" + submission
+                + ", zaaktypeUrl=" + zaaktypeUrl + ", submission=" + submission
                 + "]";
     }
 
diff --git a/backend/src/main/java/nl/contezza/gzac/tezza/service/TezzaService.java b/backend/src/main/java/nl/contezza/gzac/tezza/service/TezzaService.java
index 572094d..fd2ca53 100644
--- a/backend/src/main/java/nl/contezza/gzac/tezza/service/TezzaService.java
+++ b/backend/src/main/java/nl/contezza/gzac/tezza/service/TezzaService.java
@@ -1,10 +1,7 @@
 package nl.contezza.gzac.tezza.service;
 
 import com.fasterxml.jackson.core.JsonPointer;
-import com.fasterxml.jackson.databind.JsonNode;
 import com.fasterxml.jackson.databind.ObjectMapper;
-import com.fasterxml.jackson.databind.node.ArrayNode;
-import com.fasterxml.jackson.databind.node.ObjectNode;
 import com.ritense.document.domain.Document;
 import com.ritense.document.domain.impl.request.NewDocumentRequest;
 import com.ritense.document.service.DocumentSearchService;
@@ -286,29 +283,10 @@ public class TezzaService {
         Document document = findOrCreateDocument(nodeId, request.getDocumentDefinitionName());
         handleZaakInstanceLink(request.getDocumentDefinitionName(), request.getZaakUrl(),
                 request.getZaaktypeUrl(), document);
-        JsonNode submission = request.getSubmission();
-
-        // Voeg relatedNodeIds toe aan submission data
-        List<String> relatedNodeIds = request.getRelatedNodeIds();
-        if (relatedNodeIds != null && !relatedNodeIds.isEmpty()) {
-            ObjectNode submissionObject = (ObjectNode) submission;
-            if (!submissionObject.has("pv")) {
-                submissionObject.putObject("pv").putArray("relatedNodeIds");
-            }
-            ObjectNode pvNode = (ObjectNode) submissionObject.path("pv");
-            ArrayNode relatedNodeIdsArray = pvNode.has("relatedNodeIds")
-                    && pvNode.get("relatedNodeIds").isArray()
-                            ? (ArrayNode) pvNode.get("relatedNodeIds")
-                            : pvNode
-                                    .putArray("relatedNodeIds");
-            for (String relatedNodeId : relatedNodeIds) {
-                relatedNodeIdsArray.add(relatedNodeId);
-            }
-        }
 
         return formSubmissionService.handleSubmission(
                 processLinkId,
-                submission,
+                request.getSubmission(),
                 null,
                 document.id().getId().toString(),
                 null);
-- 
GitLab