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