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