Commit 557e98840432eaf5033e956cb4380b46be47d12f

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

Bouton "Commander" désactivable via configuration (+ bcp de debugfixes)

BUGfixes :
		- (b) type "devis" doit être reconnu même si pas en majuscule ou
espaces en trop
		- (b) Devis sous forme d'image doit être autorisé
		- (b) suppression d'un doc attaché à un SUIVI devait buguer
			=> code de DocumentsController.delete() complètement réécrit !!!
		- (b) Devis ne doit pas être supprimable si matériel TOBEORDERED
(commandé),
			on doit seulement pouvoir ajouter un nouveau devis
		- (b) On ne pouvait plus modifier un materiel commandé ou validé...
(erreur sur Devis obligatoire)
		- (b) Ne pas envoyer de mail (mais log oui) si l'action ne s'est pas
effectuée (ex: commande, validation...)

=> v5.0.1-3.7.9
CHANGELOG
... ... @@ -331,18 +331,50 @@ Commencer à implémenter le nouveau workflow v5 :
331 331 Si non, ça serait bien pratique qu’elles le puissent
332 332 car seul superadmin peut le faire...
333 333  
  334 +
  335 +======= TODO =======
  336 +
  337 +
  338 +
  339 + config IP2I :
  340 + - order désactivé
  341 + - lot0 : rempli
  342 + - lot1 : vide
  343 + - lot2 : vide
  344 +
  345 + TESTS !!!!
  346 +
  347 +
  348 +
  349 +
  350 +
334 351  
335 352 ======= CHANGES =======
336 353  
  354 +
