confLabinvent; // $action = $this->request->getAttribute('params')['action']; // $role = TableRegistry::get('Users')->find()->where(['username' => $user[$configuration->authentificationType_ldap][0]])->first()['role']; //if (!$id) $id = $this->getIdPassed(); if (!$id) $id = $this->e_id; //$action = $this->getActionPassed(); if (!$action) $action = $this->a; /* $IS_RELATED_ENTITY_ID = false; if ($action=='add') $IS_RELATED_ENTITY_ID = true; return $this->isAuthorizedAction($action, $id, $IS_RELATED_ENTITY_ID, $user); // $user, $userCname */ $related_matos_id = null; if ($action=='add') { // Pas de création de prêt 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); // $user, $userCname // LA SUITE EST A VIRER //$role = $this->getUserRole($user); $u = $this->getUserEntity($user); // add : only si le matos est VALIDATED et si can_manage if ($action == 'add') { //debug($this->getRelatedMateriel($id)->id); // Pour 'add', l'id n'est pas celui de l'emprunt mais du matos //if (!$id) $id=$this->getIdPassed(); $m = $this->getRelatedMateriel($id); //return $m->is_validated && $m->isLendableByUser($this->getCurrentUserEntity()); //return $m->is_validated && $m->isLendableByUser($this->getUserEntity($user)); return $m->canBeLentByUser($u); //return $m->is_validated && $m->isManageableByUser($user); //return $m->is_validated && $m->isManageableByUser($this->u); //return $this->relatedMaterielIsValidated($id); //return $this->matosIsValidated($this->e->materiel_id); } /* // Responsable + peut tout faire // if ($this->userHasRoleAtLeast('Responsable')) return true; if ($this->USER_IS_RESP_AT_LEAST()) return true; */ // Pour un "utilisateur" if (in_array($action, [ 'edit', 'delete' ])) { // (EP 20200515) $e = $this->getEntity($id, $WITH_RELATED_MATERIEL=true); return $e->materiel->canBeLentByUser($u); /* OLD conditions // $id = (int)$this->request->getAttribute('params')['pass'][0]; if ($this->isOwnedBy($id, $user['sn'][0] . ' ' . $user['givenname'][0])) return true; */ } // Par défaut return parent::isAuthorized($user); } /* //@Override protected function getRelatedMaterielForId($id, $action=null) { // Si action 'add', id = celui du materiel if ($action == 'add') return $this->getMateriel($id); // Sinon, id = celui de l'entité (emprunt) return $this->getEntity($id, $WITH_RELATED_MATERIEL=true)->materiel; } */ //@Override parent protected function setAuthorizations() { // 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, //'user' => ['default',0], //'user' => ['default',1], 'super' => ['default',0], ]); // Action 'edit' (modif d'une entité) => comme pour 'add' $this->setAuthorizationsForAction('delete', 'add', [ //'super' => ['default',0] 'super' => 'edit' ]); } // setAuthorizations /* 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->Emprunts->Materiels->get($matos_id); return $matos->is_validated; } */ public function isOwnedBy($id, $nomCreateur) { return ($this->Emprunts->exists([ 'id' => $id, 'nom_createur' => $nomCreateur ]) || $this->Emprunts->exists([ 'id' => $id, 'nom_emprunteur' => $nomCreateur ])); } /** * Index method * * @return \Cake\Network\Response|null */ public function index() { $this->paginate = [ 'contain' => [ 'Materiels', 'Sites' ] ]; $emprunts = $this->paginate($this->Emprunts); $this->set('nbEmprunts', $this->Emprunts->find('all') ->count()); $this->set(compact('emprunts')); $this->set('_serialize', [ 'emprunts' ]); } /* public function get_status_from_dates($date_emprunt,$date_retour) { $today = new \DateTime('now'); //echo $today->format('d/m/y'); $date_emprunt = new \DateTime(strtr($date_emprunt,'/','-')) ; //->format('d/m/y'); // on ajoute 23h59m59s à date_retour pour autoriser le retour jqa la fin de la journée $date_retour = new \DateTime(strtr($date_retour,'/','-')); $date_retour->add(new \DateInterval('PT23H59M59S')); //->format('d/m/y'); $delay = $today->diff($date_emprunt)->days; if ($today < $date_emprunt) { $status = "A VENIR"; $delay = "dans " . ($delay==0?1:$delay); } else { if ($today <= $date_retour) { $status = "EN COURS"; } else { $status = "TERMINÉ"; $delay = $today->diff($date_retour)->days; } $delay = "depuis " . ($delay==0?1:$delay); } return [$status, $delay]; } */ /** * View method * * @param string|null $id * Emprunt id. * @return \Cake\Network\Response|null * @throws \Cake\Datasource\Exception\RecordNotFoundException When record not found. */ public function view($id = null) { $emprunt = $this->Emprunts->get($id, [ 'contain' => [ 'Materiels', 'Sites' ] ]); $entity = $emprunt; $this->set(compact('entity')); // envoi du controleur dans la vue, PAS BIEN mais pratique //$this->set('controller', $this); /* (EP) inutile $this->set('_serialize', [ 'emprunt' ]); */ } //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, // uniquement à cause de parent::add_or_edit() : $entity_name=null, array $associated_entities=[], $with_parent=false) { $controller = 'Emprunts'; // Si jamais la nouvelle méthode ne marche plus, revenir à l'ancienne en mettant à false $NEWWAY = TRUE; // On appelle la partie commune de cette méthode, dans AppController if ($NEWWAY) { /* parent::add_or_edit($IS_ADD, $id, $valeurs, $erreurs, "L'emprunt", [], $with_parent=true); if ($this->request->is(['patch','post','put'])) return; */ $redirect = parent::add_or_edit($IS_ADD, $id, $valeurs, $erreurs, "L'emprunt", [], $with_parent=true); if ($redirect) return($redirect); $entity = $this->entityBuilt; $materiel = $this->parent; $materiels = $this->parents; /* $entity = $vars['entity']; $materiel = $vars['parent']; $materiels = $vars['parents']; */ } // if $NEWWAY // (EP 20200429) déplacé tout ce bloc dans AppController else { $this->myDebug("step 3: EmpruntsController.add_or_edit()"); $IS_EDIT = !$IS_ADD; /* (EP 20200326) * Pour être plus générique, * On utilise désormais $entity au lieu d'un terme plus spécifique comme $emprunt * (ou $suivi ou $materiel pour les controleurs de Suivis et Materiels, ...) * On utilisera aussi $this->$controller au lieu de $this->Emprunts (ou $this->Suivis ou $this->Materiels, ...) */ $controller = 'Emprunts'; $entity = ($IS_ADD ? $this->$controller->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->Emprunts->get($id, ['contain' => ['TypeSuivis']]); $this->$controller->get($id, ['contain' => []]) ); //@deprecated $emprunt = $entity; //debug($suivi); // POST (on arrive ici après un SUBMIT) // add //if ($this->request->is('post')) { // edit if ($this->request->is(['patch','post','put'])) { //$entity = $this->Emprunts->patchEntity($suivi, $this->request->getData()); $entity = $this->$controller->patchEntity($entity, $this->request->getData()); $verb = $IS_ADD ? 'ajouté' : 'modifié'; // SAVED OK //if ($this->Emprunts->save($suivi)) { if ($this->$controller->save($entity)) { $this->Flash->success(__("L'emprunt a bien été $verb")); $parent_id = $IS_ADD ? $this->request->getParam('pass.0') : $entity->materiel_id; // (EP) Redirection vers la vue parente (materiel emprunté) (depuis add ou edit) return $this->redirect([ 'controller' => 'Materiels', 'action' => 'view', $parent_id ]); /* // ADD if ($IS_ADD) return $this->redirect([ 'controller' => 'Materiels', 'action' => 'view', $this->request->getAttribute('params')['pass'][0] ]); // EDIT else $this->setAction('view', $id); /S equivalent à else return $this->redirect([ 'action' => 'view', $id ]); S/ */ } // SAVED KO else { $this->Flash->error(__("L'emprunt n'a pas pu être $verb")); } } // POST // START (on arrive ici la première fois qu'on ouvre la vue) $materiels = $this->$controller->Materiels->find('list'); $materiel_id = $IS_EDIT ? $entity->materiel_id : $this->request->getAttribute('params')['pass'][0]; // parent = materiel $parent = $this->$controller->Materiels->get($materiel_id); //$materiel = $this->$controller->Materiels->get($materiel_id); /* (EP) inutile $numMateriel = $this->$controller->Materiels->find() ->select('numero_laboratoire') ->where([ 'id =' => $materiel_id ]) ->first()['numero_laboratoire']; */ } // if !$NEWWAY /* Gestion du lieu de stockage : * - soit on cache la DIV 'interne' et on affiche la DIV 'externe' * - soit on fait l'inverse (par defaut, interne) */ // Gestion du lieu de stockage : soit on cache la DIV 'interne' et on affiche la DIV 'externe', soit on fait l'inverse (par defaut, interne) $disp_interne = 'display:block'; $disp_externe = 'display:none'; if ($entity->emprunt_interne !== null && $entity->emprunt_interne != 1) { $disp_interne = 'display:none'; $disp_externe = 'display:block'; } $nom_emprunteur_int = $this->LdapAuth->user('sn')[0] . ' ' . $this->LdapAuth->user('givenname')[0]; $mail_emprunteur_int = TableRegistry::get('Users') ->find() ->select('email') ->where([ 'username =' => $this->LdapAuth->user( $this->request->getSession()->read('authType') )[0] ]) ->first()['email']; $nom_emprunteur_ext = ''; $mail_emprunteur_ext = ''; $utilisateurs = TableRegistry::get('LdapConnections')->getListUsers(); $sites = $this->$controller->Sites->find('list', [ 'keyField' => 'id', 'valueField' => 'nom' ]); /* 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( // (EP) inutile //'numMateriel', 'disp_externe', 'disp_interne', 'nom_emprunteur_int', 'mail_emprunteur_int', 'nom_emprunteur_ext', 'mail_emprunteur_ext', 'utilisateurs', 'sites' )); /* (EP) inutile $this->set('_serialize', [ 'emprunt' ]); */ } //add_or_edit() /** * Add method * * @return \Cake\Network\Response|void Redirects on successful add, renders view otherwise. */ // (EP 20200326) NEW add() action //public function add() public function add($valeurs = null, $erreurs = null) { $this->add_or_edit(TRUE, null, $valeurs, $erreurs); } // OLD add() action private function OLD_add() { $emprunt = $this->Emprunts->newEntity(); if ($this->request->is('post')) { $emprunt = $this->Emprunts->patchEntity($emprunt, $this->request->getData()); if ($this->Emprunts->save($emprunt)) { $this->Flash->success(__('L\'emprunt a bien été ajouté.')); return $this->redirect([ 'controller' => 'Materiels', 'action' => 'view', $this->request->getAttribute('params')['pass'][0] ]); } else { $this->Flash->error(__('L\'emprunt n\'a pas pu être ajouté..')); } } $materiels = $this->Emprunts->Materiels->find('list'); $numMateriel = $this->Emprunts->Materiels->find() ->select('numero_laboratoire') ->where([ 'id =' => $this->request->getAttribute('params')['pass'][0] ]) ->first()['numero_laboratoire']; // Gestion du lieu de stockage : soit on cache la DIV 'interne' et on affiche la DIV 'externe', soit on fait l'inverse (par defaut, interne) $disp_interne = 'display:block'; $disp_externe = 'display:none'; $interne = $emprunt->get('emprunt_interne'); if ($interne !== null) { if ($emprunt->get('emprunt_interne') == 1) { $disp_interne = 'display:block'; $disp_externe = 'display:none'; } else { $disp_interne = 'display:none'; $disp_externe = 'display:block'; } } $nom_emprunteur_int = $this->LdapAuth->user('sn')[0] . ' ' . $this->LdapAuth->user('givenname')[0]; $mail_emprunteur_int = TableRegistry::get('Users')->find() ->select('email') ->where([ 'username =' => $this->LdapAuth->user($this->request->getSession() ->read('authType'))[0] ]) ->first()['email']; $nom_emprunteur_ext = ''; $mail_emprunteur_ext = ''; $utilisateurs = TableRegistry::get('LdapConnections')->getListUsers(); $sites = $this->Emprunts->Sites->find('list', [ 'keyField' => 'id', 'valueField' => 'nom' ]); $this->set(compact('emprunt', 'materiels', 'numMateriel', 'disp_externe', 'disp_interne', 'nom_emprunteur_int', 'mail_emprunteur_int', 'nom_emprunteur_ext', 'mail_emprunteur_ext', 'utilisateurs', 'sites')); $this->set('_serialize', [ 'emprunt' ]); } /** * Edit method * * @param string|null $id * Emprunt id. * @return \Cake\Network\Response|void Redirects on successful edit, renders view otherwise. * @throws \Cake\Network\Exception\NotFoundException When record not found. */ // (EP 20200326) NEW edit() action public function edit($id = null) { $this->add_or_edit(FALSE, $id); } // OLD edit() action private function OLD_edit($id = null) { $emprunt = $this->Emprunts->get($id, [ 'contain' => [] ]); if ($this->request->is([ 'patch', 'post', 'put' ])) { $emprunt = $this->Emprunts->patchEntity($emprunt, $this->request->getData()); if ($this->Emprunts->save($emprunt)) { $this->Flash->success(__('L\'emprunt a bien été édité.')); return $this->redirect([ 'action' => 'view', $id ]); } else { $this->Flash->error(__('L\'emprunt n\'a pas pu être édité.')); } } $materiels = $this->Emprunts->Materiels->find('list'); $numMateriel = $this->Emprunts->Materiels->find() ->select('numero_laboratoire') ->where([ 'id =' => $emprunt->get('materiel_id') ]) ->first()['numero_laboratoire']; /* Gestion du lieu de stockage : * - soit on cache la DIV 'interne' et on affiche la DIV 'externe' * - soit on fait l'inverse (par defaut, interne) */ $disp_interne = 'display:block'; $disp_externe = 'display:none'; $interne = $emprunt->get('emprunt_interne'); if ($interne !== null) { if ($emprunt->get('emprunt_interne') == 1) { $disp_interne = 'display:block'; $disp_externe = 'display:none'; } else { $disp_interne = 'display:none'; $disp_externe = 'display:block'; } } $nom_emprunteur_int = $this->LdapAuth->user('sn')[0] . ' ' . $this->LdapAuth->user('givenname')[0]; $mail_emprunteur_int = TableRegistry::get('Users')->find() ->select('email') ->where([ 'username =' => $this->LdapAuth->user($this->request->getSession() ->read('authType'))[0] ]) ->first()['email']; $nom_emprunteur_ext = ''; $mail_emprunteur_ext = ''; $utilisateurs = TableRegistry::get('LdapConnections')->getListUsers(); $sites = $this->Emprunts->Sites->find('list', [ 'keyField' => 'id', 'valueField' => 'nom' ]); $this->set(compact('emprunt', 'materiels', 'numMateriel', 'disp_externe', 'disp_interne', 'nom_emprunteur_int', 'mail_emprunteur_int', 'nom_emprunteur_ext', 'mail_emprunteur_ext', 'utilisateurs', 'sites')); $this->set('_serialize', [ 'emprunt' ]); } /** * Delete method * * @param string|null $id * Emprunt 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' ]); $emprunt = $this->Emprunts->get($id); if ($this->Emprunts->delete($emprunt)) { $this->Flash->success(__('L\'emprunt a bien été supprimé.')); } else { $this->Flash->error(__('L\'emprunt n\'a pas pu être supprimé.')); } $this->setAction('index'); /* equivaut à return $this->redirect([ 'action' => 'index' ]); */ } /** * 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; } public function find() { $s_site = $this->Emprunts->Sites->find('list', [ 'keyField' => 'id', 'valueField' => 'nom', 'order' => 'Sites.nom' ]); $s_nomEmprunteur = $this->Emprunts->find('list', [ 'keyField' => 'nom_emprunteur', 'valueField' => 'nom_emprunteur', 'order' => 'nom_emprunteur' ]); $s_e_lieu_detail = $this->Emprunts->find('list', [ 'keyField' => 'e_lieu_detail', 'valueField' => 'e_lieu_detail', 'order' => 'e_lieu_detail', 'conditions' => array( 'emprunt_interne =' => '1' ) ]); $materiels = $this->Emprunts->Materiels; $nom_emprunteur_ext = $this->Emprunts->find('list', [ 'keyField' => 'nom_emprunteur', 'valueField' => 'nom_emprunteur', 'order' => 'nom_emprunteur', 'conditions' => [ 'emprunt_interne =' => '0' ] ]); $nom_emprunteur_int = $this->Emprunts->find('list', [ 'keyField' => 'nom_emprunteur', 'valueField' => 'nom_emprunteur', 'order' => 'nom_emprunteur', 'conditions' => array( 'emprunt_interne =' => '1' ) ]); $s_laboratoire = $this->Emprunts->find('list', [ 'keyField' => 'laboratoire', 'valueField' => 'laboratoire', 'order' => 'laboratoire', 'conditions' => array( 'emprunt_interne =' => '0' ) ]); $sites = $this->Emprunts->Sites; $this->set(compact('s_site', 's_nomEmprunteur', 'materiels', 's_e_lieu_detail', 'nom_emprunteur_int', 'nom_emprunteur_ext', 's_laboratoire', 'sites')); $resultTri = $this->request->getSession()->read("resultTri"); if ($this->request->is('post')) { $specificFieldsConditions = NULL; $nom_emprunteur = NULL; $periode_interventionRequest = NULL; if ($this->request->getData('s_date_emprunt') != '') $periode_interventionRequest['Emprunts.date_emprunt >='] = date('Y-m-d', strtotime(str_replace('/', '-', $this->request->getData('s_date_emprunt')))); if ($this->request->getData('s_date_retour_emprunt') != '') $periode_interventionRequest['Emprunts.date_retour_emprunt <='] = date('Y-m-d', strtotime(str_replace('/', '-', $this->request->getData('s_date_retour_emprunt')))); if ($this->request->getData('emprunt_interne') == true) { $nom_emprunteur['Emprunts.emprunt_interne ='] = true; if ($this->request->getData('nom_emprunteur_int') != '') $nom_emprunteur['Emprunts.nom_emprunteur ='] = $this->request->getData('nom_emprunteur_int'); if ($this->request->getData('e_lieu_detail') != '') $nom_emprunteur['Emprunts.e_lieu_detail ='] = $this->request->getData('e_lieu_detail'); if ($this->request->getData('site') != '') $nom_emprunteur['Emprunts.site_id ='] = $this->request->getData('site'); } else { $nom_emprunteur['Emprunts.emprunt_interne ='] = false; if ($this->request->getData('nom_emprunteur_ext') != '') $nom_emprunteur['Emprunts.nom_emprunteur ='] = $this->request->getData('nom_emprunteur_ext'); if ($this->request->getData('laboratoire') != '') $nom_emprunteur['Emprunts.laboratoire ='] = $this->request->getData('laboratoire'); } /* * if($this->request->getData('emprunt_interne') == true) * $nom_emprunteur['Emprunts.emprunt_interne =']= true; * else * $nom_emprunteur['Emprunts.emprunt_interne =']= false; */ $specificFieldsConditions = [ $periode_interventionRequest, $nom_emprunteur ]; // CONSTRUCTION DE LA REQUETE SQL COMPLETE = $specificFieldsConditions // by default, no sort // $lastResults = $this->Emprunts->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) { $findedEmprunts = []; foreach ($resultTri as $r) { array_push($findedEmprunts, $r->id); } $res = $this->Emprunts->find('all', [ 'limit' => 1000 ]); for ($i = 0; $i < sizeof($findedEmprunts); $i ++) { $res->orWhere([ 'id =' => $findedEmprunts[$i] ]); } $this->paginate = [ 'limit' => 1000 ]; $_results = $this->paginate($res); $this->set(compact('_results')); } } }