From 571cc8961f45533dcb8c3f8ca427e50cb33f5a46 Mon Sep 17 00:00:00 2001
From: "florian.azizian" <florian.azizian@maarch.org>
Date: Tue, 13 Oct 2020 15:24:19 +0200
Subject: [PATCH] FEAT #15052 TIME 1 action check reply and check
 acknowledgement (Record management)

---
 .../controllers/ExportSEDATrait.php           | 101 ++++++++++++++++++
 .../controllers/PreProcessActionSEDATrait.php |   8 +-
 2 files changed, 105 insertions(+), 4 deletions(-)

diff --git a/src/app/external/exportSeda/controllers/ExportSEDATrait.php b/src/app/external/exportSeda/controllers/ExportSEDATrait.php
index c4b667fc7b9..fa5a1089077 100644
--- a/src/app/external/exportSeda/controllers/ExportSEDATrait.php
+++ b/src/app/external/exportSeda/controllers/ExportSEDATrait.php
@@ -12,6 +12,11 @@
 
 namespace ExportSeda\controllers;
 
+use Attachment\models\AttachmentModel;
+use Docserver\models\DocserverModel;
+use Docserver\models\DocserverTypeModel;
+use MessageExchange\models\MessageExchangeModel;
+use Resource\controllers\StoreController;
 use SrcCore\models\ValidatorModel;
 
 trait ExportSEDATrait
@@ -40,4 +45,100 @@ trait ExportSEDATrait
         
         return ['encodedFile' => $encodedFile];
     }
+
+    public static function checkAcknowledgmentRecordManagement(array $args)
+    {
+        ValidatorModel::notEmpty($args, ['resId']);
+        ValidatorModel::intVal($args, ['resId']);
+
+        $acknowledgement = AttachmentModel::get([
+            'select' => ['res_id_master', 'path', 'filename', 'docserver_id', 'fingerprint'],
+            'where'  => ['res_id_master = ?', 'attachment_type = ?', 'status = ?'],
+            'data'   => [$args['resId'], 'acknowledgement_record_management', 'TRA']
+        ])[0];
+        if (empty($acknowledgement)) {
+            return ['errors' => ['No acknowledgement found']];
+        }
+
+        $docserver = DocserverModel::getByDocserverId(['docserverId' => $acknowledgement['docserver_id'], 'select' => ['path_template', 'docserver_type_id']]);
+        if (empty($docserver['path_template']) || !file_exists($docserver['path_template'])) {
+            return ['errors' => ['Docserver does not exists']];
+        }
+
+        $pathToDocument = $docserver['path_template'] . str_replace('#', DIRECTORY_SEPARATOR, $acknowledgement['path']) . $acknowledgement['filename'];
+        if (!file_exists($pathToDocument)) {
+            return ['errors' => ['File does not exists']];
+        }
+
+        $docserverType = DocserverTypeModel::getById(['id' => $docserver['docserver_type_id'], 'select' => ['fingerprint_mode']]);
+        $fingerprint = StoreController::getFingerPrint(['filePath' => $pathToDocument, 'mode' => $docserverType['fingerprint_mode']]);
+        if (!empty($acknowledgement['fingerprint']) && $acknowledgement['fingerprint'] != $fingerprint) {
+            return ['errors' => ['Fingerprint does not match']];
+        }
+        
+        $acknowledgementXml = @simplexml_load_file($pathToDocument);
+        if (empty($acknowledgementXml)) {
+            return ['errors' => ['Acknowledgement is not readable']];
+        }
+
+        $messageExchange = MessageExchangeModel::getMessageByReference(['select' => ['message_id'], 'reference' => (string)$acknowledgementXml->MessageReceivedIdentifier]);
+        if (empty($messageExchange)) {
+            return ['errors' => ['No acknowledgement found with this reference']];
+        }
+
+        $unitIdentifier = MessageExchangeModel::getUnitIdentifierByResId(['select' => ['message_id'], 'resId' => $args['resId']]);
+        if ($unitIdentifier['message_id'] != $messageExchange['message_id']) {
+            return ['errors' => ['Wrong acknowledgement']];
+        }
+
+        return true;
+    }
+
+    public static function checkReplyRecordManagement(array $args)
+    {
+        ValidatorModel::notEmpty($args, ['resId']);
+        ValidatorModel::intVal($args, ['resId']);
+
+        $reply = AttachmentModel::get([
+            'select' => ['res_id_master', 'path', 'filename', 'docserver_id', 'fingerprint'],
+            'where'  => ['res_id_master = ?', 'attachment_type = ?', 'status = ?'],
+            'data'   => [$args['resId'], 'reply_record_management', 'TRA']
+        ])[0];
+        if (empty($reply)) {
+            return ['errors' => ['No reply found']];
+        }
+
+        $docserver = DocserverModel::getByDocserverId(['docserverId' => $reply['docserver_id'], 'select' => ['path_template', 'docserver_type_id']]);
+        if (empty($docserver['path_template']) || !file_exists($docserver['path_template'])) {
+            return ['errors' => ['Docserver does not exists']];
+        }
+
+        $pathToDocument = $docserver['path_template'] . str_replace('#', DIRECTORY_SEPARATOR, $reply['path']) . $reply['filename'];
+        if (!file_exists($pathToDocument)) {
+            return ['errors' => ['File does not exists']];
+        }
+
+        $docserverType = DocserverTypeModel::getById(['id' => $docserver['docserver_type_id'], 'select' => ['fingerprint_mode']]);
+        $fingerprint = StoreController::getFingerPrint(['filePath' => $pathToDocument, 'mode' => $docserverType['fingerprint_mode']]);
+        if (!empty($reply['fingerprint']) && $reply['fingerprint'] != $fingerprint) {
+            return ['errors' => ['Fingerprint does not match']];
+        }
+        
+        $replyXml = @simplexml_load_file($pathToDocument);
+        if (empty($replyXml)) {
+            return ['errors' => ['Reply is not readable']];
+        }
+
+        $messageExchange = MessageExchangeModel::getMessageByReference(['select' => ['message_id'], 'reference' => (string)$replyXml->MessageReceivedIdentifier]);
+        if (empty($messageExchange)) {
+            return ['errors' => ['No reply found with this reference']];
+        }
+
+        $unitIdentifier = MessageExchangeModel::getUnitIdentifierByResId(['select' => ['message_id'], 'resId' => $args['resId']]);
+        if ($unitIdentifier['message_id'] != $messageExchange['message_id']) {
+            return ['errors' => ['Wrong reply']];
+        }
+
+        return true;
+    }
 }
