Commit 4d0f315d7449429abd6d4da2089987750f02e619

Authored by Etienne Pallier
1 parent 3151d13d
Exists in master and in 2 other branches dev, dev-IRAP

Bugfix et amelioration tests + Simplification des vues (en cours)

README.md
... ... @@ -53,10 +53,13 @@ Logiciel testé et validé sur les configurations suivantes :
53 53  
54 54 VERSION ACTUELLE
55 55  
56   -Date: 16/05/2019
57   -Version: 2.12.14
  56 +Date: 20/05/2019
  57 +Version: 2.12.17
58 58 Author: EP
59   -Commentaire: Ajout tests pour fonctionnalité "Copier ce materiel"
  59 +Commentaire:
  60 + Bugfix et amelioration tests
  61 + Simplification des vues (en cours)
  62 +
60 63  
61 64 IMPORTANT :
62 65 - Pour connaitre la version actuelle, taper "./VERSION"
... ... @@ -92,11 +95,19 @@ La liste ci-dessous n'est plus à jour, elle est désormais en ligne ici : https
92 95  
93 96 -----------------------------------------------------------------------------------------------------------
94 97  
  98 +20/05/2019 Version: 2.12.17 (EP)
  99 +
  100 +
  101 +17/05/2019 Version: 2.12.15-17 (EP)
  102 + Bugfix modif matos: on ne doit plus pouvoir modifier un materiel validé (ou plus) => il faut le dé-valider avant !
  103 + Bugfix et amelioration tests
  104 + Simplification des vues (en cours)
  105 +
95 106 16/05/2019 Version: 2.12.12-14 (EP)
96 107 Bugfix ajout materiel
97 108 Bugfix tests
98 109 Ajout tests pour fonctionnalité "Copier ce materiel"
99   -
  110 +
100 111 15/05/2019 Version: 2.12.11 (EP)
101 112 Bugfix, simplification, et amélioration de la fonctionnalité "Copier ce matériel"
102 113  
... ...
src/Controller/AppController.php
... ... @@ -197,7 +197,7 @@ class AppController extends Controller
197 197 * @param string $id
198 198 */
199 199 // public function isAuthorizedAction(AppController $controller, $roleLong, $action, $id=null, $user=null) {
200   - public function isAuthorizedAction($controller, $roleLong, $action, $id = null, $user = null)
  200 + public function isAuthorizedAction2($controller, $roleLong, $action, $id = null, $user = null)
201 201 {
202 202 $doDEBUG = true;
203 203 $doDEBUG = false;
... ... @@ -273,7 +273,7 @@ class AppController extends Controller
273 273 }
274 274 if ($doDEBUG)
275 275 debug("CAS6");
276   - return $this->isAuthorizedAction($controller, $this->getPreviousRole($role), $action, $id, $user);
  276 + return $this->isAuthorizedAction2($controller, $this->getPreviousRole($role), $action, $id, $user);
277 277 }
278 278  
279 279 // @todo
... ... @@ -587,6 +587,11 @@ class AppController extends Controller
587 587 *
588 588 * @see \Cake\Controller\Controller::beforeFilter() 1) Autorisations SANS (ou AVANT) connexion
589 589 * 2) Ensuite, c'est isAuthorized qui gère
  590 + *
  591 + * Cette méthode est appelée pendant l’event Controller.initialize qui se produit
  592 + * AVANT chaque action du controller.
  593 + * C’est un endroit pratique pour vérifier le statut d’une session ou les permissions d’un utilisateur.
  594 + * ATTENTION: cette méthode sera appelée pour les actions manquantes.
590 595 *
591 596 */
592 597 public function beforeFilter(Event $event)
... ... @@ -697,7 +702,7 @@ class AppController extends Controller
697 702 $this->set('USER_IS_ADMINPLUS', $USER_IS_ADMINPLUS);
698 703 $this->set('USER_IS_SUPERADMIN', $USER_IS_SUPERADMIN);
699 704 $this->set('USER_IS_RESPONSABLE_OR_MORE', $USER_IS_RESPONSABLE_OR_MORE);
700   - $this->set('USER_IS_ADMIN_OR_MORE', $USER_IS_ADMIN_OR_MORE);
  705 + $this->set(compact('USER_IS_ADMIN_OR_MORE'));
701 706 $this->set('USER_IS_ADMINPLUS_OR_MORE', $USER_IS_ADMINPLUS_OR_MORE);
702 707  
703 708 $this->set('priviledgedUser', $priviledgedUser);
... ... @@ -747,10 +752,13 @@ class AppController extends Controller
747 752 ->first()['id']);
748 753  
749 754 $displayElement = function ($nom, $valeur, $params = "") {
750   - $balise = ($params != "") ? '<td ' . $params . '>' : '<td>';
  755 + $TD = ($params=="") ? 'TD' : "TD $params";
  756 + //$TD = ($params=="") ? '<TD>' : '<TD '.$params.'>';
  757 + //$tdstyle = $params!="" ? $params : '';
751 758 // Ca c'est parce que sinon y'a au moins deux tests qui passent pas, a cause de l'espace dans la balise ...
752   - if ($valeur != "")
753   - echo '<tr><td><strong>' . $nom . ' </strong></td>' . $balise . $valeur . '</td></tr>';
  759 + //if ($valeur != "") echo '<tr> <td><strong>'.$nom.' </strong></td>' . $TD.$valeur.'</td></tr>';
  760 + //if ($valeur != "") echo '<tr><td><strong>' . $nom . ' </strong></td>' . $balise . $valeur . '</td></tr>';
  761 + if ($valeur!="") echo "<TR> <TD><strong>$nom</strong></TD> <$TD>$valeur</TD> </TR>";
754 762 };
755 763 $this->set('displayElement', $displayElement);
756 764  
... ... @@ -766,7 +774,31 @@ class AppController extends Controller
766 774 return (int) $strInterval;
767 775 };
768 776 $this->set('dateProchainControleVerif', $dateProchainControleVerif);
769   - }
  777 +
  778 + // Pass this function to all views
  779 + //function echoActionButton($html, $icon_class, $title, $action, $id, $tip='', $controller='materiels', $mat=NULL, $photo=NULL) {
  780 + $echoActionButton = function($html, $icon_class, $title, $action, $id, $tip='', $controller='materiels', $mat=NULL, $photo=NULL) {
  781 + echo $html->link(
  782 + __("<i class=$icon_class></i> $title"),
  783 + [
  784 + 'controller' => $controller,
  785 + 'action' => $action,
  786 + $id,
  787 + $mat,
  788 + $photo
  789 + ],
  790 + [
  791 + 'title' => $tip,
  792 + 'escape' => false,
  793 + 'onclick' => 'return true;',
  794 + 'style' => 'margin-right: 10px'
  795 + ]
  796 + );
  797 + };
  798 + $this->set(compact('echoActionButton'));
  799 +
  800 +
  801 + } // beforeRender()