337 355 -------
338   -06/09/2021 v4.108.25-3.7.9
339   - - (b) BUGfixes :
340   - - lier un doc à un matos (erreur sur doc qui n'est pas une photo)
341   - - supprimer un doc attaché générait une erreur
342   - - (i) Nouveau workflow incluant la "commande d'un matériel" :
  356 +07/09/2021 v5.0.1-3.7.9
  357 + - (i) Bouton "Commander" (+ workflow) doit être désactivable via configuration
  358 + - BUGfixes :
  359 + - (b) type "devis" doit être reconnu même si pas en majuscule ou espaces en trop
  360 + - (b) Devis sous forme d'image doit être autorisé
  361 + - (b) suppression d'un doc attaché à un SUIVI devait buguer
  362 + => code de DocumentsController.delete() complètement réécrit !!!
  363 + - (b) Devis ne doit pas être supprimable si matériel TOBEORDERED (commandé),
  364 + on doit seulement pouvoir ajouter un nouveau devis
  365 + - (b) On ne pouvait plus modifier un materiel commandé ou validé... (erreur sur Devis obligatoire)
  366 + - (b) Ne pas envoyer de mail (mais log oui) si l'action ne s'est pas effectuée (ex: commande, validation...)
  367 +
  368 +
  369 +-------
  370 +06/09/2021 v5.0.0-3.7.9
  371 + - (e) Nouveau workflow incluant la "commande d'un matériel" :
343 372 - nouveau bouton "Commander"
344 373 - nouveau statut "TOBEORDERED" (à commander)
345 374 - L'étape de commande est optionnelle
  375 + - (b) BUGfixes :
  376 + - lier un doc à un matos (erreur sur doc qui n'est pas une photo)
  377 + - supprimer un doc attaché générait une erreur
346 378  
347 379 -------
348 380 02/09/2021 v4.108.24-3.7.9
... ...
README.md
... ... @@ -53,7 +53,7 @@ Logiciel testé et validé sur les configurations suivantes :
53 53 --------------------------------------------------------------------------------------------
54 54  
55 55 Date: 06/09/2021
56   -Version: v5.0.0-3.7.9
  56 +Version: v5.0.1-3.7.9
57 57  
58 58  
59 59  
... ...
config/app_labinvent_mandatory_fields.default.yml
... ... @@ -5,6 +5,7 @@
5 5 # Les transitions de statut d'un materiel sont alors : CREATED => [ TEBEORDERED (à commander) ] => VALIDATED => TOBEARCHIVED => ARCHIVED
6 6 #
7 7 HAS_ORDER_BUTTON: true
  8 +#HAS_ORDER_BUTTON: false
8 9  
9 10  
10 11 # Infos minimum obligatoires pour créer une fiche Matériel
... ...
src/Controller/AppController.php
... ... @@ -50,6 +50,9 @@ class AppController extends Controller
50 50 protected $DEBUG=false;
51 51 //protected $DEBUG=true;
52 52  
  53 + // Action Annulée ? (non par défaut)
  54 + protected $ACTION_CANCELLED = false;
  55 +
53 56 // - ATTRIBUTS CONSTANTES
54 57  
55 58 const PROFILE_DEFAULT = 0; // droits par défaut, base de tous les autres profils (facultatif)
... ... @@ -2853,7 +2856,7 @@ class AppController extends Controller
2853 2856 */
2854 2857 //if ($this->isNotifierAction($this->a) && $this->e_id && !$this->e->getErrors())
2855 2858 //if ($this->isNotifierAction($this->a) && $this->e_id) {
2856   - //debug($this->a);
  2859 + //debug($this->a); exit;
2857 2860 if ($this->isNotifierAction($this->a)) {
2858 2861 //debug("ici2"); exit;
2859 2862 // Positionne $this->e ssi il n'existe pas déjà
... ... @@ -2866,6 +2869,8 @@ class AppController extends Controller
2866 2869 // Toutes les autres actions
2867 2870 !$this->getCurrentEntity()->getErrors()
2868 2871 ) {
  2872 + //if ($this->ACTION_CANCELLED) { debug("CANCELLED"); exit; }
  2873 + if ($this->ACTION_CANCELLED) return;
2869 2874 $emails = $this->sendNotificationForEntityAction();
2870 2875 //debug($emails);
2871 2876 }
... ... @@ -3583,7 +3588,7 @@ class AppController extends Controller
3583 3588 $entity = $this->getCurrentEntity();
3584 3589 ////if ( !$entity ) return null;
3585 3590  
3586   - // Par exemple, pour les actions documents/mail-devis ou users/login ...
  3591 + // Par exemple, pour les actions documents/mail-devis ou users/login ...
3587 3592 if (!$entity && $this->e_id) $entity = $this->getEntity($this->e_id);
3588 3593  
3589 3594 // Action
... ... @@ -4059,7 +4064,8 @@ class AppController extends Controller
4059 4064 ////} // entity not null
4060 4065  
4061 4066 } //foreach ($mailList as $mail)
4062   - $DEBUG && debug("Liste destinataires :"); debug($mailList);
  4067 + $DEBUG && debug("Liste destinataires :");
  4068 + $DEBUG && debug($mailList);
4063 4069 //$DEBUG && exit;
4064 4070  
4065 4071 return $mailList;
... ...
src/Controller/DocumentsController.php
... ... @@ -86,9 +86,20 @@ class DocumentsController extends AppController
86 86 'super' => ['default',0]
87 87 ]);
88 88  
89   - // Action 'edit' (modif d'une entité) => comme pour 'add'
90   - $this->setAuthorizationsForAction('delete', 'add', [
91   - 'super' => ['default',0]
  89 + /*
  90 + * Action 'delete' (suppression d'une entité)
  91 + * (EP 2021 09) ATTENTION : Outre cette règle de base implémentée ici,
  92 + * une autre règle (trop complexe pour être gérée par ce biais) est implémentée "EN DUR" dans le code... :
  93 + * => On ne doit pas pouvoir supprimer un DEVIS associé à un matériel de status TOBEORDERED (commandé)
  94 + * (pas simple comme règle hein ?)
  95 + * => implémentée dans le code de l'action delete() de ce controleur
  96 + */
  97 + $this->setAuthorizationsForAction('delete', [0,1], [
  98 + // Mais admin (et superadmin) peut supprimer tous les docs attachés
  99 + 'admin' => 0,
  100 + 'super' => 0
  101 + // idem
  102 + //'super' => [0,0]
92 103 ]);
93 104  
94 105 // Action 'ficheMateriel'
... ... @@ -606,26 +617,59 @@ class DocumentsController extends AppController
606 617 ]);
607 618  
608 619 //$document = $this->Documents->get($id);
  620 + /*
609 621 $document = $this->Documents->get($id, [
610 622 'contain' => ['TypeDocuments']
611 623 ]);
612   - //$document = $this->getEntity($id, false, ['TypeDocuments']);
613   -
614   - if ($document->photo) {
615   - $materielTable = TableRegistry::getTableLocator()->get('Materiels');
616   - $materiel = $materielTable->get($document->materiel_id);
  624 + */
  625 + $document = $this->getEntity($id, false, ['TypeDocuments']);
  626 +
  627 + $parent_id = $document->materiel_id;
  628 + $DOC_IS_ATTACHED_TO_A_MATERIEL = ! empty($parent_id);
  629 + if (! $DOC_IS_ATTACHED_TO_A_MATERIEL) $parent_id = $document->suivi_id;
  630 +
  631 + if ($DOC_IS_ATTACHED_TO_A_MATERIEL) {
  632 +
  633 + $materiel = $this->Documents->Materiels->get($parent_id);
  634 +
  635 + // ATTENTION, règle de gestion complexe :
  636 + // On ne doit pas pouvoir supprimer un DEVIS associé à un matériel de status TOBEORDERED (commandé)
  637 + if ($document->is_devis && $materiel->is_tobeordered) {
  638 + $this->Flash->error(__("Ce matériel est en commande, vous ne pouvez donc pas supprimer son devis"));
  639 + $this->ACTION_CANCELLED = TRUE;
  640 + return $this->redirect([
  641 + 'controller' => 'materiels',
  642 + 'action' => 'view',
  643 + $parent_id
  644 + ]);
  645 + }
617 646  
618   - $materiel->set('photo_id', null);
619   - $materielTable->save($materiel);
  647 + if ($document->photo) {
  648 + /*
  649 + $materielTable = TableRegistry::getTableLocator()->get('Materiels');
  650 + $materiel = $materielTable->get($document->materiel_id);
  651 + */
  652 +
  653 + $materiel->photo_id = null;
  654 + $this->Documents->Materiels->save($materiel);
  655 + //$materiel->set('photo_id', null);
  656 + //$materielTable->save($materiel);
  657 + }
  658 +
620 659 }
621 660  
622 661 if ($this->Documents->delete($document))
623   - $this->Flash->success(__('Le fichier a bien été supprimé.'));
  662 + $this->Flash->success(__("Le document attaché a bien été supprimé"));
