From 26dbd50be262416aa153e24e8671d25220228c27 Mon Sep 17 00:00:00 2001
From: "florian.azizian" <florian.azizian@maarch.org>
Date: Mon, 17 Jun 2019 13:42:15 +0100
Subject: [PATCH] FEAT #10704 TIME 3:15 save workflow (before and after send
 doc to MP) + save real note writer

---
 .../actions/sendToExternalSignatureBook.php   | 13 +----
 modules/visa/batch/batch_tools.php            | 24 +++++++--
 .../batch/process_mailsFromSignatoryBook.php  | 51 ++++++++++++++-----
 modules/visa/lang/en.php                      |  9 ++++
 modules/visa/lang/fr.php                      |  9 ++++
 modules/visa/lang/nl.php                      |  9 ++++
 .../ExternalSignatoryBookTrait.php            | 31 +----------
 .../controllers/MaarchParapheurController.php | 47 +++++++++++++++--
 src/app/user/models/UserModelAbstract.php     | 19 +++++++
 src/core/lang/lang-en.php                     |  4 ++
 src/core/lang/lang-fr.php                     |  4 ++
 src/core/lang/lang-nl.php                     |  7 ++-
 12 files changed, 163 insertions(+), 64 deletions(-)

diff --git a/apps/maarch_entreprise/actions/sendToExternalSignatureBook.php b/apps/maarch_entreprise/actions/sendToExternalSignatureBook.php
index 7f1e07b7e43..291be885db4 100755
--- a/apps/maarch_entreprise/actions/sendToExternalSignatureBook.php
+++ b/apps/maarch_entreprise/actions/sendToExternalSignatureBook.php
@@ -266,7 +266,7 @@ function manage_form($arr_id, $history, $id_action, $label_action, $status, $col
                     $attachmentToFreeze = $sendedInfo['sended'];
                 }
 
-                $message = ' (à ' . $processingUserInfo['firstname'] . ' ' . $processingUserInfo['lastname'] . ')';
+                $message = $sendedInfo['historyInfos'];
             }
         }
 
@@ -289,17 +289,6 @@ function manage_form($arr_id, $history, $id_action, $label_action, $status, $col
                     ]);
                 }
             }
-
-            $stmt     = $db->query('SELECT status FROM res_letterbox WHERE res_id = ?', array($res_id));
-            $resource = $stmt->fetchObject();
-            
-            if ($resource->status == 'EVIS' || $resource->status == 'ESIG') {
-                $sequence    = $circuit_visa->getCurrentStep($res_id, $coll_id, 'VISA_CIRCUIT');
-                $stepDetails = array();
-                $stepDetails = $circuit_visa->getStepDetails($res_id, $coll_id, 'VISA_CIRCUIT', $sequence);
-
-                $message = $circuit_visa->processVisaWorkflow(['stepDetails' => $stepDetails, 'res_id' => $res_id]);
-            }
         }
     }
 
