diff --git a/README.md b/README.md index 4e00cc4..13080ea 100644 --- a/README.md +++ b/README.md @@ -53,16 +53,31 @@ Logiciel testé et validé sur les configurations suivantes : VERSION ACTUELLE -Date: 05/05/2020 -Version: 3.7.9.25 +Date: 07/05/2020 +Version: 3.7.9.26 Author: EP Commentaire: Diverses améliorations, simplifications, refactorisations, optimisations : - - LOG : ajout de messages log sur actions importantes (add, edit, delete, ...) - - SIMPLIFICATION : Suppression des valeurs "N/A" (inutile et pose des problèmes) dans 4 tables : groupes_thematiques, groupes_metiers, sites, et type_documents - => remplacement des liens vers ces champs par NULL dans tables materiels, suivis, emprunts, et documents !!! - - Utilisation __toString() pour afficher une entité rapidement avec echo $entity - - bugfix ACLs isAuthorizedAction() de Materiels => début de généralisation de l'utilisation de cette fonction partout où on a besoin de connaitre les droits d'un user (view, index, ...) + Harmonisation : + - shortcuts dans AppController (donc disponible pour TOUS les controleurs) : + - $this->u = user courant + - $this->e = entité courante + - $this->e_id = id de l'entité courante + - $this->a = action en cours + - $this->c = controleur en cours (?) + - $this->getEntity($id=null) // id=null si matos courant + - harmonisation des noms de méthodes pour MaterielsController : + - $this->isCreated($id=null) // id=null si matos courant + - $this->belongsToUser($username, $id=null) // id=null si matos courant + et $this->belongsToCurrentUser($id=null) // id=null si matos courant + - $this->isSameGroupAsUser($userlogin, $id=null) // id=null si matos courant + et $this->isSameGroupAsCurrentUser($id=null) // // id=null si matos courant + - harmonisation des méthodes dans entité Materiel (Entity) : + - is_created, is_validated, is_tobearchived, is_archived + - belongsToUser($username) // owned or declared by user + - isSameGroupAsUser($usergroup1, $usergroup2) // is same group as user groups + - ... + - poursuite généralisation utilisation de la fonction isAuthorizedAction() partout où on a besoin de connaitre les droits d'un user (view, index, ...) IMPORTANT : - Pour connaitre la version actuelle, taper "./VERSION" diff --git a/src/Controller/AppController.php b/src/Controller/AppController.php index d5322e8..f540679 100755 --- a/src/Controller/AppController.php +++ b/src/Controller/AppController.php @@ -66,15 +66,46 @@ class AppController extends Controller protected $SUPERADMIN_CAN_DO_EVERYTHING = false; // (prod) Par défaut (false), il se comporte un peu comme ADMIN //protected $SUPERADMIN_CAN_DO_EVERYTHING = true; // (dev only) no limit, peut TOUT faire (attention, pas en prod svp !!!) - protected $confLabinvent; - protected $action; - protected $entity; - protected $entity_id; + protected $confLabinvent = null; + + // Le Controleur courant + protected $c = null; + + // L'Action courante + //protected $action = null; + protected $a = null; + + /* La table courante (objet Table) + * + * $t = TableRegistry::getTableLocator()->get('Materiels'); (ou autre entité telle que 'Suivis' par exemple...) + * + */ + protected $t = null; + + /* L'entité courante (objet Entity) + * + * $e = $t->newEntity(); + * ou encore + * $e = $t->get(12); + * ou encore + * $e = $t->find(...)->first(); + * ou encore + * $e = $t->find(...)->last(); + * ... + */ + //protected $entity =null; + protected $e = null; // remplace $entity + + // id de l'entité courante (shortcut pour $this->e->id) + //protected $entity_id = null; + protected $e_id = null; // remplace $entity_id + + // L'utilisateur courant (objet User Entity) // Current (priviledged) USER (if so, otherwise = NULL) from DB (Entity class) //private $CURRENT_PRIVILEDGED_USER = null; - protected $current_user_entity = null; + //protected $current_user_entity = null; + protected $u = null; // remplace $current_user_entity protected $userName = null; - // Current ROLE (by default = "Utilisateur") private $CURRENT_ROLE = null; @@ -386,7 +417,8 @@ class AppController extends Controller /* (EP 20200428) * * Méthode pour optimiser les accès à la BD. - * Retourne l'entité concernée par l'action. + * Retourne l'entité dont l'id est $id (en la mettant en cache pour éviter de la rechercher 2 fois) + * Si $id = null => retourne l'entité courante ($this->e) (entité concernée par l'action en cours) * * Cette méthode ne doit être appelée que lorsque c'est approprié * (actions 'edit', 'view', ..., mais pas 'add', 'find', 'index', ...) @@ -395,37 +427,61 @@ class AppController extends Controller * Optimisation : l'entité n'est récupérée dans la BD qu'une seule fois pour toutes * */ + // PHP7 only + //protected function getEntity($id=null) : Entity { + // PHP>=5 protected function getEntity($id=null) { // Si pas d'id => exception (stop) - //assert($this->entity_id>0); - if (!$this->entity_id && !$id) throw new \Exception(__("cette methode doit etre appelée avec un id déjà positionné !!!")); - - // Si l'entité actuellement en mémoire n'est pas la bonne, la mettre à null pour obliger à la recharger - if ($id && $this->entity && $this->entity->id != $id) $this->entity = null; - - // Les 3 sont possibles - //$model = $this->request->getParam('controller'); // ex: Materiels - //$model = $this->name; // ex: Materiels - $model = $this->modelClass; // ex: Materiels - - /* - debug("model2"); - $model = $this->$model; - debug($model); - */ - - //ex: if (! $this->entity) $this->entity = $this->Materiels->get($this->entity_id); - if (!$this->entity) $this->entity = $this->$model->get($this->entity_id); + //assert($this->e_id>0); + if (!$this->e_id && !$id) throw new \Exception(__("cette methode doit etre appelée avec un id déjà positionné !!!")); + + // Par défaut id = id de l'entité courante + if (is_null($id)) $id = $this->e_id; + + // Si l'entité courante n'est pas la bonne, la mettre à null pour obliger à la recharger + //if ($id && $this->e && $this->e->id!=$id) $this->e = null; + //if ($id && $this->e && $this->e_id!=$id) $this->e = null; + if ($this->e && $this->e_id!=$id) $this->e = null; + + if (!$this->e) { + // Les 3 sont possibles + //$model = $this->request->getParam('controller'); // ex: Materiels + //$model = $this->name; // ex: Materiels + $model = $this->modelClass; // ex: Materiels + /* + debug("model2"); + $model = $this->$model; + debug($model); + */ + //ex: if (! $this->e) $this->e = $this->Materiels->get($this->e_id); + //$this->e = $this->$model->get($this->e_id); + $this->e = $this->$model->get($id); + $this->e_id = $this->e->id; + } /* * Avec les entités associées : - if (! $this->entity) $this->entity = $this->$model->get($this->entity_id, [ + if (! $this->e) $this->e = $this->$model->get($this->e_id, [ 'contain' => ['Comments'] ]); */ - //debug($this->entity); - return $this->entity; + //debug($this->e); + return $this->e; } + + public function getUsersTable() { return TableRegistry::getTableLocator()->get('Users'); } + // Retourne l'entity User qui a le login $userlogin ("epallier") + public function getUserByLogin($userlogin) { + if ($this->u && $this->u->username == $userlogin) return $this->u; + //return $users->find()->where(['username' => $userlogin])->first(); + return $this->getUsersTable()->findByUsername($userlogin); + } + // Retourne l'entity User qui a le nom complet $fullname ("Pallier Etienne") + public function getUserByFullname($fullname) { + if ($this->u && $this->u->nom == $fullname) return $this->u; + //return $users->find()->where(['username' => $userlogin])->first(); + return $this->getUsersTable()->findByNom($fullname); + } /** * (EP) @@ -512,14 +568,14 @@ class AppController extends Controller // error_log($action); //$this->myDebug("- action is $action"); - $this->myDebug("- action is $this->action"); + $this->myDebug("- action is $this->a"); // On autorise ou pas l’action demandée : // - Super-Admin peut accéder à toutes les actions //if ($role == 'Super Administrateur') return true; if ($this->USER_IS_SUPERADMIN) return true; // - Actions générales accessibles à TOUS les roles (profils), pour TOUT controleur - if (in_array($this->action, [ + if (in_array($this->a, [ 'index', 'view', 'add', @@ -564,7 +620,7 @@ class AppController extends Controller } public function getUserEntity($user = null) { //if (! $this->CURRENT_PRIVILEDGED_USER) { - if (! $this->current_user_entity) { + if (! $this->u) { $configuration = $this->confLabinvent; $ldapAuthType = $configuration->ldap_authenticationType; $username = $user ? $user[$ldapAuthType] : $this->LdapAuth->user($ldapAuthType); @@ -575,9 +631,9 @@ class AppController extends Controller ->first(); // ->where(['username' => $this->LdapAuth->user('cn')[0]]) // if (! $priviledgedUser) $priviledgedUser = "Unpriviledged User (not in table utilisateurs)"; - $this->current_user_entity = $priviledgedUser; + $this->u = $priviledgedUser; } - return $this->current_user_entity; + return $this->u; } public function getUserRole($user = null) @@ -804,22 +860,25 @@ class AppController extends Controller // Affichages pour debug //pr($event); $this->myDebug("step 1B (general): AppController.beforeFilter()"); + $controllerName = $this->request->getParam('controller'); $this->myDebug("- controller passed : $controllerName"); + $passedArgs = $this->request->getParam('pass'); $this->myDebug("- args passed : ", $passedArgs); + $query = $this->request->getQueryParams(); $this->myDebug("- query passed : ", $query); // Initialisations pour la suite // - L'entité concernée par l'action // Par défaut null car certaines actions n'ont pas d'entité (ex : 'add', 'find', 'index', ...) - $this->entity = null; + $this->e = null; // - L'action demandée et son id le cas échéant (nul par défaut, égal 0) - $this->action = $this->getActionPassed(); - $this->myDebug("- action passed : ".$this->action); - $this->entity_id = $this->getIdPassed(); - $this->myDebug("- id passed : ".$this->action); + $this->a = $this->getActionPassed(); + $this->myDebug("- action passed : ".$this->a); + $this->e_id = $this->getIdPassed(); + $this->myDebug("- id passed : ".$this->a); parent::beforeFilter($event); @@ -867,11 +926,11 @@ class AppController extends Controller // ATTENTION, $priviledgedUser = NULL si l'utilisateur courant n'est pas un utilisateur privilégié // (c'est à dire s'il n'est pas dans la table "utilisateurs") //$this->priviledgedUser = $this->getTablePriviledgedUserFromCurrentSessionUserIfExists(); - $this->current_user_entity = $this->getTablePriviledgedUserFromCurrentSessionUserIfExists(); + $this->u = $this->getTablePriviledgedUserFromCurrentSessionUserIfExists(); //$role = $this->getUserRole(); $this->userRole = $this->getUserRole(); $profile = self::PROFILES["$this->userRole"]; - $this->myDebug("- priviledgedUser is {$this->current_user_entity}"); + $this->myDebug("- priviledgedUser is {$this->u}"); $this->myDebug("- userRole is {$this->getUserRole()}", "- profile is: $profile"); // L'utilisateur connecté (return null si pas connecté) // $this->Auth->user('id'); @@ -891,7 +950,7 @@ class AppController extends Controller $this->set('role', $this->userRole); $this->set('profile', $profile); $this->set('username', $this->getCurrentUserName()); - $this->set('priviledgedUser', $this->current_user_entity); + $this->set('priviledgedUser', $this->u); $this->set('USER_IS_UTILISATEUR', $this->USER_IS_UTILISATEUR); $this->set('USER_IS_ADMIN', $this->USER_IS_ADMIN); @@ -1197,24 +1256,24 @@ class AppController extends Controller * @todo EP 08/2017 Nouvelle organisation des ACL avec $easyACL */ //$action = $this->getActionPassed(); - if (in_array($this->action, array( + if (in_array($this->a, array( 'add', 'edit', 'view', 'index' ))) { - $hiddenFields = $this->getHiddenFieldsForAction($this->action); + $hiddenFields = $this->getHiddenFieldsForAction($this->a); $this->set('hiddenFields', $hiddenFields); $this->myDebug(compact("hiddenFields")); - if (in_array($this->action, array( + if (in_array($this->a, array( 'add', 'edit' ))) { - $mandatoryFields = $this->getMandatoryFieldsForAction($this->action); + $mandatoryFields = $this->getMandatoryFieldsForAction($this->a); $this->set('mandatoryFields', $mandatoryFields); - $readOnlyFields = $this->getReadOnlyFieldsForAction($this->action); + $readOnlyFields = $this->getReadOnlyFieldsForAction($this->a); $this->set('readOnlyFields', $readOnlyFields); - $haveDefaultValueFields = $this->getDefaultValueFieldsForAction($this->action); + $haveDefaultValueFields = $this->getDefaultValueFieldsForAction($this->a); // only for DEBUG : //$this->myDebug("mandat, ro, default fields=", $mandatoryFields, $readOnlyFields, $haveDefaultValueFields); diff --git a/src/Controller/DocumentsController.php b/src/Controller/DocumentsController.php index 30d7375..5598fd5 100755 --- a/src/Controller/DocumentsController.php +++ b/src/Controller/DocumentsController.php @@ -269,8 +269,9 @@ class DocumentsController extends AppController * @param $IS_ADD: True = add ; False = edit * @return \Cake\Network\Response|void Redirects on successful add/edit, renders view otherwise. */ - private function add_or_edit($IS_ADD, $id=null, $valeurs=null, $erreurs=null) { - + protected function add_or_edit($IS_ADD, $id=null, $valeurs=null, $erreurs=null, + // uniquement à cause de parent::add_or_edit() : + $entity_name=null, array $associated_entities=[], $with_parent=false) { $this->myDebug("step 3: DocumentsController.add_or_edit()"); $document = $IS_ADD ? $this->Documents->newEntity() : $this->Documents->get($id, ['contain' => []]); diff --git a/src/Controller/MaterielsController.php b/src/Controller/MaterielsController.php index 15887fb..e70d5f2 100755 --- a/src/Controller/MaterielsController.php +++ b/src/Controller/MaterielsController.php @@ -6,6 +6,7 @@ use Cake\ORM\TableRegistry; use Cake\Mailer\Email; #use Cake\ORM\Locator\TableLocator; use Cake\Auth\FallbackPasswordHasher; +use App\Model\Entity\Materiel; /** * Materiels Controller @@ -260,28 +261,28 @@ class MaterielsController extends AppController { $this->myDebug("step 2A (specific): MaterielsController.isAuthorized(user)"); $this->myDebug("- user is:", $user); - //$this->current_user_entity = $this->getUserEntity(); - assert($this->current_user_entity != null); - if ($this->current_user_entity == null) throw new \Exception("pas d'utilisateur défini !!!"); + //$this->u = $this->getUserEntity(); + assert($this->u != null); + if ($this->u == null) throw new \Exception("pas d'utilisateur défini !!!"); if ($this->isLabinventDebugMode()) { - debug($this->current_user_entity); + debug($this->u); debug("user is xxx :"); - debug($this->current_user_entity->is_user); - debug($this->current_user_entity->is_resp); - debug($this->current_user_entity->is_admin); - debug($this->current_user_entity->is_adminplus); - debug($this->current_user_entity->is_super); + debug($this->u->is_user); + debug($this->u->is_resp); + debug($this->u->is_admin); + debug($this->u->is_adminplus); + debug($this->u->is_super); debug("user is xxx or more :"); - debug($this->current_user_entity->is_resp_or_more); - debug($this->current_user_entity->is_admin_or_more); + debug($this->u->is_resp_or_more); + debug($this->u->is_admin_or_more); debug("user is xxx or less :"); - debug($this->current_user_entity->is_resp_or_less); - debug($this->current_user_entity->is_admin_or_less); + debug($this->u->is_resp_or_less); + debug($this->u->is_admin_or_less); } @@ -318,7 +319,7 @@ class MaterielsController extends AppController { // $id = (int) $this->request->getParam('pass.0'); //$id = $this->getIdPassed(); - ///$this->entity_id = $this->getIdPassed(); + ///$this->e_id = $this->getIdPassed(); //debug($id); // ACTIONS QUI SONT TOUJOURS AUTORISÉES QUELQUE SOIT LE PROFIL @@ -340,7 +341,7 @@ class MaterielsController extends AppController { return $article->user_id === $user['id']; */ - $id = $this->entity_id; + $id = $this->e_id; /* (EP 20200430 déplacé dans isAuthorizedAction()) // On autorise ou pas l’action demandée : @@ -348,9 +349,9 @@ class MaterielsController extends AppController { // (sauf certaines actions afin de lui donner un comportement proche de ADMIN) if ($this->USER_IS_SUPERADMIN) { // edit ou add by copy => ssi CREATED - if ( $this->action =='edit' || ($this->action=='add' && $id>0) ) return $this->isCreated($id); + if ( $this->a =='edit' || ($this->a=='add' && $id>0) ) return $this->isCreated($id); // archivage => admin only - //if ($this->action == 'statusArchived') return false; + //if ($this->a == 'statusArchived') return false; // tout le reste => ok return true; } @@ -360,12 +361,12 @@ class MaterielsController extends AppController { * //return $this->isAuthorizedAction($this, $user, $role, $action, $id); * Tout le reste en dessous de cette ligne devient inutile !!! */ - $this->myDebug("isAuthorizedAction ? " . $this->isAuthorizedAction2($this, $this->userRole, $this->action, $id, $user)); + $this->myDebug("isAuthorizedAction ? " . $this->isAuthorizedAction2($this, $this->userRole, $this->a, $id, $user)); return $this->isAuthorizedAction(); /* return $this->isAuthorizedAction( $this->userRole, - $this->action, $id, + $this->a, $id, $user, $this->userCname ); @@ -389,13 +390,13 @@ class MaterielsController extends AppController { * */ private function isAuthorizedAction($action = null) { - if (!$action) $action = $this->action; + if (!$action) $action = $this->a; //$id = $this->getIdPassed(); - //debug("action $action, id $this->entity_id"); + //debug("action $action, id $this->e_id"); //return $this->isAuthorizedActionFor($action, $this->getIdPassed(), $this->userRole, $this->userFromSession, $this->userCname); return $this->isAuthorizedActionFor( - $action ? $action : $this->action, - $this->entity_id, + $action ? $action : $this->a, + $this->e_id, $this->userRole, $this->userFromSession, $this->userCname ); @@ -419,7 +420,7 @@ class MaterielsController extends AppController { //$this->myDebug("- user is ", $user); - //debug($this->entity->tititoto()); + //debug($this->e->tititoto()); // Raccourci pour SUPERADMIN : par défaut il a (presque) TOUS les droits, donc c'est vite vu ! // (sauf certaines actions afin de lui donner un comportement proche de ADMIN) if ($this->USER_IS_SUPERADMIN) { @@ -443,14 +444,14 @@ class MaterielsController extends AppController { if ( ($action=='add' && $id>0) || in_array($action,['edit', 'delete', 'statusValidated']) ) { return $this->isCreated($id); } - //if ($this->action==’statusValidated’) return $this->isCreated($id); + //if ($this->a==’statusValidated’) return $this->isCreated($id); if ($action=='statusToBeArchived') return $this->isValidated($id); if ($action=='statusArchived') return $this->isToBeArchived($id); if ($action=='statusCreated') return ! $this->isCreated($id); if ($action=='printLabelRuban') return $this->confLabinvent->hasPrinter && $this->isValidated($id); } // archivage => admin only - //if ($this->action == 'statusArchived') return false; + //if ($this->a == 'statusArchived') return false; // tout le reste => ok return true; } @@ -498,7 +499,10 @@ class MaterielsController extends AppController { //$isHis = $this->isHis($id, $user); //$isHis = $this->isHis($id); $isHis = $this->belongsToCurrentUser($id); - return $role=='Utilisateur' ? $isHis : $isHis||$this->isRespGroup($id, $userCname); + //return $role=='Utilisateur' ? $isHis : $isHis||$this->isRespGroup($id, $userCname); + //return $role=='Utilisateur' ? $isHis : $isHis||$this->isSameGroupAsUser($id, $userCname); + ///////return $role=='Utilisateur' ? $isHis : $isHis||$this->isSameGroupAsUser($userCname, $id); + return $role=='Utilisateur' ? $isHis : $isHis||$this->isSameGroupAsCurrentUser($id); /* if ($role=='Utilisateur') return $isHis; // Responsable @@ -634,9 +638,9 @@ class MaterielsController extends AppController { // if ($action == 'edit') { case 'edit': /S - debug("entity is"); debug($this->entity); + debug("entity is"); debug($this->e); $this->getEntity(); - debug("entity is"); debug($this->entity); + debug("entity is"); debug($this->e); S/ // BETTER: // $id = (int) $this->request->getAttribute('params')['pass'][0]; @@ -752,7 +756,9 @@ class MaterielsController extends AppController { case 'statusCreated': if ($this->isCreated($id)) return FALSE; if ($this->USER_IS_USER()) return FALSE; - if ($this->USER_IS_RESP()) return $this->isRespGroup($id, $userCname); + //if ($this->USER_IS_RESP()) return $this->isSameGroupAsUser($id, $userCname); + /////if ($this->USER_IS_RESP()) return $this->isSameGroupAsUser($userCname, $id); + if ($this->USER_IS_RESP()) return $this->isSameGroupAsCurrentUser($id); return true; // VALIDATION d'un materiel (passe à VALIDATED) @@ -760,7 +766,8 @@ class MaterielsController extends AppController { //$id = (int) $this->request->getAttribute('params')['pass'][0]; if (! $this->isCreated($id)) return FALSE; if ($this->USER_IS_USER()) return FALSE; - if ($this->USER_IS_RESP()) return $this->isRespGroup($id, $userCname); + //if ($this->USER_IS_RESP()) return $this->isSameGroupAsUser($userCname, $id); + if ($this->USER_IS_RESP()) return $this->isSameGroupAsCurrentUser($id); return true; /* @@ -792,7 +799,8 @@ class MaterielsController extends AppController { case 'statusToBeArchived': if (! $this->isValidated($id)) return FALSE; if ($this->USER_IS_USER()) return FALSE; - if ($this->USER_IS_RESP()) return $this->isRespGroup($id, $userCname); + //if ($this->USER_IS_RESP()) return $this->isSameGroupAsUser($userCname, $id); + if ($this->USER_IS_RESP()) return $this->isSameGroupAsCurrentUser($id); return TRUE; /* if ($this->isValidated($id)) @@ -870,11 +878,13 @@ class MaterielsController extends AppController { * cf https://book.cakephp.org/3.0/fr/tutorials-and-examples/blog-auth-example/auth.html */ // True if materiel with id $id is owned by $nomCreateur - public function isOwnedBy($id, $user_name) - { + //public function isOwnedBy($id, $username) + public function belongsToUser($username, $id=null) { + if (is_null($id)) $id = $this->e_id; //$entity = $this->getEntity($id); //return in_array($user_name, [$entity->nom_createur, $entity->nom_responsable]); - return $this->getEntity($id)->isOwnedOrDeclaredByUser($user_name); + //return $this->getEntity($id)->isOwnedOrDeclaredByUser($username); + return $this->getEntity($id)->belongsToUser($username); /* return ($this->Materiels->exists([ 'id' => $id, @@ -887,22 +897,42 @@ class MaterielsController extends AppController { } // True if materiel with id $id is owned by current user + // Par défaut, si $id = null => id du materiel courant //public function isHis($id, $userFromSession) { //public function isHis($matos_id) { - public function belongsToCurrentUser($id) { + public function belongsToCurrentUser($id=null) { + if (is_null($id)) $id = $this->e_id; //return ($this->isOwnedBy($id, $userFromSession['sn'][0] . ' ' . $userFromSession['givenname'][0])); - return $this->isOwnedBy($id, $this->current_user_entity->nom); + //return $this->isOwnedBy($id, $this->u->nom); + return $this->belongsToUser($this->u->nom, $id); } - - public function isRespGroup($id, $loginResponsable) - { + // Par défaut, si $id = null => id du materiel courant + public function isSameGroupAsCurrentUser($id=null) { + if (is_null($id)) $id = $this->e_id; + $u = $this->u; + return $this->isSameGroupAsUser($u->username, $id); + } + + // Par défaut, si $id = null => id du materiel courant + //public function isRespGroup($id, $loginResponsable) + //public function isSameGroupAsUser($id, $loginResponsable) + public function isSameGroupAsUser($userlogin, $id=null) { + if (is_null($id)) $id = $this->e_id; // Get user + if ($this->u && $this->u->username == $userlogin) + $u = $this->u; + else + $u = $this->getUserByLogin($userlogin); + /* $u = TableRegistry::getTableLocator()->get('Users') ->find() - ->where(['username' => $loginResponsable]) + ->where(['username' => $userlogin]) ->first(); + */ + return $this->getEntity($id)->isSameGroupAsUser($u->groupes_metier_id, $u->groupes_thematique_id); + /* OLD WAY // Responsable groupe métier ? $group = 'groupes_metier'; $group_fk = $group.'_id'; @@ -914,15 +944,15 @@ class MaterielsController extends AppController { ->where(['nom =' => 'N/A']) ->first()['id'] ) return $this->getEntity($id)->$group_fk == $u[$group_fk]; - /* + /S return $this->Materiels->exists([ 'id' => $id, 'groupes_metier_id' => $u['groupes_metier_id'] ]); - */ + S/ // Responsable groupe thématique ? - $group = 'groupe_thematique'; + $group = 'groupes_thematique'; $group_fk = $group.'_id'; if ( $u[$group_fk] !== null @@ -932,20 +962,23 @@ class MaterielsController extends AppController { ->where(['nom =' => 'N/A']) ->first()['id'] ) return $this->getEntity($id)->$group_fk == $u[$group_fk]; - /* + /S return $this->Materiels->exists([ 'id' => $id, 'groupes_thematique_id' => $u['groupe_thematique_id'] ]); - */ + S/ // sinon, pas responsable de groupe return false; + */ - } // isRespGroup + } // isSameGroupAsUser (ex isRespGroup) - public function hasStatus($id, $status) { + // $id = id du materiel => si null alors id du materiel courant + public function hasStatus($id=null, $status) { + if (is_null($id)) $id = $this->e_id; return $this->getEntity($id)->status == $status; /* return $this->Materiels->exists([ @@ -954,10 +987,10 @@ class MaterielsController extends AppController { ]); */ } - public function isCreated($id) { return $this->hasStatus($id, 'CREATED'); } - public function isValidated($id) { return $this->hasStatus($id, 'VALIDATED'); } - public function isToBeArchived($id) { return $this->hasStatus($id, 'TOBEARCHIVED'); } - public function isArchived($id) { return $this->hasStatus($id, 'ARCHIVED'); } + public function isCreated($id=null) { return $this->hasStatus($id, 'CREATED'); } + public function isValidated($id=null) { return $this->hasStatus($id, 'VALIDATED'); } + public function isToBeArchived($id=null) { return $this->hasStatus($id, 'TOBEARCHIVED'); } + public function isArchived($id=null) { return $this->hasStatus($id, 'ARCHIVED'); } /** @@ -1097,6 +1130,7 @@ class MaterielsController extends AppController { ]); } // index() + /** * View method * @@ -1134,6 +1168,7 @@ class MaterielsController extends AppController { 'Fournisseurs' ] ]); + $e = $materiel; /* * (EP) TODO: @@ -1151,44 +1186,75 @@ class MaterielsController extends AppController { * */ + /* $IS_CREATED = ($materiel->status == 'CREATED'); $IS_VALIDATED = ($materiel->status == 'VALIDATED'); $IS_TOBEARCHIVED = ($materiel->status == 'TOBEARCHIVED'); $IS_ARCHIVED = ($materiel->status == 'ARCHIVED'); - + */ + $IS_CREATED = $e->is_created; + $IS_VALIDATED = $e->is_validated; + $IS_TOBEARCHIVED = $e->is_tobearchived; + $IS_ARCHIVED = $e->is_archived; + $this->set(compact('IS_CREATED', 'IS_VALIDATED', 'IS_TOBEARCHIVED', 'IS_ARCHIVED')); // Current user is creator or owner of current materiel + /* $USER_IS_CREATOR_OR_OWNER = in_array($this->userName, [ $materiel->nom_createur, $materiel->nom_responsable ]); + */ + //$USER_IS_CREATOR_OR_OWNER = $e->isOwnedOrDeclaredByUser($this->userName); + $USER_IS_CREATOR_OR_OWNER = $e->belongsToUser($this->userName); $this->set(compact('USER_IS_CREATOR_OR_OWNER')); // Current user is same group as current materiel - $USER_IS_SAME_GROUP_AS_MATERIEL = ( + /* + //$USER_IS_SAME_GROUP_AS_MATERIEL = $e->isSameGroupAsUser($user_group_metier_id, $user_group_thematique_id); + $USER_IS_SAME_GROUP_AS_MATERIEL = + ( //( isset($this->priviledgedUser->groupes_metier_id) && $this->priviledgedUser->groupes_metier_id != $this->idGmNa && $materiel->groupes_metier_id == $this->priviledgedUser->groupes_metier_id ) - ( isset($this->current_user_entity->groupes_metier_id) && $this->current_user_entity->groupes_metier_id != $this->idGmNa && $materiel->groupes_metier_id == $this->current_user_entity->groupes_metier_id ) + ( isset($this->u->groupes_metier_id) && $this->u->groupes_metier_id != $this->idGmNa && $materiel->groupes_metier_id == $this->u->groupes_metier_id ) || - ( isset($this->current_user_entity->groupe_thematique_id) && $this->current_user_entity->groupe_thematique_id != $this->idGtNa && $materiel->groupes_thematique_id == $this->current_user_entity->groupe_thematique_id ) + ( isset($this->u->groupe_thematique_id) && $this->u->groupe_thematique_id != $this->idGtNa && $materiel->groupes_thematique_id == $this->u->groupe_thematique_id ) ); + */ + //$USER_IS_SAME_GROUP_AS_MATERIEL = $this->currentMaterielIsSameGroupAsCurrentUser(); + $USER_IS_SAME_GROUP_AS_MATERIEL = $this->isSameGroupAsCurrentUser(); $this->set(compact('USER_IS_SAME_GROUP_AS_MATERIEL')); $USER_IS_RESPONSABLE_AND_SAME_GROUP_AS_MATERIEL = $this->USER_IS_RESPONSABLE && $USER_IS_SAME_GROUP_AS_MATERIEL; $this->set(compact('USER_IS_RESPONSABLE_AND_SAME_GROUP_AS_MATERIEL')); $CONTEXT1 = $this->USER_IS_ADMIN_OR_MORE || $USER_IS_CREATOR_OR_OWNER || $USER_IS_RESPONSABLE_AND_SAME_GROUP_AS_MATERIEL; + + /* $CAN_VALIDATE_OR_INVALIDATE = $this->USER_IS_ADMIN_OR_MORE || ( $materiel->materiel_administratif==0 && $USER_IS_RESPONSABLE_AND_SAME_GROUP_AS_MATERIEL ); $CAN_VALIDATE = $IS_CREATED && $CAN_VALIDATE_OR_INVALIDATE; - - $CAN_INVALIDATE = !$IS_CREATED && $CAN_VALIDATE_OR_INVALIDATE; - $CAN_TBA = $IS_VALIDATED && $CONTEXT1; - $CAN_ARCHIVE = $IS_TOBEARCHIVED && $this->USER_IS_ADMIN_OR_MORE; + */ + $CAN_VALIDATE = $this->isAuthorizedAction('statusValidated'); + //$CAN_INVALIDATE = !$IS_CREATED && $CAN_VALIDATE_OR_INVALIDATE; + $CAN_INVALIDATE = $this->isAuthorizedAction('statusCreated'); + //$CAN_TBA = $IS_VALIDATED && $CONTEXT1; + $CAN_TBA = $this->isAuthorizedAction('statusTobearchived'); + //$CAN_ARCHIVE = $IS_TOBEARCHIVED && $this->USER_IS_ADMIN_OR_MORE; + $CAN_ARCHIVE = $this->isAuthorizedAction('statusArchived'); $this->set(compact('CAN_VALIDATE', 'CAN_INVALIDATE', 'CAN_TBA', 'CAN_ARCHIVE')); - + + // TODO: + //$CAN_ATTACH_A_DOC = DocumentsController::isAuthorizedAction('add'); + // et idem pour tous les autres $CAN_ATTACH_A_DOC = $CONTEXT1; + $CAN_MANAGE_SUIVIS = $CONTEXT1; + $CAN_EDIT_OR_DELETE_SUIVIS = $CAN_MANAGE_SUIVIS; + $CAN_MANAGE_EMPRUNTS = $CONTEXT1; - $CAN_MANAGE_FILES = $CONTEXT1; + $CAN_EDIT_OR_DELETE_EMPRUNTS = $CAN_MANAGE_EMPRUNTS; + + $CAN_MANAGE_FILES = $CONTEXT1; // edit, delete, ou envoi devis par mail + $this->set(compact('CAN_ATTACH_A_DOC', 'CAN_MANAGE_SUIVIS', 'CAN_MANAGE_EMPRUNTS', 'CAN_MANAGE_FILES')); // NEW @@ -1197,8 +1263,9 @@ class MaterielsController extends AppController { $CAN_EDIT = $this->isAuthorizedAction('edit'); // OLD //$CAN_EDIT = $IS_CREATED && $CAN_ATTACH_A_DOC; - $CAN_COPY = $CAN_EDIT; - + //$CAN_COPY = $CAN_EDIT; + $CAN_COPY = $this->isAuthorizedAction('add', $id); + $CAN_DELETE = $this->isAuthorizedAction('delete'); //debug($CAN_DELETE); @@ -1210,7 +1277,7 @@ class MaterielsController extends AppController { // $status = $this->allStatus[$materiel->status]; $status = self::allStatus[$materiel->status]; - $this->set(compact('status', 'IS_CREATED', 'IS_VALIDATED', 'IS_TOBEARCHIVED', 'IS_ARCHIVED')); + $this->set(compact('status')); $sites = TableRegistry::getTableLocator()->get('Sites'); //$sites = TableLocator::get('Sites'); @@ -1226,16 +1293,17 @@ class MaterielsController extends AppController { //$fournisseurs = TableLocator::get('Fournisseurs'); if ($materiel->photo_id != null) { - $imgMateriel = $materiel->photo_id . '.' . TableRegistry::get('Documents')->get($materiel->photo_id)->get('type_doc'); + $imgMateriel = $materiel->photo_id . '.' . TableRegistry::getTableLocator()->get('Documents')->get($materiel->photo_id)->get('type_doc'); $this->set('imgMateriel', $imgMateriel); } $this->set('PDF_ENGINE', $this->confLabinvent->pdf_engine); $entity = $materiel; - $this->set(compact('sites', 'typeDocuments', 'fournisseurs', - 'entity' + $this->set(compact('entity')); + $this->set(compact( //'materiel', // @deprecated + 'sites', 'typeDocuments', 'fournisseurs' )); /* (EP) inutile $this->set('_serialize', [ diff --git a/src/Controller/QrCodesController.php b/src/Controller/QrCodesController.php index 66d7331..b61a6b2 100644 --- a/src/Controller/QrCodesController.php +++ b/src/Controller/QrCodesController.php @@ -8,7 +8,8 @@ class QrCodesController extends AppController { public function isAuthorized($user) { - return ($this->action == 'creer'); + //return ($this->action == 'creer'); + return ($this->a == 'creer'); // Si aucune règle ci-dessus n'a return true (ou false) // => DEFAULT PARENT RULE // (on appelle la méthode isAuthorized() de AppController) diff --git a/src/Model/Entity/Materiel.php b/src/Model/Entity/Materiel.php index 7f3b712..d34cce6 100755 --- a/src/Model/Entity/Materiel.php +++ b/src/Model/Entity/Materiel.php @@ -57,8 +57,7 @@ use Cake\ORM\Entity; * @property \App\Model\Entity\Fournisseur $fournisseur * @property bool $metrologie */ -class Materiel extends Entity -{ +class Materiel extends Entity { /** * Fields that can be mass assigned using newEntity() or patchEntity(). @@ -90,10 +89,16 @@ class Materiel extends Entity protected function _getIsTobearchived() { return $this->status == 'TOBEARCHIVED'; } protected function _getIsArchived() { return $this->status == 'ARCHIVED'; } + // Ce matériel est utilisé ou déclaré par l'utilisateur $userfullname + // is Owned Or Declared By User + // fullname = "Pallier Etienne" //public function isUsedOrCreatedByUser($user) { - public function isOwnedOrDeclaredByUser($username) { - return in_array($username, [$this->nom_createur, $this->nom_responsable]); + //public function isOwnedOrDeclaredByUser($username) { + public function belongsToUser($userfullname) { + return in_array($userfullname, [$this->nom_createur, $this->nom_responsable]); } + + // Ce matériel a le même groupe que l'un de ceux de l'utilisateur courant public function isSameGroupAsUser($user_group_metier_id, $user_group_thematique_id) { // Responsable groupe métier ? //if ($this->groupes_metier_id==null && $this->groupes_thematique_id==null) return false; diff --git a/src/Model/Table/MaterielsTable.php b/src/Model/Table/MaterielsTable.php index da4faad..df8fa14 100755 --- a/src/Model/Table/MaterielsTable.php +++ b/src/Model/Table/MaterielsTable.php @@ -467,7 +467,7 @@ class MaterielsTable extends AppTable * * On récupère le NOM du fournisseur saisi dans le champ appelé fournisseur.name (en php) * En Html ça correspond à fournisseur['name'] - * Si saisie vide => mettre à nul + * Si saisie vide => mettre à null * Sinon, chercher le fournisseur_id correspondant à ce nom * Si id trouvé => fournisseur_id = cet id * Sinon, créer un nouveau fournisseur avec ce nom diff --git a/src/Template/Materiels/view.ctp b/src/Template/Materiels/view.ctp index cfb39fc..2de77a7 100755 --- a/src/Template/Materiels/view.ctp +++ b/src/Template/Materiels/view.ctp @@ -672,7 +672,8 @@ if ($role == 'Super Administrateur') { || ($USER_IS_RESPONSABLE && $USER_IS_SAME_GROUP_AS_MATERIEL)) { */ if ($CAN_MANAGE_SUIVIS) { - // Edit Suivis + + // - Edit Suivis $echoActionButton($this->Html, 'icon-pencil', $bStyle, '', 'Suivis', 'edit', $suivi->id); /* echo $this->Html->link(__(''), [ @@ -684,7 +685,8 @@ if ($role == 'Super Administrateur') { 'style' => 'margin:0' ]); */ - // Delete Suivis + + // - Delete Suivis //$echoActionButton($this->Html, 'icon-trash', $bStyle, '', 'Suivis', 'delete', $suivi->id, [], "", ""); echo ' '.$this->Form->postLink(__(''), [ 'controller' => 'Suivis', @@ -695,6 +697,7 @@ if ($role == 'Super Administrateur') { 'style' => 'margin:0', 'confirm' => __('Êtes-vous sur de vouloir annuler ce suivi #{0} ?', $suivi->id) ]); + } ?> @@ -800,7 +803,8 @@ if ($role == 'Super Administrateur') { $bEdit = $bDelete = ''; //if ($USER_IS_ADMIN_OR_MORE || $USER_IS_UTILISATEUR_AND_CREATOR_OR_OWNER || $USER_IS_RESPONSABLE_AND_SAME_GROUP || $USER_IS_RESPONSABLE_AND_CREATOR_OR_OWNER ) { if ($CAN_MANAGE_EMPRUNTS) { - // Edit Emprunt + + // - Edit Emprunt $bEdit = $this->MyButton->getActionButton('icon-pencil', $bStyle, '', 'Emprunts', 'edit', $emprunt->id); //$bEdit = $getActionButton($this->Html, 'icon-pencil', $bStyle, '', 'Emprunts', 'edit', $emprunt->id); //echo $bEdit; @@ -814,7 +818,8 @@ if ($role == 'Super Administrateur') { 'style' => 'margin:0' ]); */ - // Delete Emprunt + + // - Delete Emprunt $bDelete = $this->Form->postLink(__(''), [ 'controller' => 'Emprunts', 'action' => 'delete', @@ -826,6 +831,7 @@ if ($role == 'Super Administrateur') { 'confirm' => __('Êtes-vous sur de vouloir annuler cet emprunt #{0}?', $emprunt->id) ] ); + } // champ virtuel (calculé) statut $style_red = 'style="color: red"'; @@ -930,9 +936,10 @@ if ($role == 'Super Administrateur') { ]); } - // 2 - icone EDIT //if ($USER_IS_ADMIN_OR_MORE || $USER_IS_UTILISATEUR_AND_CREATOR_OR_OWNER || $USER_IS_RESPONSABLE_AND_SAME_GROUP || $USER_IS_RESPONSABLE_AND_CREATOR_OR_OWNER) { if ($CAN_MANAGE_FILES) { + + // 2 - icone EDIT $echoActionButton($this->Html, 'icon-pencil', $bStyle, '', 'Documents', 'edit', $document->id); /* echo $this->Html->link(__(''), [ diff --git a/src/Template/Suivis/view.ctp b/src/Template/Suivis/view.ctp index e802ce5..b73f63c 100755 --- a/src/Template/Suivis/view.ctp +++ b/src/Template/Suivis/view.ctp @@ -10,7 +10,7 @@ $role = $role; $priviledgedUser = $priviledgedUser; // functions $printTableRow = $printTableRow; -debug($suivi); +//debug($suivi); /* debug($suivi->nom_createur); debug($username); -- libgit2 0.21.2