From c952f9cf1b3a61fc173d9d854d3898fc4c964ee9 Mon Sep 17 00:00:00 2001
From: "florian.azizian" <florian.azizian@maarch.org>
Date: Mon, 26 Oct 2020 22:25:22 +0100
Subject: [PATCH] FEAT #15049 TIME 1:30 getReply from webservice

---
 bin/exportSeda/batch_tools.php                | 33 +++++++++-
 bin/exportSeda/checkAllReplies.php            | 62 +++++++++----------
 .../controllers/ExportSEDATrait.php           | 43 ++++++-------
 .../models/MessageExchangeModelAbstract.php   |  2 +-
 4 files changed, 82 insertions(+), 58 deletions(-)

diff --git a/bin/exportSeda/batch_tools.php b/bin/exportSeda/batch_tools.php
index d8be0d3124d..b0af7b61297 100644
--- a/bin/exportSeda/batch_tools.php
+++ b/bin/exportSeda/batch_tools.php
@@ -160,7 +160,38 @@ function Bt_getReply($args = [])
         return ['errors' => 'Error returned by the route /organization/organization/Search : ' . $curlResponse['response']['message']];
     }
 
-    return ['response' => $curlResponse['response']];
+    if ($curlResponse['response']['status'] != "processed") {
+        return [];
+    }
+
+    $messageId = $curlResponse['response']['replyMessage']['messageId'];
+
+    $curlResponse = \SrcCore\models\CurlModel::execSimple([
+        'url'     => rtrim($GLOBALS['urlSAEService'], '/') . '/medona/message/'.urlencode($messageId).'/Export',
+        'method'  => 'GET',
+        'cookie'  => 'LAABS-AUTH=' . urlencode($GLOBALS['token']),
+        'headers' => [
+            'Accept: application/zip',
+            'Content-Type: application/json',
+            'User-Agent: ' . $GLOBALS['userAgent']
+        ]
+    ]);
+
+    if (!empty($curlResponse['errors'])) {
+        return ['errors' => 'Error returned by the route /medona/message/{messageId}/Export : ' . $curlResponse['errors']];
+    } elseif ($curlResponse['code'] != 200) {
+        return ['errors' => 'Error returned by the route /medona/message/{messageId}/Export : ' . $curlResponse['response']['message']];
+    }
+
+    $encodedReply = \ExportSeda\controllers\ExportSEDATrait::getXmlFromZipMessage([
+        'encodedZipDocument' => base64_encode($curlResponse['response']),
+        'messageId'          => $messageId
+    ]);
+    if (!empty($encodedReply['errors'])) {
+        return ['errors' => 'Error during getXmlFromZipMessage process : ' . $encodedReply['errors']];
+    }
+
+    return ['encodedReply' => $encodedReply['encodedDocument']];
 }
 
 function Bt_purgeAll($args = [])
diff --git a/bin/exportSeda/checkAllReplies.php b/bin/exportSeda/checkAllReplies.php
index 642bc4942db..6b655be2696 100755
--- a/bin/exportSeda/checkAllReplies.php
+++ b/bin/exportSeda/checkAllReplies.php
@@ -141,42 +141,38 @@ foreach ($pendingResources as $resId) {
     } else {
         $unitIdentifiers[$message['reference']] = $unitIdentifier[0]['res_id'];
     }
+}
 
