From 41226fad9f66b7b333afdecf2053c60fa4d90edd Mon Sep 17 00:00:00 2001
From: Damien <damien.burel@maarch.org>
Date: Thu, 19 Apr 2018 16:12:23 +0200
Subject: [PATCH] FEAT #310 Reactivate deleted user

---
 .../user-administration.component.ts          | 29 +++++++++---
 .../js/angular/lang/lang-en.ts                |  1 +
 .../js/angular/lang/lang-fr.ts                |  1 +
 apps/maarch_entreprise/lang/en.php            | 18 -------
 apps/maarch_entreprise/lang/fr.php            | 18 -------
 rest/index.php                                |  1 +
 src/app/user/controllers/UserController.php   | 47 +++++++++++++++++--
 src/core/lang/lang-en.php                     |  4 ++
 src/core/lang/lang-fr.php                     |  4 ++
 9 files changed, 78 insertions(+), 45 deletions(-)

diff --git a/apps/maarch_entreprise/js/angular/app/administration/user-administration.component.ts b/apps/maarch_entreprise/js/angular/app/administration/user-administration.component.ts
index f2e3be74f97..495987a114a 100644
--- a/apps/maarch_entreprise/js/angular/app/administration/user-administration.component.ts
+++ b/apps/maarch_entreprise/js/angular/app/administration/user-administration.component.ts
@@ -480,18 +480,35 @@ export class UserAdministrationComponent extends AutoCompletePlugin implements O
 
     onSubmit() {
         if (this.creationMode) {
-            this.http.post(this.coreUrl + "rest/users", this.user)
+            var r = true;
+
+            this.http.get(this.coreUrl + "rest/users/" + this.user.userId + "/status")
                 .subscribe((data: any) => {
-                    this.notify.success(this.lang.userAdded);
-                    this.router.navigate(["/administration/users/" + data.user.id]);
-                }, (err) => {
-                    this.notify.error(err.error.errors);
+                    var deletedUser = false;
+                    if (data.status && data.status == 'DEL') {
+                        r = confirm(this.lang.reactivateUserDeleted);
+                        deletedUser = true;
+                    }
+                    if (r) {
+                        this.http.post(this.coreUrl + "rest/users", this.user)
+                            .subscribe((data: any) => {
+                                if (deletedUser) {
+                                    this.notify.success(this.lang.userUpdated);
+                                } else {
+                                    this.notify.success(this.lang.userAdded);
+                                }
+                                this.router.navigate(["/administration/users/" + data.user.id]);
+                            }, (err: any) => {
+                                this.notify.error(err.error.errors);
+                            });
+                    }
+                }, () => {
                 });
         } else {
             this.http.put(this.coreUrl + "rest/users/" + this.serialId, this.user)
                 .subscribe((data: any) => {
                     this.notify.success(this.lang.userUpdated);
-                }, (err) => {
+                }, (err: any) => {
                     this.notify.error(err.error.errors);
                 });
         }
diff --git a/apps/maarch_entreprise/js/angular/lang/lang-en.ts b/apps/maarch_entreprise/js/angular/lang/lang-en.ts
index 484e5c1c4e0..fa64692e314 100755
--- a/apps/maarch_entreprise/js/angular/lang/lang-en.ts
+++ b/apps/maarch_entreprise/js/angular/lang/lang-en.ts
@@ -264,6 +264,7 @@ export const LANG_EN = {
     "record"                            : "element(s)",
     "records"                           : "result(s)",
     "reaffectUserRedirect"              : "Reaffect to user (diffusion list + diffusion model entity)",
+    "reactivateUserDeleted"             : "The id filled is linked to a deleted user. Voulez-vous le réactiver ?",
     "recordsPerPage"                    : "result per page",
     "redirectBasket"                    : "Redirect basket",
     "redirectConfidentialInfo"          : "This user has confidentials documents linked to this service.<br/>You could link to an other user in this service.",
diff --git a/apps/maarch_entreprise/js/angular/lang/lang-fr.ts b/apps/maarch_entreprise/js/angular/lang/lang-fr.ts
index 921480f0f5e..08180d73318 100755
--- a/apps/maarch_entreprise/js/angular/lang/lang-fr.ts
+++ b/apps/maarch_entreprise/js/angular/lang/lang-fr.ts
@@ -329,6 +329,7 @@ export const LANG_FR = {
     "processType"                       : "Type de traitement",
     "pswReseted"                        : "Mot de passe réinitialisé",
     "reaffectUserRedirect"              : "Réaffecter à l'utilisateur (liste de diffusion + modèle de l'entité)",
+    "reactivateUserDeleted"             : "L'identifiant renseigné est attribué à un utilisateur supprimé. Voulez-vous le réactiver ?",
     "reassign"                          : "Réassigner",
     "record"                            : "élément(s)",
     "records"                           : "résultats",
diff --git a/apps/maarch_entreprise/lang/en.php b/apps/maarch_entreprise/lang/en.php
index 6176f1ef2ef..9120df643ba 100755
--- a/apps/maarch_entreprise/lang/en.php
+++ b/apps/maarch_entreprise/lang/en.php
@@ -1452,30 +1452,12 @@ if (!defined('_AUTORIZED_USER')) {
 if (!defined('_SUSPENDED_USER')) {
     define('_SUSPENDED_USER', 'Suspended user');
 }
-if (!defined('_DELETED_USER')) {
-    define('_DELETED_USER', 'Deleted user');
-}
-if (!defined('_USER_DELETION')) {
-    define('_USER_DELETION', 'User deletion');
-}
 if (!defined('_USER_AUTORIZATION')) {
     define('_USER_AUTORIZATION', 'User authorization');
 }
 if (!defined('_USER_SUSPENSION')) {
     define('_USER_SUSPENSION', 'User suspension');
 }
-if (!defined('_USER_UPDATED')) {
-    define('_USER_UPDATED', 'Modified user');
-}
-if (!defined('_USER_UPDATE')) {
-    define('_USER_UPDATE', 'User modification');
-}
-if (!defined('_USER_ADDED')) {
-    define('_USER_ADDED', 'New added user');
-}
-if (!defined('_NO_PRIMARY_GROUP')) {
-    define('_NO_PRIMARY_GROUP', 'No primary group is selected !');
-}
 if (!defined('_THE_USER')) {
     define('_THE_USER', 'The user ');
 }
diff --git a/apps/maarch_entreprise/lang/fr.php b/apps/maarch_entreprise/lang/fr.php
index 675e0533a66..8c5f00c5290 100755
--- a/apps/maarch_entreprise/lang/fr.php
+++ b/apps/maarch_entreprise/lang/fr.php
@@ -1460,30 +1460,12 @@ if (!defined('_EMPTY_PSW')) {
 if (!defined('_AUTORIZED_USER')) {
     define('_AUTORIZED_USER', 'Utilisateur autorisé');
 }
-if (!defined('_SUSPENDED_USER')) {
-    define('_SUSPENDED_USER', 'Utilisateur suspendu');
-}
-if (!defined('_DELETED_USER')) {
-    define('_DELETED_USER', 'Utilisateur supprimé');
-}
-if (!defined('_USER_DELETION')) {
-    define('_USER_DELETION', "Suppression de l'utilisateur");
-}
 if (!defined('_USER_AUTORIZATION')) {
     define('_USER_AUTORIZATION', "Autorisation de l'utilisateur");
 }
 if (!defined('_USER_SUSPENSION')) {
     define('_USER_SUSPENSION', "Suspension de l'utilisateur");
 }
-if (!defined('_USER_UPDATED')) {
-    define('_USER_UPDATED', 'Utilisateur modifié');
-}
-if (!defined('_USER_UPDATE')) {
-    define('_USER_UPDATE', "Modification d'un utilisateur");
-}
-if (!defined('_USER_ADDED')) {
-    define('_USER_ADDED', 'Nouvel utilisateur ajouté');
-}
 if (!defined('_NO_PRIMARY_GROUP')) {
     define('_NO_PRIMARY_GROUP', 'Aucun groupe primaire sélectionné !');
 }
diff --git a/rest/index.php b/rest/index.php
index a9a906f3dc5..89f3fe8ea71 100755
--- a/rest/index.php
+++ b/rest/index.php
@@ -264,6 +264,7 @@ $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->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->delete('/users/{id}', \User\controllers\UserController::class . ':delete');
 $app->post('/users/{id}/groups', \User\controllers\UserController::class . ':addGroup');
diff --git a/src/app/user/controllers/UserController.php b/src/app/user/controllers/UserController.php
index 16fe2888837..dd910f77c51 100644
--- a/src/app/user/controllers/UserController.php
+++ b/src/app/user/controllers/UserController.php
@@ -128,9 +128,15 @@ class UserController
             return $response->withStatus(400)->withJson(['errors' => 'Bad Request']);
         }
 
-        $existingUser = UserModel::getByUserId(['userId' => $data['userId'], 'select' => ['1']]);
-        if (!empty($existingUser)) {
-            return $response->withStatus(400)->withJson(['errors' => _ID . ' ' . _ALREADY_EXISTS]);
+        $existingUser = UserModel::getByUserId(['userId' => $data['userId'], 'select' => ['id', 'status']]);
+        if (!empty($existingUser) && $existingUser['status'] == 'DEL') {
+            UserModel::updateStatus(['id' => $existingUser['id'], 'status' => 'OK']);
+            $data['enabled'] = 'Y';
+            UserModel::update(['id' => $existingUser['id'], 'user' => $data]);
+
+            return $response->withJson(['user' => $existingUser]);
+        } elseif (!empty($existingUser)) {
+            return $response->withStatus(400)->withJson(['errors' => _USER_ID_ALREADY_EXISTS]);
         }
 
         $logingModes = ['standard', 'restMode'];
@@ -153,6 +159,14 @@ class UserController
             }
         }
 
+        HistoryController::add([
+            'tableName'    => 'users',
+            'recordId'     => $GLOBALS['userId'],
+            'eventType'    => 'ADD',
+            'eventId'      => 'userCreation',
+            'info'         => _USER_CREATED . " {$data['userId']}"
+        ]);
+
         return $response->withJson(['user' => $newUser]);
     }
 
@@ -186,6 +200,14 @@ class UserController
             }
         }
 