770 802  
771 803 // "le materiel", "le suivi"...
772 804 protected function getArticle()
... ...
src/Controller/MaterielsController.php
... ... @@ -140,14 +140,37 @@ class MaterielsController extends AppController
140 140 )
141 141 );
142 142 // $ACL
  143 +
  144 + /*
  145 + * Cette méthode est appelée pendant l’event Controller.initialize qui se produit avant chaque action du controller.
  146 + * C’est un endroit pratique pour vérifier le statut d’une session ou les permissions d’un utilisateur.
  147 + * Attention: La méthode beforeFilter() sera appelée pour les actions manquantes.
  148 + * Retourner une réponse à partir d’une méthode beforeFilter ne va pas empêcher l’appel des autres écouteurs du même event.
  149 + * Vous devez explicitement stopper l’event (cf https://book.cakephp.org/3.0/fr/controllers.html)
  150 + *
  151 + */
  152 + //use Cake\Event\Event;
  153 + public function beforeFilter(\Cake\Event\Event $event)
  154 + {
  155 + $this->myDebug("step 0: beforeFilter()");
  156 + parent::beforeFilter($event);
  157 + }
143 158  
144 159 /*
145 160 * EP added 13/6/17
146 161 * Set some useful global variables for all (Materiel) views
147 162 * Overload beforeRender()
  163 + *
  164 + * Cette méthode est appelée pendant l’event Controller.beforeRender qui se produit
  165 + * APRES l’action du controller mais AVANT que la vue ne soit rendue.
  166 + * Ce callback n’est pas souvent utilisé, mais peut-être nécessaire si vous appelez render() manuellement à la fin d’une action donnée
  167 + *
  168 + * Voir aussi beforeFilter() appellée AVANT l'action du controller
148 169 */
149 170 public function beforeRender(\Cake\Event\Event $event)
150 171 {
  172 + $this->myDebug("step 3: beforeRender()");
  173 +
151 174 parent::beforeRender($event);
152 175  
153 176 // $this->layout = 'default';
... ... @@ -175,6 +198,16 @@ class MaterielsController extends AppController
175 198 * }
176 199 * }
177 200 */
  201 +
  202 + //TODO: temporaire, à MOVE dans AppController
  203 + /*
  204 + $action = $this->getActionPassed();
  205 + if ($action == 'view') {
  206 + $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);
  207 + $this->set(compact('CAN_EDIT'));
  208 + }
  209 + */
  210 +
178 211 }
179 212  
180 213  
... ... @@ -182,14 +215,15 @@ class MaterielsController extends AppController
182 215  
183 216 /**
184 217 *
185   - * @param
186   - * $user
  218 + * //param $user
  219 + * @param $userFromSession
187 220 * @return boolean Give authorization for materiels
188 221 */
  222 + // CAKEPHP function
189 223 public function isAuthorized($userFromSession)
190 224 {
191 225 //if (parent::isAuthorized($userFromSession)) return TRUE;
192   -
  226 + $this->myDebug("step 1: isAuthorized()");
193 227 $user = $userFromSession;
194 228 $configuration = $this->confLabinvent;
195 229 $userCname = $user[$configuration->ldap_authenticationType][0];
... ... @@ -221,8 +255,20 @@ class MaterielsController extends AppController
221 255 *
222 256 * Tout le reste en dessous de cette ligne devient inutile !!!
223 257 */
224   - $this->myDebug("isAuthorizedAction ? " . $this->isAuthorizedAction($this, $role, $action, $id, $user));
  258 + $this->myDebug("isAuthorizedAction ? " . $this->isAuthorizedAction2($this, $role, $action, $id, $user));
  259 + return $this->isAuthorizedAction($role, $action, $id, $userFromSession, $userCname);
  260 +
  261 + } // isAuthorized
