From ae4061d42952e87ce063fc398f82b7bfffac6d7e Mon Sep 17 00:00:00 2001
From: "florian.azizian" <florian.azizian@maarch.org>
Date: Tue, 13 Feb 2018 17:49:44 +0100
Subject: [PATCH] FEAT #76 administration doctype + TU

---
 composer.json                                 |   1 +
 core/Test/DoctypeControllerTest.php           |   4 +-
 ...ontroller.php => FirstLevelController.php} |   0
 .../controllers/SecondLevelController.php     | 193 ++++++++++++++++++
 .../doctype/models/DoctypeModelAbstract.php   | 193 ++++--------------
 .../models/FirstLevelModelAbstract.php        | 168 +--------------
 .../models/SecondLevelModelAbstract.php       | 170 ++-------------
 src/app/folder/models/FolderTypeModel.php     |  21 ++
 .../folder/models/FolderTypeModelAbstract.php |  69 +++++++
 9 files changed, 354 insertions(+), 465 deletions(-)
 rename src/app/doctype/controllers/{DoctypeController.php => FirstLevelController.php} (100%)
 create mode 100644 src/app/doctype/controllers/SecondLevelController.php
 create mode 100644 src/app/folder/models/FolderTypeModel.php
 create mode 100644 src/app/folder/models/FolderTypeModelAbstract.php

diff --git a/composer.json b/composer.json
index 3ef1b0d6cda..dee2afac1dd 100755
--- a/composer.json
+++ b/composer.json
@@ -8,6 +8,7 @@
             "Docserver\\"     : "src/app/docserver/",
             "Doctype\\"       : "src/app/doctype/",
             "Entity\\"        : "src/app/entity/",
+            "Folder\\"        : "src/app/folder/",
             "History\\"       : "src/app/history/",
             "Link\\"          : "src/app/link/",
             "Notification\\"  : "src/app/notification/",
diff --git a/core/Test/DoctypeControllerTest.php b/core/Test/DoctypeControllerTest.php
index f9fe6629468..43a89d9e0c6 100755
--- a/core/Test/DoctypeControllerTest.php
+++ b/core/Test/DoctypeControllerTest.php
@@ -22,7 +22,7 @@ class DoctypesControllerTest extends TestCase
         $environment  = \Slim\Http\Environment::mock(['REQUEST_METHOD' => 'GET']);
         $request      = \Slim\Http\Request::createFromEnvironment($environment);
 
-        $doctypeController = new \Doctype\controllers\DoctypeController();
+        $doctypeController = new \Doctype\controllers\FirstLevelController();
         $response          = $doctypeController->get($request, new \Slim\Http\Response());
         $responseBody      = json_decode((string)$response->getBody());
 
@@ -42,7 +42,7 @@ class DoctypesControllerTest extends TestCase
         $environment  = \Slim\Http\Environment::mock(['REQUEST_METHOD' => 'GET']);
         $request      = \Slim\Http\Request::createFromEnvironment($environment);
 
-        $doctypeController = new \Doctype\controllers\DoctypeController();
+        $doctypeController = new \Doctype\controllers\FirstLevelController();
         $response          = $doctypeController->getFirstLevelById($request, new \Slim\Http\Response(), ["id" => self::$firstLevelId]);
         $responseBody      = json_decode((string)$response->getBody());  
 
