From 6d902898f3e903c31d505d60b9cbd95c01827e75 Mon Sep 17 00:00:00 2001
From: Guillaume Heurtier <guillaume.heurtier@maarch.org>
Date: Thu, 14 May 2020 17:10:01 +0200
Subject: [PATCH] FEAT #13827 TIME 4:00 reset fields when changing model

---
 .../resource/controllers/ResController.php    | 52 ++++++++++++++++++-
 1 file changed, 51 insertions(+), 1 deletion(-)

diff --git a/src/app/resource/controllers/ResController.php b/src/app/resource/controllers/ResController.php
index a08507f7f1f..643d7bbb890 100755
--- a/src/app/resource/controllers/ResController.php
+++ b/src/app/resource/controllers/ResController.php
@@ -260,7 +260,57 @@ class ResController extends ResourceControlController
             return $response->withStatus(400)->withJson(['errors' => $control['errors']]);
         }
 
-        $resource = ResModel::getById(['resId' => $args['resId'], 'select' => ['alt_identifier', 'filename', 'docserver_id', 'path', 'fingerprint', 'version']]);
+        $resource = ResModel::getById(['resId' => $args['resId'], 'select' => ['alt_identifier', 'filename', 'docserver_id', 'path', 'fingerprint', 'version', 'model_id', 'custom_fields']]);
+
+        if ($resource['model_id'] != $body['modelId']) {
+            $resourceModelFields = IndexingModelFieldModel::get([
+                'select' => ['identifier'],
+                'where'  => ['model_id = ?'],
+                'data'   => [$resource['model_id']]
+            ]);
+            $resourceModelFields = array_column($resourceModelFields, 'identifier');
+
+            $newModelFields = IndexingModelFieldModel::get([
+                'select' => ['identifier'],
+                'where'  => ['model_id = ?'],
+                'data'   => [$body['modelId']]
+            ]);
+            $newModelFields = array_column($newModelFields, 'identifier');
+
+            $set = [];
+            $setToNull = [
+                'confidentiality'    => 'confidentiality',
+                'admission_date'     => 'arrivalDate',
+                'departure_date'     => 'departureDate',
+                'doc_date'           => 'documentDate',
+                'process_limit_date' => 'processLimitDate',
+                'initiator'          => 'initiator',
+                'destination'        => 'destination',
+                'priority'           => 'priority'
+            ];
+            foreach ($setToNull as $key => $field) {
+                if (in_array($field, $resourceModelFields) && !in_array($field, $newModelFields)) {
+                    $set[$key] = null;
+                }
+            }
+
+            $newModelHasCustomFields = false;
+            foreach ($newModelFields as $newModelField) {
+                if (strpos($newModelField, 'indexingCustomField_') !== false) {
+                    $newModelHasCustomFields = true;
+                    break;
+                }
+            }
+
+            if (!empty($resource['custom_fields']) && !$newModelHasCustomFields) {
+                $set['custom_fields'] = '{}';
+            }
+
+            if (!empty($set)) {
+                ResModel::update(['set' => $set, 'where' => ['res_id = ?'], 'data' => [$args['resId']]]);
+            }
+        }
+
         if (!empty($resource['filename']) && !empty($body['encodedFile'])) {
             AdrModel::createDocumentAdr([
                 'resId'         => $args['resId'],
-- 
GitLab