self::CREATED, 'VALIDATED' => self::VALIDATED, 'TOBEARCHIVED' => self::TOBEARCHIVED, 'ARCHIVED' => self::ARCHIVED ]; private $NOTARCHIVED = [ 'CREATED', 'VALIDATED', 'TOBEARCHIVED' ]; // EP 08/2017 private $FIELDS = array( 'name', 'description', 'prix_ht' // ... ); // EP 08/2017 // protected $easyACL = array( const easyACL = array( /** * Default ACL for ALL (logged) users * * Les actions non mentionnées sont accessibles à tous (par défaut), * exemple 'find', 'index'... * Ces default ACL peuvent être surchargées pour un profil précis * (par exemple pour 'USER' qui est plus restreint) */ // 'ALL' => array ( 'DEFAULT' => array( // 'action' => 'condition for execution' (= 'Y', 'N', or ''), // with like "'field name' == 'value'" // !!! Used for test, DO NOT REMOVE : !!! 'action_CAS2_Y' => 'Y', 'action_CAS2_N' => 'N', // YOUR RULES : // CRUD actions : // 'index' => 'Y', // read all // 'view' => 'Y', // read one // 'add' => 'Y', // create // 'find' => 'Y', // create 'edit' => '(status == CREATED || status == VALIDATED)', // update 'delete' => '(status == CREATED)' ), // Ajoute des ACL plus spécifiques (ci-dessus) pour le profil USER qui est plus restreint // Les actions absentes ne sont pas surchargées (elles sont exécutées selon les conditions définies pour 'ALL') 'USER' => array( // !!! Used for test, DO NOT REMOVE : !!! 'action_CAS1_Y' => 'Y', 'action_CAS1_N' => 'N', 'action_CAS6_resp_Y' => 'Y', 'action_CAS6_resp_N' => 'N', // YOUR RULES : 'edit' => '&& (is_creator || is_user)', // is_owner = (nom_createur == CURRENT_USER_NAME) // except fields status, owner, etiquette, and admin data, VALIDATED (only some fields, cf $modifiableFields in View/Materiels/scaffold.form.ctp) 'delete' => '&& is_owner', /* ceci n'a aucun sens car l'action sur le modèle "Pages" s'appelle toujours "display" (et non pas tools, infos, ou printers...) 'tools' => 'N', 'infos' => 'N', 'printers' => 'N', */ 'statusCreated' => 'N', // Dé-valider (in-valider), rétrograder le statut (admin+) 'statusValidated' => 'N', // Valider (admin+) 'statusToBeArchived' => 'Y', // Demander la sortie de l'inventaire 'statusArchived' => 'N', // Sortir de l'inventaire, archiver (admin+) 'execActions' => 'N' // calls updateSelectedStatus() (admin+) ), // Surcharge des ACL par défaut (ci-dessus) pour le profil RESPONSABLE qui est plus restreint // Les actions absentes ne sont pas surchargées (elles sont exécutées selon les conditions définies pour 'ALL') 'RESPONSABLE' => array( // !!! Used for test, DO NOT REMOVE : !!! 'action_CAS6_admin_Y' => 'Y', 'action_CAS6_admin_N' => 'N', // YOUR RULES : 'edit' => '&& is_resp' // is_owner = (nom_createur == CURRENT_USER_NAME) // 'delete' => 'is_resp && (status == CREATED)', // Valider les matos dont il est responsable : // is_resp = (groupe_thematique == CURRENT_USER_NAME.groupe_thematique [[ groupe_metier == CURRENT_USER_NAME.groupe_metier) // 'statusValidated' => 'N', ), // Surcharge des ACL par défaut (ci-dessus) pour le profil ADMIN 'ADMIN' => array( // 'execActions' => 'Y', // calls updateSelectedStatus(), admin+ // 'add' => 'Y', // create // 'edit' => '(status == CREATED || status == VALIDATED)', // update // 'edit' => '=ALL', // update // 'delete' => '=ALL', // update 'statusCreated' => 'Y', // Dé-valider (in-valider), rétrograder le statut (admin+) 'statusValidated' => 'Y', // Valider (admin+) 'statusToBeArchived' => 'Y', // Demander la sortie de l'inventaire 'statusArchived' => 'Y', // Sortir de l'inventaire, archiver (admin+) 'execActions' => 'Y' // calls updateSelectedStatus() (admin+) ), // Surcharge des ACL par défaut (ci-dessus) pour le profil ADMINPLUS 'ADMINPLUS' => array( // 'edit' => 'Y', // update ), // Surcharge des ACL par défaut (ci-dessus) pour le profil SUPERADMIN 'SUPERADMIN' => array( //'statusArchived' => 'Y', // Sortir de l'inventaire, archiver (admin+) // 'execActions' => 'Y', // calls updateSelectedStatus(), admin+ // 'add' => 'Y', // create // 'edit' => 'Y', // update // 'delete' => 'Y', ) ); // $ACL /* * Cette méthode est appelée pendant l’event Controller.initialize qui se produit avant chaque action du controller. * C’est un endroit pratique pour vérifier le statut d’une session ou les permissions d’un utilisateur. * Attention: La méthode beforeFilter() sera appelée pour les actions manquantes. * Retourner une réponse à partir d’une méthode beforeFilter ne va pas empêcher l’appel des autres écouteurs du même event. * Vous devez explicitement stopper l’event (cf https://book.cakephp.org/3.0/fr/controllers.html) * */ //use Cake\Event\Event; public function beforeFilter(\Cake\Event\Event $event) { $this->myDebug("step 1A (specific): MaterielsController.beforeFilter()"); // ICI CEST OK /* $toto="tititoto"; $this->set(compact('toto')); */ parent::beforeFilter($event); } /* * EP added 13/6/17 * Set some useful global variables for all (Materiel) views * Overload beforeRender() * * Cette méthode est appelée pendant l’event Controller.beforeRender qui se produit * APRES l’action du controller mais AVANT que la vue ne soit rendue. * Ce callback n’est pas souvent utilisé, mais peut-être nécessaire si vous appelez render() manuellement à la fin d’une action donnée * * Voir aussi beforeFilter() appellée AVANT l'action du controller */ public function beforeRender(\Cake\Event\Event $event) { $this->myDebug("step 4A (specific) : MaterielsController.beforeRender() - [step 3 = action() si existe]"); parent::beforeRender($event); // $this->layout = 'default'; $this->set('CREATED', self::CREATED); $this->set('VALIDATED', self::VALIDATED); $this->set('TOBEARCHIVED', self::TOBEARCHIVED); $this->set('ARCHIVED', self::ARCHIVED); /* $CAN_EDIT = $IS_CREATED && ( $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 ); $this->set(compact('CAN_EDIT')); */ /* * @todo EP 08/2017 Nouvelle organisation des ACL avec $easyACL */ // !!! MOVED TO APPCONTROLLER !!! /* * $action = $this->getActionPassed(); * if (in_array($action, array('add', 'edit', 'view', 'index'))) { * $hiddenFields = $this->getHiddenFieldsForAction($action); * $this->set('hiddenFields', $hiddenFields); * if (in_array($action, array('add', 'edit'))) { * $mandatoryFields = $this->getMandatoryFieldsForAction($action); * $this->set('mandatoryFields', $mandatoryFields); * $readOnlyFields = $this->getReadOnlyFieldsForAction($action); * $this->set('readOnlyFields', $readOnlyFields); * $haveDefaultValueFields = $this->getDefaultValueFieldsForAction($action); * $this->set('haveDefaultValueFields', $haveDefaultValueFields); * } * } */ //TODO: temporaire, à MOVE dans AppController /* $action = $this->getActionPassed(); if ($action == 'view') { $CAN_EDIT = $IS_CREATED && ($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); $this->set(compact('CAN_EDIT')); } */ } /** * * //param $user * @param $userFromSession * @return boolean Give authorization for materiels */ // CAKEPHP function public function isAuthorized($userFromSession) { //if (parent::isAuthorized($userFromSession)) return TRUE; $this->myDebug("step 2A (specific): MaterielsController.isAuthorized(user)"); $this->myDebug("- user is:", $userFromSession); /* ICI C'EST OK $toto="tititoto"; $this->set(compact('toto')); */ $this->userFromSession = $userFromSession; $configuration = $this->confLabinvent; // ex: 'uid' $this->userCname = $userFromSession[$configuration->ldap_authenticationType][0]; /* * $role = TableRegistry::get('Users')->find() * ->where(['username' => $user[$configuration->authentificationType_ldap][0]]) * ->first()['role']; */ // (EP) deja set par beforeFilter() //$role = $this->getUserRole($user); //$this->userRole = $this->getUserRole($user); // $this->myDebug("role is ".$role); // debug("role is ".$role); // BETTER: // $action = $this->request->getAttribute('params')['action']; // $action = $this->request->getParam('action'); $action = $this->getActionPassed(); // $id = (int) $this->request->getParam('pass.0'); $id = $this->getIdPassed(); //debug($id); // Par défaut, SUPERADMIN a tous les droits, non mais ! // (sauf 'edit' si matos validé, pour faire comme pour admin) if ( ($this->userRole == 'Super Administrateur') && ($action != 'edit') ) return true; /* * @todo EP 08/2017 Nouvelle organisation des ACL avec $easyACL * * //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, $action, $id, $userFromSession)); return $this->isAuthorizedAction($this->userRole, $action, $id, $userFromSession, $this->userCname); } // isAuthorized /* * EP own defined function (18/5/19), date importante * Avantage: TOUTES les ACL (droits des utilisateurs) sont définies en UN SEUL UNIQUE endroit: ICI * Les 3 niveaux successifs parcourus par cakephp (isAuthorized() puis beforeRender() puis la VUE) font tous appels à cette MEME fonction * On ne définit et modifie les droits qu'ici et nulle part ailleurs, surtout pas dans les vues !!! */ private function isAuthorizedAction($role, $action, $id, $user, $userCname) { /* * Structure mise en place: * * switch ACTION * switch ROLE * */ // ICI C'EST PAS OK, why ??? //$toto="tititoto"; //$this->set(compact('toto')); $this->myDebug("step 2B (intermediaire): MaterielsController.isAuthorizedAction($role, $action, $id, user, $userCname)"); //$this->myDebug("- user is ", $user); switch ($action) { // INDEX, VIEW, ADD, FIND // ACL: Accessibles à tous ( cf parent::isAuthorized() ) // (EP 17/5/19) CREATE (add) BY COPY (add/id) case 'add': //debug($id); // add by COPY (il y a un id) => on traite if ($id > 0) { // ON AUTORISE SEULEMENT LA COPIE D'UN MATOS "CREATED" // not CREATED => pas le droit de copier un materiel pas CREATED if (! $this->isCreated($id)) return FALSE; // CREATED => ok, sous conditions else { //debug("copie created"); //if ($this->isCreated($id) || $this->isValidated($id)) { /* * if ($role == 'Utilisateur' && $this->isOwnedBy($id, $user['sn'][0] . ' ' . $user['givenname'][0])) { * return true; * } else if ($role == 'Responsable' && $this->isRespGroup($id, $user[$configuration->authentificationType_ldap][0])) { * return true; * } else if ($this->userHasRoleAtLeast('Administration')) { * return true; * } */ switch ($role) { case 'Utilisateur': //return $this->isOwnedBy($id, $user['sn'][0] . ' ' . $user['givenname'][0]); return $this->isHis($id, $user); break; case 'Responsable': return ( $this->isHis($id, $user) || $this->isRespGroup($id, $userCname) ); default: // All other roles (Admin and more) => OK return TRUE; break; } } // CREATED } // ADD by COPIE break; // ADD // UPDATE (edit) // if ($action == 'edit') { case 'edit': // BETTER: // $id = (int) $this->request->getAttribute('params')['pass'][0]; // /$id = (int) $this->request->getParam('pass.0'); // (EP) TODO: il me semble qu'on devrait ajouter ici // || $this->isToBeArchived($id) // ainsi qu'une autre règle pour isArchived($id) // ??? /* * (EP) ACL: * * - adminplus et superadmin sont autorisés par défaut dans tous les cas * * SSi materiel CREATED ou VALIDATED, autoriser : * - user : si createur de la fiche ou owner du materiel * - resp : si responsable du groupe thematique ou metier de ce materiel * - admin et + : toujours * */ // (EP 23/5/19) NEW optimization $materiel = $this->Materiels->get($id, ['contain' => [ 'SurCategories', 'Categories', 'SousCategories', 'GroupesThematiques', 'GroupesMetiers', 'Organismes', 'Sites', 'Documents', 'Emprunts', 'Suivis', 'Fournisseurs' ] ]); $IS_CREATED = $materiel->status == 'CREATED'; $USER_IS_CREATOR_OR_OWNER = in_array($this->userName, [ $materiel->nom_createur, $materiel->nom_responsable ]); // Current user is same group as current materiel $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->priviledgedUser->groupe_thematique_id) && $this->priviledgedUser->groupe_thematique_id != $this->idGtNa && $materiel->groupes_thematique_id == $this->priviledgedUser->groupe_thematique_id ) ); $CAN_EDIT = $IS_CREATED && ( $this->USER_IS_ADMIN_OR_MORE || $USER_IS_CREATOR_OR_OWNER || ($this->USER_IS_RESPONSABLE && $USER_IS_SAME_GROUP_AS_MATERIEL) ); return $CAN_EDIT; // (EP 23/5/19) OLD METHOD /* // (EP 17/5/19) ON AUTORISE SEULEMENT LA MODIF D'UN MATOS CREATED // UN user Admin ou plus ne pourra le modifier qu'à condition de le "dé-valider" avant if ($this->isCreated($id)) { //if ($this->isCreated($id) || $this->isValidated($id)) { /STAR * if ($role == 'Utilisateur' && $this->isOwnedBy($id, $user['sn'][0] . ' ' . $user['givenname'][0])) { * return true; * } else if ($role == 'Responsable' && $this->isRespGroup($id, $user[$configuration->authentificationType_ldap][0])) { * return true; * } else if ($this->userHasRoleAtLeast('Administration')) { * return true; * } STAR/ switch ($role) { case 'Utilisateur': //return $this->isOwnedBy($id, $user['sn'][0] . ' ' . $user['givenname'][0]); return $this->isHis($id, $user); break; case 'Responsable': // return ($this->isRespGroup($id, $user[$configuration->authentificationType_ldap][0])); //return ($this->isRespGroup($id, $userCname)); //return ($this->isRespGroup($id, $userCname) || $this->isOwnedBy($id, $user['sn'][0] . ' ' . $user['givenname'][0])); return ( $this->isHis($id, $user) || $this->isRespGroup($id, $userCname) ); default: // All other roles (Admin and more) => OK return TRUE; break; } } /STAR (EP 17/5/19) : Ben non, pas le droit, faudra dé-valider avant, non mais !!! if ($this->userHasRoleAtLeast('Administration Plus')) { return true; } STAR/ break; // EDIT */ // DELETE case 'delete': /* * (EP) ACL: * SSi materiel CREATED, autoriser : * - user : si createur de la fiche ou owner du materiel * - resp : si responsable du groupe thematique ou metier de ce materiel * - admin et + : toujours */ if ($this->isCreated($id)) { /* * if ($role == 'Utilisateur' && $this->isOwnedBy($id, $user['sn'][0] . ' ' . $user['givenname'][0])) { * return true; * } else if ($role == 'Responsable' && $this->isRespGroup($id, $user[$configuration->authentificationType_ldap][0])) { * return true; * } else if ($this->userHasRoleAtLeast('Administration')) { * return true; * } */ switch ($role) { case 'Utilisateur': //return ($this->isOwnedBy($id, $user['sn'][0] . ' ' . $user['givenname'][0])); return $this->isHis($id, $user); break; case 'Responsable': return ($this->isRespGroup($id, $userCname)); break; // All other roles : Admin and more default: return true; break; } } break; case 'statusCreated': // de-validation d'un materiel (repasse à CREATED) // /$id = (int) $this->request->getParam('pass.0'); // Admin + ok if ($this->USER_IS_ADMIN_AT_LEAST()) return true; // Resp ok if same group if ($this->USER_IS_RESP() && $this->isRespGroup($id, $userCname)) return true; // User not ok break; case 'statusValidated': // /$id = (int) $this->request->getAttribute('params')['pass'][0]; if ($this->USER_IS_RESP() && $this->isRespGroup($id, $userCname)) { if ($this->isCreated($id)) { return true; } // } else if ($this->userHasRoleAtLeast('Administration')) { } else if ($this->USER_IS_ADMIN_AT_LEAST()) { if ($this->isCreated($id)) { return true; } } break; case 'statusToBeArchived': // /$id = (int) $this->request->getAttribute('params')['pass'][0]; if ($this->USER_IS_RESP() && $this->isRespGroup($id, $userCname)) { if ($this->isValidated($id)) { return true; } // } else if ($this->userHasRoleAtLeast('Administration')) { } else if ($this->USER_IS_ADMIN_AT_LEAST()) { if ($this->isValidated($id)) { return true; } } break; case 'statusArchived': // /$id = (int) $this->request->getAttribute('params')['pass'][0]; // if ($this->userHasRoleAtLeast('Administration')) { // if ($role == 'Super Administrateur') { if ( $this->isToBeArchived($id) && $this->USER_IS_ADMIN_AT_LEAST() ) { if ($this->USER_IS_SUPERADMIN()) return false; return true; } break; case 'export': // if ($this->userHasRoleAtLeast('Responsable')) { if ($this->USER_IS_RESP_AT_LEAST()) { return true; } break; /* * if (in_array($action, [ * 'execActions', * 'setLabelIsPlaced', * 'setLabelIsPlacedOrNotPlaced', * 'setLabelIsNotPlaced', * 'printLabelRuban' * ])) { */ case 'execActions': case 'setLabelIsPlaced': case 'setLabelIsPlacedOrNotPlaced': case 'setLabelIsNotPlaced': case 'printLabelRuban': // if ($this->userHasRoleAtLeast('Administration')) { if ($this->USER_IS_ADMIN_AT_LEAST()) return true; break; /* * // Autorisations par defaut: * default: * return parent::isAuthorized($user); * break; */ } // end of switch case // DEFAULT PARENT RULE return parent::isAuthorized($user); } /* * @todo A déplacer dans Model/Table/TableMateriels * 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, $nomCreateur) { return ($this->Materiels->exists([ 'id' => $id, 'nom_createur' => $nomCreateur ]) || $this->Materiels->exists([ 'id' => $id, 'nom_responsable' => $nomCreateur ])); } // True if materiel with id $id is owned by current user public function isHis($id, $userFromSession) { return ($this->isOwnedBy($id, $userFromSession['sn'][0] . ' ' . $userFromSession['givenname'][0])); } public function isRespGroup($id, $loginResponsable) { $userFromTable = TableRegistry::get('Users')->find() ->where([ 'username' => $loginResponsable ]) ->first(); $u = $userFromTable; if ($u['groupes_metier_id'] !== null && $u['groupes_metier_id'] != TableRegistry::get('GroupesMetiers')->find() ->where([ 'nom =' => 'N/A' ]) ->first()['id']) { return ($this->Materiels->exists([ 'id' => $id, 'groupes_metier_id' => $u['groupes_metier_id'] ])); } else if ($u['groupe_thematique_id'] !== null && $u['groupe_thematique_id'] != TableRegistry::get('GroupesThematiques')->find() ->where([ 'nom =' => 'N/A' ]) ->first()['id']) { // BETTER: return ($this->Materiels->exists([ 'id' => $id, 'groupes_thematique_id' => $u['groupe_thematique_id'] ])); } else { return false; } } public function isCreated($id) { return $this->Materiels->exists([ 'id' => $id, 'status' => 'CREATED' ]); } public function isValidated($id) { return $this->Materiels->exists([ 'id' => $id, 'status' => 'VALIDATED' ]); } public function isToBeArchived($id) { return $this->Materiels->exists([ 'id' => $id, 'status' => 'TOBEARCHIVED' ]); } public function isArchived($id) { return $this->Materiels->exists([ 'id' => $id, 'status' => 'ARCHIVED' ]); } /** * Index method * * @return \Cake\Network\Response|null */ public function index() { $this->myDebug("step 3: MaterielsController.index()"); $condition = ''; if (isset($this->request->getAttribute('params')['pass'][0])) { $condition = [ 'Materiels.status =' => $this->request->getAttribute('params')['pass'][0] ]; //$this->set('STATUS', $this->request->getAttribute('params')['pass'][0]); $this->set('SELECTED_STATUS', $this->request->getAttribute('params')['pass'][0]); } $GM = $this->request->getQuery('GM'); $GT = $this->request->getQuery('GT'); if ($GM !== null || $GT !== null) { if ($GM !== null && $GM != TableRegistry::get('GroupesMetiers')->find() ->where([ 'nom =' => 'N/A' ]) ->first()['id']) $condition = [ 'Materiels.groupes_metier_id =' => $GM, 'Materiels.status !=' => 'ARCHIVED' ]; else if ($GT !== null && $GT != TableRegistry::get('GroupesThematiques')->find() ->where([ 'nom =' => 'N/A' ]) ->first()['id']) $condition = [ 'Materiels.groupes_thematique_id =' => $GT, 'Materiels.status !=' => 'ARCHIVED' ]; else $condition = [ 'Materiels.id =' => 0 ]; } $GMV = $this->request->getQuery('GMV'); $GTV = $this->request->getQuery('GTV'); if ($GMV !== null || $GTV !== null) { if ($GMV !== null && $GMV != TableRegistry::get('GroupesMetiers')->find() ->where([ 'nom =' => 'N/A' ]) ->first()['id']) $condition = [ 'Materiels.groupes_metier_id =' => $GMV, 'Materiels.status =' => 'CREATED', 'Materiels.status !=' => 'ARCHIVED' ]; else if ($GTV !== null && $GTV != TableRegistry::get('GroupesThematiques')->find() ->where([ 'nom =' => 'N/A' ]) ->first()['id']) $condition = [ 'Materiels.groupes_metier_id =' => $GTV, 'Materiels.status =' => 'CREATED', 'Materiels.status !=' => 'ARCHIVED' ]; else $condition = [ 'Materiels.id =' => 0 ]; } $MY = $this->request->getQuery('MY'); if ($MY !== null) { // if ( ! $this->USER_IS_ADMIN_AT_LEAST() ) // if (in_array($this->role, ['Utilisateur', 'Responsable'])) if (in_array($this->getUserRole(), [ 'Utilisateur', 'Responsable' ])) $condition = [ 'Materiels.nom_responsable =' => $this->request->getQuery('MY'), 'Materiels.status !=' => 'ARCHIVED' ]; else $condition = [ 'Materiels.nom_responsable =' => $this->request->getQuery('MY') ]; } // if (in_array($this->role, ['Utilisateur', 'Responsable']) && $condition == '') if (in_array($this->getUserRole(), [ 'Utilisateur', 'Responsable' ]) && $condition == '') $condition = [ 'Materiels.status !=' => 'ARCHIVED' ]; $config = $this->confLabinvent; $limit = $this->request->getQuery('aff'); if ($limit === null) $limit = $config['aff_par_defaut']; $this->paginate = [ 'limit' => $limit, 'maxLimit' => 1000, 'contain' => [ 'SurCategories', 'Categories', 'SousCategories', 'GroupesThematiques', 'GroupesMetiers', 'Organismes', 'Sites' ], 'order' => [ 'Materiels.numero_laboratoire' => 'desc' ] ]; $materiels = $this->paginate($this->Materiels->find('all', [ 'conditions' => $condition ])); $this->set('nbMateriels', $this->Materiels->find('all', [ 'conditions' => $condition ]) ->count()); $this->set(compact('materiels')); $this->set('_serialize', [ 'materiels' ]); } // index() /** * View method * * @param string|null $id * Materiel id. * @return \Cake\Network\Response|null * @throws \Cake\Datasource\Exception\RecordNotFoundException When record not found. */ public function view($id = null) { $this->myDebug("step 3: MaterielsController.view()"); $materiel = $this->Materiels->get($id, [ 'contain' => [ 'SurCategories', 'Categories', 'SousCategories', 'GroupesThematiques', 'GroupesMetiers', 'Organismes', 'Sites', 'Documents', 'Emprunts', 'Suivis', 'Fournisseurs' ] ]); /* * (EP) TODO: * * Selon le role (profil) actif, positionner ces tableaux (listes de champs) * pour dire à quels champs ce role à accès * et dans quelles conditions (lecture seule, obligatoire, ...) * * $hiddenFields = [ fields list ] * $readonlyFields = [ fields list ] * $mandatoryFields = [ fields list ] * $defaultValueForFields = [ field1 => value1, field2 => value2, ..., fieldN => valueN ] * * Passer ensuite ces listes à la vue avec set() * */ $IS_CREATED = ($materiel->status == 'CREATED'); $IS_VALIDATED = ($materiel->status == 'VALIDATED'); $IS_TOBEARCHIVED = ($materiel->status == 'TOBEARCHIVED'); $IS_ARCHIVED = ($materiel->status == '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 ]); $this->set(compact('USER_IS_CREATOR_OR_OWNER')); // Current user is same group as current materiel $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->priviledgedUser->groupe_thematique_id) && $this->priviledgedUser->groupe_thematique_id != $this->idGtNa && $materiel->groupes_thematique_id == $this->priviledgedUser->groupe_thematique_id ) ); $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; $this->set(compact('CAN_VALIDATE')); $this->set(compact('CAN_INVALIDATE')); $this->set(compact('CAN_TBA')); $this->set(compact('CAN_ARCHIVE')); $CAN_ATTACH_A_DOC = $CONTEXT1; $this->set(compact('CAN_ATTACH_A_DOC')); $CAN_MANAGE_SUIVIS = $CONTEXT1; $this->set(compact('CAN_MANAGE_SUIVIS')); $CAN_MANAGE_EMPRUNTS = $CONTEXT1; $this->set(compact('CAN_MANAGE_EMPRUNTS')); $CAN_MANAGE_FILES = $CONTEXT1; $this->set(compact('CAN_MANAGE_FILES')); // NEW //TODO: faire la meme chose pour tous les autres $CAN_ $CAN_EDIT = $this->isAuthorizedAction($this->userRole, 'edit', $id, $this->userFromSession, $this->userCname); // OLD //$CAN_EDIT = $IS_CREATED && $CAN_ATTACH_A_DOC; $this->set(compact('CAN_EDIT')); $CAN_COPY = $CAN_EDIT; $this->set(compact('CAN_COPY')); $configuration = $this->confLabinvent; $CAN_PRINT_LABEL = $IS_VALIDATED && $configuration->hasPrinter && $this->USER_IS_ADMIN_OR_MORE; $this->set(compact('CAN_PRINT_LABEL')); // $status = $this->allStatus[$materiel->status]; $status = self::allStatus[$materiel->status]; $this->set('IS_CREATED', $IS_CREATED); $this->set('IS_VALIDATED', $IS_VALIDATED); $this->set('IS_TOBEARCHIVED', $IS_TOBEARCHIVED); $this->set('IS_ARCHIVED', $IS_ARCHIVED); $this->set('status', $status); $sites = TableRegistry::get('Sites'); //$sites = TableLocator::get('Sites'); $typeSuivis = TableRegistry::get('TypeSuivis'); $typeDocuments = TableRegistry::get('TypeDocuments'); $fournisseurs = TableRegistry::get('Fournisseurs'); //$fournisseurs = TableLocator::get('Fournisseurs'); if ($materiel->photo_id != null) { $imgMateriel = $materiel->photo_id . '.' . TableRegistry::get('Documents')->get($materiel->photo_id)->get('type_doc'); $this->set('imgMateriel', $imgMateriel); } $this->set('PDF_ENGINE', $this->confLabinvent->pdf_engine); $this->set('sites', $sites); $this->set('typeSuivis', $typeSuivis); $this->set('typeDocuments', $typeDocuments); $this->set('fournisseurs', $fournisseurs); $this->set('materiel', $materiel); $this->set('_serialize', [ 'materiel' ]); /* TODO: $CAN_EDIT = $IS_CREATED && ( $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 ); $this->set(compact('CAN_EDIT')); */ } // 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. */ private function add_or_edit($IS_ADD, $id=null, $valeurs=null, $erreurs=null) { $this->myDebug("step 3: MaterielsController.add_or_edit()"); $IS_EDIT = !$IS_ADD; $usersTable = TableRegistry::getTableLocator()->get('Users'); // Set $materiel $materiel = NULL; // ADD if ($IS_ADD) { // 1) on crée un materiel vide $materiel = $this->Materiels->newEntity(); // - COPIE de materiel (on a cliqué sur "Copier ce materiel") => id passé en argument if (isset($this->request->getAttribute('params')['pass'][0])) { // On récupère le materiel à copier et on le copie dans $materiel $materiel_to_copy = $this->Materiels->get($this->request->getAttribute('params')['pass'][0]); $materiel_to_copy = $materiel_to_copy->toArray(); //var_dump($materiel_to_copy); ///foreach ($materiel_to_copy as $key=>$value) $materiel->$key = $value; // IMPORTANT: validate=False car sinon, les données sont validées avant la copie, // et le numero_laboratoire est vu comme invalide car déjà utilisé et doit etre unique !!! // et on a pour résultat : "le matériel n'a pas pu être ajouté" (sans savoir pourquoi !!!) $materiel = $this->Materiels->patchEntity($materiel, $materiel_to_copy, ['validate' => false]); // Du coup, on supprime le champ numero_laboratoire car il va être généré automatiquement unset($materiel->numero_laboratoire); // IMPORTANT: on ne doit pas laisser l'id égal à celui du matériel copié !!! il en faut un nouveau $materiel->id = NULL; //$materiel->id = False; //unset($materiel->id); /* $attribute="[original]"; $materiel->$attribute = []; */ //$materiel->id = FALSE; //$materiel->'[new]' => true, } // - NOUVEAU materiel (on a cliqué sur "Nouveau materiel") else { //$materiel = $this->Materiels->newEntity(); // Set default values : "N/A" $materiel->groupes_thematique_id = 1; $materiel->groupes_metier_id = 1; $materiel->site_id = 9; } } // EDIT else { $materiel = $this->Materiels->get($id, [ 'contain' => [] ]); //$this->myDebug($materiel); } /* SI POST * Les données ont été saisies et postées * On va donc les sauvegarder */ if ( $this->request->is(['post','patch','put']) ) { /* // ADD // Nouveau materiel saisi et posted ($is_add && $this->request->is('post')) || // EDIT // materiel modifié et posted ( (!$is_add) && $this->request->is(['patch','post','put']) ) */ // (1) On remplit $materiel avec les données de ce materiel $materiel = $this->Materiels->patchEntity($materiel, $this->request->getData()); //debug($materiel); //exit; // (2) Si l'utilisateur courant est un "administratif" => le mettre comme gestionnaire du materiel // (tout ça pour ça !!! Faudra réduire ce bazar) $current_user_name = $_SESSION['Auth']['User']['sn'][0]; if (in_array( $current_user_name, $usersTable ->find('list', [ 'keyField' => 'id', 'valueField' => 'nom' ]) ->where([ 'role =' => 'Administration' ]) ->toArray() )) { $materiel->gestionnaire_id = $usersTable ->find() ->where([ 'nom' => $current_user_name ]) ->first()->id; } // (3) On l'ajoute en BD, on envoie un email, et on affiche ok sur page accueil $action = $IS_ADD ? "ajouté" : "modifié"; if ($this->Materiels->save($materiel)) { $this->Flash->success(__("Le matériel a bien été $action".".")); if ($IS_ADD) { $this->sendEmail($materiel); $id = $materiel->id; } /* * EDIT //En attendant un remaniement complet de la fonction //1 = img, doc = 2, mail normal = tout autre argument //$this->sendmail($materiel,5); */ return $this->redirect([ 'action' => 'view', $id ]); } else { $this->myDebug($materiel->errors()); $this->Flash->error(__("Le matériel n'a pas pu être $action".".")); } } // if POST /* SINON (PAS POST) * C'est la première fois qu'on vient sur cette vue, * donc on va préparer le formulaire de saisie) */ //--- 1) INITIALISATION DE LISTES qu'on va passer à la vue (edit ou add) pour assister la saisie (listes de choix proposés) // DOMAINES : LISTE COMPLETE $surCategories = $this->Materiels->SurCategories->find('list', [ 'keyField' => 'id', 'valueField' => 'nom', 'order' => 'SurCategories.nom', // only for add() (was not in edit()) : 'conditions' => array( 'nom !=' => 'N/A' ) ]); // CATEGORIES ET SOUS-CATEG (modes EDIT et ADD-by-COPIE only) $categories = []; $sousCategories = []; //if ( !$is_add or ($is_add and isset($this->request->getAttribute('params')['pass'][0])) ) { if ( $IS_EDIT or ($IS_ADD and !is_null($materiel->sur_categorie_id)) ) { // - Seulement les categories correspondant au domaine choisi $categories = $this->Materiels->Categories->find('list', [ 'conditions' => [ 'Categories.sur_categorie_id' => $materiel->sur_categorie_id ], //'recursive' => - 1, 'keyField' => 'id', 'valueField' => 'nom', 'order' => 'nom', //'order' => 'Categories.nom', ]); // - Seulement les sous-categ correspondant à la categorie choisie $sousCategories = $this->Materiels->SousCategories->find('list', [ 'conditions' => [ 'SousCategories.categorie_id' => $materiel->categorie_id ], //'recursive' => - 1, 'keyField' => 'id', 'valueField' => 'nom', 'order' => 'nom' //'order' => 'SousCategories.nom' ]); } /* (EP) Totalement inutile !!! $categories = $this->Materiels->Categories->find('list', [ 'keyField' => 'id', 'valueField' => 'nom', 'order' => 'Categories.nom' ]); $sousCategories = $this->Materiels->SousCategories->find('list', [ 'keyField' => 'id', 'valueField' => 'nom', 'order' => 'SousCategories.nom' ]); */ $groupesThematiques = $this->Materiels->GroupesThematiques->find('list', [ 'keyField' => 'id', 'valueField' => 'nom', 'order' => 'GroupesThematiques.nom' ]); $groupesMetiers = $this->Materiels->GroupesMetiers->find('list', [ 'keyField' => 'id', 'valueField' => 'nom', 'order' => 'GroupesMetiers.nom' ]); $organismes = $this->Materiels->Organismes->find('list', [ 'keyField' => 'id', 'valueField' => 'nom', 'order' => 'Organismes.nom' ]); $sites = $this->Materiels->Sites->find('list', [ 'keyField' => 'id', 'valueField' => 'nom', 'order' => 'Sites.nom' ]); $designation = $this->Materiels->find('list', [ 'keyField' => 'designation', 'valueField' => 'designation', 'conditions' => array( 'designation !=' => '' ), 'order' => 'designation', 'group' => 'designation' ]); // autocomplete + saisie sites $lieu_detail = $this->Materiels->find('list', [ 'keyField' => 'lieu_detail', 'valueField' => 'lieu_detail', 'conditions' => array( 'lieu_detail !=' => '' ), 'order' => 'lieu_detail', // only for add() (was not in edit()) : 'group' => 'lieu_detail' ]); // Liste fournisseurs $fournisseurs = $this->Materiels->Fournisseurs->find('list', [ 'keyField' => 'id', 'valueField' => 'nom', 'order' => 'Fournisseurs.nom' ]); // Liste des gestionnaires (admin) //$administrateurs = TableRegistry::get('Users')->find('list', [ $administrateurs = $usersTable ->find('list', [ //'keyField' => 'nom', 'keyField' => 'id', 'valueField' => 'nom' ]) ->where([ 'role =' => 'Administration' ]) ->toArray(); $domaineresp = $usersTable->find() ->select('sur_categorie_id') ->where([ 'username =' => $this->LdapAuth->user($this->request->getSession() ->read('authType'))[0] ]) ->first()['sur_categorie_id']; if ($domaineresp == null) $domaineresp = false; // EDIT only if ($IS_EDIT) { $designation_edit = $this->Materiels->find('list', [ 'keyField' => 'id', 'valueField' => 'designation', 'conditions' => array( 'id =' => $materiel->id ) ])->toArray(); //$designation_edit = $designation_edit->toArray(); $lieu_detail_edit = $this->Materiels->find('list', [ 'keyField' => 'id', 'valueField' => 'lieu_detail', 'conditions' => array( 'id =' => $materiel->id ) ])->toArray(); //$lieu_detail_edit = $lieu_detail_edit->toArray(); //(EP) TODO: debug ce truc, c'est du grand n'importe nawak ! $dom = TableRegistry::get('Materiels')->find() ->select('sur_categorie_id') ->where([ 'id =' => $materiel->id ]) ->first()['sur_categorie_id']; $domaines = TableRegistry::get('Users')->find() ->select('sur_categorie_id') ->where([ 'username =' => $this->LdapAuth->user($this->request->getSession() ->read('authType'))[0] ]) ->first()['sur_categorie_id']; $role = TableRegistry::get('Users')->find() ->select('role') ->where([ 'username =' => $this->LdapAuth->user($this->request->getSession() ->read('authType'))[0] ]) ->first()['role']; $domaineresp = ($dom == $domaines); } // EDIT only // not used //$utilisateurconnect = $usersTable->find('all')->toArray(); $users_name = $this->setUsersLists(); /* //$users = TableRegistry::get('LdapConnections')->getListUsers(); //$users = TableRegistry::get('LdapConnections')->getUsersLoginAndEmail(); $users_login_and_email = TableRegistry::getTableLocator()->get('LdapConnections')->getUsersLoginAndEmail(); $users_name = array_keys($users_login_and_email); $users_option_list = []; for ($i = 0; $i < sizeof($users_name); $i ++) { // $users_option_list["Etienne Pallier"] = "Etienne Pallier" $users_option_list[$users_name[$i]] = $users_name[$i]; } */ //--- 2) INITIALISATION DE VARIABLES QU'ON VA PASSER A LA VUE (add.ctp ou edit.ctp) // Le mail de la personne loguée $mail_responsable = $usersTable->find() ->select('email') ->where([ 'username =' => $this->LdapAuth->user($this->request->getSession()->read('authType'))[0] ]) ->first()['email']; /* // ADD only if ($is_add) { // Un id a été passé en argument => Copie de materiel (on a cliqué sur "Copier ce materiel") if (isset($this->request->getAttribute('params')['pass'][0])) { $cpMateriel = $this->Materiels->get($this->request->getAttribute('params')['pass'][0]); $this->set('cpMateriel', $cpMateriel); } } else { */ // EDIT only if ($IS_EDIT) { if (! empty($materiel->get('nom_responsable'))) { //if (! in_array($materiel->get('nom_responsable'), $utilisateurs)) { if (! in_array($materiel->get('nom_responsable'), $users_name)) { $nom_ancien_responsable = $materiel->get('nom_responsable'); $this->set(compact('nom_ancien_responsable')); } } // (EP) Fonction utilisée dans la vue, déclarée ici pour éviter les problèmes de tests $isReadonlyField = function ($fieldName, $myReadonlyFields) { if (!empty($myReadonlyFields) && $myReadonlyFields[0]=='*') { $modifiableFields = $myReadonlyFields; array_shift($modifiableFields); return ! in_array($fieldName, $modifiableFields); } return in_array($fieldName, $myReadonlyFields); }; //$this->set('isReadonlyField', $isReadonlyField); $this->set(compact('isReadonlyField')); $this->set('IS_CREATED', $materiel->status == 'CREATED'); $this->set('IS_VALIDATED', $materiel->status == 'VALIDATED'); $this->set('IS_ARCHIVED_OR_TOBE', in_array($materiel->status, [ 'TOBEARCHIVED', 'ARCHIVED' ])); $this->set(compact( 'role', 'designation_edit', 'lieu_detail_edit' )); } // EDIT only /* About set and compact : * * The compact (php) function returns an associative array, built by taking the names specified in the input array, * using them as keys, and taking the values of the variables referenced by those names and making those the values. * For example: * $fred = 'Fred Flinstone'; * $barney = 'Barney Rubble'; * $names = compact('fred', 'barney'); * => is equivalent to: $names = array('fred' => 'Fred Flinstone', 'barney' => 'Barney Rubble') * * So when you use compact in conjunction with set, * you're using the single parameter form of the set function, * by passing it an associative array of key-value pairs. * * If you just have one variable you want to set on the view, and you want to use the single parameter form, you must invoke set in the same way: * $variable_to_pass = 'Fred'; * $this->set(compact('variable_to_pass')); * * Otherwise, the two parameter form of set can be used: * $variable_to_pass = 'Fred'; * $this->set('variable_to_pass', $variable_to_pass); * * Both achieve the same thing. */ //$this->set(compact('designation', 'utilisateurconnect', 'users', 'materiel', 'surCategories', 'categories', 'sousCategories', 'groupesThematiques', 'groupesMetiers', 'organismes', 'sites', 'utilisateurs', 'mail_responsable', 'domaineresp', 'lieu_detail', 'fournisseurs')); $entity = $materiel; $this->set(compact( 'IS_ADD', 'mail_responsable', 'entity', // new //'materiel', // @deprecated // not used //'utilisateurconnect', 'surCategories', 'categories', 'sousCategories', 'groupesThematiques', 'groupesMetiers', 'organismes', 'sites', 'domaineresp', 'designation', 'lieu_detail', 'fournisseurs', //'utilisateurs', //'users_login_and_email', 'users_option_list', // Gestionnaires (id=>name): 'administrateurs' )); /* (EP) INUTILE (sauf pour faire du json ou xml) !!! $this->set('_serialize', [ 'materiel', ]); */ } //add_or_edit() /** * Add method * * @return \Cake\Network\Response|void Redirects on successful add, renders view otherwise. */ public function add($valeurs = null, $erreurs = null) { $this->add_or_edit(TRUE, null, $valeurs, $erreurs); } /** * Edit method * * @param string|null $id * Materiel id. * @return \Cake\Network\Response|void Redirects on successful edit, renders view otherwise. * @throws \Cake\Network\Exception\NotFoundException When record not found. */ public function edit($id = null) { $this->add_or_edit(FALSE, $id); } /** * Administrer method * * @param string|null $id * Materiel id. * @return \Cake\Network\Response|void Redirects on successful edit, renders view otherwise. * @throws \Cake\Network\Exception\NotFoundException When record not found. */ public function administrer($id = null) { $materiel = $this->Materiels->get($id, [ 'contain' => [] ]); if ($this->request->is([ 'patch', 'post', 'put' ])) { $materiel = $this->Materiels->patchEntity($materiel, $this->request->getData()); if ($this->Materiels->save($materiel, [ 'checkRules' => false ])) { $this->Flash->success(__('Le matériel a bien été édité.')); return $this->redirect([ 'action' => 'view', $id ]); } else $this->Flash->error(__('Le matériel n\'a pas pu être édité.')); } $surCategories = $this->Materiels->SurCategories->find('list', [ 'keyField' => 'id', 'valueField' => 'nom', 'order' => 'SurCategories.nom' ]); $categories = $this->Materiels->Categories->find('list', [ 'keyField' => 'id', 'valueField' => 'nom', 'order' => 'Categories.nom' ]); $sousCategories = $this->Materiels->SousCategories->find('list', [ 'keyField' => 'id', 'valueField' => 'nom', 'order' => 'SousCategories.nom' ]); $groupesThematiques = $this->Materiels->GroupesThematiques->find('list', [ 'keyField' => 'id', 'valueField' => 'nom', 'order' => 'GroupesThematiques.nom' ]); $groupesMetiers = $this->Materiels->GroupesMetiers->find('list', [ 'keyField' => 'id', 'valueField' => 'nom', 'order' => 'GroupesMetiers.nom' ]); $organismes = $this->Materiels->Organismes->find('list', [ 'keyField' => 'id', 'valueField' => 'nom', 'order' => 'Organismes.nom' ]); $sites = $this->Materiels->Sites->find('list', [ 'keyField' => 'id', 'valueField' => 'nom', 'order' => 'Sites.nom' ]); $fournisseurs = $this->Materiels->Fournisseurs->find('list', [ 'keyField' => 'id', 'valueField' => 'nom', 'order' => 'Fournisseurs.nom' ]); $users = TableRegistry::getTableLocator()->get('LdapConnections')->getListUsers(); // tri des utilisateurs par nom sort($users); $utilisateurs = []; for ($i = 0; $i < sizeof($users); $i ++) { $utilisateurs[$users[$i]] = $users[$i]; } if (! empty($materiel->get('nom_responsable'))) { if (! in_array($materiel->get('nom_responsable'), $utilisateurs)) { $nom_ancien_responsable = $materiel->get('nom_responsable'); $this->set(compact('nom_ancien_responsable')); } } $mail_responsable = TableRegistry::get('Users')->find() ->select('email') ->where([ 'username =' => $this->LdapAuth->user($this->request->getSession() ->read('authType'))[0] ]) ->first()['email']; $this->set('IS_CREATED', $materiel->status == 'CREATED'); $this->set('IS_VALIDATED', $materiel->status == 'VALIDATED'); $this->set('IS_ARCHIVED_OR_TOBE', in_array($materiel->status, [ 'TOBEARCHIVED', 'ARCHIVED' ])); $this->set(compact('materiel', 'surCategories', 'categories', 'sousCategories', 'groupesThematiques', 'groupesMetiers', 'organismes', 'sites', 'utilisateurs', 'mail_responsable', 'fournisseurs')); $this->set('_serialize', [ 'materiel' ]); } /** * Delete method * * @param string|null $id * Materiel 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']); $materiel = $this->Materiels->get($id); if ($this->Materiels->delete($materiel)) { $this->Flash->success(__('Le matériel a bien été supprimé.')); $this->sendEmail($materiel); } else $this->Flash->error(__('Le matériel n\'a pas pu être supprimé.')); return $this->redirect([ 'action' => 'index' ]); } /** * StatusSetTo method * * @param string $newStatus * @param string $message * @param string $id * @param string $from * @return \Cake\Network\Response|NULL */ private function statusSetTo($newStatus, $message, $id = null, $from = 'index', $onlyOneMateriel = True) { $materiel = $this->Materiels->get($id)->set('status', $newStatus); if ($newStatus == 'ARCHIVED') $materiel->set('date_archivage', date('Y-m-d')); if ($newStatus == 'VALIDATED') { $mandatoryFields = array( $materiel->nom_responsable, $materiel->fournisseur_id, $materiel->numero_commande, $materiel->organisme_id, $materiel->date_reception, $materiel->prix_ht ); // Ne pas oublier les espaces après chaque virgule/fin de ligne (sinon le message d'erreur est pas joli) $msgError1 = "Pour valider un matériel, les champs suivants ne doivent pas être vides : Date de reception, Nom utilisateur, Fournisseur, Organisme, Prix, et Numéro de commande"; $msgError2 = "Le statut du matériel " . $materiel->designation . " (" . $materiel->numero_laboratoire . ") n'a pas pu être modifié"; foreach ($mandatoryFields as $field) { if ($field === null || $field == '') { if ($onlyOneMateriel) { /* (EP 2020 03) * Ce genre de ligne ($this->Flash->...) affichant un message flash en haut de page, * ne fonctionnait plus à cause de bootstrap (css). * Ca fonctionne uniquement parce qu'on a surchargé la règle "fade" * de bootstrap dans inventirap.css * (il se peut qu'on n'aie plus besoin de faire ça dans une prochaine version * de bootstrap, ou bootsrap-ui, ou cakephp..., à surveiller donc) */ $this->Flash->error($msgError1); // (EP 2020 03) Si on ne veut pas de bouton de suppression du message : //$this->Flash->set($msgError1, ['params' => ['class' => 'alert alert-dismissible in alert-danger']]); //$this->Flash->set($msgError1, ['params' => ['class' => 'alert alert-dismissible fade in alert-danger']]); return $this->redirect([ 'action' => 'edit', $id ]); } else { $this->Flash->error($msgError2); return False; } } } } $success = False; if (! $this->Materiels->save($materiel, [ 'checkRules' => false, 'checkExisting' => false ])) $this->Flash->error(__($msgError2 . " (cannot be saved)")); else { $success = True; if ($onlyOneMateriel) $this->Flash->success(__($message)); // TODO: ce code ne peut pas marcher !!! il faut faire un SAVE if ($newStatus == 'VALIDATED') if (in_array($_SESSION['Auth']['User']['sn'][0], TableRegistry::get('Users')->find('list', [ 'keyField' => 'id', 'valueField' => 'nom' ]) ->where([ 'role =' => 'Administration' ]) ->toArray())) { $gestionnaireID = TableRegistry::get('Users')->find() ->where([ 'nom' => $_SESSION['Auth']['User']['sn'][0] ]) ->first()->id; $materiel->gestionnaire_id = $gestionnaireID; // TODO: SAVE !!! } //$this->sendEmail($materiel); //évite le double envoi car il y a un envoi de mail a la fonction add et à l'état created //évite les envois succcessifs si qqn fait une erreur sur la fiche, valide la fiche, et dévalide pour remodifier if ($newStatus == 'ARCHIVED' || $newStatus == 'TOBEARCHIVED') { $this->sendmail($materiel,3); } } if (! $onlyOneMateriel) return $success; if ($from == 'index') return $this->redirect([ 'action' => $from ]); else return $this->redirect([ 'action' => $from, $id ]); } /** * StatusCreated method (retrograder le statut en le repassant à CREATED) * De-Valider ou In-valider * * @param string $id * @param string $from */ public function statusCreated($id = null, $from = 'index') { $this->statusSetTo('CREATED', 'Le matériel a bien été rétrogradé au statut CREATED', $id, $from); } /** * StatusValidated method * * @param string $id * @param string $from */ public function statusValidated($id = null, $from = 'index') { $this->statusSetTo('VALIDATED', 'Le matériel a bien été validé', $id, $from); /* * (EP) moved to statusSetTo() * if (in_array($_SESSION['Auth']['User']['sn'][0], TableRegistry::get('Users') * ->find('list', ['keyField' => 'id', 'valueField' => 'nom']) * ->where(['role =' => 'Administration']) * ->toArray())) { * $gestionnaireID = TableRegistry::get('Users')->find()->where(['nom' => $_SESSION['Auth']['User']['sn'][0]])->first()->id; * $materiel->gestionnaire_id = $gestionnaireID; * } * $this->sendEmail($this->Materiels->get($id)); */ } /** * StatusToBeArchived method * * @param string $id * @param string $from */ public function statusToBeArchived($id = null, $from = 'index') { $this->statusSetTo('TOBEARCHIVED', 'La sortie d\'inventaire a bien été demandée', $id, $from); // (EP) moved to statusSetTo() // $this->sendEmail($this->Materiels->get($id)); } /** * StatusArchived method * * @param string $id * @param string $from */ public function statusArchived($id = null, $from = 'index') { $this->statusSetTo('ARCHIVED', 'Le matériel a bien été sorti de l\'inventaire', $id, $from); // (EP) moved to statusSetTo() // $this->sendEmail($this->Materiels->get($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) != '')) if ($this->request->getData($searchFieldName)) return [ "Materiels.$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) != '')) //if ($this->request->getData($searchFieldName)) return [ "Materiels.$fieldName =" => $this->request->getData($searchFieldName) ]; if ($this->request->getData($searchFieldName)) return [ "Materiels.$fieldName LIKE" => $this->request->getData($searchFieldName) ]; return NULL; } /* * @param string $general_search_field_name : 's_all' or 's_all2' */ private function find_general($general_search_field_name) { $all = $this->request->getData($general_search_field_name); // 's_all' or 's_all2' //$generalFieldConditions = NULL; // Check for a date foreach ( [ "/", "-" ] as $symb) { $nbocc = substr_count($all, $symb); //$pos1 = strpos($all, $symb); // Première occurence //$pos2 = strripos($all, $symb); // Dernière occurence //debug($nbocc); debug($symb); //if ($pos1 !== false && $pos2 !== false && $pos2 != $pos1) { if ($nbocc == 2) { list ($dd, $mm, $yyyy) = explode($symb, $all); if (checkdate((int) $mm, (int) $dd, (int) $yyyy)) { $all = "$yyyy-$mm-$dd"; break; } } } // End datecheck // Si $all = "dell pallier", ça va chercher les lignes de la table matériel qui contiennent "dell" ET "pallier" dans n'importe quelle colonne $tabSearch = explode(' ', $all); $merge = []; foreach ($tabSearch as $word) { $field_conditions = [ /* (EP) : * Utilisation de array() [] pour pouvoir mettre plusieurs fois la meme clé. * Exemple : la clé "Materiels.designation LIKE" pourra apparaître plusieurs fois si on fait une recherche de "mac pc" * On aura : "Materiels.designation LIKE" => '%mac%' et "Materiels.designation LIKE" => '%pc%' * Sinon on aurait uniquement eu : "Materiels.designation LIKE" => '%pc%' */ // 1) Materiels table direct (straight) columns [ 'Materiels.designation LIKE' => '%' . $word . '%' ], [ 'Materiels.numero_laboratoire LIKE' => '%' . $word . '%' ], [ 'Materiels.numero_inventaire_organisme LIKE' => '%' . $word . '%' ], [ 'Materiels.numero_inventaire_old LIKE' => '%' . $word . '%' ], [ 'Materiels.numero_commande LIKE' => '%' . $word . '%' ], [ 'Materiels.description LIKE' => '%' . $word . '%' ], [ 'Materiels.nom_responsable LIKE' => '%' . $word . '%' ], [ 'Materiels.email_responsable LIKE' => '%' . $word . '%' ], [ 'Materiels.code_comptable LIKE' => '%' . $word . '%' ], [ 'Materiels.numero_serie LIKE' => '%' . $word . '%' ], [ 'Materiels.date_acquisition LIKE' => '%' . $word . '%' ], [ 'Materiels.lieu_detail LIKE' => '%' . $word . '%' ], // 2) Materiels table foreign keys [ 'Fournisseurs.nom LIKE' => '%' . $word . '%' ], [ 'Categories.nom LIKE' => '%' . $word . '%' ], ]; /* (EP) * For N words in $tabSearch, this will return $merge1 AND $merge2 AND ... $mergeN * (each merge being a list of OR conditions) * Ex: * Si $tabSearch = "dell pallier", ça va chercher les lignes de la table matériel qui contiennent "dell" ET "pallier" dans n'importe quelle colonne * * Utilisation de array() [] pour pouvoir mettre plusieurs fois la meme clé "AND". */ $merge = array_merge($merge, [[ 'AND' => ['OR' => $field_conditions] ]] ); //$merge = array_merge($merge, $field_conditions); } //debug($merge); return $merge; //return [ 'OR' => $merge ]; } private function find_specific_fields() { // Materiel type $matostype = $this->request->getData('s_matostype'); $matostypeRequest = NULL; switch ($matostype) { // Administratif case 'A': $matostypeRequest['Materiels.materiel_administratif ='] = '1'; break; // Technique case 'T': $matostypeRequest['Materiels.materiel_technique ='] = '1'; break; // Admin et Tech case 'AT': $matostypeRequest['Materiels.materiel_administratif ='] = '1'; $matostypeRequest['Materiels.materiel_technique ='] = '1'; break; // Admin ONLY case 'AO': $matostypeRequest['Materiels.materiel_administratif ='] = '1'; $matostypeRequest['Materiels.materiel_technique ='] = '0'; break; // Tech ONLY case 'TO': $matostypeRequest['Materiels.materiel_administratif ='] = '0'; $matostypeRequest['Materiels.materiel_technique ='] = '1'; break; } $periode_acquisitionRequest = NULL; $date_acquisition = NULL; $salle = NULL; $fournisseur = NULL; if ($this->request->getData('s_periode_acquisition1') != '') $periode_acquisitionRequest['Materiels.date_acquisition >='] = date('Y-m-d', strtotime(str_replace('/', '-', $this->request->getData('s_periode_acquisition1')))); if ($this->request->getData('s_periode_acquisition2') != '') $periode_acquisitionRequest['Materiels.date_acquisition <='] = date('Y-m-d', strtotime(str_replace('/', '-', $this->request->getData('s_periode_acquisition2')))); if ($this->request->getData('s_date_acquisition') != '') $date_acquisition['Materiels.date_acquisition LIKE'] = '%' . date('Y-m-d', strtotime(str_replace('/', '-', $this->request->getData('s_date_acquisition')))) . '%'; $montantRequest = []; if ($this->request->getData('s_prix_ht_inf') != '') $montantRequest['Materiels.prix_ht <='] = $this->request->getData('s_prix_ht_inf'); if ($this->request->getData('s_prix_ht_sup') != '') $montantRequest['Materiels.prix_ht >='] = $this->request->getData('s_prix_ht_sup'); if ($this->request->getData('s_salle') !== null && $this->request->getData('s_salle') != '') $salle['Materiels.lieu_detail LIKE'] = '%' . $this->request->getData('s_salle') . '%'; if ($this->request->getData('s_fournisseur_id') !== null && $this->request->getData('s_fournisseur_id') != '') $fournisseur['Materiels.fournisseur_id ='] = $this->request->getData('s_fournisseur'); /* TODO: (EP 2019/01) NOUVEAU CODE POUR REMPLACER LE CODE SUPER REDONDANT D'AVANT (300 lignes !!!) */ $designation = NULL; if ($this->request->getData('s_designation')) { //$designation_words = []; //$designation_words = explode (" ", $this->request->getData('s_designation')); $designation = str_replace(" ","%", $this->request->getData('s_designation')); $designation = [ 'Materiels.designation LIKE' => '%'.$designation.'%' ]; #TODO: gérer un peu mieux le cas où le champ designation contient plusieurs mots: en cherchant chaque mot séparément (avec un "OU") : /* $designation_conditions = []; for ($i = 0; $i < count($designation); $i++) { //'Materiels.designation LIKE' => '%' . $designation[0]. '%', //'Materiels.designation LIKE' => '%' . $designation[1]. '%', $designation_conditions['Materiels.designation LIKE'] = '%'.$designation_words[$i].'%'); } */ } // Putting all these specific fields together $specificFieldsConditions = [ //'Materiels.designation LIKE' => '%' . $designation[0] . '%', //'Materiels.designation LIKE' => '%' . $this->request->getData('s_designation'). '%', $designation, //'Materiels.numero_laboratoire LIKE' => '%' . $this->request->getData('s_numero_laboratoire') . '%', $this->getConditionForField('numero_laboratoire'), $this->getConditionForField('numero_commande'), $date_acquisition, $periode_acquisitionRequest, $this->getConditionForFieldNumber('prix_ht'), $montantRequest, $this->getConditionForFieldNumber('sur_categorie_id'), $this->getConditionForFieldNumber('categorie_id'), $this->getConditionForFieldNumber('sous_categorie_id'), $this->getConditionForField('nom_responsable'), $this->getConditionForField('numero_inventaire_organisme'), $this->getConditionForField('numero_inventaire_old'), $this->getConditionForFieldNumber('groupes_metier_id'), $this->getConditionForFieldNumber('groupes_thematique_id'), $salle, //$fournisseur, $this->getConditionForFieldNumber('fournisseur_id'), $this->getConditionForFieldNumber('organisme_id'), $matostypeRequest, $this->getConditionForFieldNumber('organisme_id'), $matostypeRequest, $this->getConditionForField('status'), ]; //debug($specificFieldsConditions); return $specificFieldsConditions; } // find_specific_fields() /* ******************** * Create all needed LISTS and pass them to the VIEW (find) * ******************** */ private function set_elements_lists_for_view_find() { $s_sur_categories = $this->Materiels->SurCategories->find('list', [ 'keyField' => 'id', 'valueField' => 'nom', 'order' => 'SurCategories.nom' ]); $s_categories = $this->Materiels->Categories->find('list', [ 'keyField' => 'id', 'valueField' => 'nom', 'order' => 'Categories.nom' ]); $s_sous_categories = $this->Materiels->SousCategories->find('list', [ 'keyField' => 'id', 'valueField' => 'nom', 'order' => 'SousCategories.nom' ]); $s_groupes_thematiques = $this->Materiels->GroupesThematiques->find('list', [ 'keyField' => 'id', 'valueField' => 'nom', 'order' => 'GroupesThematiques.nom' ]); $s_groupes_metiers = $this->Materiels->GroupesMetiers->find('list', [ 'keyField' => 'id', 'valueField' => 'nom', 'order' => 'GroupesMetiers.nom' ]); $s_organismes = $this->Materiels->Organismes->find('list', [ 'keyField' => 'id', 'valueField' => 'nom', 'order' => 'Organismes.nom' ]); $s_fournisseurs = $this->Materiels->Fournisseurs->find('list', [ 'keyField' => 'id', 'valueField' => 'nom', 'order' => 'Fournisseurs.nom' ]); //debug($s_fournisseurs); exit; $s_salles = $this->Materiels->find('list', [ 'keyField' => 'lieu_detail', 'valueField' => 'lieu_detail', 'order' => 'lieu_detail', 'conditions' => array( 'status !=' => 'ARCHIVED', 'lieu_detail !=' => 'null' ) ]); $s_nomresp = $this->Materiels->find('list', [ 'keyField' => 'nom_responsable', 'valueField' => 'nom_responsable', 'order' => 'nom_responsable', 'conditions' => array( 'status !=' => 'ARCHIVED', 'nom_responsable !=' => 'null' ) ]); /* (EP) Depuis le 2/4/19, cette variable n'est plus utilisée * car on préfère la recherche plein texte plutot que dans une liste * On pourrait donc mettre en commentaire, mais bon... */ $s_numero_laboratoire = $this->Materiels->find('list', [ 'keyField' => 'numero_laboratoire', 'valueField' => 'numero_laboratoire', 'order' => 'numero_laboratoire', 'conditions' => array( 'status !=' => 'ARCHIVED', 'numero_laboratoire !=' => 'null' ) ]); $categories = $this->Materiels->Categories; // Pass all these LISTS to the view : $this->set(compact('s_numero_laboratoire', 's_nomresp', 's_sur_categories', 's_categories', 's_sous_categories', 's_groupes_thematiques', 's_groupes_metiers', 's_organismes', 's_fournisseurs', 's_salles', 'categories')); } // set_elements_lists_for_view_find() /** * Find method * (EP) tout refait le 18/1/17 pour que ça soit plus lisible et moins bugué... */ public function find() { $this->set_elements_lists_for_view_find(); // Get the previous search result (from session) set in the view (find.ctp) $resultTri = $this->request->getSession()->read("resultTri"); // Do not show Archived materiel if not Admin $conditionNotArchived = $this->USER_IS_ADMIN_AT_LEAST() ? '' : [ 'Materiels.status !=' => 'ARCHIVED' ]; // if (! (in_array($this->role, ['Administration', 'Administration Plus', 'Super Administrateur']))) /* ******************** * Plusieurs cas possibles: * - (1) SI POST (getData()) : * - (1.1) WITH DATA (au moins un champ rempli, avec ou sans critère de tri) : * - (1.1.1) recherche globale (s_all ou s_all2) : * - (1.1.1.1) s_all2 (champ de recherche global en bas à gauche) => recherche globale (toutes les tables) * - (1.1.1.2) s_all (champ de recherche général matériel tout au début du formulaire de recherche, en haut de page) => recherche générale sur la table matériel (et tables liées) * - (1.1.2) recherche spécifique : 1 ou plusieurs champ(s) spécifique(s) (s_designation, ...) => recherche sur champs spécifiques * - (1.2) NO DATA, only empty fields : Une recherche a été soumise sans remplir aucun champ !! => ne rien faire * - (2) SINON : * - (2.1) avec critères de tri => sort_result() : Devant le résultat d'une recherche, on a simplement cliqué sur une colonne pour afficher le résultat TRIÉ (sorted) * - (2.2) sans critère de tri => c'est la première fois qu'on vient sur la vue, rien à faire de plus * ******************** */ // (1) POST if ($this->request->is('post')) { $has_data = FALSE; foreach ($this->request->getData() as $k=>$v) { if ($v != '') { $has_data = TRUE; break; } } // (1.1) POST with data if ($has_data) { ///debug("post with data"); // (1.1.1) Recherche globale (s_all_2 ou s_all) : /* * TODO: Distinguer la recherche globale dans TOUTES les tables (s_all_2) de la recherche générale seulement dans la table matériel (s_all) * - Pour le moment, les résultats sont les mêmes pour ces 2 champs (normal, on fait le même traitement), c'est pas normal !!! * - Recherche s_all ok : il faudrait juste améliorer la recherche dans toutes les tables liées au matériel (fournisseur, organismes, catégories...) * - Recherche s_all_2 pas faite : à inventer... * - Ajouter des tests de recherche (nombreux cas possibles) */ if ( $this->request->getData('s_all_2') || $this->request->getData('s_all') ) { ///debug("recherche globale"); $general_search_field_name = $this->request->getData('s_all_2') ? 's_all_2':'s_all'; $conditions = $this->find_general($general_search_field_name); /* if ($this->request->getData('s_all_2')) debug("s_all2, recherche globale (toutes les tables)"); else if ($this->request->getData('s_all')) debug("s_all, recherche générale dans la table des matériels (et tables associées)"); */ } // (1.1.2) recherche spécifique : 1 ou plusieurs champ(s) spécifique(s) (s_designation, ...) => recherche sur champs spécifiques else { ///debug("recherche de champs spécifiques dans la table des matériels"); $conditions = $this->find_specific_fields(); } // CONSTRUCTION DE LA REQUETE SQL COMPLETE = $specificFieldsConditions OR $generalFieldConditions (mais entre chaque champ, c'est un AND) // by default, no sort $conditions = [ $conditions, $conditionNotArchived ]; //debug($conditions); exit; $lastResults = $this->Materiels->find('all', [ 'conditions' => $conditions, 'contain' => ['Categories', 'Fournisseurs'] ])->limit(1000); $this->paginate = [ 'maxLimit' => 1000, 'limit' => 1000 ]; //debug($lastResults); exit; $_results = $this->paginate($lastResults); $this->set(compact('_results')); // pour l'export $this->request->getSession()->write("result", $lastResults->toArray()); } // $has_data // (1.2) POST without data else { ///debug("post without data => do nothing"); // with sort field => trier un résultat // without sort field => c'est la première visite de cette vue } } // (2) no POST else { ///debug("no POST"); // (2.1) AVEC critère de tri (sort) => seulement demandé un tri du résultat, no data posted /* * TODO: on pourrait faire autrement: * A chaque fois qu'on fait un tri sur une colonne, * au lieu de sauvegarder le résultat de la recherche dans une variable de session puis recharger ce résultat en mémoire pour le trier, * il vaudrait mieux relancer la recherche à chaque fois, mais juste changer le critère de tri, c'est plus simple, plus naturel */ if ($resultTri!==null && strstr($this->request->here(),'sort')!=false && strstr($this->request->here(),'direction')!=false) { $foundMateriel = []; foreach ($resultTri as $r) { array_push($foundMateriel, $r->id); } /* $res = $this->Materiels->find('all', [ //'contain' => ['Categories', 'Fournisseurs'], 'limit' => 1000 ]); for ($i = 0; $i < sizeof($foundMateriel); $i ++) { $res->orWhere([ 'id =' => $foundMateriel[$i] ]); } */ $res = $this->Materiels->find() ->limit(1000) // (EP) Attention, si on ajoute un "->contain", on devra utiliser 'Materiels.id' et non pas 'id' tout seul (ci-dessous) ->contain(['Categories', 'Fournisseurs']); for ($i=0; $iorWhere([ // Ca plante si on met que 'id' => action impossible, tu parles d'un message parlant !!! // OK seulement si pas de ->contain() //'id =' => $foundMateriel[$i] // Si on utilise ->contain(), il faut préciser 'Materiels.id' 'Materiels.id =' => $foundMateriel[$i] ]); } $this->paginate = [ 'maxLimit' => 1000, 'limit' => 1000 ]; $_results = $this->paginate($res); $this->set(compact('_results')); // pour l'export $this->request->getSession()->write("result", $res->toArray()); } // (2.2) SANS critère de tri => c'est la première fois qu'on vient sur la vue, rien à faire de plusl else { ///debug("1ère venue sur la vue"); } } // no POST } // find() /** * group update status + exportAll */ public function execActions() { // var_dump($this->request->getData('updateSelectedStatus')); if ($this->request->getData('updateSelectedStatus') !== null) $this->updateSelectedStatus(); else $this->export(); } /** * group update status (selected from materiels/index) */ private function updateSelectedStatus() { /* * var_dump($nb); * var_dump($this->request->getData); * var_dump($this->request->getData('updateSelectedStatus')); * var_dump($this->request->getData()); */ //if (isset($this->request->getData()) && sizeof($this->request->getData()) > 0) { if (sizeof($this->request->getData()) > 0) { $this->myDebug("IN UPDATE"); $this->myDebug($this->request->getData()); $what = $this->request->getData('what'); $nb = 0; if (in_array($what, $this->NOTARCHIVED)) { foreach ($this->request->getData() as $id => $value) { // seulement les post data integers (id des materiels checked ou non) if (! is_int($id)) continue; // seulement les id des materiels CHECKED (==1) if ($value == 0) continue; $materiel = $this->Materiels->get($id); $materielIdentification = $materiel->designation . '-' . $materiel->numero_laboratoire; switch ($what) { case 'CREATED': $new = 'VALIDATED'; $msgError = "le materiel " . $materielIdentification . " n'a pas pu être validé car au moins un des champs nécessaire n'est pas rempli."; break; case 'VALIDATED': $new = 'TOBEARCHIVED'; $msgError = "La demande de sortie de l'inventaire du matériel " . $materielIdentification . " n'a pas pu s'effectuer."; break; case 'TOBEARCHIVED': $new = 'ARCHIVED'; $msgError = "le materiel " . $materielIdentification . " n'a pas pu être archivé."; break; } // if mode_debug desactivate (POURQUOI ???) if (! $this->isLabinventDebugMode()) { if (! $this->statusSetTo($new, 'Le matériel a bien été ???', $id, 'index', false)) $nb --; /* * //debug($materiel); exit; * if ($materiel->nom_responsable === null || $materiel->fournisseur_id === null || $materiel->numero_commande === null || $materiel->organisme_id === null || $materiel->date_reception === null || $materiel->prix_ht === null) { * $this->Flash->error($msgError); * $nb --; * } else { * $materiel->set('status', $new); * $this->Materiels->save($materiel, ['checkRules' => false, 'checkExisting' => false]); * } */ } $nb ++; } // foreach if ($nb > 0) $this->Flash->success(__($nb . ' matériel(s) mis à jour')); $this->myDebug("Nb matos = " . $nb); if (! $this->isLabinventDebugMode()) return $this->redirect([ 'action' => 'index', 'page' => $this->request->getQuery('page'), $what ]); } } } /** * Export method * Generation d'un fichier .csv comportant la date du jour * CSV export of the list of materiels * This action is called from 3 different sources : * - tools * - materiels/find * - materiels/index (from the 2 submit green buttons named "Exporter la liste...") * Optional parameter "what:value" may be passed when calling this action, and is read from $this->getAttribute('params')['named']['what'] * ex : materiels/export/what:toValidate */ public function export() { function getElementFromList($listName, $materiel, $fkName) { $ISOK = ( !is_null($materiel->$fkName) && !is_null($listName[$materiel->$fkName]) ); return $ISOK ? $listName[$materiel->$fkName] : ""; } //$materiels = NULL; $materiels = []; $surCategories = $this->Materiels->SurCategories->find('list', [ 'keyField' => 'id', 'valueField' => 'nom' ])->toArray(); $categories = $this->Materiels->Categories->find('list', [ 'keyField' => 'id', 'valueField' => 'nom' ])->toArray(); $sousCategories = $this->Materiels->SousCategories->find('list', [ 'keyField' => 'id', 'valueField' => 'nom' ])->toArray(); $groupesThematiques = $this->Materiels->GroupesThematiques->find('list', [ 'keyField' => 'id', 'valueField' => 'nom' ])->toArray(); $groupesMetiers = $this->Materiels->GroupesMetiers->find('list', [ 'keyField' => 'id', 'valueField' => 'nom' ])->toArray(); $organismes = $this->Materiels->Organismes->find('list', [ 'keyField' => 'id', 'valueField' => 'nom' ])->toArray(); $sites = $this->Materiels->Sites->find('list', [ 'keyField' => 'id', 'valueField' => 'nom' ])->toArray(); $what = ''; $this->myDebug($this->request->getData()); // Critères pour requete sql sur materiels $contain = ['Fournisseurs']; $order = ['numero_laboratoire' => 'DESC']; $CAS = 0; // CAS 1 - EXPORT SELECTED materiels only if ($this->request->getData('export') !== null) { $CAS = 1; $this->myDebug("IN EXPORT"); $what = $this->request->getData('what'); $selectedMateriels = []; $i = 0; //$data = $this->request->getData(); $data = $this->request->getData(); foreach ($data as $val) { if ($val == 1) { $selectedMateriels[$i] = key($data); $i ++; } next($data); } $this->myDebug($selectedMateriels); /* // Si la liste de materiels cochés est vide, ne rien faire if (empty($selectedMateriels)) { if ($what != '' && $what != 'search') return $this->redirect(['action' => 'index', $what]); else if ($what == 'search') return $this->redirect('javascript:window.history.go(-3)'); else return $this->redirect(['action' => 'index']); } */ //if (sizeof($selectedMateriels) > 0) { if (! empty($selectedMateriels)) { /* $materiels = $this->Materiels->find('all') ->where(['Materiels.id' => $selectedMateriels[0]]) ->contain($contain); for ($j = 0; $j < sizeof($selectedMateriels); $j ++) { $materiels->orWhere([ 'Materiels.id' => $selectedMateriels[$j] ]); } */ //$materielsTable = TableRegistry::getTableLocator()->get('Materiels'); //$materiels = $materielsTable->find() $materiels = $this->Materiels->find() ->contain($contain) ->where(['Materiels.id' => $selectedMateriels[0]]); for ($j = 0; $j < sizeof($selectedMateriels); $j ++) $materiels->orWhere( ['Materiels.id' => $selectedMateriels[$j]] ); $materiels->order($order); /* $materiels = $this->Materiels->find() ->contain($contain) ->where([ //'OR' => [['id' => 2], ['id' => 10]], 'OR' => [$selectedMateriels], ]); */ } //$this->myDebug($materiels); //} // CAS 2 - EXPORT ALL materiels } else if ($this->request->getData('exportAll') !== null) { $CAS = 2; $this->myDebug("IN EXPORT ALL"); // Exporte seulement les materiels du statut coché if ($this->request->getData('what') !== null) { $what = $this->request->getData('what'); $status = $what; /* $materiels = $this->Materiels->find('all', [ 'conditions' => [ 'Materiels.status =' => $status ], 'contain' => $contain ]); */ $materiels = $this->Materiels ->find() ->where(['Materiels.status =' => $status]) ->contain($contain) ->order($order); // Exporte seulement TOUS les materiels (sauf ARCHIVED) } else { $status = 'ARCHIVED'; /* $materiels = $this->Materiels->find('all', [ 'conditions' => [ 'Materiels.status !=' => $status ], 'contain' => $contain ]); */ $materiels = $this->Materiels ->find() ->where(['Materiels.status !=' => $status]) ->contain($contain) ->order($order); } $this->myDebug("what is " . $what); $this->myDebug("statut is " . $status); // CAS 3 - Export du résultat de Recherche } else if (isset($this->request->getAttribute('params')['pass'][0])) { $CAS = 3; $this->myDebug("RECHERCHE"); $what = $this->request->getAttribute('params')['pass'][0]; if ($what == 'search') { $materiels = $this->request->getSession()->read("result"); } // CAS 4 (???) - Tous les matériels (sauf ARCHIVED) } else { $CAS = 4; $this->myDebug("OTHER CASE 4"); /* $materiels = $this->Materiels->find('all', [ 'conditions' => [ 'Materiels.status !=' => 'ARCHIVED' ], 'contain' => $contain ]); */ $materiels = $this->Materiels ->find() ->where(['Materiels.status !=' => 'ARCHIVED']) ->contain($contain) ->order($order); } // (EP) Si aucun materiel retourné par la sélection => terminé, ne rien faire, basta if (empty($materiels)) { if ($what != '' && $what != 'search') return $this->redirect(['action' => 'index', $what]); else if ($what == 'search') return $this->redirect('javascript:window.history.go(-3)'); else return $this->redirect(['action' => 'index']); } /* // (EP ) Tri des materiels par numéro inventaire $num_labos = array_column($materiels->toArray(), 'numero_laboratoire'); // Ajoute $materiels en tant que dernier paramètre, pour trier par la clé commune array_multisort($num_labos, SORT_DESC, $materiels->toArray()); */ // NOW, CREATE THE CSV file from $materiels if ($CAS == 3) // Tableau de materiels, chaque materiel étant un objet query $this->myDebug("Nb matos = " . count($materiels)); else // Objet query $this->myDebug("Nb matos = " .$materiels->count()); /* foreach ($materiels as $result) $this->myDebug($result); exit; */ //$this->myDebug($materiels, true); //$this->myDebug($materiels); ini_set('max_execution_time', 600); $filename = 'export_' . date("Y-m-d") . '.csv'; $csv_file = fopen('php://output', 'w'); $this->response->header([ // CRAL: //'Content-Type: text/csv' 'Content-Type: application/csv', //CRAL: //"Content-disposition: attachment; filename=Demande_bureaux_" . date("Ymd").".csv"); 'Content-Disposition: attachment; filename="' . $filename . '"' ]); $this->response->sendHeaders(); $configuration = $this->confLabinvent; $nomgroupemetier = $configuration->nom_groupe_metier; $nomgroupethematique = $configuration->nom_groupe_thematique; $nomgroupemetier = htmlentities($nomgroupemetier, ENT_NOQUOTES, 'utf-8'); $nomgroupemetier = preg_replace('#&([A-za-z])(?:acute|cedil|caron|circ|grave|orn|ring|slash|th|tilde|uml);#', '\1', $nomgroupemetier); $nomgroupemetier = preg_replace('#&([A-za-z]{2})(?:lig);#', '\1', $nomgroupemetier); // pour les ligatures e.g. 'œ' $nomgroupemetier = preg_replace('#&[^;]+;#', '', $nomgroupemetier); // supprime les autres caractères $nomgroupethematique = htmlentities($nomgroupethematique, ENT_NOQUOTES, 'utf-8'); $nomgroupethematique = preg_replace('#&([A-za-z])(?:acute|cedil|caron|circ|grave|orn|ring|slash|th|tilde|uml);#', '\1', $nomgroupethematique); $nomgroupethematique = preg_replace('#&([A-za-z]{2})(?:lig);#', '\1', $nomgroupethematique); // pour les ligatures e.g. 'œ' $nomgroupethematique = preg_replace('#&[^;]+;#', '', $nomgroupethematique); // supprime les autres caractères $header_row = [ //"id", "Designation", "Sur-categorie", "Categorie", "Sous-categorie", "Numero interne", "Description", "Organisme", "Mat. administratif", "Mat. technique", "Statut", "Date d'acquisition", "Date de reception", "Fournisseur", "Prix HT", "EOTP", "Numero de commande", "Code comptable", "Numero de serie", $nomgroupethematique, $nomgroupemetier, "Numero inventaire organisme", "Ancien Numero inventaire", "Site stockage", "Nom responsable", "Email responsable" ]; // 1) Write HEADER row fputcsv($csv_file, $header_row, ';'); // 2) Write DATA rows, 1 by 1 foreach ($materiels as $result) { //$this->myDebug($result); $row = [ //utf8_encode($result->id), $result->designation ]; array_push($row, getElementFromList($surCategories, $result, 'sur_categorie_id')); /* $fkName = 'sur_categorie_id'; $listName = $surCategories; $ISOK = ( !is_null($result->$fkName) && !is_null($listName[$result->$fkName]) ); array_push($row, $ISOK ? $listName[$result->$fkName] : ""); */ /* if ($surCategories[$result->sur_categorie_id] !== null) { array_push($row, $surCategories[$result->sur_categorie_id]); } else { array_push($row, ""); } */ array_push($row, getElementFromList($categories, $result, 'categorie_id')); /* $fkName = 'categorie_id'; $listName = $categories; $ISOK = ( !is_null($result->$fkName) && !is_null($listName[$result->$fkName]) ); array_push($row, $ISOK ? $listName[$result->$fkName] : ""); //if ($categories[$result->categorie_id] !== null) { if ($result->categorie_id !== null && $categories[$result->categorie_id] !== null) { array_push($row, $categories[$result->categorie_id]); } else { array_push($row, ""); } */ array_push($row, getElementFromList($sousCategories, $result, 'sous_categorie_id')); /* $fkName = 'sous_categorie_id'; $listName = $sousCategories; $ISOK = ( !is_null($result->$fkName) && !is_null($listName[$result->$fkName]) ); array_push($row, $ISOK ? $listName[$result->$fkName] : ""); if ($result->sous_categorie_id !== null && $sousCategories[$result->sous_categorie_id] !== null) { array_push($row, $sousCategories[$result->sous_categorie_id]); } else { array_push($row, ""); } */ array_push($row, $result->numero_laboratoire); array_push($row, $result->description); array_push($row, getElementFromList($organismes, $result, 'organisme_id')); /* $fkName = 'organisme_id'; $listName = $organismes; $ISOK = ( !is_null($result->$fkName) && !is_null($listName[$result->$fkName]) ); array_push($row, $ISOK ? $listName[$result->$fkName] : ""); if ( !is_null($result->organisme_id) && !is_null($organismes[$result->organisme_id] ) ) { array_push($row, $organismes[$result->organisme_id]); } else { array_push($row, ""); } */ array_push($row, $result->materiel_administratif); array_push($row, $result->materiel_technique); array_push($row, $result->status); array_push($row, $result->date_acquisition); array_push($row, $result->date_reception ? $result->date_reception : ''); //array_push($row, $result->fournisseur); array_push($row, $result->fournisseur_id ? $result->fournisseur->nom:''); array_push($row, $result->prix_ht); array_push($row, $result->eotp); array_push($row, $result->numero_commande ? $result->numero_commande:''); array_push($row, $result->code_comptable); array_push($row, $result->numero_serie); array_push($row, getElementFromList($groupesThematiques, $result, 'groupes_thematique_id')); /* $fkName = 'groupes_thematique_id'; $listName = $groupesThematiques; $ISOK = ( !is_null($result->$fkName) && !is_null($listName[$result->$fkName]) ); array_push($row, $ISOK ? $listName[$result->$fkName] : ""); */ array_push($row, getElementFromList($groupesMetiers, $result, 'groupes_metier_id')); /* $fkName = 'groupes_metier_id'; $listName = $groupesMetiers; $ISOK = ( !is_null($result->$fkName) && !is_null($listName[$result->$fkName]) ); array_push($row, $ISOK ? $listName[$result->$fkName] : ""); if ($groupesMetiers[$result->groupes_metier_id] !== null) { array_push($row, $groupesMetiers[$result->groupes_metier_id]); } else { array_push($row, ""); } */ array_push($row, $result->numero_inventaire_organisme); array_push($row, $result->numero_inventaire_old); array_push($row, getElementFromList($sites, $result, 'site_id')); /* $fkName = 'site_id'; $listName = $sites; $ISOK = ( !is_null($result->$fkName) && !is_null($listName[$result->$fkName]) ); array_push($row, $ISOK ? $listName[$result->$fkName] . '-' . $result->lieu_detail : ""); if ($sites[$result->site_id] !== null) { array_push($row, $sites[$result->site_id] . '-' . $result->lieu_detail); } else { array_push($row, ""); } */ array_push($row, $result->nom_responsable); array_push($row, $result->email_responsable); fputcsv($csv_file, $row, ';', '"'); } sleep(3); fclose($csv_file); exit(); // Sans le exit() ça ne fonctionne pas pour des petites listes, et dans tout les cas une ligne en javascript est écrite si il n'y a pas exit() // La redirection suivante fonctionne parfaitement, mais inutile à cause du exit() /* * if ($what != '' && $what != 'search') return $this->redirect(['action' => 'index', $what]); * else if ($what == 'search') return $this->redirect('javascript:window.history.go(-3)'); * else return $this->redirect(['action' => 'index']); */ } /** * SetLabelIsPlacedOrNotPlaced method * * @param string $id * @param string $from * @param string $printed * @return \Cake\Network\Response|NULL */ public function setLabelIsPlacedOrNotPlaced($id, $from, $printed = TRUE) { $materiel = $this->Materiels->get($id)->set('etiquette', $printed); if ($this->Materiels->save($materiel, [ 'checkRules' => false, 'checkExisting' => false ])) { $this->Flash->success(__('L\'étiquette a bien été éditée.')); // Envoi email seulement si etiquette posée if ($printed) { // $this->sendEmailToManagement($id); $this->sendEmail($materiel); } } else { $this->Flash->error(__('L\'étiquette n\'a pas pu être éditée.')); } return $this->redirect($this->referer()); } /** * SetLabelIsPlaced method * * @param string $id * @param string $from */ public function setLabelIsPlaced($id, $from) { $this->setLabelIsPlacedOrNotPlaced($id, $from, TRUE); } /** * SetLabelIsNotPlaced method * * @param string $id * @param string $from */ public function setLabelIsNotPlaced($id, $from) { $this->setLabelIsPlacedOrNotPlaced($id, $from, FALSE); } /** * PrintLabelRuban method * * @param string $id * @param string $from */ public function printLabelRuban($id, $from = 'view') { $this->printLabel('ruban', $id, $from); $this->sendEmail($this->Materiels->get($id)); } /** * PrintLabelEtiquette method * * @param string $id * @param string $from * public function printLabelEtiquette($id, $from='view') { * $this->printLabel('etiquette', $id, $from); * } */ /** * PrintLabel method * * @param string $type * @param string $id * @param string $from */ //private function printLabel($type = 'etiquette', $id, $from = 'view') private function printLabel($type = 'ruban', $id, $from = 'view') { //$materiel = $this->Materiels->get($id); $materiel = $this->Materiels->get($id, [ 'contain' => ['Organismes'] ]); $numeroLab = $materiel->numero_laboratoire; //$organisme = $materiel->organisme_id; $organisme = $materiel->organisme ? $materiel->organisme->nom : ''; $numeroInventaireOrganisme = $materiel->numero_inventaire_organisme; /* $dateAcquisition = substr(str_replace('/','-',$materiel->date_acquisition), 0,-4); // '06-12-' $dateAcquisition .= substr($materiel->date_acquisition,-2); // '06-12-17' */ $dateAcquisition = $materiel->date_acquisition->format('d-m-y'); // '06-12-17' $filename = 'inventirap_label.label'; $file = fopen('php://output', 'w'); $this->response->header([ 'Content-type: application/xml', 'Content-Disposition: attachment; filename="' . $filename . '"' ]); $this->response->sendHeaders(); // Select current default format (set from configuration) : etiquette_format1, or etiquette_format2, or etiquette_format3, etc... $label_format_num = $this->confLabinvent->label_format_num; $etiquetteFormatFunction = "etiquette_format".$label_format_num; // Select IRAP format //$etiquetteFormatFunction = "etiquette_format1"; // Select CRAL format //$etiquetteFormatFunction = "etiquette_format2"; //if ($type == 'ruban') fputs($file, $this->_getLabelRuban($numeroLab, $organisme, $dateAcquisition, $numeroInventaireOrganisme )); if ($type == 'ruban') fputs($file, $this->$etiquetteFormatFunction($numeroLab, $organisme, $dateAcquisition, $numeroInventaireOrganisme )); if ($type == 'etiquette') fputs($file, $this->_getLabelEtiquette($numeroLab, $organisme, $dateAcquisition, $numeroInventaireOrganisme)); if ($type == 'ruban3lines') fputs($file, $this->_getLabelRuban3($numeroLab, $organisme, $dateAcquisition, $numeroInventaireOrganisme)); sleep(3); fclose($file); exit(); } /* * RUBAN (12mm) * LABEL FOR PRINTER DYMO LabelManager PnP : 2 lines WITH LOGO * Format IRAP */ //private function _getLabelRuban($numeroLab, $organisme, $dateAcquisition, $numeroInventaireOrganisme) { return private function etiquette_format1($numeroLab, $organisme, $dateAcquisition, $numeroInventaireOrganisme) { // Texte à imprimer (colonne de gauche) $text_line1 = trim("$numeroLab / " . "$dateAcquisition"); $text_line2 = "$organisme " . trim($numeroInventaireOrganisme ? '/ ' . "$numeroInventaireOrganisme" : ''); // Image(s) à imprimer (colonne de droite) - code hexa // LOGO IRAP N&B $img_logo_black = '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'; // LOGO IRAP Bleu $img_logo_blue = 'iVBORw0KGgoAAAANSUhEUgAAAJYAAABOCAYAAADCbO+gAAAKQWlDQ1BJQ0MgUHJvZmlsZQAASA2dlndUU9kWh8+9N73QEiIgJfQaegkg0jtIFQRRiUmAUAKGhCZ2RAVGFBEpVmRUwAFHhyJjRRQLg4Ji1wnyEFDGwVFEReXdjGsJ7601896a/cdZ39nnt9fZZ+9917oAUPyCBMJ0WAGANKFYFO7rwVwSE8vE9wIYEAEOWAHA4WZmBEf4RALU/L09mZmoSMaz9u4ugGS72yy/UCZz1v9/kSI3QyQGAApF1TY8fiYX5QKUU7PFGTL/BMr0lSkyhjEyFqEJoqwi48SvbPan5iu7yZiXJuShGlnOGbw0noy7UN6aJeGjjAShXJgl4GejfAdlvVRJmgDl9yjT0/icTAAwFJlfzOcmoWyJMkUUGe6J8gIACJTEObxyDov5OWieAHimZ+SKBIlJYqYR15hp5ejIZvrxs1P5YjErlMNN4Yh4TM/0tAyOMBeAr2+WRQElWW2ZaJHtrRzt7VnW5mj5v9nfHn5T/T3IevtV8Sbsz55BjJ5Z32zsrC+9FgD2JFqbHbO+lVUAtG0GQOXhrE/vIADyBQC03pzzHoZsXpLE4gwnC4vs7GxzAZ9rLivoN/ufgm/Kv4Y595nL7vtWO6YXP4EjSRUzZUXlpqemS0TMzAwOl89k/fcQ/+PAOWnNycMsnJ/AF/GF6FVR6JQJhIlou4U8gViQLmQKhH/V4X8YNicHGX6daxRodV8AfYU5ULhJB8hvPQBDIwMkbj96An3rWxAxCsi+vGitka9zjzJ6/uf6Hwtcim7hTEEiU+b2DI9kciWiLBmj34RswQISkAd0oAo0gS4wAixgDRyAM3AD3iAAhIBIEAOWAy5IAmlABLJBPtgACkEx2AF2g2pwANSBetAEToI2cAZcBFfADXALDIBHQAqGwUswAd6BaQiC8BAVokGqkBakD5lC1hAbWgh5Q0FQOBQDxUOJkBCSQPnQJqgYKoOqoUNQPfQjdBq6CF2D+qAH0CA0Bv0BfYQRmALTYQ3YALaA2bA7HAhHwsvgRHgVnAcXwNvhSrgWPg63whfhG/AALIVfwpMIQMgIA9FGWAgb8URCkFgkAREha5EipAKpRZqQDqQbuY1IkXHkAwaHoWGYGBbGGeOHWYzhYlZh1mJKMNWYY5hWTBfmNmYQM4H5gqVi1bGmWCesP3YJNhGbjS3EVmCPYFuwl7ED2GHsOxwOx8AZ4hxwfrgYXDJuNa4Etw/XjLuA68MN4SbxeLwq3hTvgg/Bc/BifCG+Cn8cfx7fjx/GvyeQCVoEa4IPIZYgJGwkVBAaCOcI/YQRwjRRgahPdCKGEHnEXGIpsY7YQbxJHCZOkxRJhiQXUiQpmbSBVElqIl0mPSa9IZPJOmRHchhZQF5PriSfIF8lD5I/UJQoJhRPShxFQtlOOUq5QHlAeUOlUg2obtRYqpi6nVpPvUR9Sn0vR5Mzl/OX48mtk6uRa5Xrl3slT5TXl3eXXy6fJ18hf0r+pvy4AlHBQMFTgaOwVqFG4bTCPYVJRZqilWKIYppiiWKD4jXFUSW8koGStxJPqUDpsNIlpSEaQtOledK4tE20Otpl2jAdRzek+9OT6cX0H+i99AllJWVb5SjlHOUa5bPKUgbCMGD4M1IZpYyTjLuMj/M05rnP48/bNq9pXv+8KZX5Km4qfJUilWaVAZWPqkxVb9UU1Z2qbapP1DBqJmphatlq+9Uuq43Pp893ns+dXzT/5PyH6rC6iXq4+mr1w+o96pMamhq+GhkaVRqXNMY1GZpumsma5ZrnNMe0aFoLtQRa5VrntV4wlZnuzFRmJbOLOaGtru2nLdE+pN2rPa1jqLNYZ6NOs84TXZIuWzdBt1y3U3dCT0svWC9fr1HvoT5Rn62fpL9Hv1t/ysDQINpgi0GbwaihiqG/YZ5ho+FjI6qRq9Eqo1qjO8Y4Y7ZxivE+41smsImdSZJJjclNU9jU3lRgus+0zwxr5mgmNKs1u8eisNxZWaxG1qA5wzzIfKN5m/krCz2LWIudFt0WXyztLFMt6ywfWSlZBVhttOqw+sPaxJprXWN9x4Zq42Ozzqbd5rWtqS3fdr/tfTuaXbDdFrtOu8/2DvYi+yb7MQc9h3iHvQ732HR2KLuEfdUR6+jhuM7xjOMHJ3snsdNJp9+dWc4pzg3OowsMF/AX1C0YctFx4bgccpEuZC6MX3hwodRV25XjWuv6zE3Xjed2xG3E3dg92f24+ysPSw+RR4vHlKeT5xrPC16Il69XkVevt5L3Yu9q76c+Oj6JPo0+E752vqt9L/hh/QL9dvrd89fw5/rX+08EOASsCegKpARGBFYHPgsyCRIFdQTDwQHBu4IfL9JfJFzUFgJC/EN2hTwJNQxdFfpzGC4sNKwm7Hm4VXh+eHcELWJFREPEu0iPyNLIR4uNFksWd0bJR8VF1UdNRXtFl0VLl1gsWbPkRoxajCCmPRYfGxV7JHZyqffS3UuH4+ziCuPuLjNclrPs2nK15anLz66QX8FZcSoeGx8d3xD/iRPCqeVMrvRfuXflBNeTu4f7kufGK+eN8V34ZfyRBJeEsoTRRJfEXYljSa5JFUnjAk9BteB1sl/ygeSplJCUoykzqdGpzWmEtPi000IlYYqwK10zPSe9L8M0ozBDuspp1e5VE6JA0ZFMKHNZZruYjv5M9UiMJJslg1kLs2qy3mdHZZ/KUcwR5vTkmuRuyx3J88n7fjVmNXd1Z752/ob8wTXuaw6thdauXNu5Tnddwbrh9b7rj20gbUjZ8MtGy41lG99uit7UUaBRsL5gaLPv5sZCuUJR4b0tzlsObMVsFWzt3WazrWrblyJe0fViy+KK4k8l3JLr31l9V/ndzPaE7b2l9qX7d+B2CHfc3em681iZYlle2dCu4F2t5czyovK3u1fsvlZhW3FgD2mPZI+0MqiyvUqvakfVp+qk6oEaj5rmvep7t+2d2sfb17/fbX/TAY0DxQc+HhQcvH/I91BrrUFtxWHc4azDz+ui6rq/Z39ff0TtSPGRz0eFR6XHwo911TvU1zeoN5Q2wo2SxrHjccdv/eD1Q3sTq+lQM6O5+AQ4ITnx4sf4H++eDDzZeYp9qukn/Z/2ttBailqh1tzWibakNml7THvf6YDTnR3OHS0/m/989Iz2mZqzymdLz5HOFZybOZ93fvJCxoXxi4kXhzpXdD66tOTSna6wrt7LgZevXvG5cqnbvfv8VZerZ645XTt9nX297Yb9jdYeu56WX+x+aem172296XCz/ZbjrY6+BX3n+l37L972un3ljv+dGwOLBvruLr57/17cPel93v3RB6kPXj/Mejj9aP1j7OOiJwpPKp6qP6391fjXZqm99Oyg12DPs4hnj4a4Qy//lfmvT8MFz6nPK0a0RupHrUfPjPmM3Xqx9MXwy4yX0+OFvyn+tveV0auffnf7vWdiycTwa9HrmT9K3qi+OfrW9m3nZOjk03dp76anit6rvj/2gf2h+2P0x5Hp7E/4T5WfjT93fAn88ngmbWbm3/eE8/syOll+AAAmK0lEQVR4Ae2dB5hV1dX+173TK8PQmxRlEAEVVBBRSSxREY0aS9TEoCYxluijqWr0s6R+SYwaW9Qvaiwxxq7YBVEQITQBQZAOw9AZYHq59/979713OHPmzAwDjOb5P3fFl7Pb2Xufvd+91tr7nDsJRaNRS0pyBPb3CIT3d4XJ+pIjoBFIEivJg3YZgSSx2mVYk5UmiZXkQLuMQJJY7TKsyUqTxEpyoF1GIEmsdhnWZKVJYiU50C4jkCRWuwxrstIksZIcaJcRSBKrXYY1WWmSWEkOtMsIpO7HWrOoqzCOHK7pIAIqQCnYAnaCNsmPHphsf3txtllORnP3nUbGL0C1p0Aa4fvBC560ZLCdRiD6yo+b1LyvxBpBjceA08Fg0Lm8vCJ7V1lZqKam1sIpYcvJyraOHTto0kWuteA9MBnMADtAi/Lj8YfZP95dZJV19bzZDAWV7U7i2ICMZwPSkklf0gjsDbHy6dt3wYVgzKcLFtqUj6bbgkVLbNnKVbZ85WrbsbPc6vkcJxQKW0ZmpvXt3SvjoAH9ug0eeGC30SOHH3n8MSN/mZWVuYb7XwJ/B/NBoAw5oNDOHVtkT06kSLaUYBNpzpzvalIymfCljUCoDd9jaQKvAddt3bZ9wN+feNr+/eKrNnfBYqvbyRyG4WgaFiiNyU9JoRjFQ2gYfe5Vj0WUxtE1I936H9jfTho72n444QI78vAh0mb/BreAVaCJfLZmmw296slYfU211nXccHeTm8zOI+35gPRk0n4egSBTuKfEGklf/lheUXn8Xx98xB58+HFbs3QZJMGtysqysEglEqGhGgiVIFbDVfkhx7NobZ1ZZbWl5ObYeWeebD+/7jIbPnTQZm6+DTwAmsi1j3xof/0n1jM3k3oaZQ8hNgaIoLDXxGo5ZG+BNSAp7TwCe0sseWZ/eP2td7N+cdPttmjuAhzpHAtnaIITRJJ2Yj5dPE4wb1hMEPEcIxJhPPsI6qyswrIK8uy6Ky6yW39yuWVlZkh7XQG2gwaJYFqvkiP/0hxMIrxRdUn5rxiBthJLrLmnpqbmml/e+mv7y90oEsgTzs7lKiLFyeQ0UiIevybSHKFIayCW8hOM8BCsHkUDwUaNGWGP3XOzDT7ogHncdC5YDhrJlZDroVfmmmVq45eU/4YRaCux/obp++F3Lr/KXn6WXXtBIbs8mTxpJlkbSBKOXxMkSxDOR6yoI1OCVLsJ5QhHTSGZSDRSFHJ169XNXn3iNzbysCJsrZ0EVoNGMv7O12ziVLIz6U9SvvIRCCKW1EmQ/G8FpPrWxZfby8+9YuHCrvjmMj9oCSHsQYrCOOwuTVc57+kWdchwV0vhXuLYz1geZaKEo5Zmmdl5VJnl4tah0DZu3mWnfudXNn3ukoPo2Kugk7+DPQtzZEf9ycn4f9EIBBFrQiQa+dmEq26wt195y8IdmVfnnKMdRB5HJF3jJIoTSeSJOohUEMiRiDQRKAHlhzNReJkouwzLL+hoZ51yrI06fIilQy6lWW6+bd9RZd/84e9syYr1hzJWj4OGfmqTuWrTTqk5Ql+q5NFaZ6DrvoieJRsUgC5AC0d1Sv1/WaK2WJ2uD3omoQNgYveP+G3JQKr9651/vNf+/eS/0VQ8t8xdwvzp2iieitYJW1TKo5Z/pEVcWeIhKCDIvwpz5ZjBUlPZQYbgRNhyczKtqF8Pu+3H59tbUz+1kg3brKR0l9XUsGPMzbXNG0vtwhvusWnP3jk+KzP9Niq6FVhNbb0Vby1nGhq4NojkQ4B64ZV3iejUP0h6k3gkUAcTojcD0xKR+PUMrt8Gw4AIAPOtBqwBytsMmhN1UP1S/44AqkNEKgTsfNybCU2k+q061VfVJxfgbTAFrAP7In24uQgMAKOAnlskEqn1LGo/wYFawpVgK5D7MQl8CBaCNov/uOHNGbPmnnr8N8612mgYEyWtRLteYoWIQ65IBMJUQ4K0DOvao4sNH1ZkRw8fbH17dbXCgnw4lGIVVTW2aesOW7RsnX0w83NbtmaD1eyi7xlplkJ+GkQ7/qiDbW3JNlu6qsT5WglFpJ871u0o4yjiPPvDTy/UA48Gn+oJr7h/kj38Mg587MD0FpLuULpHNFEa1E2eNG/wQiLPeBMIvwNOiaeN5fo7oDabEy1CkcAvJ5HwAzAE6G2ECLY3ol3xRPBbsHgPKxhFudOA2j4QiFQ5YG+lnhtFrifjYMKbSpCP5SXW2XV19S+OPuVcmzV9joXzOGB3hIoRyYUhWQTCWUWN5XbpZONOHG1XXDTOjhs5lLNRyiHFG7fZhs2ltn1nBWeiERRVGkTLsXSIVMP51TtTF9hTr02z+YtYFKR1LMh16bRNe5DV6ZCYIolwfwh1+N4TN9txRwx6g+rHg+jjkxbbpb8jGiPWr0i7E3hlBRENbpU30RM+j/BznriC/wLSTheDvwNWVYsiM70goMSLpJ0dkO5NknYQ+SXSXpiCZgW7b1eBp5stsTvjBYLn7I7u19BMarsCaMfeSIKIFWNDbBBvfOq5l23Wx7MslI+mdJqJbF1FMHaEkRq0djhs37vkbLvpxxdZ0YBeroFX359lr4F3py+09ZtKrVbmLMYN7uNeCFSQm21DB/a207823O6++RJbsnKD3fvUu7Z4WbHl5GZRvXdhczP/6daK8kq79b6XbPJjvxxHY8eDKcP7d7F0SFWjc7BwKIgAJZRrjlSuzwH/bCRtOGiOVDy8k0RHZU6CpLsvUaZEmvYLsArIzKwFCTOdR3gQkKk8BegZvcIKt3+A9WCyNyMgvCfPLC2kPiwHMv9lgIE0tdMPaAwygF9GkvABOBe8B1qUBLGOjUQiR93z8FOQAOdaTrrI5K4UkaZCS3Xv3dP++ttr7dzTjnWVPv/mJ/abB16wefPVR7RNVoal8lonPTvN+VE6RhCkiarwwabPX2VTZ31huXk5dvH4o+3uGy+2Z17/xJ6a+Am3psERzRnHDq52rgSy83Jt6uwv7P1PFtmJRx9yJVlTDunT0Xp1y7eV67AWYe0mmojMSFtFA/sQ8BJ1NvGXwBSwDfAwzteSiSwFfskmoSeYC14DL4P5QJPZnJSQsRSo/G/BteAuwAQ0iAbmZtAasdQ/v2g4Rer/AJlWkVwTVg2CZCCJIs+lQGGvdCDyPNDzt2ieE8S69N0PPrZ5cz+zUE6uI1JMU6Wxi8NBL6+xI48+3P55/812UN8etmLdJrv+jr/bq2/NwMdKs7T8XBQZzw4x5JiH4g56jFhKixEsI4NrTjbm1OzRF6fZ8+/Ns2svPtFu/MF4u/fpSY5IqSk609Kz8I/OtghVVtba0xNniFhnEO2RlppSMqBbB1u5eivtBxJLq7Ctcj43iBiScvBz8CBwveHqlQ+9EU9YBJCZ1STurdzLjXng174KpEk6A2mZ5iRI09xH4Z+A2uZu8qWLhL8Duk/Xq4FXRK7HwBjQ7ILRQEiln/bixEl4y3yRoGOE+FlVlDmLVtTaWHyp95/9X0eq9zF3x573K0g101I75FkG7/t0cBoCKQIOubu6eBpWMBaXYgmJA6lopvR0y+M1Tk00ZLc/+pYtWr3ZrrzwBJdeT3n3MptyKhsC0nDvTv/cijeVauJlEq0fGssxtLGGUZZEfklbJUGqSm48GzwAgkjVUr0i9L6QKlH3EwTUD68UEhnqTQgIB2ksaag9JZW3yl1ErgEil19GkXCZP9EbF7GGlZVXdHrnQ7SPe13DhGICozrErK63omEH2/MP3WL5+EjvTJtvZ3z/91ayeYels/MTgUI4QiLWbjKlEGbXR1oYkokcu5GIc1WZDM6yIOcrUxfbJ4vX2VknjbA6LEBU5NJ9aEMdUahcSWmlzV68Rn0fr3/6dM51Go0ghZqIBqUl8Zo7f7mfkvCuP/FLjougQf6SNFlLEjQW8uf2RW7iZrROE7meFG08AkXEOmnJ8tW2eu0GC6VnOTPozB/HCZk5+fbEXT+1zh3zbN7nq+3b191tlezsMjBnYUcoSMXRQyqTL80kgjnNlCCU01AeMjmSJeIiTQx5+Xk2fXGxrd60y4Yf0pflhXvRiJBpFqHu2UuK9RBFILV7AQom9glN0GC2Riw9d5CwuuzhoIwvOW0A7aGSm0hrmsfrlyVu3pII7MNVboG/7cGkHddcnRrgIctWrnPaSaZKpHKmsDpiN1x9gR19eJHtLKu0C667x7aXlltGdnZMS1EuBeiTmSw+5svi8xl35iVt00AoP4lQFKkxhLjKzCWQwxcTs77YwLFYhnUqzLeI+hEvK5KlZWbYxwvd4utDn7t0ymOxiFh6L9RU5CO1JM1pLPkVbGm/crmTHgSRpKaVnvmfSzvZIM3XSjVNsmeTMrlJasx6BPl17vCu37qSzUwQJijhW9WFrOdB/e3GK85xdf3Pvc/b0iVrLIMdmjSUyOTVWGkcpKZysh7lWCFmxhLkkkYSkXYTKEy4MdKxvKRpNwmplhaXWufCDnCTdAiqsiJhKp/pbNxZxWdctTIHRb065UAsp3j8g6k+y5S0JEFkZBDszZZu+hLyutPGM8D5kQHttfZcDHwjERGb2/01KrgHkccDynyDNG0qmog60rNk03a0FEEIE9UVc3f1d8dZbnYmp+Ub7bEXpliqI1U4TiyRK8z7vXS+RY9gMjP5cDTdtlbUWV5Wpnu7E3W7Qybe7RTZDTbsGtEy2iVq566jCEn8omB1fdS2ltU4ktXri1NUUpRD0jQc/XK0aCWn/RxNdKnX1jImMKyJtKaxglbZAmrZ2qSm9k+QZjoKnA6+D0SuIBFJgo44vGX9C0bma38Raz51aULcao432ovrQPBJPN5wEbEyt/COTpolqnMrNFd6Ya5dMO4YV+hv/5pkO0rL+Bgv35EpRRoL/0rECXOq3q0w2zqxw9MJeiV+WYj87eV8HYpJ1NGDtIo7bogTy5FJhHKk4mghQa54l8TrCsglkof0jpEjB14P8DR1Vk99dbGvGhI7ON0VRKyKeHXNXYK03IrmCu/ndLWtyfg6OByIVIcCv2gr7zWHWixogBbF/1wiVmvms8UKPZkbCav9Tp40dlDu/aMnKRYUsaLujNGdsBPldH3s14bagQd0c77Vy5PmWCp+lUxgglQwC1OVxlSHrUe3QrtpwknWvXO+/eYfU+yjBZhMzJaojTPWoKlEMEciiCRSxgglgkknucL8Ew+5S4xQIlXsLTdEllmMqbeIh49BTm5rxArSWMWuG+3zzyCqHQPOBENAP6CxD5K5JN4F7gfeZ9MztfRcIiGObiMRqfYXsXSEo02Rl1jMnnUETUQPV9a1cyFnJPQLLWGRahsz4mBXcM7i1bZ8zWbLzuaVi3aBEEp+UBamr1vnAke+oQf2sFNGFZEXdteCDrm2omSHrd9ejumqt2pMVgQCRqWxRC6IoXCDpoprrt09E5EUSxALikKu+mgtDnyme7lNZkUNJhjRCu2ggE/8Z0C+7MBXFtv8hfYx3oP7vw0uBNJMmIMWZQG5fwOPgG7ATxKRShqoOdFYeDW5ymkjsr+IpbaDfLygRepWzdoe3TofoLOrEBomiiYayOcsksXL16MsojFNBalglxSa1XBoun3dNpu3aqstXLPVunbqYAV5Wfbkewtt3vJN7OxwvDlycATCJMaIRN3axcW1lTOT0lYQS7QX4aCca9f9cggy6ZrQWHwtw+udHD53T1Wh4rnLN9ORuixO3oOIFTQAru74P/5JU/L+0lhalb8A3wSBq5l0yQawELwBJsfDiR2ptIJfo8kUtkQsTbD/uVQ+USfBfRJpRL+pVYVuhftrVudX9+3VfYz72Za0CsTq0UWH8bzAWr0RLRPzqXR1Gg1y6YW0fKmunCXtqqq3e1+aaR3zc+yL9TusEyTbiaaKyA+jTMTdt1tjybcSqRJm0b1LFKli7KJVkUmtxzSViC1TqB/29OnekS9uUqRZvli3Fe6EQhpM/8NqhUpttySxB2xcQhO9L6In+Dm4Ffg1R6LeWQSmgPfBx2AHCBI9k+rziojlRsab6Ak3R6zAiffct6dB+bJe05y4L3CsRazZRf17XJSKNpB1SeW8SCSRLF+7mZMCNLjIAZmksWLX2HFDVW3Uaqtr+FFqlm1hJ1fJzq2WNGm9GKEgl+5xZtDjb8XJJUcpna8aNFq1OOwJbjnN5Xwr0uSsQ6y6mqgdP6SXurUGlO7gpTiSCfwru5q01jRWkCaR/7C3ogF7GkhL+WU7CY+Cl8B0f2YzcT2XX/bEvItcXlGcCdgvWgt3qYnboUlA+zQVTcr7mL7oYYP7h2Z/upwviuULxRZLRZV+Jh8nlCOXiAVBHGTi9LFeilWKFNwS4sihHgdbZFKeK8vVhRWXbyWSuer5B0alpqHVuNZEsHWxZhsvSxEMcqUx1CP6d9YTyHxENpTicsQ0lt930cO2NgkaJK9oB9aSmfGWDQrLNwoilQh1G2irmQ3SeNJYLYm0HIPbSFSPSK/Ftq9yABX4Ta2shxZ6E1FHlkKOtScdMwxeR3BborZDX3kiHXHEtYOLaSwRQ1pH7wd14h43kYTr8M1qKBeBVHr1EuWqQ1F3OMpZVwgNFpLPJe3lbF6MQfp2IY1PjNP0RUNjOrn23T+Ur4VxA7oX2Ih+TtG8oA8Il2/AiqTog/smGmtP/AodsnpFfsjeEutk7r3YWxlhKeGfgB+AYtBW8U+g7pfz3pJoLBjgRiKT71Zjo9S9i3w94LbFpH0WkO4YLhY9d/6pR1smRNLP4DdujZlNTCQ6FBLEtY3zraStRDCnyUSWVKvCBMoMxsgkEsWguPKlsRp2gTQmJSTRIWfnnHQ+BI1pLaXph6l+qayptzMO7WEFWWk6wPxgzeYyW7uBPqbyy4ymgymN1ZJfocXkNxn7Qqwrqc8vD5Bwlz+xDfG91Vh+YrG63TFHG5oOLCpNcH5AzkTSVgakN6jOp0YM6Rc5cQxaC99lBb6VpKhfd2f20AxMX8xhF6mkrRTX+7wImkifukR0uJoglN4Vyjdr0FC7m07FzIpIIlUt6Nsp23IzuJ8w/1khX4Y6pRa/RX9cpIAPByccLU3svqTcMWfFZqvYxSuwsHPed1ceC4kkMm3NiQbbTyyVb+me5uqSSR3ry5TJ+rMvra3RIGK1prH8z5Ro88xEYB+up3DvwQH3Tw5Ic0lavZJPwcSfXToOK5phMxeudok6o8rEmY+9nokRSv6VSOX8KMJOIxHX5y0yd7pGBZnQABGZcjJSrEeHTKvjq9L+nWPEqiN9AGGRy/30nnu1TMqr6uybaKshPfPkJzysKqcuKk6ovSAnV8RqSWPRyUBi6b62Sgdu8JNgA2l0cJ8ktntqXAUrqUWRKQySU0k8LCijDWk3UVbT4ZWpROZ5E7xh7+z/euxRg2ovPOtYe3PqZ/qozg4d2NMOLerNj3FwznG6YxCxYscI8qcERypd0VTuJbRX5cRbgy/OBOpsqri0ynpCrHGHdreiLrk2ok+BjR/WnU9y6m1zmfgTO9Gqxufr3THLbjvDLZa/k/F5LWmTFzBvbBoQv6+kNPlKLWkfTUAQIXVvW0Xt+EnsOtbWinzlg/yi1jYkzT2T0u8HzeX7mm4SvZaU45qk8ucXSPM/e0MxL7FmkvroH64/l5P2TPvXO3Pcju+8Ew+LEyu2G5S/paOEmMYSmeL+lrSVtJmPVCmYPjnnGRwryATiJzlS7UATXXFsP/vuqD52B8Q54oACR7we+ZmWx0/nMykvM3jHGYOtX2G2trS3q9fzV22xhSs2YWrd/Elj+KU1jSWT4XeORZC90Vjy+bQz8kovIiO8CXsRHhBwT2vECtJYei7JGPAUaM5cqkyQnEPiHwMyZAKfD0hvSIINjeSXHEKe+tAtF/f/xX2v25XnHWcTTj/S7n91tm3ZVW0ZIpQjFTtANJTIlTCNzjx6SCUNJX9KznlGWtg6cZWW6pqXEbvmZ9jg7nnOLKoHXy/qbF3y0m0Dv4Iu2VltSzeW2diBnezS0Qco+2dA5OK0f4tFIGX8p1/5SvOJVpGab040uPKzvOIUqjdhD8Pyp94Bl3nKq+7fgpNAsyvaUz4o2CMgsSwgzZsUpJEepMB40A98C4j0PwQLQEsis3cD+APwa2AR/GrQoviJtZPSl5x38vD35y4rSf/9k5Pt9u9/w64/f4zd8OB7/Dms2DmU01ju0BOFp/eLEMy761OL6pkc9BK+odJGb8WWCq6x+ZY/JYf9j+cMtcKcNNsJUV6aV2L3TF7OPiFk1XwaM+qgTnbt1w9UVX8CTypQjam851XMeswMKinoBF2msCWRT+QnVkvlW8t7ggJeYqn814FW9PVgNWhJCsnsC+aDhIYJMvEicUvi18IqOx28BN5XBDkafAJeAI+BzwDnNk5bi5jdwcngB2AECJIfkbg4KMOb5ieW8qaCy3975bgn73xiss1YtM6uOesoe3/eGntjzhrLRes0HHg6vyqmxbyVesNhaTH+i0nMd5IVO6pvgT300Urbxi+A5qwtteWby50GW7Cu1EYe2Mle/OFI65id9hz3/Txx9zMfLrUFi0sS2krJvRN5nmuMvZ4EX1DE8q9CX5GgqB4isOoPyXgIaMC9cjaRE8G7QBNMx90LYVUkE94TjARHgcngQiCRSQsiVmvOu57LLyLLJHANuC+eqXLfjaOUq8y5FqPSu4EMECQiver5R1CmPy2IWCrzFMi68TtjH35r5he2dUelPXL9OBt3+0s2d91Oy0mnv5hEHT24My5/rS3ExbOuuRm2YP0uK9lW6Xyrtdv5ocSaUudbnT2ilz104WEymS9SzSXAzWYNv5S+9zW0lY4+dssBu4N7HAracTVQP7AWaWVpW2npCGY4rnk9Za8jLI3xPU+agjLVMkFCS/IKme45uWpig0x8axoriFgJ7X0/dRaDe4B3zKTxg7Q+yY1kKbFrwduNUluINJolX7lHUlPCl40fPahKGqdzhyx75uenW1HvQme63BehDLR7ReO7saVoCsySltrF66J0nPl1kErvGXXEcNFRve2flx0pUj1NHRcBbRGdPDFluc1byNhgQj0SNCitOeFBE9CUWM7EM8dp2Za5fal1+vxZy9i+jHeXVM+PellVnm44TTSBhEvBf7wZexhe6Cmn/rWd/E03JKqyYfwIvwyOAL8BIsqeiMrdCUaBPSaVKvb+7QbFg+Q4Eh8Bg5S5ekuZXfrwNJv8xVbL4cW1fkfYVtHS1EyW4Uv14TjhoK65ds3Y/nbWYT20wm4BchobJMp7xOOu5C/PrKGtdE1oYnG7X+ykkSA1LVFmDVimSDMiM9QXqFxCdJ8GMUZKfluZtmudpZVvtNTqUsstmWHhWnxEyFSbw7FIl2FW1u0IzutQUtF407woj4seTb7MoWAAkN/SFaifEjnhW8AmsBaor5NBrO2YKSzyxAm6e9dwlT/UnIgAv/JlnkNcPpZfZCLHgMPAQUBaTITWIazaWQ7k4H8IWjPBFvS3G/aEWNTt/vTO/3DVjiKzCif6dxMX230frbZtlXVuZydN1JqIDtJMOq/S11eDuufaVcf3dzs/jiKmkf1T8Im3nm3bttktN91izzz1pNUdcqaV9flazBxFElreW9oTlpnWV7GNhB40mDL1xie88+RHjJZdMtMKVrxu4To2HpDJfbId11DSWEJtTjcrPXC81WV35uOLiEUycItUZYJovqpbjcbr15ccMdF4BvSx+YruIut6X/bpxN/wpe336L4QK9EZMfx2cCYILSrZZb9/+wt7feEG287HfxIRTBxL8EzuiHaH2hHqL85oFzi6f6FdPLKPnT60K39KNGUVt0k9/x9oNJL/fOZZu/OOO2198XrL4SvWELv3cjRFefcjrTa3J6U1CTSWmEwRQ2FIlVq20bK3fkaF3JWe68pG0DDVHfrzGgpNo9dOjmTUIbPHvSlop+yNcy1v7RTV2uzbA7IcufRTuYj+1gUatbqgv5UOOA2CYZ3VL9XtRDURV99c/wirj45IPC736iPLcHVMGUWy2CTWM5ZaODK5CVE5J7q/0TAlSjxGYEIiEr+ezPU9X9p+j+4PYiU6NZyAtNc3wAAdJXy0bIvNXFVqG3mHt4vjA30lIV83Jz3VkWlIj3wbxdcJRd1yrXt+xjbumwkeB7LdpaBBpk2dZr/8xY22+LPFjD/fbPE5TkLC9dWcoWVYVaeDbVevMRZCq9RlMhlIWtVWNEkPy1n/ieUVT3Max8twaZ/6jA4WwW+q7DwUko5wpEut4PPrzfMtZ8NsS6nZSf1qT4RoTZjg+CSHIUINbUuD1WZ3tbKeR1sIgoQi+I+p2ZZaieuwaa5VFQyw2rw+9FvHQfw4JKerpe9YaYWfP++arOg23FIrtmCGN9DHIVZDWUltVifyWSTUpT99kGjXZcb+eZ2LNJRXxhKROWtXCSTWGxNb1pRlZeVWXFxs1VVVdsiQIXb06FHWpUuXREe1pEaD48Bg0B/0A/JjoJXTQLLRxWAVWAJmgfeqqqo2TXp/kp1wwgmWyU/G1q9fb3/581+4ltjMGTNt82Z9a8+PYxOqj5sahMkMMZH6O6chVn99ej5ZIadx6tPzIEdZ7FwtYV4abiSANtHf3NJ9tdldrC6ri2XsWBEze2gOkW9vRXVKU4mSIpf6KHJFUzMsTJ+caYUUIofyJCJOasUm+rzLte3SXR/oh9NsMYJLy8oEV3YabNuL2GTG73eVxP6ZwWWkJ66g5qaRa+HL3y/RQGIV5HVssXL+vBHaWqo8Vqxf/352+eWX2c5du6ygQwc7auRRtmjRIjt+7FgbOFB+oCOVZhrd74glh1BnJZG1a9fa1q1bbePGTXbXn+6yKR9MsTPPPIO/j5VjH0+bbiUlJWi5MC++Mzlz1e2NBPvldjl0JiEyCZhemR6aiiZMTcvk6Exh9akiRoQIPpRMYfwBydgLUWc1kHLKnahumWGJ+9rM9cnFieIbJPKidbF+N+4zHXLfme12nLWYMKl6xk2HXo6mY0/QYG5dZZ9yzzC15xHtAud44u0SDCRWz2692tRYHR+fV1ahxmUF+J+0SllZ2ZBevXotHjZsaKS8osLy8/NtwIABtmTJEuXZsceOsVn/mWUL+P/dqSC/ro5VHQr1ysrMuqiisuKPIm8Gv/7R34BoQaQV54MdLZRpLet7FNDuVuZ3SiuFbyf/z2BnK+WUPQZoMb0JNKDa+QX18wbSHwWt1dmDMr1Bk6OLcF21lXU/wkqLzsEXq6aIE9lu7eKKYtGGfw+NpzcktEcgiFgtzqSnE7IPF4OOqWmp0by0vH8Q/j4I45RPLygo+NPOnTvvmzRpcg0a5zDS3hB50DonEQ/NmD7j/rT0tOFpaWknQp5KrrO5dzbEHMXffLiW8ADwGNBAPAt0jnMikHbRWdVTACfDHRGM5zo8Hn+Q61DwDtDqngCeBheAjmAV0HabZeBEp9x/AqtcbPc/hxP8DhAZSsDjQG3nAaVngDVA5uZskAsKwR1ARDoZsNrcR28ij/ryG/BN0A1sAE8AEUZsuAT0BWpPh5ddwQSg+agFE4HcCT3z5UDyNvg0ginN3va5lXEUUie/S+YydkQhje6VOiLeIxVvXruHw3vYgmzNB0CrYiwYCEaA59A8IskiSPQK2utUzNgcyLI8Ly/vUuJ3E3+bvyZzNddjKDOZ8ndRXhNxGJBteBpIe2gSDgIa8HFAk3okeA0UA5HiGHACuAfsBAOAykhExq8BTbwIOh2cBDRBEk2envdHIA2wrWyQYYTmgT8D9WEM0DmT2lXfNoNzgOodDh4AMqdngmvAR0Dl1bf54P/AaSAF6HlFPj2TypwPpFmUrsn/HrgevAnuBmr/YKC2rgTrwSKgcowYP9ytLbP0snU8jap3IuIHEUsk/UpEA70nMoRCGkARYQlYDm4FNwBpFK3WXUCTPQfkA03GDrASaNJ171agMmWgN1gMlLYFaCU/D84EfcCT4GZwNRgAtoMDwYdAdWggRXgtWbWtNiXSNAvj+ClX9UEyAYjE0gb3gQtAQtIJqB8iy1rQFZSBb4HxQP0TyXLBJKA6NwK1qUmdDZ4DIpRItALoGdSPclACVKfKDgLLgdJhhyOSiC5ipwCNkzSNnk3k/xh8ADQWzp+sT+/ADpQs51sq1dXrJ5bGRcT9SmRPidWN3unhNaAacA3aoSAVaMDywHFAg6U6RSYNzIXgKiDCRIEm6VKgCZwFEg+uQVHaAiBiaZWqvdFA0heorcngBHAWENlFXg2g2rgYqI63wDBwCpBWVLsSkfhEoIUgLSYyqQ1JJhgH1N8iMB9IDgQinIi7Dai8FoBE4UVAzzEBnAq0gGrBd4EIfBoQgfuDj4Ge83Ggviv9WPAQ0EKZAPQMqkNjtwm8AVSXnkVzgOBAsHutz4DTu4mle/Q8XlEdwlcioTY47xpwTe4aoMk8BBSDDaAXyAbrgfwL5UuGg41A6X8AL4FK8ClIARpoEVUTK0Jqtf4VXA+ULvJqYtWmyCBidwGdgAj6KpgODgda/SK2oLIHg7VAbSfkAAK6V9pBBBNhRO5fAdWjthYDkScXqA96BqVvBhIRVc+oyZRmEZE0FnoWEVLPpbbVRkcwAChd5WCDI5HqHgQ+B+pvBlAdSp8ArgYaC42VSKln/gyU6ziiOr+vbRlyCVGJWzfq4xwX3f2P+j4YaFzaVfbFeVfHlvp6N9sTF8GCZK4ncSHhZWBLPE3k08NLNFGa9CvBs0AEknjvT6RpggUN9CagVekfVJWdAfwiggqS7bGL+3cV/64G6l9CEn3z9iGRp6sIkRBproSIQCKVRG14x0maSaK6veknExcZtUAfBRqPhKwkICCQiOOGXb2Pg75pLF/x2okI65cwCSLnVyLSQF+WvE1DCXIEtamJmgI+DMoMSHuLtMREBWS3Kend/VhXmxqOF5aW1AIR2T6JpzW56O9Y6BWSDl/dq6DdJbTQHgMJMy1CqT4v+Yl+ebKnL6G/vB4lW/r/YgSkLpOSHIH9PgJJYu33IU1WqBFIEivJg3YZgSSx2mVYk5UmiZXkQLuMQJJY7TKsyUqTxEpyoF1GIEmsdhnWZKVJYiU50C4jkCRWuwxrstL/BxJPAjyhtOFQAAAAAElFTkSuQmCC'; $img_logo = $img_logo_black; return ' Landscape Tape12mm 12mm Auto 0 0 Auto 0 Solid Horizontal TEXTE_1 Rotation0 False False Left Middle ShrinkToFit True False ' .$text_line1 . "\n" .$text_line2 . '' //.'' . trim("$numeroLab / " . "$organisme") . "\n" . "$dateAcquisition " . trim($numeroInventaireOrganisme ? '/ ' . "$numeroInventaireOrganisme" : '') . .' 2606.94 Fixed 0 Solid GRAPHISME Rotation0 False False ' .$img_logo. ' Uniform 0 Right Center 863.9999 Auto 0 Solid '; //. "\n"; } /* * RUBAN (19mm) * LABEL FOR PRINTER Dymo LabelManager PCII : 2 lines WITH LOGO * Format CRAL */ private function etiquette_format2($numeroLab, $organisme, $dateAcquisition, $numeroInventaireOrganisme) { // Texte à imprimer (colonne de gauche) $text_line1 = trim("$numeroLab / " . "$dateAcquisition"); $text_line2 = "$organisme " . trim($numeroInventaireOrganisme ? '/ ' . "$numeroInventaireOrganisme" : ''); // Image(s) à imprimer (colonne de droite) - code hexa // (EP 14-3-19) Recuperation du QrCode qui a été créé par la vue détaillée "view" en cours (le QrCode actuellement affiché par la vue en cours) $qrc_file_full_name = $this->request->getSession()->read("qrCodePath"); $qrc = file_get_contents("file://".$qrc_file_full_name); $qrc = base64_encode($qrc); $img_logo = $qrc; return ' Landscape Tape19mm 19mm Auto 0 0 Auto 0 Solid Horizontal TEXTE_1 Rotation0 False False Left Middle ShrinkToFit True False ' .$text_line1 . "\n" .$text_line2 . ' 2606.94 Fixed 0 Solid GRAPHISME Rotation0 False False ' .$img_logo. ' Uniform 0 Right Center 863.9999 Auto 0 Solid '; } /* * RUBAN (12mm) * LABEL FOR PRINTER DYMO LabelManager PnP : 2 lines WITH LOGO * Format IRAP, avec QRCODE */ private function etiquette_format3($numeroLab, $organisme, $dateAcquisition, $numeroInventaireOrganisme) { // Texte à imprimer (colonne de gauche) $text_line1 = trim("$numeroLab / " . "$dateAcquisition"); $text_line2 = "$organisme " . trim($numeroInventaireOrganisme ? '/ ' . "$numeroInventaireOrganisme" : ''); // Image(s) à imprimer (colonne de droite) - code hexa // (EP 14-3-19) Recuperation du QrCode qui a été créé par la vue détaillée "view" en cours (le QrCode actuellement affiché par la vue en cours) $qrc_file_full_name = $this->request->getSession()->read("qrCodePath"); $qrc = file_get_contents("file://".$qrc_file_full_name); $qrc = base64_encode($qrc); $img_logo = $qrc; return ' Landscape Tape12mm 12mm Auto 0 0 Auto 0 Solid Horizontal TEXTE_1 Rotation0 False False Left Middle ShrinkToFit True False ' .$text_line1 . "\n" .$text_line2 . ' 2606.94 Fixed 0 Solid GRAPHISME Rotation0 False False ' .$img_logo. ' Uniform 0 Right Center 863.9999 Auto 0 Solid '; } /* * ETIQUETTE (19x51 mm) * LABEL FOR PRINTER DYMO LabelWriter 450 : WITH LOGO */ private function _getLabelEtiquette() { return ' Landscape MultiPurpose11355 11355 Multi-Purpose TEXTE Rotation0 False False Left Middle ShrinkToFit True False ' . "$numeroLab" . "\n" . "$dateAcquisition" . "\n" . "$organisme" . ($numeroInventaireOrganisme ? '-' . "$numeroInventaireOrganisme" : '') . ' ' . ' ' . ' GRAPHISME Rotation0 False False' . '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 Uniform 0 Right' . 'Center ' . ' ' . "\n"; } /* * RUBAN * LABEL FOR PRINTER DYMO LabelMznzhrt PnP : 3 lines WITH LOGO */ private function _getLabelRuban3() { return ' Landscape' /* // 9mm Tape9mm 9mm */ // 12mm .'Tape12mm 12mm Auto 0 0 Auto 0 Solid Horizontal TEXTE Rotation0 False False Left Middle AlwaysFit True False ' . "$numeroLab" . "\n" . "$organisme" . ($numeroInventaireOrganisme ? '-' . "$numeroInventaireOrganisme" : '') . "\n" . "$dateAcquisition" . ' 1477.513 Fixed 0 Solid GRAPHISME Rotation0 False False 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 Uniform 0 Right Center 800 Auto 0 Solid ' . "\n"; // fputs (ruban 3 lines) } // called from Javascript (Ajax) public function getDateGarantie($dateORjour, $dureeORmois, $uniteORannee, $duree = null, $unite = null) { if ($duree != null && $unite != null) { $date = $dateORjour . '-' . $dureeORmois . '-' . $uniteORannee; } else { $date = $dateORjour; $duree = $dureeORmois; $unite = $uniteORannee; } $date_next = date_create_from_format('d-m-Y', $date); switch ($unite) { case "Mois": date_add($date_next, date_interval_create_from_date_string($duree . ' months')); break; case "Ans": date_add($date_next, date_interval_create_from_date_string($duree . ' years')); break; } $this->set('date', date_format($date_next, 'd-m-Y')); $this->viewBuilder()->layout = 'ajax'; } public function printSheet($id = null) { $materiel = $this->Materiels->get($id, [ 'contain' => [ 'SurCategories', 'Categories', 'SousCategories', 'GroupesThematiques', 'GroupesMetiers', 'Organismes', 'Sites', 'Documents', 'Emprunts', 'Suivis' ] ]); $sites = TableRegistry::get('Sites'); $typeSuivis = TableRegistry::get('TypeSuivis'); $typeDocuments = TableRegistry::get('TypeDocuments'); if ($materiel->photo_id != null) { $imgMateriel = $materiel->photo_id . '.' . TableRegistry::get('Documents')->get($materiel->photo_id)->get('type_doc'); $this->set('imgMateriel', $imgMateriel); } $this->set('sites', $sites); $this->set('typeSuivis', $typeSuivis); $this->set('typeDocuments', $typeDocuments); $this->set('materiel', $materiel); $this->set('_serialize', [ 'materiel' ]); } }