diff --git a/modules/visa/batch/batch_tools.php b/modules/visa/batch/batch_tools.php
index ac95aeafa4c..b70ee0255cf 100755
--- a/modules/visa/batch/batch_tools.php
+++ b/modules/visa/batch/batch_tools.php
@@ -157,9 +157,16 @@ function Bt_myInclude($file)
 function Bt_createAttachment($aArgs = [])
 {
     if (!empty($aArgs['noteContent'])) {
+        $creatorName = '';
+        if (!empty($aArgs['noteCreatorId'])) {
+            $creatorId = $aArgs['noteCreatorId'];
+        } else {
+            $creatorId = 'superadmin';
+            $creatorName = $aArgs['noteCreatorName'] . ' : ';
+        }
         $GLOBALS['db']->query(
-            "INSERT INTO notes (identifier, user_id, creation_date, note_text) VALUES (?, 'superadmin', CURRENT_TIMESTAMP, ?)",
-            [$aArgs['res_id_master'], $aArgs['noteContent']]
+            "INSERT INTO notes (identifier, user_id, creation_date, note_text) VALUES (?, ?, CURRENT_TIMESTAMP, ?)",
+            [$aArgs['res_id_master'], $creatorId, $creatorName . $aArgs['noteContent']]
         );
     }
 
@@ -247,9 +254,16 @@ function Bt_createAttachment($aArgs = [])
 function Bt_refusedSignedMail($aArgs = [])
 {
     if (!empty($aArgs['noteContent'])) {
+        $creatorName = '';
+        if (!empty($aArgs['noteCreatorId'])) {
+            $creatorId = $aArgs['noteCreatorId'];
+        } else {
+            $creatorId = 'superadmin';
+            $creatorName = $aArgs['noteCreatorName'] . ' : ';
+        }
         $GLOBALS['db']->query(
-            "INSERT INTO notes (identifier, user_id, creation_date, note_text) VALUES (?, 'superadmin', CURRENT_TIMESTAMP, ?)",
-            [$aArgs['resIdMaster'], $aArgs['noteContent']]
+            "INSERT INTO notes (identifier, user_id, creation_date, note_text) VALUES (?, $creatorId, CURRENT_TIMESTAMP, ?)",
+            [$aArgs['resIdMaster'], $creatorName . $aArgs['noteContent']]
         );
     }
     $GLOBALS['db']->query("UPDATE ".$aArgs['tableAttachment']." SET status = 'A_TRA' WHERE res_id = ?", [$aArgs['resIdAttachment']]);
@@ -257,7 +271,7 @@ function Bt_refusedSignedMail($aArgs = [])
     
     $GLOBALS['db']->query("UPDATE res_letterbox SET status = '" . $aArgs['refusedStatus'] . "' WHERE res_id = ?", [$aArgs['resIdMaster']]);
 
-    $historyInfo = 'La signature de la pièce jointe '.$aArgs['resIdAttachment'].' ('.$aArgs['tableAttachment'].') a été refusée dans le parapheur externe';
+    $historyInfo = 'La signature de la pièce jointe '.$aArgs['resIdAttachment'].' ('.$aArgs['tableAttachment'].') a été refusée dans le parapheur externe' . $aArgs['additionalHistoryInfo'];
     Bt_history([
         'table_name' => $aArgs['tableAttachment'],
         'record_id'  => $aArgs['resIdAttachment'],
diff --git a/modules/visa/batch/process_mailsFromSignatoryBook.php b/modules/visa/batch/process_mailsFromSignatoryBook.php
index c2a1ce46ee8..ba9a9acca83 100755
--- a/modules/visa/batch/process_mailsFromSignatoryBook.php
+++ b/modules/visa/batch/process_mailsFromSignatoryBook.php
@@ -304,6 +304,10 @@ foreach ($retrievedMails['isVersion'] as $resId => $value) {
             'table'             => 'res_attachments'
         ]);
     }
+    $additionalHistoryInfo = '';
+    if (!empty($value->workflowInfo)) {
+        $additionalHistoryInfo =  ' : ' . $value->workflowInfo;
+    }
 
     if ($value->status == 'validated') {
         if (!empty($value->encodedFile)) {
@@ -324,7 +328,9 @@ foreach ($retrievedMails['isVersion'] as $resId => $value) {
                 'status'          => 'TRA',
                 'encodedFile'     => $value->encodedFile,
                 'table'           => 'res_version_attachments',
-                'noteContent'     => $value->noteContent
+                'noteContent'     => $value->noteContent,
+                'noteCreatorId'   => $value->noteCreatorId,
+                'noteCreatorName' => $value->noteCreatorName
             ]);
         }
     
@@ -337,7 +343,7 @@ foreach ($retrievedMails['isVersion'] as $resId => $value) {
         }
 
         Bt_validatedMail(['status' => $status, 'resId' => $value->res_id_master]);
-        $historyInfo = 'La signature de la pièce jointe '.$resId.' (res_version_attachments) a été validée dans le parapheur externe';
+        $historyInfo = 'La signature de la pièce jointe '.$resId.' (res_version_attachments) a été validée dans le parapheur externe' . $additionalHistoryInfo;
         Bt_history([
             'table_name' => 'res_version_attachments',
             'record_id'  => $resId,
@@ -370,7 +376,9 @@ foreach ($retrievedMails['isVersion'] as $resId => $value) {
                 'encodedFile'     => $value->encodedFile,
                 'in_signature_book' => 'false',
                 'table'           => 'res_attachments',
-                'noteContent'     => $value->noteContent
+                'noteContent'     => $value->noteContent,
+                'noteCreatorId'   => $value->noteCreatorId,
+                'noteCreatorName' => $value->noteCreatorName
             ]);
             $value->noteContent = '';
         }
@@ -380,7 +388,10 @@ foreach ($retrievedMails['isVersion'] as $resId => $value) {
             'resIdAttachment' => $resId,
             'refusedStatus'   => $refusedStatus,
             'resIdMaster'     => $value->res_id_master,
-            'noteContent'     => $value->noteContent
+            'noteContent'     => $value->noteContent,
+            'noteCreatorId'   => $value->noteCreatorId,
+            'noteCreatorName' => $value->noteCreatorName,
+            'additionalHistoryInfo' => $additionalHistoryInfo
         ]);
     }
 }