diff --git a/src/app/external/exportSeda/controllers/PreProcessActionSEDATrait.php b/src/app/external/exportSeda/controllers/PreProcessActionSEDATrait.php
index e3ada08628d..25c8ce8b2e3 100644
--- a/src/app/external/exportSeda/controllers/PreProcessActionSEDATrait.php
+++ b/src/app/external/exportSeda/controllers/PreProcessActionSEDATrait.php
@@ -89,7 +89,7 @@ trait PreProcessActionSEDATrait
                 continue;
             }
             
-            $acknowledgementXml = simplexml_load_file($pathToDocument);
+            $acknowledgementXml = @simplexml_load_file($pathToDocument);
             if (empty($acknowledgementXml)) {
                 $resourcesInformations['errors'][] = ['alt_identifier' => $altIdentifiers[$resId], 'res_id' => $resId, 'reason' => 'recordManagement_acknowledgementNotReadable'];
                 continue;
@@ -107,7 +107,7 @@ trait PreProcessActionSEDATrait
                 continue;
             }
 
-            $resourcesInformation['success'][] = ['alt_identifier' => $altIdentifiers[$resId], 'res_id' => $resId];
+            $resourcesInformations['success'][] = $resId;
         }
 
         return $response->withJson(['resourcesInformations' => $resourcesInformations]);
@@ -175,7 +175,7 @@ trait PreProcessActionSEDATrait
                 continue;
             }
             
-            $replyXml = simplexml_load_file($pathToDocument);
+            $replyXml = @simplexml_load_file($pathToDocument);
             if (empty($replyXml)) {
                 $resourcesInformations['errors'][] = ['alt_identifier' => $altIdentifiers[$resId], 'res_id' => $resId, 'reason' => 'recordManagement_replyNotReadable'];
                 continue;
@@ -193,7 +193,7 @@ trait PreProcessActionSEDATrait
                 continue;
             }
 
-            $resourcesInformation['success'][] = ['alt_identifier' => $altIdentifiers[$resId]['alt_identifier'], 'res_id' => $resId];
+            $resourcesInformations['success'][] = $resId;
         }
 
         return $response->withJson(['resourcesInformations' => $resourcesInformations]);
-- 
GitLab