Commit 6f74ba5c0e86df4b80bed2ef70f55f07bdc88c3f

Authored by Alexandre
1 parent f4e6dc02

Version: 2.5.3.0

ajout "administrer" form materiels + index "mes materiels"

Demande (terminé) : https://projects.irap.omp.eu/issues/3906
					https://projects.irap.omp.eu/issues/3916
	   
Version majeure en cours (2.5): https://projects.irap.omp.eu/versions/99

ROADMAP: https://projects.irap.omp.eu/projects/labinvent/roadmap
README-LABINVENT.md
... ... @@ -51,13 +51,12 @@ Logiciel testé et validé sur les configurations suivantes :
51 51 VERSION ACTUELLE
52 52  
53 53 Date: 29/06/2016
54   -Version: 2.5.2.0
  54 +Version: 2.5.3.0
55 55  
56   -envoi mail ajout document + bugfixes + edition details doc + acl documents + pb saut de ligne champ "text
  56 +ajout "administrer" form materiels + index "mes materiels"
57 57  
58   -Demande (terminé) : https://projects.irap.omp.eu/issues/3913
59   - https://projects.irap.omp.eu/issues/3716
60   - https://projects.irap.omp.eu/issues/3912
  58 +Demande (terminé) : https://projects.irap.omp.eu/issues/3906
  59 + https://projects.irap.omp.eu/issues/3916
61 60  
62 61 Version majeure en cours (2.5): https://projects.irap.omp.eu/versions/99
63 62  
... ...
src/Controller/MaterielsController.php
... ... @@ -179,9 +179,19 @@ class MaterielsController extends AppController
179 179 if(isset($GMV)) {
180 180 $condition = ['Materiels.groupes_metier_id =' => $this->request->query('GMV'), 'Materiels.status =' => 'CREATED', 'Materiels.status !=' => 'ARCHIVED'];
181 181 }
  182 +
  183 + $MY = $this->request->query('MY');
  184 + if(isset($MY)) {
  185 + if(in_array($this->role, ['Utilisateur', 'Responsable'])) {
  186 + $condition = ['Materiels.nom_responsable =' => $this->request->query('MY'), 'Materiels.status !=' => 'ARCHIVED'];
  187 + } else {
  188 + $condition = ['Materiels.nom_responsable =' => $this->request->query('MY')];
  189 + }
  190 +
  191 + }
