From 591acc0431f5298d231780d78a03e213e1e2a2a1 Mon Sep 17 00:00:00 2001 From: Jean-Laurent DUZANT <jean-laurent.duzant@xelians.fr> Date: Mon, 7 Aug 2023 12:13:22 +0200 Subject: [PATCH] FIX #26169 TIME 2:30 check if ixbus folder and document to sign are in error and if the document was deleted in ixbus --- .../models/AttachmentModelAbstract.php | 16 +++++ .../controllers/IxbusController.php | 65 +++++++++++++++++++ src/app/resource/models/ResModelAbstract.php | 15 +++++ src/core/lang/lang-fr.php | 5 ++ 4 files changed, 101 insertions(+) diff --git a/src/app/attachment/models/AttachmentModelAbstract.php b/src/app/attachment/models/AttachmentModelAbstract.php index 927aa109a5c..968a3338677 100755 --- a/src/app/attachment/models/AttachmentModelAbstract.php +++ b/src/app/attachment/models/AttachmentModelAbstract.php @@ -202,4 +202,20 @@ abstract class AttachmentModelAbstract return true; } + + public static function removeExternalLink(array $args) + { + ValidatorModel::notEmpty($args, ['resId', 'externalId']); + ValidatorModel::intType($args, ['resId', 'externalId']); + + DatabaseModel::update([ + 'table' => 'res_attachments', + 'set' => ['status' => 'A_TRA'], + 'postSet' => ['external_id' => "external_id - 'signatureBookId'"], + 'where' => ['res_id = ?', "external_id->>'signatureBookId' = ?"], + 'data' => [$args['resId'], $args['externalId']] + ]); + + return true; + } } diff --git a/src/app/external/externalSignatoryBook/controllers/IxbusController.php b/src/app/external/externalSignatoryBook/controllers/IxbusController.php index 670c7cf9473..9d0aeaf7536 100755 --- a/src/app/external/externalSignatoryBook/controllers/IxbusController.php +++ b/src/app/external/externalSignatoryBook/controllers/IxbusController.php @@ -26,6 +26,10 @@ use SrcCore\models\TextFormatModel; use Slim\Http\Request; use Slim\Http\Response; use SrcCore\models\CoreConfigModel; +use SrcCore\models\ValidatorModel; +use SrcCore\controllers\LogsController; +use User\models\UserModel; +use History\controllers\HistoryController; /** * @codeCoverageIgnore @@ -350,6 +354,11 @@ class IxbusController foreach ($aArgs['idsToRetrieve'][$version] as $resId => $value) { $folderData = IxbusController::getDossier(['config' => $aArgs['config'], 'folderId' => $value['external_id']]); + if (empty(trim($value['external_id']))) { + $args['idsToRetrieve'][$version][$resId]['status'] = 'waiting'; + continue; + } + if (in_array($folderData['data']['etat'], ['Refusé', 'Terminé'])) { $aArgs['idsToRetrieve'][$version][$resId]['status'] = $folderData['data']['etat'] == 'Refusé' ? 'refused' : 'validated'; $signedDocument = IxbusController::getDocument(['config' => $aArgs['config'], 'documentId' => $folderData['data']['documents']['principal']['identifiant']]); @@ -358,6 +367,27 @@ class IxbusController if (!empty($folderData['data']['detailEtat'])) { $aArgs['idsToRetrieve'][$version][$resId]['notes'][] = ['content' => $folderData['data']['detailEtat']]; } + } elseif (in_array($folderData['data']['etat'], ['Erreur']) && !empty($args['idsToRetrieve'][$version][$resId])) { + $info = "[ixbus api] Folder ({$value['external_id']}) is in error state."; + + if (empty($folderData['data']['documents']['principal']['identifiant'] ?? null)) { + + IxbusController::removeDocumentLink([ + 'docItem' => $value, + 'type' => ($version == 'resLetterbox' ? 'resource' : 'attachment') + ]); + $info .= " Main document in ixbus was deleted, document link was removed."; + unset($args['idsToRetrieve'][$version][$resId]); + } + LogsController::add([ + 'isTech' => true, + 'moduleId' => $GLOBALS['moduleId'], + 'level' => 'ERROR', + 'tableName' => $GLOBALS['batchName'], + 'eventType' => 'script', + 'eventId' => $info + ]); + continue; } else { unset($aArgs['idsToRetrieve'][$version][$resId]); } @@ -394,4 +424,39 @@ class IxbusController return ['encodedDocument' => base64_encode($curlResponse['response'])]; } + + public static function removeDocumentLink(array $args) + { + ValidatorModel::notEmpty($args, ['docItem', 'type']); + ValidatorModel::arrayType($args, ['docItem']); + ValidatorModel::stringType($args, ['type']); + + $info = ''; + $userId = UserModel::get([ + 'select' => ['id'], + 'where' => ['mode = ? OR mode = ?'], + 'data' => ['root_visible', 'root_invisible'], + 'limit' => 1 + ])[0]['id']; + + // remove signatureBookId link + if ($args['type'] === 'resource') { + ResModel::removeExternalLink(['resId' => $args['docItem']['res_id'], 'externalId' => (int)$args['docItem']['external_id']]); + $info = _DOC_DOES_NOT_EXIST_IN_EXTERNAL_SIGNATORY; + } elseif ($args['type'] === 'attachment') { + AttachmentModel::removeExternalLink(['resId' => $args['docItem']['res_id'], 'externalId' => (int)$args['docItem']['external_id']]); + $info = _ATTACH_DOES_NOT_EXIST_IN_EXTERNAL_SIGNATORY[0] . " '{$args['docItem']['title']}' " . _ATTACH_DOES_NOT_EXIST_IN_EXTERNAL_SIGNATORY[1]; + } + + HistoryController::add([ + 'tableName' => 'res_letterbox', + 'recordId' => $args['docItem']['res_id_master'] ?? $args['docItem']['res_id'], + 'eventType' => 'ACTION#1', + 'eventId' => '1', + 'userId' => $userId, + 'info' => $info + ]); + + return true; + } } diff --git a/src/app/resource/models/ResModelAbstract.php b/src/app/resource/models/ResModelAbstract.php index c9b51f418f9..0eb4457a6fd 100755 --- a/src/app/resource/models/ResModelAbstract.php +++ b/src/app/resource/models/ResModelAbstract.php @@ -207,4 +207,19 @@ abstract class ResModelAbstract return ''; } + + public static function removeExternalLink(array $args) + { + ValidatorModel::notEmpty($args, ['resId', 'externalId']); + ValidatorModel::intType($args, ['resId', 'externalId']); + + DatabaseModel::update([ + 'table' => 'res_letterbox', + 'postSet' => ['external_id' => "external_id - 'signatureBookId'"], + 'where' => ['res_id = ?', "external_id->>'signatureBookId' = ?"], + 'data' => [$args['resId'], $args['externalId']] + ]); + + return true; + } } diff --git a/src/core/lang/lang-fr.php b/src/core/lang/lang-fr.php index 97f22e9adcd..25a7c6d2b0c 100755 --- a/src/core/lang/lang-fr.php +++ b/src/core/lang/lang-fr.php @@ -503,3 +503,8 @@ define('_STANDARD_', "Par défaut"); define('_REST_', "Utilisateur WebService (API)"); define('_ROOT_VISIBLE_', "Compte super administrateur visible dans les workflows (Assignable)"); define('_ROOT_INVISIBLE_', "Compte super administrateur non visible dans les workflows (Non Assignable)"); +define('_DOC_DOES_NOT_EXIST_IN_EXTERNAL_SIGNATORY', "Le document principal n'existe plus dans le parapheur externe"); +define('_ATTACH_DOES_NOT_EXIST_IN_EXTERNAL_SIGNATORY', array( + "La pièce jointe", + "n'existe plus dans le parapheur externe" +)); \ No newline at end of file -- GitLab