From aa2e9a8cdfcd3b1bc2dc4aed23b63aabd2a5d188 Mon Sep 17 00:00:00 2001
From: Damien <damien.burel@maarch.org>
Date: Fri, 13 Nov 2020 15:45:31 +0100
Subject: [PATCH] FEAT #14568 TIME 2:45 suspend and reactivate workflows

---
 lang/en.json                                  |  2 +-
 lang/fr.json                                  |  2 +-
 rest/index.php                                |  2 +
 .../controllers/DocumentController.php        |  1 -
 .../controllers/WorkflowController.php        | 57 +++++++++++++++++++
 .../models/WorkflowTemplateItemModel.php      |  2 +-
 6 files changed, 62 insertions(+), 4 deletions(-)

diff --git a/lang/en.json b/lang/en.json
index ae0b37b90b..b4a5340b40 100755
--- a/lang/en.json
+++ b/lang/en.json
@@ -246,7 +246,7 @@
 		"manage_groupsAdmin" : "Manage groups",
 		"manage_connectionsAdmin" : "Manage connections",
 		"manage_email_configurationAdmin" : "Manage email server",
-		"manage_documentsAdmin" : "All access of documents",
+		"manage_documentsAdmin" : "Manage all documents and manage workflows",
 		"indexationAdmin" : "Save document for visa/signature",
 		"users" : "Users",
 		"linkedUsers" : "Linked users",
diff --git a/lang/fr.json b/lang/fr.json
index 954aa15ef3..ac11f0adb1 100755
--- a/lang/fr.json
+++ b/lang/fr.json
@@ -247,7 +247,7 @@
 		"manage_groupsAdmin" : "Administrer les groupes",
 		"manage_connectionsAdmin" : "Administrer les connexions",
 		"manage_email_configurationAdmin" : "Administrer le serveur courriel",
-		"manage_documentsAdmin" : "Accéder à tous les documents",
+		"manage_documentsAdmin" : "Accéder à tous les documents et gérer les circuits",
 		"indexationAdmin" : "Enregistrer des documents pour visa/signature",
 		"users" : "Utilisateurs",
 		"linkedUsers" : "Utilisateur(s) associé(s)",
diff --git a/rest/index.php b/rest/index.php
index c3b4fb1d1e..1a62575e27 100755
--- a/rest/index.php
+++ b/rest/index.php
@@ -81,6 +81,8 @@ $app->get('/documents/{id}/history', \History\controllers\HistoryController::cla
 $app->put('/documents/{id}/actions/{actionId}', \Document\controllers\DocumentController::class . ':setAction');
 $app->get('/documents/{id}/workflow', \Workflow\controllers\WorkflowController::class . ':getByDocumentId');
 $app->get('/documents/{id}/thumbnails/{page}', \Document\controllers\DocumentController::class . ':getThumbnailContent');
+$app->put('/documents/{id}/workflows/suspend', \Workflow\controllers\WorkflowController::class . ':suspend');
+$app->put('/documents/{id}/workflows/reactivate', \Workflow\controllers\WorkflowController::class . ':reactivate');
 
 //Emails
 $app->post('/emails', \Email\controllers\EmailController::class . ':send');
diff --git a/src/app/document/controllers/DocumentController.php b/src/app/document/controllers/DocumentController.php
index 7ade0c03c7..fc258d59ae 100755
--- a/src/app/document/controllers/DocumentController.php
+++ b/src/app/document/controllers/DocumentController.php
@@ -15,7 +15,6 @@
 namespace Document\controllers;
 
 use Attachment\controllers\AttachmentController;
-use Convert\scripts\ThumbnailScript;
 use Docserver\models\AdrModel;
 use Email\controllers\EmailController;
 use Group\controllers\PrivilegeController;
diff --git a/src/app/workflow/controllers/WorkflowController.php b/src/app/workflow/controllers/WorkflowController.php
index 36febebdf5..1317e09293 100755
--- a/src/app/workflow/controllers/WorkflowController.php
+++ b/src/app/workflow/controllers/WorkflowController.php
@@ -15,6 +15,7 @@
 namespace Workflow\controllers;
 
 use Document\controllers\DocumentController;
+use Document\models\DocumentModel;
 use Group\controllers\PrivilegeController;
 use Slim\Http\Request;
 use Slim\Http\Response;
@@ -51,4 +52,60 @@ class WorkflowController
 
         return $response->withJson(['workflow' => $workflow]);
     }
+
+    public function suspend(Request $request, Response $response, array $args)
+    {
+        $document = DocumentModel::getById(['select' => ['typist'], 'id' => $args['id']]);
+        if (empty($document)) {
+            return $response->withStatus(400)->withJson(['errors' => 'Document does not exist']);
+        } elseif ($document['typist'] != $GLOBALS['id'] && !PrivilegeController::hasPrivilege(['userId' => $GLOBALS['id'], 'privilege' => 'manage_documents'])) {
+            return $response->withStatus(403)->withJson(['errors' => 'Document out of perimeter']);
+        }
+
+        $workflows = WorkflowModel::get([
+            'select'    => ['id'],
+            'where'     => ['main_document_id = ?', 'status is null'],
+            'data'      => [$args['id']]
+        ]);
+        if (empty($workflows)) {
+            return $response->withStatus(400)->withJson(['errors' => 'Workflow is over or already suspended']);
+        }
+
+        $workflowsId = array_column($workflows, 'id');
+        WorkflowModel::update([
+            'set'   => ['status' => 'STOP', 'process_date' => 'CURRENT_TIMESTAMP'],
+            'where' => ['id in (?)'],
+            'data'  => [$workflowsId]
+        ]);
+
+        return $response->withStatus(204);
+    }
+
+    public function reactivate(Request $request, Response $response, array $args)
+    {
+        $document = DocumentModel::getById(['select' => ['typist'], 'id' => $args['id']]);
+        if (empty($document)) {
+            return $response->withStatus(400)->withJson(['errors' => 'Document does not exist']);
+        } elseif ($document['typist'] != $GLOBALS['id'] && !PrivilegeController::hasPrivilege(['userId' => $GLOBALS['id'], 'privilege' => 'manage_documents'])) {
+            return $response->withStatus(403)->withJson(['errors' => 'Document out of perimeter']);
+        }
+
+        $workflows = WorkflowModel::get([
+            'select'    => ['id'],
+            'where'     => ['main_document_id = ?', 'status = ?'],
+            'data'      => [$args['id'], 'STOP']
+        ]);
+        if (empty($workflows)) {
+            return $response->withStatus(400)->withJson(['errors' => 'Workflow is not suspended']);
+        }
+
+        $workflowsId = array_column($workflows, 'id');
+        WorkflowModel::update([
+            'set'   => ['status' => null, 'process_date' => null],
+            'where' => ['id in (?)'],
+            'data'  => [$workflowsId]
+        ]);
+
+        return $response->withStatus(204);
+    }
 }
diff --git a/src/app/workflow/models/WorkflowTemplateItemModel.php b/src/app/workflow/models/WorkflowTemplateItemModel.php
index 23d768c5da..19b2377f5b 100755
--- a/src/app/workflow/models/WorkflowTemplateItemModel.php
+++ b/src/app/workflow/models/WorkflowTemplateItemModel.php
@@ -47,7 +47,7 @@ class WorkflowTemplateItemModel
                 'user_id'               => $args['user_id'],
                 'mode'                  => $args['mode'],
                 'signature_mode'        => $args['signature_mode'],
-                'order'                 => $args['order']
+                '"order"'               => $args['order']
             ]
         ]);
 
-- 
GitLab