Skip to content
Snippets Groups Projects
ExportController.php 14.5 KiB
Newer Older
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;
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 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']]);
        }

Damien's avatar
Damien committed
        $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']);
        } elseif (!Validator::arrayType()->notEmpty()->validate($body['resources'])) {
            return $response->withStatus(403)->withJson(['errors' => 'Resources is not set 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']);
        $basket = BasketModel::getById(['id' => $aArgs['basketId'], 'select' => ['basket_clause', 'basket_res_order', 'basket_name']]);
        $user = UserModel::getById(['id' => $aArgs['userId'], 'select' => ['user_id']]);

        $whereClause = PreparedClauseController::getPreparedClause(['clause' => $basket['basket_clause'], 'login' => $user['user_id']]);
        $rawResourcesInBasket = ResModel::getOnView([
            'select'    => ['res_id'],
            'where'     => [$whereClause]
        ]);
        $allResourcesInBasket = [];
        foreach ($rawResourcesInBasket as $resource) {
            $allResourcesInBasket[] = $resource['res_id'];
        }

        $order = 'CASE res_view_letterbox.res_id ';
        foreach ($body['resources'] as $key => $resId) {
            if (!in_array($resId, $allResourcesInBasket)) {
                return $response->withStatus(403)->withJson(['errors' => 'Resources out of perimeter']);
            }
            $order .= "WHEN {$resId} THEN {$key} ";
        }
        $order .= 'END';

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
        }

        $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']}";
        $resources = ResourceListModel::getOnView([
            'select'    => $select,
            'table'     => $tableFunction,
            'leftJoin'  => $leftJoinFunction,
            'where'     => ['res_view_letterbox.res_id in (?)'],
            'data'      => [$body['resources']],
            'orderBy'   => [$order]
        ]);
Damien's avatar
Damien committed

        $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) {
Damien's avatar
Damien committed
            if (!empty($copies)) {
                $copies .= "\n";
Damien's avatar
Damien committed
            }
            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 .= "\n";
Damien's avatar
Damien committed
            }
            $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 .= "\n";
Damien's avatar
Damien committed
            }
            $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 .= "\n";
Damien's avatar
Damien committed
            }
            $dates .= $date;
Damien's avatar
Damien committed
        return $dates;
Damien's avatar
Damien committed
    }
}