From 510fcd5a927b84e8735bd03c455e81996dea5f8b Mon Sep 17 00:00:00 2001
From: Damien <damien.burel@maarch.org>
Date: Fri, 21 May 2021 09:49:16 +0200
Subject: [PATCH] FEAT #16982 TIME 2:30 Get proof for yousign

---
 .../history/controllers/HistoryController.php | 20 +++++++++++
 .../controllers/YousignController.php         | 34 +++++++++++++++++++
 2 files changed, 54 insertions(+)

diff --git a/src/app/history/controllers/HistoryController.php b/src/app/history/controllers/HistoryController.php
index 9b0f43622d..4f54db4c7d 100755
--- a/src/app/history/controllers/HistoryController.php
+++ b/src/app/history/controllers/HistoryController.php
@@ -38,6 +38,7 @@ use SrcCore\models\PasswordModel;
 use SrcCore\models\TextFormatModel;
 use SrcCore\models\ValidatorModel;
 use User\models\UserModel;
+use Workflow\controllers\YousignController;
 use Workflow\models\WorkflowExternalInformationModel;
 use Workflow\models\WorkflowModel;
 use Workflow\models\WorkflowTemplateModel;
@@ -524,6 +525,25 @@ class HistoryController
                         'value'        => $step['note']
                     ];
                 }
+
+                $workflowExternalInformations = WorkflowExternalInformationModel::getByWorkflowId(['select' => ['informations'], 'workflowId' => $step['id']]);
+                if (!empty($workflowExternalInformations)) {
+                    $informations = json_decode($workflowExternalInformations['informations'], true);
+                    if ($informations['type'] == 'yousign' && !empty($informations['yousignProcedureId'])) {
+                        $yousignProof = YousignController::getProofByWorkflowId(['workflowId' => $step['id']]);
+                        $archivePath = $tmpPath . 'yousignProof' . $GLOBALS['id'] . "_" . rand() . '.zip';
+                        file_put_contents($archivePath, base64_decode($yousignProof));
+                        $zipArchive = new \ZipArchive();
+                        $zipArchive->open($archivePath);
+                        $nameInArchive = $zipArchive->getNameIndex(0);
+                        $yousignPdfProof = $zipArchive->getFromIndex(0);
+                        $yousignPath = $tmpPath . 'yousignProof' . $GLOBALS['id'] . "_" . rand() . '.pdf';
+                        file_put_contents($yousignPath, $yousignPdfProof);
+                        unlink($archivePath);
+
+                        $documentPathToZip[] = ['path' => $yousignPath, 'filename' => $nameInArchive];
+                    }
+                }
             }
 
             if (!empty($notes)) {
diff --git a/src/app/workflow/controllers/YousignController.php b/src/app/workflow/controllers/YousignController.php
index 5db104a4c1..9cd61fad2e 100755
--- a/src/app/workflow/controllers/YousignController.php
+++ b/src/app/workflow/controllers/YousignController.php
@@ -281,6 +281,40 @@ class YousignController
         return true;
     }
 
+    public static function getProofByWorkflowId(array $args)
+    {
+        $workflowExternalInformations = WorkflowExternalInformationModel::getByWorkflowId(['select' => ['informations', 'external_signatory_book_id'], 'workflowId' => $args['workflowId']]);
+        if (empty($workflowExternalInformations)) {
+            return ['errors' => 'Workflow does not exist'];
+        }
+
+        $informations = json_decode($workflowExternalInformations['informations'], true);
+
+        $externalSB = ExternalSignatoryBookModel::getById(['select' => ['*'], 'id' => $workflowExternalInformations['external_signatory_book_id']]);
+        if (empty($externalSB)) {
+            return ['errors' => 'No external signatory book configuration found'];
+        } elseif ($externalSB['type'] != 'yousign') {
+            return ['errors' => 'External signatory book configuration is invalid'];
+        }
+        $externalSB['connection_data'] = json_decode($externalSB['connection_data'], true);
+
+        $trunkedProcedureId = str_replace('/procedures/', '', $informations['yousignProcedureId']);
+        if (empty($trunkedProcedureId)) {
+            return ['errors' => 'No procedure to process'];
+        }
+
+        $procedureResponse = CurlModel::exec([
+            'url'           => "{$externalSB['connection_data']['apiUri']}/procedures/{$trunkedProcedureId}/proof?format=pdf",
+            'bearerAuth'    => ['token' => $externalSB['connection_data']['apiKey']],
+            'method'        => 'GET'
+        ]);
+        if ($procedureResponse['code'] != 200) {
+            return ['errors' => json_encode($procedureResponse['response'])];
+        }
+
+        return $procedureResponse['response'];
+    }
+
     public static function deleteProcedureByWorkflowId(array $args)
     {
         $workflowExternalInformations = WorkflowExternalInformationModel::getByWorkflowId(['select' => ['informations', 'external_signatory_book_id'], 'workflowId' => $args['workflowId']]);
-- 
GitLab