diff --git a/CHANGES.txt b/CHANGES.txt index 8d5cf88..f42ac14 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -119,6 +119,10 @@ Outre ces changements, voici d'autres changements importants : ------- +01/10/2020 v4.103.22-3.7.9 (EP) + - (i) Ajout règles validation pour responsabilités attribuées à un User + +------- 30/09/2020 v4.103.21-3.7.9 (EP) - (b) bugfix TESTS - (b) bugfix "double responsabilité par défaut" => ajout des champs "est responsable du groupe métier/thématique" pour éviter ça diff --git a/README.md b/README.md index 1e38985..fad48ba 100644 --- a/README.md +++ b/README.md @@ -42,8 +42,8 @@ Logiciel testé et validé sur les configurations suivantes : -------------------------------------------------------------------------------------------- -Date: 30/09/2020 -Version: 4.103.21-3.7.9 +Date: 01/10/2020 +Version: 4.103.22-3.7.9 HISTORIQUE DES CHANGEMENTS DE VERSION : voir le fichier CHANGES.txt (ou la page web /pages/changes) diff --git a/src/Controller/UsersController.php b/src/Controller/UsersController.php index e342101..6e9a7e5 100755 --- a/src/Controller/UsersController.php +++ b/src/Controller/UsersController.php @@ -406,6 +406,7 @@ class UsersController extends AppController 'sur_categorie_id' => '1' */ $user = $this->Users->patchEntity($user, $this->request->getData()); + //debug($user); exit; if ($this->Users->save($user)) { $this->Flash->success(__("L'utilisateur a bien été modifié")); return $this->redirect([ diff --git a/src/Model/Table/MaterielsTable.php b/src/Model/Table/MaterielsTable.php index 7c047c2..22b2e2f 100755 --- a/src/Model/Table/MaterielsTable.php +++ b/src/Model/Table/MaterielsTable.php @@ -518,6 +518,7 @@ class MaterielsTable extends AppTable */ public function buildRules(RulesChecker $rules) //: RulesChecker { + //$configuration = TableRegistry::get('Configurations')->find() /* $configuration = TableRegistry::getTableLocator()->get('Configurations')->find() @@ -527,8 +528,8 @@ class MaterielsTable extends AppTable */ //$this->config = TableRegistry::getTableLocator()->get('Configurations')->get(1); $this->config = TableRegistry::getTableLocator()->get('Configurations')->find()->first(); - - //debug($this->config); + + // 1) Définition de nos propres règles de gestion /* * CONTROLE de la cohérence des champs materiel_administratif et materiel_technique @@ -623,6 +624,9 @@ class MaterielsTable extends AppTable */ }; + + // 2) Activation des règles de gestion + /* $rules->add($checkAtLeastOneChecked, [ 'errorField' => 'materiel_administratif', diff --git a/src/Model/Table/UsersTable.php b/src/Model/Table/UsersTable.php index a4bce2d..b56058c 100755 --- a/src/Model/Table/UsersTable.php +++ b/src/Model/Table/UsersTable.php @@ -80,11 +80,15 @@ class UsersTable extends AppTable $validator->allowEmpty('password'); + /* $configuration = TableRegistry::get('Configurations')->find() ->where([ 'id =' => 1 ]) - ->first(); + ->first(); + */ + $configuration = TableRegistry::getTableLocator()->get('Configurations')->find()->first(); + //$this->config = TableRegistry::getTableLocator()->get('Configurations')->find()->first(); if ($configuration->ldap_used) { $validator->allowEmpty('email'); } else { @@ -114,31 +118,106 @@ class UsersTable extends AppTable */ public function buildRules(RulesChecker $rules) { + + // 1) Définition de nos propres règles de gestion + + // Il doit y avoir cohérence entre le profil "Responsable" et la responsabilité des groupes métier et/ou thématique : + // - (a) Si une responsabilité est cochée, un groupe doit être choisi + $checkGroupSelectedIfResponsibilityChecked = function ($entity) { + foreach (['groupes_metier','groupes_thematique'] as $group_name) { + $f_group_resp_name = 'is_resp_'.$group_name; + $f_group_fk_name = $group_name.'_id'; + if ($entity->$f_group_resp_name && !$entity->$f_group_fk_name) return false; + } + return true; + }; + // - (b) Si le profil choisi est "Responsable", la responsabilité d'au moins 1 groupe doit être cochée + $checkResponsableHasResponsibilities = function ($entity) { + if ($entity->role == "Responsable") + return ($entity->is_resp_groupes_metier || $entity->is_resp_groupes_thematique); + return true; + }; + // - (c) Si la responsabilité d'au moins 1 groupe est cochée, le profil choisi ne doit pas être "Utilisateur" (mais "Responsable" ou plus) + $checkResponsibilitiesNotGivenToUtilisateur = function ($entity) { + if ($entity->is_resp_groupes_metier || $entity->is_resp_groupes_thematique) + return ($entity->role != "Utilisateur"); + return true; + }; + + + // 2) Activation des règles de gestion + $rules->add($rules->isUnique([ 'username' ])); // $rules->add($rules->isUnique(['email'])); $rules->add($rules->existsIn([ - 'groupes_metier_id' - ], 'GroupesMetiers')); + 'sur_categorie_id' + ], 'SurCategories')); - $rules->add($rules->existsIn( - ['groupes_thematique_id'], - 'GroupesThematiques' + + /* + * Règles sur la responsabilité des groupes métier ou/et thématique + * + */ + + // a) Les groupes métier et thématique doivent exister dans la BD + $rules->add( + $rules->existsIn(['groupes_metier_id'], 'GroupesMetiers') + ); + + $rules->add( + $rules->existsIn(['groupes_thematique_id'], 'GroupesThematiques') /* + [ + 'allowNullableNulls' => true, + 'allowMultipleNulls' => false + ] + */ + ); + + // b) Cohérence de la responsabilité + /* Définition d'une closure directe, mais pb on peut pas la réutiliser + $rules->add( + function ($entity, $options) { + foreach (['groupes_metier','groupes_thematique'] as $group_name) { + $f_group_resp_name = 'is_resp_'.$group_name; + $f_group_fk_name = $group_name.'_id'; + if ($entity->$f_group_resp_name && !$entity->$f_group_fk_name) return false; + } + return true; + }, + 'checkGroupSelectedIfResponsibilityChecked', [ - 'allowNullableNulls' => true, - 'allowMultipleNulls' => false + 'errorField' => 'is_resp_groupes_thematique', + 'message' => 'Si une responsabilité est cochée, un groupe doit être choisi pour cette responsabilité' ] - */ - )); - - $rules->add($rules->existsIn([ - 'sur_categorie_id' - ], 'SurCategories')); + ); + */ + $rules->add($checkGroupSelectedIfResponsibilityChecked, [ + 'errorField' => 'is_resp_groupes_thematique', + 'message' => "Si une responsabilité est cochée, un groupe doit être choisi pour cette responsabilité" + ]); + $rules->add($checkGroupSelectedIfResponsibilityChecked, [ + 'errorField' => 'is_resp_groupes_metier', + 'message' => "Si une responsabilité est cochée, un groupe doit être choisi pour cette responsabilité" + ]); + $rules->add($checkResponsableHasResponsibilities, [ + 'errorField' => 'role', + 'message' => "Si le rôle est Responsable, il faut cocher au moins une responsabilité" + ]); + $rules->add($checkResponsibilitiesNotGivenToUtilisateur, [ + 'errorField' => 'role', + 'message' => "Si la responsabilité d'au moins 1 groupe est cochée, le rôle ne doit pas être 'Utilisateur' (mais au moins 'Responsable')" + ]); + + //debug($rules);exit; + return $rules; - } + + } // buildRules() + function beforeSave($event, $entity, $options) { diff --git a/src/Template/Pages/tools.ctp b/src/Template/Pages/tools.ctp index b62f0ed..2fa99cb 100755 --- a/src/Template/Pages/tools.ctp +++ b/src/Template/Pages/tools.ctp @@ -100,7 +100,7 @@ if ($role == 'Super Administrateur') : echo '