From 1bf2242ef63a4a8c1a9fb747ba38133ba7ede1ab Mon Sep 17 00:00:00 2001
From: Guillaume Heurtier <guillaume.heurtier@maarch.org>
Date: Fri, 16 Oct 2020 16:10:26 +0200
Subject: [PATCH] FEAT #14383 TIME 2:10 do not remove technical fields when
 updating / changing model

---
 .../resource/controllers/ResController.php    | 44 +++++--------------
 .../resource/controllers/StoreController.php  | 10 ++++-
 2 files changed, 20 insertions(+), 34 deletions(-)

diff --git a/src/app/resource/controllers/ResController.php b/src/app/resource/controllers/ResController.php
index bfc3e978442..110d6a5c940 100755
--- a/src/app/resource/controllers/ResController.php
+++ b/src/app/resource/controllers/ResController.php
@@ -1410,39 +1410,17 @@ class ResController extends ResourceControlController
             }
         }
 
-        // Checking if model has a custom field. If yes, the customs are reset in the update, if not, we set it to an empty JSON object
-        $newModelHasCustomFields = false;
-        foreach ($newModelFields as $newModelField) {
-            if (strpos($newModelField, 'indexingCustomField_') !== false) {
-                $newModelHasCustomFields = true;
-                break;
-            }
-        }
-
-        $oldModelHasCustomFields = false;
-        foreach ($oldFieldList as $oldModelField) {
-            if (strpos($oldModelField, 'indexingCustomField_') !== false) {
-                $oldModelHasCustomFields = true;
-                break;
-            }
-        }
-
-        $postSet = [];
-        if ($oldModelHasCustomFields && !$newModelHasCustomFields) {
-            $set['custom_fields'] = '{}';
-        } else {
-            $customFieldsToDelete = array_diff($oldFieldList, $newModelFields);
-            $customFieldsToDelete = array_filter($customFieldsToDelete, function ($field) {
-                return strpos($field, 'indexingCustomField_') !== false;
-            });
-            $customFieldsToDelete = array_map(function ($field) {
-                return explode('_', $field)[1];
-            }, $customFieldsToDelete);
-
-            $postSet['custom_fields'] = 'custom_fields ';
-            foreach ($customFieldsToDelete as $item) {
-                $postSet['custom_fields'] .= " - '$item'";
-            }
+        $customFieldsToDelete = array_diff($oldFieldList, $newModelFields);
+        $customFieldsToDelete = array_filter($customFieldsToDelete, function ($field) {
+            return strpos($field, 'indexingCustomField_') !== false;
+        });
+        $customFieldsToDelete = array_map(function ($field) {
+            return explode('_', $field)[1];
+        }, $customFieldsToDelete);
+
+        $postSet = ['custom_fields' => 'custom_fields '];
+        foreach ($customFieldsToDelete as $item) {
+            $postSet['custom_fields'] .= " - '$item'";
         }
 
         if (!empty($set) || !empty($postSet)) {
diff --git a/src/app/resource/controllers/StoreController.php b/src/app/resource/controllers/StoreController.php
index 9e36396ea60..9daaf2aff82 100755
--- a/src/app/resource/controllers/StoreController.php
+++ b/src/app/resource/controllers/StoreController.php
@@ -268,7 +268,7 @@ class StoreController
             'modification_date' => 'CURRENT_TIMESTAMP'
         ];
 
-        $resource = ResModel::getById(['resId' => $args['resId'], 'select' => ['version', 'alt_identifier', 'external_id', 'category_id', 'type_id', 'destination']]);
+        $resource = ResModel::getById(['resId' => $args['resId'], 'select' => ['version', 'alt_identifier', 'external_id', 'category_id', 'type_id', 'destination', 'custom_fields']]);
 
         if (!empty($args['modelId'])) {
             $preparedData['model_id']    = $args['modelId'];
@@ -362,6 +362,14 @@ class StoreController
                     $args['customFields'][$key] = $value;
                 }
             }
+            $customFields = json_decode($resource['custom_fields'], true);
+            $technicalCustoms = CustomFieldModel::get(['select' => ['id'], 'where' => ['mode = ?'], 'data' => ['technical']]);
+            $technicalCustoms = array_column($technicalCustoms, 'id');
+            foreach ($technicalCustoms as $technicalCustom) {
+                if (!empty($customFields[$technicalCustom])) {
+                    $args['customFields'][$technicalCustom] = $customFields[$technicalCustom];
+                }
+            }
             $preparedData['custom_fields'] = json_encode($args['customFields']);
         }
 
-- 
GitLab