Commit 9138c8559cbce617dc8284f801c0530cff13f64f

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

Bugfix, simplification, et amélioration fonction "Copier ce matériel"

README.md
... ... @@ -53,10 +53,10 @@ Logiciel testé et validé sur les configurations suivantes :
53 53  
54 54 VERSION ACTUELLE
55 55  
56   -Date: 13/05/2019
57   -Version: 2.12.10
  56 +Date: 15/05/2019
  57 +Version: 2.12.11
58 58 Author: EP
59   -Commentaire: Ajout de l'option "Librairie pdf utilisée" pour choisir entre fpdf et dompdf
  59 +Commentaire: Bugfix, simplification, et amélioration de la fonctionnalité "Copier ce matériel"
60 60  
61 61 IMPORTANT :
62 62 - Pour connaitre la version actuelle, taper "./VERSION"
... ...
src/Controller/MaterielsController.php
... ... @@ -707,20 +707,56 @@ class MaterielsController extends AppController
707 707 * @param $IS_ADD: True = add ; False = edit
708 708 * @return \Cake\Network\Response|void Redirects on successful add/edit, renders view otherwise.
709 709 */
710   - public function add_or_edit($is_add, $id = null, $valeurs = null, $erreurs = null)
  710 + public function add_or_edit($is_add, $id=null, $valeurs=null, $erreurs=null)