diff --git a/src/app/doctype/controllers/DoctypeController.php b/src/app/doctype/controllers/FirstLevelController.php
similarity index 100%
rename from src/app/doctype/controllers/DoctypeController.php
rename to src/app/doctype/controllers/FirstLevelController.php
diff --git a/src/app/doctype/controllers/SecondLevelController.php b/src/app/doctype/controllers/SecondLevelController.php
new file mode 100644
index 00000000000..546a412f8de
--- /dev/null
+++ b/src/app/doctype/controllers/SecondLevelController.php
@@ -0,0 +1,193 @@
+<?php
+/**
+* Copyright Maarch since 2008 under licence GPLv3.
+* See LICENCE.txt file at the root folder for more details.
+* This file is part of Maarch software.
+
+* @brief   SecondLevelController
+* @author  dev <dev@maarch.org>
+* @ingroup core
+*/
+
+namespace Doctype\controllers;
+
+use History\controllers\HistoryController;
+use Respect\Validation\Validator;
+use Doctype\models\FirstLevelModel;
+use Doctype\models\SecondLevelModel;
+use Doctype\models\DoctypeModel;
+use Core\Models\ServiceModel;
+use Slim\Http\Request;
+use Slim\Http\Response;
+
+class SecondLevelController
+{
+
+    public function getById(Request $request, Response $response, $aArgs)
+    {
+
+        if (!Validator::intVal()->validate($aArgs['id']) || !Validator::notEmpty()->validate($aArgs['id'])) {
+            return $response
+                ->withStatus(500)
+                ->withJson(['errors' => 'wrong format for id']);
+        }
+
+        $obj = SecondLevelModel::getById(['id' => $aArgs['id']]);
+
+        if(!empty($obj)){
+            if ($obj['enabled'] == 'Y') {
+                $obj['enabled'] = true;
+            } else {
+                $obj['enabled'] = false;
+            }
+        }
+  
+        return $response->withJson($obj);
+    }
+
+    public function initSecondLevel(Request $request, Response $response, $aArgs)
+    {
+        $obj['secondLevel'] = FirstLevelModel::get(['select' => ['doctypes_first_level_id', 'doctypes_first_level_label']]);
+        return $response->withJson($obj);
+    }
+
+    public function create(Request $request, Response $response)
+    {
+        if (!ServiceModel::hasService(['id' => 'admin_architecture', 'userId' => $GLOBALS['userId'], 'location' => 'apps', 'type' => 'admin'])) {
+            return $response->withStatus(403)->withJson(['errors' => 'Service forbidden']);
+        }
+
+        $data = $request->getParams();
+        $data = $this->manageValue($data);
+        
+        $errors = $this->control($data, 'create');
+        if (!empty($errors)) {
+            return $response->withStatus(500)->withJson(['errors' => $errors]);
+        }
+    
+        $obj = SecondLevelModel::create($data);
+
+        HistoryController::add([
+            'tableName' => 'doctypes_second_level',
+            'recordId'  => $obj['doctypes_second_level_id'],
+            'eventType' => 'ADD',
+            'eventId'   => 'subfolderadd',
+            'info'      => _DOCTYPE_SECONDLEVEL_ADDED . ' : ' . $obj['doctypes_second_level_label']
+        ]);
+
+        return $response->withJson(
+            [
+            'secondLevel'  => $obj
+            ]
+        );
+    }
+
+    public function update(Request $request, Response $response, $aArgs)
+    {
+        if (!ServiceModel::hasService(['id' => 'admin_architecture', 'userId' => $GLOBALS['userId'], 'location' => 'apps', 'type' => 'admin'])) {
+            return $response->withStatus(403)->withJson(['errors' => 'Service forbidden']);
+        }
+
+        $data                             = $request->getParams();
+        $data['doctypes_second_level_id'] = $aArgs['id'];
+
+        $data   = $this->manageValue($data);
+        $errors = $this->control($data, 'update');
+      
+        if (!empty($errors)) {
+            return $response
+                ->withStatus(500)
+                ->withJson(['errors' => $errors]);
+        }
+
+        $obj = SecondLevelModel::update($data);
+
+        HistoryController::add([
+            'tableName' => 'doctypes_second_level',
+            'recordId'  => $obj['doctypes_second_level_id'],
+            'eventType' => 'UP',
+            'eventId'   => 'subfolderup',
+            'info'      => _DOCTYPE_SECONDLEVEL_UPDATED. ' : ' . $obj['doctypes_second_level_label']
+        ]);
+
+        return $response->withJson(
+            [
+            'secondLevel'  => $obj
+            ]
+        );
+    }
+
+    public function delete(Request $request, Response $response, $aArgs)
+    {
+        if (!ServiceModel::hasService(['id' => 'admin_architecture', 'userId' => $GLOBALS['userId'], 'location' => 'apps', 'type' => 'admin'])) {
+            return $response->withStatus(403)->withJson(['errors' => 'Service forbidden']);
+        }
+
+        if (!Validator::intVal()->validate($aArgs['id'])) {
+            return $response
+                ->withStatus(500)
+                ->withJson(['errors' => 'Id is not a numeric']);
+        }
+
+        $secondLevel = SecondLevelModel::getById(['id' => $aArgs['id']]);
+        SecondLevelModel::update(['doctypes_second_level_id' => $aArgs['id'], 'enabled' => 'N']);
+        DoctypeModel::disabledSecondLevel(['doctypes_second_level_id' => $aArgs['id'], 'enabled' => 'N']);
+
+        HistoryController::add([
+            'tableName' => 'doctypes_second_level',
+            'recordId'  => $aArgs['doctypes_second_level_id'],
+            'eventType' => 'DEL',
+            'eventId'   => 'subfolderdel',
+            'info'      => _DOCTYPE_SECONDLEVEL_DELETED. ' : ' . $secondLevel['doctypes_second_level_label']
+        ]);
+
+        return $response->withJson(['secondLevel' => $secondLevel]);
+    }
+
+    protected function control($aArgs, $mode)
+    {
+        $errors = [];
+
+        if ($mode == 'update') {
+            if (!Validator::intVal()->validate($aArgs['doctypes_second_level_id'])) {
+                $errors[] = 'Id is not a numeric';
+            } else {
+                $obj = SecondLevelModel::getById(['id' => $aArgs['doctypes_second_level_id']]);
+            }
+           
+            if (empty($obj)) {
+                $errors[] = 'Id ' .$aArgs['doctypes_second_level_id']. ' does not exists';
+            }
+        }
+           
+        if (!Validator::notEmpty()->validate($aArgs['doctypes_second_level_label']) ||
+            !Validator::length(1, 255)->validate($aArgs['doctypes_second_level_label'])) {
+            $errors[] = 'Invalid doctypes_second_level_label';
+        }
+
+        if (!Validator::notEmpty()->validate($aArgs['doctypes_first_level_id']) ||
+            !Validator::intVal()->validate($aArgs['doctypes_first_level_id'])) {
+            $errors[] = 'Invalid doctypes_first_level_id';
+        }
+
+        if (!Validator::notEmpty()->validate($aArgs['enabled']) || ($aArgs['enabled'] != 'Y' && $aArgs['enabled'] != 'N')) {
+            $errors[]= 'Invalid history value';
+        }
+
+        return $errors;
+    }
+
+    protected function manageValue($request)
+    {
+        foreach ($request  as $key => $value) {
+            if (in_array($key, ['enabled'])) {
+                if (empty($value)) {
+                    $request[$key] = 'N';
+                } else {
+                    $request[$key] = 'Y';
+                }
+            }
+        }
+        return $request;
+    }
+}
diff --git a/src/app/doctype/models/DoctypeModelAbstract.php b/src/app/doctype/models/DoctypeModelAbstract.php
index 3f44afbb4e0..c0ff4a0bcd1 100644
--- a/src/app/doctype/models/DoctypeModelAbstract.php
+++ b/src/app/doctype/models/DoctypeModelAbstract.php
@@ -58,180 +58,73 @@ class DoctypeModelAbstract
         ValidatorModel::notEmpty($aArgs, ['description', 'doctypes_first_level_id', 'doctypes_second_level_id', 'coll_id']);
         ValidatorModel::intVal($aArgs, ['doctypes_first_level_id', 'doctypes_second_level_id']);
 