624 663 else
625   - $this->Flash->error(__('Le fichier n\'a pas pu être supprimé.'));
  664 + $this->Flash->error(__("Le document attaché n'a pas pu être supprimé"));
626 665  
  666 + return $this->redirect([
  667 + 'controller' => $DOC_IS_ATTACHED_TO_A_MATERIEL ? 'materiels' : 'suivis',
  668 + 'action' => 'view',
  669 + $parent_id
  670 + ]);
  671 + /*
627 672 $id = $document->materiel_id;
628   -
629 673 if (empty($id)) {
630 674 $id = $document->suivi_id;
631 675 return $this->redirect([
... ... @@ -639,6 +683,7 @@ class DocumentsController extends AppController
639 683 'action' => 'view',
640 684 $id
641 685 ]);
  686 + */
642 687 }
643 688  
644 689  
... ...
src/Controller/MaterielsController.php
... ... @@ -14,6 +14,10 @@ use Cake\Database\Query;
14 14 use phpDocumentor\Reflection\Types\True_;
15 15 use App\Model\Table\MaterielsTable;
16 16  
  17 +// (2021 08) EP added to read new config files (config/app_mandatory_fields, ...)
  18 +use Cake\Core\Configure;
  19 +
  20 +
17 21 //use App\Controller\DocumentsController;
18 22 //App::import('Controller', 'Documents');
19 23  
... ... @@ -24,6 +28,10 @@ use App\Model\Table\MaterielsTable;
24 28 */
25 29 class MaterielsController extends AppController {
26 30  
  31 + // Bouton "Commander" disponible ?
  32 + private static $HAS_ORDER_BUTTON = null;
  33 +
  34 +
27 35 // - ATTRIBUTS CONSTANTES
28 36  
29 37 /*
... ... @@ -368,6 +376,18 @@ class MaterielsController extends AppController {
368 376 return 'designation';
369 377 }
370 378  
  379 + // Les matos peuvent-ils être commandés (bouton commander) ?
  380 + // vrai par défaut (sauf si explicité dans la config)
  381 + public static function hasOrderButton() {
  382 + // OPTIM : si déjà lu, on relit pas
  383 + if (! is_null(self::$HAS_ORDER_BUTTON)) return self::$HAS_ORDER_BUTTON;
  384 + // Pas encore lu, on lit
  385 + $has_order_button = Configure::read('HAS_ORDER_BUTTON');
  386 + if (is_null($has_order_button)) $has_order_button = true;
  387 + self::$HAS_ORDER_BUTTON = $has_order_button;
  388 + return $has_order_button;
  389 + }
  390 +
371 391  
372 392 /*
373 393 * @Override
... ... @@ -990,6 +1010,9 @@ class MaterielsController extends AppController {
990 1010 {
991 1011 $this->myDebug("step 3: MaterielsController.index()");
992 1012  
  1013 + $HAS_ORDER_BUTTON = self::hasOrderButton();
  1014 + $this->set(compact('HAS_ORDER_BUTTON'));
  1015 +
993 1016 //debug($this->request);
994 1017 $conditions = [];
995 1018 //$contain = [];
... ... @@ -1601,6 +1624,9 @@ class MaterielsController extends AppController {
1601 1624 *
1602 1625 */
1603 1626  
  1627 + $HAS_ORDER_BUTTON = self::hasOrderButton();
  1628 + $this->set(compact('HAS_ORDER_BUTTON'));
  1629 +
1604 1630 /*
1605 1631 $IS_CREATED = ($materiel->status == 'CREATED');
1606 1632 $IS_VALIDATED = ($materiel->status == 'VALIDATED');
... ... @@ -2198,6 +2224,9 @@ class MaterielsController extends AppController {
2198 2224 // (fournisseur_id, et autres champs ajoutés dans l'avenir ? ...)
2199 2225 if ($fname=='fournisseur_id') continue;
2200 2226  
  2227 + // Champs virtuels (n'existent pas physiquement)
  2228 + if (strtoupper($fname)=='DEVIS') continue;
  2229 +
2201 2230 if ($materiel->$fname === null || $materiel->$fname == '') {
2202 2231 $ALL_MANDATORY_FIELDS_GIVEN = false;
2203 2232 /* (EP 2020 03)
... ... @@ -2907,14 +2936,15 @@ class MaterielsController extends AppController {
2907 2936 // Si au moins un champ obligatoire est nul ou vide => ERROR
2908 2937 foreach ($mandatoryFields as $fname => $fnicename) {
2909 2938 // Champ virtuel ?
2910   - if ($fname == 'DEVIS') {
  2939 + if (strtoupper($fname) == 'DEVIS') {
2911 2940 if (! $materiel->hasDevis()) {
2912   - // on passe au champ suivant
2913 2941 $msgError1 = "Pour ordonner la commande de ce matériel, vous devez d'abord joindre un devis à cette fiche (bouton 'Lier un doc.') ";
2914 2942 $this->Flash->error($msgError1);
  2943 + $this->ACTION_CANCELLED = TRUE;
2915 2944 // => on reste sur "view"
2916 2945 return $this->redirect(['action'=>'view',$id]);
2917 2946 }
  2947 + // on passe au champ suivant
2918 2948 continue;
2919 2949 }
2920 2950 // Champ physique (réel) ?
... ... @@ -2923,6 +2953,7 @@ class MaterielsController extends AppController {
2923 2953 $msgError1 = "Pour ordonner la commande d'un matériel, le champ suivant ne doit pas être vide : ".$fnicename.' du matériel';
2924 2954 $this->Flash->error($msgError1);
2925 2955 $this->e->setError($fname, 'Ce champ ne doit pas être vide');
  2956 + $this->ACTION_CANCELLED = TRUE;
2926 2957 // => on revient à "edit"
2927 2958 return $this->redirect(['action'=>'edit',$id]);
2928 2959 }
... ... @@ -3000,6 +3031,7 @@ class MaterielsController extends AppController {
3000 3031 $materiel->setError('numero_commande', 'Ce champ ne doit pas être vide');
3001 3032 */
3002 3033 $this->e->setError($fname, 'Ce champ ne doit pas être vide');
  3034 + $this->ACTION_CANCELLED = TRUE;
3003 3035 // (EP 2020 03) Si on ne veut pas de bouton de suppression du message :
3004 3036 //$this->Flash->set($msgError1, ['params' => ['class' => 'alert alert-dismissible in alert-danger']]);
3005 3037 //$this->Flash->set($msgError1, ['params' => ['class' => 'alert alert-dismissible fade in alert-danger']]);
... ... @@ -3008,6 +3040,7 @@ class MaterielsController extends AppController {
3008 3040 // Validation de plusieurs matériels (cochés) à la fois => on annule l'action de validation
3009 3041 else {
3010 3042 $this->Flash->error($msgError2);
  3043 + $this->ACTION_CANCELLED = TRUE;
3011 3044 return False;
3012 3045 }
3013 3046 }
... ...
src/Model/Entity/Document.php
... ... @@ -49,7 +49,7 @@ class Document extends Entity
49 49 ])
50 50 $doc_type = $this->Documents->TypeDocuments->get($this->type_document_id)['nom'];
51 51 */
52   - return $this->type_document->nom == 'DEVIS';
  52 + return strtoupper(trim($this->type_document->nom)) == 'DEVIS';
