From 3fc6341bc7aa24a254664143af327237a573ecdb Mon Sep 17 00:00:00 2001
From: "florian.azizian" <florian.azizian@maarch.org>
Date: Thu, 23 May 2019 17:08:39 +0100
Subject: [PATCH] FEAT #10619 TIME 3 send visa workflow to Maarch Parapheur

---
 .../class/class_modules_tools_Abstract.php    | 39 +++----------------
 .../visa/xml/remoteSignatoryBooks.xml.default |  4 --
 .../PreProcessActionController.php            | 19 +++++++++
 .../controllers/MaarchParapheurController.php | 33 +++++++++++-----
 .../maarch-paraph.component.html              | 19 ++++++++-
 .../maarch-paraph/maarch-paraph.component.ts  |  9 +++--
 src/frontend/lang/lang-en.ts                  |  2 +
 src/frontend/lang/lang-fr.ts                  |  2 +
 src/frontend/lang/lang-nl.ts                  |  2 +
 9 files changed, 76 insertions(+), 53 deletions(-)

diff --git a/modules/visa/class/class_modules_tools_Abstract.php b/modules/visa/class/class_modules_tools_Abstract.php
index 7dfa9f5e840..6753af135bd 100755
--- a/modules/visa/class/class_modules_tools_Abstract.php
+++ b/modules/visa/class/class_modules_tools_Abstract.php
@@ -286,33 +286,6 @@ abstract class visa_Abstract extends Database
             return false;
         }
 
-        /*$resFirstFiles = [];
-
-        while ($res = $stmt->fetchObject()) {
-            if (($res->format == 'doc' || $res->format == 'docx' || $res->format == 'odt') && !in_array($res->attachment_type, ['simple_attachment', 'simple_attachment_rp'])) {
-                array_push($resFirstFiles, $res);
-            }
-        }
-
-        $stmt = $db->query("SELECT * FROM res_attachments WHERE res_id_master = ? AND coll_id = ? AND attachment_type IN ('converted_pdf') AND status NOT IN ('DEL','OBS','TMP')", array($res_id, $coll_id));
-
-        $resSecondFiles = [];
-
-        while ($res = $stmt->fetchObject()) {
-            array_push($resSecondFiles, $res->filename);
-        }
-        foreach ($resFirstFiles as $tmpObj) {
-            if ($this->hasSameFileInArray($tmpObj->filename, $resSecondFiles)) {
-                continue;
-            }
-            if (!$this->errorMessageVisa) {
-                $this->errorMessageVisa .= _PLEASE_CONVERT_PDF_VISA;
-            }
-            $this->errorMessageVisa .= '<br/>&nbsp;&nbsp;';
-            $this->errorMessageVisa .= $_SESSION['attachment_types'][$tmpObj->attachment_type].' : ';
-            $this->errorMessageVisa .= $tmpObj->title;
-        }*/
-
         return true;
     }
 