182 192  
183 193  
184   - if($this->role == 'Utilisateur') {
  194 + if(in_array($this->role, ['Utilisateur', 'Responsable']) && $condition != '') {
185 195 $condition = ['Materiels.status !=' => 'ARCHIVED'];
186 196 }
187 197  
... ... @@ -344,6 +354,61 @@ class MaterielsController extends AppController
344 354 $this->set(compact('materiel', 'surCategories', 'categories', 'sousCategories', 'groupesThematiques', 'groupesMetiers', 'organismes', 'sites', 'utilisateurs', 'mail_responsable'));
345 355 $this->set('_serialize', ['materiel']);
346 356 }
  357 +
  358 +
  359 + /**
  360 + * Administrer method
  361 + *
  362 + * @param string|null $id Materiel id.
  363 + * @return \Cake\Network\Response|void Redirects on successful edit, renders view otherwise.
  364 + * @throws \Cake\Network\Exception\NotFoundException When record not found.
  365 + */
  366 + public function administrer($id = null)
  367 + {
  368 + $materiel = $this->Materiels->get($id, [
  369 + 'contain' => []
  370 + ]);
  371 + if ($this->request->is(['patch', 'post', 'put'])) {
  372 + $materiel = $this->Materiels->patchEntity($materiel, $this->request->data);
  373 + if ($this->Materiels->save($materiel, ['checkRules' => false])) {
  374 + $this->Flash->success(__('Le matériel a bien été édité.'));
  375 + return $this->redirect(['action' => 'view', $id]);
  376 + } else {
  377 + $this->Flash->error(__('Le matériel n\'a pas pu être édité.'));
  378 + }
  379 + }
  380 + $surCategories = $this->Materiels->SurCategories->find('list', [ 'keyField' => 'id', 'valueField' => 'nom', 'order' => 'SurCategories.nom']);
  381 + $categories = $this->Materiels->Categories->find('list', [ 'keyField' => 'id', 'valueField' => 'nom', 'order' => 'Categories.nom']);
  382 + $sousCategories = $this->Materiels->SousCategories->find('list', [ 'keyField' => 'id', 'valueField' => 'nom', 'order' => 'SousCategories.nom']);
  383 + $groupesThematiques = $this->Materiels->GroupesThematiques->find('list', [ 'keyField' => 'id', 'valueField' => 'nom', 'order' => 'GroupesThematiques.nom']);
  384 + $groupesMetiers = $this->Materiels->GroupesMetiers->find('list', [ 'keyField' => 'id', 'valueField' => 'nom', 'order' => 'GroupesMetiers.nom']);
  385 + $organismes = $this->Materiels->Organismes->find('list', [ 'keyField' => 'id', 'valueField' => 'nom', 'order' => 'Organismes.nom']);
  386 + $sites = $this->Materiels->Sites->find('list', [ 'keyField' => 'id', 'valueField' => 'nom', 'order' => 'Sites.nom']);
  387 +
  388 + $users = TableRegistry::get('LdapConnections')->getListUsers();
  389 + //tri des utilisateurs par nom
  390 + sort($users);
  391 + $utilisateurs = [];
  392 + for($i = 0; $i < sizeof($users); $i++) {
  393 + $utilisateurs[$users[$i]] = $users[$i];
  394 + }
  395 +
  396 + if(!empty($materiel->get('nom_responsable'))){
  397 + if(!in_array($materiel->get('nom_responsable'), $utilisateurs)){
  398 + $nom_ancien_responsable = $materiel->get('nom_responsable');
  399 + $this->set(compact('nom_ancien_responsable'));
  400 + }
  401 + }
  402 + $mail_responsable = TableRegistry::get('Users')->find()->select('email')->where(['username =' => $this->LdapAuth->user($this->request->session()->read('authType'))[0]])->first()['email'];
  403 +
  404 + $this->set('IS_CREATED', $materiel->status == 'CREATED');
  405 + $this->set('IS_VALIDATED', $materiel->status == 'VALIDATED');
  406 + $this->set('IS_ARCHIVED_OR_TOBE', in_array ( $materiel->status, ['TOBEARCHIVED','ARCHIVED']));
  407 +
  408 + $this->set(compact('materiel', 'surCategories', 'categories', 'sousCategories', 'groupesThematiques', 'groupesMetiers', 'organismes', 'sites', 'utilisateurs', 'mail_responsable'));
  409 + $this->set('_serialize', ['materiel']);
  410 + }
  411 +
