From 64f631488883108460b54ef79e682fa0f96d1e4f Mon Sep 17 00:00:00 2001
From: Quentin RIBAC <quentin.ribac@xelians.fr>
Date: Mon, 10 Oct 2022 15:30:22 +0200
Subject: [PATCH] FIX #22030 TIME 0:30 allow multisign with RGS** timestamped

---
 .../CertificateSignatureController.php        |  8 +++----
 .../DigitalSignatureController.php            |  6 +++---
 .../controllers/DocumentController.php        | 21 ++++++++++++-------
 src/app/workflow/models/WorkflowModel.php     | 17 +++++++++++++++
 4 files changed, 38 insertions(+), 14 deletions(-)

diff --git a/src/app/document/controllers/CertificateSignatureController.php b/src/app/document/controllers/CertificateSignatureController.php
index d1965716ab..6b82469702 100755
--- a/src/app/document/controllers/CertificateSignatureController.php
+++ b/src/app/document/controllers/CertificateSignatureController.php
@@ -264,10 +264,10 @@ class CertificateSignatureController
             ]);
         }
 
-        if ($args['lastStep']) {
-            if ($args['signatureMode'] == 'rgs_2stars_timestamped') {
-                DigitalSignatureController::terminate(['config' => $config, 'transactionId' => $document['digital_signature_transaction_id']]);
-            }
+        if ($args['lastUserStep'] && $args['lastWorkflowStep'] && $args['signatureMode'] == 'rgs_2stars_timestamped') {
+            DigitalSignatureController::terminate(['config' => $config, 'transactionId' => $document['digital_signature_transaction_id']]);
+        }
+        if ($args['lastUserStep'] || $args['signatureMode'] == 'rgs_2stars_timestamped') {
             $storeInfos = DocserverController::storeResourceOnDocServer([
                 'encodedFile'   => base64_encode(file_get_contents($signedDocumentPath)),
                 'format'        => 'pdf',
diff --git a/src/app/document/controllers/DigitalSignatureController.php b/src/app/document/controllers/DigitalSignatureController.php
index b240981878..5c64a46c1f 100755
--- a/src/app/document/controllers/DigitalSignatureController.php
+++ b/src/app/document/controllers/DigitalSignatureController.php
@@ -34,7 +34,7 @@ class DigitalSignatureController
 
         $nbSignatories = 0;
         foreach ($args['workflow'] as $key => $currentUserId) {
-            if (in_array($currentUserId['signature_mode'], ['eidas', 'inca_card_eidas'])) {
+            if (in_array($currentUserId['signature_mode'], ['eidas', 'inca_card_eidas', 'rgs_2stars_timestamped'])) {
                 $nbSignatories++;
             } else {
                 unset($args['workflow'][$key]);
@@ -279,8 +279,8 @@ class DigitalSignatureController
 
             $workflow = WorkflowModel::get([
                 'select' => [1],
-                'where'  => ['mode = ?', 'main_document_id = ?', 'digital_signature_id != ?', 'process_date is null'],
-                'data'   => ['sign', $args['documentId'], $args['signatureId']]
+                'where'  => ['mode = ?', 'main_document_id = ?', "(digital_signature_id in ('1', '2') or digital_signature_id != ?)", 'process_date is null', 'id != ?'],
+                'data'   => ['sign', $args['documentId'], $args['signatureId'], $args['workflowId']]
             ]);
 
             if (empty($workflow) && $args['isLastSignature']) {
diff --git a/src/app/document/controllers/DocumentController.php b/src/app/document/controllers/DocumentController.php
index 61d48e6cc6..462216f71d 100755
--- a/src/app/document/controllers/DocumentController.php
+++ b/src/app/document/controllers/DocumentController.php
@@ -992,9 +992,9 @@ class DocumentController
         }
 
         if (DocumentController::ACTIONS[$args['actionId']] == 'VAL' && in_array($workflow['signature_mode'], ['rgs_2stars', 'rgs_2stars_timestamped', 'inca_card', 'inca_card_eidas'])) {
-            $lastStep = false;
+            $lastUserStep = false;
             if (empty($body['signatures']) || count($body['signatures']) == 1) {
-                $lastStep = true;
+                $lastUserStep = true;
             }
             $return = CertificateSignatureController::signDocument([
                 'id'                        => $args['id'],
@@ -1004,14 +1004,15 @@ class DocumentController
                 'hashSignature'             => $body['hashSignature'],
                 'signatureMode'             => $workflow['signature_mode'],
                 'tmpUniqueId'               => $body['tmpUniqueId'] ?? null,
-                'lastStep'                  => $lastStep
+                'lastUserStep'              => $lastUserStep,
+                'lastWorkflowStep'          => WorkflowModel::isLastStep(['id' => $workflow['id']])
             ]);
             if (!empty($return['errors'])) {
                 return $response->withStatus(400)->withJson($return);
             }
-            if (!$lastStep) {
+            if (!$lastUserStep) {
                 return $response->withStatus(206)->withJson(['tmpUniqueId' => $body['tmpUniqueId']]);
-            } elseif ($lastStep && !empty($body['signatures'])) {
+            } elseif (!empty($body['signatures'])) {
                 $storeInfos = DocserverController::storeResourceOnDocServer([
                     'encodedFile'     => base64_encode(file_get_contents("{$tmpPath}tmpSignatureDoc_{$GLOBALS['id']}_{$body['tmpUniqueId']}.pdf")),
                     'format'          => 'pdf',
@@ -1099,7 +1100,8 @@ class DocumentController
                                         'filePath'      => $imageTmpPath,
                                         'signWidth'     => $signWidth
                                     ],
-                                    'isLastSignature' => !isset($body['signatures'][$key + 1])
+                                    'isLastSignature' => !isset($body['signatures'][$key + 1]),
+                                    'workflowId'      => $workflow['id']
                                 ]);
                                 if (!empty($return['errors'])) {
                                     return $response->withStatus(400)->withJson($return);
@@ -1110,7 +1112,12 @@ class DocumentController
                     }
                 }
                 if (!$imageSignature) {
-                    $return = DigitalSignatureController::signHashes(['signatureId' => $workflow['digital_signature_id'], 'documentId' => $args['id'], 'isLastSignature' => true]);
+                    $return = DigitalSignatureController::signHashes([
+                        'signatureId'     => $workflow['digital_signature_id'],
+                        'documentId'      => $args['id'],
+                        'isLastSignature' => true,
+                        'workflowId'      => $workflow['id']
+                    ]);
                     if (!empty($return['errors'])) {
                         return $response->withStatus(400)->withJson($return);
                     }
diff --git a/src/app/workflow/models/WorkflowModel.php b/src/app/workflow/models/WorkflowModel.php
index dbea2341ca..88d0ffee47 100755
--- a/src/app/workflow/models/WorkflowModel.php
+++ b/src/app/workflow/models/WorkflowModel.php
@@ -102,6 +102,23 @@ class WorkflowModel
         return $currentStep[0];
     }
 
+    public static function isLastStep(array $args)
+    {
+        ValidatorModel::notEmpty($args, ['id']);
+        ValidatorModel::intVal($args, ['id']);
+
+        $return = DatabaseModel::select([
+            'select'    => [1],
+            'table'     => ['workflows ws1', 'workflows ws2'],
+            'left_join' => ['ws1.main_document_id = ws2.main_document_id'],
+            'where'     => ['ws1.id = ?', 'ws2.order > ws1.order'],
+            'data'      => [$args['id']],
+            'limit'     => 1
+        ]);
+
+        return empty($return);
+    }
+
     public static function getWorkflowWithExternalInfo(array $aArgs)
     {
         ValidatorModel::arrayType($aArgs, ['select', 'orderBy', 'where', 'data']);
-- 
GitLab