From 5516277ded3f17b0e430168b7962db7d2690a310 Mon Sep 17 00:00:00 2001
From: "florian.azizian" <florian.azizian@maarch.org>
Date: Wed, 9 Oct 2019 10:56:28 +0100
Subject: [PATCH] FEAT #11907 TIME 1 check priorities with same time limit

---
 migration/19.12/1912.sql                      |  4 ++
 sql/data_fr.sql                               |  2 +-
 sql/structure.sql                             |  2 +-
 .../controllers/PriorityController.php        | 14 +++++-
 .../priority/models/PriorityModelAbstract.php | 43 +++++++++++++------
 src/core/lang/lang-en.php                     |  2 +
 src/core/lang/lang-fr.php                     |  2 +
 src/core/lang/lang-nl.php                     |  2 +
 8 files changed, 53 insertions(+), 18 deletions(-)

diff --git a/migration/19.12/1912.sql b/migration/19.12/1912.sql
index e7a22caaca6..36cc2a74a74 100644
--- a/migration/19.12/1912.sql
+++ b/migration/19.12/1912.sql
@@ -363,7 +363,11 @@ DROP TABLE IF EXISTS foldertypes_doctypes_level1;
 DROP TABLE IF EXISTS foldertypes_indexes;
 ALTER TABLE doctypes DROP COLUMN IF EXISTS coll_id;
 DROP TABLE IF EXISTS mlb_doctype_ext;
+
+/* PRIORITIES */
 ALTER TABLE priorities DROP COLUMN IF EXISTS working_days;
+UPDATE priorities SET delays = 30 WHERE delays IS NULL;
+ALTER TABLE priorities ALTER COLUMN delays SET NOT NULL;
 
 /* RE CREATE VIEWS */
 CREATE OR REPLACE VIEW res_view_letterbox AS
diff --git a/sql/data_fr.sql b/sql/data_fr.sql
index ecda6d92ce7..d71eb7dace6 100755
--- a/sql/data_fr.sql
+++ b/sql/data_fr.sql
@@ -1600,7 +1600,7 @@ Select setval('templates_seq', (select max(template_id)+1 from templates), false
 --PRIORITES
 ------------
 TRUNCATE TABLE priorities;
-INSERT INTO priorities (id, label, color, delays, "order") VALUES ('poiuytre1357nbvc', 'Normal', '#009dc5', 0, 1);
+INSERT INTO priorities (id, label, color, delays, "order") VALUES ('poiuytre1357nbvc', 'Normal', '#009dc5', 30, 1);
 INSERT INTO priorities (id, label, color, delays, "order") VALUES ('poiuytre1379nbvc', 'Urgent', '#ffa500', 8, 2);
 INSERT INTO priorities (id, label, color, delays, "order") VALUES ('poiuytre1391nbvc', 'Très urgent', '#ff0000', 4, 3);
 
diff --git a/sql/structure.sql b/sql/structure.sql
index 9da72952637..4c21127bcc0 100755
--- a/sql/structure.sql
+++ b/sql/structure.sql
@@ -1259,7 +1259,7 @@ CREATE TABLE priorities
   id character varying(16) NOT NULL,
   label character varying(128) NOT NULL,
   color character varying(128) NOT NULL,
-  delays integer,
+  delays integer NOT NULL,
   "order" integer,
   CONSTRAINT priorities_pkey PRIMARY KEY (id)
 )
diff --git a/src/app/priority/controllers/PriorityController.php b/src/app/priority/controllers/PriorityController.php
index 7fc03312ebc..3fe3715bb7d 100755
--- a/src/app/priority/controllers/PriorityController.php
+++ b/src/app/priority/controllers/PriorityController.php
@@ -48,12 +48,17 @@ class PriorityController
         $data = $request->getParams();
         $check = Validator::stringType()->notEmpty()->validate($data['label']);
         $check = $check && Validator::stringType()->notEmpty()->validate($data['color']);
-        $check = $check && (Validator::intVal()->notEmpty()->validate($data['delays']) || $data['delays'] == null || $data['delays'] == 0);
+        $check = $check && (Validator::intVal()->notEmpty()->validate($data['delays']) || $data['delays'] == 0);
 
         if (!$check) {
             return $response->withStatus(400)->withJson(['errors' => 'Body (label, color or delays) is empty or type is incorrect']);
         }
 