-    foreach ($unitIdentifiers as $reference => $value) {
-        $messages = Bt_getReply(['reference' => $reference]);
-        if (!empty($messages['errors'])) {
-            Bt_writeLog(['level' => 'ERROR', 'message' => $messages['errors']]);
-        }
-
-        if (!isset($messages['response']['replyMessage'])) {
-            continue;
-        }
+foreach ($unitIdentifiers as $reference => $value) {
+    $messages = Bt_getReply(['reference' => $reference]);
+    if (!empty($messages['errors'])) {
+        Bt_writeLog(['level' => 'ERROR', 'message' => $messages['errors']]);
+        continue;
+    } elseif (empty($messages['encodedReply'])) {
+        Bt_writeLog(['level' => 'INFO', 'message' => 'Le bordereau avec la référence ' . $reference . ' est toujours en cours de traitement dans le SAE Maarch RM.']);
+        continue;
+    }
 
-        $resIds = explode(',', $value);
-        $data   = json_decode($messages->replyMessage->data);
-
-        // TODO GET XML
-        $pathToDocument = 'xmlFile';
-
-        foreach ($resIds as $res) {
-            $id = Resource\controllers\StoreController::storeAttachment([
-                'encodedFile'   => base64_encode(file_get_contents($pathToDocument)),
-                'type'          => 'reply_record_management',
-                'resIdMaster'   => $res,
-                'title'         => 'Réponse au transfert',
-                'format'        => 'xml',
-                'status'        => 'TRA'
-            ]);
-            if (empty($id) || !empty($id['errors'])) {
-                return ['errors' => ['[storeAttachment] ' . $id['errors']]];
-            }
-            \Resource\models\ResModel::update([
-                'set'   => ['status' => $GLOBALS['statusReplyReceived']],
-                'where' => ['res_id = ?'],
-                'data'  => [$res]
-            ]);
-            $nbMailsRetrieved++;
+    $resIds = explode(',', $value);
+
+    foreach ($resIds as $resId) {
+        $id = Resource\controllers\StoreController::storeAttachment([
+            'encodedFile'   => $messages['encodedReply'],
+            'type'          => 'reply_record_management',
+            'resIdMaster'   => $resId,
+            'title'         => 'Réponse au transfert',
+            'format'        => 'xml',
+            'status'        => 'TRA'
+        ]);
+        if (empty($id) || !empty($id['errors'])) {
+            return ['errors' => ['[storeAttachment] ' . $id['errors']]];
         }
+        \Resource\models\ResModel::update([
+            'set'   => ['status' => $GLOBALS['statusReplyReceived']],
+            'where' => ['res_id = ?'],
+            'data'  => [$resId]
+        ]);
+        $nbMailsRetrieved++;
     }
 }
 
diff --git a/src/app/external/exportSeda/controllers/ExportSEDATrait.php b/src/app/external/exportSeda/controllers/ExportSEDATrait.php
index bf941648bd5..2c9569d1e84 100644
--- a/src/app/external/exportSeda/controllers/ExportSEDATrait.php
+++ b/src/app/external/exportSeda/controllers/ExportSEDATrait.php
@@ -167,6 +167,11 @@ trait ExportSEDATrait
         }
 
         $messageSaved = ExportSEDATrait::saveMessage(['messageObject' => $sedaPackage['messageObject']]);
+        MessageExchangeModel::insertUnitIdentifier([
+            'messageId' => $messageSaved['messageId'],
+            'tableName' => 'res_letterbox',
+            'resId'     => $resource['res_id']
+        ]);
         if ($args['data']['actionMode'] == 'download') {
             return ['data' => ['encodedFile' => base64_encode(file_get_contents($sedaPackage['encodedFilePath']))]];
         } else {
@@ -488,7 +493,7 @@ trait ExportSEDATrait
         $messageId = $curlResponse['response']['messageId'];
 
         $curlResponse = CurlModel::execSimple([
-            'url'     => rtrim($args['config']['exportSeda']['urlSAEService'], '/') . '/medona/message/'.urlencode($curlResponse['response']['messageId']).'/Export',
+            'url'     => rtrim($args['config']['exportSeda']['urlSAEService'], '/') . '/medona/message/'.urlencode($messageId).'/Export',
             'method'  => 'GET',
             'cookie'  => 'LAABS-AUTH=' . urlencode($args['config']['exportSeda']['token']),
             'headers' => [
@@ -504,45 +509,37 @@ trait ExportSEDATrait
             return ['errors' => 'Error returned by the route /medona/message/{messageId}/Export : ' . $curlResponse['response']['message']];
         }
 
-        $encodedAcknowledgement = ExportSEDATrait::getEncodedDocumentFromEncodedZip([
+        $encodedAcknowledgement = ExportSEDATrait::getXmlFromZipMessage([
             'encodedZipDocument' => base64_encode($curlResponse['response']),
             'messageId'          => $messageId
         ]);
         if (!empty($encodedAcknowledgement['errors'])) {
-            return ['errors' => 'Error during getEncodedDocumentFromEncodedZip process : ' . $encodedAcknowledgement['errors']];
+            return ['errors' => 'Error during getXmlFromZipMessage process : ' . $encodedAcknowledgement['errors']];
         }
 
         return ['encodedAcknowledgement' => $encodedAcknowledgement['encodedDocument']];
     }
 
-    public static function getEncodedDocumentFromEncodedZip(array $args)
+    public function getXmlFromZipMessage(array $args)
     {
         $tmpPath = CoreConfigModel::getTmpPath();
 
-        $zipDocumentOnTmp = $tmpPath . mt_rand() .'_' . $GLOBALS['id'] . '_acknowledgement.zip';
+        $zipDocumentOnTmp = $tmpPath . mt_rand() .'_' . $GLOBALS['id'] . '_acknowledgement.7z';
         file_put_contents($zipDocumentOnTmp, base64_decode($args['encodedZipDocument']));
 
-        $zipArchive = new \ZipArchive();
-        $open = $zipArchive->open($zipDocumentOnTmp);
-        if ($open != true) {
-            return ['errors' => "getDocumentFromEncodedZip : $open"];
-        }
-
-        $dirOnTmp = $tmpPath . mt_rand() . '_acknowledgement';
-        if (!@$zipArchive->extractTo($dirOnTmp)) {
-            return ['errors' => "getDocumentFromEncodedZip : Extract failed"];
-        }
+        $path = $tmpPath. mt_rand() .'_' . $GLOBALS['id'];
+        shell_exec("7z x $zipDocumentOnTmp -o$path");
 
-        $filesOnTmp = scandir($dirOnTmp);
-        foreach ($filesOnTmp as $fileOnTmp) {
-            if ($fileOnTmp == $args['messageId']) {
-                $base64Content = base64_encode(file_get_contents("{$dirOnTmp}/{$fileOnTmp}"));
-                unlink($zipDocumentOnTmp);
-                return ['encodedDocument' => $base64Content];
-            }
+        $fullFilePath = $path."/".$args['messageId'].".xml";
+        if (!file_exists($fullFilePath)) {
+            return ['errors' => "getDocumentFromEncodedZip : No document was found in Zip"];
         }
+        
+        $content = file_get_contents($fullFilePath);
+        unlink($zipDocumentOnTmp);
+        unlink($fullFilePath);
 
-        return ['errors' => "getDocumentFromEncodedZip : No document was found in Zip"];
+        return ['encodedDocument' => base64_encode($content)];
     }
 
     public static function checkAcknowledgmentRecordManagement(array $args)
diff --git a/src/app/external/messageExchange/models/MessageExchangeModelAbstract.php b/src/app/external/messageExchange/models/MessageExchangeModelAbstract.php
index e1a1b2ea9be..9ed82b22ab7 100755
--- a/src/app/external/messageExchange/models/MessageExchangeModelAbstract.php
+++ b/src/app/external/messageExchange/models/MessageExchangeModelAbstract.php
@@ -305,7 +305,7 @@ abstract class MessageExchangeModelAbstract
 
     public static function insertUnitIdentifier(array $args)
     {
-        ValidatorModel::notEmpty($args, ['messageId', 'tableName', 'resId', 'disposition']);
+        ValidatorModel::notEmpty($args, ['messageId', 'tableName', 'resId']);
         ValidatorModel::stringType($args, ['messageId', 'tableName', 'disposition']);
         ValidatorModel::intVal($args, ['resId']);
 
-- 
GitLab