Skip to content
Snippets Groups Projects
ExportController.php 14.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 Export Controller
    * @author dev@maarch.org
    */
    
    namespace Resource\controllers;
    
    use Attachment\models\AttachmentModel;
    use Basket\models\BasketModel;
    use Entity\models\EntityModel;
    
    Damien's avatar
    Damien committed
    use Entity\models\ListInstanceModel;
    
    Damien's avatar
    Damien committed
    use Resource\models\ExportTemplateModel;
    use Resource\models\ResModel;
    use Resource\models\ResourceListModel;
    use Respect\Validation\Validator;
    use Slim\Http\Request;
    use Slim\Http\Response;
    
    Damien's avatar
    Damien committed
    use SrcCore\models\TextFormatModel;
    
    Damien's avatar
    Damien committed
    use SrcCore\models\ValidatorModel;
    
    Damien's avatar
    Damien committed
    use Tag\models\TagModel;
    
    Damien's avatar
    Damien committed
    use User\models\UserModel;
    
    
    Damien's avatar
    Damien committed
    require_once 'core/class/Url.php';
    
    
    Damien's avatar
    Damien committed
    class ExportController
    {
    
        public function getExportTemplate(Request $request, Response $response)
        {
            $currentUser = UserModel::getByLogin(['login' => $GLOBALS['userId'], 'select' => ['id']]);
    
            $template     = ExportTemplateModel::getByUserId(['userId' => $currentUser['id']]);
    
    Damien's avatar
    Damien committed
            $delimiter    = '';
            $templateData = [];
    
            if (!empty($template)) {
                $delimiter    = $template['delimiter'];
                $templateData = (array)json_decode($template['data']);
            }
    
            return $response->withJson(['template' => $templateData, 'delimiter' => $delimiter]);
        }
    
    
    Damien's avatar
    Damien committed
        public function updateExport(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', 'basket_res_order', 'basket_name']]);
            $user = UserModel::getById(['id' => $aArgs['userId'], 'select' => ['user_id']]);
    
    
    Damien's avatar
    Damien committed
            $queryParamsData = $request->getQueryParams();
            $body = $request->getParsedBody();
    
    Damien's avatar
    Damien committed
    
    
    Damien's avatar
    Damien committed
            if (!Validator::stringType()->notEmpty()->validate($body['delimiter']) || !in_array($body['delimiter'], [',', ';', 'TAB'])) {
    
                return $response->withStatus(400)->withJson(['errors' => 'Delimiter is not set or not set well']);
    
    Damien's avatar
    Damien committed
            } elseif (!Validator::arrayType()->notEmpty()->validate($body['data'])) {
    
                return $response->withStatus(400)->withJson(['errors' => 'Data is not an array or empty']);
    
    Damien's avatar
    Damien committed
            }
    
    Damien's avatar
    Damien committed
            foreach ($body['data'] as $value) {
                if (!isset($value['value']) || !Validator::stringType()->notEmpty()->validate($value['label']) || !Validator::boolType()->validate($value['isFunction'])) {
    
                    return $response->withStatus(400)->withJson(['errors' => 'One data is not set well']);
    
    Damien's avatar
    Damien committed
                }
            }
    
            $template = ExportTemplateModel::getByUserId(['select' => [1], 'userId' => $currentUser['id']]);
            if (empty($template)) {
    
    Damien's avatar
    Damien committed
                ExportTemplateModel::create([
                    'userId'    => $currentUser['id'],
                    'delimiter' => $body['delimiter'],
                    'data'      => json_encode($body['data'])
                ]);
    
    Damien's avatar
    Damien committed
            } else {
    
    Damien's avatar
    Damien committed
                ExportTemplateModel::update([
                    'set'   => [
                        'delimiter' => $body['delimiter'],
                        'data'      => json_encode($body['data'])
                    ],
                    'where' => ['user_id = ?'],
                    'data'  => [$currentUser['id']]
                ]);
    
    Damien's avatar
    Damien committed
            $allQueryData = ResourceListController::getResourcesListQueryData(['data' => $queryParamsData, 'basketClause' => $basket['basket_clause'], 'login' => $user['user_id']]);
            if (!empty($allQueryData['order'])) {
                $queryParamsData['order'] = $allQueryData['order'];
    
    Damien's avatar
    Damien committed
            }
    
    Damien's avatar
    Damien committed
            $rawResources = ResourceListModel::getOnView([
                'select'    => ['res_id'],
                'table'     => $allQueryData['table'],
                'leftJoin'  => $allQueryData['leftJoin'],
                'where'     => $allQueryData['where'],
                'data'      => $allQueryData['queryData'],
                'orderBy'   => empty($queryParamsData['order']) ? [$basket['basket_res_order']] : [$queryParamsData['order']]
            ]);
    
    Damien's avatar
    Damien committed
    
    
    Damien's avatar
    Damien committed
            $resIds = [];
            foreach ($rawResources as $resource) {
                $resIds[] = $resource['res_id'];
    
    Damien's avatar
    Damien committed
            }
    
            $select = ['res_id'];
    
    Damien's avatar
    Damien committed
            $tableFunction = [];
            $leftJoinFunction = [];
            $csvHead = [];
            foreach ($body['data'] as $value) {
                $csvHead[] = $value['label'];
                if (empty($value['value'])) {
                    continue;
                }
                if ($value['isFunction']) {
    
    Damien's avatar
    Damien committed
                    if ($value['value'] == 'getStatus') {
    
    Damien's avatar
    Damien committed
                        $select[] = 'status.label_status AS "status.label_status"';
                        $tableFunction[] = 'status';
                        $leftJoinFunction[] = 'res_view_letterbox.status = status.id';
    
    Damien's avatar
    Damien committed
                    } elseif ($value['value'] == 'getPriority') {
    
    Damien's avatar
    Damien committed
                        $select[] = 'priorities.label AS "priorities.label"';
                        $tableFunction[] = 'priorities';
                        $leftJoinFunction[] = 'res_view_letterbox.priority = priorities.id';
    
    Damien's avatar
    Damien committed
                    } elseif ($value['value'] == 'getParentFolder') {
    
    Damien's avatar
    Damien committed
                        $select[] = 'folders.folder_name AS "folders.folder_name"';
                        $tableFunction[] = 'folders';
                        $leftJoinFunction[] = 'res_view_letterbox.fold_parent_id = folders.folders_system_id';
    
    Damien's avatar
    Damien committed
                    } elseif ($value['value'] == 'getCategory') {
    
    Damien's avatar
    Damien committed
                        $select[] = 'res_view_letterbox.category_id';
    
    Damien's avatar
    Damien committed
                    } elseif ($value['value'] == 'getInitiatorEntity') {
    
    Damien's avatar
    Damien committed
                        $select[] = 'enone.short_label AS "enone.short_label"';
                        $tableFunction[] = 'entities enone';
                        $leftJoinFunction[] = 'res_view_letterbox.initiator = enone.entity_id';
    
    Damien's avatar
    Damien committed
                    } elseif ($value['value'] == 'getDestinationEntity') {
    
    Damien's avatar
    Damien committed
                        $select[] = 'entwo.short_label AS "entwo.short_label"';
                        $tableFunction[] = 'entities entwo';
                        $leftJoinFunction[] = 'res_view_letterbox.destination = entwo.entity_id';
    
    Damien's avatar
    Damien committed
                    } elseif ($value['value'] == 'getDestinationEntityType') {
    
    Damien's avatar
    Damien committed
                        $select[] = 'enthree.entity_type AS "enthree.entity_type"';
    
    Damien's avatar
    Damien committed
                        $tableFunction[] = 'entities enthree';
                        $leftJoinFunction[] = 'res_view_letterbox.destination = enthree.entity_id';
                    } elseif ($value['value'] == 'getTypist') {
                        $select[] = 'res_view_letterbox.typist';
                    } elseif ($value['value'] == 'getAssignee') {
                        $select[] = 'res_view_letterbox.dest_user';
    
    Damien's avatar
    Damien committed
                    }
    
    Damien's avatar
    Damien committed
                } else {
                    $select[] = "res_view_letterbox.{$value['value']}";
    
    Damien's avatar
    Damien committed
            $resources = [];
            if (!empty($resIds)) {
                $order = 'CASE res_view_letterbox.res_id ';
                foreach ($resIds as $key => $resId) {
                    $order .= "WHEN {$resId} THEN {$key} ";
                }
                $order .= 'END';
    
                $resources = ResourceListModel::getOnView([
                    'select'    => $select,
                    'table'     => $tableFunction,
                    'leftJoin'  => $leftJoinFunction,
                    'where'     => ['res_view_letterbox.res_id in (?)'],
                    'data'      => [$resIds],
                    'orderBy'   => [$order]
                ]);
            }
    
            $file = fopen('php://memory', 'w');
            $delimiter = ($body['delimiter'] == 'TAB' ? "\t" : $body['delimiter']);
    
            fputcsv($file, $csvHead, $delimiter);
    
            foreach ($resources as $resource) {
                $csvContent = [];
                foreach ($body['data'] as $value) {
                    if (empty($value['value'])) {
                        $csvContent[] = '';
                        continue;
                    }
                    if ($value['isFunction']) {
                        if ($value['value'] == 'getStatus') {
                            $csvContent[] = $resource['status.label_status'];
                        } elseif ($value['value'] == 'getPriority') {
                            $csvContent[] = $resource['priorities.label'];
    
    Damien's avatar
    Damien committed
                        } elseif ($value['value'] == 'getCopies') {
                            $csvContent[] = ExportController::getCopies(['resId' => $resource['res_id']]);
    
    Damien's avatar
    Damien committed
                        } elseif ($value['value'] == 'getDetailLink') {
                            $csvContent[] = str_replace('rest/', "apps/maarch_entreprise/index.php?page=details&dir=indexing_searching&id={$resource['res_id']}", \Url::coreurl());
                        } elseif ($value['value'] == 'getParentFolder') {
                            $csvContent[] = $resource['folders.folder_name'];
                        } elseif ($value['value'] == 'getCategory') {
    
                            $csvContent[] = ResModel::getCategoryLabel(['categoryId' => $resource['category_id']]);
    
    Damien's avatar
    Damien committed
                        } elseif ($value['value'] == 'getInitiatorEntity') {
                            $csvContent[] = $resource['enone.short_label'];
                        } elseif ($value['value'] == 'getDestinationEntity') {
                            $csvContent[] = $resource['entwo.short_label'];
    
    Damien's avatar
    Damien committed
                        } elseif ($value['value'] == 'getDestinationEntityType') {
    
    Damien's avatar
    Damien committed
                            $csvContent[] = $resource['enthree.entity_type'];
    
    Damien's avatar
    Damien committed
                        } elseif ($value['value'] == 'getSender') {
    
    Damien's avatar
    Damien committed
                            //TODO
    
                            $csvContent[] = '';
    
    Damien's avatar
    Damien committed
                        } elseif ($value['value'] == 'getRecipient') {
    
    Damien's avatar
    Damien committed
                            //TODO
    
                            $csvContent[] = '';
    
    Damien's avatar
    Damien committed
                        } elseif ($value['value'] == 'getTypist') {
                            $csvContent[] = UserModel::getLabelledUserById(['login' => $resource['typist']]);
                        } elseif ($value['value'] == 'getAssignee') {
                            $csvContent[] = UserModel::getLabelledUserById(['login' => $resource['dest_user']]);
    
    Damien's avatar
    Damien committed
                        } elseif ($value['value'] == 'getTags') {
                            $csvContent[] = ExportController::getTags(['resId' => $resource['res_id']]);
                        } elseif ($value['value'] == 'getSignatories') {
                            $csvContent[] = ExportController::getSignatories(['resId' => $resource['res_id']]);
                        } elseif ($value['value'] == 'getSignatureDates') {
                            $csvContent[] = ExportController::getSignatureDates(['resId' => $resource['res_id']]);
                        }
                    } else {
    
    Damien's avatar
    Damien committed
                        $allDates = ['doc_date', 'departure_date', 'admission_date', 'process_limit_date', 'recommendation_limit_date', 'closing_date', 'sve_start_date'];
                        if (in_array($value['value'], $allDates)) {
    
    Damien's avatar
    Damien committed
                            $csvContent[] = TextFormatModel::formatDate($resource[$value['value']]);
    
                        } else {
                            $csvContent[] = $resource[$value['value']];
                        }
    
    Damien's avatar
    Damien committed
                    }
                }
                fputcsv($file, $csvContent, $delimiter);
            }
    
            rewind($file);
            $response->write(stream_get_contents($file));
            $response = $response->withAddedHeader('Content-Disposition', 'attachment; filename=export_maarch.csv');
    
            return $response->withHeader('Content-Type', 'application/vnd.ms-excel');
        }
    
    
    Damien's avatar
    Damien committed
        private static function getCopies(array $args)
    
    Damien's avatar
    Damien committed
        {
            ValidatorModel::notEmpty($args, ['resId']);
            ValidatorModel::intVal($args, ['resId']);
    
            $listInstances = ListInstanceModel::get([
    
    Damien's avatar
    Damien committed
                'select'    => ['item_id', 'item_type'],
                'where'     => ['res_id = ?', 'difflist_type = ?', 'item_mode = ?'],
    
    Damien's avatar
    Damien committed
                'data'      => [$args['resId'], 'entity_id', 'cc']
    
    Damien's avatar
    Damien committed
            ]);
    
    Damien's avatar
    Damien committed
            $copies = '';
    
    Damien's avatar
    Damien committed
            foreach ($listInstances as $listInstance) {
                if (!empty($copyEntities)) {
    
    Damien's avatar
    Damien committed
                    $copies .= ' ; ';
                }
                if ($listInstance['item_type'] == 'user_id') {
                    $copies .= UserModel::getLabelledUserById(['login' => $listInstance['item_id']]);
                } elseif ($listInstance['item_type'] == 'entity_id') {
                    $entity = EntityModel::getByEntityId(['entityId' => $listInstance['item_id'], 'select' => ['short_label']]);
                    $copies .= $entity['short_label'];
    
    Damien's avatar
    Damien committed
            return $copies;
    
    Damien's avatar
    Damien committed
        }
    
        private static function getTags(array $args)
        {
            ValidatorModel::notEmpty($args, ['resId']);
            ValidatorModel::intVal($args, ['resId']);
    
            $tagsRes = TagModel::getTagRes([
                'select'    => ['tag_id'],
                'where'     => ['res_id = ?'],
                'data'      => [$args['resId']],
            ]);
    
            $tags = '';
            foreach ($tagsRes as $value) {
                $tag = TagModel::getById(['id' => $value['tag_id'], 'select' => ['tag_label']]);
                if (!empty($tags)) {
                    $tags .= ' ; ';
                }
                $tags .= $tag['tag_label'];
    
    Damien's avatar
    Damien committed
            return $tags;
        }
    
        private static function getSignatories(array $args)
        {
            ValidatorModel::notEmpty($args, ['resId']);
            ValidatorModel::intVal($args, ['resId']);
    
            $listInstances = ListInstanceModel::get([
                'select'    => ['item_id'],
                'where'     => ['res_id = ?', 'item_type = ?', 'signatory = ?'],
                'data'      => [$args['resId'], 'user_id', true]
            ]);
    
            $signatories = '';
            foreach ($listInstances as $listInstance) {
                $user = UserModel::getByLogin(['login' => $listInstance['item_id'], 'select' => ['firstname', 'lastname']]);
                if (!empty($signatories)) {
                    $signatories .= ' ; ';
                }
                $signatories .= "{$user['firstname']} {$user['lastname']}";
    
    Damien's avatar
    Damien committed
            return $signatories;
        }
    
    Damien's avatar
    Damien committed
    
    
    Damien's avatar
    Damien committed
        private static function getSignatureDates(array $args)
        {
            ValidatorModel::notEmpty($args, ['resId']);
            ValidatorModel::intVal($args, ['resId']);
    
            $attachments = AttachmentModel::getOnView([
                'select'    => ['creation_date'],
                'where'     => ['res_id = ?', 'attachment_type = ?', 'status = ?'],
                'data'      => [$args['resId'], 'signed_response', 'TRA']
            ]);
    
            $dates = '';
            foreach ($attachments as $attachment) {
                $date = new \DateTime($attachment['creation_date']);
                $date = $date->format('d-m-Y H:i');
    
                if (!empty($dates)) {
                    $dates .= ' ; ';
                }
                $dates .= $date;
    
    Damien's avatar
    Damien committed
            return $dates;
    
    Damien's avatar
    Damien committed
        }
    }