711 711 {
712 712 $usersTable = TableRegistry::getTableLocator()->get('Users');
713 713  
  714 + // Set $materiel
  715 + $materiel = NULL;
  716 +
714 717 // ADD
715 718 if ($is_add) {
716   - $materiel = $this->Materiels->newEntity();
  719 + // - COPIE de materiel (on a cliqué sur "Copier ce materiel") => id passé en argument
  720 + if (isset($this->request->getAttribute('params')['pass'][0])) {
  721 + // 1) on crée un materiel vide
  722 + $materiel = $this->Materiels->newEntity();
  723 + // 2) on récupère le materiel à copier et on le copie dans $materiel
  724 + $materiel_to_copy = $this->Materiels->get($this->request->getAttribute('params')['pass'][0]);
  725 + $materiel_to_copy = $materiel_to_copy->toArray();
  726 + //var_dump($materiel_to_copy);
  727 + ///foreach ($materiel_to_copy as $key=>$value) $materiel->$key = $value;
  728 + // IMPORTANT: validate=False car sinon, les données sont validées avant la copie,
  729 + // et le numero_laboratoire est vu comme invalide car déjà utilisé et doit etre unique !!!
  730 + // et on a pour résultat : "le matériel n'a pas pu être ajouté" (sans savoir pourquoi !!!)
  731 + $materiel = $this->Materiels->patchEntity($materiel, $materiel_to_copy, ['validate' => false]);
  732 + // Du coup, on supprime le champ numero_laboratoire car il va être généré automatiquement
  733 + unset($materiel->numero_laboratoire);
  734 + // IMPORTANT: on ne doit pas laisser l'id égal à celui du matériel copié !!! il en faut un nouveau
  735 + $materiel->id = NULL;
  736 + //$materiel->id = False;
  737 + //unset($materiel->id);
  738 +
  739 + /*
  740 + $attribute="[original]";
  741 + $materiel->$attribute = [];
  742 + */
  743 + //$materiel->id = FALSE;
  744 + //$materiel->'[new]' => true,
  745 + }
  746 + // - NOUVEAU materiel (on a cliqué sur "Nouveau materiel")
  747 + else {
  748 + $materiel = $this->Materiels->newEntity();
  749 + // Set default values : "N/A"
  750 + $materiel->groupes_thematique_id = 1;
  751 + $materiel->groupes_metier_id = 1;
  752 + $materiel->site_id = 9;
  753 + }
717 754 }
718 755 // EDIT
719   - else {
  756 + else
720 757 $materiel = $this->Materiels->get($id, [
721 758 'contain' => []
722 759 ]);
723   - }
724 760  
725 761 /* SI POST
726 762 * Les données ont été saisies et postées
... ... @@ -796,6 +832,7 @@ class MaterielsController extends AppController
796 832  
797 833 //--- 1) INITIALISATION DE LISTES POUR ASSISTER LA SAISIE (listes de choix proposés)
798 834  
  835 + // DOMAINES : LISTE COMPLETE
799 836 $surCategories = $this->Materiels->SurCategories->find('list', [
800 837 'keyField' => 'id',
801 838 'valueField' => 'nom',
... ... @@ -805,6 +842,35 @@ class MaterielsController extends AppController
805 842 'nom !=' => 'N/A'
806 843 )
807 844 ]);
  845 +
  846 + // CATEGORIES ET SOUS-CATEG (modes EDIT et ADD-by-COPIE only)
  847 + $categories = [];
  848 + $sousCategories = [];
  849 + if ( !$is_add or ($is_add and isset($this->request->getAttribute('params')['pass'][0])) ) {
  850 + // - Seulement les categories correspondant au domaine choisi
  851 + $categories = $this->Materiels->Categories->find('list', [
  852 + 'conditions' => [
  853 + 'Categories.sur_categorie_id' => $materiel->sur_categorie_id
  854 + ],
  855 + //'recursive' => - 1,
  856 + 'keyField' => 'id',
  857 + 'valueField' => 'nom',
  858 + 'order' => 'nom',
  859 + //'order' => 'Categories.nom',
  860 + ]);
  861 + // - Seulement les sous-categ correspondant à la categorie choisie
  862 + $sousCategories = $this->Materiels->SousCategories->find('list', [
  863 + 'conditions' => [
  864 + 'SousCategories.categorie_id' => $materiel->categorie_id
  865 + ],
  866 + //'recursive' => - 1,
  867 + 'keyField' => 'id',
  868 + 'valueField' => 'nom',
  869 + 'order' => 'nom'
  870 + //'order' => 'SousCategories.nom'
  871 + ]);
  872 + }
  873 + /* (EP) Totalement inutile !!!
808 874 $categories = $this->Materiels->Categories->find('list', [
809 875 'keyField' => 'id',
810 876 'valueField' => 'nom',
... ... @@ -815,6 +881,8 @@ class MaterielsController extends AppController
815 881 'valueField' => 'nom',
816 882 'order' => 'SousCategories.nom'
817 883 ]);
  884 + */
  885 +
818 886 $groupesThematiques = $this->Materiels->GroupesThematiques->find('list', [
819 887 'keyField' => 'id',
820 888 'valueField' => 'nom',
... ... @@ -958,17 +1026,21 @@ class MaterielsController extends AppController
958 1026 ])
959 1027 ->first()['email'];
960 1028  
  1029 + /*
961 1030 // ADD only
962   - if ( $is_add) {
  1031 + if ($is_add) {
  1032 + // Un id a été passé en argument => Copie de materiel (on a cliqué sur "Copier ce materiel")
963 1033 if (isset($this->request->getAttribute('params')['pass'][0])) {
964 1034 $cpMateriel = $this->Materiels->get($this->request->getAttribute('params')['pass'][0]);
965 1035 $this->set('cpMateriel', $cpMateriel);
966 1036 }
967 1037 }
968   -
969   - // EDIT only
970 1038 else {
  1039 + */
971 1040  
  1041 + // EDIT only
  1042 + if (!$is_add) {
  1043 +
972 1044 if (! empty($materiel->get('nom_responsable'))) {
973 1045 //if (! in_array($materiel->get('nom_responsable'), $utilisateurs)) {
974 1046 if (! in_array($materiel->get('nom_responsable'), $users_name)) {
... ... @@ -1033,7 +1105,8 @@ class MaterielsController extends AppController
1033 1105 'materiel',
1034 1106 // not used
1035 1107 //'utilisateurconnect',
1036   - 'surCategories', 'categories', 'sousCategories',
  1108 + 'surCategories',
  1109 + 'categories', 'sousCategories',
1037 1110 'groupesThematiques', 'groupesMetiers',
1038 1111 'organismes', 'sites',
1039 1112 'mail_responsable',
... ... @@ -1047,9 +1120,11 @@ class MaterielsController extends AppController
1047 1120 'administrateurs'
1048 1121 ));
1049 1122  
  1123 + /* (EP) INUTILE (sauf pour faire du json ou xml) !!!
1050 1124 $this->set('_serialize', [
1051   - 'materiel'
  1125 + 'materiel',
1052 1126 ]);
  1127 + */
1053 1128  
1054 1129 } //add_or_edit()
1055 1130  
... ...
src/Template/Materiels/add.ctp
... ... @@ -6,13 +6,20 @@
6 6 */
7 7 $users_option_list = $users_option_list;
8 8 $users_login_and_email = $users_login_and_email;
  9 +$materiel = $materiel;
9 10 // TODO: yena d'autres... il faut les lister toutes ici, pour plus de clarté
10 11  
  12 +//debug($materiel);
11 13 //debug($users_option_list);
12 14 //debug($users_login_and_email);
  15 +//debug($sousCategories);
13 16  
14 17 use Cake\ORM\TableRegistry;
  18 +
  19 +/*
  20 +// COPIE de materiel (on a cliqué sur "Copier ce matériel")
15 21 if (isset($cpMateriel)) {
  22 + //debug($cpMateriel);
16 23 $Designation = $cpMateriel->designation;
17 24 $Sur_categ_id = $cpMateriel->sur_categorie_id;
18 25 $Categ_id = $cpMateriel->categorie_id;
... ... @@ -30,6 +37,7 @@ if (isset($cpMateriel)) {
30 37 $Lieu_detail = $cpMateriel->lieu_detail;
31 38 $Site_id = $cpMateriel->site_id;
32 39 } else {
  40 +// NOUVEAU matériel (on a cliqué sur "Nouveau matériel")
33 41 $Designation = NULL;
34 42 if (!isset($Sur_categ_id)) $Sur_categ_id = NULL;
35 43 $Categ_id = NULL;
... ... @@ -47,6 +55,7 @@ if (isset($cpMateriel)) {
47 55 $Lieu_detail = NULL;
48 56 $Site_id = 9;
49 57 }
  58 +*/
50 59 //debug($Sur_categ_id)
51 60 ?>
52 61  
... ... @@ -67,34 +76,45 @@ if (isset($cpMateriel)) {
67 76 <?php
68 77 echo $this->Form->control('designation', [
69 78 'label' => 'Désignation',
70   - 'default' => $Designation
  79 + //'default' => $Designation
  80 + 'default' => $materiel->designation
71 81 ]);
72 82  
  83 + // SUR-CATEGORIES (DOMAINES)
  84 + //debug($surCategories);
73 85 echo $this->Form->control('sur_categorie_id', [
74 86 'label' => 'Domaine',
75 87 'style' => 'width: 260px',
76 88 'options' => $surCategories,
77 89 'empty' => 'Choisir un domaine',
78   - 'default' => $Sur_categ_id
  90 + //'default' => $Sur_categ_id
  91 + 'default' => $materiel->sur_categorie_id
79 92 ]);
80   - /* (EP 26/2/19) Inutile, je commente
81   - // if a domaine is selected, reduce the categories list to this domaine
  93 +
  94 + // CATEGORIES
82 95 $categs = $categories;
  96 + /*
  97 + // if a domain is selected, reduce the categories list to this domain
  98 + //debug($categories);
83 99 if ($this->request->getData('sur_categorie_id') !== null && ($this->request->getData('sur_categorie_id') != '')) {
84 100 $categs = $categs->where([
85 101 'sur_categorie_id =' => $this->request->getData('sur_categorie_id')
86 102 ]);
87 103 }
  104 + //$categs = [];
88 105 */
89   - $categs = [];
90 106 echo $this->Form->control('categorie_id', [
91 107 'label' => 'Catégorie',
92 108 'style' => 'width: 380px',
93 109 'options' => $categs,
94 110 'empty' => 'Choisir une catégorie',
95   - 'default' => $Categ_id
  111 + //'default' => $Categ_id
  112 + 'default' => $materiel->categorie_id
96 113 ]);
97   - // by default, list is empty
  114 +
  115 + // SOUS-CATEGORIES (by default, list is empty)
  116 + $souscategs = $sousCategories;
  117 + /*
98 118 $souscategs = [];
99 119 // if a categ is selected, update sous-categs list for this categ (only)
100 120 if ($this->request->getData('categorie_id') !== null && ($this->request->getData('categorie_id') != '')) {
... ... @@ -103,20 +123,25 @@ if (isset($cpMateriel)) {
103 123 'categorie_id' => $this->request->getData('categorie_id')
104 124 ]);
105 125 }
  126 + */
106 127 echo $this->Form->control('sous_categorie_id', [
107 128 'label' => 'Sous-catégorie',
108 129 'style' => 'width: 380px',
109 130 'options' => $souscategs,
110 131 'empty' => 'Choisir une sous-catégorie',
111   - 'default' => $Sous_categ_id
  132 + //'default' => $Sous_categ_id
  133 + 'default' => $materiel->sous_categorie_id
112 134 ]);
  135 +
113 136 echo $this->Form->control('materiel_technique', [
114 137 'label' => 'Technique',
115   - 'default' => $Mat_technique
  138 + //'default' => $Mat_technique
  139 + 'default' => $materiel->materiel_technique
116 140 ]);
117 141 echo $this->Form->control('materiel_administratif', [
118 142 'label' => 'Inventoriable (>' . $configuration->prix_inventaire_administratif . '€)',
119   - 'default' => $Mat_administratif
  143 + //'default' => $Mat_administratif
  144 + 'default' => $materiel->materiel_administratif
120 145 ]);
121 146 if ($configuration->metrologie) {
122 147 echo $this->Form->control('metrologie', [
... ... @@ -126,7 +151,8 @@ if (isset($cpMateriel)) {
126 151 }
127 152 echo $this->Form->control('description', [
128 153 'label' => 'Description',
129   - 'default' => $Description
  154 + //'default' => $Description
  155 + 'default' => $materiel->description
130 156 ]);
131 157 if ($USER_IS_RESPONSABLE_OR_MORE) {
132 158 /*
... ... @@ -145,7 +171,8 @@ if (isset($cpMateriel)) {
145 171 echo $this->Form->control('site_id', [
146 172 'options' => $sites,
147 173 'style' => 'width: 380px',
148   - 'default' => $Site_id
  174 + //'default' => $Site_id
  175 + 'default' => $materiel->site_id
149 176 ]);
150 177 echo '<div class="input text"><label for="lieu_detail">Détail lieu de stockage</label><input list="lieu" id="lieu_detail" name="lieu_detail" type="text" placeholder="choisir/ajouter un lieu" autocomplete="off"><datalist id="lieu">';
151 178 foreach ($lieu_detail as $e) {
... ... @@ -157,7 +184,8 @@ if (isset($cpMateriel)) {
157 184 'label' => 'Date de la commande',
158 185 'class' => 'datepicker',
159 186 'placeholder' => 'Cliquez pour sélectionner une date',
160   - 'default' => $Date_acquisition
  187 + //'default' => $Date_acquisition
  188 + 'default' => $materiel->date_acquisition
161 189 ]);
162 190 echo $this->Form->control('date_reception', [
163 191 'type' => 'text',
... ... @@ -165,7 +193,8 @@ if (isset($cpMateriel)) {
165 193 'class' => 'datepicker',
166 194 'placeholder' => 'A éditer lors de la réception uniquement.',
167 195 'empty' => true,
168   - 'default' => $Date_reception
  196 + //'default' => $Date_reception
  197 + 'default' => $materiel->date_reception
169 198 ]);
170 199 echo '<table id="tableAlignementFrequence"><tr><td>';
171 200 echo $this->Form->control('duree_garantie', [
... ... @@ -203,25 +232,29 @@ if (isset($cpMateriel)) {
203 232 echo $this->Form->control('groupes_thematique_id', [
204 233 'label' => $configuration->nom_groupe_thematique,
205 234 'options' => $groupesThematiques,
206   - 'default' => $Groupes_thematique_id
  235 + //'default' => $Groupes_thematique_id
  236 + 'default' => $materiel->groupes_thematique_id
207 237 ]);
208 238 echo $this->Form->control('groupes_metier_id', [
209 239 'label' => $configuration->nom_groupe_metier,
210 240 'options' => $groupesMetiers,
211   - 'default' => $Groupes_metier_id
  241 + //'default' => $Groupes_metier_id
  242 + 'default' => $materiel->groupes_metier_id
212 243 ]);
213 244 $fieldType = $USER_IS_UTILISATEUR ? 'hidden' : 'input';
214 245 echo $this->Form->$fieldType('nom_responsable', [
215 246 'label' => 'Nom de l\'utilisateur',
216 247 'empty' => 'Choisir un utilisateur',
217   - 'default' => $username,
  248 + //'default' => $username,
  249 + 'default' => $materiel->username,
218 250 //'options' => $utilisateurs
219 251 'options' => $users_option_list
220 252 ]);
221 253 echo $this->Form->control('email_responsable', [
222 254 'label' => 'Email de l\'utilisateur',
223 255 'readonly' => true,
224   - 'default' => $mail_responsable
  256 + //'default' => $mail_responsable
  257 + 'default' => $materiel->mail_responsable,
225 258 ]);
226 259  
227 260 /*
... ... @@ -260,11 +293,13 @@ if (isset($cpMateriel)) {
260 293 'options' => $organismes,
261 294 'style' => 'width: 380px',
262 295 'empty' => 'Choisir un organisme',
263   - 'default' => $Organisme_id
  296 + //'default' => $Organisme_id
  297 + 'default' => $materiel->organisme_id,
264 298 ]);
265 299 echo $this->Form->control('prix_ht', [
266 300 'label' => 'Prix HT (€)',
267   - 'default' => $Prix_ht
  301 + //'default' => $Prix_ht
  302 + 'default' => $materiel->prix_ht,
268 303 ]);
269 304 if ($USER_IS_ADMIN_OR_MORE) {
270 305 /*
... ...
src/Template/Materiels/edit.ctp
... ... @@ -11,7 +11,7 @@ $users_login_and_email = $users_login_and_email;
11 11  
12 12 //debug($users_option_list);
13 13 //debug($users_login_and_email);
14   -
  14 +//debug($materiel);
15 15  
16 16 use Cake\ORM\TableRegistry;
17 17  
... ... @@ -116,6 +116,8 @@ if ($IS_VALIDATED &amp;&amp; $materiel-&gt;numero_serie)
116 116 'label' => 'Appareil hors_service'
117 117 ]);
118 118 }
  119 +
  120 + // DOMAINES
119 121 echo $this->Form->control('sur_categorie_id', [
120 122 'label' => 'Domaine',
121 123 'options' => $surCategories,
... ... @@ -124,13 +126,17 @@ if ($IS_VALIDATED &amp;&amp; $materiel-&gt;numero_serie)
124 126 'readonly' => $isReadonlyField('sur_categorie_id', $myReadonlyFields),
125 127 'disabled' => $isReadonlyField('sur_categorie_id', $myReadonlyFields)
126 128 ]);
  129 +
  130 + // CATEGORIES
127 131 $categs = $categories;
  132 + /*
128 133 // if a domain is selected, reduce the categories list to this domain
129 134 //if ($this->request->getData('sur_categorie_id') !== null && ($this->request->getData('sur_categorie_id') != ''))
130 135 if ($materiel->sur_categorie_id !== null && $materiel->sur_categorie_id != '')
131 136 $categs = $categs->where([
132 137 'sur_categorie_id =' => $materiel->sur_categorie_id
133 138 ]);
  139 + */
134 140 echo $this->Form->control('categorie_id', [
135 141 'label' => 'Catégorie',
136 142 'style' => 'width: 380px',
... ... @@ -138,7 +144,10 @@ if ($IS_VALIDATED &amp;&amp; $materiel-&gt;numero_serie)
138 144 'empty' => 'Choisir une catégorie',
139 145 'disabled' => $isReadonlyField('categorie_id', $myReadonlyFields)
140 146 ]);
  147 +
141 148 // SOUS-CATEGORIES
  149 + $souscategs = $sousCategories;
  150 + /*
142 151 // by default, list is empty
143 152 $souscategs = [];
144 153 // if a categ is selected, update sous-categs list for this categ (only)
... ... @@ -150,6 +159,7 @@ if ($IS_VALIDATED &amp;&amp; $materiel-&gt;numero_serie)
150 159 'categorie_id' => $materiel->categorie_id
151 160 ]);
152 161 }
  162 + */
153 163 echo $this->Form->control('sous_categorie_id', [
154 164 'label' => 'Sous-catégorie',
155 165 'style' => 'width: 380px',
... ...
src/Template/Materiels/view.ctp
... ... @@ -470,16 +470,19 @@ $panne = h($materiel-&gt;hors_service) ? &#39; (HORS SERVICE)&#39; : &#39;&#39;;
470 470 } // switch
471 471 } // BOUTON changement statut
472 472  
473   - // BOUTON Copier
474   - echo $this->Html->link('<i class="icon-pencil"></i> Copier ce matériel', [
475   - 'controller' => 'materiels',
476   - 'action' => 'add',
477   - $materiel->id
478   - ], [
479   - 'title' => 'Copier ce matériel',
480   - 'style' => 'margin-right: 10px; margin-top: 10px; display: inline-block',
481   - 'escape' => false
482   - ]);
  473 + // BOUTON Copier (seulement pour les materiels qui sont CREATED et pour les ADMINet+ ou USER owner)
  474 + if ( $IS_CREATED and ($USER_IS_ADMIN_OR_MORE || $USER_IS_UTILISATEUR_AND_CREATOR_OR_OWNER) )
  475 + echo $this->Html->link('<i class="icon-pencil"></i> Copier ce matériel',
  476 + [
  477 + 'controller' => 'materiels',
  478 + 'action' => 'add',
  479 + $materiel->id
  480 + ],
  481 + [
  482 + 'title' => 'Copier ce matériel',
  483 + 'style' => 'margin-right: 10px; margin-top: 10px; display: inline-block',
  484 + 'escape' => false
  485 + ]);
483 486  
484 487 // BOUTON ETIQUETTE (si imprimante disponible)
485 488 if ($IS_VALIDATED && $configuration->hasPrinter && in_array($role, [
... ...