-        $nextSequenceId = DatabaseModel::getNextSequenceValue(['sequenceId' => 'doctypes_second_level_id_seq']);
+        $aArgs['type_id'] = DatabaseModel::getNextSequenceValue(['sequenceId' => 'doctypes_type_id_seq']);
         DatabaseModel::insert([
             'table'         => 'doctypes',
             'columnsValues' => $aArgs
         ]);
 
-        return true;
+        return $aArgs;
     }
 
     public static function update(array $aArgs)
     {
-        ValidatorModel::notEmpty($aArgs, ['id']);
-        ValidatorModel::intVal($aArgs, ['id']);
+        ValidatorModel::notEmpty($aArgs, ['type_id']);
+        ValidatorModel::intVal($aArgs, ['type_id']);
         
         DatabaseModel::update([
-            'table'     => 'actions',
-            'set'       => [
-                'keyword'           => $aArgs['keyword'],
-                'label_action'      => $aArgs['label_action'],
-                'id_status'         => $aArgs['id_status'],
-                'action_page'       => $aArgs['action_page'],
-                'history'           => $aArgs['history'],
-                'is_folder_action'  => $aArgs['is_folder_action']
-            ],
-            'where'     => ['id = ?'],
-            'data'      => [$aArgs['id']]
-        ]);
-
-        DatabaseModel::delete([
-            'table' => 'actions_categories',
-            'where'  => ['action_id = ?'],
-            'data'   => [$aArgs['id']]
+            'table'     => 'doctypes',
+            'set'       => $aArgs,
+            'where'     => ['type_id = ?'],
+            'data'      => [$aArgs['type_id']]
         ]);
 
-        $tab['action_id'] = $aArgs['id'];
-
-        for ($i=0; $i < count($aArgs['actionCategories']); $i++) {
-            $tab['category_id'] = $aArgs['actionCategories'][$i];
-            DatabaseModel::insert([
-                'table'         => 'actions_categories',
-                'columnsValues' => $tab
-            ]);
-        }
-
         return true;
     }
 