+        $delayAlreadySet = PriorityModel::getByDelays(['select' => [1], 'delays' => (int)$data['delays']]);
+        if (!empty($delayAlreadySet)) {
+            return $response->withStatus(400)->withJson(['errors' => _PRIORITY_DELAY_ALREADY_SET]);
+        }
+
         $id = PriorityModel::create($data);
         HistoryController::add([
             'tableName' => 'priorities',
@@ -76,12 +81,17 @@ class PriorityController
         $data = $request->getParams();
         $check = Validator::stringType()->notEmpty()->validate($data['label']);
         $check = $check && Validator::stringType()->notEmpty()->validate($data['color']);
-        $check = $check && (Validator::intVal()->notEmpty()->validate($data['delays']) || $data['delays'] == null);
+        $check = $check && (Validator::intVal()->notEmpty()->validate($data['delays']) || $data['delays'] == 0);
 
         if (!$check) {
             return $response->withStatus(400)->withJson(['errors' => 'Body (label, color or delays) is empty or type is incorrect']);
         }
 
+        $delayAlreadySet = PriorityModel::getByDelays(['select' => [1], 'delays' => $data['delays']]);
+        if (!empty($delayAlreadySet)) {
+            return $response->withStatus(400)->withJson(['errors' => _PRIORITY_DELAY_ALREADY_SET]);
+        }
+
         $data['id'] = $aArgs['id'];
 
         PriorityModel::update($data);
diff --git a/src/app/priority/models/PriorityModelAbstract.php b/src/app/priority/models/PriorityModelAbstract.php
index 441ee70329a..b9415c8d421 100755
--- a/src/app/priority/models/PriorityModelAbstract.php
+++ b/src/app/priority/models/PriorityModelAbstract.php
@@ -44,10 +44,10 @@ abstract class PriorityModelAbstract
         ValidatorModel::arrayType($aArgs, ['select']);
 
         $aPriority = DatabaseModel::select([
-            'select'    => empty($aArgs['select']) ? ['*'] : $aArgs['select'],
-            'table'     => ['priorities'],
-            'where'     => ['id = ?'],
-            'data'      => [$aArgs['id']]
+            'select' => empty($aArgs['select']) ? ['*'] : $aArgs['select'],
+            'table'  => ['priorities'],
+            'where'  => ['id = ?'],
+            'data'   => [$aArgs['id']]
         ]);
 
         if (empty($aPriority[0])) {
@@ -67,10 +67,10 @@ abstract class PriorityModelAbstract
         DatabaseModel::insert([
             'table'         => 'priorities',
             'columnsValues' => [
-                'id'                => $id,
-                'label'             => $aArgs['label'],
-                'color'             => $aArgs['color'],
-                'delays'            => $aArgs['delays'],
+                'id'     => $id,
+                'label'  => $aArgs['label'],
+                'color'  => $aArgs['color'],
+                'delays' => $aArgs['delays'],
             ]
         ]);
 
@@ -86,12 +86,12 @@ abstract class PriorityModelAbstract
         DatabaseModel::update([
             'table'     => 'priorities',
             'set'       => [
-                'label'             => $aArgs['label'],
-                'color'             => $aArgs['color'],
-                'delays'            => $aArgs['delays'],
+                'label'  => $aArgs['label'],
+                'color'  => $aArgs['color'],
+                'delays' => $aArgs['delays'],
             ],
-            'where'     => ['id = ?'],
-            'data'      => [$aArgs['id']]
+            'where' => ['id = ?'],
+            'data'  => [$aArgs['id']]
         ]);
 
         return true;
@@ -128,4 +128,19 @@ abstract class PriorityModelAbstract
         
         return true;
     }
-}
\ No newline at end of file
+
+    public static function getByDelays(array $aArgs)
+    {
+        ValidatorModel::intType($aArgs, ['delays']);
+        ValidatorModel::arrayType($aArgs, ['select']);
+
+        $aPriority = PriorityModel::get([
+            'select' => empty($aArgs['select']) ? ['*'] : $aArgs['select'],
+            'table'  => ['priorities'],
+            'where'  => ['delays = ?'],
+            'data'   => [$aArgs['delays']]
+        ]);
+
+        return $aPriority;
+    }
+}
diff --git a/src/core/lang/lang-en.php b/src/core/lang/lang-en.php
index f41df00aec7..925d2f7a875 100755
--- a/src/core/lang/lang-en.php
+++ b/src/core/lang/lang-en.php
@@ -500,3 +500,5 @@ define("_CUSTOMFIELDS_SUPPRESSION", "Custom field suppression");
 define("_INDEXINGMODEL_CREATION", "Indexing model creation");
 define("_INDEXINGMODEL_MODIFICATION", "Indexing model modification");
 define("_INDEXINGMODEL_SUPPRESSION", "Indexing model suppression");
+
+define("_PRIORITY_DELAY_ALREADY_SET", "This time limit is already set to another priority");
\ No newline at end of file
diff --git a/src/core/lang/lang-fr.php b/src/core/lang/lang-fr.php
index d293823fa8c..be341578c46 100755
--- a/src/core/lang/lang-fr.php
+++ b/src/core/lang/lang-fr.php
@@ -499,3 +499,5 @@ define("_CUSTOMFIELDS_SUPPRESSION", "Champ personnalisé supprimé");
 define("_INDEXINGMODEL_CREATION", "Modèle d'enregistrement créé");
 define("_INDEXINGMODEL_MODIFICATION", "Modèle d'enregistrement modifié");
 define("_INDEXINGMODEL_SUPPRESSION", "Modèle d'enregistrement supprimé");
+
+define("_PRIORITY_DELAY_ALREADY_SET", "Ce délai de traitement est déjà défini pour une autre priorité");
diff --git a/src/core/lang/lang-nl.php b/src/core/lang/lang-nl.php
index aa199b51da0..a0d516d67ec 100755
--- a/src/core/lang/lang-nl.php
+++ b/src/core/lang/lang-nl.php
@@ -505,3 +505,5 @@ define("_CUSTOMFIELDS_SUPPRESSION", "Custom field suppression_TO_TRANSLATE");
 define("_INDEXINGMODEL_CREATION", "Indexing model creation_TO_TRANSLATE");
 define("_INDEXINGMODEL_MODIFICATION", "Indexing model modification_TO_TRANSLATE");
 define("_INDEXINGMODEL_SUPPRESSION", "Indexing model suppression_TO_TRANSLATE");
+
+define("_PRIORITY_DELAY_ALREADY_SET", "Ce délai de traitement est déjà paramétré pour une autre priorité_TO_TRANSLATE");
\ No newline at end of file
-- 
GitLab