53 53 }
54 54  
55 55 }
... ...
src/Model/Entity/Materiel.php
... ... @@ -151,7 +151,7 @@ class Materiel extends Entity {
151 151 //protected function _getIsCreated() { return $this->_fields['status'] == 'CREATED'; }
152 152 protected function _getIsCreated() { return $this->status == 'CREATED'; }
153 153 //return $this->status == 'CREATED';
154   - protected function _getIsOrdered() { return $this->status == 'TOBEORDERED'; }
  154 + protected function _getIsTobeordered() { return $this->status == 'TOBEORDERED'; }
155 155 protected function _getIsValidated() { return $this->status == 'VALIDATED'; }
156 156 //protected function _getIsValidated() { return $this->_fields['status'] == 'VALIDATED'; }
157 157 //public function is_tobearchived() { return $this->status == 'TOBEARCHIVED'; }
... ... @@ -161,7 +161,7 @@ class Materiel extends Entity {
161 161 public function getNiceStatus() {
162 162 //if ($this->is_created) return 'À VALIDER';
163 163 if ($this->is_created) return 'CRÉÉ - à valider';
164   - if ($this->is_ordered) return 'EN COMMANDE - à valider';
  164 + if ($this->is_tobeordered) return 'EN COMMANDE - à valider';
165 165 if ($this->is_validated) return 'VALIDÉ';
166 166 if ($this->is_tobearchived) return 'À SORTIR';
167 167 //if ($this->is_archived)
... ...
src/Model/Table/DocumentsTable.php
... ... @@ -287,11 +287,14 @@ class DocumentsTable extends AppTable
287 287 '[repository]' => 'Documents'
288 288 }
289 289 */
  290 + /* (EP 2021 09) désactivé, sert à rien et fait buguer !
290 291 // Si photo, set type_document_id = photo
291 292 if ( in_array($extension, $this->photo_formats) ) {
292 293 if ( $entity->get('type_document_id')==1 )
293 294 $entity->set('type_document_id', 4);
294 295 }
  296 + */
  297 +
295 298 return true;
296 299 }
297 300  
... ...
src/Model/Table/MaterielsTable.php
... ... @@ -947,11 +947,17 @@ class MaterielsTable extends AppTable
947 947 // Champs spéciaux dont le caractère obligatoire est géré indirectement (via beforeSave())
948 948 // (fournisseur_id, et autres champs ajoutés dans l'avenir ? ...)
949 949 if ($fname=='fournisseur_id') continue;
  950 +
  951 + // Champs virtuels (n'existent pas physiquement)
  952 + if (strtoupper($fname)=='DEVIS') continue;
950 953  
951 954 $validator->allowEmptyString($fname, false, 'Ce champ doit être rempli');
  955 +
952 956 }
953 957  
954 958 }
  959 +
  960 +
