diff --git a/src/app/external/exportSeda/controllers/ExportSEDATrait.php b/src/app/external/exportSeda/controllers/ExportSEDATrait.php index c4b667fc7b9b34877d79349b3ef477e459d6dc7c..fa5a1089077d15eda9c45b0d63088ca0f3377303 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 e3ada08628d5aaf1fab85573994898b18ced1f36..25c8ce8b2e3945d7dca6c576b037009ec04a6e9a 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]);