From 8637eb099fb67c53ac8051396e813dc3b92e85ed Mon Sep 17 00:00:00 2001
From: Damien <damien.burel@maarch.org>
Date: Thu, 14 Feb 2019 17:52:42 +0100
Subject: [PATCH] FEAT #9349 User isDeletable

---
 modules/entities/class/EntityControler.php    |  1 -
 rest/index.php                                |  7 +-
 .../controllers/ListInstanceController.php    | 29 --------
 .../controllers/ListTemplateController.php    | 13 +---
 src/app/entity/models/EntityModelAbstract.php | 14 +++-
 .../models/ListInstanceModelAbstract.php      | 19 +++--
 src/app/user/controllers/UserController.php   | 72 +++++++++++++++++++
 7 files changed, 96 insertions(+), 59 deletions(-)

diff --git a/modules/entities/class/EntityControler.php b/modules/entities/class/EntityControler.php
index 570e8383deb..425a70c7d9c 100755
--- a/modules/entities/class/EntityControler.php
+++ b/modules/entities/class/EntityControler.php
@@ -23,7 +23,6 @@
 *
 *
 * @file
-* @author Claire Figueras <dev@maarch.org>
 * @date $date$
 * @version $Revision$
 * @ingroup core
diff --git a/rest/index.php b/rest/index.php
index 9aeb0b4b83d..c7075e4a634 100755
--- a/rest/index.php
+++ b/rest/index.php
@@ -201,7 +201,6 @@ $app->get('/listinstance/{id}', \Entity\controllers\ListInstanceController::clas
 $app->get('/res/{resId}/listinstance', \Entity\controllers\ListInstanceController::class . ':getListByResId');
 $app->get('/res/{resId}/visaCircuit', \Entity\controllers\ListInstanceController::class . ':getVisaCircuitByResId');
 $app->get('/res/{resId}/avisCircuit', \Entity\controllers\ListInstanceController::class . ':getAvisCircuitByResId');
-$app->get('/listinstances/dest/itemId/{itemId}', \Entity\controllers\ListInstanceController::class . ':getListWhereUserIsDest');
 $app->put('/listinstances', \Entity\controllers\ListInstanceController::class . ':update');
 
 //ListTemplates
@@ -210,7 +209,6 @@ $app->post('/listTemplates', \Entity\controllers\ListTemplateController::class .
 $app->get('/listTemplates/{id}', \Entity\controllers\ListTemplateController::class . ':getById');
 $app->put('/listTemplates/{id}', \Entity\controllers\ListTemplateController::class . ':update');
 $app->delete('/listTemplates/{id}', \Entity\controllers\ListTemplateController::class . ':delete');
-$app->get('/listTemplates/entityDest/itemId/{itemId}', \Entity\controllers\ListTemplateController::class . ':getByUserWithEntityDest');
 $app->put('/listTemplates/entityDest/itemId/{itemId}', \Entity\controllers\ListTemplateController::class . ':updateByUserWithEntityDest');
 $app->get('/listTemplates/types/{typeId}/roles', \Entity\controllers\ListTemplateController::class . ':getTypeRoles');
 $app->put('/listTemplates/types/{typeId}/roles', \Entity\controllers\ListTemplateController::class . ':updateTypeRoles');
@@ -300,13 +298,14 @@ $app->get('/administration/templates/new', \Template\controllers\TemplateControl
 //Users
 $app->get('/users', \User\controllers\UserController::class . ':get');
 $app->post('/users', \User\controllers\UserController::class . ':create');
-$app->get('/users/{id}/details', \User\controllers\UserController::class . ':getDetailledById');
 $app->put('/users/{id}', \User\controllers\UserController::class . ':update');
+$app->delete('/users/{id}', \User\controllers\UserController::class . ':delete');
+$app->get('/users/{id}/isDeletable', \User\controllers\UserController::class . ':isDeletable');
+$app->get('/users/{id}/details', \User\controllers\UserController::class . ':getDetailledById');
 $app->put('/users/{id}/password', \User\controllers\UserController::class . ':resetPassword');
 $app->get('/users/{userId}/status', \User\controllers\UserController::class . ':getStatusByUserId');
 $app->put('/users/{id}/status', \User\controllers\UserController::class . ':updateStatus');
 $app->put('/users/{id}/maarchParapheur', \User\controllers\UserController::class . ':sendToMaarchParapheur');
-$app->delete('/users/{id}', \User\controllers\UserController::class . ':delete');
 $app->post('/users/{id}/groups', \User\controllers\UserController::class . ':addGroup');
 $app->put('/users/{id}/groups/{groupId}', \User\controllers\UserController::class . ':updateGroup');
 $app->delete('/users/{id}/groups/{groupId}', \User\controllers\UserController::class . ':deleteGroup');
diff --git a/src/app/entity/controllers/ListInstanceController.php b/src/app/entity/controllers/ListInstanceController.php
index 0ab30cbe222..70af8e8ae86 100755
--- a/src/app/entity/controllers/ListInstanceController.php
+++ b/src/app/entity/controllers/ListInstanceController.php
@@ -75,35 +75,6 @@ class ListInstanceController
         return $response->withJson($listinstances);
     }
 
-    public function getListWhereUserIsDest(Request $request, Response $response, array $aArgs)
-    {
-        if (!ServiceModel::hasService(['id' => 'admin_users', 'userId' => $GLOBALS['userId'], 'location' => 'apps', 'type' => 'admin'])) {
-            return $response->withStatus(403)->withJson(['errors' => 'Service forbidden']);
-        }
-        
-        $data = ListInstanceModel::getListWhereUserIsDest(['select' => ['li.*'], 'id' => $aArgs['itemId']]);
-
-        $listinstances = [];
-
-        if (!empty($data)) {
-            $res_id = 0;
-            $array = [];
-            foreach ($data as $value) {
-                if ($res_id == 0) {
-                    $res_id = $value['res_id'];
-                } elseif ($res_id != $value['res_id']) {
-                    $listinstances[] = ['resId' => $res_id, "listinstances" => $array];
-                    $res_id = $value['res_id'];
-                    $array = [];
-                }
-                $array[] = $value;
-            }
-            $listinstances[] = ['resId' => $res_id, "listinstances" => $array];
-        }
-            
-        return $response->withJson($listinstances);
-    }
-
     public function update(Request $request, Response $response)
     {
         $data = $request->getParams();
diff --git a/src/app/entity/controllers/ListTemplateController.php b/src/app/entity/controllers/ListTemplateController.php
index d837bdb33b2..d65586a9905 100755
--- a/src/app/entity/controllers/ListTemplateController.php
+++ b/src/app/entity/controllers/ListTemplateController.php
@@ -257,17 +257,6 @@ class ListTemplateController
         return $response->withJson(['success' => 'success']);
     }
 
-    public function getByUserWithEntityDest(Request $request, Response $response, array $aArgs)
-    {
-        $listTemplates = ListTemplateModel::get([
-            'select'    => ['object_id', 'title'],
-            'where'     => ['item_id = ?', 'object_type = ?', 'item_mode = ?'],
-            'data'      => [$aArgs['itemId'], 'entity_id', 'dest']
-        ]);
-
-        return $response->withJson(['listTemplates' => $listTemplates]);
-    }
-
     public function updateByUserWithEntityDest(Request $request, Response $response)
     {
         if (!ServiceModel::hasService(['id' => 'admin_users', 'userId' => $GLOBALS['userId'], 'location' => 'apps', 'type' => 'admin'])) {
@@ -330,7 +319,7 @@ class ListTemplateController
             $roles[$key]['usedIn'] = [];
             $listTemplates = ListTemplateModel::get(['select' => ['object_id'], 'where' => ['object_type = ?', 'item_mode = ?'], 'data' => [$aArgs['typeId'], $roles[$key]['id']]]);
             foreach ($listTemplates as $listTemplate) {
-                $entity = entitymodel::getByEntityId(['select' => ['short_label'], 'entityId' => $listTemplate['object_id']]);
+                $entity = Entitymodel::getByEntityId(['select' => ['short_label'], 'entityId' => $listTemplate['object_id']]);
                 $roles[$key]['usedIn'][] = $entity['short_label'];
             }
         }
diff --git a/src/app/entity/models/EntityModelAbstract.php b/src/app/entity/models/EntityModelAbstract.php
index 9475e1d1825..acdb9f9425e 100755
--- a/src/app/entity/models/EntityModelAbstract.php
+++ b/src/app/entity/models/EntityModelAbstract.php
@@ -247,14 +247,22 @@ abstract class EntityModelAbstract
         return $entities;
     }
 
-    public static function getAllEntitiesByUserId(array $aArgs = [])
+    public static function getAllEntitiesByUserId(array $aArgs)
     {
         ValidatorModel::notEmpty($aArgs, ['userId']);
         ValidatorModel::stringType($aArgs, ['userId']);
 
-        $aReturn = UserModel::getEntitiesById(['userId' => $aArgs['userId']]);
-
         $entities = [];
+
+        if ($aArgs['userId'] == 'superadmin') {
+            $rawEntities = EntityModel::get(['select' => ['entity_id'], 'where' => ['enabled = ?'], 'data' => ['Y']]);
+            foreach ($rawEntities as $value) {
+                $entities[] = $value['entity_id'];
+            }
+            return $entities;
+        }
+
+        $aReturn = UserModel::getEntitiesById(['userId' => $aArgs['userId']]);
         foreach ($aReturn as $value) {
             $entities = array_merge($entities, EntityModel::getEntityChildren(['entityId' => $value['entity_id']]));
         }
diff --git a/src/app/entity/models/ListInstanceModelAbstract.php b/src/app/entity/models/ListInstanceModelAbstract.php
index b610ae22d71..73712f4ac91 100755
--- a/src/app/entity/models/ListInstanceModelAbstract.php
+++ b/src/app/entity/models/ListInstanceModelAbstract.php
@@ -205,21 +205,20 @@ abstract class ListInstanceModelAbstract
         return $aListInstances;
     }
 
-    public static function getListWhereUserIsDest(array $aArgs)
+    public static function getWhenOpenMailsByLogin(array $aArgs)
     {
-        ValidatorModel::notEmpty($aArgs, ['id']);
-        ValidatorModel::stringType($aArgs, ['id']);
+        ValidatorModel::notEmpty($aArgs, ['login', 'itemMode']);
+        ValidatorModel::stringType($aArgs, ['login', 'itemMode']);
         ValidatorModel::arrayType($aArgs, ['select']);
 
-        $aListinstance = DatabaseModel::select([
+        $listInstances = DatabaseModel::select([
             'select'    => empty($aArgs['select']) ? ['*'] : $aArgs['select'],
-            'table'     => ['listinstance li', 'res_letterbox res', 'mlb_coll_ext mlb'],
-            'left_join' => ['li.res_id = res.res_id', 'res.res_id = mlb.res_id'],
-            'where'     => ['res.dest_user = ?', 'li.difflist_type = ?', 'mlb.closing_date is null', 'res.status not in (?)'],
-            'data'      => [$aArgs['id'], 'entity_id', ['END', 'DEL']],
-            'order_by'  => ['res_id ASC']
+            'table'     => ['listinstance', 'res_letterbox', 'mlb_coll_ext'],
+            'left_join' => ['listinstance.res_id = res_letterbox.res_id', 'res_letterbox.res_id = mlb_coll_ext.res_id'],
+            'where'     => ['listinstance.item_id = ?', 'listinstance.difflist_type = ?', 'listinstance.item_type = ?', 'listinstance.item_mode = ?', 'mlb_coll_ext.closing_date is null', 'res_letterbox.status != ?'],
+            'data'      => [$aArgs['login'], 'entity_id', 'user_id', $aArgs['itemMode'], 'DEL']
         ]);
 
-        return $aListinstance;
+        return $listInstances;
     }
 }
diff --git a/src/app/user/controllers/UserController.php b/src/app/user/controllers/UserController.php
index 8f78b4d7e43..8ba9b81801b 100755
--- a/src/app/user/controllers/UserController.php
+++ b/src/app/user/controllers/UserController.php
@@ -28,6 +28,7 @@ use History\controllers\HistoryController;
 use History\models\HistoryModel;
 use Notification\controllers\NotificationsEventsController;
 use Parameter\models\ParameterModel;
+use Resource\controllers\ResController;
 use Resource\models\ResModel;
 use Respect\Validation\Validator;
 use Slim\Http\Request;
@@ -256,6 +257,77 @@ class UserController
         return $response->withJson(['success' => 'success']);
     }
 
+    public function isDeletable(Request $request, Response $response, array $aArgs)
+    {
+        $error = $this->hasUsersRights(['id' => $aArgs['id'], 'delete' => true, 'himself' => true]);
+        if (!empty($error['error'])) {
+            return $response->withStatus($error['status'])->withJson(['errors' => $error['error']]);
+        }
+
+        $user = UserModel::getById(['id' => $aArgs['id'], 'select' => ['firstname', 'lastname', 'user_id']]);
+
+        $isListInstanceDeletable = true;
+        $isListTemplateDeletable = true;
+
+        $listInstanceEntities = [];
+        $listInstanceResIds = [];
+        $listInstances = ListInstanceModel::getWhenOpenMailsByLogin(['select' => ['listinstance.res_id', 'res_letterbox.destination'], 'login' => $user['user_id'], 'itemMode' => 'dest']);
+        foreach ($listInstances as $listInstance) {
+            if (!ResController::hasRightByResId(['resId' => $listInstance['res_id'], 'userId' => $GLOBALS['userId']])) {
+                $isListInstanceDeletable = false;
+            }
+            $listInstanceResIds[] = $listInstance['res_id'];
+            $listInstanceEntities[] = $listInstance['destination'];
+        }
+
+        $listTemplateEntities = [];
+        $listTemplates = ListTemplateModel::get([
+            'select'    => ['object_id', 'title'],
+            'where'     => ['item_id = ?', 'object_type = ?', 'item_mode = ?', 'item_type = ?'],
+            'data'      => [$user['user_id'], 'entity_id', 'dest', 'user_id']
+        ]);
+        $allEntities = EntityModel::getAllEntitiesByUserId(['userId' => $GLOBALS['userId']]);
+        foreach ($listTemplates as $listTemplate) {
+            if (!in_array($listTemplate['object_id'], $allEntities)) {
+                $isListTemplateDeletable = false;
+            }
+            $listTemplateEntities[] = $listTemplate['object_id'];
+        }
+
+        if (!$isListInstanceDeletable || !$isListTemplateDeletable) {
+            $formattedLIEntities = [];
+            $listInstanceEntities = array_unique($listInstanceEntities);
+            foreach ($listInstanceEntities as $listInstanceEntity) {
+                $entity = Entitymodel::getByEntityId(['select' => ['short_label'], 'entityId' => $listInstanceEntity]);
+                $formattedLIEntities[] = $entity['short_label'];
+            }
+            $formattedLTEntities = [];
+            $listTemplateEntities = array_unique($listTemplateEntities);
+            foreach ($listTemplateEntities as $listTemplateEntity) {
+                $entity = Entitymodel::getByEntityId(['select' => ['short_label'], 'entityId' => $listTemplateEntity]);
+                $formattedLTEntities[] = $entity['short_label'];
+            }
+
+            return $response->withJson(['isDeletable' => false, 'listInstanceEntities' => $formattedLIEntities, 'listTemplateEntities' => $formattedLTEntities]);
+        }
+
+        $listInstances = [];
+        foreach ($listInstanceResIds as $listInstanceResId) {
+            $rawListInstances = ListInstanceModel::get([
+                'select'    => ['*'],
+                'where'     => ['res_id = ?', 'difflist_type = ?'],
+                'data'      => [$listInstanceResId, 'entity_id'],
+                'orderBy'   => ['listinstance_id']
+            ]);
+            $listInstances[] = [
+                'resId'         => $listInstanceResId,
+                'listInstances' => $rawListInstances
+            ];
+        }
+
+        return $response->withJson(['isDeletable' => true, 'listTemplates' => $listTemplates, 'listInstances' => $listInstances]);
+    }
+
     public function delete(Request $request, Response $response, array $aArgs)
     {
         $error = $this->hasUsersRights(['id' => $aArgs['id'], 'delete' => true, 'himself' => true]);
-- 
GitLab