+        HistoryController::add([
+            'tableName'    => 'users',
+            'recordId'     => $GLOBALS['userId'],
+            'eventType'    => 'ADD',
+            'eventId'      => 'userCreation',
+            'info'         => _USER_UPDATED . " {$data['user_id']}"
+        ]);
+
         return $response->withJson(['success' => 'success']);
     }
 
@@ -198,6 +220,14 @@ class UserController
 
         UserModel::delete(['id' => $aArgs['id']]);
 
+        HistoryController::add([
+            'tableName'    => 'users',
+            'recordId'     => $GLOBALS['userId'],
+            'eventType'    => 'ADD',
+            'eventId'      => 'userCreation',
+            'info'         => _USER_DELETED . " {$aArgs['id']}"
+        ]);
+
         return $response->withJson(['success' => 'success']);
     }
 
@@ -384,6 +414,17 @@ class UserController
         ]);
     }
 
+    public function getStatusByUserId(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']);
+        }
+
+        $user = UserModel::getByUserId(['userId' => $aArgs['userId'], 'select' => ['status']]);
+
+        return $response->withJson(['status' => $user['status']]);
+    }
+
     public function updateStatus(Request $request, Response $response, array $aArgs)
     {
         $error = $this->hasUsersRights(['id' => $aArgs['id'], 'himself' => true]);
diff --git a/src/core/lang/lang-en.php b/src/core/lang/lang-en.php
index 235411e66db..83d8ea51deb 100644
--- a/src/core/lang/lang-en.php
+++ b/src/core/lang/lang-en.php
@@ -65,6 +65,10 @@ define('_STATUS_NOT_FOUND', 'Status not found');
 define('_TO_CC', 'On copy');
 define('_TO_SIGN', 'For signature');
 define('_UPDATE_STATUS', 'Status update');
+define('_USER_ID_ALREADY_EXISTS', 'The user id already exists');
+define('_USER_CREATED', 'User added');
+define('_USER_UPDATED', 'User updated');
+define('_USER_DELETED', 'User deleted');
 define('_USER_GROUP_CREATION', 'Group added for user');
 define('_USER_GROUP_MODIFICATION', 'Group updated for user');
 define('_USER_GROUP_SUPPRESSION', 'Group deleted for user');
diff --git a/src/core/lang/lang-fr.php b/src/core/lang/lang-fr.php
index d03ca028233..d8e3ad5979f 100644
--- a/src/core/lang/lang-fr.php
+++ b/src/core/lang/lang-fr.php
@@ -65,6 +65,10 @@ define('_STATUS_NOT_FOUND', 'Statut introuvable');
 define('_TO_CC', 'En copie');
 define('_TO_SIGN', 'Pour signature');
 define('_UPDATE_STATUS', 'Modification du statut');
+define('_USER_ID_ALREADY_EXISTS', 'L\'identifiant utilisateur existe déjà');
+define('_USER_CREATED', 'Utilisateur ajouté');
+define('_USER_UPDATED', 'Utilisateur modifié');
+define('_USER_DELETED', 'Utilisateur supprimé');
 define('_USER_GROUP_CREATION', 'Groupe ajouté pour utilisateur');
 define('_USER_GROUP_MODIFICATION', 'Groupe modifié pour utilisateur');
 define('_USER_GROUP_SUPPRESSION', 'Groupe supprimé pour utilisateur');
-- 
GitLab