From 707a1d34d5bc451967a09b915b82460c644b0a12 Mon Sep 17 00:00:00 2001
From: "florian.azizian" <florian.azizian@maarch.org>
Date: Thu, 29 Aug 2019 13:11:21 +0100
Subject: [PATCH] FEAT #11422 TIME 2 folder migration

---
 apps/maarch_entreprise/lang/en.php            |  25 +---
 apps/maarch_entreprise/lang/fr.php            |  24 ----
 apps/maarch_entreprise/lang/nl.php            |   8 --
 migration/19.12/migrate.sh                    |   1 +
 migration/19.12/migrateFolders.php            | 119 ++++++++++++++++++
 .../folder/controllers/FolderController.php   |   6 +-
 .../app/folder/folder-tree.component.ts       |   2 +-
 .../folder-update/folder-update.component.ts  |   4 +-
 8 files changed, 127 insertions(+), 62 deletions(-)
 create mode 100644 migration/19.12/migrateFolders.php

diff --git a/apps/maarch_entreprise/lang/en.php b/apps/maarch_entreprise/lang/en.php
index fa5954384f9..7fce7bff35d 100755
--- a/apps/maarch_entreprise/lang/en.php
+++ b/apps/maarch_entreprise/lang/en.php
@@ -667,12 +667,6 @@ if (!defined('_WORDING')) {
 if (!defined('_COLLECTION')) {
     define('_COLLECTION', 'Collection');
 }
-if (!defined('_VIEW_TREE_DOCTYPES')) {
-    define('_VIEW_TREE_DOCTYPES', 'File plan tree view');
-}
-if (!defined('_VIEW_TREE_DOCTYPES_DESC')) {
-    define('_VIEW_TREE_DOCTYPES_DESC', 'See file plan tree view (Folders types, folder, sub-folder, and document types)');
-}
 
 /************************* Administration ***********************************/
 
@@ -1173,21 +1167,7 @@ if (!defined('_INFOS')) {
 }
 
 /************** Manage structure **************/
-if (!defined('_ADMIN_ARCHI')) {
-    define('_ADMIN_ARCHI', 'File plan administration');
-}
-if (!defined('_MANAGE_STRUCTURE')) {
-    define('_MANAGE_STRUCTURE', 'Manage the sub-folders');
-}
-if (!defined('_MANAGE_STRUCTURE_DESC')) {
-    define('_MANAGE_STRUCTURE_DESC', 'Administer the folders.');
-}
-if (!defined('_MANAGE_SUBFOLDER')) {
-    define('_MANAGE_SUBFOLDER', 'Manage the sub-folders');
-}
-if (!defined('_MANAGE_SUBFOLDER_DESC')) {
-    define('_MANAGE_SUBFOLDER_DESC', 'Manage the sub-folders inside the folders.');
-}
+
 if (!defined('_ARCHITECTURE')) {
     define('_ARCHITECTURE', 'File plan');
 }
@@ -3256,9 +3236,6 @@ if (!defined('_WHERE_CLAUSE_TARGET')) {
 if (!defined('_WHERE_TARGET')) {
     define('_WHERE_TARGET', 'Target');
 }
-if (!defined('_CLASS_SCHEME')) {
-    define('_CLASS_SCHEME', 'File plan');
-}
 if (!defined('_DOCS')) {
     define('_DOCS', 'Documents');
 }
diff --git a/apps/maarch_entreprise/lang/fr.php b/apps/maarch_entreprise/lang/fr.php
index 10b52dff400..55d64232bb1 100755
--- a/apps/maarch_entreprise/lang/fr.php
+++ b/apps/maarch_entreprise/lang/fr.php
@@ -659,12 +659,6 @@ if (!defined('_WORDING')) {
 if (!defined('_COLLECTION')) {
     define('_COLLECTION', 'Collection');
 }
-if (!defined('_VIEW_TREE_DOCTYPES')) {
-    define('_VIEW_TREE_DOCTYPES', 'Arborescence du plan de classement');
-}
-if (!defined('_VIEW_TREE_DOCTYPES_DESC')) {
-    define('_VIEW_TREE_DOCTYPES_DESC', "Voir l'arborescence du plan de classement (types de dossiers, chemises, sous-chemises et types de document)");
-}
 
 /************************* Administration ***********************************/
 
@@ -1174,21 +1168,6 @@ if (!defined('_INFOS')) {
 }
 
 /************** Admin de l'architecture  (plan de classement) **************/
-if (!defined('_ADMIN_ARCHI')) {
-    define('_ADMIN_ARCHI', 'Administration du plan de classement');
-}
-if (!defined('_MANAGE_STRUCTURE')) {
-    define('_MANAGE_STRUCTURE', 'Gérer les chemises');
-}
-if (!defined('_MANAGE_STRUCTURE_DESC')) {
-    define('_MANAGE_STRUCTURE_DESC', "Administrer les chemises. Celles-ci constituent l'élément le plus haut du plan de classement. Si le module Folder est connecté, vous pouvez associer un type de dossier à un plan de classement.");
-}
-if (!defined('_MANAGE_SUBFOLDER')) {
-    define('_MANAGE_SUBFOLDER', 'Gérer les sous-chemises');
-}
-if (!defined('_MANAGE_SUBFOLDER_DESC')) {
-    define('_MANAGE_SUBFOLDER_DESC', "Gérer les sous-chemises à l'intérieur des chemises.");
-}
 if (!defined('_ARCHITECTURE')) {
     define('_ARCHITECTURE', 'Plan de classement');
 }
@@ -3282,9 +3261,6 @@ if (!defined('_WHERE_CLAUSE_TARGET')) {
 if (!defined('_WHERE_TARGET')) {
     define('_WHERE_TARGET', 'Cible');
 }
-if (!defined('_CLASS_SCHEME')) {
-    define('_CLASS_SCHEME', 'Plan de classement');
-}
 if (!defined('_DOCS')) {
     define('_DOCS', 'Documents');
 }
diff --git a/apps/maarch_entreprise/lang/nl.php b/apps/maarch_entreprise/lang/nl.php
index fc8df72e0da..413121ad48c 100755
--- a/apps/maarch_entreprise/lang/nl.php
+++ b/apps/maarch_entreprise/lang/nl.php
@@ -218,8 +218,6 @@ if (!defined('_VIEW_HISTORY2')) { define('_VIEW_HISTORY2', 'Weergave van de gesc
 if (!defined('_VIEW_HISTORY_BATCH2')) { define('_VIEW_HISTORY_BATCH2', 'Weergave van de geschiedenis van de batches');}
 if (!defined('_WORDING')) { define('_WORDING', 'Omschrijving');}
 if (!defined('_COLLECTION')) { define('_COLLECTION', 'Verzameling');}
-if (!defined('_VIEW_TREE_DOCTYPES')) { define('_VIEW_TREE_DOCTYPES', 'Boomstructuur van het klasseringsplan');}
-if (!defined('_VIEW_TREE_DOCTYPES_DESC')) { define('_VIEW_TREE_DOCTYPES_DESC', 'De boomstructuur van het klasseringsplan (type mappen, submappen en documenttypes) bekijken');}
 if (!defined('_GROUPS_LIST')) { define('_GROUPS_LIST', 'Groepslijst');}
 if (!defined('_ADMIN_GROUP')) { define('_ADMIN_GROUP', 'Beheergroep');}
 if (!defined('_ADD_GROUP')) { define('_ADD_GROUP', 'Groep toevoegen');}
@@ -376,11 +374,6 @@ if (!defined('_TOTAL_PROCESSED')) { define('_TOTAL_PROCESSED', 'Verwerkte docume
 if (!defined('_TOTAL_ERRORS')) { define('_TOTAL_ERRORS', 'Documenten met fouten');}
 if (!defined('_ONLY_ERRORS')) { define('_ONLY_ERRORS', 'Enkel met fouten');}
 if (!defined('_INFOS')) { define('_INFOS', 'Informatie');}
-if (!defined('_ADMIN_ARCHI')) { define('_ADMIN_ARCHI', 'Beheer van het klasseringsplan');}
-if (!defined('_MANAGE_STRUCTURE')) { define('_MANAGE_STRUCTURE', 'Mappen beheren');}
-if (!defined('_MANAGE_STRUCTURE_DESC')) { define('_MANAGE_STRUCTURE_DESC', 'Mappen beheren Deze zijn het hoogste element van het klasseringsplan. Indien de Directorymodule verbonden is, kunt u een dossiertype aan een klasseringsplan koppelen.');}
-if (!defined('_MANAGE_SUBFOLDER')) { define('_MANAGE_SUBFOLDER', 'De submappen beheren');}
-if (!defined('_MANAGE_SUBFOLDER_DESC')) { define('_MANAGE_SUBFOLDER_DESC', 'De submappen binnen de mappen beheren.');}
 if (!defined('_ARCHITECTURE')) { define('_ARCHITECTURE', 'Klasseringsplan');}
 if (!defined('_MORE_INFOS')) { define('_MORE_INFOS', 'Neem contact op met uw beheerder voor meer informatie');}
 if (!defined('_ALREADY_EXISTS')) { define('_ALREADY_EXISTS', 'bestaat reeds');}
@@ -1042,7 +1035,6 @@ if (!defined('_SSO_LOGIN')) { define('_SSO_LOGIN', 'Login via SSO');}
 if (!defined('_LDAP')) { define('_LDAP', 'LDAP directory');}
 if (!defined('_WHERE_CLAUSE_TARGET')) { define('_WHERE_CLAUSE_TARGET', 'Doel van de WHERE clause');}
 if (!defined('_WHERE_TARGET')) { define('_WHERE_TARGET', 'Doel');}
-if (!defined('_CLASS_SCHEME')) { define('_CLASS_SCHEME', 'Klasseringsplan');}
 if (!defined('_DOCS')) { define('_DOCS', 'Documenten');}
 if (!defined('_GO_MANAGE_USER')) { define('_GO_MANAGE_USER', 'Wijzigen');}
 if (!defined('_GO_MANAGE_DOCSERVER')) { define('_GO_MANAGE_DOCSERVER', 'Wijzigen');}
diff --git a/migration/19.12/migrate.sh b/migration/19.12/migrate.sh
index 63b007781c5..c2c4ff2afcd 100644
--- a/migration/19.12/migrate.sh
+++ b/migration/19.12/migrate.sh
@@ -1,6 +1,7 @@
 #!/bin/sh
 php ./migrateCustomFields.php
 php ./migrateFileplans.php
+php ./migrateFolders.php
 php ./migrateFullText.php
 php ./migrateIndexing.php
 php ./migrateServicesEntities.php
diff --git a/migration/19.12/migrateFolders.php b/migration/19.12/migrateFolders.php
new file mode 100644
index 00000000000..e16adcc4924
--- /dev/null
+++ b/migration/19.12/migrateFolders.php
@@ -0,0 +1,119 @@
+<?php
+
+require '../../vendor/autoload.php';
+
+chdir('../..');
+
+$customs =  scandir('custom');
+
+foreach ($customs as $custom) {
+    if ($custom == 'custom.xml' || $custom == '.' || $custom == '..') {
+        continue;
+    }
+
+    \SrcCore\models\DatabasePDO::reset();
+    new \SrcCore\models\DatabasePDO(['customId' => $custom]);
+
+    $migrated = 0;
+    $folders = \SrcCore\models\DatabaseModel::select([
+        'select'   => ['folders_system_id', 'typist', 'destination', 'folder_name', 'parent_id'],
+        'table'    => ['folder_tmp'],
+        'order_by' => ['parent_id asc']
+    ]);
+
+    if (!empty($folders)) {
+        $superadmin = \User\models\UserModel::getByLogin(['select' => ['id'], 'login' => 'superadmin']);
+        if (empty($superadmin)) {
+            $firstMan = \User\models\UserModel::get(['select' => ['id'], 'orderBy' => ['id'], 'limit' => 1]);
+            $masterOwnerId = $firstMan[0]['id'];
+        } else {
+            $masterOwnerId = $superadmin['id'];
+        }
+
+        $masterFolderId = \Folder\models\FolderModel::create([
+            'label'     => 'Reprise Dossier',
+            'public'    => true,
+            'user_id'   => $masterOwnerId,
+            'parent_id' => null,
+            'level'     => 0
+        ]);
+
+        $GLOBALS['entities'] = \Entity\models\EntityModel::get(['select' => ['id']]);
+        fillEntities($masterFolderId);
+
+        $aFolderIdMap = [];
+        foreach ($folders as $folder) {
+            $user = \User\models\UserModel::getByLogin(['select' => ['id'], 'login' => $folder['typist']]);
+            if (empty($folder['destination'])) {
+                // Public
+                if (empty($user)) {
+                    $user['id'] = $masterOwnerId;
+                }
+
+                $folderId = \Folder\models\FolderModel::create([
+                    'label'     => $folder['folder_name'],
+                    'public'    => true,
+                    'user_id'   => $user['id'],
+                    'parent_id' => empty($folder['parent_id']) ? $masterFolderId : $aFolderIdMap[$folder['parent_id']],
+                    'level'     => empty($folder['parent_id']) ? 1 : 2
+                ]);
+                fillEntities($folderId);
+            } elseif (!empty($user)) {
+                // Private
+                $entity = \Entity\models\EntityModel::getByEntityId(['select' => ['id'], 'entityId' => $folder['destination']]);
+                if (empty($entity)) {
+                    continue;
+                }
+
+                $folderId = \Folder\models\FolderModel::create([
+                    'label'     => $folder['folder_name'],
+                    'public'    => true,
+                    'user_id'   => $user['id'],
+                    'parent_id' => $aFolderIdMap[$folder['parent_id']],
+                    'level'     => empty($folder['parent_id']) ? 0 : 1
+                ]);
+
+                \Folder\models\EntityFolderModel::create([
+                    'folder_id' => $folderId,
+                    'entity_id' => $entity['id'],
+                    'edition'   => true,
+                ]);
+
+                fillResources($folderId, $folder['folders_system_id']);
+            }
+
+            $aFolderIdMap[$folder['folders_system_id']] = $folderId;
+            ++$migrated;
+        }
+    }
+
+    printf("Migration Dossier (CUSTOM {$custom}) : " . $migrated . " Dossier(s) trouvé(s) et migré(s).\n");
+}
+
+function fillEntities($folderId)
+{
+    foreach ($GLOBALS['entities'] as $entity) {
+        \Folder\models\EntityFolderModel::create([
+            'folder_id' => $folderId,
+            'entity_id' => $entity['id'],
+            'edition'   => true,
+        ]);
+    }
+}
+
+function fillResources($folderId, $folderSystemId)
+{
+    $resources = \SrcCore\models\DatabaseModel::select([
+        'select'    => ['res_id'],
+        'table'     => ['res_letterbox'],
+        'where'     => ['folders_system_id = ?'],
+        'data'      => [$folderSystemId]
+    ]);
+
+    foreach ($resources as $resource) {
+        \Folder\models\ResourceFolderModel::create([
+            'folder_id' => $folderId,
+            'res_id'    => $resource['res_id']
+        ]);
+    }
+}
diff --git a/src/app/folder/controllers/FolderController.php b/src/app/folder/controllers/FolderController.php
index 342342c0f10..ba52c818f8b 100755
--- a/src/app/folder/controllers/FolderController.php
+++ b/src/app/folder/controllers/FolderController.php
@@ -129,7 +129,7 @@ class FolderController
         }
 
         if (empty($data['parent_id'])) {
-            $data['parent_id'] = 0;
+            $data['parent_id'] = null;
             $owner  = $GLOBALS['id'];
             $public = false;
             $level  = 0;
@@ -184,7 +184,7 @@ class FolderController
         if (!Validator::stringType()->notEmpty()->validate($data['label'])) {
             return $response->withStatus(400)->withJson(['errors' => 'Body label is empty or not a string']);
         }
-        if (!empty($data['parent_id']) &&!Validator::intval()->validate($data['parent_id'])) {
+        if (!empty($data['parent_id']) && !Validator::intval()->validate($data['parent_id'])) {
             return $response->withStatus(400)->withJson(['errors' => 'Body parent_id is not a numeric']);
         }
         if ($data['parent_id'] == $aArgs['id']) {
@@ -197,7 +197,7 @@ class FolderController
         }
 
         if (empty($data['parent_id'])) {
-            $data['parent_id'] = 0;
+            $data['parent_id'] = null;
             $level = 0;
         } else {
             $folder = FolderController::getScopeFolders(['login' => $GLOBALS['userId'], 'folderId' => $data['parent_id']]);
diff --git a/src/frontend/app/folder/folder-tree.component.ts b/src/frontend/app/folder/folder-tree.component.ts
index 63e16679f7c..c7ef091fdce 100644
--- a/src/frontend/app/folder/folder-tree.component.ts
+++ b/src/frontend/app/folder/folder-tree.component.ts
@@ -183,7 +183,7 @@ export class FolderTreeComponent implements OnInit {
 
     flatToNestedObject(data: any) {
         const nested = data.reduce((initial: any, value: any, index: any, original: any) => {
-            if (value.parent_id === 0) {
+            if (value.parent_id === null) {
                 if (initial.left.length) {
                     this.checkLeftOvers(initial.left, value);
                 }
diff --git a/src/frontend/app/folder/folder-update/folder-update.component.ts b/src/frontend/app/folder/folder-update/folder-update.component.ts
index 9b38515dc8e..35003c842fb 100644
--- a/src/frontend/app/folder/folder-update/folder-update.component.ts
+++ b/src/frontend/app/folder/folder-update/folder-update.component.ts
@@ -22,7 +22,7 @@ export class FolderUpdateComponent implements OnInit {
         label: '',
         public: true,
         user_id: 0,
-        parent_id: 0,
+        parent_id: null,
         level: 0,
         sharing: {
             entities: []
@@ -66,7 +66,7 @@ export class FolderUpdateComponent implements OnInit {
                     element['state'] = {
                         opened: true
                     }
-                    if (element.parent_id === 0) {
+                    if (element.parent_id === null) {
                         element.parent_id = '#';
                     }
 
-- 
GitLab