Skip to content
Snippets Groups Projects
ResourceListController.php 56.6 KiB
Newer Older
  • Learn to ignore specific revisions
  • Damien's avatar
    Damien committed
    <?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 Resource List Controller
    * @author dev@maarch.org
    */
    
    namespace Resource\controllers;
    
    
    Damien's avatar
    Damien committed
    use Action\controllers\ActionMethodController;
    
    Damien's avatar
    Damien committed
    use Action\models\ActionModel;
    
    use Attachment\models\AttachmentModel;
    
    Damien's avatar
    Damien committed
    use Basket\models\ActionGroupBasketModel;
    
    Damien's avatar
    Damien committed
    use Basket\models\BasketModel;
    use Basket\models\GroupBasketModel;
    use Basket\models\RedirectBasketModel;
    
    use Contact\controllers\ContactController;
    
    use Entity\models\EntityModel;
    
    Damien's avatar
    Damien committed
    use Entity\models\ListInstanceModel;
    
    use Folder\models\FolderModel;
    
    use Group\controllers\PrivilegeController;
    
    Damien's avatar
    Damien committed
    use Group\models\GroupModel;
    
    use Note\models\NoteModel;
    
    Damien's avatar
    Damien committed
    use Priority\models\PriorityModel;
    
    Damien's avatar
    Damien committed
    use Resource\models\ResModel;
    
    use Resource\models\ResourceListModel;
    
    use Resource\models\UserFollowedResourceModel;
    
    Damien's avatar
    Damien committed
    use Respect\Validation\Validator;
    
    Damien's avatar
    Damien committed
    use Slim\Http\Request;
    use Slim\Http\Response;
    use SrcCore\controllers\PreparedClauseController;
    
    Damien's avatar
    Damien committed
    use SrcCore\models\TextFormatModel;
    
    Damien's avatar
    Damien committed
    use SrcCore\models\ValidatorModel;
    
    Damien's avatar
    Damien committed
    use Status\models\StatusModel;
    
    Damien's avatar
    Damien committed
    use User\models\UserModel;
    
    class ResourceListController
    {
        public function get(Request $request, Response $response, array $aArgs)
        {
    
            $errors = ResourceListController::listControl(['groupId' => $aArgs['groupId'], 'userId' => $aArgs['userId'], 'basketId' => $aArgs['basketId'], 'currentUserId' => $GLOBALS['id']]);
    
    Damien's avatar
    Damien committed
            if (!empty($errors['errors'])) {
                return $response->withStatus($errors['code'])->withJson(['errors' => $errors['errors']]);
    
    Damien's avatar
    Damien committed
            }
    
    
    Damien's avatar
    Damien committed
            $basket = BasketModel::getById(['id' => $aArgs['basketId'], 'select' => ['basket_clause', 'basket_res_order', 'basket_name', 'basket_id']]);
    
    Damien's avatar
    Damien committed
            $user = UserModel::getById(['id' => $aArgs['userId'], 'select' => ['user_id']]);
    
    Damien's avatar
    Damien committed
            $group = GroupModel::getById(['id' => $aArgs['groupId'], 'select' => ['group_id']]);
    
    Damien's avatar
    Damien committed
    
    
            $data = $request->getQueryParams();
    
            $data['offset'] = (empty($data['offset']) || !is_numeric($data['offset']) ? 0 : (int)$data['offset']);
            $data['limit'] = (empty($data['limit']) || !is_numeric($data['limit']) ? 10 : (int)$data['limit']);
    
    Damien's avatar
    Damien committed
            $allQueryData = ResourceListController::getResourcesListQueryData(['data' => $data, 'basketClause' => $basket['basket_clause'], 'login' => $user['user_id']]);
            if (!empty($allQueryData['order'])) {
                $data['order'] = $allQueryData['order'];
    
    Damien's avatar
    Damien committed
            }
    
    Damien's avatar
    Damien committed
            $rawResources = ResourceListModel::getOnView([
    
                'select'    => ['res_id'],
    
    Damien's avatar
    Damien committed
                'table'     => $allQueryData['table'],
                'leftJoin'  => $allQueryData['leftJoin'],
                'where'     => $allQueryData['where'],
                'data'      => $allQueryData['queryData'],
    
                'orderBy'   => empty($data['order']) ? [$basket['basket_res_order']] : [$data['order']]
    
    Damien's avatar
    Damien committed
            ]);
    
            $count = count($rawResources);
    
    
            $resIds = ResourceListController::getIdsWithOffsetAndLimit(['resources' => $rawResources, 'offset' => $data['offset'], 'limit' => $data['limit']]);
    
    
            $followedDocuments = UserFollowedResourceModel::get([
    	    'select' => ['res_id'],
                'where'  => ['user_id = ?'],
                'data'   => [$GLOBALS['id']],
            ]);
    
            $trackedMails = array_column($followedDocuments, 'res_id');
            $allResources = array_column($rawResources, 'res_id');
    
    Damien's avatar
    Damien committed
    
    
    Damien's avatar
    Damien committed
            $formattedResources = [];
    
            $displayFolderTags = false;
    
            if (!empty($resIds)) {
    
                $excludeAttachmentTypes = ['converted_pdf', 'print_folder'];
    
                if (!PrivilegeController::hasPrivilege(['privilegeId' => 'view_documents_with_notes', 'userId' => $GLOBALS['id']])) {
    
                    $excludeAttachmentTypes[] = 'document_with_notes';
                }
    
    
                $attachments = AttachmentModel::get([
    
                    'select'    => ['COUNT(res_id)', 'res_id_master'],
    
    Damien's avatar
    Damien committed
                    'where'     => ['res_id_master in (?)', 'status not in (?)', 'attachment_type not in (?)', '((status = ? AND typist = ?) OR status != ?)'],
    
                    'data'      => [$resIds, ['DEL', 'OBS'], $excludeAttachmentTypes, 'TMP', $GLOBALS['id'], 'TMP'],
    
                    'groupBy'   => ['res_id_master']
                ]);
    
                $groupBasket = GroupBasketModel::get(['select' => ['list_display', 'list_event', 'list_event_data'], 'where' => ['basket_id = ?', 'group_id = ?'], 'data' => [$basket['basket_id'], $group['group_id']]]);
    
                $listDisplay = json_decode($groupBasket[0]['list_display']);
    
    Damien's avatar
    Damien committed
    
    
                $select = [
    
                    'res_letterbox.res_id', 'res_letterbox.subject', 'res_letterbox.barcode', 'res_letterbox.alt_identifier',
    
                    'status.label_status AS "status.label_status"', 'status.img_filename AS "status.img_filename"', 'priorities.color AS "priorities.color"',
    
                    'res_letterbox.closing_date', 'res_letterbox.locker_user_id', 'res_letterbox.locker_time', 'res_letterbox.confidentiality',
                    'res_letterbox.filename as res_filename'
    
                $tableFunction = ['status', 'priorities'];
                $leftJoinFunction = ['res_letterbox.status = status.id', 'res_letterbox.priority = priorities.id'];
    
    Damien's avatar
    Damien committed
                foreach ($listDisplay as $value) {
    
    Damien's avatar
    Damien committed
                    $value = (array)$value;
    
    Damien's avatar
    Damien committed
                    if ($value['value'] == 'getPriority') {
                        $select[] = 'priorities.label AS "priorities.label"';
                    } elseif ($value['value'] == 'getCategory') {
    
                        $select[] = 'res_letterbox.category_id';
    
    Damien's avatar
    Damien committed
                    } elseif ($value['value'] == 'getDoctype') {
                        $select[] = 'doctypes.description AS "doctypes.description"';
                        $tableFunction[] = 'doctypes';
                        $leftJoinFunction[] = 'res_letterbox.type_id = doctypes.type_id';
                    } elseif ($value['value'] == 'getCreationAndProcessLimitDates') {
                        $select[] = 'res_letterbox.creation_date';
    
                        $select[] = 'res_letterbox.process_limit_date';
    
                    } elseif ($value['value'] == 'getModificationDate') {
                        $select[] = 'res_letterbox.modification_date';
    
                    } elseif ($value['value'] == 'getOpinionLimitDate') {
                        $select[] = 'res_letterbox.opinion_limit_date';
    
    Damien's avatar
    Damien committed
                    }
                }
    
                $order = 'CASE res_letterbox.res_id ';
                foreach ($resIds as $key => $resId) {
                    $order .= "WHEN {$resId} THEN {$key} ";
                }
                $order .= 'END';
    
                $resources = ResourceListModel::getOnResource([
                    'select'    => $select,
                    'table'     => $tableFunction,
                    'leftJoin'  => $leftJoinFunction,
                    'where'     => ['res_letterbox.res_id in (?)'],
                    'data'      => [$resIds],
    
                    'orderBy'   => [$order]
    
    Damien's avatar
    Damien committed
                ]);
    
    Damien's avatar
    Damien committed
    
    
                $formattedResources = ResourceListController::getFormattedResources([
                    'resources'     => $resources,
                    'userId'        => $GLOBALS['id'],
                    'attachments'   => $attachments,
                    'checkLocked'   => true,
    
                    'listDisplay'   => $listDisplay,
                    'trackedMails'  => $trackedMails
    
                $defaultAction['component'] = $groupBasket[0]['list_event'];
    
                $defaultAction['data'] = json_decode($groupBasket[0]['list_event_data'], true);
    
    
                if (in_array('getFolders', array_column($listDisplay, 'value'))) {
                    $displayFolderTags = true;
                }
    
            return $response->withJson(['resources' => $formattedResources, 'count' => $count, 'basketLabel' => $basket['basket_name'], 'basket_id' => $basket['basket_id'], 'allResources' => $allResources, 'defaultAction' => $defaultAction, 'displayFolderTags' => $displayFolderTags]);
    
    Damien's avatar
    Damien committed
        public function getFilters(Request $request, Response $response, array $aArgs)
    
    Damien's avatar
    Damien committed
        {
            $currentUser = UserModel::getByLogin(['login' => $GLOBALS['userId'], 'select' => ['id']]);
    
            $errors = ResourceListController::listControl(['groupId' => $aArgs['groupId'], 'userId' => $aArgs['userId'], 'basketId' => $aArgs['basketId'], 'currentUserId' => $currentUser['id']]);
            if (!empty($errors['errors'])) {
                return $response->withStatus($errors['code'])->withJson(['errors' => $errors['errors']]);
            }
    
            $basket = BasketModel::getById(['id' => $aArgs['basketId'], 'select' => ['basket_clause']]);
            $user = UserModel::getById(['id' => $aArgs['userId'], 'select' => ['user_id']]);
            $whereClause = PreparedClauseController::getPreparedClause(['clause' => $basket['basket_clause'], 'login' => $user['user_id']]);
    
    Damien's avatar
    Damien committed
            $where = [$whereClause];
            $queryData = [];
    
            $queryParams = $request->getQueryParams();
    
            $filters = ResourceListController::getFormattedFilters(['where' => $where, 'queryData' => $queryData, 'queryParams' => $queryParams]);
    
            return $response->withJson($filters);
    
    Damien's avatar
    Damien committed
        public static function getResourcesListQueryData(array $args)
        {
            ValidatorModel::stringType($args, ['basketClause', 'login']);
            ValidatorModel::arrayType($args, ['data']);
    
            $table = [];
            $leftJoin = [];
    
            $where = [];
            if (!empty($args['basketClause'])) {
                $whereClause = PreparedClauseController::getPreparedClause(['clause' => $args['basketClause'], 'login' => $args['login']]);
                $where = [$whereClause];
            }
    
    Damien's avatar
    Damien committed
            $queryData = [];
            $order = null;
    
            if (!empty($args['data']['delayed']) && $args['data']['delayed'] == 'true') {
                $where[] = 'process_limit_date < CURRENT_TIMESTAMP';
            }
            if (!empty($args['data']['search']) && mb_strlen($args['data']['search']) >= 2) {
    
                if (preg_match('/^"([^"]+)"$/', $args['data']['search'], $cleanSearch)) {
                    $where[] = '(alt_identifier like ? OR subject like ?)';
                    $queryData[] = "{$cleanSearch[1]}";
                    $queryData[] = "{$cleanSearch[1]}";
                } else {
                    $where[] = '(alt_identifier ilike ? OR translate(subject, \'ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõöøùúûýýþÿŔŕ\', \'aaaaaaaceeeeiiiidnoooooouuuuybsaaaaaaaceeeeiiiidnoooooouuuyybyrr\') ilike translate(?, \'ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõöøùúûýýþÿŔŕ\', \'aaaaaaaceeeeiiiidnoooooouuuuybsaaaaaaaceeeeiiiidnoooooouuuyybyrr\'))';
                    $queryData[] = "%{$args['data']['search']}%";
                    $queryData[] = "%{$args['data']['search']}%";
                }
    
    Damien's avatar
    Damien committed
            }
            if (isset($args['data']['priorities'])) {
                if (empty($args['data']['priorities'])) {
                    $where[] = 'priority is null';
                } else {
                    $replace = preg_replace('/(^,)|(,$)/', '', $args['data']['priorities']);
                    $replace = preg_replace('/(,,)/', ',', $replace);
                    if ($replace != $args['data']['priorities']) {
                        $where[] = '(priority is null OR priority in (?))';
                    } else {
                        $where[] = 'priority in (?)';
                    }
                    $queryData[] = explode(',', $replace);
                }
            }
            if (isset($args['data']['categories'])) {
                if (empty($args['data']['categories'])) {
                    $where[] = 'category_id is null';
                } else {
                    $replace = preg_replace('/(^,)|(,$)/', '', $args['data']['categories']);
                    $replace = preg_replace('/(,,)/', ',', $replace);
                    if ($replace != $args['data']['categories']) {
                        $where[] = '(category_id is null OR category_id in (?))';
                    } else {
                        $where[] = 'category_id in (?)';
                    }
                    $queryData[] = explode(',', $replace);
                }
            }
            if (!empty($args['data']['statuses'])) {
                $where[] = 'status in (?)';
                $queryData[] = explode(',', $args['data']['statuses']);
            }
            if (isset($args['data']['entities'])) {
                if (empty($args['data']['entities'])) {
                    $where[] = 'destination is null';
                } else {
                    $replace = preg_replace('/(^,)|(,$)/', '', $args['data']['entities']);
                    $replace = preg_replace('/(,,)/', ',', $replace);
                    if ($replace != $args['data']['entities']) {
                        $where[] = '(destination is null OR destination in (?))';
                    } else {
                        $where[] = 'destination in (?)';
                    }
                    $queryData[] = explode(',', $replace);
                }
            }
            if (!empty($args['data']['entitiesChildren'])) {
                $entities = explode(',', $args['data']['entitiesChildren']);
                $entitiesChildren = [];
                foreach ($entities as $entity) {
                    $children = EntityModel::getEntityChildren(['entityId' => $entity]);
                    $entitiesChildren = array_merge($entitiesChildren, $children);
                }
                if (!empty($entitiesChildren)) {
                    $where[] = 'destination in (?)';
                    $queryData[] = $entitiesChildren;
                }
            }
    
            if (!empty($args['data']['doctypes'])) {
                $table[] = 'doctypes';
                $leftJoin[] = 'doctypes.description=res_view_letterbox.type_label';
                $where[] = 'doctypes.type_id in (?)';
                $queryData[] = explode(',', $args['data']['doctypes']);
            }
    
            if (!empty($args['data']['folders'])) {
                $resourcesInFolders = FolderModel::getWithResources([
                    'select' => ['resources_folders.res_id'],
                    'where'  => ['resources_folders.folder_id in (?)'],
                    'data'   => [explode(',', $args['data']['folders'])]
                ]);
                $resourcesInFolders = array_column($resourcesInFolders, 'res_id');
    
                $where[] = 'res_id in (?)';
                $queryData[] = $resourcesInFolders;
            }
    
    Damien's avatar
    Damien committed
    
            if (!empty($args['data']['order']) && strpos($args['data']['order'], 'alt_identifier') !== false) {
                $order = 'order_alphanum(alt_identifier) ' . explode(' ', $args['data']['order'])[1];
            }
            if (!empty($args['data']['order']) && strpos($args['data']['order'], 'priority') !== false) {
                $order = 'priorities.order ' . explode(' ', $args['data']['order'])[1];
    
                $table[] = 'priorities';
                $leftJoin[] = 'res_view_letterbox.priority = priorities.id';
    
    Damien's avatar
    Damien committed
            }
    
            return ['table' => $table, 'leftJoin' => $leftJoin, 'where' => $where, 'queryData' => $queryData, 'order' => $order];
        }
    
    
        public function getActions(Request $request, Response $response, array $args)
    
    Damien's avatar
    Damien committed
        {
    
            $errors = ResourceListController::listControl(['groupId' => $args['groupId'], 'userId' => $args['userId'], 'basketId' => $args['basketId'], 'currentUserId' => $GLOBALS['id']]);
    
    Damien's avatar
    Damien committed
            if (!empty($errors['errors'])) {
                return $response->withStatus($errors['code'])->withJson(['errors' => $errors['errors']]);
            }
    
    
            $basket = BasketModel::getById(['id' => $args['basketId'], 'select' => ['basket_clause', 'basket_res_order', 'basket_name', 'basket_id']]);
            $group = GroupModel::getById(['id' => $args['groupId'], 'select' => ['group_id']]);
    
            $queryParams = $request->getQueryParams();
    
            if (!empty($queryParams['resId'])) {
                $usedIn = 'used_in_action_page';
            } else {
                $usedIn = 'used_in_basketlist';
            }
    
    Damien's avatar
    Damien committed
    
            $rawActions = ActionGroupBasketModel::get([
    
                'select'    => ['id_action', 'default_action_list', 'where_clause'],
                'where'     => ['basket_id = ?', 'group_id = ?', "{$usedIn} = ?"],
    
                'data'      => [$basket['basket_id'], $group['group_id'], 'Y']
    
    Damien's avatar
    Damien committed
            ]);
    
            $actions = [];
    
            $actionsClauses = [];
    
    Damien's avatar
    Damien committed
            foreach ($rawActions as $rawAction) {
    
                if ($rawAction['default_action_list'] == 'Y') {
                    $defaultAction = $rawAction['id_action'];
                }
    
    Damien's avatar
    Damien committed
                $actions[] = $rawAction['id_action'];
    
                $actionsClauses[$rawAction['id_action']] = $rawAction['where_clause'];
    
    Damien's avatar
    Damien committed
            }
    
            if (!empty($actions)) {
    
                $actions = ActionModel::get(['select' => ['id', 'label_action', 'component'], 'where' => ['id in (?)'], 'data' => [$actions], 'orderBy' => ["id = {$defaultAction} DESC",'label_action']]);
    
                foreach ($actions as $key => $action) {
    
                    if (!empty($queryParams['resId'])) {
                        if (!empty($actionsClauses[$action['id']])) {
                            $whereClause = PreparedClauseController::getPreparedClause(['clause' => $actionsClauses[$action['id']], 'login' => $GLOBALS['userId']]);
                            $ressource = ResModel::getOnView(['select' => [1], 'where' => ['res_id = ?', $whereClause], 'data' => [$queryParams['resId']]]);
                            if (empty($ressource)) {
                                unset($actions[$key]);
                                continue;
                            }
                        }
                        $categoriesList = ActionModel::getCategoriesById(['id' => $action['id']]);
                        if (!empty($categoriesList)) {
    
                            $actions[$key]['categories'] = array_column($categoriesList, 'category_id');
    
                        } else {
                            $categories = ResModel::getCategories();
    
                            $actions[$key]['categories'] = array_column($categories, 'id');
    
                    $actions[$key]['label'] = $action['label_action'];
                    unset($actions[$key]['label_action']);
                }
    
            return $response->withJson(['actions' => array_values($actions)]);
    
    Damien's avatar
    Damien committed
        public function setAction(Request $request, Response $response, array $aArgs)
        {
            $body = $request->getParsedBody();
            if (!Validator::arrayType()->notEmpty()->validate($body['resources'])) {
                return $response->withStatus(400)->withJson(['errors' => 'Data resources is empty or not an array']);
            }
    
    Damien's avatar
    Damien committed
            $body['resources'] = array_unique($body['resources']);
    
    Damien's avatar
    Damien committed
            $body['resources'] = array_slice($body['resources'], 0, 500);
    
    
            $errors = ResourceListController::listControl(['groupId' => $aArgs['groupId'], 'userId' => $aArgs['userId'], 'basketId' => $aArgs['basketId'], 'currentUserId' => $GLOBALS['id']]);
    
    Damien's avatar
    Damien committed
            if (!empty($errors['errors'])) {
                return $response->withStatus($errors['code'])->withJson(['errors' => $errors['errors']]);
            }
    
    
            $basket = BasketModel::getById(['id' => $aArgs['basketId'], 'select' => ['basket_clause', 'basket_id', 'basket_name']]);
    
    Damien's avatar
    Damien committed
            $group = GroupModel::getById(['id' => $aArgs['groupId'], 'select' => ['group_id']]);
            $actionGroupBasket = ActionGroupBasketModel::get([
                'select'    => [1],
                'where'     => ['basket_id = ?', 'group_id = ?', 'id_action = ?'],
                'data'      => [$basket['basket_id'], $group['group_id'], $aArgs['actionId']]
            ]);
            if (empty($actionGroupBasket)) {
                return $response->withStatus(400)->withJson(['errors' => 'Action is not linked to this group basket']);
            }
    
    
    Damien's avatar
    Damien committed
            $action = ActionModel::getById(['id' => $aArgs['actionId'], 'select' => ['component']]);
            if (empty($action['component'])) {
                return $response->withStatus(400)->withJson(['errors' => 'Action component does not exist']);
            }
            if (!array_key_exists($action['component'], ActionMethodController::COMPONENTS_ACTIONS)) {
                return $response->withStatus(400)->withJson(['errors' => 'Action method does not exist']);
            }
    
    
    Damien's avatar
    Damien committed
            $user   = UserModel::getById(['id' => $aArgs['userId'], 'select' => ['user_id']]);
            $whereClause = PreparedClauseController::getPreparedClause(['clause' => $basket['basket_clause'], 'login' => $user['user_id']]);
            $resources = ResModel::getOnView([
                'select'    => ['res_id', 'locker_user_id', 'locker_time'],
                'where'     => [$whereClause, 'res_view_letterbox.res_id in (?)'],
                'data'      => [$body['resources']]
            ]);
            $resourcesInBasket = [];
            foreach ($resources as $resource) {
                $resourcesInBasket[] = $resource['res_id'];
            }
    
    
    Damien's avatar
    Damien committed
            if (!empty(array_diff($body['resources'], $resourcesInBasket))) {
                return $response->withStatus(403)->withJson(['errors' => 'Resources out of perimeter']);
    
    Damien's avatar
    Damien committed
            }
    
    
    Damien's avatar
    Damien committed
            $resourcesForAction = [];
    
            foreach ($resources as $resource) {
                $lock = true;
                if (empty($resource['locker_user_id'] || empty($resource['locker_time']))) {
                    $lock = false;
    
                } elseif ($resource['locker_user_id'] == $GLOBALS['id']) {
    
                    $lock = false;
                } elseif (strtotime($resource['locker_time']) < time()) {
                    $lock = false;
                }
    
    Damien's avatar
    Damien committed
                if (!$lock) {
                    $resourcesForAction[] = $resource['res_id'];
    
    Damien's avatar
    Damien committed
            if (empty($resourcesForAction)) {
                return $response->withJson(['success' => 'No resource to process']);
    
    Damien's avatar
    Damien committed
            }
    
    
            $body['data'] = empty($body['data']) ? [] : $body['data'];
            $body['note'] = empty($body['note']) ? null : $body['note'];
    
    
            $method = ActionMethodController::COMPONENTS_ACTIONS[$action['component']];
    
            $methodResponses = [];
    
    Damien's avatar
    Damien committed
            foreach ($resourcesForAction as $resId) {
    
    Damien's avatar
    Damien committed
                if (!empty($method)) {
    
    Damien's avatar
    Damien committed
                    $methodResponse = ActionMethodController::$method(['resId' => $resId, 'data' => $body['data'], 'note' => $body['note']]);
    
                    if (!empty($methodResponse['errors'])) {
    
                        if (empty($methodResponses['errors'])) {
                            $methodResponses['errors'] = [];
                        }
                        $methodResponses['errors'] = array_merge($methodResponses['errors'], $methodResponse['errors']);
    
                    if (!empty($methodResponse['data'])) {
                        if (empty($methodResponses['data'])) {
                            $methodResponses['data'] = [];
                        }
                        $methodResponses['data'] = array_merge($methodResponses['data'], $methodResponse['data']);
    
    Damien's avatar
    Damien committed
                }
            }
    
    Damien's avatar
    Damien committed
            $historic = empty($methodResponse['history']) ? '' : $methodResponse['history'];
            ActionMethodController::terminateAction(['id' => $aArgs['actionId'], 'resources' => $resourcesForAction, 'basketName' => $basket['basket_name'], 'note' => $body['note'], 'history' => $historic]);
    
    Damien's avatar
    Damien committed
    
    
            if (!empty($methodResponses)) {
                return $response->withJson($methodResponses);
            }
    
    
    Damien's avatar
    Damien committed
            return $response->withStatus(204);
        }
    
    
    Damien's avatar
    Damien committed
        public function lock(Request $request, Response $response, array $aArgs)
        {
            $body = $request->getParsedBody();
            if (!Validator::arrayType()->notEmpty()->validate($body['resources'])) {
                return $response->withStatus(400)->withJson(['errors' => 'Data resources is empty or not an array']);
            }
    
    Damien's avatar
    Damien committed
            $body['resources'] = array_slice($body['resources'], 0, 500);
    
    Damien's avatar
    Damien committed
    
            $currentUser = UserModel::getByLogin(['login' => $GLOBALS['userId'], 'select' => ['id']]);
            $errors = ResourceListController::listControl(['groupId' => $aArgs['groupId'], 'userId' => $aArgs['userId'], 'basketId' => $aArgs['basketId'], 'currentUserId' => $currentUser['id']]);
            if (!empty($errors['errors'])) {
                return $response->withStatus($errors['code'])->withJson(['errors' => $errors['errors']]);
            }
    
            $basket = BasketModel::getById(['id' => $aArgs['basketId'], 'select' => ['basket_clause']]);
            $user   = UserModel::getById(['id' => $aArgs['userId'], 'select' => ['user_id']]);
    
            $whereClause = PreparedClauseController::getPreparedClause(['clause' => $basket['basket_clause'], 'login' => $user['user_id']]);
            $resources = ResModel::getOnView([
                'select'    => ['res_id', 'locker_user_id', 'locker_time'],
                'where'     => [$whereClause, 'res_view_letterbox.res_id in (?)'],
                'data'      => [$body['resources']]
            ]);
            $resourcesInBasket = [];
            foreach ($resources as $resource) {
                $resourcesInBasket[] = $resource['res_id'];
            }
    
    
    Damien's avatar
    Damien committed
            if (!empty(array_diff($body['resources'], $resourcesInBasket))) {
                return $response->withStatus(403)->withJson(['errors' => 'Resources out of perimeter']);
    
    Damien's avatar
    Damien committed
            }
    
            $locked = 0;
            $resourcesToLock = [];
    
            $lockersId = [];
    
            foreach ($resources as $resource) {
    
    Damien's avatar
    Damien committed
                $lock = true;
                if (empty($resource['locker_user_id'] || empty($resource['locker_time']))) {
                    $lock = false;
                } elseif ($resource['locker_user_id'] == $currentUser['id']) {
                    $lock = false;
                } elseif (strtotime($resource['locker_time']) < time()) {
                    $lock = false;
                }
    
                if (!$lock) {
                    $resourcesToLock[] = $resource['res_id'];
                } else {
    
                    $lockersId[] = $resource['locker_user_id'];
    
            if (!empty($resourcesToLock)) {
                ResModel::update([
                    'set'   => ['locker_user_id' => $currentUser['id'], 'locker_time' => 'CURRENT_TIMESTAMP + interval \'1\' MINUTE'],
                    'where' => ['res_id in (?)'],
                    'data'  => [$resourcesToLock]
                ]);
            }
    
            $lockers = [];
            if (!empty($lockersId)) {
                $lockersId = array_unique($lockersId);
                foreach ($lockersId as $lockerId) {
                    $lockers[] = UserModel::getLabelledUserById(['id' => $lockerId]);
                }
            }
    
            return $response->withJson(['lockedResources' => $locked, 'lockers' => $lockers]);
    
    Damien's avatar
    Damien committed
        public function unlock(Request $request, Response $response, array $aArgs)
        {
            $body = $request->getParsedBody();
            if (!Validator::arrayType()->notEmpty()->validate($body['resources'])) {
                return $response->withStatus(400)->withJson(['errors' => 'Data resources is empty or not an array']);
            }
            $body['resources'] = array_slice($body['resources'], 0, 500);
    
            $currentUser = UserModel::getByLogin(['login' => $GLOBALS['userId'], 'select' => ['id']]);
            $errors = ResourceListController::listControl(['groupId' => $aArgs['groupId'], 'userId' => $aArgs['userId'], 'basketId' => $aArgs['basketId'], 'currentUserId' => $currentUser['id']]);
            if (!empty($errors['errors'])) {
                return $response->withStatus($errors['code'])->withJson(['errors' => $errors['errors']]);
            }
    
            $basket = BasketModel::getById(['id' => $aArgs['basketId'], 'select' => ['basket_clause']]);
            $user   = UserModel::getById(['id' => $aArgs['userId'], 'select' => ['user_id']]);
    
            $whereClause = PreparedClauseController::getPreparedClause(['clause' => $basket['basket_clause'], 'login' => $user['user_id']]);
            $resources = ResModel::getOnView([
                'select'    => ['res_id', 'locker_user_id', 'locker_time'],
                'where'     => [$whereClause, 'res_view_letterbox.res_id in (?)'],
                'data'      => [$body['resources']]
            ]);
            $resourcesInBasket = [];
            foreach ($resources as $resource) {
                $resourcesInBasket[] = $resource['res_id'];
            }
    
    
    Damien's avatar
    Damien committed
            if (!empty(array_diff($body['resources'], $resourcesInBasket))) {
                return $response->withStatus(403)->withJson(['errors' => 'Resources out of perimeter']);
    
    Damien's avatar
    Damien committed
            }
    
            $resourcesToUnlock = [];
            foreach ($resources as $resource) {
                if (!(!empty($resource['locker_user_id']) && $resource['locker_user_id'] != $currentUser['id'] && strtotime($resource['locker_time']) > time())) {
                    $resourcesToUnlock[] = $resource['res_id'];
                }
            }
    
            if (!empty($resourcesToUnlock)) {
                ResModel::update([
                    'set'   => ['locker_user_id' => null, 'locker_time' => null],
                    'where' => ['res_id in (?)'],
                    'data'  => [$resourcesToUnlock]
                ]);
            }
    
            return $response->withStatus(204);
        }
    
    
    Damien's avatar
    Damien committed
        public static function listControl(array $aArgs)
    
    Damien's avatar
    Damien committed
        {
            ValidatorModel::notEmpty($aArgs, ['groupId', 'userId', 'basketId', 'currentUserId']);
    
            ValidatorModel::intVal($aArgs, ['groupId', 'userId', 'basketId', 'currentUserId']);
    
    Damien's avatar
    Damien committed
    
            $group = GroupModel::getById(['id' => $aArgs['groupId'], 'select' => ['group_id']]);
    
            $basket = BasketModel::getById(['id' => $aArgs['basketId'], 'select' => ['basket_id', 'basket_clause', 'basket_res_order', 'basket_name']]);
    
    Damien's avatar
    Damien committed
            if (empty($group) || empty($basket)) {
    
                return ['errors' => 'Group or basket does not exist', 'code' => 403];
    
    Damien's avatar
    Damien committed
            }
    
            if ($aArgs['userId'] == $aArgs['currentUserId']) {
                $redirectedBasket = RedirectBasketModel::get([
                    'select'    => [1],
                    'where'     => ['owner_user_id = ?', 'basket_id = ?', 'group_id = ?'],
    
                    'data'      => [$aArgs['userId'], $basket['basket_id'], $aArgs['groupId']]
    
    Damien's avatar
    Damien committed
                ]);
                if (!empty($redirectedBasket[0])) {
                    return ['errors' => 'Basket out of perimeter (redirected)', 'code' => 403];
                }
            } else {
                $redirectedBasket = RedirectBasketModel::get([
                    'select'    => ['actual_user_id'],
                    'where'     => ['owner_user_id = ?', 'basket_id = ?', 'group_id = ?'],
    
                    'data'      => [$aArgs['userId'], $basket['basket_id'], $aArgs['groupId']]
    
    Damien's avatar
    Damien committed
                if (empty($redirectedBasket[0]) || $redirectedBasket[0]['actual_user_id'] != $aArgs['currentUserId']) {
                    return ['errors' => 'Basket out of perimeter', 'code' => 403];
                }
            }
    
    Damien's avatar
    Damien committed
            $user = UserModel::getById(['id' => $aArgs['userId'], 'select' => ['user_id']]);
    
            $groups = UserModel::getGroupsByLogin(['login' => $user['user_id']]);
    
            $groups = array_column($groups, 'id');
            if (!in_array($aArgs['groupId'], $groups)) {
                return ['errors' => 'Group is not linked to this user', 'code' => 403];
    
            $isBasketLinked = GroupBasketModel::get(['select' => [1], 'where' => ['basket_id = ?', 'group_id = ?'], 'data' => [$basket['basket_id'], $group['group_id']]]);
    
    Damien's avatar
    Damien committed
            if (empty($isBasketLinked)) {
    
                return ['errors' => 'Group is not linked to this basket', 'code' => 403];
    
    Damien's avatar
    Damien committed
            return ['success' => 'success'];
    
    Damien's avatar
    Damien committed
        }
    
    Damien's avatar
    Damien committed
    
        private static function getAssignee(array $args)
        {
            ValidatorModel::notEmpty($args, ['resId']);
            ValidatorModel::intVal($args, ['resId']);
    
    
            $res = ResModel::getById(['select' => ['destination'], 'resId' => $args['resId']]);
    
    Damien's avatar
    Damien committed
            $listInstances = ListInstanceModel::get([
                'select'    => ['item_id'],
                'where'     => ['difflist_type = ?', 'res_id = ?', 'item_mode = ?'],
    
    Damien's avatar
    Damien committed
                'data'      => ['entity_id', $args['resId'], 'dest']
    
    Damien's avatar
    Damien committed
            ]);
    
    
            $assignee = '';
            if (!empty($listInstances[0])) {
                $assignee .= UserModel::getLabelledUserById(['login' => $listInstances[0]['item_id']]);
            }
            if (!empty($res['destination'])) {
    
                $entityLabel = EntityModel::getByEntityId(['select' => ['entity_label'], 'entityId' => $res['destination']]);
                $assignee .= (empty($assignee) ? "({$entityLabel['entity_label']})" : " ({$entityLabel['entity_label']})");
    
            return $assignee;
    
    Damien's avatar
    Damien committed
        }
    
        private static function getVisaWorkflow(array $args)
        {
            ValidatorModel::notEmpty($args, ['resId']);
            ValidatorModel::intVal($args, ['resId']);
    
            $listInstances = ListInstanceModel::get([
                'select'    => ['item_id', 'requested_signature', 'process_date'],
                'where'     => ['difflist_type = ?', 'res_id = ?'],
    
    Damien's avatar
    Damien committed
                'data'      => ['VISA_CIRCUIT', $args['resId']],
    
    Damien's avatar
    Damien committed
                'orderBy'   => ['listinstance_id']
            ]);
    
            $users = [];
    
            $currentFound = false;
    
    Damien's avatar
    Damien committed
            foreach ($listInstances as $listInstance) {
                $users[] = [
    
                    'user'      => UserModel::getLabelledUserById(['login' => $listInstance['item_id']]),
                    'mode'      => $listInstance['requested_signature'] ? 'sign' : 'visa',
                    'date'      => TextFormatModel::formatDate($listInstance['process_date']),
                    'current'   => empty($listInstance['process_date']) && !$currentFound
    
    Damien's avatar
    Damien committed
                ];
    
                if (empty($listInstance['process_date']) && !$currentFound) {
                    $currentFound = true;
                }
    
    Damien's avatar
    Damien committed
            }
    
            return $users;
        }
    
    
        private static function getSignatories(array $args)
        {
            ValidatorModel::notEmpty($args, ['resId']);
            ValidatorModel::intVal($args, ['resId']);
    
            $listInstances = ListInstanceModel::get([
                'select'    => ['item_id', 'process_date'],
                'where'     => ['difflist_type = ?', 'res_id = ?' ,'requested_signature = ?'],
                'data'      => ['VISA_CIRCUIT', $args['resId'], true],
                'orderBy'   => ['listinstance_id']
            ]);
    
            $users = [];
            foreach ($listInstances as $listInstance) {
                $users[] = [
                    'user'      => UserModel::getLabelledUserById(['login' => $listInstance['item_id']]),
                    'date'      => TextFormatModel::formatDate($listInstance['process_date']),
                ];
            }
    
            return $users;
        }
    
    
    Damien's avatar
    Damien committed
        private static function getParallelOpinionsNumber(array $args)
    
        {
            ValidatorModel::notEmpty($args, ['resId']);
            ValidatorModel::intVal($args, ['resId']);
    
            $notes = NoteModel::get(['select' => ['count(1)'], 'where' => ['identifier = ?', 'note_text like ?'], 'data' => [$args['resId'], '[avis%']]);
    
            return $notes[0]['count'];
        }
    
        private static function getFolders(array $args)
        {
            ValidatorModel::notEmpty($args, ['resId', 'userId']);
            ValidatorModel::intVal($args, ['resId', 'userId']);
    
            $user = UserModel::getById(['id' => $args['userId'], 'select' => ['user_id']]);
    
    
            $entities = UserModel::getEntitiesByLogin(['login' => $user['user_id']]);
    
            $entities = array_column($entities, 'id');
    
            if (empty($entities)) {
                $entities = [0];
            }
    
            $folders = FolderModel::getWithEntitiesAndResources([
    
                'select'    => ['DISTINCT(folders.id)', 'folders.label'],
    
                'where'     => ['res_id = ?', '(user_id = ? OR entity_id in (?))'],
                'data'      => [$args['resId'], $args['userId'], $entities]
            ]);
    
            return $folders;
        }
    
    
        public static function getIdsWithOffsetAndLimit(array $args)
        {
            ValidatorModel::arrayType($args, ['resources']);
            ValidatorModel::intVal($args, ['offset', 'limit']);
    
            $ids = [];
            if (!empty($args['resources'][$args['offset']])) {
                $start = $args['offset'];
                $i = 0;
                while ($i < $args['limit'] && !empty($args['resources'][$start])) {
                    $ids[] = $args['resources'][$start]['res_id'];
                    ++$start;
                    ++$i;
                }
            }
    
            return $ids;
        }
    
        public static function getFormattedResources(array $args)
        {
            ValidatorModel::notEmpty($args, ['resources', 'userId']);
            ValidatorModel::arrayType($args, ['resources', 'attachments', 'listDisplay']);
            ValidatorModel::intVal($args, ['userId']);
            ValidatorModel::boolType($args, ['checkLocked']);
    
            $formattedResources = [];
    
            $resources = $args['resources'];
            $attachments = $args['attachments'];
    
            $currentUser = UserModel::getById(['id' => $args['userId'], 'select' => ['user_id']]);
    
            foreach ($resources as $key => $resource) {
    
                $formattedResources[$key]['resId']              = $resource['res_id'];
                $formattedResources[$key]['chrono']             = $resource['alt_identifier'];
    
                $formattedResources[$key]['barcode']            = $resource['barcode'];
                $formattedResources[$key]['subject']            = $resource['subject'];
                $formattedResources[$key]['confidentiality']    = $resource['confidentiality'];
                $formattedResources[$key]['statusLabel']        = $resource['status.label_status'];
                $formattedResources[$key]['statusImage']        = $resource['status.img_filename'];
                $formattedResources[$key]['priorityColor']      = $resource['priorities.color'];
                $formattedResources[$key]['closing_date']       = $resource['closing_date'];
                $formattedResources[$key]['countAttachments']   = 0;
    
                $formattedResources[$key]['hasDocument']        = $resource['res_filename'] != null;
    
                $formattedResources[$key]['mailTracking']       = in_array($resource['res_id'], $args['trackedMails']);
    
                foreach ($attachments as $attachment) {
                    if ($attachment['res_id_master'] == $resource['res_id']) {
                        $formattedResources[$key]['countAttachments'] = $attachment['count'];
                        break;
                    }
                }
    
                $formattedResources[$key]['countNotes'] = NoteModel::countByResId(['resId' => $resource['res_id'], 'login' => $currentUser['user_id'], 'userId' => $args['userId']]);
    
    
                if (!empty($args['checkLocked'])) {
                    $isLocked = true;
                    if (empty($resource['locker_user_id'] || empty($resource['locker_time']))) {
                        $isLocked = false;
                    } elseif ($resource['locker_user_id'] == $args['userId']) {
                        $isLocked = false;
                    } elseif (strtotime($resource['locker_time']) < time()) {
                        $isLocked = false;
                    }
                    if ($isLocked) {
                        $formattedResources[$key]['locker'] = UserModel::getLabelledUserById(['id' => $resource['locker_user_id']]);
                    }
                    $formattedResources[$key]['isLocked'] = $isLocked;
                }
    
                if (isset($args['listDisplay'])) {
                    $display = [];
                    foreach ($args['listDisplay'] as $value) {
                        $value = (array)$value;
                        if ($value['value'] == 'getPriority') {
                            $value['displayValue'] = $resource['priorities.label'];
                            $display[] = $value;
                        } elseif ($value['value'] == 'getCategory') {
                            $value['displayValue'] = $resource['category_id'];
                            $display[] = $value;
                        } elseif ($value['value'] == 'getDoctype') {
                            $value['displayValue'] = $resource['doctypes.description'];
                            $display[] = $value;
                        } elseif ($value['value'] == 'getAssignee') {
                            $value['displayValue'] = ResourceListController::getAssignee(['resId' => $resource['res_id']]);
                            $display[] = $value;
                        } elseif ($value['value'] == 'getSenders') {
    
                            $value['displayValue'] = ContactController::getFormattedContacts(['resId' => $resource['res_id'], 'mode' => 'sender', 'onlyContact' => true]);
    
                            $display[] = $value;
                        } elseif ($value['value'] == 'getRecipients') {
    
                            $value['displayValue'] = ContactController::getFormattedContacts(['resId' => $resource['res_id'], 'mode' => 'recipient', 'onlyContact' => true]);
    
                            $display[] = $value;
                        } elseif ($value['value'] == 'getVisaWorkflow') {
                            $value['displayValue'] = ResourceListController::getVisaWorkflow(['resId' => $resource['res_id']]);
                            $display[] = $value;
                        } elseif ($value['value'] == 'getSignatories') {
                            $value['displayValue'] = ResourceListController::getSignatories(['resId' => $resource['res_id']]);
                            $display[] = $value;
                        } elseif ($value['value'] == 'getParallelOpinionsNumber') {
                            $value['displayValue'] = ResourceListController::getParallelOpinionsNumber(['resId' => $resource['res_id']]);
                            $display[] = $value;
                        } elseif ($value['value'] == 'getCreationAndProcessLimitDates') {
                            $value['displayValue'] = ['creationDate' => $resource['creation_date'], 'processLimitDate' => $resource['process_limit_date']];
                            $display[] = $value;
                        } elseif ($value['value'] == 'getModificationDate') {
                            $value['displayValue'] = $resource['modification_date'];
                            $display[] = $value;
                        } elseif ($value['value'] == 'getOpinionLimitDate') {
                            $value['displayValue'] = $resource['opinion_limit_date'];
                            $display[] = $value;
                        }
                    }
    
                    $formattedResources[$key]['folders'] = ResourceListController::getFolders(['resId' => $resource['res_id'], 'userId' => $args['userId']]);
    
                    $formattedResources[$key]['display'] = $display;
                }
            }
    
            return $formattedResources;
        }
    
    
        public static function getFormattedFilters(array $args)
        {
            ValidatorModel::notEmpty($args, ['where']);
            ValidatorModel::arrayType($args, ['where', 'queryData', 'queryParams']);
    
            $data = $args['queryParams'];
            $where = $args['where'];
            $queryData = $args['queryData'];
    
            if (!empty($data['delayed']) && $data['delayed'] == 'true') {
                $where[] = 'process_limit_date < CURRENT_TIMESTAMP';
            }
            if (!empty($data['search']) && mb_strlen($data['search']) >= 2) {
                $where[] = '(alt_identifier ilike ? OR translate(subject, \'ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõöøùúûýýþÿŔŕ\', \'aaaaaaaceeeeiiiidnoooooouuuuybsaaaaaaaceeeeiiiidnoooooouuuyybyrr\') ilike translate(?, \'ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõöøùúûýýþÿŔŕ\', \'aaaaaaaceeeeiiiidnoooooouuuuybsaaaaaaaceeeeiiiidnoooooouuuyybyrr\'))';
                $queryData[] = "%{$data['search']}%";
                $queryData[] = "%{$data['search']}%";
            }
    
            $wherePriorities = $where;
            $whereCategories = $where;
            $whereStatuses   = $where;
            $whereEntities   = $where;
    
            $whereDocTypes   = $where;
            $whereFolders    = $where;
    
            $dataPriorities  = $queryData;
            $dataCategories  = $queryData;
            $dataStatuses    = $queryData;
            $dataEntities    = $queryData;
    
            $dataDocTypes    = $queryData;
            $dataFolders     = $queryData;
    
    
            if (isset($data['priorities'])) {
                if (empty($data['priorities'])) {
                    $tmpWhere = 'priority is null';
                } else {
                    $replace = preg_replace('/(^,)|(,$)/', '', $data['priorities']);
                    $replace = preg_replace('/(,,)/', ',', $replace);
                    if ($replace != $data['priorities']) {
                        $tmpWhere = '(priority is null OR priority in (?))';
                    } else {
                        $tmpWhere = 'priority in (?)';
                    }
                    $dataCategories[] = explode(',', $replace);
                    $dataStatuses[]   = explode(',', $replace);
                    $dataEntities[]   = explode(',', $replace);
    
                    $dataDocTypes[]   = explode(',', $replace);
    
                    $dataFolders[]    = explode(',', $replace);
    
                }
    
                $whereCategories[] = $tmpWhere;
                $whereStatuses[]   = $tmpWhere;
                $whereEntities[]   = $tmpWhere;
    
                $whereFolders[]    = $tmpWhere;
    
            }
            if (isset($data['categories'])) {
                if (empty($data['categories'])) {
                    $tmpWhere = 'category_id is null';
                } else {
                    $replace = preg_replace('/(^,)|(,$)/', '', $data['categories']);
                    $replace = preg_replace('/(,,)/', ',', $replace);
                    if ($replace != $data['categories']) {
                        $tmpWhere = '(category_id is null OR category_id in (?))';
                    } else {
                        $tmpWhere = 'category_id in (?)';
                    }
                    $dataPriorities[] = explode(',', $replace);
                    $dataStatuses[]   = explode(',', $replace);
                    $dataEntities[]   = explode(',', $replace);
    
                    $dataDocTypes[]   = explode(',', $replace);
    
                    $dataFolders[]    = explode(',', $replace);
    
                }
    
                $wherePriorities[] = $tmpWhere;
                $whereStatuses[]   = $tmpWhere;
                $whereEntities[]   = $tmpWhere;
    
                $whereFolders[]    = $tmpWhere;
    
            }
            if (!empty($data['statuses'])) {
                $wherePriorities[] = 'status in (?)';
                $dataPriorities[]  = explode(',', $data['statuses']);
                $whereCategories[] = 'status in (?)';
                $dataCategories[]  = explode(',', $data['statuses']);
                $whereEntities[]   = 'status in (?)';
                $dataEntities[]    = explode(',', $data['statuses']);
    
                $whereDocTypes[]   = 'status in (?)';
                $dataDocTypes[]    = explode(',', $data['statuses']);
    
                $whereFolders[]    = 'status in (?)';
                $dataFolders[]     = explode(',', $data['statuses']);
    
                $wherePriorities[] = 'type_id in (?)';
    
                $dataPriorities[]  = explode(',', $data['doctypes']);
    
                $whereCategories[] = 'type_id in (?)';
    
                $dataCategories[]  = explode(',', $data['doctypes']);
    
                $whereEntities[]   = 'type_id in (?)';
    
                $dataEntities[]    = explode(',', $data['doctypes']);
    
                $whereStatuses[]   = 'type_id in (?)';
                $dataStatuses[]    = explode(',', $data['doctypes']);
    
                $whereFolders[]    = 'type_id in (?)';
                $dataFolders[]     = explode(',', $data['doctypes']);
    
            }
            if (isset($data['entities'])) {
                if (empty($data['entities'])) {
                    $tmpWhere = 'destination is null';
                } else {
                    $replace = preg_replace('/(^,)|(,$)/', '', $data['entities']);
                    $replace = preg_replace('/(,,)/', ',', $replace);
                    if ($replace != $data['entities']) {
                        $tmpWhere = '(destination is null OR destination in (?))';
                    } else {
                        $tmpWhere = 'destination in (?)';
                    }
                    $dataPriorities[] = explode(',', $replace);
                    $dataCategories[] = explode(',', $replace);
                    $dataStatuses[] = explode(',', $replace);
    
                    $dataDocTypes[] = explode(',', $replace);
    
                    $dataFolders[]  = explode(',', $replace);
    
                }
    
                $wherePriorities[] = $tmpWhere;
                $whereCategories[] = $tmpWhere;
                $whereStatuses[]   = $tmpWhere;
    
                $whereFolders[]    = $tmpWhere;
    
            }
            if (!empty($data['entitiesChildren'])) {
                $entities = explode(',', $data['entitiesChildren']);
                $entitiesChildren = [];
                foreach ($entities as $entity) {
                    $children = EntityModel::getEntityChildren(['entityId' => $entity]);
                    $entitiesChildren = array_merge($entitiesChildren, $children);