955 961  
956 962 public function validationLOT1(Validator $validator)
957 963 {
... ...
src/Template/Materiels/index.ctp
... ... @@ -44,6 +44,9 @@ $SELECTED_STATUS = isset($SELECTED_STATUS) ? $SELECTED_STATUS : null;
44 44  
45 45 // - Constants :
46 46  
  47 +$HAS_ORDER_BUTTON = $HAS_ORDER_BUTTON;
  48 +
  49 +
47 50 // - User status:
48 51 $role = $role;
49 52 $username = $username;
... ... @@ -192,7 +195,7 @@ $displayExportCurrentButton = function($params, $html) {
192 195  
193 196  
194 197  
195   -$displayStatusButtons = function($SELECTED_STATUS, $params, $nbMateriels, $statuses_color, $html) {
  198 +$displayStatusButtons = function($HAS_ORDER_BUTTON, $SELECTED_STATUS, $params, $nbMateriels, $statuses_color, $html) {
196 199 ?>
197 200 <div class="actions" style="width: 100%; float: none; padding: 0 0;">
198 201 <?php
... ... @@ -223,12 +226,13 @@ $displayStatusButtons = function($SELECTED_STATUS, $params, $nbMateriels, $statu
223 226  
224 227 $statuses = [
225 228 'TOUS' => [$b_all, 'TOUS', 'Tous les matériels', 5],
226   - 'CREATED' => [$b_cre, 'À VALIDER', 'Seulement les matériels créés (à valider)', 5],
227   - 'TOBEORDERED' => [$b_cre, 'EN COMMANDE', 'Seulement les matériels commandés (à valider)', 5],
228   - 'VALIDATED' => [$b_val, 'VALIDÉS', "Seulement les matériels validés", 5],
229   - 'TOBEARCHIVED' => [$b_toarc, 'À SORTIR', "Seulement les matériels à archiver", 5],
230   - 'ARCHIVED' => [$b_arc, 'ARCHIVÉS', "Seulement les matériels sortis de l'inventaire", 0],
  229 + 'CREATED' => [$b_cre, 'À VALIDER', 'Seulement les matériels créés (à valider)', 5]
231 230 ];
  231 + if ($HAS_ORDER_BUTTON) $statuses['TOBEORDERED'] = [$b_cre, 'EN COMMANDE', 'Seulement les matériels commandés (à valider)', 5];
  232 + $statuses['VALIDATED'] = [$b_val, 'VALIDÉS', "Seulement les matériels validés", 5];
  233 + $statuses['TOBEARCHIVED'] = [$b_toarc, 'À SORTIR', "Seulement les matériels à archiver", 5];
  234 + $statuses['ARCHIVED'] = [$b_arc, 'ARCHIVÉS', "Seulement les matériels sortis de l'inventaire", 0];
  235 +
232 236 // https://book.cakephp.org/3/en/views/helpers/html.html#creating-links
233 237 foreach ($statuses as $status=>$status_params) {
234 238 $i=-1;
... ... @@ -637,7 +641,7 @@ echo $this-&gt;Html-&gt;link(&#39;&lt;i class=&quot;icon-plus&quot;&gt;&lt;/i&gt; Nouveau Matériel&#39;, [
637 641 echo '</p>';*/
638 642 //if ($USER_IS_ADMIN_OR_MORE) $displayExportCurrentButton($SELECTED_STATUS, $params, $nbMateriels, $this->Html);
639 643  
640   -if ($USER_IS_ADMIN_OR_MORE) $displayStatusButtons($SELECTED_STATUS, $params, $nbMateriels, $statuses_color, $this->Html);
  644 +if ($USER_IS_ADMIN_OR_MORE) $displayStatusButtons($HAS_ORDER_BUTTON, $SELECTED_STATUS, $params, $nbMateriels, $statuses_color, $this->Html);
641 645 //</div>
642 646  
643 647  
... ...
src/Template/Materiels/view.ctp
... ... @@ -51,6 +51,7 @@ $IS_TOBEARCHIVED = $IS_TOBEARCHIVED;
51 51 $IS_ARCHIVED = $IS_ARCHIVED;
52 52  
53 53 // - User capabilities on materiel (from Controller) :
  54 +$HAS_ORDER_BUTTON = $HAS_ORDER_BUTTON;
54 55 $CAN_ORDER = $CAN_ORDER;
55 56 $CAN_VALIDATE = $CAN_VALIDATE;
56 57 $CAN_INVALIDATE = $CAN_INVALIDATE;
... ... @@ -463,7 +464,7 @@ $CAN_PRINT_LABEL = $IS_VALIDATED &amp;&amp; $configuration-&gt;hasPrinter &amp;&amp; $USER_IS_ADMIN
463 464 // - CREATED :
464 465  
465 466 // Bouton COMMANDER
466   - if ($CAN_ORDER) $echoActionButton($this->Html, 'icon-ok-sign', $bStyle2Red, ' Commander', '', 'statusTobeordered', $entity->id, ['view'], "Demander la commande de ce matériel)");
  467 + if ($HAS_ORDER_BUTTON && $CAN_ORDER) $echoActionButton($this->Html, 'icon-ok-sign', $bStyle2Red, ' Commander', '', 'statusTobeordered', $entity->id, ['view'], "Demander la commande de ce matériel)");
467 468  
468 469 // Bouton VALIDER
469 470 if ($CAN_VALIDATE) $echoActionButton($this->Html, 'icon-ok-sign', $bStyle2Red, ' Valider (=livré)', '', 'statusValidated', $entity->id, ['view'], "Valider ce matériel (le déclarer comme étant livré)");
... ... @@ -940,7 +941,7 @@ $CAN_PRINT_LABEL = $IS_VALIDATED &amp;&amp; $configuration-&gt;hasPrinter &amp;&amp; $USER_IS_ADMIN
940 941 <div id="emprunts" style="margin-bottom: 20px;">
941 942  
942 943 <?php
943   - if (empty($entity->emprunts))
  944 + if (empty($entity->emprunts))
944 945 echo 'Aucun emprunt pour ce matériel.';
945 946  
946 947 else {
... ... @@ -1085,7 +1086,14 @@ $CAN_PRINT_LABEL = $IS_VALIDATED &amp;&amp; $configuration-&gt;hasPrinter &amp;&amp; $USER_IS_ADMIN
1085 1086 <span style="text-decoration: underline;">Fichier(s) lié(s) au matériel (<?=$nbFic?>)</span>
1086 1087 </h3>
1087 1088 <div id="fichiers" style="margin-bottom: 20px;">
1088   - <?php if ($nbFic != 0) { ?>
  1089 +
  1090 + <?php
  1091 + if ($nbFic == 0)
  1092 + echo 'Aucun document attaché pour ce matériel.';
  1093 +
  1094 + else {
  1095 + ?>
  1096 +
1089 1097 <table>
1090 1098 <tr>
1091 1099 <th class="actions"><?=__('')?></th>
... ... @@ -1193,7 +1201,7 @@ $CAN_PRINT_LABEL = $IS_VALIDATED &amp;&amp; $configuration-&gt;hasPrinter &amp;&amp; $USER_IS_ADMIN
1193 1201 endforeach;
1194 1202 ?>
1195 1203 </table>
1196   - <?php } else echo 'Aucun fichier pour ce matériel.'; ?>
  1204 + <?php } ?>
1197 1205 </div>
1198 1206 <!-- FIN FICHIERS liés -->
1199 1207  
... ...