From fe0705dad93df288e5d7381ecb87f71376217e61 Mon Sep 17 00:00:00 2001
From: Damien Burel <damien.burel@maarch.org>
Date: Tue, 24 Oct 2017 11:15:23 +0200
Subject: [PATCH] FEAT #6134 Save signatory

---
 core/Models/ListinstanceModel.php             | 20 ++++++++++
 core/Models/ListinstanceModelAbstract.php     | 37 ++++++++++++++++++
 .../Models/AttachmentsModelAbstract.php       | 39 +++++++++++++++++--
 modules/visa/Controllers/VisaController.php   |  8 ++++
 modules/visa/save_attach_res_from_cm.php      |  7 ++--
 modules/visa/sign_file.php                    |  5 ++-
 sql/17_xx.sql                                 | 12 ++++--
 7 files changed, 117 insertions(+), 11 deletions(-)
 create mode 100644 core/Models/ListinstanceModel.php
 create mode 100644 core/Models/ListinstanceModelAbstract.php

diff --git a/core/Models/ListinstanceModel.php b/core/Models/ListinstanceModel.php
new file mode 100644
index 00000000000..76bc8c07481
--- /dev/null
+++ b/core/Models/ListinstanceModel.php
@@ -0,0 +1,20 @@
+<?php
+
+/**
+ * Copyright Maarch since 2008 under licence GPLv3.
+ * See LICENCE.txt file at the root folder for more details.
+ * This file is part of Maarch software.
+ *
+ */
+
+/**
+ * @brief Listinstance Model
+ * @author dev@maarch.org
+ * @ingroup listinstance
+ */
+
+namespace Core\Models;
+
+class ListinstanceModel extends ListinstanceModelAbstract
+{
+}
diff --git a/core/Models/ListinstanceModelAbstract.php b/core/Models/ListinstanceModelAbstract.php
new file mode 100644
index 00000000000..7fc685085b4
--- /dev/null
+++ b/core/Models/ListinstanceModelAbstract.php
@@ -0,0 +1,37 @@
+<?php
+
+/**
+ * Copyright Maarch since 2008 under licence GPLv3.
+ * See LICENCE.txt file at the root folder for more details.
+ * This file is part of Maarch software.
+ *
+ */
+
+/**
+ * @brief Listinstance Model Abstract
+ * @author dev@maarch.org
+ * @ingroup listinstance
+ */
+
+namespace Core\Models;
+
+class ListinstanceModelAbstract
+{
+    public static function setSignatory(array $aArgs)
+    {
+        ValidatorModel::notEmpty($aArgs, ['resId', 'signatory', 'userId']);
+        ValidatorModel::intVal($aArgs, ['resId']);
+        ValidatorModel::stringType($aArgs, ['signatory', 'userId']);
+
+        DatabaseModel::update([
+            'table'     => 'listinstance',
+            'set'       => [
+                'signatory' => $aArgs['signatory']
+            ],
+            'where'     => ['res_id = ?', 'item_id = ?', 'difflist_type = ?'],
+            'data'      => [$aArgs['resId'], $aArgs['userId'], 'VISA_CIRCUIT'],
+        ]);
+
+        return true;
+    }
+}
diff --git a/modules/attachments/Models/AttachmentsModelAbstract.php b/modules/attachments/Models/AttachmentsModelAbstract.php
index 567c60fcaf9..dc9cbb7bb3a 100755
--- a/modules/attachments/Models/AttachmentsModelAbstract.php
+++ b/modules/attachments/Models/AttachmentsModelAbstract.php
@@ -17,7 +17,7 @@ class AttachmentsModelAbstract
 {
     public static function getById(array $aArgs)
     {
-        ValidatorModel::notEmpty($aArgs, ['id']);
+        ValidatorModel::notEmpty($aArgs, ['id', 'isVersion']);
         ValidatorModel::intVal($aArgs, ['id']);
         ValidatorModel::stringType($aArgs, ['isVersion']);
 
@@ -150,7 +150,7 @@ class AttachmentsModelAbstract
 
         DatabaseModel::update([
             'table'     => $aArgs['table'],
-            'set'       => ['status' => 'A_TRA'],
+            'set'       => ['status' => 'A_TRA', 'signatory_user_serial_id' => NULL],
             'where'     => ['res_id = ?'],
             'data'      => [$aArgs['resId']]
         ]);
@@ -167,7 +167,7 @@ class AttachmentsModelAbstract
 
     public static function setInSignatureBook(array $aArgs)
     {
-        ValidatorModel::notEmpty($aArgs, ['id']);
+        ValidatorModel::notEmpty($aArgs, ['id', 'isVersion']);
         ValidatorModel::intVal($aArgs, ['id']);
         ValidatorModel::stringType($aArgs, ['isVersion']);
         ValidatorModel::boolType($aArgs, ['inSignatureBook']);
@@ -194,4 +194,37 @@ class AttachmentsModelAbstract
 
         return true;
     }
+
+    public static function hasAttachmentsSignedForUserById(array $aArgs)
+    {
+        ValidatorModel::notEmpty($aArgs, ['id', 'user_serial_id', 'isVersion']);
+        ValidatorModel::intVal($aArgs, ['id', 'user_serial_id']);
+        ValidatorModel::stringType($aArgs, ['isVersion']);
+
+        if ($aArgs['isVersion'] == 'true') {
+            $table = 'res_version_attachments';
+        } else {
+            $table = 'res_attachments';
+        }
+
+        $attachment = DatabaseModel::select([
+            'select'    => ['res_id_master'],
+            'table'     => [$table],
+            'where'     => ['res_id = ?'],
+            'data'      => [$aArgs['id']],
+        ]);
+
+        $attachments = DatabaseModel::select([
+            'select'    => ['res_id_master'],
+            'table'     => ['res_view_attachments'],
+            'where'     => ['res_id_master = ?', 'signatory_user_serial_id = ?'],
+            'data'      => [$attachment[0]['res_id_master'], $aArgs['user_serial_id']],
+        ]);
+
+        if (empty($attachments)) {
+            return false;
+        }
+
+        return true;
+    }
 }
diff --git a/modules/visa/Controllers/VisaController.php b/modules/visa/Controllers/VisaController.php
index 3f97f55a7e8..94577ce695a 100755
--- a/modules/visa/Controllers/VisaController.php
+++ b/modules/visa/Controllers/VisaController.php
@@ -16,6 +16,7 @@ namespace Visa\Controllers;
 use Apps\Models\ActionModel;
 use Apps\Models\ContactModel;
 use Attachments\Models\AttachmentsModel;
+use Core\Models\ListinstanceModel;
 use Core\Models\ResModel;
 use Core\Models\UserModel;
 use Core\Models\LangModel;
@@ -93,6 +94,13 @@ class VisaController
     {
         AttachmentsModel::unsignAttachment(['table' => $aArgs['collId'], 'resId' => $aArgs['resId']]);
 
+        $isVersion = ($aArgs['collId'] == 'res_attachments' ? 'false' : 'true');
+        $user = UserModel::getById(['userId' => $_SESSION['user']['UserId'], 'select' => ['id']]);
+        if (!AttachmentsModel::hasAttachmentsSignedForUserById(['id' => $aArgs['resId'], 'isVersion' => $isVersion, 'user_serial_id' => $user['id']])) {
+            $attachment = AttachmentsModel::getById(['id' => $aArgs['resId'], 'isVersion' => $isVersion, 'select' => ['res_id_master']]);
+            ListinstanceModel::setSignatory(['resId' => $attachment['res_id_master'], 'signatory' => 'false', 'userId' => $_SESSION['user']['UserId']]);
+        }
+
         return $response->withJson(['success' => 'success']);
     }
 
diff --git a/modules/visa/save_attach_res_from_cm.php b/modules/visa/save_attach_res_from_cm.php
index eda810a3736..420e1267b38 100755
--- a/modules/visa/save_attach_res_from_cm.php
+++ b/modules/visa/save_attach_res_from_cm.php
@@ -52,12 +52,13 @@ if (empty($docserver)) {
         } else {
 			require_once "core/class/class_request.php";
 			$db = new Database();
-			if ($_SESSION['visa']['repSignRel'] > 1) {
+            $signatoryUser = \Core\Models\UserModel::getById(['userId' => $_SESSION['user']['UserId'], 'select' => ['id']]);
+            if ($_SESSION['visa']['repSignRel'] > 1) {
                 //$target_table = 'res_version_attachments';
-                $db->query("UPDATE res_version_attachments set status = 'SIGN' WHERE res_id = ?",[$_SESSION['visa']['repSignId']]);
+                $db->query("UPDATE res_version_attachments set status = 'SIGN', signatory_user_serial_id = ? WHERE res_id = ?",[$signatoryUser['id'], $_SESSION['visa']['repSignId']]);
             } else {
                 //$target_table = 'res_attachments';
-				$db->query("UPDATE res_attachments set status = 'SIGN' WHERE res_id = ?",[$_SESSION['visa']['repSignId']]);
+                $db->query("UPDATE res_attachments set status = 'SIGN', signatory_user_serial_id = ? WHERE res_id = ?",[$signatoryUser['id'], $_SESSION['visa']['repSignId']]);
             }
 			unset($_SESSION['visa']['repSignRel']);
 			if (isset($_SESSION['visa']['repSignId'])) unset($_SESSION['visa']['repSignId']);
diff --git a/modules/visa/sign_file.php b/modules/visa/sign_file.php
index aff272d6582..44c6dfab246 100755
--- a/modules/visa/sign_file.php
+++ b/modules/visa/sign_file.php
@@ -107,8 +107,9 @@ if (!empty($_REQUEST['id']) && !empty($_REQUEST['collId'])) {
 		$fileExtension = "pdf";
 		
 		include 'modules/visa/save_attach_res_from_cm.php';
-		
-		echo "{\"status\": 0, \"new_id\": $id}";
+        $db->query('UPDATE listinstance set signatory = TRUE WHERE listinstance_id = (SELECT listinstance_id WHERE res_id = ? AND item_id = ? AND difflist_type = ? AND process_date is null ORDER BY listinstance_id LIMIT 1)', [$objectResIdMaster, $_SESSION['user']['UserId'], 'VISA_CIRCUIT']);
+
+        echo "{\"status\": 0, \"new_id\": $id}";
 		exit;
 	}
 } else {
diff --git a/sql/17_xx.sql b/sql/17_xx.sql
index 61369d7d6e2..2581abc324f 100755
--- a/sql/17_xx.sql
+++ b/sql/17_xx.sql
@@ -123,11 +123,17 @@ WITH (OIDS=FALSE);
 ALTER TABLE entities DROP COLUMN IF EXISTS entity_full_name;
 ALTER TABLE entities ADD entity_full_name text;
 
-/*IN SIGNATURE BOOK*/
+/*SIGNATURE BOOK*/
 ALTER TABLE res_attachments DROP COLUMN IF EXISTS in_signature_book;
 ALTER TABLE res_attachments ADD in_signature_book boolean default false;
 ALTER TABLE res_version_attachments DROP COLUMN IF EXISTS in_signature_book;
 ALTER TABLE res_version_attachments ADD in_signature_book boolean default false;
+ALTER TABLE res_attachments DROP COLUMN IF EXISTS signatory_user_serial_id;
+ALTER TABLE res_attachments ADD signatory_user_serial_id int;
+ALTER TABLE res_version_attachments DROP COLUMN IF EXISTS signatory_user_serial_id;
+ALTER TABLE res_version_attachments ADD signatory_user_serial_id int;
+ALTER TABLE listinstance DROP COLUMN IF EXISTS signatory;
+ALTER TABLE listinstance ADD signatory boolean default false;
 DROP VIEW IF EXISTS res_view_attachments;
 CREATE VIEW res_view_attachments AS
   SELECT '0' as res_id, res_id as res_id_version, title, subject, description, publisher, contributor, type_id, format, typist,
@@ -136,7 +142,7 @@ CREATE VIEW res_view_attachments AS
     filename, offset_doc, logical_adr, fingerprint, filesize, is_paper, page_count,
     scan_date, scan_user, scan_location, scan_wkstation, scan_batch, burn_batch, scan_postmark,
     envelop_id, status, destination, approver, validation_date, effective_date, work_batch, origin, is_ingoing, priority, initiator, dest_user,
-    coll_id, dest_contact_id, dest_address_id, updated_by, is_multicontacts, is_multi_docservers, res_id_master, attachment_type, attachment_id_master, in_signature_book
+    coll_id, dest_contact_id, dest_address_id, updated_by, is_multicontacts, is_multi_docservers, res_id_master, attachment_type, attachment_id_master, in_signature_book, signatory_user_serial_id
   FROM res_version_attachments
   UNION ALL
   SELECT res_id, '0' as res_id_version, title, subject, description, publisher, contributor, type_id, format, typist,
@@ -145,5 +151,5 @@ CREATE VIEW res_view_attachments AS
     filename, offset_doc, logical_adr, fingerprint, filesize, is_paper, page_count,
     scan_date, scan_user, scan_location, scan_wkstation, scan_batch, burn_batch, scan_postmark,
     envelop_id, status, destination, approver, validation_date, effective_date, work_batch, origin, is_ingoing, priority, initiator, dest_user,
-    coll_id, dest_contact_id, dest_address_id, updated_by, is_multicontacts, is_multi_docservers, res_id_master, attachment_type, '0', in_signature_book
+    coll_id, dest_contact_id, dest_address_id, updated_by, is_multicontacts, is_multi_docservers, res_id_master, attachment_type, '0', in_signature_book, signatory_user_serial_id
   FROM res_attachments;
-- 
GitLab