@@ -659,14 +632,12 @@ abstract class visa_Abstract extends Database
             foreach ($tab_userentities as $key => $value) {
                 $str .= '<optgroup label="'.$tab_userentities[$key]['entity_id'].'">';
                 foreach ($tab_users as $user) {
-                    if ($user['enabled'] == 'Y') {
-                        if ($tab_userentities[$key]['entity_id'] == $user['entity_id']) {
-                            $selected = ' ';
-                            if ($user['id'] == $step['user_id']) {
-                                $selected = ' selected';
-                            }
-                            $str .= '<option value="'.$user['id'].'" '.$selected.'>'.$user['lastname'].' '.$user['firstname'].'</option>';
+                    if ($tab_userentities[$key]['entity_id'] == $user['entity_id']) {
+                        $selected = ' ';
+                        if ($user['id'] == $step['user_id']) {
+                            $selected = ' selected';
                         }
+                        $str .= '<option value="'.$user['id'].'" '.$selected.'>'.$user['lastname'].' '.$user['firstname'].'</option>';
                     }
                 }
                 $str .= '</optgroup>';
diff --git a/modules/visa/xml/remoteSignatoryBooks.xml.default b/modules/visa/xml/remoteSignatoryBooks.xml.default
index d0d5f14b13d..00a97aa0371 100644
--- a/modules/visa/xml/remoteSignatoryBooks.xml.default
+++ b/modules/visa/xml/remoteSignatoryBooks.xml.default
@@ -6,10 +6,6 @@
         <userId>ccornillac@maarch.com</userId>
         <password>maarch</password>
         <url>http://preview.maarchparapheur.com</url>
-        <signature>SIGN</signature>
-        <annotation>NOTE</annotation>
-        <externalValidated>VAL</externalValidated>
-        <externalRefused>REF</externalRefused>
     </signatoryBook>
     <signatoryBook>
         <id>ixbus</id>
diff --git a/src/app/action/controllers/PreProcessActionController.php b/src/app/action/controllers/PreProcessActionController.php
index f00e49ffb06..9a5173caa32 100755
--- a/src/app/action/controllers/PreProcessActionController.php
+++ b/src/app/action/controllers/PreProcessActionController.php
@@ -22,6 +22,7 @@ use Convert\controllers\ConvertPdfController;
 use Docserver\models\DocserverModel;
 use Doctype\models\DoctypeExtModel;
 use Entity\models\EntityModel;
+use Entity\models\ListInstanceModel;
 use ExternalSignatoryBook\controllers\MaarchParapheurController;
 use Group\models\GroupModel;
 use Parameter\models\ParameterModel;
@@ -431,6 +432,10 @@ class PreProcessActionController
                 $userList = MaarchParapheurController::getInitializeDatas(['config' => $config]);
                 if (!empty($userList['users'])) {
                     $additionalsInfos['users'] = $userList['users'];
+                    $aUsersInMP = [];
+                    foreach ($userList['users'] as $value) {
+                        $aUsersInMP[] = $value['id'];
+                    }
                 } else {
                     $additionalsInfos['users'] = [];
                 }
@@ -445,6 +450,20 @@ class PreProcessActionController
                         $noAttachmentsResource['alt_identifier'] = _UNDEFINED;
                     }
 
+                    $listinstances = ListInstanceModel::getVisaCircuitByResId(['select' => ['external_id', 'firstname', 'lastname'], 'id' => $resId]);
+                    if (empty($listinstances)) {
+                        $additionalsInfos['visaWorkflowError'][] = ['alt_identifier' => $noAttachmentsResource['alt_identifier'], 'res_id' => $resId, 'reason' => 'noVisaWorkflow'];
+                        continue;
+                    }
+
+                    foreach ($listinstances as $user) {
+                        $externalId = json_decode($user['external_id'], true);
+                        if (!in_array($externalId['maarchParapheur'], $aUsersInMP)) {
+                            $additionalsInfos['visaWorkflowError'][] = ['alt_identifier' => $noAttachmentsResource['alt_identifier'], 'res_id' => $resId, 'reason' => 'noUserDefinedInMaarchParapheur'];
+                            continue 2;
+                        }
+                    }
+
                     $adrMainInfo = ConvertPdfController::getConvertedPdfById(['resId' => $resId, 'collId' => 'letterbox_coll']);
                     if (empty($adrMainInfo['docserver_id'])) {
                         $additionalsInfos['noMail'][] = ['alt_identifier' => $noAttachmentsResource['alt_identifier'], 'res_id' => $resId, 'reason' => 'noMailConversion'];
diff --git a/src/app/external/externalSignatoryBook/controllers/MaarchParapheurController.php b/src/app/external/externalSignatoryBook/controllers/MaarchParapheurController.php
index 8ac5bf1ab21..5725b95b9b4 100755
--- a/src/app/external/externalSignatoryBook/controllers/MaarchParapheurController.php
+++ b/src/app/external/externalSignatoryBook/controllers/MaarchParapheurController.php
@@ -179,6 +179,20 @@ class MaarchParapheurController
         $senderPrimaryEntity = UserModel::getPrimaryEntityByUserId(['userId' => $aArgs['userId']]);
 
         if ($aArgs['objectSent'] == 'attachment') {
+            $listinstances = ListInstanceModel::getVisaCircuitByResId(['select' => ['external_id', 'users.user_id', 'requested_signature'], 'id' => $mainResource[0]['res_id']]);
+            if (empty($listinstances)) {
+                return ['error' => 'No visa workflow'];
+            }
+
+            $workflow = [];
+            foreach ($listinstances as $user) {
+                $externalId = json_decode($user['external_id'], true);
+                if (empty($externalId['maarchParapheur'])) {
+                    return ['error' => 'Some users does not exist in Maarch Parapheur'];
+                }
+                $workflow[] = ['processingUser' => $user['user_id'], 'mode' => ($user['requested_signature'] ? 'sign' : 'visa')];
+            }
+
             $excludeAttachmentTypes = ['converted_pdf', 'print_folder', 'signed_response'];
 
             $attachments = AttachmentModel::getOnView([
@@ -249,12 +263,11 @@ class MaarchParapheurController
                     $bodyData = [
                         'title'           => $value['title'],
                         'reference'       => $value['identifier'],
-                        'mode'            => $aArgs['config']['data']['signature'],
                         'encodedDocument' => $encodedZipDocument,
-                        'processingUser'  => $processingUser,
                         'sender'          => trim($sender['firstname'] . ' ' .$sender['lastname']),
                         'deadline'        => $processLimitDate,
                         'attachments'     => $attachmentsData,
+                        'workflow'        => $workflow,
                         'metadata'        => $metadata
                     ];
         
@@ -282,15 +295,15 @@ class MaarchParapheurController
                 $metadata[_RECIPIENTS] = $contact;
             }
 
+            $workflow = [['processingUser' => $processingUser, 'mode' => 'note']];
             $bodyData = [
-                'title'              => $mainResource[0]['subject'],
-                'reference'          => $mainResource[0]['alt_identifier'],
-                'mode'               => $aArgs['config']['data']['annotation'],
-                'encodedDocument'    => $encodedMainZipFile,
-                'processingUser'     => $processingUser,
-                'sender'             => trim($sender['firstname'] . ' ' .$sender['lastname']),
-                'deadline'           => $processLimitDate,
-                'metadata'           => $metadata
+                'title'            => $mainResource[0]['subject'],
+                'reference'        => $mainResource[0]['alt_identifier'],
+                'encodedDocument'  => $encodedMainZipFile,
+                'sender'           => trim($sender['firstname'] . ' ' .$sender['lastname']),
+                'deadline'         => $processLimitDate,
+                'workflow'         => $workflow,
+                'metadata'         => $metadata
             ];
 
             $response = CurlModel::exec([
diff --git a/src/frontend/app/actions/send-external-signatory-book-action/maarch-paraph/maarch-paraph.component.html b/src/frontend/app/actions/send-external-signatory-book-action/maarch-paraph/maarch-paraph.component.html
index bae15bc170e..1f3d8c70f44 100644
--- a/src/frontend/app/actions/send-external-signatory-book-action/maarch-paraph/maarch-paraph.component.html
+++ b/src/frontend/app/actions/send-external-signatory-book-action/maarch-paraph/maarch-paraph.component.html
@@ -1,4 +1,4 @@
-<div class="col-md-12" style="padding-top: 10px;" *ngIf="additionalsInfos.users.length != 0">
+<div class="col-md-12" style="padding-top: 10px;" *ngIf="additionalsInfos.users.length != 0 && externalSignatoryBookDatas.objectSent == 'mail'">
     <mat-form-field>
         <mat-label>{{lang.userMaarchParapheur}}</mat-label>
         <mat-select name="processingUser" [(ngModel)]="externalSignatoryBookDatas.processingUser" required>
@@ -11,6 +11,23 @@
 <div class="col-md-12" *ngIf="additionalsInfos.users.length == 0">
     {{lang.noUserDefinedInMaarchParapheur}}
 </div>
+<div class="col-md-12" *ngIf="externalSignatoryBookDatas.objectSent == 'attachment'">
+    <div class="alert-message alert-message-info" role="alert">{{lang.visaWorkflowWillBeSend}}</div>
+</div>
+<div class="col-md-12" *ngIf="additionalsInfos.visaWorkflowError && externalSignatoryBookDatas.objectSent == 'attachment'">
+    <div>
+        <div class="alert-message alert-message-danger mailList" role="alert">
+            <p>
+                {{lang.canNotMakeAction}} :
+            </p>
+            <ul>
+                <li *ngFor="let visaError of additionalsInfos.visaWorkflowError">
+                    <b>{{visaError.alt_identifier}}</b> : {{lang[visaError.reason]}}
+                </li>
+            </ul>
+        </div>
+    </div>
+</div>
 <div class="col-sm-12" *ngIf="additionalsInfos.users.length != 0">
     <mat-radio-group required name="objectSent" [(ngModel)]="externalSignatoryBookDatas.objectSent">
         <mat-radio-button color="primary" name="objectSent" checked value="mail">{{lang.mailNote}}</mat-radio-button>
diff --git a/src/frontend/app/actions/send-external-signatory-book-action/maarch-paraph/maarch-paraph.component.ts b/src/frontend/app/actions/send-external-signatory-book-action/maarch-paraph/maarch-paraph.component.ts
index e00af0355c5..7f9d4270d16 100644
--- a/src/frontend/app/actions/send-external-signatory-book-action/maarch-paraph/maarch-paraph.component.ts
+++ b/src/frontend/app/actions/send-external-signatory-book-action/maarch-paraph/maarch-paraph.component.ts
@@ -27,10 +27,11 @@ export class MaarchParaphComponent implements OnInit {
     ngOnInit(): void { }
 
     checkValidParaph() {
-        if (!this.externalSignatoryBookDatas.processingUser || 
-            this.additionalsInfos.users.length == 0 || 
-            (this.externalSignatoryBookDatas.objectSent == 'attachment' && this.additionalsInfos.attachments.length == 0) || 
-            (this.externalSignatoryBookDatas.objectSent == 'mail' && this.additionalsInfos.mails.length == 0)) {
+        if ((this.externalSignatoryBookDatas.objectSent == 'attachment' && this.additionalsInfos.attachments.length == 0) || 
+            (this.externalSignatoryBookDatas.objectSent == 'mail' && 
+                (this.additionalsInfos.mails.length == 0 || !this.externalSignatoryBookDatas.processingUser || this.additionalsInfos.users.length == 0)
+            )
+            ) {
             return true;
         } else {
             return false;
diff --git a/src/frontend/lang/lang-en.ts b/src/frontend/lang/lang-en.ts
index 3289a3240d6..923d41c53c7 100755
--- a/src/frontend/lang/lang-en.ts
+++ b/src/frontend/lang/lang-en.ts
@@ -1003,4 +1003,6 @@ export const LANG_EN = {
     "userOK" : "Active",
     "userSPD" : "Inactive",
     "userABS" : "Absent",
+    "noVisaWorkflow"                        : "No visa workflow set up.",
+    "visaWorkflowWillBeSend"                : "Visa workflow will be send to Maarch Parapheur"
 };
diff --git a/src/frontend/lang/lang-fr.ts b/src/frontend/lang/lang-fr.ts
index 0c79c8b0629..36fe29f8b1b 100755
--- a/src/frontend/lang/lang-fr.ts
+++ b/src/frontend/lang/lang-fr.ts
@@ -1036,4 +1036,6 @@ export const LANG_FR = {
     "userOK" : "Actif",
     "userSPD" : "Inactif",
     "userABS" : "Absent",
+    "noVisaWorkflow"                        : "Aucun circuit de visa paramétré.",
+    "visaWorkflowWillBeSend"                : "Le circuit visa des courriers sera envoyé à Maarch Parapheur"
 };
\ No newline at end of file
diff --git a/src/frontend/lang/lang-nl.ts b/src/frontend/lang/lang-nl.ts
index bca53be0b81..c365c8e9d85 100755
--- a/src/frontend/lang/lang-nl.ts
+++ b/src/frontend/lang/lang-nl.ts
@@ -1030,4 +1030,6 @@ export const LANG_NL = {
     "userOK" : "Active", //_TO_TRANSLATE
     "userSPD" : "Inactive", //_TO_TRANSLATE
     "userABS" : "Absent", //_TO_TRANSLATE
+    "noVisaWorkflow"                        : "No visa workflow set up.", //_TO_TRANSLATE
+    "visaWorkflowWillBeSend"                : "Visa workflow will be send to Maarch Parapheur", //_TO_TRANSLATE
 };
-- 
GitLab