From e93ca96971491adb8509b1a52e19d88be4264278 Mon Sep 17 00:00:00 2001
From: Guillaume Heurtier <guillaume.heurtier@maarch.org>
Date: Fri, 6 Nov 2020 13:50:51 +0100
Subject: [PATCH] FEAT #15370 TIME 7:00 fix migration

---
 migration/20.10/2010.sql                | 24 +++++++++++++++++++++++-
 migration/20.10/migrateSavedQueries.php | 18 ++++++++++--------
 2 files changed, 33 insertions(+), 9 deletions(-)

diff --git a/migration/20.10/2010.sql b/migration/20.10/2010.sql
index 184dffa9ac4..aa2abb0fb22 100755
--- a/migration/20.10/2010.sql
+++ b/migration/20.10/2010.sql
@@ -120,6 +120,13 @@ DO $$ BEGIN
     IF (SELECT count(column_name) from information_schema.columns where table_name = 'res_attachments' and column_name = 'typist' and data_type != 'integer') THEN
         ALTER TABLE res_attachments ADD COLUMN typist_tmp INTEGER;
         UPDATE res_attachments set typist_tmp = (select id FROM users where users.user_id = res_attachments.typist);
+        UPDATE res_attachments set typist_tmp = (SELECT
+                                                     CASE
+                                                         WHEN (SELECT count(id) FROM users WHERE user_id = 'superadmin') > 0 THEN
+                                                             (SELECT id FROM users WHERE user_id = 'superadmin')
+                                                         ELSE
+                                                             (SELECT id FROM users WHERE status = 'OK' ORDER BY id LIMIT 1)
+                                                         END) WHERE typist_tmp IS NULL;
         ALTER TABLE res_attachments DROP COLUMN IF EXISTS typist;
         ALTER TABLE res_attachments RENAME COLUMN typist_tmp TO typist;
     END IF;
@@ -146,6 +153,14 @@ DO $$ BEGIN
         ALTER TABLE listinstance ADD COLUMN item_id_tmp INTEGER;
         UPDATE listinstance set item_id_tmp = (select id FROM users where users.user_id = listinstance.item_id) WHERE item_type = 'user_id';
         UPDATE listinstance set item_id_tmp = (select id FROM entities where entities.entity_id = listinstance.item_id) WHERE item_type = 'entity_id';
+        UPDATE listinstance set item_id_tmp = (SELECT
+                                                     CASE
+                                                         WHEN (SELECT count(id) FROM users WHERE user_id = 'superadmin') > 0 THEN
+                                                             (SELECT id FROM users WHERE user_id = 'superadmin')
+                                                         ELSE
+                                                             (SELECT id FROM users WHERE status = 'OK' ORDER BY id LIMIT 1)
+                                                         END) WHERE item_id_tmp IS NULL AND item_type = 'user_id';
+        UPDATE listinstance set item_id_tmp = (SELECT id FROM entities WHERE enabled = 'Y' ORDER BY id LIMIT 1) WHERE item_id_tmp IS NULL AND item_type = 'entity_id';
         ALTER TABLE listinstance DROP COLUMN IF EXISTS item_id;
         ALTER TABLE listinstance RENAME COLUMN item_id_tmp TO item_id;
         UPDATE baskets SET basket_clause = REGEXP_REPLACE(basket_clause, 'item_id(\s*)=(\s*)@user ', 'item_id = @user_id ', 'gmi');
@@ -159,6 +174,13 @@ DO $$ BEGIN
     IF (SELECT count(column_name) from information_schema.columns where table_name = 'listinstance' and column_name = 'added_by_user' and data_type != 'integer') THEN
         ALTER TABLE listinstance ADD COLUMN added_by_user_tmp INTEGER;
         UPDATE listinstance set added_by_user_tmp = (select id FROM users where users.user_id = listinstance.added_by_user);
+        UPDATE listinstance set added_by_user_tmp = (SELECT
+                                                   CASE
+                                                       WHEN (SELECT count(id) FROM users WHERE user_id = 'superadmin') > 0 THEN
+                                                           (SELECT id FROM users WHERE user_id = 'superadmin')
+                                                       ELSE
+                                                           (SELECT id FROM users WHERE status = 'OK' ORDER BY id LIMIT 1)
+                                                       END) WHERE added_by_user_tmp IS NULL;
         ALTER TABLE listinstance DROP COLUMN IF EXISTS added_by_user;
         ALTER TABLE listinstance RENAME COLUMN added_by_user_tmp TO added_by_user;
     END IF;
@@ -166,7 +188,7 @@ END$$;
 DO $$ BEGIN
     IF (SELECT count(column_name) from information_schema.columns where table_name = 'history' and column_name = 'user_id' and data_type != 'integer') THEN
         ALTER TABLE history ADD COLUMN user_id_tmp INTEGER;
