diff --git a/bin/notification/process_email_stack.php b/bin/notification/process_email_stack.php
index d280c3bc422491b52a11465264dcb2f77913bd64..ab5ff2ee964bb90971e2b2aceb354609c418cb66 100644
--- a/bin/notification/process_email_stack.php
+++ b/bin/notification/process_email_stack.php
@@ -118,7 +118,7 @@ while ($state <> 'END') {
                             'recordId'     => 'email',
                             'eventType'    => 'ERROR',
                             'eventId'      => 'sendEmail',
-                            'userId'       => $user['id'],
+                            'userId'       => $user[0]['id'],
                             'info'         => $str
                         ]);
                     }
diff --git a/modules/visa/batch/batch_tools.php b/modules/visa/batch/batch_tools.php
index 7de898d9fb6961f7e8702df70e5c8432a7c60fa0..530de0483e84e9bc87c3b85470d5bf8a0eb3dbdc 100755
--- a/modules/visa/batch/batch_tools.php
+++ b/modules/visa/batch/batch_tools.php
@@ -81,7 +81,7 @@ function Bt_history($aArgs = [])
         'recordId'     => $aArgs['record_id'],
         'eventType'    => $aArgs['event_type'],
         'eventId'      => $aArgs['event_id'],
-        'userId'       => $user['id'],
+        'userId'       => $user[0]['id'],
         'info'         => $aArgs['info']
     ]);
 }