@@ -408,6 +419,10 @@ foreach ($retrievedMails['noVersion'] as $resId => $value) {
             'table'             => 'res_attachments'
         ]);
     }
+    $additionalHistoryInfo = '';
+    if (!empty($value->workflowInfo)) {
+        $additionalHistoryInfo =  ' : ' . $value->workflowInfo;
+    }
 
     if ($value->status == 'validated') {
         if (!empty($value->encodedFile)) {
@@ -428,7 +443,9 @@ foreach ($retrievedMails['noVersion'] as $resId => $value) {
                 'status'          => 'TRA',
                 'encodedFile'     => $value->encodedFile,
                 'table'           => 'res_version_attachments',
-                'noteContent'     => $value->noteContent
+                'noteContent'     => $value->noteContent,
+                'noteCreatorId'   => $value->noteCreatorId,
+                'noteCreatorName' => $value->noteCreatorName
             ]);
         }
 
@@ -441,7 +458,7 @@ foreach ($retrievedMails['noVersion'] as $resId => $value) {
         }
         Bt_validatedMail(['status' => $status, 'resId' => $value->res_id_master]);
 
-        $historyInfo = 'La signature de la pièce jointe '.$resId.' (res_attachments) a été validée dans le parapheur externe';
+        $historyInfo = 'La signature de la pièce jointe '.$resId.' (res_attachments) a été validée dans le parapheur externe' . $additionalHistoryInfo;
         Bt_history([
             'table_name' => 'res_attachments',
             'record_id'  => $resId,
@@ -474,7 +491,9 @@ foreach ($retrievedMails['noVersion'] as $resId => $value) {
                 'encodedFile'     => $value->encodedFile,
                 'in_signature_book' => 'false',
                 'table'           => 'res_attachments',
-                'noteContent'     => $value->noteContent
+                'noteContent'     => $value->noteContent,
+                'noteCreatorId'   => $value->noteCreatorId,
+                'noteCreatorName' => $value->noteCreatorName
             ]);
             $value->noteContent = '';
         }
@@ -484,7 +503,10 @@ foreach ($retrievedMails['noVersion'] as $resId => $value) {
             'resIdAttachment' => $resId,
             'refusedStatus'   => $refusedStatus,
             'resIdMaster'     => $value->res_id_master,
-            'noteContent'     => $value->noteContent
+            'noteContent'     => $value->noteContent,
+            'noteCreatorId'   => $value->noteCreatorId,
+            'noteCreatorName' => $value->noteCreatorName,
+            'additionalHistoryInfo' => $additionalHistoryInfo
         ]);
     }
 }
