Skip to content
Snippets Groups Projects
FastParapheurController.php 17.2 KiB
Newer Older
  • Learn to ignore specific revisions
  • <?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 fastParapheur Controller
     * @author nathan.cheval@edissyum.com
     * @author dev@maarch.org
     */
    
    namespace ExternalSignatoryBook\controllers;
    
    use Attachment\models\AttachmentModel;
    use Convert\models\AdrModel;
    use Docserver\models\DocserverModel;
    use Resource\models\ResModel;
    use SrcCore\models\CoreConfigModel;
    use SrcCore\models\CurlModel;
    use SrcCore\models\DatabaseModel;
    
    class FastParapheurController
    {
        public static function retrieveSignedMails($aArgs)
        {
            foreach (['noVersion', 'resLetterbox'] as $version) {
                foreach ($aArgs['idsToRetrieve'][$version] as $resId => $value) {
                    $xmlPostString = '<?xml version="1.0" encoding="utf-8"?>
                    <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:sei="http://sei.ws.fast.cdc.com/">
                        <soapenv:Header/>
                            <soapenv:Body>
                                <sei:history>
                                    <documentId>' .  $value->external_id . '</documentId>
                                </sei:history>
                            </soapenv:Body>
                    </soapenv:Envelope>';
    
                    $curlReturn = CurlModel::execSOAP([
                        'xmlPostString' => $xmlPostString,
                        'url'           => $aArgs['config']['data']['url'],
                        'options'       => [
                            CURLOPT_SSLCERT         => $aArgs['config']['data']['certPath'],
                            CURLOPT_SSLCERTPASSWD   => $aArgs['config']['data']['certPass'],
                            CURLOPT_SSLCERTTYPE     => $aArgs['config']['data']['certType']
                        ]
                    ]);
    
                    $isError    = $curlReturn['response']->children('http://schemas.xmlsoap.org/soap/envelope/')->Body;
                    if (!empty($isError ->Fault[0])) {
                        // TODO gestion des erreurs
                        echo 'PJ n° ' . $resId . ' et document original n° ' . $value->res_id_master . ' : ' . (string)$curlReturn['response']->children('http://schemas.xmlsoap.org/soap/envelope/')->Body->Fault[0]->children()->faultstring . PHP_EOL;
                        continue;
                    }
    
                    $response = $curlReturn['response']->children('http://schemas.xmlsoap.org/soap/envelope/')->Body->children('http://sei.ws.fast.cdc.com/')->historyResponse->children();
    
                    foreach ($response->return as $res) {    // Loop on all steps of the documents (prepared, send to signature, signed etc...)
                        $state      = (string) $res->stateName;
                        if ($state == $aArgs['config']['data']['validatedState']) {
                            $response = FastParapheurController::download(['config' => $aArgs['config'], 'documentId' => $value->external_id]);
                            $aArgs['idsToRetrieve'][$version][$resId]->status = 'validated';
                            $aArgs['idsToRetrieve'][$version][$resId]->format = 'pdf';
                            $aArgs['idsToRetrieve'][$version][$resId]->encodedFile = $response['b64FileContent'];
                            break;
                        } elseif ($state == $aArgs['config']['data']['refusedState']) {
                            $res = DatabaseModel::select([
                                'select'    => ['firstname', 'lastname'],
                                'table'     => ['listinstance', 'users'],
                                'left_join' => ['listinstance.item_id = users.user_id'],
                                'where'     => ['res_id = ?', 'item_mode = ?'],
                                'data'      => [$aArgs['idsToRetrieve'][$version][$resId]->res_id_master, 'sign']
                            ])[0];
    
                            $response = FastParapheurController::getRefusalMessage(['config' => $aArgs['config'], 'documentId' => $value->external_id]);
                            $aArgs['idsToRetrieve'][$version][$resId]->status = 'refused';
                            $aArgs['idsToRetrieve'][$version][$resId]->noteContent = $res['lastname'] . ' ' . $res['firstname'] . ' : ' . $response;
                            break;
                        } else {
                            $aArgs['idsToRetrieve'][$version][$resId]->status = 'waiting';
                        }
                    }
                }
            }
            return $aArgs['idsToRetrieve'];
        }
    
        public static function upload($aArgs)
        {
            $circuitId    = $aArgs['circuitId'];
            $label        = $aArgs['label'];
            $subscriberId = $aArgs['businessId'];
    
            // Retrieve the annexes of the attachemnt to sign (other attachment and the original document)
            $annexes = [];
            $annexes['letterbox'] = ResModel::get([
                'select' => ['res_id', 'path', 'filename', 'docserver_id','format', 'category_id', 'external_id', 'integrations'],
                'where'  => ['res_id = ?'],
                'data'   => [$aArgs['resIdMaster']]
            ]);
    
            $letterboxPath = DocserverModel::getByDocserverId(['docserverId' => $annexes['letterbox'][0]['docserver_id'], 'select' => ['path_template']]);
            $annexes['letterbox'][0]['filePath'] = $letterboxPath['path_template'] . str_replace('#', DIRECTORY_SEPARATOR, $annexes['letterbox'][0]['path']) . $annexes['letterbox'][0]['filename'];
    
            $attachments = AttachmentModel::get([
                'select'    => [
                    'res_id', 'docserver_id', 'path', 'filename', 'format', 'attachment_type'
                ],
                'where'     => ["res_id_master = ?", "attachment_type not in (?)", "status not in ('DEL', 'OBS', 'FRZ', 'TMP', 'SEND_MASS')", "in_signature_book = 'true'"],
                'data'      => [$aArgs['resIdMaster'], ['converted_pdf', 'print_folder', 'signed_response']]
            ]);
    
            $attachmentTypes = AttachmentModel::getAttachmentsTypesByXML();
            foreach ($attachments as $key => $value) {
                if (!$attachmentTypes[$value['attachment_type']]['sign']) {
                    $annexeAttachmentPath = DocserverModel::getByDocserverId(['docserverId' => $value['docserver_id'], 'select' => ['path_template']]);
                    $value['filePath']    = $annexeAttachmentPath['path_template'] . str_replace('#', DIRECTORY_SEPARATOR, $value['path']) . $value['filename'];
                    unset($attachments[$key]);
                    $annexes['attachments'][] = $value;
                }
            }
            // END annexes
    
            $attachmentToFreeze = [];
            foreach ($attachments as $attachment) {
                $resId  = $attachment['res_id'];
                $collId = 'attachments_coll';
                
                $curlReturn = FastParapheurController::uploadFile([
                    'resId'        => $resId,
                    'collId'       => $collId,
                    'resIdMaster'  => $aArgs['resIdMaster'],
                    'annexes'      => $annexes,
                    'circuitId'    => $circuitId,
                    'label'        => $label,
                    'subscriberId' => $subscriberId,
                    'config'       => $aArgs['config']
                ]);
    
                if (!empty($curlReturn['error'])) {
                    return ['error' => $curlReturn['error']];
                } elseif (!empty($curlReturn['response']->children('http://schemas.xmlsoap.org/soap/envelope/')->Body->Fault[0])) {
                    $error = (string)$curlReturn['response']->children('http://schemas.xmlsoap.org/soap/envelope/')->Body->Fault[0]->children()->faultstring . PHP_EOL;
                    return ['error' => $error];
                } else {
                    $documentId = $curlReturn['response']->children('http://schemas.xmlsoap.org/soap/envelope/')->Body->children('http://sei.ws.fast.cdc.com/')->uploadResponse->children();
                    $attachmentToFreeze[$collId][$resId] = (string) $documentId;
                }
            }
    
            // Send main document if in signature book
            $mainDocumentIntegration = json_decode($annexes['letterbox'][0]['integrations'], true);
            $externalId              = json_decode($annexes['letterbox'][0]['external_id'], true);
            // $externalId              = empty($externalId) ? [] : $externalId;
            if ($mainDocumentIntegration['inSignatureBook'] && empty($externalId['signatureBookId'])) {
                $resId  = $annexes['letterbox'][0]['res_id'];
                $collId = 'letterbox_coll';
                unset($annexes['letterbox']);
    
                $curlReturn = FastParapheurController::uploadFile([
                    'resId'        => $resId,
                    'collId'       => $collId,
                    'resIdMaster'  => $aArgs['resIdMaster'],
                    'annexes'      => $annexes,
                    'circuitId'    => $circuitId,
                    'label'        => $label,
                    'subscriberId' => $subscriberId,
                    'config'       => $aArgs['config']
                ]);
    
                if (!empty($curlReturn['error'])) {
                    return ['error' => $curlReturn['error']];
                } elseif (!empty($curlReturn['response']->children('http://schemas.xmlsoap.org/soap/envelope/')->Body->Fault[0])) {
                    $error = (string)$curlReturn['response']->children('http://schemas.xmlsoap.org/soap/envelope/')->Body->Fault[0]->children()->faultstring . PHP_EOL;
                    return ['error' => $error];
                } else {
                    $documentId = $curlReturn['response']->children('http://schemas.xmlsoap.org/soap/envelope/')->Body->children('http://sei.ws.fast.cdc.com/')->uploadResponse->children();
                    $attachmentToFreeze[$collId][$resId] = (string) $documentId;
                }
            }
    
            return ['sended' => $attachmentToFreeze];
        }
    
        public static function uploadFile($aArgs)
        {
            $adrInfo = AdrModel::getConvertedDocumentById(['resId' => $aArgs['resId'], 'collId' => $aArgs['collId'], 'type' => 'PDF']);
            $attachmentPath     =  DocserverModel::getByDocserverId(['docserverId' => $adrInfo['docserver_id'], 'select' => ['path_template']]);
            $attachmentFilePath = $attachmentPath['path_template'] . str_replace('#', DIRECTORY_SEPARATOR, $adrInfo['path']) . $adrInfo['filename'];
            $attachmentFileName = 'projet_courrier_' . $aArgs['resIdMaster'] . '_' . rand(0001, 9999) . '.pdf';
    
            $zip         = new \ZipArchive();
            $tmpPath     = CoreConfigModel::getTmpPath();
            $zipFilePath = $tmpPath . DIRECTORY_SEPARATOR
                . $attachmentFileName . '.zip';  // The zip file need to have the same name as the attachment we want to sign
    
            if ($zip->open($zipFilePath, \ZipArchive::CREATE)!==true) {
                exit(_ERROR_CREATE_ZIP . "<$zipFilePath>\n");
            }
            $zip->addFile($attachmentFilePath, $attachmentFileName);
    
            if (!empty($aArgs['annexes']['letterbox'])) {
                $zip->addFile($aArgs['annexes']['letterbox'][0]['filePath'], 'document_principal.' . $aArgs['annexes']['letterbox'][0]['format']);
            }
    
            if (isset($aArgs['annexes']['attachments'])) {
                for ($j = 0; $j < count($aArgs['annexes']['attachments']); $j++) {
                    $zip->addFile(
                        $aArgs['annexes']['attachments'][$j]['filePath'],
                        'PJ_' . ($j + 1) . '.' . $aArgs['annexes']['attachments'][$j]['format']
                    );
                }
            }
    
            $zip->close();
    
            $b64Attachment = base64_encode(file_get_contents($zipFilePath));
            $fileName      = $attachmentFileName . '.zip';
    
            $xmlPostString = '<?xml version="1.0" encoding="utf-8"?>
                <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:sei="http://sei.ws.fast.cdc.com/">
                    <soapenv:Header/>
                        <soapenv:Body>
                            <sei:upload>
                                <label>' . $aArgs['label'] . '</label>
                                <comment></comment>
                                <subscriberId>' . $aArgs['subscriberId'] . '</subscriberId>
                                <circuitId>' . $aArgs['circuitId'] . '</circuitId>
                                <dataFileVO>
                                    <dataHandler>' . $b64Attachment . '</dataHandler>
                                    <filename>' . $fileName . '</filename>
                                </dataFileVO>
                            </sei:upload>
                        </soapenv:Body>
                </soapenv:Envelope>';
    
            $curlReturn = CurlModel::execSOAP([
                'xmlPostString' => $xmlPostString,
                'url'           => $aArgs['config']['data']['url'],
                'options'       => [
                    CURLOPT_SSLCERT       => $aArgs['config']['data']['certPath'],
                    CURLOPT_SSLCERTPASSWD => $aArgs['config']['data']['certPass'],
                    CURLOPT_SSLCERTTYPE   => $aArgs['config']['data']['certType']
                ]
            ]);
    
            return $curlReturn;
        }
    
        public static function download($aArgs)
        {
            $xmlPostString = '<?xml version="1.0" encoding="utf-8"?>
                <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:sei="http://sei.ws.fast.cdc.com/">
                    <soapenv:Header/>
                    <soapenv:Body>
                        <sei:download>
                            <documentId>' . $aArgs['documentId'] . '</documentId>
                        </sei:download>
                    </soapenv:Body>
                </soapenv:Envelope>';
    
            $curlReturn = CurlModel::execSOAP([
                'xmlPostString' => $xmlPostString,
                'url'           => $aArgs['config']['data']['url'],
                'options'       => [
                    CURLOPT_SSLCERT       => $aArgs['config']['data']['certPath'],
                    CURLOPT_SSLCERTPASSWD => $aArgs['config']['data']['certPass'],
                    CURLOPT_SSLCERTTYPE   => $aArgs['config']['data']['certType']
                ]
            ]);
    
            $isError = $curlReturn['response']->children('http://schemas.xmlsoap.org/soap/envelope/')->Body;
            if (!empty($isError ->Fault[0])) {
                // TODO gestion des erreurs
                echo (string)$curlReturn['response']->children('http://schemas.xmlsoap.org/soap/envelope/')->Body->Fault[0]->children()->faultstring . PHP_EOL;
                return false;
            } else {
                $response = $curlReturn['response']->children('http://schemas.xmlsoap.org/soap/envelope/')->Body->children('http://sei.ws.fast.cdc.com/')->downloadResponse->children()->return;
                $returnedDocumentId = (string) $response->documentId;
                if ($aArgs['documentId'] !== $returnedDocumentId) {
                    // TODO gestion d'une potentiel erreur
                    return false;
                } else {
                    $b64FileContent = $response->content;
                    return ['b64FileContent' => (string)$b64FileContent, 'documentId' => $returnedDocumentId];
                }
            }
        }
    
        public static function sendDatas($aArgs)
        {
            $config = $aArgs['config'];
            // We need the SIRET field and the user_id of the signatory user's primary entity
            $signatory = DatabaseModel::select([
                'select'    => ['user_id', 'business_id', 'entities.entity_label'],
                'table'     => ['listinstance', 'users_entities', 'entities'],
                'left_join' => ['item_id = user_id', 'users_entities.entity_id = entities.entity_id'],
                'where'     => ['res_id = ?', 'item_mode = ?'],
                'data'      => [$aArgs['resIdMaster'], 'sign']
            ])[0];
            $redactor = DatabaseModel::select([
                'select'    => ['short_label'],
                'table'     => ['res_view_letterbox', 'users_entities', 'entities'],
                'left_join' => ['dest_user = user_id', 'users_entities.entity_id = entities.entity_id'],
                'where'     => ['res_id = ?'],
                'data'      => [$aArgs['resIdMaster']]
            ])[0];
    
            if (empty($signatory['business_id']) || substr($signatory['business_id'], 0, 3) == 'org') {
                $signatory['business_id'] = $config['data']['subscriberId'];
            }
    
            return FastParapheurController::upload(['config' => $config, 'resIdMaster' => $aArgs['resIdMaster'], 'businessId' => $signatory['business_id'], 'circuitId' => $signatory['user_id'], 'label' => $redactor['short_label']]);
        }
    
        public static function getRefusalMessage($aArgs)
        {
            $xmlPostString = '<?xml version="1.0" encoding="utf-8"?>
            <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:sei="http://sei.ws.fast.cdc.com/">
                <soapenv:Header/>
                    <soapenv:Body>
                        <sei:getRefusalMessage>
                            <nodeRefId>' .  $aArgs['documentId'] . '</nodeRefId>
                        </sei:getRefusalMessage>
                    </soapenv:Body>
             </soapenv:Envelope>';
    
            $curlReturn = CurlModel::execSOAP([
                'xmlPostString' => $xmlPostString,
                'url'           => $aArgs['config']['data']['url'],
                'options'       => [
                    CURLOPT_SSLCERT       => $aArgs['config']['data']['certPath'],
                    CURLOPT_SSLCERTPASSWD => $aArgs['config']['data']['certPass'],
                    CURLOPT_SSLCERTTYPE   => $aArgs['config']['data']['certType']
                ]
            ]);
    
            $response = $curlReturn['response']->children('http://schemas.xmlsoap.org/soap/envelope/')->Body->children('http://sei.ws.fast.cdc.com/')->getRefusalMessageResponse->children()->return;
    
            return $response;
        }
    }