-    public static function delete(array $aArgs)
+    public static function disabledFirstLevel(array $aArgs)
     {
-        ValidatorModel::notEmpty($aArgs, ['id']);
-        ValidatorModel::intVal($aArgs, ['id']);
-
-        DatabaseModel::delete([
-            'table' => 'actions',
-            'where' => ['id = ?'],
-            'data'  => [$aArgs['id']]
-        ]);
-        DatabaseModel::delete([
-            'table' => 'actions_categories',
-            'where' => ['action_id = ?'],
-            'data'  => [$aArgs['id']]
-        ]);
-        DatabaseModel::delete([
-            'table' => 'actions_groupbaskets',
-            'where' => ['id_action = ?'],
-            'data'  => [$aArgs['id']]
+        ValidatorModel::notEmpty($aArgs, ['doctypes_first_level_id']);
+        ValidatorModel::intVal($aArgs, ['doctypes_first_level_id']);
+        
+        DatabaseModel::update([
+            'table'     => 'doctypes',
+            'set'       => $aArgs,
+            'where'     => ['doctypes_first_level_id = ?'],
+            'data'      => [$aArgs['doctypes_first_level_id']]
         ]);
 
         return true;
     }
 
-    public static function getAction_pages()
-    {
-        $customId = CoreConfigModel::getCustomId();
-
-        if (file_exists('custom/' .$customId. '/core/xml/actions_pages.xml')) {
-            $path = 'custom/' .$customId. '/core/xml/actions_pages.xml';
-        } else {
-            $path = 'core/xml/actions_pages.xml';
-        }
-
-        $tabActions_pages              = [];
-        $tabActions_pages['modules'][] = 'Apps';
-
-        $xmlfile = simplexml_load_file($path);
+    // public static function updateFirstLevel(array $aArgs)
+    // {
+    //     ValidatorModel::notEmpty($aArgs, ['doctypes_first_level_id']);
+    //     ValidatorModel::intVal($aArgs, ['doctypes_first_level_id']);
         
-        if (count($xmlfile) > 0) {
-            foreach ($xmlfile->ACTIONPAGE as $actionPage) {
-                if (!defined((string) $actionPage->LABEL)) {
-                    $label = $actionPage->LABEL;
-                } else {
-                    $label = constant((string) $actionPage->LABEL);
-                }
-                if (!empty((string) $actionPage->MODULE)) {
-                    $origin = (string) $actionPage->MODULE;
-                } else {
-                    $origin =  'apps';
-                }
-                if (!empty((string) $actionPage->DESC)) {
-                    $desc = constant((string) $actionPage->DESC);
-                } else {
-                    $desc =  'no description';
-                }
-                $tabActions_pages['actionsPageList'][] = array(
-                    'id'     => (string) $actionPage->ID,
-                    'label'  => $label,
-                    'name'   => (string) $actionPage->NAME,
-                    'desc'   => $desc,
-                    'origin' => ucfirst($origin),
-                );
-            }
-        }
-
-        array_multisort(
-            array_map(
-                function ($element) {
-                    return $element['label'];
-                }, $tabActions_pages['actionsPageList']
-            ),
-            SORT_ASC, $tabActions_pages['actionsPageList']
-        );
+    //     DatabaseModel::update([
+    //         'table'     => 'doctypes',
+    //         'set'       => $aArgs,
+    //         'where'     => ['doctypes_first_level_id = ?'],
+    //         'data'      => [$aArgs['doctypes_first_level_id']]
+    //     ]);
+
+    //     return true;
+    // }
+
+    // public static function updateSecondLevel(array $aArgs)
+    // {
+    //     ValidatorModel::notEmpty($aArgs, ['doctypes_second_level_id']);
+    //     ValidatorModel::intVal($aArgs, ['doctypes_second_level_id']);
         
-        $tabActions_pages['modules'] = array_unique($tabActions_pages['modules']);
-        sort($tabActions_pages['modules']);
-        return $tabActions_pages;
-    }
-
-    public static function getKeywords()
-    {
-        $tabKeyword   = [];
-        $tabKeyword[] = ['value' => '', label => _NO_KEYWORD];
-        $tabKeyword[] = ['value' => 'redirect', label => _REDIRECT, desc => _KEYWORD_REDIRECT_DESC];
-        //$tabKeyword[] = ['value' => 'to_validate', label => _TO_VALIDATE];
-        $tabKeyword[] = ['value' => 'indexing', label => _INDEXING, desc => _KEYWORD_INDEXING_DESC];
-        //$tabKeyword[] = ['value' => 'workflow', label => _WF];
-
-        return $tabKeyword;
-    }
+    //     DatabaseModel::update([
+    //         'table'     => 'doctypes',
+    //         'set'       => $aArgs,
+    //         'where'     => ['doctypes_second_level_id = ?'],
+    //         'data'      => [$aArgs['doctypes_second_level_id']]
+    //     ]);
 
-    public static function getActionPageById(array $aArgs)
-    {
-        ValidatorModel::notEmpty($aArgs, ['id']);
-        ValidatorModel::intVal($aArgs, ['id']);
-
-        $action = DatabaseModel::select([
-            'select' => ['action_page'],
-            'table'  => ['actions'],
-            'where'  => ['id = ? AND enabled = ?'],
-            'data'   => [$aArgs['id'], 'Y']
-        ]);
+    //     return true;
+    // }
 
-        if (empty($action[0])) {
-            return '';
-        }
-
-        return $action[0]['action_page'];
-    }
-
-    public static function getDefaultActionByGroupBasketId(array $aArgs)
-    {
-        ValidatorModel::notEmpty($aArgs, ['groupId', 'basketId']);
-        ValidatorModel::stringType($aArgs, ['groupId', 'basketId']);
-
-        $action = DatabaseModel::select([
-            'select' => ['id_action'],
-            'table'  => ['actions_groupbaskets'],
-            'where'  => ['group_id = ?', 'basket_id = ?', 'default_action_list = ?'],
-            'data'   => [$aArgs['groupId'], $aArgs['basketId'], 'Y']
-        ]);
-
-        if (empty($action[0])) {
-            return '';
-        }
-
-        return $action[0]['id_action'];
-    }
 }
diff --git a/src/app/doctype/models/FirstLevelModelAbstract.php b/src/app/doctype/models/FirstLevelModelAbstract.php
index 18447807623..0bb1f3eb89f 100644
--- a/src/app/doctype/models/FirstLevelModelAbstract.php
+++ b/src/app/doctype/models/FirstLevelModelAbstract.php
@@ -57,180 +57,28 @@ class FirstLevelModelAbstract
     {
         ValidatorModel::notEmpty($aArgs, ['label']);
 
-        $nextSequenceId = DatabaseModel::getNextSequenceValue(['sequenceId' => 'doctypes_first_level_id_seq']);
+        $aArgs['doctypes_first_level_id'] = DatabaseModel::getNextSequenceValue(['sequenceId' => 'doctypes_first_level_id_seq']);
         DatabaseModel::insert([
             'table'         => 'doctypes_first_level',
             'columnsValues' => $aArgs
         ]);
 
-        return true;
+        return $aArgs;
     }
 
     public static function update(array $aArgs)
     {
-        ValidatorModel::notEmpty($aArgs, ['id']);
-        ValidatorModel::intVal($aArgs, ['id']);
+        ValidatorModel::notEmpty($aArgs, ['doctypes_first_level_id']);
+        ValidatorModel::intVal($aArgs, ['doctypes_first_level_id']);
         
         DatabaseModel::update([
-            'table'     => 'actions',
-            'set'       => [
-                'keyword'           => $aArgs['keyword'],
-                'label_action'      => $aArgs['label_action'],
-                'id_status'         => $aArgs['id_status'],
-                'action_page'       => $aArgs['action_page'],
-                'history'           => $aArgs['history'],
-                'is_folder_action'  => $aArgs['is_folder_action']
-            ],
-            'where'     => ['id = ?'],
-            'data'      => [$aArgs['id']]
-        ]);
-
-        DatabaseModel::delete([
-            'table' => 'actions_categories',
-            'where'  => ['action_id = ?'],
-            'data'   => [$aArgs['id']]
-        ]);
-
-        $tab['action_id'] = $aArgs['id'];
-
-        for ($i=0; $i < count($aArgs['actionCategories']); $i++) {
-            $tab['category_id'] = $aArgs['actionCategories'][$i];
-            DatabaseModel::insert([
-                'table'         => 'actions_categories',
-                'columnsValues' => $tab
-            ]);
-        }
-
-        return true;
-    }
-
-    public static function delete(array $aArgs)
-    {
-        ValidatorModel::notEmpty($aArgs, ['id']);
-        ValidatorModel::intVal($aArgs, ['id']);
-
-        DatabaseModel::delete([
-            'table' => 'actions',
-            'where' => ['id = ?'],
-            'data'  => [$aArgs['id']]
-        ]);
-        DatabaseModel::delete([
-            'table' => 'actions_categories',
-            'where' => ['action_id = ?'],
-            'data'  => [$aArgs['id']]
-        ]);
-        DatabaseModel::delete([
-            'table' => 'actions_groupbaskets',
-            'where' => ['id_action = ?'],
-            'data'  => [$aArgs['id']]
+            'table'     => 'doctypes_first_level',
+            'set'       => $aArgs,
+            'where'     => ['doctypes_first_level_id = ?'],
+            'data'      => [$aArgs['doctypes_first_level_id']]
         ]);
 
         return true;
     }
 
-    public static function getAction_pages()
-    {
-        $customId = CoreConfigModel::getCustomId();
-
-        if (file_exists('custom/' .$customId. '/core/xml/actions_pages.xml')) {
-            $path = 'custom/' .$customId. '/core/xml/actions_pages.xml';
-        } else {
-            $path = 'core/xml/actions_pages.xml';
-        }
-
-        $tabActions_pages              = [];
-        $tabActions_pages['modules'][] = 'Apps';
-
-        $xmlfile = simplexml_load_file($path);
-        
-        if (count($xmlfile) > 0) {
-            foreach ($xmlfile->ACTIONPAGE as $actionPage) {
-                if (!defined((string) $actionPage->LABEL)) {
-                    $label = $actionPage->LABEL;
-                } else {
-                    $label = constant((string) $actionPage->LABEL);
-                }
-                if (!empty((string) $actionPage->MODULE)) {
-                    $origin = (string) $actionPage->MODULE;
-                } else {
-                    $origin =  'apps';
-                }
-                if (!empty((string) $actionPage->DESC)) {
-                    $desc = constant((string) $actionPage->DESC);
-                } else {
-                    $desc =  'no description';
-                }
-                $tabActions_pages['actionsPageList'][] = array(
-                    'id'     => (string) $actionPage->ID,
-                    'label'  => $label,
-                    'name'   => (string) $actionPage->NAME,
-                    'desc'   => $desc,
-                    'origin' => ucfirst($origin),
-                );
-            }
-        }
-
-        array_multisort(
-            array_map(
-                function ($element) {
-                    return $element['label'];
-                }, $tabActions_pages['actionsPageList']
-            ),
-            SORT_ASC, $tabActions_pages['actionsPageList']
-        );
-        
-        $tabActions_pages['modules'] = array_unique($tabActions_pages['modules']);
-        sort($tabActions_pages['modules']);
-        return $tabActions_pages;
-    }
-
-    public static function getKeywords()
-    {
-        $tabKeyword   = [];
-        $tabKeyword[] = ['value' => '', label => _NO_KEYWORD];
-        $tabKeyword[] = ['value' => 'redirect', label => _REDIRECT, desc => _KEYWORD_REDIRECT_DESC];
-        //$tabKeyword[] = ['value' => 'to_validate', label => _TO_VALIDATE];
-        $tabKeyword[] = ['value' => 'indexing', label => _INDEXING, desc => _KEYWORD_INDEXING_DESC];
-        //$tabKeyword[] = ['value' => 'workflow', label => _WF];
-
-        return $tabKeyword;
-    }
-
-    public static function getActionPageById(array $aArgs)
-    {
-        ValidatorModel::notEmpty($aArgs, ['id']);
-        ValidatorModel::intVal($aArgs, ['id']);
-
-        $action = DatabaseModel::select([
-            'select' => ['action_page'],
-            'table'  => ['actions'],
-            'where'  => ['id = ? AND enabled = ?'],
-            'data'   => [$aArgs['id'], 'Y']
-        ]);
-
-        if (empty($action[0])) {
-            return '';
-        }
-
-        return $action[0]['action_page'];
-    }
-
-    public static function getDefaultActionByGroupBasketId(array $aArgs)
-    {
-        ValidatorModel::notEmpty($aArgs, ['groupId', 'basketId']);
-        ValidatorModel::stringType($aArgs, ['groupId', 'basketId']);
-
-        $action = DatabaseModel::select([
-            'select' => ['id_action'],
-            'table'  => ['actions_groupbaskets'],
-            'where'  => ['group_id = ?', 'basket_id = ?', 'default_action_list = ?'],
-            'data'   => [$aArgs['groupId'], $aArgs['basketId'], 'Y']
-        ]);
-
-        if (empty($action[0])) {
-            return '';
-        }
-
-        return $action[0]['id_action'];
-    }
 }