@@ -501,11 +523,16 @@ foreach ($retrievedMails['resLetterbox'] as $resId => $value) {
             'format'            => $value->format,
             'encodedFile'       => $value->encodedFile,
             'noteContent'       => $value->noteContent,
+            'noteCreatorId'     => $value->noteCreatorId,
+            'noteCreatorName'   => $value->noteCreatorName,
             'in_signature_book' => 'false',
-            'attachment_type'    => 'document_with_notes'
+            'attachment_type'   => 'document_with_notes'
         ]);
     }
-
+    $additionalHistoryInfo = '';
+    if (!empty($value->workflowInfo)) {
+        $additionalHistoryInfo =  ' : ' . $value->workflowInfo;
+    }
     if ($value->status == 'validatedNote') {
         $GLOBALS['logger']->write('Document validated', 'INFO');
         Bt_validatedMail(['status' => $validatedStatusAnnot, 'resId' => $value->res_id]);
@@ -513,7 +540,7 @@ foreach ($retrievedMails['resLetterbox'] as $resId => $value) {
         Bt_history([
             'table_name' => 'res_letterbox',
             'record_id'  => $value->res_id,
-            'info'       => 'Le document '.$resId.' (res_letterbox) a été validé dans le parapheur externe',
+            'info'       => 'Le document '.$resId.' (res_letterbox) a été validé dans le parapheur externe' . $additionalHistoryInfo,
             'event_type' => 'ACTION#1',
             'event_id'   => '1'
         ]);
@@ -524,7 +551,7 @@ foreach ($retrievedMails['resLetterbox'] as $resId => $value) {
         Bt_history([
             'table_name' => 'res_letterbox',
             'record_id'  => $resId,
-            'info'       => 'Le document '.$resId.' (res_letterbox) a été refusé dans le parapheur externe',
+            'info'       => 'Le document '.$resId.' (res_letterbox) a été refusé dans le parapheur externe' . $additionalHistoryInfo,
             'event_type' => 'ACTION#1',
             'event_id'   => '1'
         ]);
diff --git a/modules/visa/lang/en.php b/modules/visa/lang/en.php
index e5c2662dd54..9d8ce9353eb 100755
--- a/modules/visa/lang/en.php
+++ b/modules/visa/lang/en.php
@@ -304,3 +304,12 @@ if (!defined('_MAIL_NOTE')) {
 if (!defined('_ATTACHMENT_SIGNATURE')) {
     define('_ATTACHMENT_SIGNATURE', "Signature of attachment in signature book");
 }
+if (!defined('_NOTE_USER')) {
+    define('_NOTE_USER', "Note user");
+}
+if (!defined('_WF_SEND_TO')) {
+    define('_WF_SEND_TO', "Send to :");
+}
+if (!defined('_VISA_USER_MIN')) {
+    define('_VISA_USER_MIN', "Visa user");
+}
diff --git a/modules/visa/lang/fr.php b/modules/visa/lang/fr.php
index 738fce3412e..a8cb299e3c5 100755
--- a/modules/visa/lang/fr.php
+++ b/modules/visa/lang/fr.php
@@ -485,3 +485,12 @@ if (!defined('_MAIL_NOTE')) {
 if (!defined('_ATTACHMENT_SIGNATURE')) {
     define('_ATTACHMENT_SIGNATURE', "Signature des documents intégrés au parapheur");
 }
+if (!defined('_NOTE_USER')) {
+    define('_NOTE_USER', "Annotateur");
+}
+if (!defined('_WF_SEND_TO')) {
+    define('_WF_SEND_TO', "Envoyé à :");
+}
+if (!defined('_VISA_USER_MIN')) {
+    define('_VISA_USER_MIN', "Viseur");
+}
diff --git a/modules/visa/lang/nl.php b/modules/visa/lang/nl.php
index 9eba31fb441..25605c882d7 100755
--- a/modules/visa/lang/nl.php
+++ b/modules/visa/lang/nl.php
@@ -391,3 +391,12 @@ if (!defined('_MAIL_NOTE')) {
 if (!defined('_ATTACHMENT_SIGNATURE')) {
     define('_ATTACHMENT_SIGNATURE', 'Handtekening van de documenten die in het vloeiboek geïntegreerd zijn');
 }
+if (!defined('_NOTE_USER')) {
+    define('_NOTE_USER', "Note user _TO_TRANSLATE");
+}
+if (!defined('_WF_SEND_TO')) {
+    define('_WF_SEND_TO', "Send to : _TO_TRANSLATE");
+}
+if (!defined('_VISA_USER_MIN')) {
+    define('_VISA_USER_MIN', "Visa user _TO_TRANSLATE");
+}
diff --git a/src/app/action/controllers/ExternalSignatoryBookTrait.php b/src/app/action/controllers/ExternalSignatoryBookTrait.php
index aa7794f304c..d808bb1f2f8 100644
--- a/src/app/action/controllers/ExternalSignatoryBookTrait.php
+++ b/src/app/action/controllers/ExternalSignatoryBookTrait.php
@@ -13,13 +13,11 @@
 namespace Action\controllers;
 
 use Attachment\models\AttachmentModel;
-use Entity\models\ListInstanceModel;
 use ExternalSignatoryBook\controllers\MaarchParapheurController;
 use ExternalSignatoryBook\controllers\XParaphController;
 use Resource\models\ResModel;
 use SrcCore\models\CoreConfigModel;
 use SrcCore\models\ValidatorModel;
-use User\models\UserModel;
 
 trait ExternalSignatoryBookTrait
 {
@@ -72,7 +70,7 @@ trait ExternalSignatoryBookTrait
                     $attachmentToFreeze = $sendedInfo['sended'];
                 }
 
-                $historyInfo = '';
+                $historyInfo = $sendedInfo['historyInfos'];
             } elseif ($config['id'] == 'xParaph') {
                 $attachments = AttachmentModel::getOnView([
                     'select'    => [
@@ -127,33 +125,6 @@ trait ExternalSignatoryBookTrait
                     }
                 }
             }
-
-            $document = ResModel::getById(['resId' => $args['resId'], 'select' => ['status']]);
-            
-            if ($document['status'] == 'EVIS' || $document['status'] == 'ESIG') {
-                $stepDetails = ListInstanceModel::getCurrentStepByResId(['resId' => $args['resId']]);
-
-                if (!empty($stepDetails) && $stepDetails['item_id'] != $GLOBALS['userId']) {
-                    ListInstanceModel::update([
-                        'set'   => ['process_date' => 'CURRENT_TIMESTAMP'],
-                        'where' => ['listinstance_id = ?', 'item_mode = ?', 'res_id = ?', 'item_id = ?', 'difflist_type = ?'],
-                        'data'  => [$stepDetails['listinstance_id'], $stepDetails['item_mode'], $args['resId'], $stepDetails['item_id'], 'VISA_CIRCUIT']
-                    ]);
-
-                    $currentUserInfo = UserModel::getByLogin(['login' => $GLOBALS['userId'], 'select' => ['firstname', 'lastname']]);
-                    $visaUserInfo = UserModel::getByLogin(['login' => $stepDetails['item_id'], 'select' => ['firstname', 'lastname']]);
-        
-                    $historyInfo = ' ' . _VISA_BY . ' ' . $currentUserInfo['firstname'] . ' ' . $currentUserInfo['lastname'] . ' ' . _INSTEAD_OF . ' ' . $visaUserInfo['firstname'] . ' ' . $visaUserInfo['lastname'];
-                } elseif (!empty($stepDetails)) {
-                    ListInstanceModel::update([
-                        'set'   => ['process_date' => 'CURRENT_TIMESTAMP'],
-                        'where' => ['listinstance_id = ?', 'item_mode = ?', 'res_id = ?', 'item_id = ?', 'difflist_type = ?'],
-                        'data'  => [$stepDetails['listinstance_id'], $stepDetails['item_mode'], $args['resId'], $GLOBALS['userId'], 'VISA_CIRCUIT']
-                    ]);
-
-                    $historyInfo = '';
-                }
-            }
         }
 
         return ['history' => $historyInfo];
diff --git a/src/app/external/externalSignatoryBook/controllers/MaarchParapheurController.php b/src/app/external/externalSignatoryBook/controllers/MaarchParapheurController.php
index 4bfd0f56692..271478336c6 100755
--- a/src/app/external/externalSignatoryBook/controllers/MaarchParapheurController.php
+++ b/src/app/external/externalSignatoryBook/controllers/MaarchParapheurController.php
@@ -312,7 +312,27 @@ class MaarchParapheurController
             $attachmentToFreeze['letterbox_coll'][$aArgs['resIdMaster']] = $response['id'];
         }
 
-        return ['sended' => $attachmentToFreeze];
+        $workflowInfos = [];
+        foreach ($workflow as $value) {
+            $userInfos = UserModel::getByExternalId([
+                'select'            => ['firstname', 'lastname'],
+                'externalId'        => $value['userId'],
+                'signatoryBookName' => 'maarchParapheur'
+            ]);
+            if ($value['mode'] == 'note') {
+                $mode = _NOTE_USER;
+            } elseif ($value['mode'] == 'visa') {
+                $mode = _VISA_USER;
+            } elseif ($value['mode'] == 'sign') {
+                $mode = _SIGNATORY;
+            }
+            $workflowInfos[] = $userInfos['firstname'] . ' ' . $userInfos['lastname'] . ' ('. $mode .')';
+        }
+        if (!empty($workflowInfos)) {
+            $historyInfos = ' ' . _WF_SEND_TO . ' ' . implode(", ", $workflowInfos);
+        }
+
+        return ['sended' => $attachmentToFreeze, 'historyInfos' => $historyInfos];
     }
 
     public static function createZip(array $aArgs)
@@ -371,7 +391,18 @@ class MaarchParapheurController
                     }
                     if (!empty($state['note'])) {
                         $aArgs['idsToRetrieve'][$version][$resId]->noteContent = $state['note'];
+                        $userInfos = UserModel::getByExternalId([
+                            'select'            => ['user_id'],
+                            'externalId'        => $state['noteCreatorId'],
+                            'signatoryBookName' => 'maarchParapheur'
+                        ]);
+                        if (!empty($userInfos)) {
+                            $aArgs['idsToRetrieve'][$version][$resId]->noteCreatorId = $userInfos['user_id'];
+                        } else {
+                            $aArgs['idsToRetrieve'][$version][$resId]->noteCreatorName = $state['noteCreatorName'];
+                        }
                     }
+                    $aArgs['idsToRetrieve'][$version][$resId]->workflowInfo = implode(", ", $state['workflowInfo']);
                 } else {
                     unset($aArgs['idsToRetrieve'][$version][$resId]);
                 }
@@ -409,10 +440,19 @@ class MaarchParapheurController
     public static function getState($aArgs)
     {
         $state['status'] = 'validated';
+        $state['workflowInfo'] = [];
         foreach ($aArgs['workflow'] as $step) {
+            if ($step['status'] == 'VAL' && $step['mode'] == 'sign') {
+                $state['workflowInfo'][] = $step['userDisplay'] . ' (Signé le ' . $step['processDate'] . ')';
+            } elseif ($step['status'] == 'VAL' && $step['mode'] == 'visa') {
+                $state['workflowInfo'][] = $step['userDisplay'] . ' (Visé le ' . $step['processDate'] . ')';
+            }
             if ($step['status'] == 'REF') {
-                $state['status'] = 'refused';
-                $state['note']   = $step['note'];
+                $state['status']          = 'refused';
+                $state['note']            = $step['note'];
+                $state['noteCreatorId']   = $step['userId'];
+                $state['noteCreatorName'] = $step['userDisplay'];
+                $state['workflowInfo'][]  = $step['userDisplay'] . ' (Refusé le ' . $step['processDate'] . ')';
                 break;
             } elseif (empty($step['status'])) {
                 $state['status'] = 'inProgress';
@@ -426,7 +466,6 @@ class MaarchParapheurController
 
     public static function getUserPicture(Request $request, Response $response, array $aArgs)
     {
-
         $check = Validator::intVal()->validate($aArgs['id']);
         if (!$check) {
             return $response->withStatus(400)->withJson(['errors' => 'id should be an integer']);
diff --git a/src/app/user/models/UserModelAbstract.php b/src/app/user/models/UserModelAbstract.php
index f3d625666f9..618fece575c 100755
--- a/src/app/user/models/UserModelAbstract.php
+++ b/src/app/user/models/UserModelAbstract.php
@@ -58,6 +58,25 @@ abstract class UserModelAbstract
         return $aUser[0];
     }
 
+    public static function getByExternalId(array $aArgs)
+    {
+        ValidatorModel::notEmpty($aArgs, ['externalId', 'signatoryBookName']);
+        ValidatorModel::intVal($aArgs, ['externalId']);
+
+        $aUser = DatabaseModel::select([
+            'select'    => empty($aArgs['select']) ? ['*'] : $aArgs['select'],
+            'table'     => ['users'],
+            'where'     => ['external_id->>\''.$aArgs['signatoryBookName'].'\' = ?'],
+            'data'      => [$aArgs['externalId']]
+        ]);
+
+        if (empty($aUser)) {
+            return [];
+        }
+
+        return $aUser[0];
+    }
+
     public static function create(array $aArgs)
     {
         ValidatorModel::notEmpty($aArgs, ['user']);
diff --git a/src/core/lang/lang-en.php b/src/core/lang/lang-en.php
index e34f748dd45..e6d0a36410b 100755
--- a/src/core/lang/lang-en.php
+++ b/src/core/lang/lang-en.php
@@ -498,3 +498,7 @@ define("_FILE_NOT_ALLOWED_INFO_3", "is not allowed");
 
 define("_ENTITY", "Entity");
 define("_PRINT_SEP_TITLE", "Mail separator");
+define("_SIGNATORY", "Signatory");
+define("_VISA_USER_MIN", "Visa user");
+define("_NOTE_USER", "Note user");
+define("_WF_SEND_TO", "Send to : ");
diff --git a/src/core/lang/lang-fr.php b/src/core/lang/lang-fr.php
index db422af50a9..d64b0dccfb9 100755
--- a/src/core/lang/lang-fr.php
+++ b/src/core/lang/lang-fr.php
@@ -497,3 +497,7 @@ define("_FILE_NOT_ALLOWED_INFO_2", "avec le type MIME");
 define("_FILE_NOT_ALLOWED_INFO_3", "n'est pas autorisée");
 define("_ENTITY", "Entité");
 define("_PRINT_SEP_TITLE", "Séparateur de courrier");
+define("_SIGNATORY", "Signataire");
+define("_VISA_USER_MIN", "Viseur");
+define("_NOTE_USER", "Annotateur");
+define("_WF_SEND_TO", "Envoyé à : ");
diff --git a/src/core/lang/lang-nl.php b/src/core/lang/lang-nl.php
index 40f2e8436d7..1191c3418ba 100755
--- a/src/core/lang/lang-nl.php
+++ b/src/core/lang/lang-nl.php
@@ -500,4 +500,9 @@ define("_FILE_NOT_ALLOWED_INFO_3", "is not allowed_TO_TRANSLATE");
 define("_ENTITY", "Entity_TO_TRANSLATE");
 define("_PRINT_SEP_TITLE", "Mail separator_TO_TRANSLATE");
 
-define('_SEND_TO_EXTERNAL_NOTEBOOK', 'Send data to external note book_TO_TRANSLATE');
\ No newline at end of file
+define('_SEND_TO_EXTERNAL_NOTEBOOK', 'Send data to external note book_TO_TRANSLATE');
+
+define("_SIGNATORY", "Signatory_TO_TRANSLATE");
+define("_VISA_USER_MIN", "Visa user_TO_TRANSLATE");
+define("_NOTE_USER", "Note user_TO_TRANSLATE");
+define("_WF_SEND_TO", "Send to : _TO_TRANSLATE");
-- 
GitLab