confLabinvent->labNameShort), * il suffit de faire une COPIE de cette méthode et de la renommer "setAuthorizations_LABO" * * On doit faire ça dans CHAQUE controleur où l'on désire des adaptations * (ici, c'est seulement pour le contrôleur des Suivis, donc toutes les actions sur la table 'suivis') * * Pour vérifier que ces règles spécifiques sont bien appliquées, aller sur la page des autorisations /pages/acls * */ protected function setAuthorizations_IRAP() { $this->d("SPECIFIC IRAP!"); // 1) On appelle d'abord la méthode générale $this->setAuthorizations(); // 2) Puis on fait nos petites règles locales pour notre labo à nous tout seul // Par exemple, si je veux adapter la règle pour la modificaiton d'un suivi ("edit") : /* $this->setAuthorizationsForAction('edit', 'add', [ //'user' => ['default',0], 'super' => ['default',0], ]); */ } //@Override parent static public function getActions() { // Actions CRUD... $actions = parent::getActions(); // ... + action 'find' $actions[] = 'find'; /* array_push($actions, // - CRUD //'add', /S 'view', 'index', 'edit', 'delete', // - Autres 'find', */ /* S/ //TODO: 'getNextDate' ); */ // Retourne toutes les méthodes publiques, mêmes celles qui ne sont pas des actions, donc pas bon //$actions = get_class_methods('App\Controller\MaterielsController'); return $actions; } /* * @Override * * Initialisation des autorisations pour les actions spécifiques à ce controleur * */ protected function setAuthorizations() { /* * a) Noms et verbes à utiliser (surtout dans les notifications) pour les actions * */ /* $this->setActionsNounAndPastVerb([ 'add' => ['Ajoutage','ajoutéeee'], // C 'add' => ['Ajout','ajouté'], // R 'view' => ['Visualisation (détail)','visualisé'], 'index' => ['Visualisation (liste)','visualisé'], // U 'edit' => ['Modification','modifié'], // D 'delete' => ['Suppression','supprimé'], ]); */ /* * b) Actions de ce controleur qui enverront des notifications (log et/ou email) * * 'log' = logger seulement * 'mail' => envoyer un mail seulement * 'both' = faire les 2 (logger ET envoyer un mail) * */ $this->setNotificationAllowedOnActions([ //'add' => 'both', //'add' => 'mail', 'add' => 'log', 'edit' => 'log', 'delete' => 'log', ]); /* * c) Règles d'accès (ACLs) * */ // Action 'add' (ajout d'une nouvelle entité) $this->setAuthorizationsForAction('add', ['VALIDATED',1]); //$this->setAuthorizationsForAction('edit', ['VALIDATED',1]); //$this->setAuthorizationsForAction('add', 'edit'); // Action 'edit' (modif d'une entité) => comme pour 'add' $this->setAuthorizationsForAction('edit', 'add', [ //'user' => 0, //'user' => -1, 'super' => ['default',0], ]); // Action 'delete' (suppression d'une entité) => comme pour 'add' $this->setAuthorizationsForAction('delete', 'add', [ //'super' => ['default',0] 'super' => 'edit' ]); // Action 'getNextDate' $this->setAuthorizationsForAction('getNextDate', 0); } // setAuthorizations /* //@Override protected function getRelatedMaterielForId($id, $action=null) { return $this->getEntity($id, $WITH_RELATED_MATERIEL=true)->materiel; } */ /** * * @param $user Give * authorization for suivis * @return boolean */ //public function isAuthorized($user) public function isAuthorized($user, $action = null, $id=null, $role=null) { //$action = null, $id=null, $role=null, $userCname=null) { //$configuration = $this->confLabinvent; /* * $role = TableRegistry::getTableLocator()->get('Users')->find() * ->where([ * 'username' => $user[$configuration->authentificationType_ldap][0] * ]) * ->first()['role']; * $action = $this->request->getAttribute('params')['action']; */ /* $action = $this->getActionPassed(); $role = $this->getUserRole($user); */ //$action = $this->getActionPassed(); if (!$action) $action = $this->a; //if (!$id) $id = $this->getIdPassed(); if (!$id) $id = $this->e_id; /* $IS_RELATED_ENTITY_ID = false; if ($action=='add') $IS_RELATED_ENTITY_ID = true; return $this->isAuthorizedAction($action, $id, $IS_RELATED_ENTITY_ID); // $user, $userCname */ $related_matos_id = null; if ($action=='add') { // Pas de création de suivi sans préciser (à l'avance, dans l'url) le matériel concerné // => access denied if (!$id) return false; // L'id est celui du matos associé $related_matos_id = $id; $id=null; } return $this->isAuthorizedAction($action, $id, $related_matos_id); // $user, $userCname // LA SUITE EST A VIRER // Action toujours autorisée if ($action == 'getNextDate') return true; $u = $this->getUserEntity($user); // add only si le matos est VALIDATED if ($action == 'add') { // Pour 'add', l'id n'est pas celui de l'emprunt mais du matos //debug($this->getMateriel($id)->id); //if (!$id) $id=$this->getIdPassed(); $m = $this->getMateriel($id); //return $m->is_validated && $m->isManageableByUser($this->getUserEntity($user)); return $m->canBeSuiviByUser($u); //return $m->is_validated && $m->isManageableByUser($this->getCurrentUserEntity()); //return $m->is_validated && $m->isManageableByUser($user); //return $this->relatedMaterielIsValidated($id); } if (in_array($action, [ 'edit', 'delete' ])) { // (EP 20200515) // OK ssi le user peut manager le materiel concerné $e = $this->getEntity($id, $WITH_RELATED_MATERIEL=true); if ($action=='edit') return $e->materiel->canBeSuiviByUser($u); // delete else { //return $e->materiel->canDeleteSuiviByUser($u); $res = $e->materiel->canDeleteSuiviByUser($u); return $res; } //return $e->materiel->isManageableByUser($this->getUserEntity($user)); //$m = $this->getMateriel($e->materiel_id); //return $m->isManageableByUser($this->getUserEntity($user)); /* OLD conditions if ($this->USER_IS_SUPERADMIN()) return true; // if ($this->userHasRoleAtLeast('Administration')) //if ($this->USER_IS_ADMIN_AT_LEAST()) return true; // $id = (int) $this->request->getAttribute('params')['pass'][0]; if ($this->isOwnedBy($id, $user['sn'][0] . ' ' . $user['givenname'][0])) return true; //if ($role == 'Responsable' && $this->isRespGroup($id, $user[$configuration->ldap_authenticationType][0])) //if ($this->userRole == 'Responsable' && $this->isRespGroup($id, $user[$configuration->ldap_authenticationType][0])) if ($this->USER_IS_RESP() && $this->isRespGroup($id, $user[$this->confLabinvent->ldap_authenticationType][0])) return true; */ } // par défaut : return parent::isAuthorized($user); } /* private function relatedMaterielIsValidated($matos_id=null) { //$parent_id = $IS_EDIT ? $entity->materiel_id : $this->request->getParam('pass.0'); if (!$matos_id) $matos_id = $this->request->getParam('pass.0'); $matos = $this->Suivis->Materiels->get($matos_id); return $matos->is_validated; } */ public function INUTILE_isOwnedBy($id, $nomCreateur) { return $this->Suivis->exists([ 'id' => $id, 'nom_createur' => $nomCreateur ]); } public function INUTILE_isRespGroup($id, $loginResponsable) { $u = TableRegistry::getTableLocator()->get('Users')->find() ->where([ 'username' => $loginResponsable ]) ->first(); if ($u['groupes_metier_id'] !== null && $u['groupes_metier_id'] != TableRegistry::getTableLocator()->get('GroupesMetiers')->find() ->where([ 'nom =' => 'N/A' ]) ->first()['id']) { return ($this->Suivis->exists([ 'id' => $id, 'groupes_metier_id' => $u['groupes_metier_id'] ])); } else if ($u['groupes_thematique_id'] !== null && $u['groupes_thematique_id'] != TableRegistry::getTableLocator()->get('GroupesThematiques')->find() ->where([ 'nom =' => 'N/A' ]) ->first()['id']) { return ($this->Suivis->exists([ 'id' => $id, 'groupes_thematique_id' => $u['groupes_thematique_id'] ])); } else { return false; } } /** * Index method * * @return \Cake\Network\Response|null */ public function index() { $condition = ''; $GM = $this->request->getQuery('GM'); $GT = $this->request->getQuery('GT'); if ($GM !== null || $GT !== null) { if ($GM !== null && $GM != TableRegistry::getTableLocator()->get('GroupesMetiers')->find() ->where([ 'nom =' => 'N/A' ]) ->first()['id'] ) $condition = ['Suivis.groupes_metier_id =' => $GM]; else if ($GT !== null && $GT != TableRegistry::getTableLocator()->get('GroupesThematiques')->find() ->where([ 'nom =' => 'N/A' ]) ->first()['id'] ) $condition = ['Suivis.groupes_thematique_id =' => $GT]; else $condition = ['Suivis.id =' => 0]; } /* $this->paginate = [ 'contain' => [ 'Materiels', 'TypeSuivis' ] ]; */ $suivis = $this->paginate($this->Suivis->find('all', [ 'contain' => ['Materiels','TypeSuivis'], 'conditions' => $condition, ])); /* // Pour avoir une version plus sophistiquée comprenant aussi le champ 'is_metro' // Voir cette même variable définie dans la fonction add_or_edit() $typeSuivisAll = $this->Suivis->TypeSuivis->find('list', [ 'keyField' => 'id', 'valueField' => 'is_regular', ])->toArray(); */ $this->set('nbSuivis', $this->Suivis->find('all', [ 'conditions' => $condition ])->count()); $this->set(compact('suivis')); // pas bien... mais pratique (à éviter qd même) $this->set('controller',$this); /* (EP) inutile $this->set('_serialize', [ 'suivis' ]); */ } // index /** * View method * * @param string|null $id * Suivi id. * @return \Cake\Network\Response|null * @throws \Cake\Datasource\Exception\RecordNotFoundException When record not found. */ public function view($id = null) { // cf https://book.cakephp.org/3/fr/orm/retrieving-data-and-resultsets.html#eager-loading-associations // Ceci permettra des accès du type $suivi->type_suivi->nom, $suivi->materiel->nom... depuis la vue $suivi = $this->Suivis->get($id, [ 'contain' => [ 'Materiels', 'Documents', 'TypeSuivis', 'GroupesThematiques', 'GroupesMetiers', 'Unites', 'Fichemetrologiques' ] ]); $typeDocuments = TableRegistry::getTableLocator()->get('TypeDocuments'); $fichemet = TableRegistry::getTableLocator()->get('Fichemetrologiques')->find('all', [ 'conditions' => [ 'suivi_id' => $this->request->getAttribute('params')['pass'][0] ], 'order' => ('id DESC') ]); $fiche = is_null($fichemet) ? null : $fichemet->first(); /* $this->set('typeDocuments', $typeDocuments); $this->set('suivi', $suivi); $this->set('fiche', $fiche); */ /* (EP inutile) $this->set('_serialize', [ 'suivi' ]); */ $IS_OWNER = $this->userName == $suivi->nom_createur; //debug($this->priviledgedUser); $CAN_EDIT = $this->isAuthorizedAction('edit',$id); $CAN_DELETE = $this->isAuthorizedAction('delete',$id); /* $CAN_EDIT_DELETE = ( $IS_OWNER || in_array($this->user_role, ['Administration','Administration Plus','Super Administrateur']) //|| ($role == 'Utilisateur' && in_array($username, [$suivi->nom_createur])) //|| ($role == 'Responsable' && in_array($username, [$suivi->nom_createur])) || ( $this->user_role == 'Responsable' && ( ( isset($this->priviledgedUser->groupes_metier_id) && $this->priviledgedUser->groupes_metier_id != $idGmNa && $suivi->groupes_metier_id == $this->priviledgedUser->groupes_metier_id ) || ( isset($this->priviledgedUser->groupes_thematique_id) && $this->priviledgedUser->groupes_thematique_id != $idGtNa && $suivi->groupes_thematique_id == $this->priviledgedUser->groupes_thematique_id ) ) ) ); */ $this->set(compact('typeDocuments', 'suivi', 'fiche', //'CAN_EDIT_DELETE' 'CAN_EDIT', 'CAN_DELETE' )); } // view /** * Add or Edit method (do either add() or edit()) * => Factorisation de add() et edit() * (voir aussi https://book.cakephp.org/3.0/en/orm.html) * * @param $IS_ADD: True = add ; False = edit * @return \Cake\Network\Response|void Redirects on successful add/edit, renders view otherwise. */ //protected function add_or_edit($IS_ADD, $id=null, $valeurs=null, $erreurs=null, protected function add_or_edit($IS_ADD, $id=null, $erreurs=null, // uniquement à cause de parent::add_or_edit() : $entity_name=null, array $associated_entities=[], $with_parent=false) { // On appelle la partie commune de cette méthode, dans AppController /* parent::add_or_edit($IS_ADD, $id, $valeurs, $erreurs, "Le suivi", ['TypeSuivis'], $with_parent=true); if ($this->request->is(['patch','post','put'])) return; */ //$redirect = parent::add_or_edit($IS_ADD, $id, $valeurs, $erreurs, "Le suivi", ['TypeSuivis'], $with_parent=true); $redirect = parent::add_or_edit($IS_ADD, $id, $erreurs, "Le suivi", ['TypeSuivis'], $with_parent=true); if ($redirect) return($redirect); // Ces 3 variables ont été crées par l'appel ci-dessus $suivi = $entity = $this->entityBuilt; $materiel = $this->parent; $materiels = $this->parents; /* $suivi = $entity = $vars['entity']; $materiel = $vars['parent']; $materiels = $vars['parents']; */ /* EP moved to AppController $this->myDebug("step 3: SuivisController.add_or_edit()"); $IS_EDIT = !$IS_ADD; // TODO: utiliser $entity au lieu de $suivi (car c'est plus générique) $suivi = $IS_ADD ? $this->Suivis->newEntity() : // cf https://book.cakephp.org/3/fr/orm/retrieving-data-and-resultsets.html#eager-loading-associations // Ceci permettra des accès du type $suivi->type_suivi->nom depuis la vue $this->Suivis->get($id, ['contain' => ['TypeSuivis']]); //debug($suivi); // POST (on arrive ici après un SUBMIT) // add //if ($this->request->is('post')) { // edit if ($this->request->is(['patch','post','put'])) { $suivi = $this->Suivis->patchEntity($suivi, $this->request->getData()); if ($IS_ADD) { if ($this->request->getData('typemesure') !== null && $this->request->getData('typemesure') == "1") $suivi->typemesure = "Indirect"; $suivi->panne_resolu = false; } $verb = $IS_ADD ? 'ajouté' : 'modifié'; // SAVED OK if ($this->Suivis->save($suivi)) { $this->Flash->success(__("Le suivi a bien été $verb")); // materiel id //$parent_id = $IS_ADD ? $this->request->getParam('pass')[0] : $this->request->getData('materiel_id'); $parent_id = $IS_ADD ? $this->request->getParam('pass.0') : $suivi->materiel_id; // (EP) Redirection vers la vue parente (materiel suivi) (depuis add ou edit) //if ($IS_ADD) return $this->redirect([ return $this->redirect([ 'controller' => 'Materiels', 'action' => 'view', $parent_id //$this->request->getParam('pass')[0] //$this->request->getAttribute('params')['pass'][0] ]); /SS EDIT //debug($this->request->getData()); //else $this->setAction('view',$id); // marche pas, pourquoi ??? //debug($this->referer()); //else return $this->redirect($this->referer()); //else $this->setAction('index'); /S (EP) equivalent à else return $this->redirect([ 'action' => 'index', $id ]); S/ SS/ } // SAVED KO else { $this->Flash->error(__("Le suivi n'a pas pu être $verb")); /S if ($IS_ADD) return $this->redirect([ 'controller' => 'Materiels', 'action' => 'view', $this->request->getAttribute('params')['pass'][0] ]); S/ } } // POST // START (on arrive ici la première fois qu'on ouvre la vue) $materiels = $this->Suivis->Materiels->find('list'); $materiel_id = $IS_EDIT ? $suivi->materiel_id : $this->request->getAttribute('params')['pass'][0]; $materiel = $this->Suivis->Materiels->get($materiel_id); */ // Partie spécifique à ce controleur $unite = TableRegistry::getTableLocator()->get('Unites')->find('list', [ 'keyfield' => 'id', 'valueField' => 'nom' ]); /* $materiel = $IS_EDIT ? $this->Suivis->Materiels->get($suivi->materiel_id) /S $this->Suivis->Materiels->find() ->where([ 'id =' => $suivi->materiel_id ]) ->first(); S/ : $this->Suivis->Materiels->find() ->where([ 'id =' => $this->request->getAttribute('params')['pass'][0] ]) ->first(); */ // ADD only if ($IS_ADD) { $formule = TableRegistry::getTableLocator()->get('Formules')->find('list', [ 'keyfield' => 'id', 'valueField' => 'formule' ]); $formules = TableRegistry::getTableLocator()->get('Formules')->find('all'); $variables = TableRegistry::getTableLocator()->get('Variables')->find('list')->toArray(); } // EDIT only else { $numMateriel = $this->Suivis->Materiels->find() ->select('numero_laboratoire') ->where([ 'id =' => $suivi->get('materiel_id') ]) ->first()['numero_laboratoire']; } // Le materiel est-il suivi en métrologie ou non ? //$matos_id = $IS_ADD ? $this->request->getAttribute('params')['pass'][0] : $suivi->materiel_id; $metro = TableRegistry::getTableLocator()->get('Materiels')->find() ->select('metrologie') ->where([ //'id =' => $materiel_id 'id =' => $materiel->id ]) ->first()['metrologie']; // si METRO ON => on prend tout, sinon on ne prend pas les type suivis liés à metro $conditions = $metro ? [] : [ 'AND' => ['nom !=' => 'Vérification métrologique'] ]; $typeSuivis = $this->Suivis->TypeSuivis->find('list', [ 'keyField' => 'id', 'valueField' => 'nom', 'conditions' => $conditions ]); /* if ($metro == 1) $typeSuivis = $this->Suivis->TypeSuivis->find('list', [ 'keyField' => 'id', 'valueField' => 'nom' ]); // METRO off => on ne prend pas les type suivis liés à metro else { $conditions = [ 'AND' => [ 'nom !=' => 'Vérification métrologique' ] ]; if ($IS_EDIT) $conditions = [ 'AND' => [ [ 'id !=' => '4' ], [ 'id !=' => '5' ], [ 'id !=' => '6' ] ] ]; } */ /* On construit un tableau de la forme : * typesuivi_id => [ * 'is_regular' => value, 'is_metro' => value * ] * * Exemple : (int) 1 => [ 'is_regular' => true, 'is_metro' => false ], (int) 2 => [ 'is_regular' => false, 'is_metro' => false ], (int) 5 => [ 'is_regular' => true, 'is_metro' => false ], ... */ $typeSuivisAll = $this->Suivis->TypeSuivis->find('list', [ 'keyField' => 'id', //'valueField' => 'is_regular', //'valueField' => ['is_regular','is_metro'] 'valueField' => function ($typesuivi) { return [ 'is_regular' => $typesuivi->is_regular, 'is_metro' => $typesuivi->is_metro ]; } ])->toArray(); // $domaineresp= TableRegistry::getTableLocator()->get('Users')->find()->select('sur_categorie_id')->where(['username =' => $this->LdapAuth->user($this->request->getSession()->read('authType'))[0]])->first()['sur_categorie_id']; /////$matos_id = $IS_ADD ? $materiel->id : $suivi->materiel_id; $dom = TableRegistry::getTableLocator()->get('Materiels')->find() ->select('sur_categorie_id') ->where([ //'id =' => $matos_id 'id =' => $materiel->id ]) ->first()['sur_categorie_id']; $domaines = TableRegistry::getTableLocator()->get('Users')->find() ->select('sur_categorie_id') ->where([ 'username =' => $this->LdapAuth->user($this->request->getSession() ->read('authType'))[0] ]) ->first()['sur_categorie_id']; $domaineresp = ($dom==$domaines); $groupesThematiques = $this->Suivis->GroupesThematiques->find('list', [ 'keyField' => 'id', 'valueField' => 'nom', 'order' => 'GroupesThematiques.nom' ]); $groupesMetiers = $this->Suivis->GroupesMetiers->find('list', [ 'keyField' => 'id', 'valueField' => 'nom', 'order' => 'GroupesMetiers.nom' ]); $parent = $materiel; // Utile ? //$parent_id = $materiel_id; $entity = $suivi; /* déjà fait par AppController $this->set(compact( 'IS_ADD', //'suivi', // @deprecated 'entity', // nouveau nom 'parent', // nouveau nom 'parents' // nouveau nom //'materiel', // @deprecated //'materiels', // @deprecated )); */ $this->set(compact( 'unite', 'domaineresp', //'materiel_id', 'parent_id', 'groupesThematiques', 'groupesMetiers', 'typeSuivis', 'typeSuivisAll' )); if ($IS_ADD) $this->set(compact('variables', 'formule', 'formules')); else $this->set(compact('metro', 'numMateriel')); /* (EP inutile) $this->set('_serialize', [ 'suivi' ]); */ } // add_or_edit() /** * Add method * * @return \Cake\Network\Response|void Redirects on successful add, renders view otherwise. */ // (EP 20200325) NEW add() action //public function add() //public function add($valeurs = null, $erreurs = null) { public function add($id=null, $erreurs = null) { // On refuse de créer cette entité (suivi) sans préciser l'id du parent materiel associé if ($id===null) return; //throw new \ErrorException('coucou'); //debug($valeurs); debug($erreurs); exit; //$this->add_or_edit(TRUE, null, $valeurs, $erreurs); $this->add_or_edit(TRUE, $id, $erreurs); } // OLD add() action private function OLD_add() { $suivi = $this->Suivis->newEntity(); if ($this->request->is('post')) { $suivi = $this->Suivis->patchEntity($suivi, $this->request->getData()); if ($this->request->getData('typemesure') !== null && $this->request->getData('typemesure') == "1") $suivi->typemesure = "Indirect"; $suivi->panne_resolu = false; if ($this->Suivis->save($suivi)) { $this->Flash->success(__('Le suivi a bien été ajouté.')); return $this->redirect([ 'controller' => 'Materiels', 'action' => 'view', $this->request->getAttribute('params')['pass'][0] ]); } else { $this->Flash->error(__('Le suivi n\'a pas pu être ajouté.')); return $this->redirect([ 'controller' => 'Materiels', 'action' => 'view', $this->request->getAttribute('params')['pass'][0] ]); } } $materiels = $this->Suivis->Materiels->find('list'); $unite = TableRegistry::getTableLocator()->get('Unites')->find('list', [ 'keyfield' => 'id', 'valueField' => 'nom' ]); $formule = TableRegistry::getTableLocator()->get('Formules')->find('list', [ 'keyfield' => 'id', 'valueField' => 'formule' ]); $formules = TableRegistry::getTableLocator()->get('Formules')->find('all'); // Le materiel est-il suivi en métrologie ou non ? $metro = TableRegistry::getTableLocator()->get('Materiels')->find() ->select('metrologie') ->where([ 'id =' => $this->request->getAttribute('params')['pass'][0] ]) ->first()['metrologie']; $variables = TableRegistry::getTableLocator()->get('Variables')->find('list')->toArray(); $materiel = $this->Suivis->Materiels->find() ->where([ 'id =' => $this->request->getAttribute('params')['pass'][0] ]) ->first(); // $domaineresp= TableRegistry::getTableLocator()->get('Users')->find()->select('sur_categorie_id')->where(['username =' => $this->LdapAuth->user($this->request->getSession()->read('authType'))[0]])->first()['sur_categorie_id']; $conditions = $metro ? [] : [ 'AND' => ['nom !=' => 'Vérification métrologique'] ]; //$conditions = $metro==1 ? [] : [ 'AND' => ['nom !=' => 'Vérification métrologique'] ] $typeSuivis = $this->Suivis->TypeSuivis->find('list', [ 'keyField' => 'id', 'valueField' => 'nom', 'conditions' => $conditions ]); /* } else { $typeSuivis = $this->Suivis->TypeSuivis->find('list', [ 'keyField' => 'id', 'valueField' => 'nom', 'conditions' => [ 'AND' => [ 'nom !=' => 'Vérification métrologique' ] ] ]); } */ $dom = TableRegistry::getTableLocator()->get('Materiels')->find() ->select('sur_categorie_id') ->where([ 'id =' => $materiel->id ]) ->first()['sur_categorie_id']; $domaines = TableRegistry::getTableLocator()->get('Users')->find() ->select('sur_categorie_id') ->where([ 'username =' => $this->LdapAuth->user($this->request->getSession() ->read('authType'))[0] ]) ->first()['sur_categorie_id']; if ($dom == $domaines) $domaineresp = true; else $domaineresp = false; $groupesThematiques = $this->Suivis->GroupesThematiques->find('list', [ 'keyField' => 'id', 'valueField' => 'nom', 'order' => 'GroupesThematiques.nom' ]); $groupesMetiers = $this->Suivis->GroupesMetiers->find('list', [ 'keyField' => 'id', 'valueField' => 'nom', 'order' => 'GroupesMetiers.nom' ]); $this->set(compact('variables', 'formule', 'formules', 'unite', 'domaineresp', 'suivi', 'materiels', 'typeSuivis', 'materiel', 'groupesThematiques', 'groupesMetiers')); $this->set('_serialize', [ 'suivi' ]); } // add() /** * Edit method * * @param string|null $id * Suivi id. * @return \Cake\Network\Response|void Redirects on successful edit, renders view otherwise. * @throws \Cake\Network\Exception\NotFoundException When record not found. */ // (EP 20200325) NEW edit() action public function edit($id = null) { $this->add_or_edit(FALSE, $id); } // OLD edit() action private function OLD_edit($id = null) { // cf https://book.cakephp.org/3/fr/orm/retrieving-data-and-resultsets.html#eager-loading-associations // Ceci permettra des accès du type $suivi->type_suivi->nom depuis la vue $suivi = $this->Suivis->get($id, [ 'contain' => ['TypeSuivis'] ]); // POST if ($this->request->is([ 'patch', 'post', 'put' ])) { $suivi = $this->Suivis->patchEntity($suivi, $this->request->getData()); if ($this->Suivis->save($suivi)) { $this->Flash->success(__('Le suivi a bien été édité.')); return $this->redirect([ 'action' => 'index', $id ]); } else { $this->Flash->error(__('Le suivi n\'a pas pu être édité.')); } } // START $materiels = $this->Suivis->Materiels->find('list'); $materiel = $this->Suivis->Materiels->find() ->where([ 'id =' => $suivi->materiel_id ]) ->first(); $unite = TableRegistry::getTableLocator()->get('Unites')->find('list', [ 'keyfield' => 'id', 'valueField' => 'nom' ]); $numMateriel = $this->Suivis->Materiels->find() ->select('numero_laboratoire') ->where([ 'id =' => $suivi->get('materiel_id') ]) ->first()['numero_laboratoire']; $metro = TableRegistry::getTableLocator()->get('Materiels')->find() ->select('metrologie') ->where([ 'id =' => $suivi->materiel_id ]) ->first()['metrologie']; $groupesThematiques = $this->Suivis->GroupesThematiques->find('list', [ 'keyField' => 'id', 'valueField' => 'nom', 'order' => 'GroupesThematiques.nom' ]); $groupesMetiers = $this->Suivis->GroupesMetiers->find('list', [ 'keyField' => 'id', 'valueField' => 'nom', 'order' => 'GroupesMetiers.nom' ]); $typeSuivis = $this->Suivis->TypeSuivis->find('list', [ 'keyField' => 'id', 'valueField' => 'nom' ]); if ($metro == 1) { $typeSuivis = $this->Suivis->TypeSuivis->find('list', [ 'keyField' => 'id', 'valueField' => 'nom' ]); } else { $typeSuivis = $this->Suivis->TypeSuivis->find('list', [ 'keyField' => 'id', 'valueField' => 'nom', 'conditions' => [ 'AND' => [ [ 'id !=' => '4' ], [ 'id !=' => '5' ], [ 'id !=' => '6' ] ] ] ]); } $dom = TableRegistry::getTableLocator()->get('Materiels')->find() ->select('sur_categorie_id') ->where([ 'id =' => $suivi->materiel_id ]) ->first()['sur_categorie_id']; $domaines = TableRegistry::getTableLocator()->get('Users')->find() ->select('sur_categorie_id') ->where([ 'username =' => $this->LdapAuth->user($this->request->getSession() ->read('authType'))[0] ]) ->first()['sur_categorie_id']; $domaineresp = ($dom == $domaines); $parent = $materiel; $this->set(compact( 'unite', 'metro', 'domaineresp', 'suivi', 'parent', 'materiel', 'materiels', 'typeSuivis', 'numMateriel', 'groupesThematiques', 'groupesMetiers' ) ); /* (EP inutile) $this->set('_serialize', [ 'suivi' ]); */ } // edit() /** * Delete method * * @param string|null $id * Suivi id. * @return \Cake\Network\Response|null Redirects to index. * @throws \Cake\Datasource\Exception\RecordNotFoundException When record not found. */ public function delete($id = null) { $this->request->allowMethod([ 'post', 'delete' ]); $suivi = $this->Suivis->get($id); $parent_id = $suivi->materiel_id; if ($this->Suivis->delete($suivi)) { //debug("OK"); $this->Flash->success(__('Le suivi a bien été supprimé')); } else { //debug("KO"); $this->Flash->error(__("Le suivi n'a pas pu être supprimé")); } //exit; return $this->redirect([ 'controller' => 'materiels', 'action' => 'view', $parent_id ]); } /** * GetConditionForField method * * @param unknown $fieldName * @return string[]|NULL */ private function getConditionForField($fieldName) { $searchFieldName = 's_' . $fieldName; if ($this->request->getData($searchFieldName) !== null && ($this->request->getData($searchFieldName) != '')) return [ "Suivis.$fieldName LIKE" => '%' . $this->request->getData($searchFieldName) . '%' ]; return NULL; } /** * GetConditionForFieldNumber method * * @param unknown $fieldName * @return $string[]|NULL */ private function getConditionForFieldNumber($fieldName) { $searchFieldName = 's_' . $fieldName; if ($this->request->getData($searchFieldName) !== null && ($this->request->getData($searchFieldName) != '')) return [ "Suivis.$fieldName =" => $this->request->getData($searchFieldName) ]; return NULL; } /** * Find method */ public function find() { $s_groupes_thematiques = $this->Suivis->GroupesThematiques->find('list', [ 'keyField' => 'id', 'valueField' => 'nom', 'order' => 'GroupesThematiques.nom' ]); $s_groupes_metiers = $this->Suivis->GroupesMetiers->find('list', [ 'keyField' => 'id', 'valueField' => 'nom', 'order' => 'GroupesMetiers.nom' ]); $s_type_suivis = $this->Suivis->TypeSuivis; $materiels = $this->Suivis->Materiels; $this->set(compact('s_groupes_thematiques', 's_groupes_metiers', 's_type_suivis', 'materiels')); $resultTri = $this->request->getSession()->read("resultTri"); if ($this->request->is('post')) { $specificFieldsConditions = NULL; $periode_interventionRequest = NULL; $date_intervention = NULL; if ($this->request->getData('s_periode_controle1') != '') $periode_interventionRequest['Suivis.date_controle >='] = date('Y-m-d', strtotime(str_replace('/', '-', $this->request->getData('s_periode_controle1')))); if ($this->request->getData('s_periode_controle2') != '') $periode_interventionRequest['Suivis.date_controle <='] = date('Y-m-d', strtotime(str_replace('/', '-', $this->request->getData('s_periode_controle2')))); if ($this->request->getData('s_date_controle') != '') $date_intervention['Suivis.date_controle ='] = date('Y-m-d', strtotime(str_replace('/', '-', $this->request->getData('s_date_controle')))); $specificFieldsConditions = [ $date_intervention, $periode_interventionRequest, $this->getConditionForFieldNumber('type_suivi_id'), $this->getConditionForField('organisme'), $this->getConditionForField('statut'), $this->getConditionForFieldNumber('groupes_metier_id'), $this->getConditionForFieldNumber('groupes_thematique_id') ]; // CONSTRUCTION DE LA REQUETE SQL COMPLETE = $specificFieldsConditions // by default, no sort $lastResults = $this->Suivis->find('all', [ 'conditions' => $specificFieldsConditions ]); $this->paginate = [ 'limit' => 1000 ]; $_results = $this->paginate($lastResults); $this->set(compact('_results')); } // end if() else if ($resultTri !== null && strstr($this->request->here(), 'sort') != false && strstr($this->request->here(), 'direction') != false) { $findedSuivis = []; foreach ($resultTri as $r) { array_push($findedSuivis, $r->id); } $res = $this->Suivis->find('all', [ 'limit' => 1000 ]); for ($i = 0; $i < sizeof($findedSuivis); $i ++) { $res->orWhere([ 'id =' => $findedSuivis[$i] ]); } $this->paginate = [ 'limit' => 1000 ]; $_results = $this->paginate($res); $this->set(compact('_results')); } } // called from Javascript (Ajax) public function getNextDate($dateORjour, $frequenceORmois, $typeFrequenceORannee, $frequence = null, $typeFrequence = null) { if ($frequence != null && $typeFrequence != null) { $date = $dateORjour . '-' . $frequenceORmois . '-' . $typeFrequenceORannee; } else { $date = $dateORjour; $frequence = $frequenceORmois; $typeFrequence = $typeFrequenceORannee; } $date_next = date_create_from_format('d-m-Y', $date); switch ($typeFrequence) { case "Jours": date_add($date_next, date_interval_create_from_date_string($frequence . ' days')); break; case "Semaines": date_add($date_next, date_interval_create_from_date_string((7 * $frequence) . ' days')); break; case "Mois": date_add($date_next, date_interval_create_from_date_string($frequence . ' months')); break; case "Ans": date_add($date_next, date_interval_create_from_date_string($frequence . ' years')); break; } $this->set('date', date_format($date_next, 'd-m-Y')); $this->viewBuilder()->layout = 'ajax'; } }