347 412  
348 413 /**
349 414 * Delete method
... ...
src/Model/Table/MaterielsTable.php
... ... @@ -278,6 +278,9 @@ class MaterielsTable extends AppTable
278 278  
279 279 public function beforeSave($event, $entity, $options)
280 280 {
  281 + if(!$entity->get('administrer')) {
  282 +
  283 +
281 284 if(!empty($entity->get('nom_responsable')) && empty($entity->get('nom_responsable'))){
282 285 $entity->set('nom_responsable', $entity->get('nom_ancien_responsable'));
283 286 }
... ... @@ -328,7 +331,8 @@ class MaterielsTable extends AppTable
328 331 }
329 332 }
330 333  
331   -
  334 + }
  335 +
332 336 if(empty($entity->get('date_acquisition'))){
333 337 $entity->set('date_acquisition', null);
334 338 }
... ...
src/Template/Layout/default.ctp
... ... @@ -94,7 +94,7 @@ $cakeDescription = &#39;Labinvent 2&#39;;
94 94 </i></td>
95 95 <td id="version">
96 96 <!-- VERSION M.m.f.b (version (M)ajeure, version (m)ineure, numero de nouvelle (f)onctionnalite, numero de (b)ugfix) -->
97   - <font color="black">VERSION 2.5.2.0 (29/06/2016)</font>
  97 + <font color="black">VERSION 2.5.3.0 (29/06/2016)</font>
98 98 </td>
99 99 </tr>
100 100 </table>
... ...
src/Template/Materiels/administrer.ctp 0 → 100644
... ... @@ -0,0 +1,344 @@
  1 +<div class="materiels form">
  2 + <?= $this->Form->create($materiel) ?>
  3 + <fieldset>
  4 + <h2><i class="icon-edit"></i> Administrer un Matériel</h2>
  5 +
  6 + <?php
  7 + echo $this->Html->link('Retourner au formulaire d\'édition classique', ['action' => 'edit', $materiel->id]);
  8 + echo '<br><br>';
  9 + ?>
  10 + <?= $this->Form->submit(__('Enregistrer')) ?>
  11 +
  12 + <?php
  13 +
  14 + echo $this->Form->input('designation', ['label' => 'Désignation']);
  15 +
  16 + echo $this->Form->input('numero_laboratoire', ['label' => 'Numéro de laboratoire']);
  17 +
  18 + echo $this->Form->input('hors_service', ['label' => 'Appareil hors_service']);
  19 +
  20 + echo $this->Form->input('etiquette', [
  21 + 'label' => 'Etiquette posée',
  22 + ]);
  23 +
  24 +
  25 + echo $this->Form->input('sur_categorie_id', [
  26 + 'label' => 'Domaine',
  27 + 'options' => $surCategories,
  28 + 'empty' => 'Choisir un domaine',
  29 + 'style' => 'width: 260px',
  30 +
  31 + ]);
  32 +
  33 + $categs = $categories;
  34 + // if a domaine is selected, reduce the categories list to this domaine
  35 + if (isset ( $this->request->data['sur_categorie_id'] ) && ($this->request->data['sur_categorie_id'] != '')) {
  36 + $categs = $categs->where(['sur_categorie_id =' => $this->request->data['sur_categorie_id']]);
  37 + }
  38 + echo $this->Form->input('categorie_id', [
  39 + 'label' => 'Catégorie',
  40 + 'style' => 'width: 380px',
  41 + 'options' => $categs,
  42 + 'empty' => 'Choisir une catégorie',
  43 + ]);
  44 +
  45 + // SOUS-CATEGORIES
  46 + // by default, list is empty
  47 + $souscategs = [];
  48 + // if a categ is selected, update sous-categs list for this categ (only)
  49 + if (isset ( $this->request->data['categorie_id'] ) && ($this->request->data['categorie_id'] != '')) {
  50 + $souscategs = $sousCategories;
  51 + $souscategs = $souscategs->where(['categorie_id' => $this->request->data['categorie_id']]);
  52 + }
  53 + echo $this->Form->input('sous_categorie_id', [
  54 + 'label' => 'Sous-catégorie',
  55 + 'style' => 'width: 380px',
  56 + 'options' => $souscategs,
  57 + 'empty' => 'Choisir une sous-catégorie',
  58 + ]);
  59 +
  60 + echo $this->Form->input('materiel_technique', [
  61 + 'label' => 'Technique',
  62 + ]);
  63 + echo $this->Form->input('materiel_administratif', [
  64 + 'label' => 'Inventoriable (>'.$configuration->prix_inventaire_administratif.'€)',
  65 + ]);
  66 +
  67 + echo $this->Form->input('description', [
  68 + 'label' => 'Description',
  69 + ]);
  70 +
  71 +
  72 + echo $this->Form->input('site_id', [
  73 + 'options' => $sites,
  74 + 'style' => 'width: 380px',
  75 + 'default' => 9,
  76 + ]);
  77 +
  78 + echo $this->Form->input('lieu_detail', ['label' => 'Détail lieu de stockage']);
  79 +
  80 + echo $this->Form->input('date_acquisition', [
  81 + 'type' => 'text',
  82 + 'label' => 'Date de la commande',
  83 + 'class' => 'datepicker',
  84 + 'placeholder' => 'Cliquez pour sélectionner une date',
  85 + ]);
  86 + echo $this->Form->input('date_reception', [
  87 + 'type' => 'text',
  88 + 'label' => 'Date de réception',
  89 + 'class' => 'datepicker',
  90 + 'placeholder' => 'A éditer lors de la réception uniquement.',
  91 + 'empty' => true]);
  92 +
  93 +
  94 + echo '<table id="tableAlignementFrequence"><tr><td>';
  95 + echo $this->Form->input('duree_garantie', [
  96 + 'type' => 'text',
  97 + 'style' => 'width: 100px',
  98 + 'label' => 'Durée garantie',
  99 + 'templates' => ['inputContainer' => '<div class="A">{{content}}</div>'],
  100 + 'placeholder' => ''
  101 + ]);
  102 + echo '</td><td>';
  103 + echo $this->Form->input ('unite_duree_garantie', [
  104 + 'label' => false,
  105 + 'templates' => ['inputContainer' => '<div class="typeFrequence">{{content}}</div>'],
  106 + 'options' => ['Mois' => 'Mois', 'Ans' => 'Ans'],
  107 + 'default' => 'Ans'
  108 + ]);
  109 + echo '</td></tr></table>';
  110 + echo $this->Form->input('date_fin_garantie', [
  111 + 'type' => 'text',
  112 + 'label' => 'Date fin de garantie',
  113 + 'placeholder' => 'Cliquez pour selectionner une date',
  114 + 'class' => 'datepicker',
  115 + 'default' => NULL
  116 + ]);
  117 +
  118 +
  119 + echo $this->Form->input('status', ['label' => 'Statut', 'options' => [
  120 + 'CREATED' => 'CREATED',
  121 + 'VALIDATED' => 'VALIDATED',
  122 + 'TOBEARCHIVED' => 'TOBEARCHIVED',
  123 + 'ARCHIVED' => 'ARCHIVED']]);
  124 +
  125 + echo $this->Form->input('numero_serie', [
  126 + 'label' => 'Numéro de série',
  127 + ]);
  128 + echo $this->Form->input('groupes_thematique_id', [
  129 + 'label' => $configuration->nom_groupe_thematique,
  130 + 'options' => $groupesThematiques,
  131 + 'default' => 1]);
  132 + echo $this->Form->input('groupes_metier_id', [
  133 + 'label' => $configuration->nom_groupe_metier,
  134 + 'options' => $groupesMetiers,
  135 + 'default' => 1]);
  136 +
  137 + if(!(in_array($role, ['Responsable', 'Administration', 'Administration Plus', 'Super Administrateur']))) {
  138 + echo $this->Form->hidden('nom_responsable', [
  139 + 'label' => 'Nom du propriétaire',
  140 + 'disabled' => $isReadonlyField('nom_responsable', $myReadonlyFields),
  141 + 'empty' => 'Choisir un utilisateur',
  142 + 'default' => $username,
  143 + 'options' => $utilisateurs,
  144 + ]);
  145 + }
  146 +
  147 + if(isset($nom_ancien_responsable)){
  148 + echo $this->Form->input ('nom_ancien_responsable', [
  149 + 'label' => 'Nom ancien propriétaire',
  150 + 'readonly' => true,
  151 + 'default' => $nom_ancien_responsable
  152 + ]);
  153 + }
  154 +
  155 + echo $this->Form->input('email_responsable', [
  156 + 'label' => 'Email du propriétaire',
  157 + 'default' => $mail_responsable
  158 + ]);
  159 +
  160 +
  161 + echo $this->Form->input('fournisseur', [
  162 + 'label' => 'Fournisseur',
  163 + ]);
  164 + echo $this->Form->input('organisme_id', [
  165 + 'options' => $organismes,
  166 + 'style' => 'width: 380px',
  167 + 'empty' => 'Choisir un organisme'
  168 + ]);
  169 + echo $this->Form->input('prix_ht', [
  170 + 'label' => 'Prix HT (€)',
  171 + ]);
  172 +
  173 + echo '<div style="border-top: 1px solid #CCC; border-bottom: 1px solid #CCC; margin-bottom: 0; background: #EEE;"><span style="font-size: 9px; color: red;">Partie administrative</span>';
  174 +
  175 + echo $this->Form->input('adminEdit', [
  176 + 'type' => 'checkbox',
  177 + 'label' => 'Editer la partie administrative',
  178 + 'onchange' => 'changeAdminEdit();',
  179 + 'default' => false
  180 + ]);
  181 +
  182 + echo $this->Form->input('eotp', [
  183 + 'label' => 'Centre financier/EOTP',
  184 + 'disabled' => true
  185 + ]);
  186 + echo $this->Form->input('numero_commande', [
  187 + 'label' => 'Numéro de commande',
  188 + 'disabled' => true
  189 + ]);
  190 + echo $this->Form->input('code_comptable', [
  191 + 'label' => 'Code comptable',
  192 + 'disabled' => true
  193 + ]);
  194 + echo $this->Form->input('numero_inventaire_organisme', [
  195 + 'label' => 'N° inventaire organisme',
  196 + 'disabled' => true
  197 + ]);
  198 + echo $this->Form->input('numero_inventaire_old', [
  199 + 'label' => 'Ancien N° inventaire',
  200 + 'disabled' => true
  201 + ]);
  202 + echo '</div>';
  203 +
  204 + echo $this->Form->input('nom_createur', ['label' => 'Nom du créateur']);
  205 + echo $this->Form->input('created', [
  206 + 'label' => 'Date de création']);
  207 + echo $this->Form->input('nom_modificateur', ['label' => 'Nom du modificateur', 'value' => $username ]);
  208 + echo $this->Form->input('modified', [
  209 + 'label' => 'Date de modification']);
  210 +
  211 + echo $this->Form->hidden('administrer', ['default' => 1]);
  212 + ?>
  213 + </fieldset>
  214 + <?= $this->Form->submit(__('Enregistrer')) ?>
  215 + <?= $this->Form->end() ?>
  216 +</div>
  217 +
  218 +<div class="actions">
  219 + <?php
  220 + echo $this->element('menu');
  221 + echo $this->element('menu_form', [ 'pluralHumanName' => 'Matériels' ]);
  222 + ?>
  223 +</div>
  224 +
  225 +
  226 +<?php
  227 +/**
  228 + * GESTION DES EVENEMENTS SUR LES DOMAINES/CATEGORIES/SOUS-CATEGORIES
  229 + *
  230 + * Phase initialisation (1ère ouverture de la page) :
  231 + * - domaine ==> value = TOUS, select = "choisir" (ADD) ou data (EDIT)
  232 + * - categ ==> value = TOUTES (ADD) ou from domaine (EDIT), select = "choisir" (ADD) ou data (EDIT)
  233 + * - scateg ==> value = Aucune (ADD) ou from categ (EDIT), select = "choisir" (ADD) ou data (EDIT)
  234 + *
  235 + * Event domaine change :
  236 + * - si select <> "choisir" ==> categ value = from domaine (select="choisir"), et vider scateg
  237 + * - si select = "choisir" ==> categ value = TOUTES (select="choisir"), et vider scateg
  238 + *
  239 + * Event categ change :
  240 + * - si select <> "choisir" ==> domaine select = from categ, et scateg values = from categ
  241 + * - si select = "choisir" ==> vider scateg
  242 + *
  243 + * Event scateg change : RIEN A FAIRE
  244 + */
  245 +?>
  246 +
  247 +<script type="text/javascript">
  248 +
  249 +/**
  250 + * Event DOMAINE change
  251 + *
  252 + * Sur sélection d'un DOMAINE ==> update CATEGORIES + empty SOUS-CATEGORIES
  253 + *
  254 + * Dans le détail :
  255 + * - si select <> "choisir" ==> categ value = from domaine (select="choisir")
  256 + * - si select = "choisir" ==> categ value = TOUTES (select="choisir")
  257 + * - puis (dans les 2 cas) vider scateg
  258 + *
  259 + */
  260 +
  261 +$(document).ready(function () {
  262 + $("#sur-categorie-id").bind("change", function (event) {
  263 + var domaineId=$("#sur-categorie-id :selected").val();
  264 +
  265 + if (domaineId=="")
  266 + updateSelectOptionsFromAnother("#categorie-id", "#sur-categorie-id", "Categories/getAll", "Choisir une catégorie");
  267 + else
  268 + updateSelectOptionsFromAnother("#categorie-id", "#sur-categorie-id", "Categories/getBySurCategorie", "Choisir une catégorie");
  269 + emptySelectOptions("#sous-categorie-id","Choisir une sous-catégorie");
  270 + return false;
  271 + });
  272 +});
  273 +
  274 +/**
  275 + *
  276 + * Event CATEGORIE change
  277 + *
  278 + * - si select = "choisir" ==> vider scateg
  279 + * - si select <> "choisir" ==> domaine value selected = celui de la categ, et scateg values = from categ
  280 + */
  281 +$(document).ready(function () {
  282 + $("#categorie-id").bind("change", function (event) {
  283 + var categId=$("#categorie-id :selected").val();
  284 + var categLabel=$("#categorie-id :selected").text();
  285 +
  286 + if (categId=="") emptySelectOptions("#sous-categorie-id","Choisir une sous-catégorie");
  287 + else {
  288 + updateSelectOptionsFromAnother("#sous-categorie-id", "#categorie-id", "SousCategories/getByCategorie", "Choisir une sous-catégorie "+categLabel);
  289 + updateSelectOptionsFromAnother("#sur-categorie-id", "#categorie-id", "SurCategories/getFromCategorie", "");
  290 + }
  291 + return false;
  292 + });
  293 +});
  294 +
  295 +
  296 + /**
  297 + * Event Mail change
  298 + */
  299 + $(document).ready(function () {
  300 + $("#nom-responsable").bind("change", function (event) {
  301 + var url = document.URL;
  302 + var reg=new RegExp("(materiels).*$","g");
  303 + var emailUrl = url.replace(reg, "Users/getLdapEmail/");
  304 + $.ajax({
  305 + url: emailUrl + $("#nom-responsable").val()
  306 + }).done(function(data) {
  307 + $("#email-responsable").val(data)
  308 + });
  309 + });
  310 + });
  311 +
  312 +
  313 + /**
  314 + * Event calcul date fin de garantie
  315 + */
  316 + $(document).ready(function () {
  317 + $("#duree-garantie").bind("change", function (event) {
  318 + if($("#date-reception").val() != "" && $("#duree-garantie").val() != "") {
  319 + var url = document.URL;
  320 + var reg=new RegExp("(materiels).*$","g");
  321 + var dateUrl = url.replace(reg, "Materiels/getDateGarantie/");
  322 + $.ajax({
  323 + url: dateUrl + $("#date-reception").val() + "/" + $("#duree-garantie").val() + "/" + $("#unite-duree-garantie").val()
  324 + }).done(function(data) {
  325 + $("#date-fin-garantie").val(data)
  326 + });
  327 + }
  328 + });
  329 + $("#unite-duree-garantie").bind("change", function (event) {
  330 + if($("#date-reception").val() != "" && $("#duree-garantie").val() != "") {
  331 + var url = document.URL;
  332 + var reg=new RegExp("(materiels).*$","g");
  333 + var dateUrl = url.replace(reg, "Materiels/getDateGarantie/");
  334 + $.ajax({
  335 + url: dateUrl + $("#date-reception").val() + "/" + $("#duree-garantie").val() + "/" + $("#unite-duree-garantie").val()
  336 + }).done(function(data) {
  337 + $("#date-fin-garantie").val(data)
  338 + });
  339 + }
  340 + });
  341 + });
  342 +
  343 +
  344 +</script>