225 262  
  263 +
  264 + /*
  265 + * EP own defined function (18/5/19), date importante
  266 + * Avantage: TOUTES les ACL (droits des utilisateurs) sont définies en UN SEUL UNIQUE endroit: ICI
  267 + * Les 3 niveaux successifs parcourus par cakephp (isAuthorized() puis beforeRender() puis la VUE) font tous appels à cette MEME fonction
  268 + * On ne définit et modifie les droits qu'ici et nulle part ailleurs, surtout pas dans les vues !!!
  269 + */
  270 + private function isAuthorizedAction($role, $action, $id, $user, $userCname) {
  271 +
226 272 /*
227 273 * Structure mise en place:
228 274 *
... ... @@ -230,7 +276,6 @@ class MaterielsController extends AppController
230 276 * switch ROLE
231 277 *
232 278 */
233   -
234 279 switch ($action) {
235 280  
236 281 // INDEX, VIEW, ADD, FIND
... ... @@ -452,7 +497,7 @@ class MaterielsController extends AppController
452 497 } // end of switch case
453 498  
454 499 // DEFAULT PARENT RULE
455   - return parent::isAuthorized($userFromSession);
  500 + return parent::isAuthorized($user);
456 501 }
457 502  
458 503 /*
... ... @@ -548,6 +593,8 @@ class MaterielsController extends AppController
548 593 */
549 594 public function index()
550 595 {
  596 + $this->myDebug("step 2: index()");
  597 +
551 598 $condition = '';
552 599 if (isset($this->request->getAttribute('params')['pass'][0])) {
553 600 $condition = [
... ... @@ -685,6 +732,7 @@ class MaterielsController extends AppController
685 732 */
686 733 public function view($id = null)
687 734 {
  735 + $this->myDebug("step 2: view()");
688 736 $materiel = $this->Materiels->get($id, [
689 737 'contain' => [
690 738 'SurCategories',
... ... @@ -750,6 +798,13 @@ class MaterielsController extends AppController
750 798 $this->set('_serialize', [
751 799 'materiel'
752 800 ]);
  801 +
  802 + // TODO, mais plutot dans le beforeFilter() ou beforeRender()...
  803 + /*
  804 + $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);
  805 + $this->set(compact('CAN_EDIT'));
  806 + */
  807 +
753 808 } // view
754 809  
755 810  
... ... @@ -763,6 +818,8 @@ class MaterielsController extends AppController
763 818 */
764 819 public function add_or_edit($is_add, $id=null, $valeurs=null, $erreurs=null)
765 820 {
  821 + $this->myDebug("step 2: add_or_edit()");
  822 +
766 823 $usersTable = TableRegistry::getTableLocator()->get('Users');
767 824  
768 825 // Set $materiel
... ...
src/Template/Materiels/view.ctp
... ... @@ -3,6 +3,40 @@ use Cake\I18n\Time;
3 3 use Cake\I18n\Date;
4 4 use Cake\ORM\TableRegistry;
5 5  
  6 +// (EP 18/5/19) Elements set by Controller for this view:
  7 +// - Constants :
  8 +//$CAN_EDIT = $CAN_EDIT;
  9 +$PDF_ENGINE = $PDF_ENGINE;
  10 +$USER_IS_ADMIN_OR_MORE = $USER_IS_ADMIN_OR_MORE;
  11 +// - Fonctions :
  12 +$displayElement = $displayElement;
  13 +$dateProchainControleVerif = $dateProchainControleVerif;
  14 +$echoActionButton = $echoActionButton;
  15 +// TODO: yena plein d'autres
  16 +// ...
  17 +
  18 +/* (EP) moved to controller
  19 +function $echoActionButton($html, $icon_class, $title, $action, $id, $tip='', $controller='materiels', $mat=NULL, $photo=NULL) {
  20 + echo $html->link(
  21 + __("<i class=$icon_class></i> $title"),
  22 + [
  23 + 'controller' => $controller,
  24 + 'action' => $action,
  25 + $id,
  26 + $mat,
  27 + $photo
  28 + ],
  29 + [
  30 + 'title' => $tip,
  31 + 'escape' => false,
  32 + 'onclick' => 'return true;',
  33 + 'style' => 'margin-right: 10px'
  34 + ]
  35 + );
  36 +}
  37 +*/
  38 +
  39 +
6 40 //$PDF_ENGINE = "FPDF";
7 41 //$PDF_ENGINE = "DOMPDF";
8 42  
... ... @@ -82,6 +116,13 @@ $USER_IS_RESPONSABLE_AND_CREATOR_OR_OWNER = $USER_IS_RESPONSABLE &amp;&amp; in_array($us
82 116  
83 117 $USER_IS_RESPONSABLE_AND_SAME_GROUP = $USER_IS_RESPONSABLE && ((isset($priviledgedUser->groupes_metier_id) && $priviledgedUser->groupes_metier_id != $idGmNa && $materiel->groupes_metier_id == $priviledgedUser->groupes_metier_id) || (isset($priviledgedUser->groupe_thematique_id) && $priviledgedUser->groupe_thematique_id != $idGtNa && $materiel->groupes_thematique_id == $priviledgedUser->groupe_thematique_id));
84 118  
  119 +
  120 +// TODO: to be set by controller
  121 +$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);
  122 +$CAN_ATTACH_A_DOC = $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;
  123 +$CAN_COPY = $IS_CREATED and ($USER_IS_ADMIN_OR_MORE || $USER_IS_UTILISATEUR_AND_CREATOR_OR_OWNER);
  124 +$CAN_PRINT_LABEL = $IS_VALIDATED && $configuration->hasPrinter && $USER_IS_ADMIN_OR_MORE;
  125 +
85 126 ?>
86 127  
87 128  
... ... @@ -89,52 +130,28 @@ $USER_IS_RESPONSABLE_AND_SAME_GROUP = $USER_IS_RESPONSABLE &amp;&amp; ((isset($priviledg
89 130 <div class="materiels view">
90 131  
91 132 <h2>
92   - <?php
93   -
94   - /*
95   - echo $materiel;
96   - $materiel2 = TableRegistry::get('Materiels')->find('all', [
97   - 'conditions' => [
98   - 'numero_laboratoire' => "IRAP18-2018-0001"
99   - ],
100   - 'contain' => ['Fournisseurs', 'Organismes']
101   - ]
102   - )->first();
103   - $materiel2 = TableRegistry::get('Materiels')->find('all')->contain(['Fournisseurs', 'Organismes']);
104   - foreach ($materiel2 as $matos) {
105   - echo $matos;
106   - echo "fournisseur=".$matos->fournisseur->nom;
107   - echo "id=".$matos->id;
108   - }
109   - echo "fournisseur=".$materiel2->fournisseur->nom;
110   - echo "<br/>";
111   - */
112   -
113   -// if (h($materiel->status) == 'ARCHIVED') echo '<i class="icon-inbox"></i> ';
114   -if ($IS_ARCHIVED)
115   - echo '<i class="icon-inbox"></i> ';
116   -$panne = h($materiel->hors_service) ? ' (HORS SERVICE)' : '';
117   -?>
118   - <?=h($materiel->designation) . $panne?>
119   -
120   - <span style="font-size: 70%; color: grey;">
121   - <?=h($materiel->numero_laboratoire)?>
122   - <?php
123   - // if (h($materiel->status) == 'ARCHIVED') echo ' (Archivé)';
124   - if ($IS_ARCHIVED)
125   - echo ' (Archivé)';
126   - ?>
127   - </span>
  133 + <?php
  134 + // if (h($materiel->status) == 'ARCHIVED') echo '<i class="icon-inbox"></i> ';
  135 + if ($IS_ARCHIVED) echo '<i class="icon-inbox"></i> ';
  136 + $panne = h($materiel->hors_service) ? ' (HORS SERVICE)' : '';
  137 + ?>
  138 + <?=h($materiel->designation) . $panne?>
  139 + <span style="font-size: 70%; color: grey;"><?=h($materiel->numero_laboratoire)?>
  140 + <?php
  141 + if ($IS_ARCHIVED) echo ' (Archivé)';
  142 + ?>
  143 + </span>
128 144 </h2>
129 145 <br />
130 146  
131 147 <div id="materiel_images" style="text-align: center;">
132 148 <?php
133   - //maintenant que les dénominations des fichiers dl on changé on a besoin des
134   - //informations de la photo pour retrouver son nom et l'afficher, l'id ne suffit plus
135   - //on parcourt donc les documents liés à ce matériel
136   - foreach ($materiel->documents as $documents) :
137   - //et si le document est la photo liée, on l'affiche, pour cela
  149 + /* Maintenant que les dénominations des fichiers dl on changé on a besoin des
  150 + * informations de la photo pour retrouver son nom et l'afficher, l'id ne suffit plus
  151 + * on parcourt donc les documents liés à ce matériel
  152 + */
  153 + foreach ($materiel->documents as $documents) {
  154 + // et si le document est la photo liée, on l'affiche, pour cela
138 155 if($documents->photo) {
139 156 //on récupère le doc
140 157 $photo = $documents;
... ... @@ -149,11 +166,10 @@ $panne = h($materiel-&gt;hors_service) ? &#39; (HORS SERVICE)&#39; : &#39;&#39;;
149 166 'style' => 'max-width: 300px; text-align: center;'
150 167 ]);
151 168 }
152   - }
153   - endforeach ;
154   -
  169 + }
  170 + }
155 171  
156   - // Url transformed in QrCode
  172 + // QRCODE (Url)
157 173 $this->request->getSession()->write("qrUrl", $this->request->env('SERVER_NAME') . $this->request->env('REQUEST_URI'));
158 174 $this->requestAction('/QrCodes/creer/');
159 175 echo $this->Html->image('qrcodes/' . $this->request->getSession()
... ... @@ -167,50 +183,29 @@ $panne = h($materiel-&gt;hors_service) ? &#39; (HORS SERVICE)&#39; : &#39;&#39;;
167 183  
168 184  
169 185 <!-- BOUTONS -->
170   -
171   - <div id="boutons" class="actions"
172   - style="margin-bottom: 20px; width: 100%; float: none; padding: 10px 0;">
  186 + <div id="boutons" class="actions" style="margin-bottom:20px; width:100%; float:none; padding:5px 0;">
173 187  
174 188 <?php
175 189 // CREATED or VALIDATED
176 190 // if ( in_array($materiel->status, ['CREATED','VALIDATED']) ) {
177 191 // (EP 17/5/19) Ben non, on peut pas éditer si validé !!!
178 192 //if ($IS_CREATED || $IS_VALIDATED) {
179   - if ($IS_CREATED) {
180   - if ($USER_IS_ADMIN_OR_MORE || $USER_IS_UTILISATEUR_AND_CREATOR_OR_OWNER || $USER_IS_RESPONSABLE_AND_SAME_GROUP || $USER_IS_RESPONSABLE_AND_CREATOR_OR_OWNER)/*
181   - //in_array($role, ['Administration','Administration Plus','Super Administrateur'])
182   - ||
183   - (
184   - //$role == 'Utilisateur'
185   - //&& in_array($username, [$materiel->nom_createur, $materiel->nom_responsable])
186   - )
187   - ||
188   - (
189   - $role == 'Responsable'
190   - && (
191   - (
192   - isset($priviledgedUser->groupes_metier_id)
193   - && $priviledgedUser->groupes_metier_id != $idGmNa
194   - && $materiel->groupes_metier_id == $priviledgedUser->groupes_metier_id
195   - )
196   - ||
197   - (
198   - isset($priviledgedUser->groupe_thematique_id)
199   - && $priviledgedUser->groupe_thematique_id != $idGtNa
200   - && $materiel->groupes_thematique_id == $priviledgedUser->groupe_thematique_id
201   - )
202   - )
203   - )
204   - */
205   - echo $this->Html->link(__('<i class="icon-pencil"></i> Editer ce matériel'), [
206   - 'action' => 'edit',
207   - $materiel->id
208   - ], [
209   - 'escape' => false,
210   - 'onclick' => 'return true;',
211   - 'style' => 'margin-right: 10px'
212   - ]);
213   - }
  193 + //if ($IS_CREATED) {
  194 + if ($CAN_EDIT) $echoActionButton($this->Html, 'icon-pencil', 'Editer ce matériel', 'edit', $materiel->id);
  195 + /*
  196 + echo $this->Html->link(
  197 + __('<i class="icon-pencil"></i> Editer ce matériel'),
  198 + [
  199 + 'action' => 'edit',
  200 + $materiel->id
  201 + ],
  202 + [
  203 + 'escape' => false,
  204 + 'onclick' => 'return true;',
  205 + 'style' => 'margin-right: 10px'
  206 + ]
  207 + );
  208 + */
214 209  
215 210 /*
216 211 * // TOBEARCHIVED+
... ... @@ -231,6 +226,8 @@ $panne = h($materiel-&gt;hors_service) ? &#39; (HORS SERVICE)&#39; : &#39;&#39;;
231 226 if ($IS_VALIDATED) {
232 227  
233 228 // BOUTON NOUVEAU SUIVI
  229 + $echoActionButton($this->Html, 'icon-plus', 'Nouv. Suivi', 'add', $materiel->id, 'Faire un nouveau suivi de ce matériel', 'suivis');
  230 + /*
234 231 echo $this->Html->link('<i class="icon-plus"></i> Nouv. Suivi', [
235 232 'controller' => 'suivis',
236 233 'action' => 'add',
... ... @@ -240,8 +237,11 @@ $panne = h($materiel-&gt;hors_service) ? &#39; (HORS SERVICE)&#39; : &#39;&#39;;
240 237 'style' => 'margin-right: 10px',
241 238 'escape' => false
242 239 ]); // End link
243   -
  240 + */
  241 +
244 242 // BOUTON NOUVEL EMPRUNT
  243 + $echoActionButton($this->Html, 'icon-plus', 'Nouv. Emprunt', 'add', $materiel->id, 'Faire un nouvel emprunt de ce matériel', 'emprunts');
  244 + /*
245 245 echo $this->Html->link('<i class="icon-plus"></i> Nouv. Emprunt', [
246 246 'controller' => 'emprunts',
247 247 'action' => 'add',
... ... @@ -251,36 +251,19 @@ $panne = h($materiel-&gt;hors_service) ? &#39; (HORS SERVICE)&#39; : &#39;&#39;;
251 251 'style' => 'margin-right: 10px',
252 252 'escape' => false
253 253 ]); // End link
  254 + */
254 255 }
255 256  
256   - // BOUTON "Lier un Doc"
257   - if ($USER_IS_ADMIN_OR_MORE || $USER_IS_UTILISATEUR_AND_CREATOR_OR_OWNER || $USER_IS_RESPONSABLE_AND_SAME_GROUP || $USER_IS_RESPONSABLE_AND_CREATOR_OR_OWNER) {
  257 + // BOUTONS "Lier un Doc" et "Remplacer/Lier photo"
  258 + if ($CAN_ATTACH_A_DOC) {
  259 + //if ($USER_IS_ADMIN_OR_MORE || $USER_IS_UTILISATEUR_AND_CREATOR_OR_OWNER || $USER_IS_RESPONSABLE_AND_SAME_GROUP || $USER_IS_RESPONSABLE_AND_CREATOR_OR_OWNER) {
  260 + $echoActionButton($this->Html, 'icon-file', 'Lier un Doc.', 'add', $materiel->id, 'Attacher un Doc. à ce matériel', 'documents', 'mat');
  261 + // BOUTON "photo"
  262 + if ($materiel->photo_id != null)
  263 + $echoActionButton($this->Html, 'icon-file', 'Remplacer la photo.', 'add', $materiel->id, 'Remplacer la photo de ce matériel', 'documents', 'mat', 'photo');
  264 + else
  265 + $echoActionButton($this->Html, 'icon-file', 'Lier une photo.', 'add', $materiel->id, 'Attacher une photo à ce matériel', 'documents', 'mat', 'photo');
258 266 /*
259   - * if (
260   - * in_array($role, ['Administration','Administration Plus','Super Administrateur'])
261   - * ||
262   - * (
263   - * $role == 'Utilisateur'
264   - * && in_array($username, [$materiel->nom_createur,$materiel->nom_responsable])
265   - * )
266   - * || (
267   - * $role == 'Responsable'
268   - * && (
269   - * (
270   - * isset($priviledgedUser->groupes_metier_id)
271   - * && $priviledgedUser->groupes_metier_id != $idGmNa
272   - * && $materiel->groupes_metier_id == $priviledgedUser->groupes_metier_id
273   - * )
274   - * ||
275   - * (
276   - * isset($priviledgedUser->groupe_thematique_id)
277   - * && $priviledgedUser->groupe_thematique_id != $idGtNa
278   - * && $materiel->groupes_thematique_id == $priviledgedUser->groupe_thematique_id
279   - * )
280   - * )
281   - * )
282   - * ) {
283   - */
284 267 echo $this->Html->link('<i class="icon-file"></i> Lier un Doc.', [
285 268 'controller' => 'documents',
286 269 'action' => 'add',
... ... @@ -291,9 +274,9 @@ $panne = h($materiel-&gt;hors_service) ? &#39; (HORS SERVICE)&#39; : &#39;&#39;;
291 274 'style' => 'margin-right: 10px',
292 275 'escape' => false
293 276 ]);
  277 + */
294 278  
295   - // BOUTON "photo"
296   - if ($materiel->photo_id != null) {
  279 + /*
297 280 echo $this->Html->link('<i class="icon-file"></i> Remplacer la photo.', [
298 281 'controller' => 'documents',
299 282 'action' => 'add',
... ... @@ -305,7 +288,8 @@ $panne = h($materiel-&gt;hors_service) ? &#39; (HORS SERVICE)&#39; : &#39;&#39;;
305 288 'style' => 'margin-right: 10px',
306 289 'escape' => false
307 290 ]);
308   - } else {
  291 + */
  292 + /*
309 293 echo $this->Html->link('<i class="icon-file"></i> Lier une photo.', [
310 294 'controller' => 'documents',
311 295 'action' => 'add',
... ... @@ -317,7 +301,7 @@ $panne = h($materiel-&gt;hors_service) ? &#39; (HORS SERVICE)&#39; : &#39;&#39;;
317 301 'style' => 'margin-right: 10px',
318 302 'escape' => false
319 303 ]);
320   - }
  304 + */
321 305 } // BOUTON Lier un doc
322 306  
323 307 // Doc admission et sortie (admin+)
... ... @@ -337,12 +321,14 @@ $panne = h($materiel-&gt;hors_service) ? &#39; (HORS SERVICE)&#39; : &#39;&#39;;
337 321 $data = $materiel->numero_laboratoire . ".pdf";
338 322 }
339 323 // if (($materiel->status == 'VALIDATED') || ($materiel->status == 'CREATED')) {
  324 + $echoActionButton($this->Html, 'icon-file', 'Doc. admission', $action, $data, "Voir le document d'admission", 'documents');
  325 + /*
340 326 echo $this->Html->link('<i class="icon-file"></i> Doc. admission', [
341 327 'controller' => 'documents',
342   - /*
  328 + ///
343 329 'action' => 'admission',
344 330 $materiel->numero_laboratoire
345   - */
  331 + ///
346 332 'action' => $action,
347 333 $data
348 334 ], [
... ... @@ -350,6 +336,7 @@ $panne = h($materiel-&gt;hors_service) ? &#39; (HORS SERVICE)&#39; : &#39;&#39;;
350 336 'style' => 'margin-right: 10px',
351 337 'escape' => false
352 338 ]);
  339 + */
353 340 }
354 341  
355 342 // Doc sortie (admin only)
... ... @@ -365,6 +352,8 @@ $panne = h($materiel-&gt;hors_service) ? &#39; (HORS SERVICE)&#39; : &#39;&#39;;
365 352 $data = $materiel->numero_laboratoire . ".pdf";
366 353 }
367 354 // else if (($materiel->status == 'ARCHIVED') || ($materiel->status == 'TOBEARCHIVED')) {
  355 + $echoActionButton($this->Html, 'icon-file', 'Doc. sortie', $action, $data, "Voir le document de sortie", 'documents');
  356 + /*
368 357 echo $this->Html->link('<i class="icon-file"></i> Doc. sortie', [
369 358 'controller' => 'documents',
370 359 'action' => $action,
... ... @@ -380,6 +369,7 @@ $panne = h($materiel-&gt;hors_service) ? &#39; (HORS SERVICE)&#39; : &#39;&#39;;
380 369 'style' => 'margin-right: 10px',
381 370 'escape' => false
382 371 ]);
  372 + */
383 373 }
384 374 }
385 375  
... ... @@ -473,6 +463,8 @@ $panne = h($materiel-&gt;hors_service) ? &#39; (HORS SERVICE)&#39; : &#39;&#39;;
473 463 } // BOUTON changement statut
474 464  
475 465 // BOUTON Copier (seulement pour les materiels qui sont CREATED et pour les ADMINet+ ou USER owner)
  466 + if ($CAN_COPY) $echoActionButton($this->Html, 'icon-plus', 'Copier ce matériel', 'add', $materiel->id, "Copier ce matériel");
  467 + /*
476 468 if ( $IS_CREATED and ($USER_IS_ADMIN_OR_MORE || $USER_IS_UTILISATEUR_AND_CREATOR_OR_OWNER) )
477 469 echo $this->Html->link('<i class="icon-pencil"></i> Copier ce matériel',
478 470 [
... ... @@ -485,9 +477,11 @@ $panne = h($materiel-&gt;hors_service) ? &#39; (HORS SERVICE)&#39; : &#39;&#39;;
485 477 'style' => 'margin-right: 10px; margin-top: 10px; display: inline-block',
486 478 'escape' => false
487 479 ]);
  480 + */
