Commit 557e98840432eaf5033e956cb4380b46be47d12f
1 parent
d6da8a54
Exists in
master
and in
1 other branch
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
Showing
12 changed files
with
176 additions
and
38 deletions
Show diff stats
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
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->Html->link('<i class="icon-plus"></i> Nouveau Matériel', [ |
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 && $configuration->hasPrinter && $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 && $configuration->hasPrinter && $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 && $configuration->hasPrinter && $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 && $configuration->hasPrinter && $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 | ... | ... |