From 95dfcf4c9dfa8af690d93ea5030e27c0e44fa227 Mon Sep 17 00:00:00 2001
From: Guillaume Heurtier <guillaume.heurtier@maarch.org>
Date: Fri, 14 Feb 2020 11:30:09 +0100
Subject: [PATCH] FEAT #13049 TIME 0:30 added preprocess close with fields

---
 rest/index.php                                |  1 +
 .../PreProcessActionController.php            | 81 +++++++++++++++++++
 2 files changed, 82 insertions(+)

diff --git a/rest/index.php b/rest/index.php
index 38d60d1ee5c..fbd7d71ae3c 100755
--- a/rest/index.php
+++ b/rest/index.php
@@ -413,6 +413,7 @@ $app->post('/resourcesList/users/{userId}/groups/{groupId}/baskets/{basketId}/ac
 $app->post('/resourcesList/users/{userId}/groups/{groupId}/baskets/{basketId}/actions/{actionId}/checkGiveParallelOpinion', \Action\controllers\PreProcessActionController::class . ':checkGiveParallelOpinion');
 $app->post('/resourcesList/users/{userId}/groups/{groupId}/baskets/{basketId}/actions/{actionId}/checkRejectVisa', \Action\controllers\PreProcessActionController::class . ':checkRejectVisa');
 $app->post('/resourcesList/users/{userId}/groups/{groupId}/baskets/{basketId}/actions/{actionId}/checkInterruptResetVisa', \Action\controllers\PreProcessActionController::class . ':checkInterruptResetVisa');
+$app->post('/resourcesList/users/{userId}/groups/{groupId}/baskets/{basketId}/actions/{actionId}/checkCloseWithFieldsAction', \Action\controllers\PreProcessActionController::class . ':checkCloseWithFieldsAction');
 
 //Search
 $app->get('/search', \Search\controllers\SearchController::class . ':get');
diff --git a/src/app/action/controllers/PreProcessActionController.php b/src/app/action/controllers/PreProcessActionController.php
index 45ede932f03..5b3ea6e48c7 100755
--- a/src/app/action/controllers/PreProcessActionController.php
+++ b/src/app/action/controllers/PreProcessActionController.php
@@ -13,18 +13,21 @@
 namespace Action\controllers;
 
 use AcknowledgementReceipt\models\AcknowledgementReceiptModel;
+use Action\models\ActionModel;
 use Attachment\models\AttachmentModel;
 use Basket\models\BasketModel;
 use Basket\models\GroupBasketRedirectModel;
 use Contact\controllers\ContactController;
 use Contact\models\ContactModel;
 use Convert\controllers\ConvertPdfController;
+use CustomField\models\CustomFieldModel;
 use Docserver\models\DocserverModel;
 use Doctype\models\DoctypeModel;
 use Entity\models\EntityModel;
 use Entity\models\ListInstanceModel;
 use ExternalSignatoryBook\controllers\MaarchParapheurController;
 use Group\models\GroupModel;
+use IndexingModel\models\IndexingModelFieldModel;
 use Note\models\NoteModel;
 use Parameter\models\ParameterModel;
 use Resource\controllers\ResController;
@@ -1340,6 +1343,84 @@ class PreProcessActionController
         return $response->withJson(['isDestinationChanging' => $changeDestination]);
     }
 
+    public static function checkCloseWithFieldsAction(Request $request, Response $response, array $args)
+    {
+        $body = $request->getParsedBody();
+
+        if (!Validator::arrayType()->notEmpty()->validate($body['resources'])) {
+            return $response->withStatus(400)->withJson(['errors' => 'Body resources is empty or not an array']);
+        }
+
+        $errors = ResourceListController::listControl(['groupId' => $args['groupId'], 'userId' => $args['userId'], 'basketId' => $args['basketId'], 'currentUserId' => $GLOBALS['id']]);
+        if (!empty($errors['errors'])) {
+            return $response->withStatus($errors['code'])->withJson(['errors' => $errors['errors']]);
+        }
+
+        $body['resources'] = array_slice($body['resources'], 0, 500);
+        if (!ResController::hasRightByResId(['resId' => $body['resources'], 'userId' => $GLOBALS['id']])) {
+            return $response->withStatus(403)->withJson(['errors' => 'Document out of perimeter']);
+        }
+        $body['resources'] = PreProcessActionController::getNonLockedResources(['resources' => $body['resources'], 'userId' => $GLOBALS['id']]);
+
+        $action = ActionModel::getById(['id' => $args['actionId'], 'select' => ['required_fields']]);
+        if (empty($action)) {
+            return $response->withStatus(400)->withJson(['errors' => 'Action does not exist']);
+        }
+        $actionRequiredFields = json_decode($action['required_fields']);
+
+        $canClose = [];
+        $emptyFields = [];
+
+        foreach ($body['resources'] as $resId) {
+            if (!empty($actionRequiredFields)) {
+                $resource = ResModel::getById(['resId' => $resId, 'select' => ['model_id', 'custom_fields', 'alt_identifier']]);
+                $model = $resource['model_id'];
+                $resourceCustomFields = json_decode($resource['custom_fields'], true);
+                $modelFields = IndexingModelFieldModel::get([
+                    'select' => ['identifier'],
+                    'where'  => ['model_id = ?', "identifier LIKE 'indexingCustomField_%'"],
+                    'data'   => [$model]
+                ]);
+                $modelFields = array_column($modelFields, 'identifier');
+
+                $emptyList = [];
+
+                foreach ($actionRequiredFields as $actionRequiredField) {
+                    $idCustom = explode("_", $actionRequiredField)[1];
+                    if (in_array($actionRequiredField, $modelFields) && empty($resourceCustomFields[$idCustom])) {
+                        $emptyList[] = $idCustom;
+                    }
+                }
+
+                if (!empty($emptyList)) {
+                    $fieldsList = [];
+
+                    $customs = CustomFieldModel::get([
+                        'select' => ['label'],
+                        'where'  => ['id in (?)'],
+                        'data'   => [$emptyList]
+                    ]);
+
+                    foreach ($customs as $custom) {
+                        $fieldsList[] = $custom['label'];
+                    }
+
+                    $emptyFields[] = [
+                        'chrono' => $resource['alt_identifier'],
+                        'fields' => !empty($fieldsList) ? implode(", ", $fieldsList) : ''
+                    ];
+
+                } else {
+                    $canClose[] = $resId;
+                }
+            } else {
+                $canClose[] = $resId;
+            }
+        }
+
+        return $response->withJson(['emptyFields' => $emptyFields, 'canClose' => $canClose]);
+    }
+
     private static function getNonLockedResources(array $args)
     {
         ValidatorModel::notEmpty($args, ['resources', 'userId']);
-- 
GitLab