Commit e961ca20013ed2140b0945ae94425883fb928e73

Authored by Etienne Pallier
1 parent e0602ede
Exists in master and in 1 other branch dev

Colorisation matériels & Amélioration technique/inventorié (v3.7.9.56)

- Materiel : technique ou/et inventoriable => trop compliqué et inutile
	=> en fait c’est un OUX (exclusif)
	=> simplifier en ne gardant qu'UNE SEULE case à cocher qui s'appelle
"materiel technique".
	=> Si cette case n'est pas cochée, le prix doit alors être supérieur à
1000E
	=> par contre, on garde quand même le champ ds la BD au cas où.

- Colorisation selon statut du matériel :
		CREATED => bleu
		VALIDATED => vert
		TBA => orange
		ARCHIVED => rouge
README.md
... ... @@ -44,22 +44,19 @@ Logiciel testé et validé sur les configurations suivantes :
44 44  
45 45 VERSION ACTUELLE
46 46  
47   -Date: 03/07/2020
48   -Version: 3.7.9.55
  47 +Date: 07/07/2020
  48 +Version: 3.7.9.56
49 49 Author: EP
50 50 Commentaire:
51   - - Fichier LICENSE (AGPL)
52   - - Conditions d'utilisation à accepter lors de l'installation
53   - - script ./INSTALLATION
54   - - Mode "nolimit" dans la config ("Superadmin a tous les droits", depuis menu Tools)
55   - - Ajout d'un "alias" pour décrire chaque action de chaque controleur
56   -
57   - - Amélioration page /pages/acls
58   - - Tests génériques automatiques pour (presque) toutes les actions de (presque) tous les controleurs principaux (Materiels, Suivis, Emprunts, Users) mais aussi du controleur "quelconque" SurCategories (pour vérifier que ça marche aussi !!!)
59   - - Dans ces tests génériques, on teste non seulement qu'une action s'exécute seulement quand elle y est autorisée, mais aussi qu'elle s'exécute correctement (au moins pour les actions CRUD : add,edit,delete...)
60   - - Le nombre total de tests (en ajoutant ces tests automatiques) monte à 220 !!
61   - - ...
62   -
  51 + - Materiel : technique ou/et inventoriable => trop compliqué et inutile => en fait c’est un OUX (exclusif)
  52 + => simplifier en ne gardant qu'UNE SEULE case à cocher qui s'appelle "materiel technique".
  53 + => Si cette case n'est pas cochée, le prix doit alors être supérieur à 1000E
  54 + => par contre, on garde quand même le champ ds la BD au cas où.
  55 + - Colorisation selon statut du matériel :
  56 + CREATED => bleu
  57 + VALIDATED => vert
  58 + TBA => orange
  59 + ARCHIVED => rouge
63 60  
64 61 IMPORTANT :
65 62 - Pour connaitre la version actuelle, taper "./VERSION"
... ... @@ -97,8 +94,13 @@ La liste ci-dessous est aussi en ligne ici : https://tinyurl.com/labinvent#headi
97 94 -----------------------------------------------------------------------------------------------------------
98 95 VERSION ACTUELLE
99 96  
100   -06/07/2020 v3.7.9.54 (EP)
  97 +06/07/2020 v3.7.9.54-55 (EP)
101 98 - Bugfix test SurCategories : marche maintenant sur php5 et php7
  99 + - Fichier LICENSE (AGPL)
  100 + - Conditions d'utilisation à accepter lors de l'installation
  101 + - script ./INSTALLATION
  102 + - Mode "nolimit" dans la config ("Superadmin a tous les droits", depuis menu Tools)
  103 + - Ajout d'un "alias" pour décrire chaque action de chaque controleur
102 104  
103 105 03/07/2020 v3.7.9.53 (EP)
104 106 - Bugfix Emprunts calcul sur les dates pourri : on utilise maintenant FrozenDate et FrozenTime de cakephp au lieu de DateTime de php
... ...
src/Model/Table/MaterielsTable.php
... ... @@ -293,10 +293,7 @@ class MaterielsTable extends AppTable
293 293 return $validator;
294 294 }
295 295  
296   - public function checkStatus($check)
297   - {
298   - return ($check !== null && in_array($check, $this->ALL_STATUS));
299   - }
  296 + public function checkStatus($check) { return ($check !== null && in_array($check, $this->ALL_STATUS)); }