@@ -149,7 +149,7 @@ function Bt_createNote($aArgs = [])
             $creatorId = $aArgs['creatorId'];
         } else {
             $users = \User\models\UserModel::get(['select' => ['id'], 'orderBy' => ["user_id='superadmin' desc"], 'limit' => 1]);
-            $creatorId   = $users['id'];
+            $creatorId   = $users[0]['id'];
         }
         if (!empty($aArgs['creatorName'])) {
             $creatorName = $aArgs['creatorName'] . ' (Maarch Parapheur) : ';
diff --git a/modules/visa/batch/process_mailsFromSignatoryBook.php b/modules/visa/batch/process_mailsFromSignatoryBook.php
index 700240e93e575e56e317cef0fd07fd408be0a5ce..4379646b2a50f76d9526735d82ff22296c919812 100755
--- a/modules/visa/batch/process_mailsFromSignatoryBook.php
+++ b/modules/visa/batch/process_mailsFromSignatoryBook.php
@@ -164,15 +164,15 @@ foreach ($attachments as $value) {
 // On récupère les pj signés dans le parapheur distant
 Bt_writeLog(['level' => 'INFO', 'message' => 'Retrieve signed/annotated documents from remote signatory book']);
 if ($configRemoteSignatoryBook['id'] == 'ixbus') {
-    $retrievedMails = \ExternalSignatoryBook\controllers\IxbusController::retrieveSignedMails(['config' => $configRemoteSignatoryBook, 'idsToRetrieve' => $idsToRetrieve]);
+    $retrievedMails = \ExternalSignatoryBook\controllers\IxbusController::retrieveSignedMails(['config' => $configRemoteSignatoryBook, 'idsToRetrieve' => $idsToRetrieve, 'version' => 'noVersion']);
 } elseif ($configRemoteSignatoryBook['id'] == 'iParapheur') {
-    $retrievedMails = \ExternalSignatoryBook\controllers\IParapheurController::retrieveSignedMails(['config' => $configRemoteSignatoryBook, 'idsToRetrieve' => $idsToRetrieve]);
+    $retrievedMails = \ExternalSignatoryBook\controllers\IParapheurController::retrieveSignedMails(['config' => $configRemoteSignatoryBook, 'idsToRetrieve' => $idsToRetrieve, 'version' => 'noVersion']);
 } elseif ($configRemoteSignatoryBook['id'] == 'fastParapheur') {
-    $retrievedMails = \ExternalSignatoryBook\controllers\FastParapheurController::retrieveSignedMails(['config' => $configRemoteSignatoryBook, 'idsToRetrieve' => $idsToRetrieve]);
+    $retrievedMails = \ExternalSignatoryBook\controllers\FastParapheurController::retrieveSignedMails(['config' => $configRemoteSignatoryBook, 'idsToRetrieve' => $idsToRetrieve, 'version' => 'noVersion']);
 } elseif ($configRemoteSignatoryBook['id'] == 'maarchParapheur') {
-    $retrievedMails = \ExternalSignatoryBook\controllers\MaarchParapheurController::retrieveSignedMails(['config' => $configRemoteSignatoryBook, 'idsToRetrieve' => $idsToRetrieve]);
+    $retrievedMails = \ExternalSignatoryBook\controllers\MaarchParapheurController::retrieveSignedMails(['config' => $configRemoteSignatoryBook, 'idsToRetrieve' => $idsToRetrieve, 'version' => 'noVersion']);
 } elseif ($configRemoteSignatoryBook['id'] == 'xParaph') {
-    $retrievedMails = \ExternalSignatoryBook\controllers\XParaphController::retrieveSignedMails(['config' => $configRemoteSignatoryBook, 'idsToRetrieve' => $idsToRetrieve]);
+    $retrievedMails = \ExternalSignatoryBook\controllers\XParaphController::retrieveSignedMails(['config' => $configRemoteSignatoryBook, 'idsToRetrieve' => $idsToRetrieve, 'version' => 'noVersion']);
 }
 
 Bt_writeLog(['level' => 'INFO', 'message' => 'Retrieve mails sent to remote signatory book']);
@@ -187,13 +187,13 @@ foreach ($resources as $value) {
 
 if (!empty($idsToRetrieve['resLetterbox'])) {
     if ($configRemoteSignatoryBook['id'] == 'maarchParapheur') {
-        $retrievedLetterboxMails = \ExternalSignatoryBook\controllers\MaarchParapheurController::retrieveSignedMails(['config' => $configRemoteNoteBook, 'idsToRetrieve' => $idsToRetrieve]);
+        $retrievedLetterboxMails = \ExternalSignatoryBook\controllers\MaarchParapheurController::retrieveSignedMails(['config' => $configRemoteNoteBook, 'idsToRetrieve' => $idsToRetrieve, 'version' => 'resLetterbox']);
     } elseif ($configRemoteSignatoryBook['id'] == 'fastParapheur') {
-        $retrievedLetterboxMails = \ExternalSignatoryBook\controllers\FastParapheurController::retrieveSignedMails(['config' => $configRemoteSignatoryBook, 'idsToRetrieve' => $idsToRetrieve]);
+        $retrievedLetterboxMails = \ExternalSignatoryBook\controllers\FastParapheurController::retrieveSignedMails(['config' => $configRemoteSignatoryBook, 'idsToRetrieve' => $idsToRetrieve, 'version' => 'resLetterbox']);
     } elseif ($configRemoteSignatoryBook['id'] == 'iParapheur') {
-        $retrievedLetterboxMails = \ExternalSignatoryBook\controllers\IParapheurController::retrieveSignedMails(['config' => $configRemoteSignatoryBook, 'idsToRetrieve' => $idsToRetrieve]);
+        $retrievedLetterboxMails = \ExternalSignatoryBook\controllers\IParapheurController::retrieveSignedMails(['config' => $configRemoteSignatoryBook, 'idsToRetrieve' => $idsToRetrieve, 'version' => 'resLetterbox']);
     } elseif ($configRemoteSignatoryBook['id'] == 'ixbus') {
-        $retrievedLetterboxMails = \ExternalSignatoryBook\controllers\IxbusController::retrieveSignedMails(['config' => $configRemoteSignatoryBook, 'idsToRetrieve' => $idsToRetrieve]);
+        $retrievedLetterboxMails = \ExternalSignatoryBook\controllers\IxbusController::retrieveSignedMails(['config' => $configRemoteSignatoryBook, 'idsToRetrieve' => $idsToRetrieve, 'version' => 'resLetterbox']);
     }
     $retrievedMails['resLetterbox'] = $retrievedLetterboxMails['resLetterbox'];
 }
diff --git a/src/app/external/externalSignatoryBook/controllers/FastParapheurController.php b/src/app/external/externalSignatoryBook/controllers/FastParapheurController.php
index 4ecf0336cfc3592c77647bc38c3f5272029e39a7..abf1329ad046e7fee0f029137cf0dae0eca20469 100755
--- a/src/app/external/externalSignatoryBook/controllers/FastParapheurController.php
+++ b/src/app/external/externalSignatoryBook/controllers/FastParapheurController.php
@@ -18,10 +18,12 @@ namespace ExternalSignatoryBook\controllers;
 use Attachment\models\AttachmentModel;
 use Convert\models\AdrModel;
 use Docserver\models\DocserverModel;
+use Entity\models\ListInstanceModel;
 use Resource\models\ResModel;
 use SrcCore\models\CoreConfigModel;
 use SrcCore\models\CurlModel;
 use SrcCore\models\DatabaseModel;
+use User\models\UserModel;
 
 /**
     * @codeCoverageIgnore
@@ -30,71 +32,98 @@ 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']
-                    ]
-                ]);
+        $version = $aArgs['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>';
 
-                if ($curlReturn['infos']['http_code'] == 404) {
-                    return ['error' => 'Erreur 404 : ' . $curlReturn['raw']];
-                }
+            $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]) && !empty($value['res_id_master'])) {
-                    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;
-                } elseif (!empty($isError->Fault[0])) {
-                    echo 'Document principal n° ' . $resId . ' : ' . (string)$curlReturn['response']->children('http://schemas.xmlsoap.org/soap/envelope/')->Body->Fault[0]->children()->faultstring . PHP_EOL;
-                    continue;
-                }
+            if ($curlReturn['infos']['http_code'] == 404) {
+                return ['error' => 'Erreur 404 : ' . $curlReturn['raw']];
+            }
 
-                $response = $curlReturn['response']->children('http://schemas.xmlsoap.org/soap/envelope/')->Body->children('http://sei.ws.fast.cdc.com/')->historyResponse->children();
+            $isError = $curlReturn['response']->children('http://schemas.xmlsoap.org/soap/envelope/')->Body;
+            if (!empty($isError ->Fault[0]) && !empty($value['res_id_master'])) {
+                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;
+            } elseif (!empty($isError->Fault[0])) {
+                echo 'Document principal n° ' . $resId . ' : ' . (string)$curlReturn['response']->children('http://schemas.xmlsoap.org/soap/envelope/')->Body->Fault[0]->children()->faultstring . PHP_EOL;
+                continue;
+            }
 
-                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;
+            $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'];
+                    FastParapheurController::processVisaWorkflow(['res_id_master' => $value['res_id_master'], 'res_id' => $value['res_id']]);
+                    break;
+                } elseif ($state == $aArgs['config']['data']['refusedState']) {
+                    $res = DatabaseModel::select([
+                        'select'    => ['firstname', 'lastname'],
+                        'table'     => ['listinstance', 'users'],
+                        'left_join' => ['listinstance.item_id = users.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 processVisaWorkflow($aArgs = [])
+    {
+        $resIdMaster = $aArgs['res_id_master'] ?? $aArgs['res_id'];
+
+        $attachments = AttachmentModel::get(['select' => ['count(1)'], 'where' => ['res_id_master = ?', 'status = ?'], 'data' => [$resIdMaster, 'FRZ']]);
+        if (count($attachments) < 2) {
+            $visaWorkflow = ListInstanceModel::get([
+                'select'  => ['listinstance_id', 'requested_signature'],
+                'where'   => ['res_id = ?', 'difflist_type = ?', 'process_date IS NULL'],
+                'data'    => [$resIdMaster, 'VISA_CIRCUIT'],
+                'orderBY' => ['ORDER BY listinstance_id ASC']
+            ]);
+    
+            if (!empty($visaWorkflow)) {
+                foreach ($visaWorkflow as $listInstance) {
+                    ListInstanceModel::update(['set' => ['process_date' => 'CURRENT_TIMESTAMP'], 'where' => ['listinstance_id = ?'], 'data' => [$listInstance['listinstance_id']]]);
+                    // Stop to the first signatory user
+                    if ($listInstance['requested_signature']) {
+                        ListInstanceModel::update(['set' => ['signatory' => 'true'], 'where' => ['listinstance_id = ?'], 'data' => [$listInstance['listinstance_id']]]);
                         break;
-                    } else {
-                        $aArgs['idsToRetrieve'][$version][$resId]['status'] = 'waiting';
                     }
                 }
             }
         }
-        return $aArgs['idsToRetrieve'];
     }
 
     public static function upload($aArgs)
@@ -328,7 +357,11 @@ class FastParapheurController
             $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']]);
+        if (!empty($signatory['user_id'])) {
+            $user = UserModel::getById(['id' => $signatory['user_id'], 'select' => ['user_id']]);
+        }
+
+        return FastParapheurController::upload(['config' => $config, 'resIdMaster' => $aArgs['resIdMaster'], 'businessId' => $signatory['business_id'], 'circuitId' => $user['user_id'], 'label' => $redactor['short_label']]);
     }
 
     public static function getRefusalMessage($aArgs)
diff --git a/src/app/external/externalSignatoryBook/controllers/IParapheurController.php b/src/app/external/externalSignatoryBook/controllers/IParapheurController.php
index b8ecdc2815ca63697c6338d92a7d83a79270c793..bdb3f3169d72eeeb91811939435a59ac5f3226db 100755
--- a/src/app/external/externalSignatoryBook/controllers/IParapheurController.php
+++ b/src/app/external/externalSignatoryBook/controllers/IParapheurController.php
@@ -18,9 +18,11 @@ namespace ExternalSignatoryBook\controllers;
 use Attachment\models\AttachmentModel;
 use Convert\models\AdrModel;
 use Docserver\models\DocserverModel;
+use Entity\models\ListInstanceModel;
 use Resource\models\ResModel;
 use SrcCore\models\CurlModel;
 use SrcCore\models\DatabaseModel;
+use User\models\UserModel;
 
 /**
     * @codeCoverageIgnore
@@ -59,7 +61,11 @@ class IParapheurController
             'where'     => ['res_id = ?', 'item_mode = ?'],
             'data'      => [$aArgs['resIdMaster'], 'sign']
         ])[0];
-        $sousType = IParapheurController::getSousType(['config' => $config, 'sousType' => $signatory['item_id']]);
+
+        if (!empty($signatory['item_id'])) {
+            $user = UserModel::getById(['id' => $signatory['item_id'], 'select' => ['user_id']]);
+        }
+        $sousType = IParapheurController::getSousType(['config' => $config, 'sousType' => $user['user_id']]);
         if (!empty($sousType['error'])) {
             return ['error' => $sousType['error']];
         }
@@ -268,66 +274,93 @@ class IParapheurController
 
     public static function retrieveSignedMails($aArgs)
     {
-        foreach (['noVersion', 'resLetterbox'] as $version) {
-            foreach ($aArgs['idsToRetrieve'][$version] as $resId => $value) {
-                if (!empty($value->external_id)) {
-                    $xmlPostString = '<?xml version="1.0" encoding="utf-8"?>
-                    <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns="http://www.adullact.org/spring-ws/iparapheur/1.0">
-                        <soapenv:Header/> 
-                        <soapenv:Body> 
-                            <ns:GetHistoDossierRequest>' . $value['external_id'] . '</ns:GetHistoDossierRequest> 
-                        </soapenv:Body> 
-                    </soapenv:Envelope>';
-
-                    $curlReturn = IParapheurController::returnCurl($xmlPostString, $aArgs['config']);
-
-                    if (!empty($curlReturn['error'])) {
-                        return ['error' => $curlReturn['error']];
-                    }
+        $version = $aArgs['version'];
+        foreach ($aArgs['idsToRetrieve'][$version] as $resId => $value) {
+            if (!empty($value->external_id)) {
+                $xmlPostString = '<?xml version="1.0" encoding="utf-8"?>
+                <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns="http://www.adullact.org/spring-ws/iparapheur/1.0">
+                    <soapenv:Header/> 
+                    <soapenv:Body> 
+                        <ns:GetHistoDossierRequest>' . $value['external_id'] . '</ns:GetHistoDossierRequest> 
+                    </soapenv:Body> 
+                </soapenv:Envelope>';
+
+                $curlReturn = IParapheurController::returnCurl($xmlPostString, $aArgs['config']);
 
-                    $response = $curlReturn['response']->children('http://schemas.xmlsoap.org/soap/envelope/')->Body->children('http://www.adullact.org/spring-ws/iparapheur/1.0')->GetHistoDossierResponse[0];
-
-                    if ($response->MessageRetour->codeRetour == $aArgs['config']['data']['errorCode']) {
-                        return ['error' => 'Error : [' . $response->MessageRetour->severite . ']' . $response->MessageRetour->message];
-                    } else {
-                        $noteContent = '';
-                        foreach ($response->LogDossier as $res) {    // Loop on all steps of the documents (prepared, send to signature, signed etc...)
-                            $status = $res->status;
-                            if ($status == $aArgs['config']['data']['visaState'] || $status == $aArgs['config']['data']['signState']) {
-                                $noteContent .= $res->nom . ' : ' . $res->annotation . PHP_EOL;
-
-                                $response = IParapheurController::download([
-                                    'config'     => $aArgs['config'],
-                                    'documentId' => $value['external_id']
-                                ]);
-                                if (!empty($response['error'])) {
-                                    return ['error' => $response['error']];
-                                }
-                                $aArgs['idsToRetrieve'][$version][$resId]['status'] = 'validated';
-                                $aArgs['idsToRetrieve'][$version][$resId]['format'] = 'pdf';
-                                $aArgs['idsToRetrieve'][$version][$resId]['encodedFile'] = $response['b64FileContent'];
-                                $aArgs['idsToRetrieve'][$version][$resId]['noteContent'] = $noteContent;
-                                if ($status == $aArgs['config']['data']['signState']) {
-                                    break;
-                                }
-                            } elseif ($status == $aArgs['config']['data']['refusedVisa'] || $status == $aArgs['config']['data']['refusedSign']) {
-                                $noteContent .= $res->nom . ' : ' . $res->annotation . PHP_EOL;
-                                $aArgs['idsToRetrieve'][$version][$resId]['status'] = 'refused';
-                                $aArgs['idsToRetrieve'][$version][$resId]['noteContent'] = $noteContent;
+                if (!empty($curlReturn['error'])) {
+                    return ['error' => $curlReturn['error']];
+                }
+
+                $response = $curlReturn['response']->children('http://schemas.xmlsoap.org/soap/envelope/')->Body->children('http://www.adullact.org/spring-ws/iparapheur/1.0')->GetHistoDossierResponse[0];
+
+                if ($response->MessageRetour->codeRetour == $aArgs['config']['data']['errorCode']) {
+                    return ['error' => 'Error : [' . $response->MessageRetour->severite . ']' . $response->MessageRetour->message];
+                } else {
+                    $noteContent = '';
+                    foreach ($response->LogDossier as $res) {    // Loop on all steps of the documents (prepared, send to signature, signed etc...)
+                        $status = $res->status;
+                        if ($status == $aArgs['config']['data']['visaState'] || $status == $aArgs['config']['data']['signState']) {
+                            $noteContent .= $res->nom . ' : ' . $res->annotation . PHP_EOL;
+
+                            $response = IParapheurController::download([
+                                'config'     => $aArgs['config'],
+                                'documentId' => $value['external_id']
+                            ]);
+                            if (!empty($response['error'])) {
+                                return ['error' => $response['error']];
+                            }
+                            $aArgs['idsToRetrieve'][$version][$resId]['status'] = 'validated';
+                            $aArgs['idsToRetrieve'][$version][$resId]['format'] = 'pdf';
+                            $aArgs['idsToRetrieve'][$version][$resId]['encodedFile'] = $response['b64FileContent'];
+                            $aArgs['idsToRetrieve'][$version][$resId]['noteContent'] = $noteContent;
+                            if ($status == $aArgs['config']['data']['signState']) {
+                                IParapheurController::processVisaWorkflow(['res_id_master' => $value['res_id_master'], 'res_id' => $value['res_id']]);
                                 break;
-                            } else {
-                                $aArgs['idsToRetrieve'][$version][$resId]['status'] = 'waiting';
                             }
+                        } elseif ($status == $aArgs['config']['data']['refusedVisa'] || $status == $aArgs['config']['data']['refusedSign']) {
+                            $noteContent .= $res->nom . ' : ' . $res->annotation . PHP_EOL;
+                            $aArgs['idsToRetrieve'][$version][$resId]['status'] = 'refused';
+                            $aArgs['idsToRetrieve'][$version][$resId]['noteContent'] = $noteContent;
+                            break;
+                        } else {
+                            $aArgs['idsToRetrieve'][$version][$resId]['status'] = 'waiting';
                         }
                     }
-                } else {
-                    echo 'ExternalId is empty';
                 }
+            } else {
+                echo 'ExternalId is empty';
             }
         }
+        
         return $aArgs['idsToRetrieve'];
     }
 
+    public static function processVisaWorkflow($aArgs = [])
+    {
+        $resIdMaster = $aArgs['res_id_master'] ?? $aArgs['res_id'];
+
+        $attachments = AttachmentModel::get(['select' => ['count(1)'], 'where' => ['res_id_master = ?', 'status = ?'], 'data' => [$resIdMaster, 'FRZ']]);
+        if (count($attachments) < 2) {
+            $visaWorkflow = ListInstanceModel::get([
+                'select'  => ['listinstance_id', 'requested_signature'],
+                'where'   => ['res_id = ?', 'difflist_type = ?', 'process_date IS NULL'],
+                'data'    => [$resIdMaster, 'VISA_CIRCUIT'],
+                'orderBY' => ['ORDER BY listinstance_id ASC']
+            ]);
+    
+            if (!empty($visaWorkflow)) {
+                foreach ($visaWorkflow as $listInstance) {
+                    ListInstanceModel::update(['set' => ['process_date' => 'CURRENT_TIMESTAMP'], 'where' => ['listinstance_id = ?'], 'data' => [$listInstance['listinstance_id']]]);
+                    // Stop to the first signatory user
+                    if ($listInstance['requested_signature']) {
+                        ListInstanceModel::update(['set' => ['signatory' => 'true'], 'where' => ['listinstance_id = ?'], 'data' => [$listInstance['listinstance_id']]]);
+                        break;
+                    }
+                }
+            }
+        }
+    }
+
     public static function getType($aArgs)
     {
         $xmlPostString = '<?xml version="1.0" encoding="utf-8"?>
diff --git a/src/app/external/externalSignatoryBook/controllers/IxbusController.php b/src/app/external/externalSignatoryBook/controllers/IxbusController.php
index a359bfaaeba0b9006d98f3c070471057bb65b572..0c1f2da0ef64f301f17b8d143c0757f469daa20f 100755
--- a/src/app/external/externalSignatoryBook/controllers/IxbusController.php
+++ b/src/app/external/externalSignatoryBook/controllers/IxbusController.php
@@ -336,27 +336,26 @@ class IxbusController
         if (!empty($sessionId['error'])) {
             return ['error' => $sessionId['error']];
         }
-        foreach (['noVersion', 'resLetterbox'] as $version) {
-            foreach ($aArgs['idsToRetrieve'][$version] as $resId => $value) {
-                $etatDossier = IxbusController::getEtatDossier(['config' => $aArgs['config'], 'sessionId' => $sessionId['cookie'], 'dossier_id' => $value['external_id']]);
-    
-                // Refused
-                if ((string)$etatDossier == $aArgs['config']['data']['ixbusIdEtatRefused']) {
-                    $aArgs['idsToRetrieve'][$version][$resId]['status'] = 'refused';
-                    $notes = IxbusController::getDossier(['config' => $aArgs['config'], 'sessionId' => $sessionId['cookie'], 'dossier_id' => $value['external_id']]);
-                    $aArgs['idsToRetrieve'][$version][$resId]['noteContent'] = (string)$notes->MotifRefus;
-                // Validated
-                } elseif ((string)$etatDossier == $aArgs['config']['data']['ixbusIdEtatValidated']) {
-                    $aArgs['idsToRetrieve'][$version][$resId]['status'] = 'validated';
-                    $signedDocument = IxbusController::getAnnexes(['config' => $aArgs['config'], 'sessionId' => $sessionId['cookie'], 'dossier_id' => $value['external_id']]);
-                    $aArgs['idsToRetrieve'][$version][$resId]['format'] = 'pdf'; // format du fichier récupéré
-                    $aArgs['idsToRetrieve'][$version][$resId]['encodedFile'] = (string)$signedDocument->Fichier;
-
-                    $notes = IxbusController::getAnnotations(['config' => $aArgs['config'], 'sessionId' => $sessionId['cookie'], 'dossier_id' => $value['external_id']]);
-                    $aArgs['idsToRetrieve'][$version][$resId]['noteContent'] = (string)$notes->Annotation->Texte;
-                } else {
-                    unset($aArgs['idsToRetrieve'][$version][$resId]);
-                }
+        $version = $aArgs['version'];
+        foreach ($aArgs['idsToRetrieve'][$version] as $resId => $value) {
+            $etatDossier = IxbusController::getEtatDossier(['config' => $aArgs['config'], 'sessionId' => $sessionId['cookie'], 'dossier_id' => $value['external_id']]);
+
+            // Refused
+            if ((string)$etatDossier == $aArgs['config']['data']['ixbusIdEtatRefused']) {
+                $aArgs['idsToRetrieve'][$version][$resId]['status'] = 'refused';
+                $notes = IxbusController::getDossier(['config' => $aArgs['config'], 'sessionId' => $sessionId['cookie'], 'dossier_id' => $value['external_id']]);
+                $aArgs['idsToRetrieve'][$version][$resId]['noteContent'] = (string)$notes->MotifRefus;
+            // Validated
+            } elseif ((string)$etatDossier == $aArgs['config']['data']['ixbusIdEtatValidated']) {
+                $aArgs['idsToRetrieve'][$version][$resId]['status'] = 'validated';
+                $signedDocument = IxbusController::getAnnexes(['config' => $aArgs['config'], 'sessionId' => $sessionId['cookie'], 'dossier_id' => $value['external_id']]);
+                $aArgs['idsToRetrieve'][$version][$resId]['format'] = 'pdf'; // format du fichier récupéré
+                $aArgs['idsToRetrieve'][$version][$resId]['encodedFile'] = (string)$signedDocument->Fichier;
+
+                $notes = IxbusController::getAnnotations(['config' => $aArgs['config'], 'sessionId' => $sessionId['cookie'], 'dossier_id' => $value['external_id']]);
+                $aArgs['idsToRetrieve'][$version][$resId]['noteContent'] = (string)$notes->Annotation->Texte;
+            } else {
+                unset($aArgs['idsToRetrieve'][$version][$resId]);
             }
         }
 
diff --git a/src/app/external/externalSignatoryBook/controllers/MaarchParapheurController.php b/src/app/external/externalSignatoryBook/controllers/MaarchParapheurController.php
index b7998275be3fc87ea825839b00588a653108f15f..2bb93df95bcc1d0899349767b4f8cce2e202b1cb 100755
--- a/src/app/external/externalSignatoryBook/controllers/MaarchParapheurController.php
+++ b/src/app/external/externalSignatoryBook/controllers/MaarchParapheurController.php
@@ -485,50 +485,49 @@ class MaarchParapheurController
 
     public static function retrieveSignedMails(array $aArgs)
     {
-        foreach (['noVersion', 'resLetterbox'] as $version) {
-            foreach ($aArgs['idsToRetrieve'][$version] as $resId => $value) {
-                $documentWorkflow = MaarchParapheurController::getDocumentWorkflow(['config' => $aArgs['config'], 'documentId' => $value['external_id']]);
-                $state = MaarchParapheurController::getState(['workflow' => $documentWorkflow]);
-                
-                if (in_array($state['status'], ['validated', 'refused'])) {
-                    $signedDocument = MaarchParapheurController::getDocument(['config' => $aArgs['config'], 'documentId' => $value['external_id']]);
-                    $aArgs['idsToRetrieve'][$version][$resId]['format'] = 'pdf';
-                    $aArgs['idsToRetrieve'][$version][$resId]['encodedFile'] = $signedDocument['encodedDocument'];
-                    if ($state['status'] == 'validated' && in_array($state['mode'], ['sign', 'visa'])) {
-                        $aArgs['idsToRetrieve'][$version][$resId]['status'] = 'validated';
-                    } elseif ($state['status'] == 'refused' && in_array($state['mode'], ['sign', 'visa'])) {
-                        $aArgs['idsToRetrieve'][$version][$resId]['status'] = 'refused';
-                    } elseif ($state['status'] == 'validated' && $state['mode'] == 'note') {
-                        $aArgs['idsToRetrieve'][$version][$resId]['status'] = 'validatedNote';
-                    } elseif ($state['status'] == 'refused' && $state['mode'] == 'note') {
-                        $aArgs['idsToRetrieve'][$version][$resId]['status'] = 'refusedNote';
-                    }
-                    if (!empty($state['note'])) {
-                        $aArgs['idsToRetrieve'][$version][$resId]['noteContent'] = $state['note'];
-                        $userInfos = UserModel::getByExternalId([
-                            'select'            => ['id', 'firstname', 'lastname'],
-                            'externalId'        => $state['noteCreatorId'],
-                            'externalName'      => 'maarchParapheur'
-                        ]);
-                        if (!empty($userInfos)) {
-                            $aArgs['idsToRetrieve'][$version][$resId]['noteCreatorId'] = $userInfos['id'];
-                        }
-                        $aArgs['idsToRetrieve'][$version][$resId]['noteCreatorName'] = $state['noteCreatorName'];
+        $version = $aArgs['version'];
+        foreach ($aArgs['idsToRetrieve'][$version] as $resId => $value) {
+            $documentWorkflow = MaarchParapheurController::getDocumentWorkflow(['config' => $aArgs['config'], 'documentId' => $value['external_id']]);
+            $state = MaarchParapheurController::getState(['workflow' => $documentWorkflow]);
+            
+            if (in_array($state['status'], ['validated', 'refused'])) {
+                $signedDocument = MaarchParapheurController::getDocument(['config' => $aArgs['config'], 'documentId' => $value['external_id']]);
+                $aArgs['idsToRetrieve'][$version][$resId]['format'] = 'pdf';
+                $aArgs['idsToRetrieve'][$version][$resId]['encodedFile'] = $signedDocument['encodedDocument'];
+                if ($state['status'] == 'validated' && in_array($state['mode'], ['sign', 'visa'])) {
+                    $aArgs['idsToRetrieve'][$version][$resId]['status'] = 'validated';
+                } elseif ($state['status'] == 'refused' && in_array($state['mode'], ['sign', 'visa'])) {
+                    $aArgs['idsToRetrieve'][$version][$resId]['status'] = 'refused';
+                } elseif ($state['status'] == 'validated' && $state['mode'] == 'note') {
+                    $aArgs['idsToRetrieve'][$version][$resId]['status'] = 'validatedNote';
+                } elseif ($state['status'] == 'refused' && $state['mode'] == 'note') {
+                    $aArgs['idsToRetrieve'][$version][$resId]['status'] = 'refusedNote';
+                }
+                if (!empty($state['note'])) {
+                    $aArgs['idsToRetrieve'][$version][$resId]['noteContent'] = $state['note'];
+                    $userInfos = UserModel::getByExternalId([
+                        'select'            => ['id', 'firstname', 'lastname'],
+                        'externalId'        => $state['noteCreatorId'],
+                        'externalName'      => 'maarchParapheur'
+                    ]);
+                    if (!empty($userInfos)) {
+                        $aArgs['idsToRetrieve'][$version][$resId]['noteCreatorId'] = $userInfos['id'];
                     }
-                    if (!empty($state['signatoryUserId'])) {
-                        $signatoryUser = UserModel::getByExternalId([
-                            'select'            => ['user_id'],
-                            'externalId'        => $state['signatoryUserId'],
-                            'externalName'      => 'maarchParapheur'
-                        ]);
-                        if (!empty($signatoryUser['user_id'])) {
-                            $aArgs['idsToRetrieve'][$version][$resId]['typist'] = $signatoryUser['user_id'];
-                        }
+                    $aArgs['idsToRetrieve'][$version][$resId]['noteCreatorName'] = $state['noteCreatorName'];
+                }
+                if (!empty($state['signatoryUserId'])) {
+                    $signatoryUser = UserModel::getByExternalId([
+                        'select'            => ['user_id'],
+                        'externalId'        => $state['signatoryUserId'],
+                        'externalName'      => 'maarchParapheur'
+                    ]);
+                    if (!empty($signatoryUser['user_id'])) {
+                        $aArgs['idsToRetrieve'][$version][$resId]['typist'] = $signatoryUser['user_id'];
                     }
-                    $aArgs['idsToRetrieve'][$version][$resId]['workflowInfo'] = implode(", ", $state['workflowInfo']);
-                } else {
-                    unset($aArgs['idsToRetrieve'][$version][$resId]);
                 }
+                $aArgs['idsToRetrieve'][$version][$resId]['workflowInfo'] = implode(", ", $state['workflowInfo']);
+            } else {
+                unset($aArgs['idsToRetrieve'][$version][$resId]);
             }
         }
 
diff --git a/src/app/external/externalSignatoryBook/controllers/XParaphController.php b/src/app/external/externalSignatoryBook/controllers/XParaphController.php
index 5ed0c8be5a93c900dd559490a4eb76f7053fbca8..cad6ba804eeb1f9e5897e6115817649d34e507a6 100755
--- a/src/app/external/externalSignatoryBook/controllers/XParaphController.php
+++ b/src/app/external/externalSignatoryBook/controllers/XParaphController.php
@@ -377,101 +377,100 @@ class XParaphController
     {
         $tmpPath = CoreConfigModel::getTmpPath();
 
-        foreach (['noVersion'] as $version) {
-            $depotsBySiret = [];
-            foreach ($aArgs['idsToRetrieve'][$version] as $resId => $value) {
-                $externalId = json_decode($value['xparaphdepot'], true);
-                $depotsBySiret[$externalId['siret']][$value['external_id']] = ['resId' => $resId, 'login' => $externalId['login']];
+        $version = $aArgs['version'];
+        $depotsBySiret = [];
+        foreach ($aArgs['idsToRetrieve'][$version] as $resId => $value) {
+            $externalId = json_decode($value['xparaphdepot'], true);
+            $depotsBySiret[$externalId['siret']][$value['external_id']] = ['resId' => $resId, 'login' => $externalId['login']];
+        }
+
+        foreach ($depotsBySiret as $siret => $depotids) {
+            if (isset($aArgs['config']['data']['userGeneric']->siret)) {
+                if ($aArgs['config']['data']['userGeneric']->siret == $siret) {
+                    $userGeneric = (array)$aArgs['config']['data']['userGeneric'];
+                }
+            } else {
+                foreach ($aArgs['config']['data']['userGeneric'] as $userGenericXml) {
+                    if ($userGenericXml->siret == $siret) {
+                        $userGeneric = (array)$userGenericXml;
+                        break;
+                    }
+                }
             }
 
-            foreach ($depotsBySiret as $siret => $depotids) {
-                if (isset($aArgs['config']['data']['userGeneric']->siret)) {
-                    if ($aArgs['config']['data']['userGeneric']->siret == $siret) {
-                        $userGeneric = (array)$aArgs['config']['data']['userGeneric'];
+            if (!empty($depotids)) {
+                $avancements = XParaphController::getAvancement(['config' => $aArgs['config'], 'depotsIds' => $depotids, 'userGeneric' => $userGeneric]);
+            } else {
+                unset($aArgs['idsToRetrieve'][$version]);
+                continue;
+            }
+
+            foreach ($aArgs['idsToRetrieve'][$version] as $resId => $value) {
+                $xParaphDepot = json_decode($value['xparaphdepot'], true);
+                $avancement = $avancements[$value['external_id']];
+
+                $state = XParaphController::getState(['avancement' => $avancement]);
+
+                if ($state['id'] == 'refused') {
+                    $aArgs['idsToRetrieve'][$version][$resId]['status'] = 'refused';
+                    $aArgs['idsToRetrieve'][$version][$resId]['noteContent'] = $state['note'];
+
+                    $processedFile = XParaphController::getFile(['config' => $aArgs['config'], 'depotId' => $value['external_id'], 'userGeneric' => $userGeneric, 'depotLogin' => $xParaphDepot['login']]);
+                    if (!empty($processedFile['errors'])) {
+                        unset($aArgs['idsToRetrieve'][$version][$resId]);
+                        continue;
                     }
-                } else {
-                    foreach ($aArgs['config']['data']['userGeneric'] as $userGenericXml) {
-                        if ($userGenericXml->siret == $siret) {
-                            $userGeneric = (array)$userGenericXml;
-                            break;
-                        }
+                    $file      = base64_decode($processedFile['zip']);
+                    $unzipName = 'tmp_file_' .rand(). '_xParaph_' .rand();
+                    $tmpName   = $unzipName . '.zip';
+            
+                    file_put_contents($tmpPath . $tmpName, $file);
+
+                    $zip = new \ZipArchive();
+                    $zip->open($tmpPath . $tmpName);
+                    $zip->extractTo($tmpPath . $unzipName);
+
+                    foreach (glob($tmpPath . $unzipName . '/*.xml') as $filename) {
+                        $log = base64_encode(file_get_contents($filename));
                     }
-                }
+                    unlink($tmpPath . $tmpName);
 
-                if (!empty($depotids)) {
-                    $avancements = XParaphController::getAvancement(['config' => $aArgs['config'], 'depotsIds' => $depotids, 'userGeneric' => $userGeneric]);
-                } else {
-                    unset($aArgs['idsToRetrieve'][$version]);
-                    continue;
-                }
-    
-                foreach ($aArgs['idsToRetrieve'][$version] as $resId => $value) {
-                    $xParaphDepot = json_decode($value['xparaphdepot'], true);
-                    $avancement = $avancements[$value['external_id']];
-    
-                    $state = XParaphController::getState(['avancement' => $avancement]);
-    
-                    if ($state['id'] == 'refused') {
-                        $aArgs['idsToRetrieve'][$version][$resId]['status'] = 'refused';
-                        $aArgs['idsToRetrieve'][$version][$resId]['noteContent'] = $state['note'];
-    
-                        $processedFile = XParaphController::getFile(['config' => $aArgs['config'], 'depotId' => $value['external_id'], 'userGeneric' => $userGeneric, 'depotLogin' => $xParaphDepot['login']]);
-                        if (!empty($processedFile['errors'])) {
-                            unset($aArgs['idsToRetrieve'][$version][$resId]);
-                            continue;
-                        }
-                        $file      = base64_decode($processedFile['zip']);
-                        $unzipName = 'tmp_file_' .rand(). '_xParaph_' .rand();
-                        $tmpName   = $unzipName . '.zip';
-                
-                        file_put_contents($tmpPath . $tmpName, $file);
-    
-                        $zip = new \ZipArchive();
-                        $zip->open($tmpPath . $tmpName);
-                        $zip->extractTo($tmpPath . $unzipName);
-    
-                        foreach (glob($tmpPath . $unzipName . '/*.xml') as $filename) {
-                            $log = base64_encode(file_get_contents($filename));
-                        }
-                        unlink($tmpPath . $tmpName);
-    
-                        $aArgs['idsToRetrieve'][$version][$resId]['log'] = $log;
-                    } elseif ($state['id'] == 'validateSignature' || $state['id'] == 'validateOnlyVisa') {
-                        $processedFile = XParaphController::getFile(['config' => $aArgs['config'], 'depotId' => $value['external_id'], 'userGeneric' => $userGeneric, 'depotLogin' => $xParaphDepot['login']]);
-                        if (!empty($processedFile['errors'])) {
-                            unset($aArgs['idsToRetrieve'][$version][$resId]);
-                            continue;
-                        }
-                        $aArgs['idsToRetrieve'][$version][$resId]['status'] = 'validated';
-                        $aArgs['idsToRetrieve'][$version][$resId]['format'] = 'pdf';
-    
-                        $file      = base64_decode($processedFile['zip']);
-                        $unzipName = 'tmp_file_' .rand(). '_xParaph_' .rand();
-                        $tmpName   = $unzipName . '.zip';
-                
-                        file_put_contents($tmpPath . $tmpName, $file);
-    
-                        $zip = new \ZipArchive();
-                        $zip->open($tmpPath . $tmpName);
-                        $zip->extractTo($tmpPath . $unzipName);
-    
-                        foreach (glob($tmpPath . $unzipName . '/*.pdf') as $filename) {
-                            $encodedFile = base64_encode(file_get_contents($filename));
-                        }
-                        foreach (glob($tmpPath . $unzipName . '/*.xml') as $filename) {
-                            $log = base64_encode(file_get_contents($filename));
-                        }
-                        unlink($tmpPath . $tmpName);
-    
-                        $aArgs['idsToRetrieve'][$version][$resId]['encodedFile'] = $encodedFile;
-                        $aArgs['idsToRetrieve'][$version][$resId]['noteContent'] = $state['note'];
-                        if ($state['id'] == 'validateOnlyVisa') {
-                            $aArgs['idsToRetrieve'][$version][$resId]['onlyVisa'] = true;
-                        }
-                        $aArgs['idsToRetrieve'][$version][$resId]['log'] = $log;
-                    } else {
+                    $aArgs['idsToRetrieve'][$version][$resId]['log'] = $log;
+                } elseif ($state['id'] == 'validateSignature' || $state['id'] == 'validateOnlyVisa') {
+                    $processedFile = XParaphController::getFile(['config' => $aArgs['config'], 'depotId' => $value['external_id'], 'userGeneric' => $userGeneric, 'depotLogin' => $xParaphDepot['login']]);
+                    if (!empty($processedFile['errors'])) {
                         unset($aArgs['idsToRetrieve'][$version][$resId]);
+                        continue;
+                    }
+                    $aArgs['idsToRetrieve'][$version][$resId]['status'] = 'validated';
+                    $aArgs['idsToRetrieve'][$version][$resId]['format'] = 'pdf';
+
+                    $file      = base64_decode($processedFile['zip']);
+                    $unzipName = 'tmp_file_' .rand(). '_xParaph_' .rand();
+                    $tmpName   = $unzipName . '.zip';
+            
+                    file_put_contents($tmpPath . $tmpName, $file);
+
+                    $zip = new \ZipArchive();
+                    $zip->open($tmpPath . $tmpName);
+                    $zip->extractTo($tmpPath . $unzipName);
+
+                    foreach (glob($tmpPath . $unzipName . '/*.pdf') as $filename) {
+                        $encodedFile = base64_encode(file_get_contents($filename));
+                    }
+                    foreach (glob($tmpPath . $unzipName . '/*.xml') as $filename) {
+                        $log = base64_encode(file_get_contents($filename));
                     }
+                    unlink($tmpPath . $tmpName);
+
+                    $aArgs['idsToRetrieve'][$version][$resId]['encodedFile'] = $encodedFile;
+                    $aArgs['idsToRetrieve'][$version][$resId]['noteContent'] = $state['note'];
+                    if ($state['id'] == 'validateOnlyVisa') {
+                        $aArgs['idsToRetrieve'][$version][$resId]['onlyVisa'] = true;
+                    }
+                    $aArgs['idsToRetrieve'][$version][$resId]['log'] = $log;
+                } else {
+                    unset($aArgs['idsToRetrieve'][$version][$resId]);
                 }
             }
         }
diff --git a/src/app/history/controllers/HistoryController.php b/src/app/history/controllers/HistoryController.php
index f7b39782907aa4b3ede09be0fbfc1bf765f00577..b2d748f660c21d1868e1b9ebdba79f11a8b93d4a 100755
--- a/src/app/history/controllers/HistoryController.php
+++ b/src/app/history/controllers/HistoryController.php
@@ -135,7 +135,8 @@ class HistoryController
     public static function add(array $aArgs)
     {
         ValidatorModel::notEmpty($aArgs, ['tableName', 'recordId', 'eventType', 'info', 'eventId']);
-        ValidatorModel::stringType($aArgs, ['tableName', 'eventType', 'info', 'eventId', 'moduleId', 'level', 'userId']);
+        ValidatorModel::stringType($aArgs, ['tableName', 'eventType', 'info', 'eventId', 'moduleId', 'level']);
+        ValidatorModel::intVal($aArgs, ['userId']);
 
         if (empty($aArgs['isTech'])) {
             $aArgs['isTech'] = false;