diff --git a/src/app/doctype/models/SecondLevelModelAbstract.php b/src/app/doctype/models/SecondLevelModelAbstract.php
index ed92b164a91..9e3ceb6d80a 100644
--- a/src/app/doctype/models/SecondLevelModelAbstract.php
+++ b/src/app/doctype/models/SecondLevelModelAbstract.php
@@ -58,180 +58,44 @@ class SecondLevelModelAbstract
         ValidatorModel::notEmpty($aArgs, ['label', 'doctypes_first_level_id']);
         ValidatorModel::intVal($aArgs, ['doctypes_first_level_id']);
 
-        $nextSequenceId = DatabaseModel::getNextSequenceValue(['sequenceId' => 'doctypes_second_level_id_seq']);
+        $aArgs['doctypes_second_level_id'] = DatabaseModel::getNextSequenceValue(['sequenceId' => 'doctypes_second_level_id_seq']);
         DatabaseModel::insert([
             'table'         => 'doctypes_second_level',
             'columnsValues' => $aArgs
         ]);
 
-        return true;
+        return $aArgs;
     }
 
     public static function update(array $aArgs)
     {
-        ValidatorModel::notEmpty($aArgs, ['id']);
-        ValidatorModel::intVal($aArgs, ['id']);
+        ValidatorModel::notEmpty($aArgs, ['doctypes_second_level_id']);
+        ValidatorModel::intVal($aArgs, ['doctypes_second_level_id']);
         
         DatabaseModel::update([
-            'table'     => 'actions',
-            'set'       => [
-                'keyword'           => $aArgs['keyword'],
-                'label_action'      => $aArgs['label_action'],
-                'id_status'         => $aArgs['id_status'],
-                'action_page'       => $aArgs['action_page'],
-                'history'           => $aArgs['history'],
-                'is_folder_action'  => $aArgs['is_folder_action']
-            ],
-            'where'     => ['id = ?'],
-            'data'      => [$aArgs['id']]
-        ]);
-
-        DatabaseModel::delete([
-            'table' => 'actions_categories',
-            'where'  => ['action_id = ?'],
-            'data'   => [$aArgs['id']]
-        ]);
-
-        $tab['action_id'] = $aArgs['id'];
-
-        for ($i=0; $i < count($aArgs['actionCategories']); $i++) {
-            $tab['category_id'] = $aArgs['actionCategories'][$i];
-            DatabaseModel::insert([
-                'table'         => 'actions_categories',
-                'columnsValues' => $tab
-            ]);
-        }
-
-        return true;
-    }
-
-    public static function delete(array $aArgs)
-    {
-        ValidatorModel::notEmpty($aArgs, ['id']);
-        ValidatorModel::intVal($aArgs, ['id']);
-
-        DatabaseModel::delete([
-            'table' => 'actions',
-            'where' => ['id = ?'],
-            'data'  => [$aArgs['id']]
-        ]);
-        DatabaseModel::delete([
-            'table' => 'actions_categories',
-            'where' => ['action_id = ?'],
-            'data'  => [$aArgs['id']]
-        ]);
-        DatabaseModel::delete([
-            'table' => 'actions_groupbaskets',
-            'where' => ['id_action = ?'],
-            'data'  => [$aArgs['id']]
+            'table'     => 'doctypes_second_level',
+            'set'       => $aArgs,
+            'where'     => ['doctypes_second_level_id = ?'],
+            'data'      => [$aArgs['doctypes_second_level_id']]
         ]);
 
         return true;
     }
 
