From 2890bca3f3cfe50adbaf2065e237a4023afd5f30 Mon Sep 17 00:00:00 2001
From: Damien <damien.burel@maarch.org>
Date: Fri, 20 Nov 2020 18:13:56 +0100
Subject: [PATCH] FEAT #14568 TIME 2:30 Search Fixes + split subject

---
 .../controllers/DocumentController.php        |  6 +-
 .../search/controllers/SearchController.php   | 59 ++++++++++++++++---
 .../controllers/WorkflowController.php        | 11 +++-
 3 files changed, 65 insertions(+), 11 deletions(-)

diff --git a/src/app/document/controllers/DocumentController.php b/src/app/document/controllers/DocumentController.php
index 4dce3e2f01..628db305d3 100755
--- a/src/app/document/controllers/DocumentController.php
+++ b/src/app/document/controllers/DocumentController.php
@@ -171,7 +171,7 @@ class DocumentController
             }
         }
 
-        $workflow = WorkflowModel::getByDocumentId(['select' => ['user_id', 'mode', 'process_date', 'signature_mode'], 'documentId' => $args['id'], 'orderBy' => ['"order"']]);
+        $workflow = WorkflowModel::getByDocumentId(['select' => ['user_id', 'mode', 'process_date', 'signature_mode', 'status'], 'documentId' => $args['id'], 'orderBy' => ['"order"']]);
         $currentFound = false;
         foreach ($workflow as $value) {
             if (!empty($value['process_date'])) {
@@ -185,11 +185,11 @@ class DocumentController
                 'userDisplay'           => UserModel::getLabelledUserById(['id' => $value['user_id']]),
                 'mode'                  => $value['mode'],
                 'processDate'           => $value['process_date'],
-                'current'               => !$currentFound && empty($value['process_date']),
+                'current'               => !$currentFound && empty($value['status']),
                 'signatureMode'         => $value['signature_mode'],
                 'userSignatureModes'    => json_decode($userSignaturesModes['signature_modes'], true)
             ];
-            if (empty($value['process_date'])) {
+            if (empty($value['status'])) {
                 $currentFound = true;
             }
         }
diff --git a/src/app/search/controllers/SearchController.php b/src/app/search/controllers/SearchController.php
index e414ee1a93..8eb2f388ef 100755
--- a/src/app/search/controllers/SearchController.php
+++ b/src/app/search/controllers/SearchController.php
@@ -19,6 +19,7 @@ use Document\models\DocumentModel;
 use Respect\Validation\Validator;
 use Slim\Http\Request;
 use Slim\Http\Response;
+use SrcCore\models\ValidatorModel;
 use User\models\UserModel;
 use Workflow\models\WorkflowModel;
 
@@ -53,16 +54,16 @@ class SearchController
         if (Validator::arrayType()->notEmpty()->validate($body['workflowStates'])) {
             $whereStatuses = [];
             if (in_array('VAL', $body['workflowStates'])) {
-                $whereStatuses[] = "(status = 'VAL' AND main_document_id not in (SELECT main_document_id FROM workflows WHERE status is null OR status in ('REF', 'END', 'STOP')))";
+                $whereStatuses[] = "main_document_id not in (SELECT DISTINCT main_document_id FROM workflows WHERE status is null OR status in ('REF', 'END', 'STOP'))";
             }
             if (in_array('REF', $body['workflowStates'])) {
-                $whereStatuses[] = "status = 'REF'";
+                $whereStatuses[] = "main_document_id in (SELECT DISTINCT main_document_id FROM workflows WHERE status = 'REF')";
             }
             if (in_array('STOP', $body['workflowStates'])) {
-                $whereStatuses[] = "status = 'STOP'";
+                $whereStatuses[] = "main_document_id in (SELECT DISTINCT main_document_id FROM workflows WHERE status = 'STOP')";
             }
             if (in_array('PROG', $body['workflowStates'])) {
-                $whereStatuses[] = "status is null";
+                $whereStatuses[] = "main_document_id in (SELECT DISTINCT main_document_id FROM workflows WHERE status is null)";
             }
             if (!empty($whereStatuses)) {
                 $whereStatuses = implode(' OR ', $whereStatuses);
@@ -90,8 +91,17 @@ class SearchController
         }
 
         if (Validator::stringType()->notEmpty()->validate($body['title'])) {
-            $where[] = 'unaccent(title) ilike unaccent(?::text)';
-            $data[] = "%{$body['title']}%";
+            $requestData = SearchController::getDataForRequest([
+                'search'        => $body['title'],
+                'fields'        => 'unaccent(title) ilike unaccent(?::text)',
+                'where'         => [],
+                'data'          => [],
+                'fieldsNumber'  => 1,
+                'longField'     => true
+            ]);
+            $where[] = implode(' AND ', $requestData['where']);
+            $data = array_merge($data, $requestData['data']);
+
         }
         if (Validator::stringType()->notEmpty()->validate($body['reference'])) {
             $where[] = 'reference ilike ?';
@@ -125,7 +135,7 @@ class SearchController
                     'userDisplay'           => UserModel::getLabelledUserById(['id' => $value['user_id']]),
                     'mode'                  => $value['mode'],
                     'processDate'           => $value['process_date'],
-                    'current'               => !$currentFound && empty($value['process_date']),
+                    'current'               => !$currentFound && empty($value['status']),
                     'signatureMode'         => $value['signature_mode'],
                     'status'                => $value['status'],
                     'reason'                => $value['note']
@@ -148,4 +158,39 @@ class SearchController
 
         return $response->withJson(['documents' => $documents, 'count' => $count]);
     }
+
+    public static function getDataForRequest(array $args)
+    {
+        ValidatorModel::notEmpty($args, ['search', 'fields', 'fieldsNumber']);
+        ValidatorModel::stringType($args, ['search', 'fields']);
+        ValidatorModel::arrayType($args, ['where', 'data']);
+        ValidatorModel::intType($args, ['fieldsNumber']);
+
+        $searchItems = explode(' ', $args['search']);
+
+        foreach ($searchItems as $keyItem => $item) {
+            if (strlen($item) >= 2) {
+                $args['where'][] = $args['fields'];
+
+                $isIncluded = false;
+                foreach ($searchItems as $key => $value) {
+                    if ($keyItem == $key) {
+                        continue;
+                    }
+                    if (strpos($value, $item) === 0) {
+                        $isIncluded = true;
+                    }
+                }
+                for ($i = 0; $i < $args['fieldsNumber']; $i++) {
+                    if (!empty($args['longField'])) {
+                        $args['data'][] = ($isIncluded ? "%{$item} %" : "%{$item}%");
+                    } else {
+                        $args['data'][] = ($isIncluded ? "%{$item}" : "%{$item}%");
+                    }
+                }
+            }
+        }
+
+        return ['where' => $args['where'], 'data' => $args['data']];
+    }
 }
diff --git a/src/app/workflow/controllers/WorkflowController.php b/src/app/workflow/controllers/WorkflowController.php
index e380c95c12..d2d13203a4 100755
--- a/src/app/workflow/controllers/WorkflowController.php
+++ b/src/app/workflow/controllers/WorkflowController.php
@@ -17,6 +17,7 @@ namespace Workflow\controllers;
 use Document\controllers\DocumentController;
 use Document\models\DocumentModel;
 use Group\controllers\PrivilegeController;
+use History\controllers\HistoryController;
 use Respect\Validation\Validator;
 use Slim\Http\Request;
 use Slim\Http\Response;
@@ -60,7 +61,7 @@ class WorkflowController
             return $response->withStatus(400)->withJson(['errors' => 'Route id is not an integer']);
         }
 
-        $document = DocumentModel::getById(['select' => ['typist'], 'id' => $args['id']]);
+        $document = DocumentModel::getById(['select' => ['typist', 'title'], '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'])) {
@@ -83,6 +84,14 @@ class WorkflowController
             'data'  => [$workflowsId]
         ]);
 
+        HistoryController::add([
+            'code'          => 'OK',
+            'objectType'    => 'workflow',
+            'objectId'      => $args['id'],
+            'type'          => 'MODIFICATION',
+            'message'       => "{workflowInterrupted} : {$document['title']}"
+        ]);
+
         return $response->withStatus(204);
     }
 }
-- 
GitLab