From 505e59e5a779b40bc23fee8ea6a28a36bc52eae5 Mon Sep 17 00:00:00 2001
From: "florian.azizian" <florian.azizian@maarch.org>
Date: Mon, 26 Oct 2020 12:53:46 +0100
Subject: [PATCH] FEAT #15049 TIME 2:30 getAcknowledgement from webservice

---
 bin/exportSeda/checkAllReplies.php            |  6 +-
 .../controllers/ExportSEDATrait.php           | 93 ++++++++++++++++++-
 src/core/models/CurlModel.php                 | 19 ++--
 3 files changed, 105 insertions(+), 13 deletions(-)

diff --git a/bin/exportSeda/checkAllReplies.php b/bin/exportSeda/checkAllReplies.php
index 2372ff2db70..642bc4942db 100755
--- a/bin/exportSeda/checkAllReplies.php
+++ b/bin/exportSeda/checkAllReplies.php
@@ -158,11 +158,11 @@ foreach ($pendingResources as $resId) {
         // TODO GET XML
         $pathToDocument = 'xmlFile';
 
-        foreach ($resIds as $resId) {
+        foreach ($resIds as $res) {
             $id = Resource\controllers\StoreController::storeAttachment([
                 'encodedFile'   => base64_encode(file_get_contents($pathToDocument)),
                 'type'          => 'reply_record_management',
-                'resIdMaster'   => $resId,
+                'resIdMaster'   => $res,
                 'title'         => 'Réponse au transfert',
                 'format'        => 'xml',
                 'status'        => 'TRA'
@@ -173,7 +173,7 @@ foreach ($pendingResources as $resId) {
             \Resource\models\ResModel::update([
                 'set'   => ['status' => $GLOBALS['statusReplyReceived']],
                 'where' => ['res_id = ?'],
-                'data'  => [$resId]
+                'data'  => [$res]
             ]);
             $nbMailsRetrieved++;
         }
diff --git a/src/app/external/exportSeda/controllers/ExportSEDATrait.php b/src/app/external/exportSeda/controllers/ExportSEDATrait.php
index f7ce65c450c..bf941648bd5 100644
--- a/src/app/external/exportSeda/controllers/ExportSEDATrait.php
+++ b/src/app/external/exportSeda/controllers/ExportSEDATrait.php
@@ -175,7 +175,8 @@ trait ExportSEDATrait
                 'config'          => $config,
                 'encodedFilePath' => $sedaPackage['encodedFilePath'],
                 'messageFilename' => $sedaPackage['messageFilename'],
-                'resId'           => $resource['res_id']
+                'resId'           => $resource['res_id'],
+                'reference'       => $data['messageObject']['messageIdentifier']
             ]);
             if (!empty($elementSend['errors'])) {
                 return ['errors' => [$elementSend['errors']]];
@@ -210,11 +211,16 @@ trait ExportSEDATrait
             return ['errors' => 'Error returned by the route /medona/create : ' . $curlResponse['response']['message']];
         }
 
-        // TODO GET XML
-        $pathToDocument = 'xmlFile';
+        $acknowledgement = ExportSEDATrait::getAcknowledgement([
+            'config'    => $args['config'],
+            'reference' => $args['reference']
+        ]);
+        if (!empty($acknowledgement['errors'])) {
+            return ['errors' => 'Error returned in getAcknowledgement process : ' . $acknowledgement['errors']];
+        }
 
         $id = StoreController::storeAttachment([
-            'encodedFile'   => base64_encode(file_get_contents($pathToDocument)),
+            'encodedFile'   => $acknowledgement['encodedAcknowledgement'],
             'type'          => 'acknowledgement_record_management',
             'resIdMaster'   => $args['resId'],
             'title'         => 'Accusé de réception',
@@ -460,6 +466,85 @@ trait ExportSEDATrait
         return $informationsToSend;
     }
 
+    public static function getAcknowledgement($args = [])
+    {
+        $curlResponse = CurlModel::execSimple([
+            'url'     => rtrim($args['config']['exportSeda']['urlSAEService'], '/') . '/medona/message/reference?reference='.urlencode($args['reference']."_Ack"),
+            'method'  => 'GET',
+            'cookie'  => 'LAABS-AUTH=' . urlencode($args['config']['exportSeda']['token']),
+            'headers' => [
+                'Accept: application/json',
+                'Content-Type: application/json',
+                'User-Agent: ' . $args['config']['exportSeda']['userAgent']
+            ]
+        ]);
+
+        if (!empty($curlResponse['errors'])) {
+            return ['errors' => 'Error returned by the route /medona/message/reference : ' . $curlResponse['errors']];
+        } elseif ($curlResponse['code'] != 200) {
+            return ['errors' => 'Error returned by the route /medona/message/reference : ' . $curlResponse['response']['message']];
+        }
+
+        $messageId = $curlResponse['response']['messageId'];
+
+        $curlResponse = CurlModel::execSimple([
+            'url'     => rtrim($args['config']['exportSeda']['urlSAEService'], '/') . '/medona/message/'.urlencode($curlResponse['response']['messageId']).'/Export',
+            'method'  => 'GET',
+            'cookie'  => 'LAABS-AUTH=' . urlencode($args['config']['exportSeda']['token']),
+            'headers' => [
+                'Accept: application/zip',
+                'Content-Type: application/json',
+                'User-Agent: ' . $args['config']['exportSeda']['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']];
+        }
+
+        $encodedAcknowledgement = ExportSEDATrait::getEncodedDocumentFromEncodedZip([
+            'encodedZipDocument' => base64_encode($curlResponse['response']),
+            'messageId'          => $messageId
+        ]);
+        if (!empty($encodedAcknowledgement['errors'])) {
+            return ['errors' => 'Error during getEncodedDocumentFromEncodedZip process : ' . $encodedAcknowledgement['errors']];
+        }
+
+        return ['encodedAcknowledgement' => $encodedAcknowledgement['encodedDocument']];
+    }
+
+    public static function getEncodedDocumentFromEncodedZip(array $args)
+    {
+        $tmpPath = CoreConfigModel::getTmpPath();
+
+        $zipDocumentOnTmp = $tmpPath . mt_rand() .'_' . $GLOBALS['id'] . '_acknowledgement.zip';
+        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"];
+        }
+
+        $filesOnTmp = scandir($dirOnTmp);
+        foreach ($filesOnTmp as $fileOnTmp) {
+            if ($fileOnTmp == $args['messageId']) {
+                $base64Content = base64_encode(file_get_contents("{$dirOnTmp}/{$fileOnTmp}"));
+                unlink($zipDocumentOnTmp);
+                return ['encodedDocument' => $base64Content];
+            }
+        }
+
+        return ['errors' => "getDocumentFromEncodedZip : No document was found in Zip"];
+    }
+
     public static function checkAcknowledgmentRecordManagement(array $args)
     {
         ValidatorModel::notEmpty($args, ['resId']);
diff --git a/src/core/models/CurlModel.php b/src/core/models/CurlModel.php
index a46aeb98d31..2f458e303df 100755
--- a/src/core/models/CurlModel.php
+++ b/src/core/models/CurlModel.php
@@ -256,16 +256,21 @@ class CurlModel
         $curl = curl_init();
         curl_setopt_array($curl, $opts);
         $rawResponse = curl_exec($curl);
-        $code = curl_getinfo($curl, CURLINFO_HTTP_CODE);
-        $headerSize = curl_getinfo($curl, CURLINFO_HEADER_SIZE);
-        $errors = curl_error($curl);
+        $code        = curl_getinfo($curl, CURLINFO_HTTP_CODE);
+        $headerSize  = curl_getinfo($curl, CURLINFO_HEADER_SIZE);
+        $errors      = curl_error($curl);
         curl_close($curl);
 
-        $headers = substr($rawResponse, 0, $headerSize);
-        $headers = explode("\r\n", $headers);
+        $headers  = substr($rawResponse, 0, $headerSize);
+        $headers  = explode("\r\n", $headers);
         $response = substr($rawResponse, $headerSize);
 
         if (empty($args['noLogs'])) {
+            if (in_array('Accept: application/zip', $args['headers'])) {
+                $logResponse = 'Zip file content';
+            } else {
+                $logResponse = $response;
+            }
             LogsController::add([
                 'isTech'    => true,
                 'moduleId'  => 'curl',
@@ -273,12 +278,14 @@ class CurlModel
                 'tableName' => 'curl',
                 'recordId'  => 'execSimple',
                 'eventType' => "Url : {$args['url']} HttpCode : {$code} Errors : {$errors}",
-                'eventId'   => "Response : {$response}"
+                'eventId'   => "Response : {$logResponse}"
             ]);
         }
 
         if ($args['isXml']) {
             $response = simplexml_load_string($response);
+        } elseif (in_array('Accept: application/zip', $args['headers'])) {
+            $response = trim($response);
         } else {
             $response = json_decode($response, true);
         }
-- 
GitLab