-    public static function getAction_pages()
+    public static function disabledFirstLevel(array $aArgs)
     {
-        $customId = CoreConfigModel::getCustomId();
-
-        if (file_exists('custom/' .$customId. '/core/xml/actions_pages.xml')) {
-            $path = 'custom/' .$customId. '/core/xml/actions_pages.xml';
-        } else {
-            $path = 'core/xml/actions_pages.xml';
-        }
-
-        $tabActions_pages              = [];
-        $tabActions_pages['modules'][] = 'Apps';
-
-        $xmlfile = simplexml_load_file($path);
-        
-        if (count($xmlfile) > 0) {
-            foreach ($xmlfile->ACTIONPAGE as $actionPage) {
-                if (!defined((string) $actionPage->LABEL)) {
-                    $label = $actionPage->LABEL;
-                } else {
-                    $label = constant((string) $actionPage->LABEL);
-                }
-                if (!empty((string) $actionPage->MODULE)) {
-                    $origin = (string) $actionPage->MODULE;
-                } else {
-                    $origin =  'apps';
-                }
-                if (!empty((string) $actionPage->DESC)) {
-                    $desc = constant((string) $actionPage->DESC);
-                } else {
-                    $desc =  'no description';
-                }
-                $tabActions_pages['actionsPageList'][] = array(
-                    'id'     => (string) $actionPage->ID,
-                    'label'  => $label,
-                    'name'   => (string) $actionPage->NAME,
-                    'desc'   => $desc,
-                    'origin' => ucfirst($origin),
-                );
-            }
-        }
-
-        array_multisort(
-            array_map(
-                function ($element) {
-                    return $element['label'];
-                }, $tabActions_pages['actionsPageList']
-            ),
-            SORT_ASC, $tabActions_pages['actionsPageList']
-        );
+        ValidatorModel::notEmpty($aArgs, ['doctypes_first_level_id']);
+        ValidatorModel::intVal($aArgs, ['doctypes_first_level_id']);
         
-        $tabActions_pages['modules'] = array_unique($tabActions_pages['modules']);
-        sort($tabActions_pages['modules']);
-        return $tabActions_pages;
-    }
-
-    public static function getKeywords()
-    {
-        $tabKeyword   = [];
-        $tabKeyword[] = ['value' => '', label => _NO_KEYWORD];
-        $tabKeyword[] = ['value' => 'redirect', label => _REDIRECT, desc => _KEYWORD_REDIRECT_DESC];
-        //$tabKeyword[] = ['value' => 'to_validate', label => _TO_VALIDATE];
-        $tabKeyword[] = ['value' => 'indexing', label => _INDEXING, desc => _KEYWORD_INDEXING_DESC];
-        //$tabKeyword[] = ['value' => 'workflow', label => _WF];
-
-        return $tabKeyword;
-    }
-
-    public static function getActionPageById(array $aArgs)
-    {
-        ValidatorModel::notEmpty($aArgs, ['id']);
-        ValidatorModel::intVal($aArgs, ['id']);
-
-        $action = DatabaseModel::select([
-            'select' => ['action_page'],
-            'table'  => ['actions'],
-            'where'  => ['id = ? AND enabled = ?'],
-            'data'   => [$aArgs['id'], 'Y']
+        DatabaseModel::update([
+            'table'     => 'doctypes_second_level',
+            'set'       => $aArgs,
+            'where'     => ['doctypes_first_level_id = ?'],
+            'data'      => [$aArgs['doctypes_first_level_id']]
         ]);
 
-        if (empty($action[0])) {
-            return '';
-        }
-
-        return $action[0]['action_page'];
+        return true;
     }
 
-    public static function getDefaultActionByGroupBasketId(array $aArgs)
-    {
-        ValidatorModel::notEmpty($aArgs, ['groupId', 'basketId']);
-        ValidatorModel::stringType($aArgs, ['groupId', 'basketId']);
-
-        $action = DatabaseModel::select([
-            'select' => ['id_action'],
-            'table'  => ['actions_groupbaskets'],
-            'where'  => ['group_id = ?', 'basket_id = ?', 'default_action_list = ?'],
-            'data'   => [$aArgs['groupId'], $aArgs['basketId'], 'Y']
-        ]);
 
-        if (empty($action[0])) {
-            return '';
-        }
-
-        return $action[0]['id_action'];
-    }
 }
diff --git a/src/app/folder/models/FolderTypeModel.php b/src/app/folder/models/FolderTypeModel.php
new file mode 100644
index 00000000000..4d86e5fa64e
--- /dev/null
+++ b/src/app/folder/models/FolderTypeModel.php
@@ -0,0 +1,21 @@
+<?php
+
+/**
+* Copyright Maarch since 2008 under licence GPLv3.
+* See LICENCE.txt file at the root folder for more details.
+* This file is part of Maarch software.
+*
+*/
+
+/**
+* @brief FolderType Model
+* @author dev@maarch.org
+* @ingroup core
+*/
+
+namespace Folder\models;
+
+class FolderTypeModel extends FolderTypeModelAbstract
+{
+    // Do your stuff in this class
+}
diff --git a/src/app/folder/models/FolderTypeModelAbstract.php b/src/app/folder/models/FolderTypeModelAbstract.php
new file mode 100644
index 00000000000..51b86d8091a
--- /dev/null
+++ b/src/app/folder/models/FolderTypeModelAbstract.php
@@ -0,0 +1,69 @@
+<?php
+/**
+* Copyright Maarch since 2008 under licence GPLv3.
+* See LICENCE.txt file at the root folder for more details.
+* This file is part of Maarch software.
+
+* @brief   FolderTypeModelAbstract
+* @author  dev <dev@maarch.org>
+* @ingroup core
+*/
+
+namespace Folder\models;
+
+use Core\Models\ValidatorModel;
+use SrcCore\models\CoreConfigModel;
+use SrcCore\models\DatabaseModel;
+
+class FolderTypeModelAbstract
+{
+    public static function get(array $aArgs = [])
+    {
+        ValidatorModel::arrayType($aArgs, ['select']);
+
+        $folderType = DatabaseModel::select([
+            'select' => empty($aArgs['select']) ? ['*'] : $aArgs['select'],
+            'table'  => ['foldertypes']
+        ]);
+
+        return $folderType;
+    }
+
+    public static function getFolderTypeDocTypeFirstLevel(array $aArgs = [])
+    {
+        ValidatorModel::arrayType($aArgs, ['select']);
+
+        $folderType = DatabaseModel::select([
+            'select' => empty($aArgs['select']) ? ['*'] : $aArgs['select'],
+            'table'  => ['foldertypes_doctypes_level1']
+        ]);
+
+        return $folderType;
+    }
+
+    public static function createFolderTypeDocTypeFirstLevel(array $aArgs = [])
+    {
+
+        DatabaseModel::insert([
+            'table'         => 'foldertypes_doctypes_level1',
+            'columnsValues' => $aArgs
+        ]);
+
+        return true;
+    }
+
+    public static function deleteFolderTypeDocTypeFirstLevel(array $aArgs)
+    {
+        ValidatorModel::notEmpty($aArgs, ['doctypes_first_level_id']);
+        ValidatorModel::intVal($aArgs, ['doctypes_first_level_id']);
+
+        DatabaseModel::delete([
+            'table' => 'foldertypes_doctypes_level1',
+            'where' => ['doctypes_first_level_id = ?'],
+            'data'  => [$aArgs['doctypes_first_level_id']]
+        ]);
+
+        return true;
+    }
+
+}
-- 
GitLab