diff --git a/src/app/attachment/models/AttachmentModelAbstract.php b/src/app/attachment/models/AttachmentModelAbstract.php index 927aa109a5c639a5845909add7a10c833d22b0fe..968a33386776e6902a49c9ec5be5216dd0901229 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 670c7cf94735c439d2cf55ea3acabb284ec146d7..9d0aeaf75360484dc6a7db413f6a7a70d91bc969 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 c9b51f418f9a0cb1b9b26b0bc19c58f7313f0135..0eb4457a6fdb2956e885efcc3f075113d23e660c 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 97f22e9adcd193a43aa9e989a93a8f3b33ac1fbb..25a7c6d2b0cabe377030df7b58e2836e734d6ea1 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