... ...
src/Template/Materiels/edit.ctp
... ... @@ -39,6 +39,14 @@ if ($IS_VALIDATED)
39 39 <?= $this->Form->create($materiel) ?>
40 40 <fieldset>
41 41 <h2><i class="icon-edit"></i> Editer un Matériel</h2>
  42 +
  43 +
  44 + <?php
  45 + if($role == 'Super Administrateur') {
  46 + echo $this->Html->link('Aller au formulaire d\'édition avancée', ['action' => 'administrer', $materiel->id]);
  47 + echo '<br><br>';
  48 + }
  49 + ?>
42 50 <?= $this->Form->submit(__('Enregistrer')) ?>
43 51  
44 52 <?php
... ...
src/Template/Pages/home_app.ctp
... ... @@ -10,6 +10,12 @@
10 10 echo 'et avec le niveau d\'authentification <b>'.$role.'</b>.';
11 11 echo '<p>';
12 12  
  13 + echo '<table cellpadding="0" cellspacing="0" style="width: 800px;">';
  14 + echo '<tr><th></th></tr>';
  15 + echo '<tr><td> '.$this->Html->link('Voir mes matériels', [
  16 + 'controller' => 'materiels', 'action' => 'index', 'MY' => $username]).' </td></tr>';
  17 + echo '</table>';
  18 +
13 19 //Utilisateur admin/super admin
14 20 if (in_array($role, ['Administration', 'Administration Plus'])) {
15 21 echo '<table cellpadding="0" cellspacing="0" style="width: 800px;">';
... ...
src/Template/Pages/tools.ctp
... ... @@ -24,7 +24,7 @@
24 24 echo '<tr><td>';
25 25 echo $this->Html->link('Gérer les fichiers', ['controller' => 'documents', 'action' => 'index']);
26 26 echo '</td></tr>';
27   - endif;
  27 + endif;
28 28  
29 29 echo '<tr><td>';
30 30 echo $this->Html->link('Export de la liste des materiels actifs (format CSV)', ['controller' => 'materiels', 'action' => 'export']);
... ...