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