From aa253ee4f178ec83f456720773d707c7777c8aa3 Mon Sep 17 00:00:00 2001
From: Guillaume Heurtier <guillaume.heurtier@maarch.org>
Date: Thu, 13 Feb 2020 17:43:16 +0100
Subject: [PATCH] FEAT #13049 TIME 1:00 set action required_fields in action
 create/update

---
 .../action/controllers/ActionController.php   | 43 +++++++++++++++++++
 src/app/action/models/ActionModelAbstract.php | 29 +++++++------
 2 files changed, 58 insertions(+), 14 deletions(-)

diff --git a/src/app/action/controllers/ActionController.php b/src/app/action/controllers/ActionController.php
index b45b670fa99..2c13eec8f14 100755
--- a/src/app/action/controllers/ActionController.php
+++ b/src/app/action/controllers/ActionController.php
@@ -13,6 +13,7 @@
 namespace Action\controllers;
 
 use Basket\models\GroupBasketRedirectModel;
+use CustomField\models\CustomFieldModel;
 use Group\controllers\GroupController;
 use Group\controllers\PrivilegeController;
 use Group\models\GroupModel;
@@ -104,6 +105,28 @@ class ActionController
         }
 
         unset($body['actionPageId']);
+
+        if (!empty($body['required_fields'])) {
+            if (!Validator::arrayType()->validate($body['required_fields'])) {
+                return $response->withStatus(400)->withJson(['errors' => 'Data required_fields is not an array']);
+            }
+            $customFields = CustomFieldModel::get(['select' => ['id']]);
+            $customFields = array_column($customFields, 'id');
+            $requiredFields = [];
+            foreach ($body['required_fields'] as $key => $requiredField) {
+                if (strpos($requiredField, 'indexingCustomField_') !== false) {
+                    $idCustom = explode("_", $requiredField);
+                    $idCustom = $idCustom[1];
+                    if (!in_array($idCustom, $customFields)) {
+                        return $response->withStatus(400)->withJson(['errors' => 'Data custom field does not exist']);
+                    }
+                    $requiredFields[] = $requiredField;
+                }
+            }
+
+            $body['required_fields'] = json_encode($requiredFields);
+        }
+
         $id = ActionModel::create($body);
         if (!empty($body['actionCategories'])) {
             ActionModel::createCategories(['id' => $id, 'categories' => $body['actionCategories']]);
@@ -147,6 +170,26 @@ class ActionController
             return $response->withStatus(400)->withJson(['errors' => 'Data actionPageId does not exist']);
         }
 
+        $requiredFields = [];
+        if (!empty($body['required_fields'])) {
+            if (!Validator::arrayType()->validate($body['required_fields'])) {
+                return $response->withStatus(400)->withJson(['errors' => 'Data required_fields is not an array']);
+            }
+            $customFields = CustomFieldModel::get(['select' => ['id']]);
+            $customFields = array_column($customFields, 'id');
+            foreach ($body['required_fields'] as $key => $requiredField) {
+                if (strpos($requiredField, 'indexingCustomField_') !== false) {
+                    $idCustom = explode("_", $requiredField);
+                    $idCustom = $idCustom[1];
+                    if (!in_array($idCustom, $customFields)) {
+                        return $response->withStatus(400)->withJson(['errors' => 'Data custom field does not exist']);
+                    }
+                    $requiredFields[] = $requiredField;
+                }
+            }
+        }
+        $body['required_fields'] = json_encode($requiredFields);
+
         ActionModel::update($body);
         ActionModel::deleteCategories(['id' => $aArgs['id']]);
         if (!empty($body['actionCategories'])) {
diff --git a/src/app/action/models/ActionModelAbstract.php b/src/app/action/models/ActionModelAbstract.php
index 016f86c6d22..2970b33391b 100755
--- a/src/app/action/models/ActionModelAbstract.php
+++ b/src/app/action/models/ActionModelAbstract.php
@@ -71,23 +71,24 @@ abstract class ActionModelAbstract
         return $nextSequenceId;
     }
 
-    public static function update(array $aArgs)
+    public static function update(array $args)
     {
-        ValidatorModel::notEmpty($aArgs, ['id']);
-        ValidatorModel::intVal($aArgs, ['id']);
-        
+        ValidatorModel::notEmpty($args, ['id']);
+        ValidatorModel::intVal($args, ['id']);
+
         DatabaseModel::update([
-            'table'     => 'actions',
-            'set'       => [
-                'keyword'           => $aArgs['keyword'],
-                'label_action'      => $aArgs['label_action'],
-                'id_status'         => $aArgs['id_status'],
-                'action_page'       => $aArgs['action_page'],
-                'component'         => $aArgs['component'],
-                'history'           => $aArgs['history'],
+            'table' => 'actions',
+            'set'   => [
+                'keyword'         => $args['keyword'],
+                'label_action'    => $args['label_action'],
+                'id_status'       => $args['id_status'],
+                'action_page'     => $args['action_page'],
+                'component'       => $args['component'],
+                'history'         => $args['history'],
+                'required_fields' => $args['required_fields'],
             ],
-            'where'     => ['id = ?'],
-            'data'      => [$aArgs['id']]
+            'where' => ['id = ?'],
+            'data'  => [$args['id']]
         ]);
 
         return true;
-- 
GitLab