488 481  
489 482 // BOUTON ETIQUETTE (si imprimante disponible)
490   - if ($IS_VALIDATED && $configuration->hasPrinter && $USER_IS_ADMIN_OR_MORE) {
  483 + if ($CAN_PRINT_LABEL) {
  484 + //if ($IS_VALIDATED && $configuration->hasPrinter && $USER_IS_ADMIN_OR_MORE) {
491 485 /*
492 486 in_array($role, [
493 487 'Administration',
... ... @@ -707,32 +701,6 @@ if ($USER_IS_ADMIN_OR_MORE) {
707 701 <td class="actions" style="padding: 6px 0; text-align: left;">
708 702 <?php
709 703 if ($USER_IS_ADMIN_OR_MORE || $USER_IS_UTILISATEUR_AND_CREATOR_OR_OWNER || $USER_IS_RESPONSABLE_AND_SAME_GROUP || $USER_IS_RESPONSABLE_AND_CREATOR_OR_OWNER) {
710   - /*
711   - * if (
712   - * in_array($role, ['Administration','Administration Plus','Super Administrateur'])
713   - * ||
714   - * (
715   - * $role == 'Utilisateur'
716   - * && in_array($username, [$materiel->nom_createur,$materiel->nom_responsable])
717   - * )
718   - * || (
719   - * $role == 'Responsable'
720   - * && (
721   - * (
722   - * isset($priviledgedUser->groupes_metier_id)
723   - * && $priviledgedUser->groupes_metier_id != $idGmNa
724   - * && $materiel->groupes_metier_id == $priviledgedUser->groupes_metier_id
725   - * )
726   - * ||
727   - * (
728   - * isset($priviledgedUser->groupe_thematique_id)
729   - * && $priviledgedUser->groupe_thematique_id != $idGtNa
730   - * && $materiel->groupes_thematique_id == $priviledgedUser->groupe_thematique_id
731   - * )
732   - * )
733   - * )
734   - * ) {
735   - */
736 704 echo $this->Html->link(__('<i class="icon-pencil"></i>'), [
737 705 'controller' => 'Suivis',
738 706 'action' => 'edit',
... ... @@ -797,7 +765,7 @@ if ($USER_IS_ADMIN_OR_MORE) {
797 765 </tr>
798 766 <?php
799 767  
800   -foreach ($materiel->emprunts as $emprunt) :
  768 + foreach ($materiel->emprunts as $emprunt) :
801 769 $type = 'Externe';
802 770 $lieu = $emprunt['laboratoire'];
803 771 if ($emprunt['emprunt_interne'] == 1) {
... ... @@ -812,33 +780,7 @@ foreach ($materiel-&gt;emprunts as $emprunt) :
812 780 <tr>
813 781 <td class="actions" style="padding: 6px 0; text-align: left;">
814 782 <?php
815   - if ($USER_IS_ADMIN_OR_MORE || $USER_IS_UTILISATEUR_AND_CREATOR_OR_OWNER || $USER_IS_RESPONSABLE_AND_SAME_GROUP || $USER_IS_RESPONSABLE_AND_CREATOR_OR_OWNER ) {
816   - /*
817   - * if (
818   - * in_array($role, ['Administration','Administration Plus','Super Administrateur'])
819   - * ||
820   - * (
821   - * $role == 'Utilisateur'
822   - * && in_array($username, [$materiel->nom_createur,$materiel->nom_responsable])
823   - * )
824   - * || (
825   - * $role == 'Responsable'
826   - * && (
827   - * (
828   - * isset($priviledgedUser->groupes_metier_id)
829   - * && $priviledgedUser->groupes_metier_id != $idGmNa
830   - * && $materiel->groupes_metier_id == $priviledgedUser->groupes_metier_id
831   - * )
832   - * ||
833   - * (
834   - * isset($priviledgedUser->groupe_thematique_id)
835   - * && $priviledgedUser->groupe_thematique_id != $idGtNa
836   - * && $materiel->groupes_thematique_id == $priviledgedUser->groupe_thematique_id
837   - * )
838   - * )
839   - * )
840   - * ) {
841   - */
  783 + if ($USER_IS_ADMIN_OR_MORE || $USER_IS_UTILISATEUR_AND_CREATOR_OR_OWNER || $USER_IS_RESPONSABLE_AND_SAME_GROUP || $USER_IS_RESPONSABLE_AND_CREATOR_OR_OWNER ) {
842 784 echo $this->Html->link(__('<i class="icon-pencil"></i>'), [
843 785 'controller' => 'Emprunts',
844 786 'action' => 'edit',
... ... @@ -919,33 +861,6 @@ foreach ($materiel-&gt;emprunts as $emprunt) :
919 861 ]);
920 862 }
921 863 if ($USER_IS_ADMIN_OR_MORE || $USER_IS_UTILISATEUR_AND_CREATOR_OR_OWNER || $USER_IS_RESPONSABLE_AND_SAME_GROUP || $USER_IS_RESPONSABLE_AND_CREATOR_OR_OWNER) {
922   - /*
923   - * if (
924   - * in_array($role, ['Administration','Administration Plus','Super Administrateur'])
925   - * ||
926   - * (
927   - * $role == 'Utilisateur'
928   - * && in_array($username, [$materiel->nom_createur,$materiel->nom_responsable])
929   - * )
930   - * ||
931   - * (
932   - * $role == 'Responsable'
933   - * && (
934   - * (
935   - * isset($priviledgedUser->groupes_metier_id)
936   - * && $priviledgedUser->groupes_metier_id != $idGmNa
937   - * && $materiel->groupes_metier_id == $priviledgedUser->groupes_metier_id
938   - * )
939   - * ||
940   - * (
941   - * isset($priviledgedUser->groupe_thematique_id)
942   - * && $priviledgedUser->groupe_thematique_id != $idGtNa
943   - * && $materiel->groupes_thematique_id == $priviledgedUser->groupe_thematique_id
944   - * )
945   - * )
946   - * )
947   - * ) {
948   - */
949 864 echo $this->Html->link(__('<i class="icon-pencil"></i>'), [
950 865 'controller' => 'Documents',
951 866 'action' => 'edit',
... ...
src/Template/Suivis/view.ctp
... ... @@ -58,11 +58,15 @@
58 58 else
59 59 $style = '"color: green"';
60 60  
61   - $displayElement(__('Materiel'), $suivi->has('materiel') ? $this->Html->link($suivi->materiel->designation, [
62   - 'controller' => 'Materiels',
63   - 'action' => 'view',
64   - $suivi->materiel->id
65   - ]) : '');
  61 + $displayElement(__('Materiel'), $suivi->has('materiel') ?
  62 + $this->Html->link($suivi->materiel->designation, [
  63 + 'controller' => 'Materiels',
  64 + 'action' => 'view',
  65 + $suivi->materiel->id
  66 + ])
  67 + :
  68 + ''
  69 + );
66 70 $displayElement(__('Numéro interne (labo)'), $suivi->has('materiel') ? h($suivi->materiel->numero_laboratoire) : '');
67 71 $displayElement(__('Statut'), h($suivi->statut));
68 72 $displayElement(__('Prestataire'), h($suivi->organisme));
... ...
tests/TestCase/Controller/MaterielsControllerTest.php
... ... @@ -125,6 +125,23 @@ class MaterielsControllerTest extends General {
125 125 // Idem dataProviderRoles5 mais avec USER_from_ldap en plus:
126 126 public function dataProviderRoles6() { return $this->ROLES6; }
127 127  
  128 +
  129 + private function _checkMaterielExistsInViewsIndexAndViewAndInDatabase($role, $id, $designation=NULL, $num_inventaire=NULL) {}
  130 + private function _checkMaterielExistsInViewsIndexAndView($role, $id, $designation=NULL, $num_inventaire=NULL) {}
  131 + private function _checkMaterielExistsInViewIndex($role, $id, $designation=NULL, $num_inventaire=NULL) {}
  132 + private function _checkMaterielExistsInViewView($role, $id, $designation=NULL, $num_inventaire=NULL) {}
  133 + private function _checkMaterielExistsInDatabase($role, $id, $designation=NULL, $num_inventaire=NULL) {}
  134 + private function _checkMaterielViewIsOK($role, $id, $designation=NULL, $num_inventaire=NULL) {}
  135 + private function _checkNbMaterielInIndexViewIs(bool $COPIED, $role, $nbmat, $designation=NULL, $num_inventaire=NULL) {
  136 + $this->get('/materiels/index');
  137 + if (! $COPIED)
  138 + $this->assertResponseNotContains("Liste des matériels (".$nbmat.")", $role);
  139 + else {
  140 + $this->assertResponseContains("Liste des matériels (".$nbmat.")", $role);
  141 + if (isset($designation)) $this->assertResponseContains($designation, "Le matériel ne s'ajoute pas correctement.");
  142 + if (isset($num_inventaire)) $this->assertResponseContains($num_inventaire, "La génération du n°de labo n'est pas bonne.");
  143 + }
  144 + }
128 145  
129 146  
130 147 /*
... ... @@ -225,7 +242,7 @@ class MaterielsControllerTest extends General {
225 242 */
226 243 }
227 244 private function _testEasyACL(AppController $controller, $roleLong, $action, $expectedRule) {
228   - $rule = $controller->isAuthorizedAction($controller, $roleLong, $action);
  245 + $rule = $controller->isAuthorizedAction2($controller, $roleLong, $action);
229 246 $this->assertEquals($expectedRule, $rule, $roleLong.' do '.$action);
230 247 }
231 248  
... ... @@ -655,7 +672,7 @@ class MaterielsControllerTest extends General {
655 672 $this->_testMatCopy(2, TRUE, $role, 1, $modified_data, 'TEST-2016-0015');
656 673  
657 674 // 3) RULE MATERIEL.COPY.3 :
658   - // Impossible de copier un matos de status superieur à CREATED (sauf pour SUPERADMIN)
  675 + // Impossible de copier un matos de statut superieur à CREATED (sauf pour SUPERADMIN)
659 676 $this->_testMatCopy(3, $role=="SUPER", $role, 3);
660 677  
661 678 // 4) RULE MATERIEL.COPY.4 :
... ... @@ -666,26 +683,8 @@ class MaterielsControllerTest extends General {
666 683  
667 684 }
668 685  
669   -
670   - private function _checkMaterielExistsInViewsIndexAndViewAndInDatabase($role, $id, $designation=NULL, $num_inventaire=NULL) {}
671   - private function _checkMaterielExistsInViewsIndexAndView($role, $id, $designation=NULL, $num_inventaire=NULL) {}
672   - private function _checkMaterielExistsInViewIndex($role, $id, $designation=NULL, $num_inventaire=NULL) {}
673   - private function _checkMaterielExistsInViewView($role, $id, $designation=NULL, $num_inventaire=NULL) {}
674   - private function _checkMaterielExistsInDatabase($role, $id, $designation=NULL, $num_inventaire=NULL) {}
675   - private function _checkMaterielViewIsOK($role, $id, $designation=NULL, $num_inventaire=NULL) {}
676   - private function _checkNbMaterielInIndexViewIs(bool $COPIED, $role, $nbmat, $designation=NULL, $num_inventaire=NULL) {
677   - $this->get('/materiels/index');
678   - if (! $COPIED)
679   - $this->assertResponseNotContains("Liste des matériels (".$nbmat.")", $role);
680   - else {
681   - $this->assertResponseContains("Liste des matériels (".$nbmat.")", $role);
682   - if (isset($designation)) $this->assertResponseContains($designation, "Le matériel ne s'ajoute pas correctement.");
683   - if (isset($num_inventaire)) $this->assertResponseContains($num_inventaire, "La génération du n°de labo n'est pas bonne.");
684   - }
685   - }
686   -
687   - // Called by testMatCopy()
688   - private function _testMatCopy(int $testnum, bool $COPIED, string $role, $id, array $materiel_new_data=[], $num_inventaire=NULL) {
  686 + // Called by testMatCopy() just above
  687 + private function _testMatCopy($testnum, $COPIED, $role, $id, array $materiel_new_data=[], $num_inventaire=NULL) {
689 688 //debug("_testMatCopy numéro ".$testnum);
690 689 echo("\n");
691 690 echo("_testMatCopy (with role ".$role.") numéro ".$testnum." :");
... ... @@ -728,12 +727,13 @@ class MaterielsControllerTest extends General {
728 727 if ($COPIED) {
729 728 // On supprime le dernier materiel pour garder toujours la meme fixture de départ
730 729 //debug(TableRegistry::getTableLocator()->get('Materiels')->find()->last()->id);
731   - $matos_last = TableRegistry::getTableLocator()->get('Materiels')->find()->last();
732   - //debug($matos_last->id);
  730 + //$matos_last = TableRegistry::getTableLocator()->get('Materiels')->find()->last();
  731 + $matos_last = $this->Materiels->find()->last();
  732 + $this->Materiels->delete($matos_last);
  733 + // Ca marche aussi comme ça, mais c'est moins rapide:
  734 + //$this->post('/materiels/delete/'.$matos_last->id);
733 735 //$this->post('/materiels/delete/15');
734   - $this->post('/materiels/delete/'.$matos_last->id);
735 736 //$this->get('/materiels/view/15');
736   - //$this->assertResponseContains($designation, "Le matériel ne s'ajoute pas correctement.");
737 737 }
738 738 }
739 739  
... ... @@ -1269,7 +1269,7 @@ class MaterielsControllerTest extends General {
1269 1269 $this->post('/materiels/set-label-is-placed/11/view');
1270 1270 $this->get('/materiels/view/11');
1271 1271  
1272   - $this->assertResponseContains('Etiquette posée </strong></td><td>Oui', "Le placement de l'étiquette sur le materiel ne se fait pas correctement.");
  1272 + $this->assertResponseContains('Etiquette posée</strong></TD> <TD>Oui', "Le placement de l'étiquette sur le materiel ne se fait pas correctement.");
1273 1273 }
1274 1274  
1275 1275 /**
... ... @@ -1283,7 +1283,7 @@ class MaterielsControllerTest extends General {
1283 1283 $this->post('/materiels/set-label-is-not-placed/12/view');
1284 1284 $this->get('/materiels/view/12');
1285 1285  
1286   - $this->assertResponseContains('Etiquette posée </strong></td><td>Non', "L'enlevement de l'étiquette sur le materiel ne se fait pas correctement.");
  1286 + $this->assertResponseContains('Etiquette posée</strong></TD> <TD>Non', "L'enlevement de l'étiquette sur le materiel ne se fait pas correctement.");
1287 1287 }
1288 1288  
1289 1289 /**
... ...