-        UPDATE history set user_id_tmp = (select id FROM users where users.user_id = history.user_id);
+        UPDATE history set user_id_tmp = (select id FROM users where lower(users.user_id) = lower(history.user_id));
         ALTER TABLE history DROP COLUMN IF EXISTS user_id;
         ALTER TABLE history RENAME COLUMN user_id_tmp TO user_id;
         UPDATE history set record_id = (select id FROM users where users.user_id = history.record_id) WHERE table_name = 'users';
diff --git a/migration/20.10/migrateSavedQueries.php b/migration/20.10/migrateSavedQueries.php
index b9521f21193..556adb17004 100644
--- a/migration/20.10/migrateSavedQueries.php
+++ b/migration/20.10/migrateSavedQueries.php
@@ -91,15 +91,15 @@ foreach ($customs as $custom) {
             } elseif ($key == 'confidentiality') {
                 $query[] = ['identifier' => 'confidentiality', 'values' => [['id' => $value['fields']['confidentiality'][0] == 'Y', 'label' => $value['fields']['confidentiality'][0] == 'Y' ? 'Oui' : 'Non']]];
             } elseif ($key == 'creation_date') {
-                $query[] = ['identifier' => 'creationDate', 'values' => ['start' => getFormattedDate($value['fields']['creation_date_from'][0]), 'end' => getFormattedDate($value['fields']['creation_date_to'][0])]];
+                $query[] = ['identifier' => 'creationDate', 'values' => ['start' => getFormattedDate(['date' => $value['fields']['creation_date_from'][0]]), 'end' => getFormattedDate(['date' => $value['fields']['creation_date_to'][0]])]];
             } elseif ($key == 'doc_date') {
-                $query[] = ['identifier' => 'documentDate', 'values' => ['start' => getFormattedDate($value['fields']['doc_date_from'][0]), 'end' => getFormattedDate($value['fields']['doc_date_to'][0])]];
+                $query[] = ['identifier' => 'documentDate', 'values' => ['start' => getFormattedDate(['date' => $value['fields']['doc_date_from'][0]]), 'end' => getFormattedDate(['date' => $value['fields']['doc_date_to'][0]])]];
             } elseif ($key == 'admission_date') {
-                $query[] = ['identifier' => 'arrivalDate', 'values' => ['start' => getFormattedDate($value['fields']['admission_date_from'][0]), 'end' => getFormattedDate($value['fields']['admission_date_to'][0])]];
+                $query[] = ['identifier' => 'arrivalDate', 'values' => ['start' => getFormattedDate(['date' => $value['fields']['admission_date_from'][0]]), 'end' => getFormattedDate(['date' => $value['fields']['admission_date_to'][0]])]];
             } elseif ($key == 'exp_date') {
-                $query[] = ['identifier' => 'departureDate', 'values' => ['start' => getFormattedDate($value['fields']['exp_date_from'][0]), 'end' => getFormattedDate($value['fields']['exp_date_to'][0])]];
+                $query[] = ['identifier' => 'departureDate', 'values' => ['start' => getFormattedDate(['date' => $value['fields']['exp_date_from'][0]]), 'end' => getFormattedDate(['date' => $value['fields']['exp_date_to'][0]])]];
             } elseif ($key == 'process_limit_date') {
-                $query[] = ['identifier' => 'processLimitDate', 'values' => ['start' => getFormattedDate($value['fields']['process_limit_date_from'][0]), 'end' => getFormattedDate($value['fields']['process_limit_date_to'][0])]];
+                $query[] = ['identifier' => 'processLimitDate', 'values' => ['start' => getFormattedDate(['date' => $value['fields']['process_limit_date_from'][0]]), 'end' => getFormattedDate(['date' => $value['fields']['process_limit_date_to'][0]])]];
             } elseif ($key == 'destination_mu') {
                 $allEntities = [];
                 if (!empty($value['fields']['services_chosen']) && is_array($value['fields']['services_chosen'])) {
@@ -206,12 +206,14 @@ foreach ($customs as $custom) {
     printf("Migration recherches sauvegardées (CUSTOM {$custom}) : {$migrated} sauvegarde(s) trouvée(s) et migrée(s).\n");
 }
 
-function getFormattedDate(string $date)
+function getFormattedDate(array $args)
 {
-    if (empty($date)) {
+    \SrcCore\models\ValidatorModel::stringType($args, ['date']);
+
+    if (empty($args['date'])) {
         return null;
     }
-    $date = new \DateTime($date);
+    $date = new \DateTime($args['date']);
     $date->setTime(00, 00, 00);
 
     return $date->format('Y-m-d');
-- 
GitLab