300 297  
301 298 /**
302 299 * Returns a rules checker object that will be used for validating
... ... @@ -308,15 +305,19 @@ class MaterielsTable extends AppTable
308 305 */
309 306 public function buildRules(RulesChecker $rules)
310 307 {
311   - $configuration = TableRegistry::get('Configurations')->find()
  308 + //$configuration = TableRegistry::get('Configurations')->find()
  309 + /*
  310 + $configuration = TableRegistry::getTableLocator()->get('Configurations')->find()
312 311 ->where([
313 312 'id =' => 1
314 313 ])->first();
315   -
  314 + */
  315 + $this->config = TableRegistry::getTableLocator()->get('Configurations')->get(1);
316 316  
317 317 /*
318 318 * CONTROLE de la cohérence des champs materiel_administratif et materiel_technique
319 319 */
  320 + /*
320 321 $checkAtLeastOneChecked = function ($entity) {
321 322 return ($entity->materiel_administratif || $entity->materiel_technique);
322 323 };
... ... @@ -337,19 +338,24 @@ class MaterielsTable extends AppTable
337 338 ->first();
338 339 return ! ($entity->prix_ht !== null && $entity->prix_ht < $configuration->prix_inventaire_administratif && $entity->materiel_administratif);
339 340 };
  341 + */
340 342 // return if checked as "administratif" price MUST be set
341 343 $checkPriceIfIsAdministratif = function ($entity) {
342   - if ($entity->materiel_administratif)
343   - return ($entity->prix_ht !== null);
  344 + //if ($entity->materiel_administratif)
  345 + if (! $entity->materiel_technique)
  346 + return ($entity->prix_ht >= $this->config->prix_inventaire_administratif); // 1000€ pour l'IRAP
  347 + //return ($entity->prix_ht !== null);
344 348 return true;
345 349 };
  350 + /*
346 351 $rules->add($checkAtLeastOneChecked, [
347 352 'errorField' => 'materiel_administratif',
348 353 'message' => 'Le matériel est obligatoirement inventoriable ou technique.'
349 354 ]);
350 355 $rules->add($checkAtLeastOneChecked, [
351 356 'errorField' => 'materiel_technique',
352   - 'message' => 'Le matériel est obligatoirement inventoriable ou technique.'
  357 + //'message' => 'Le matériel est obligatoirement inventoriable ou technique.'
  358 + 'message' => "Si le matériel n'est pas technique, son prix doit obligatoirement être supérieur à 1000€"
353 359 ]);
354 360 $rules->add($checkIfIsAdministratifWhenShouldBe, [
355 361 'errorField' => 'materiel_administratif',
... ... @@ -359,9 +365,16 @@ class MaterielsTable extends AppTable
359 365 'errorField' => 'materiel_administratif',
360 366 'message' => 'Le matériel vaut moins de ' . $configuration->prix_inventaire_administratif . '€ HT, il n\'est donc pas inventoriable.'
361 367 ]);
  368 + */
362 369 $rules->add($checkPriceIfIsAdministratif, [
363 370 'errorField' => 'prix_ht',
364   - 'message' => 'Le matériel ne peut pas être inventoriable et ne pas avoir de prix'
  371 + //'message' => 'Le matériel ne peut pas être inventoriable et ne pas avoir de prix'
  372 + 'message' => "Si le matériel n'est pas technique, son prix doit obligatoirement être supérieur à 1000€ (inventoriable)"
  373 + ]);
  374 + $rules->add($checkPriceIfIsAdministratif, [
  375 + 'errorField' => 'materiel_technique',
  376 + //'message' => 'Le matériel ne peut pas être inventoriable et ne pas avoir de prix'
  377 + 'message' => "Si le matériel n'est pas technique, son prix doit obligatoirement être supérieur à 1000€ (inventoriable)"
365 378 ]);
366 379  
367 380 $rules->add($rules->isUnique([
... ...
src/Template/Materiels/add_edit.ctp
... ... @@ -451,7 +451,7 @@ if (isset($cpMateriel)) {
451 451  
452 452 // - Technique et/ou Inventoriable ?
453 453 echo $this->Form->control('materiel_technique', [
454   - 'label' => 'Technique',
  454 + 'label' => "Technique (pas pour l'inventaire officiel)",
455 455 // ADD only
456 456 //'default' => $Mat_technique
457 457 'default' => $materiel->materiel_technique,
... ... @@ -459,6 +459,7 @@ if (isset($cpMateriel)) {
459 459 'disabled' => $IS_ADD ? false : $isReadonlyField('materiel_technique', $myReadonlyFields)
460 460 ]);
461 461 echo "\n";
  462 + /*
462 463 echo $this->Form->control('materiel_administratif', [
463 464 'label' => 'Inventoriable (>' . $configuration->prix_inventaire_administratif . '€)',
464 465 // ADD only
... ... @@ -467,6 +468,7 @@ if (isset($cpMateriel)) {
467 468 // EDIT only
468 469 'disabled' => $IS_ADD ? false : $isReadonlyField('materiel_administratif', $myReadonlyFields)
469 470 ]);
  471 + */
470 472  
471 473 // - Metrologie
472 474 //if ($configuration->metrologie == '1') {
... ...
src/Template/Materiels/index.ctp
... ... @@ -21,7 +21,7 @@ $materiels = $materiels;
21 21 $configuration = $configuration;
22 22  
23 23 // Uniquement quand un statut est sélectionné (pour filtrer)
24   -if (isset($SELECTED_STATUS)) $SELECTED_STATUS = $SELECTED_STATUS;
  24 +$SELECTED_STATUS = isset($SELECTED_STATUS) ? $SELECTED_STATUS : null;
25 25  
26 26 // TODO: yena plein d'autres
27 27 // ...
... ... @@ -57,34 +57,33 @@ $displayElement = $displayElement;
57 57 $dateProchainControleVerif = $dateProchainControleVerif;
58 58 $echoActionButton = $echoActionButton;
59 59  
60   -?>
  60 +// @TODO : get from Configurations
  61 +$METRO=false;
61 62  
62 63  
63   -<div class="materiels index col-lg-12 col-md-12 col-sm-12">
64   -<?php echo '<h2><i class="icon-list"></i> Liste des matériels ('.$nbMateriels.')</h2>'; ?>
65 64  
66   -<div class="actions" style="width: 100%; float: none; padding: 0 0;">
67   -<?php
68   -// @TODO : get from Configurations
69   -$METRO=false;
70 65  
71   -/*echo '<p>';
72   -echo $this->Html->link('<i class="icon-plus"></i> Nouveau Matériel', [
73   - 'action' => 'add'
74   -], [
75   - 'title' => 'Ajouter un matériel',
76   - 'escape' => false
77   -]);
78   -echo '</p>';*/
  66 +/*
  67 +<!--
  68 +******************************************************************************
  69 + FONCTIONS D'AFFICHAGE DES DIFFÉRENTES SECTIONS DE LA PAGE WEB
  70 +******************************************************************************
  71 +-->
  72 +*/
79 73  
80   -if ($USER_IS_ADMIN_OR_MORE) {
  74 +$displayStatusButtons = function($SELECTED_STATUS, $nbMateriels, $html) {
  75 + ?>
  76 + <div class="actions" style="width: 100%; float: none; padding: 0 0;">
  77 + <?php
  78 +
81 79 echo '<p>';
82 80 echo "Afficher les matériels : ";
83 81 echo '</br>';
84 82 echo '</br>';
85 83 $b_all = $b_cre = $b_val = $b_toarc = $b_arc = '';
86 84 $SELECTED = '<i class="icon-ok"></i>';
87   - if (isset($SELECTED_STATUS)) {
  85 + //if (isset($SELECTED_STATUS)) {
  86 + if ($SELECTED_STATUS) {
88 87 if ($SELECTED_STATUS == 'CREATED')
89 88 $b_cre = $SELECTED;
90 89 else if ($SELECTED_STATUS == 'VALIDATED')
... ... @@ -93,11 +92,11 @@ if ($USER_IS_ADMIN_OR_MORE) {
93 92 $b_toarc = $SELECTED;
94 93 else if ($SELECTED_STATUS == 'ARCHIVED')
95 94 $b_arc = $SELECTED;
96   - } else
97   - $b_all = $SELECTED;
98   -
  95 + } else $b_all = $SELECTED;
  96 +
99 97 // Affichage des boutons en haut de la page
100   - echo $this->Html->link($b_all . ' Tous', [
  98 + //echo $this->Html->link($b_all . ' Tous', [
  99 + echo $html->link($b_all . ' Tous', [
101 100 'action' => 'index'
102 101 ], [
103 102 'title' => 'Tous',
... ... @@ -105,7 +104,7 @@ if ($USER_IS_ADMIN_OR_MORE) {
105 104 'escape' => false
106 105 ]);
107 106  
108   - echo $this->Html->link($b_cre . ' A valider', [
  107 + echo $html->link($b_cre . ' A valider', [
109 108 'action' => 'index',
110 109 'CREATED'
111 110 ], [
... ... @@ -114,7 +113,7 @@ if ($USER_IS_ADMIN_OR_MORE) {
114 113 'escape' => false
115 114 ]);
116 115  
117   - echo $this->Html->link($b_val . ' Validés', [
  116 + echo $html->link($b_val . ' Validés', [
118 117 'action' => 'index',
119 118 'VALIDATED'
120 119 ], [
... ... @@ -123,7 +122,7 @@ if ($USER_IS_ADMIN_OR_MORE) {
123 122 'escape' => false
124 123 ]);
125 124  
126   - echo $this->Html->link($b_toarc . ' A sortir', [
  125 + echo $html->link($b_toarc . ' A sortir', [
127 126 'action' => 'index',
128 127 'TOBEARCHIVED'
129 128 ], [
... ... @@ -132,7 +131,7 @@ if ($USER_IS_ADMIN_OR_MORE) {
132 131 'escape' => false
133 132 ]);
134 133  
135   - echo $this->Html->link($b_arc . ' Archivés', [
  134 + echo $html->link($b_arc . ' Archivés', [
136 135 'action' => 'index',
137 136 'ARCHIVED'
138 137 ], [
... ... @@ -145,58 +144,320 @@ if ($USER_IS_ADMIN_OR_MORE) {
145 144  
146 145 // ACTIONS : buttons "Tout selectionner", "Tout decocher"
147 146 // - show only with "A valider" and "A sortir"
148   - if (isset($SELECTED_STATUS) && $nbMateriels != 0) {
149   - echo $this->Html->link('<i class="icon-check"></i> Tout cocher', '#all', [
  147 + if ($SELECTED_STATUS && $nbMateriels>0) {
  148 + echo $html->link('<i class="icon-check"></i> Tout cocher', '#all', [
150 149 'onclick' => 'selectAll()',
151 150 'title' => 'Sélectionner tout les matériels',
152 151 'style' => ': 400px; margin-right: 50px',
153 152 'escape' => false
154 153 ]);
155   - echo $this->Html->link('<i class="icon-check-empty"></i> Tout décocher', '#none', [
  154 + echo $html->link('<i class="icon-check-empty"></i> Tout décocher', '#none', [
156 155 'onclick' => 'selectNone()',
157 156 'title' => 'Sélectionner aucun matériel',
158 157 'style' => 'margin-right: 50px',
159 158 'escape' => false
160 159 ]);
161 160 }
162   -}
  161 +
  162 + echo "</div>";
  163 +
  164 +}; // displayStatusButtons()
  165 +
  166 +
  167 +$displayNbLinesSelector = function($form, $request) {
  168 + echo '<div class="col-lg-2 col-md-3 col-sm-4">';
  169 + //echo $this->Form->create('materiels', [
  170 + echo $form->create('materiels', [
  171 + //'url' => '/materiels/execActions?page=' . $this->request->getQuery('page')
  172 + 'url' => '/materiels/execActions?page=' . $request->getQuery('page')
  173 + ]);
  174 + // echo $this->Form->create('materiels', ['url' => '/materiels/execActions?page=index']);
  175 + //echo $this->Form->control('aff_par_defaut', [
  176 + echo $form->control('aff_par_defaut', [
  177 + 'label' => 'Afficher',
  178 + 'options' => [
  179 + '20' => 20,
  180 + '30' => 30,
  181 + '50' => 50,
  182 + '100' => 100,
  183 + '150' => 150,
  184 + '200' => 200
  185 + ]
  186 + ]);
  187 + echo '</div>';
  188 +}; // displayNbLinesSelector()
  189 +
  190 +
  191 +$displayActionButtonsForSelectedOrAllElements = function($form, $SELECTED_STATUS, $USER_IS_RESPONSABLE, $USER_IS_ADMIN_OR_MORE, $USER_IS_SUPERADMIN) {
  192 +
  193 + //if (isset($SELECTED_STATUS)) {
  194 + if ($SELECTED_STATUS) {
  195 + switch ($SELECTED_STATUS) {
  196 + case 'CREATED':
  197 + $action = 'Valider les';
  198 + break;
  199 + case 'VALIDATED':
  200 + $action = "Demander l'archivage des";
  201 + break;
  202 + case 'TOBEARCHIVED':
  203 + $action = "Sortir les";
  204 + break;
  205 + }
  206 +
  207 + if ($SELECTED_STATUS != 'ARCHIVED') {
  208 + //if (! ($role == 'Super Administrateur' && $SELECTED_STATUS == 'TOBEARCHIVED')) {
  209 + if (! ($USER_IS_SUPERADMIN && $SELECTED_STATUS=='TOBEARCHIVED') ) {
  210 + //echo $this->Form->submit($action . ' matériels cochés', [
  211 + // 'name' => 'updateSelectedStatus',
  212 + // 'id' => 'updateSelectedStatus',
  213 + // 'style' => 'margin: 0px'
  214 + //]);
  215 + //echo $this->Form->button($action . ' matériels cochés', [ 'class'=>'btn btn-outline-success', 'type'=>'submit', 'name' => 'updateSelectedStatus', 'id' => 'updateSelectedStatus', 'style' => 'margin: 0px']);
  216 + echo $form->button($action . ' matériels cochés', [ 'class'=>'btn btn-outline-success', 'type'=>'submit', 'name' => 'updateSelectedStatus', 'id' => 'updateSelectedStatus', 'style' => 'margin: 0px']);
  217 + echo "<br /><br />";
  218 + }
  219 + }
  220 + //echo $this->Form->submit('Exporter la liste des matériels cochés', [
  221 + // 'name' => 'export',
  222 + // 'id' => 'export',
  223 + // 'style' => 'margin: 0px;'
  224 + //]);
  225 + echo $form->button('Exporter la liste des matériels cochés', ['class'=>'btn btn-outline-success', 'type'=>'submit', 'name' => 'export', 'id' => 'export', 'style' => 'margin: 0px;' ]);
  226 + echo "<br /><br />";
  227 + }
  228 +
  229 + if ($USER_IS_ADMIN_OR_MORE || $USER_IS_RESPONSABLE)
  230 + //echo $this->Form->submit('Exporter la liste complete', [
  231 + // 'name' => 'exportAll',
  232 + // 'id' => 'exportAll',
  233 + // 'style' => 'margin: 0px;'
  234 + //]);
  235 + echo $form->button('Exporter la liste complete', ['class'=>'btn btn-outline-success', 'type'=>'submit', 'name' => 'exportAll', 'id' => 'exportAll', 'style' => 'margin: 0px;']);
  236 +
  237 +};
  238 +
  239 +
  240 +/*
  241 + * Couleurs en fonction du statut du matos
  242 + *
  243 + */
  244 +$displayColorLegend = function() {
  245 + // CREATED => bleu
  246 + // VALIDATED => vert
  247 + // TBA => orange
  248 + // ARCHIVED => rouge
  249 + echo "<p><i><b><u>Couleur</u> :</b> bleu=créé ; vert=validé ; orange=à sortir ; rouge=archivé (couleur date rouge = fin garantie)</i></p>";
  250 +};
  251 +
  252 +
  253 +
  254 +$displayActionButtonsForMateriel = function($materiel, $username, $USER_IS_RESPONSABLE, $USER_IS_ADMIN_OR_MORE, $USER_IS_SUPERADMIN, $controller, $html) {
  255 +
  256 + // TODO: Dans l'idéal, ces variables doivent etre définies par le controleur et passées à la vue
  257 + // (sous forme d'un tableau contenant ces droits pour CHAQUE materiel)
  258 + // Car la vue doit être la moins "intelligente" possible, la plus simple possible
  259 + $IS_CREATED = ($materiel->status == 'CREATED');
  260 + $IS_VALIDATED = ($materiel->status == 'VALIDATED');
  261 + $IS_TOBEARCHIVED = ($materiel->status == 'TOBEARCHIVED');
  262 + $IS_ARCHIVED = ($materiel->status == 'ARCHIVED');
  263 + /*
  264 + * Couleurs en fonction du statut du matos
  265 + *
  266 + */
  267 + // CREATED => bleu
  268 + if ($IS_CREATED) $color = 'blue';
  269 + // VALIDATED => vert
  270 + if ($IS_VALIDATED) $color = 'green';
  271 + // TBA => orange
  272 + if ($IS_TOBEARCHIVED) $color = 'orange';
  273 + // ARCHIVED => rouge
  274 + if ($IS_ARCHIVED) $color = 'red';
  275 + $color = "style='color: $color'";
  276 +
  277 + $USER_IS_CREATOR_OR_OWNER = in_array($username, [$materiel->nom_createur, $materiel->nom_responsable]);
  278 + $USER_IS_SAME_GROUP_AS_MATERIEL = (
  279 + ( isset($priviledgedUser->groupes_metier_id) && $priviledgedUser->groupes_metier_id!=$idGmNa && $materiel->groupes_metier_id==$priviledgedUser->groupes_metier_id )
  280 + ||
  281 + ( isset($priviledgedUser->groupes_thematique_id) && $priviledgedUser->groupes_thematique_id!=$idGtNa && $materiel->groupes_thematique_id==$priviledgedUser->groupes_thematique_id )
  282 + );
  283 + $USER_IS_RESPONSABLE_AND_SAME_GROUP_AS_MATERIEL = $USER_IS_RESPONSABLE && $USER_IS_SAME_GROUP_AS_MATERIEL;
  284 + $CONTEXT1 = $USER_IS_ADMIN_OR_MORE || $USER_IS_CREATOR_OR_OWNER || $USER_IS_RESPONSABLE_AND_SAME_GROUP_AS_MATERIEL;
  285 +
  286 + // Détermination des autorisations pour tous les boutons "éditer", "supprimer", "valider", ...
  287 + $id = $materiel->id;
  288 +
  289 + $CAN_EDIT = $controller->isAuthorizedAction('edit', $id);
  290 + //$CAN_EDIT = $IS_CREATED && ($USER_IS_ADMIN_OR_MORE || $USER_IS_CREATOR_OR_OWNER || $USER_IS_RESPONSABLE_AND_SAME_GROUP_AS_MATERIEL);
  291 + //$CAN_EDIT = $IS_CREATED && ($USER_IS_ADMIN_OR_MORE || $USER_IS_UTILISATEUR_AND_CREATOR_OR_OWNER || $USER_IS_RESPONSABLE_AND_SAME_GROUP_AS_MATERIEL || $USER_IS_RESPONSABLE_AND_CREATOR_OR_OWNER);
  292 +
  293 + $CAN_DELETE = $controller->isAuthorizedAction('delete', $id);
  294 + //$CAN_DELETE = $CAN_EDIT;
  295 +
  296 + /*
  297 + $CAN_VALIDATE_OR_INVALIDATE = $USER_IS_ADMIN_OR_MORE || ( ($materiel->materiel_administratif == 0) && $USER_IS_RESPONSABLE && $USER_IS_SAME_GROUP_AS_MATERIEL );
  298 + $CAN_VALIDATE = $IS_CREATED && $CAN_VALIDATE_OR_INVALIDATE;
  299 + $CAN_INVALIDATE = !$IS_CREATED && $CAN_VALIDATE_OR_INVALIDATE;
  300 + $CAN_TBA = $IS_VALIDATED && ($USER_IS_ADMIN_OR_MORE || $USER_IS_CREATOR_OR_OWNER || ($USER_IS_RESPONSABLE && $USER_IS_SAME_GROUP_AS_MATERIEL));
  301 + $CAN_ARCHIVE = $IS_TOBEARCHIVED && $CAN_VALIDATE_OR_INVALIDATE;
  302 + */
  303 + $CAN_INVALIDATE = $controller->isAuthorizedAction('statusCreated', $id);
  304 + $CAN_VALIDATE = $controller->isAuthorizedAction('statusValidated', $id);
  305 + $CAN_TBA = $controller->isAuthorizedAction('statusTobearchived', $id);
  306 + $CAN_ARCHIVE = $controller->isAuthorizedAction('statusArchived', $id);
  307 +
  308 + echo '<td class="actions" style="padding: 6px 0; text-align: left;">';
  309 +
  310 + // 1) EDIT icon
  311 + /*
  312 + if (
  313 + in_array($materiel->status, [
  314 + 'CREATED',
  315 + // (EP 17/5/19) ben non, on peut pas si c'est validé !!!
  316 + //'VALIDATED'
  317 + ])
  318 + &&
  319 + (
  320 + $USER_IS_ADMIN_OR_MORE
  321 + ||
  322 + $USER_IS_CREATOR_OR_OWNER
  323 + ||
  324 + ($USER_IS_RESPONSABLE && $USER_IS_SAME_GROUP_AS_MATERIEL)
  325 + )
  326 + )
  327 + */
  328 + if ($CAN_EDIT) echo $html->link(__('<i class="icon-pencil"></i>'), ['action' => 'edit', $materiel->id], ['title' => 'Editer', 'style' => 'margin: 0 2px', 'escape' => false ]);
  329 +
  330 + // 2) VALIDER/TBA/ARCHIVER icon
  331 + /*
  332 + if (
  333 + $USER_IS_ADMIN
  334 + ||
  335 + ($USER_IS_RESPONSABLE && $USER_IS_SAME_GROUP_AS_MATERIEL)
  336 + ) {
  337 + */
  338 + //if ($materiel->status=='CREATED' && !$USER_IS_RESPONSABLE) {
  339 + if ($CAN_VALIDATE)
  340 + echo $html->link('<i class="icon-ok-sign"></i>', [
  341 + 'action' => 'statusValidated',
  342 + $materiel->id
  343 + ],
  344 + [
  345 + 'title' => 'Valider',
  346 + 'style' => 'margin: 0 2px',
  347 + 'escape' => false,
  348 + 'confirm' => 'Êtes-vous sur de vouloir valider ' . $materiel->designation . ' ?'
  349 + ]
  350 + );
  351 + //else if (h($materiel->status) == 'VALIDATED') {
  352 + if ($CAN_TBA)
  353 + echo $html->link('<i class="icon-inbox"></i>', [
  354 + 'action' => 'statusTobearchived',
  355 + $materiel->id
  356 + ],
  357 + [
  358 + 'title' => 'Demander la sortie de l\'inventaire',
  359 + 'style' => 'margin: 0 2px',
  360 + 'escape' => false,
  361 + 'confirm' => 'Êtes-vous sur de vouloir faire une demande d\'archive ' . $materiel->designation . ' ?'
  362 + ]
  363 + );
  364 + //else if ($materiel->status=='TOBEARCHIVED' && !$USER_IS_RESPONSABLE)
  365 + if ($CAN_ARCHIVE)
  366 + echo $html->link('<i class="icon-inbox"></i>', [
  367 + 'action' => 'statusArchived',
  368 + $materiel->id
  369 + ],
  370 + [
  371 + 'title' => 'Sortir de l\'inventaire',
  372 + 'style' => 'margin: 0 2px',
  373 + 'escape' => false,
  374 + 'confirm' => 'Êtes-vous sur de vouloir archiver ' . $materiel->designation . ' ?'
  375 + ]
  376 + );
  377 +
  378 + // 3) DELETE icon
  379 + /*
  380 + if (h($materiel->status) == 'CREATED') {
  381 + if (
  382 + $USER_IS_ADMIN_OR_MORE
  383 + ||
  384 + $USER_IS_CREATOR_OR_OWNER
  385 + ||
  386 + ($USER_IS_RESPONSABLE && $USER_IS_SAME_GROUP_AS_MATERIEL)
  387 + )
  388 + */
  389 + if ($CAN_DELETE)
  390 + echo $html->link(__('<i class="icon-trash"></i>'), [
  391 + 'action' => 'delete',
  392 + $materiel->id
  393 + ],
  394 + [
  395 + 'title' => 'Supprimer',
  396 + 'style' => 'margin: 0 2px',
  397 + 'escape' => false,
  398 + 'confirm' => __('Êtes-vous sur de vouloir supprimer {0} ?', $materiel->designation)
  399 + ]
  400 + );
  401 +
  402 + echo "</td>";
  403 +
  404 + return $color;
  405 +
  406 +}; // displayActionButtonsForMateriel
  407 +
163 408 ?>
164   -</div>
165 409  
166   -<div class="col-lg-2 col-md-3 col-sm-4">
  410 +
  411 +
  412 +
  413 +
  414 +
  415 +<!--
  416 +******************************************************************************
  417 + PAGE WEB HTML
  418 +******************************************************************************
  419 +-->
  420 +
  421 +<div class="materiels index col-lg-12 col-md-12 col-sm-12">
  422 +
  423 +
  424 +<!-- TITRE -->
  425 +<?php echo '<h2><i class="icon-list"></i> Liste des matériels ('.$nbMateriels.')</h2>'; ?>
  426 +
  427 +<!-- BOUTONS STATUT (admin+ only)
  428 +<div class="actions" style="width: 100%; float: none; padding: 0 0;">
  429 +-->
167 430 <?php
168   -echo $this->Form->create('materiels', [
169   - 'url' => '/materiels/execActions?page=' . $this->request->getQuery('page')
170   -]);
171   -// echo $this->Form->create('materiels', ['url' => '/materiels/execActions?page=index']);
172   -//echo $this->Form->control('aff_par_defaut', [
173   -echo $this->Form->control('aff_par_defaut', [
174   - 'label' => 'Afficher',
175   - 'options' => [
176   - '20' => 20,
177   - '30' => 30,
178   - '50' => 50,
179   - '100' => 100,
180   - '150' => 150,
181   - '200' => 200
182   - ]
  431 +/*echo '<p>';
  432 +echo $this->Html->link('<i class="icon-plus"></i> Nouveau Matériel', [
  433 + 'action' => 'add'
  434 +], [
  435 + 'title' => 'Ajouter un matériel',
  436 + 'escape' => false
183 437 ]);
184   -?>
185   -</div>
  438 +echo '</p>';*/
  439 +if ($USER_IS_ADMIN_OR_MORE) $displayStatusButtons($SELECTED_STATUS, $nbMateriels, $this->Html);
  440 +//</div>
186 441  
187   -<?php
188   -if ($nbMateriels > 0) {
  442 +
  443 +// <!-- SELECTEUR NOMBRE LIGNES PAR PAGE -->
  444 +$displayNbLinesSelector($this->Form, $this->request);
  445 +
  446 +// <!-- AFFICHAGE DES MATERIELS -->
  447 +if ($nbMateriels == 0)
  448 + echo 'Aucun matériel';
  449 +
  450 +else {
189 451 // $form2 = $this->Form;
190 452 // /echo $this->Form->create('materiels', ['url' => '/materiels/execActions']);
191   - if (isset($SELECTED_STATUS))
192   - echo $this->Form->hidden('what', [
193   - 'value' => $SELECTED_STATUS
194   - ]);
  453 + if ($SELECTED_STATUS) echo $this->Form->hidden('what', [
  454 + 'value' => $SELECTED_STATUS
  455 + ]);
195 456 ?>
196 457 <table style="border-collapse: separate; border-spacing: 0;">
197 458 <thead>
198 459 <tr>
199   - <?php if (isset($SELECTED_STATUS)) { echo '<th></th>'; }?>
  460 + <?php if ($SELECTED_STATUS) { echo '<th></th>'; }?>
200 461 <th class="actions"><?= __('') ?></th>
201 462 <th><?= $this->Paginator->sort('designation','Désignation') ?></th>
202 463 <th><?= $this->Paginator->sort('numero_laboratoire', 'N° interne (labo)') ?></th>
... ... @@ -217,171 +478,45 @@ if ($nbMateriels &gt; 0) {
217 478 // Pour changer la couleur du nom du matos si la garantie est passée
218 479 $time = Time::now(); // On récupère la date et l'heure actuelles
219 480 $today = new date("$time->year-$time->month-$time->day"); // On extrait la date pour la vérification de fin de garantie
220   - $today = $today->format('Ydm'); // On formatte la date initialement en 31-12-2000 (par exemple) en un format qui pourra etre comparé : 20001231
  481 + //$today = $today->format('Ydm'); // On formatte la date initialement en 31-12-2000 (par exemple) en un format qui pourra etre comparé : 20001231
  482 + $today = $today->format('Ymd'); // On formatte la date initialement en 31-12-2000 (par exemple) en un format qui pourra etre comparé : 20001231
221 483  
222 484 // BOUCLE SUR CHAQUE MATERIEL, ligne par ligne
223 485 //$mc = new MaterielsController();
224 486 foreach ($materiels as $materiel) :
225 487  
226   - // TODO: Dans l'idéal, ces variables doivent etre définies par le controleur et passées à la vue
227   - // (sous forme d'un tableau contenant ces droits pour CHAQUE materiel)
228   - // Car la vue doit être la moins "intelligente" possible, la plus simple possible
229   - $IS_CREATED = ($materiel->status == 'CREATED');
230   - $IS_VALIDATED = ($materiel->status == 'VALIDATED');
231   - $IS_TOBEARCHIVED = ($materiel->status == 'TOBEARCHIVED');
232   - $IS_ARCHIVED = ($materiel->status == 'ARCHIVED');
233   - $USER_IS_CREATOR_OR_OWNER = in_array($username, [$materiel->nom_createur, $materiel->nom_responsable]);
234   - $USER_IS_SAME_GROUP_AS_MATERIEL = (
235   - ( isset($priviledgedUser->groupes_metier_id) && $priviledgedUser->groupes_metier_id!=$idGmNa && $materiel->groupes_metier_id==$priviledgedUser->groupes_metier_id )
236   - ||
237   - ( isset($priviledgedUser->groupes_thematique_id) && $priviledgedUser->groupes_thematique_id!=$idGtNa && $materiel->groupes_thematique_id==$priviledgedUser->groupes_thematique_id )
238   - );
239   - $USER_IS_RESPONSABLE_AND_SAME_GROUP_AS_MATERIEL = $USER_IS_RESPONSABLE && $USER_IS_SAME_GROUP_AS_MATERIEL;
240   - $CONTEXT1 = $USER_IS_ADMIN_OR_MORE || $USER_IS_CREATOR_OR_OWNER || $USER_IS_RESPONSABLE_AND_SAME_GROUP_AS_MATERIEL;
241   -
242   - // Détermination des autorisations pour tous les boutons "éditer", "supprimer", "valider", ...
243   - $id = $materiel->id;
244   -
245   - $CAN_EDIT = $controller->isAuthorizedAction('edit', $id);
246   - //$CAN_EDIT = $IS_CREATED && ($USER_IS_ADMIN_OR_MORE || $USER_IS_CREATOR_OR_OWNER || $USER_IS_RESPONSABLE_AND_SAME_GROUP_AS_MATERIEL);
247   - //$CAN_EDIT = $IS_CREATED && ($USER_IS_ADMIN_OR_MORE || $USER_IS_UTILISATEUR_AND_CREATOR_OR_OWNER || $USER_IS_RESPONSABLE_AND_SAME_GROUP_AS_MATERIEL || $USER_IS_RESPONSABLE_AND_CREATOR_OR_OWNER);
248   -
249   - $CAN_DELETE = $controller->isAuthorizedAction('delete', $id);
250   - //$CAN_DELETE = $CAN_EDIT;
251   -
252   - /*
253   - $CAN_VALIDATE_OR_INVALIDATE = $USER_IS_ADMIN_OR_MORE || ( ($materiel->materiel_administratif == 0) && $USER_IS_RESPONSABLE && $USER_IS_SAME_GROUP_AS_MATERIEL );
254   - $CAN_VALIDATE = $IS_CREATED && $CAN_VALIDATE_OR_INVALIDATE;
255   - $CAN_INVALIDATE = !$IS_CREATED && $CAN_VALIDATE_OR_INVALIDATE;
256   - $CAN_TBA = $IS_VALIDATED && ($USER_IS_ADMIN_OR_MORE || $USER_IS_CREATOR_OR_OWNER || ($USER_IS_RESPONSABLE && $USER_IS_SAME_GROUP_AS_MATERIEL));
257   - $CAN_ARCHIVE = $IS_TOBEARCHIVED && $CAN_VALIDATE_OR_INVALIDATE;
258   - */
259   - $CAN_INVALIDATE = $controller->isAuthorizedAction('statusCreated', $id);
260   - $CAN_VALIDATE = $controller->isAuthorizedAction('statusValidated', $id);
261   - $CAN_TBA = $controller->isAuthorizedAction('statusTobearchived', $id);
262   - $CAN_ARCHIVE = $controller->isAuthorizedAction('statusArchived', $id);
263   -
264 488 // Date fin garantie ?
265   -
  489 + $date_color = '';
266 490 if ($materiel->date_fin_garantie !== NULL) {
  491 + //debug("today $today");
267 492 $timeFin = new time($materiel->date_fin_garantie);
268 493 $dateFin = new date("$timeFin->year-$timeFin->month-$timeFin->day");
269   - $dateFin = $dateFin->format('Ydm');
  494 + //$dateFin = $dateFin->format('Ydm');
  495 + $dateFin = $dateFin->format('Ymd');
  496 + //debug("datefin $dateFin");
  497 + if ($today>=$dateFin) $date_color = 'style="color: #FF0000"';
  498 + //debug("couleur $date_color");
270 499 }
271   - if ($materiel->date_fin_garantie !== NULL)
272   - $styleLien = ($today >= $dateFin) ? 'style="color: #FF0000"' : '';
273   - else
274   - $styleLien = '';
275 500 ?>
276   -
277   - <tr>
  501 +
  502 + <tr>
278 503 <?php
  504 + //<tr style="color:<?=$color>;">
279 505  
280 506 // (1) COLONNE SELECTION (checkbox)
281   - if (isset($SELECTED_STATUS)) {
  507 + if ($SELECTED_STATUS) {
282 508 echo '<td class="smallText">' . $this->Form->checkbox($materiel->id, [
283 509 'style' => 'margin: 3px',
284 510 'id' => $materiel->id
285 511 ]) . '</td>';
286 512 }
287   - ?>
288   -
289   - <!-- (2) COLONNE ACTIONS (Edit, Delete, Validate, TBA, Archive) -->
290   - <td class="actions"
291   - style="padding: 6px 0; text-align: left;">
292   - <?php
293   -
294   - // 1) EDIT icon
295   - /*
296   - if (
297   - in_array($materiel->status, [
298   - 'CREATED',
299   - // (EP 17/5/19) ben non, on peut pas si c'est validé !!!
300   - //'VALIDATED'
301   - ])
302   - &&
303   - (
304   - $USER_IS_ADMIN_OR_MORE
305   - ||
306   - $USER_IS_CREATOR_OR_OWNER
307   - ||
308   - ($USER_IS_RESPONSABLE && $USER_IS_SAME_GROUP_AS_MATERIEL)
309   - )
310   - )
311   - */
312   - if ($CAN_EDIT) echo $this->Html->link(__('<i class="icon-pencil"></i>'), ['action' => 'edit', $materiel->id], ['title' => 'Editer', 'style' => 'margin: 0 2px', 'escape' => false ]);
313   -
314   - // 2) VALIDER/TBA/ARCHIVER icon
315   - /*
316   - if (
317   - $USER_IS_ADMIN
318   - ||
319   - ($USER_IS_RESPONSABLE && $USER_IS_SAME_GROUP_AS_MATERIEL)
320   - ) {
321   - */
322   - //if ($materiel->status=='CREATED' && !$USER_IS_RESPONSABLE) {
323   - if ($CAN_VALIDATE)
324   - echo $this->Html->link('<i class="icon-ok-sign"></i>', [
325   - 'action' => 'statusValidated',
326   - $materiel->id
327   - ], [
328   - 'title' => 'Valider',
329   - 'style' => 'margin: 0 2px',
330   - 'escape' => false,
331   - 'confirm' => 'Êtes-vous sur de vouloir valider ' . $materiel->designation . ' ?'
332   - ]);
333   -
334   - //else if (h($materiel->status) == 'VALIDATED') {
335   - if ($CAN_TBA)
336   - echo $this->Html->link('<i class="icon-inbox"></i>', [
337   - 'action' => 'statusTobearchived',
338   - $materiel->id
339   - ], [
340   - 'title' => 'Demander la sortie de l\'inventaire',
341   - 'style' => 'margin: 0 2px',
342   - 'escape' => false,
343   - 'confirm' => 'Êtes-vous sur de vouloir faire une demande d\'archive ' . $materiel->designation . ' ?'
344   - ]);
345   -
346   - //else if ($materiel->status=='TOBEARCHIVED' && !$USER_IS_RESPONSABLE)
347   - if ($CAN_ARCHIVE)
348   - echo $this->Html->link('<i class="icon-inbox"></i>', [
349   - 'action' => 'statusArchived',
350   - $materiel->id
351   - ], [
352   - 'title' => 'Sortir de l\'inventaire',
353   - 'style' => 'margin: 0 2px',
354   - 'escape' => false,
355   - 'confirm' => 'Êtes-vous sur de vouloir archiver ' . $materiel->designation . ' ?'
356   - ]);
357   -
358   - // 3) DELETE icon
359   - /*
360   - if (h($materiel->status) == 'CREATED') {
361   - if (
362   - $USER_IS_ADMIN_OR_MORE
363   - ||
364   - $USER_IS_CREATOR_OR_OWNER
365   - ||
366   - ($USER_IS_RESPONSABLE && $USER_IS_SAME_GROUP_AS_MATERIEL)
367   - )
368   - */
369   - if ($CAN_DELETE)
370   - echo $this->Html->link(__('<i class="icon-trash"></i>'), [
371   - 'action' => 'delete',
372   - $materiel->id
373   - ], [
374   - 'title' => 'Supprimer',
375   - 'style' => 'margin: 0 2px',
376   - 'escape' => false,
377   - 'confirm' => __('Êtes-vous sur de vouloir supprimer {0} ?', $materiel->designation)
378   - ]);
379 513  
  514 + // <!-- (2) COLONNE ACTIONS (Edit, Delete, Validate, TBA, Archive) -->
  515 + $color = $displayActionButtonsForMateriel($materiel, $username, $USER_IS_RESPONSABLE, $USER_IS_ADMIN_OR_MORE, $USER_IS_SUPERADMIN, $controller, $this->Html);
380 516 ?>
381   - </td>
382   -
  517 +
383 518 <!-- (3) LES AUTRES COLONNES (DATA : designation, num labo, hs, categ, ...) -->
384   - <td class="smallText"><?= $materiel->has('designation') ? $this->Html->link($materiel->designation, ['controller' => 'Materiels', 'action' => 'view', $materiel->id],[$styleLien]) : '' ?></td>
  519 + <td class="smallText"><?= $materiel->has('designation') ? $this->Html->link($materiel->designation, ['controller' => 'Materiels', 'action' => 'view', $materiel->id],[$color]) : '' ?></td>
385 520 <td class="smallText"><?= h($materiel->numero_laboratoire) ?></td>
386 521 <td class="smallText" style="color: red"><strong><?= ($materiel->hors_service) ? 'HS' : '' ?></strong></td>
387 522 <td class="smallText"><?= $materiel->has('category') ? h($materiel->category->nom) : '' ?></td>
... ... @@ -409,21 +544,21 @@ if ($nbMateriels &gt; 0) {
409 544 break;
410 545 }
411 546 ?>
412   - <td class="smallText"><?= $statut ?></td>
  547 + <td class="smallText" <?=$color?>><?= $statut ?></td>
413 548  
414 549  
415 550 <!--
416 551 // (5) COLONNES Date acquisition et Etiquette posée
417 552 -->
418   - <td class="smallText"><?= h($materiel->date_acquisition) ?></td>
419   - <td class="smallText"><?= h($materiel->etiquette)=='1' ? 'Y':'N' ?></td>
  553 + <td class="smallText" <?=$date_color?>><?= h($materiel->date_acquisition) ?></td>
  554 + <td class="smallText"><?= h($materiel->etiquette)=='1' ? 'Y':'N' ?></td>
420 555  
421 556 <!--
422 557 // (6) COLONNE METRO o/n
423 558 -->
424   - <?php if ($METRO)
425   - echo '<td class="smallText">'. (h($materiel->metrologie)=='1' ? 'Y':'N').'</td>';
426   - ?>
  559 + <?php if ($METRO)
  560 + echo '<td class="smallText">'. (h($materiel->metrologie)=='1' ? 'Y':'N').'</td>';
  561 + ?>
427 562  
428 563 </tr>
429 564 <?php endforeach; ?>
... ... @@ -431,56 +566,17 @@ if ($nbMateriels &gt; 0) {
431 566 </table>
432 567  
433 568 <?php
434   - if (isset($SELECTED_STATUS)) {
435   - switch ($SELECTED_STATUS) {
436   - case 'CREATED':
437   - $action = 'Valider les';
438   - break;
439   - case 'VALIDATED':
440   - $action = "Demander l'archivage des";
441   - break;
442   - case 'TOBEARCHIVED':
443   - $action = "Sortir les";
444   - break;
445   - }
446   -
447   - if ($SELECTED_STATUS != 'ARCHIVED') {
448   - //if (! ($role == 'Super Administrateur' && $SELECTED_STATUS == 'TOBEARCHIVED')) {
449   - if (! ($USER_IS_SUPERADMIN && $SELECTED_STATUS=='TOBEARCHIVED') ) {
450   - //echo $this->Form->submit($action . ' matériels cochés', [
451   - // 'name' => 'updateSelectedStatus',
452   - // 'id' => 'updateSelectedStatus',
453   - // 'style' => 'margin: 0px'
454   - //]);
455   - echo $this->Form->button($action . ' matériels cochés', [ 'class'=>'btn btn-outline-success', 'type'=>'submit', 'name' => 'updateSelectedStatus', 'id' => 'updateSelectedStatus', 'style' => 'margin: 0px']);
456   - echo "<br /><br />";
457   - }
458   - }
459   - //echo $this->Form->submit('Exporter la liste des matériels cochés', [
460   - // 'name' => 'export',
461   - // 'id' => 'export',
462   - // 'style' => 'margin: 0px;'
463   - //]);
464   - echo $this->Form->button('Exporter la liste des matériels cochés', ['class'=>'btn btn-outline-success', 'type'=>'submit', 'name' => 'export', 'id' => 'export', 'style' => 'margin: 0px;' ]);
465   - echo "<br /><br />";
466   - }
467 569  
468   - if ($USER_IS_ADMIN_OR_MORE || $USER_IS_RESPONSABLE)
469   - //echo $this->Form->submit('Exporter la liste complete', [
470   - // 'name' => 'exportAll',
471   - // 'id' => 'exportAll',
472   - // 'style' => 'margin: 0px;'
473   - //]);
474   - echo $this->Form->button('Exporter la liste complete', ['class'=>'btn btn-outline-success', 'type'=>'submit', 'name' => 'exportAll', 'id' => 'exportAll', 'style' => 'margin: 0px;']);
475   -
  570 + $displayColorLegend();
  571 +
  572 + $displayActionButtonsForSelectedOrAllElements($this->Form, $SELECTED_STATUS, $USER_IS_RESPONSABLE, $USER_IS_ADMIN_OR_MORE, $USER_IS_SUPERADMIN);
  573 +
476 574 echo $this->element('pagination_with_first_and_last');
477 575  
478 576 $this->Form->end();
479   -}
  577 +
  578 +} // (nbMateriels>0)
480 579  
481   -else {
482   - echo 'Aucun matériel';
483   -}
484 580 ?>
485 581 </div>
486 582  
... ... @@ -497,6 +593,20 @@ echo $this-&gt;element(&#39;menu_index&#39;, [
497 593 </div>
498 594 -->
499 595  
  596 +
  597 +
  598 +
  599 +
  600 +
  601 +
  602 +
  603 +
  604 +<!--
  605 +******************************************************************************
  606 + JAVASCRIPT
  607 +******************************************************************************
  608 +-->
  609 +
500 610 <script type="text/javascript">
501 611  
502 612 // Pour changer l'url lorsque le nombre d'éléments souhaités est modifié
... ...