Commit f18c8ee2f9dc7b00007efbdc5a3982a0a6fa1f6f

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

Amélioration du fichier de config des champs matériels

(généralisation pour les docs attachés et champs recommandés)

=> on peut maintenant préciser, à chaque étape, TOUT type important de
doc attaché (devis, BC, BL, facture) comme étant obligatoire ou non
modifiable ni supprimable

=> on peut maintenant donner, à chaque étape, une liste de champs
"recommandés" (mais non obligatoires)

v5.2.21-3.7.9
CHANGELOG
... ... @@ -352,24 +352,34 @@ Commencer à implémenter le nouveau workflow v5 :
352 352  
353 353 ======= TODO =======
354 354  
  355 + PRIO :
  356 + - vincent (changer nom doc)
  357 + - config via page web !!!
  358 + - tests ok
  359 +
  360 +
355 361 *) SUPERADMIN
356 362 => par défaut, au minimum, mêmes droits que ADMIN
357 363 => mais il peut avoir des droits EN PLUS (jamais en moins)
358   - Donc, en fait, ADMIN = SUPERADMIN (mais superadmin peut éventuellemet faire encore plus de choses)
  364 + Donc, en fait, SUPERADMIN = ADMIN (mais superadmin peut éventuellemet faire encore plus de choses)
359 365 (SUPERADMIN = ADMIN++) (SUPERADMIN >= ADMIN)
360 366  
361   - *) Uneditable fields : (except ADMIN) (except OWNER ???) (ADMIN = ADMIN + SUPERADMIN) (except RESP, ADMIN) (ADMINONLY = seulement admin, pas superadmin)
362   - => User (proprio) peut modifier SA fiche même APRÈS commande (mais seulement quelques champs)
363   - => update matos lifecycle diag
  367 + *) config champs matos : ajouter HIDDEN_FIELDS (sauf admin) :
  368 + - section administrative
  369 + - status
  370 + - numéro inventaire (hidden par défaut pour l'édition)
  371 + - ...
  372 +
  373 +
  374 + *) => update matos lifecycle diag
364 375  
365 376 *) Vincent :
366   - - nom acheteur doit être modifiable pour admin+ (c'est lui par défaut mais peut modif, et après coup aussi, en édition)
367 377 - (admin) supprimer photo d'un matos validé
368 378 - j'ai lié un mauvaise photo à un matériel déjà validé.
369 379 Je souhaiterais la supprimer mais le matériel étant validé, je n'ai pas l'autorisation.
370 380 - email pas trouvé (ancienne fiche de vincent)
371 381 - photos :
372   - - "nom" => "nom du doc"
  382 + - "nom" => "nom du doc"
373 383 - et doit être modifiable !
374 384  
375 385 *) Gérer categ/s-categ plus facilement
... ... @@ -383,17 +393,15 @@ Commencer à implémenter le nouveau workflow v5 :
383 393 *) qqsoit user : doit pouvoir voir sa fiche user (no modif)
384 394  
385 395 *) TESTS !!!!
386   -
387   - *) Trop de mails envoyés !!
  396 + *) Les tests doivent se faire avec la config par défaut (et non pas celle spécifique du labo)
  397 + *) Ajouter test Commande (avec devis joint !)
388 398  
389 399 *) Validation multiple ne marche plus
390 400  
391 401 *) Mail "[LabInvent] Ajout de matériel(s)" => c'est quoi ? ==> voir message de log associé
392 402 (quelle diff avec "[LabInvent] Ajout d'un matériel" ??)
393 403  
394   - *) Les tests doivent se faire avec la config par défaut (et non pas celle spécifique du labo)
395 404  
396   - *) Ajouter test Commande (avec devis joint !)
397 405  
398 406 *) Stats de connexion
399 407 - le tri des autres colonnes ne marche plus
... ... @@ -413,6 +421,7 @@ Commencer à implémenter le nouveau workflow v5 :
413 421 *)
414 422 validation (=livré ET payé)
415 423 Facture jointe (si > 10K)
  424 + Détail lieu stockage + S/N demandé ssi > 10K€
416 425  
417 426  
418 427  
... ... @@ -425,11 +434,6 @@ Commencer à implémenter le nouveau workflow v5 :
425 434 - Réactiver une variable : OFF_nom_du_champ => nom_du_champ
426 435  
427 436  
428   - *)
429   - Détail lieu stockage + S/N demandé ssi > 10K€
430   -
431   -
432   -
433 437 *)
434 438 Procédures pour les utilisateurs et les gestionnaires désormais configurable via le fichier de conf
435 439  
... ... @@ -461,6 +465,12 @@ Commencer à implémenter le nouveau workflow v5 :
461 465 ======= CHANGES =======
462 466  
463 467 -------
  468 +27/10/2021 v5.2.21-3.7.9
  469 + - (i) Amélioration du fichier de config des champs matériels (généralisation pour les docs attachés et champs recommandés)
  470 + => on peut maintenant préciser, à chaque étape, TOUT type important de doc attaché (devis, BC, BL, facture) comme étant obligatoire ou non modifiable ni supprimable
  471 + => on peut maintenant donner, à chaque étape, une liste de champs "recommandés" (mais non obligatoires)
  472 +
  473 +-------
464 474 25/10/2021 v5.2.20-3.7.9
465 475 - (b) Bugfix champ acheteur doit être non modifiable par role "Utilisateur"
466 476 - (i) Amélioré config des champs matériel obligatoires et readonly
... ...
README.md
... ... @@ -52,9 +52,8 @@ Logiciel testé et validé sur les configurations suivantes :
52 52  
53 53 --------------------------------------------------------------------------------------------
54 54  
55   -Date: 25/10/2021
56   -Version: v5.2.20-3.7.9
57   -
  55 +Date: 27/10/2021
  56 +Version: v5.2.21-3.7.9
58 57  
59 58  
60 59 HISTORIQUE DES CHANGEMENTS DE VERSION : voir le fichier CHANGES.txt (ou la page web /pages/changes)
... ... @@ -74,7 +73,7 @@ IMPORTANT :
74 73 ...
75 74 ],
76 75  
77   -Version majeure en cours : 3.7 (ou 2.14) (https://projects.irap.omp.eu/versions/222)
  76 +Version majeure en cours : 5.2 avec CakePhp 3.7.9 (https://projects.irap.omp.eu/versions/222)
78 77  
79 78 ROADMAP: https://projects.irap.omp.eu/projects/inventirap/roadmap
80 79  
... ...
config/app_labinvent_mandatory_fields.default.yml
  1 +# FICHIER DE CONFIGURATION PAR DÉFAUT POUR LES CHAMPS D'UN MATÉRIEL
  2 +
1 3  
2 4 # Activer la possibilité de commander un matériel (au service gestion) en cliquant sur un bouton "Commander" ?
3 5 # L'étape "A commander" (status TOBEORDERED) devient alors une étape intermédiaire OPTIONNELLE entre CREATED et VALIDATED
... ... @@ -106,9 +108,9 @@ UNEDITABLE_FIELDS:
106 108  
107 109 # Champs OBLIGATOIRES pour CRÉER une fiche Matériel
108 110 # - Aucun champ
109   -#MANDATORY_FIELDS_BEFORE_LOT0: []
  111 +#MANDATORY_FIELDS_FOR_LOT0: []
110 112 # - Au moins un champ
111   -MANDATORY_FIELDS_BEFORE_LOT0:
  113 +MANDATORY_FIELDS_FOR_LOT0:
112 114  
113 115 # Infos toujours obligatoires (cachées car calculées automatiquement)
114 116 #'status',
... ... @@ -219,6 +221,12 @@ UNEDITABLE_FIELDS_AFTER_LOT0: []
219 221 #- numero_inventaire_old (sauf Administration)
220 222  
221 223  
  224 +# Champs NON OBLIGATOIRES MAIS FORTEMENT RECOMMANDÉS APRÈS COMMANDE
  225 +# Ces champs ne seront pas demandés à la saisie, mais un simple rappel sera affiché sur la vue détaillée du matériel (tant que ces éléments sont absents)
  226 +# Attention, les champs RECOMMENDED_FIELDS_XXX définis plus haut sont aussi pris en compte (donc, inutile de les répéter)
  227 +# - Aucun champ
  228 +RECOMMENDED_FIELDS_AFTER_LOT0: []
  229 +
222 230  
223 231  
224 232  
... ... @@ -233,9 +241,9 @@ UNEDITABLE_FIELDS_AFTER_LOT0: []
233 241 # Champs OBLIGATOIRES POUR passer la COMMANDE (La commande est une action optionnelle)
234 242 # Attention, les champs MANDATORY_FIELDS_XXX définis plus haut sont aussi pris en compte (donc, inutile de les répéter)
235 243 # - Aucun champ
236   -#MANDATORY_FIELDS_BEFORE_LOT1: []
  244 +#MANDATORY_FIELDS_FOR_LOT1: []
237 245 # - Au moins un champ
238   -MANDATORY_FIELDS_BEFORE_LOT1:
  246 +MANDATORY_FIELDS_FOR_LOT1:
239 247  
240 248 # Infos toujours obligatoires (cachées car calculées automatiquement)
241 249 #'status',
... ... @@ -284,7 +292,11 @@ MANDATORY_FIELDS_BEFORE_LOT1:
284 292 # - EOTP : obligatoire seulement dans LOT2
285 293  
286 294 # - Devis joint : c'est un champ virtuel, il n'existe pas physiquement (sauf dans la table Documents)
287   - DEVIS: 'Devis'
  295 + DOC_DEVIS: 'Devis'
  296 + #DOC_BC: "Bon de Commande"
  297 + #DOC_BL: "Bon de Livraison"
  298 + #DOC_FACTURE: "Facture"
  299 +
288 300  
289 301 # ******* END OF MANDATORY_FIELDS_LOT1 ********
290 302  
... ... @@ -309,7 +321,7 @@ UNEDITABLE_FIELDS_AFTER_LOT1:
309 321 # On ne devrait pas pouvoir changer la NATURE du bien
310 322 # Domaine & Catégorie
311 323 - sur_categorie_id (sauf Administration) # Domaine
312   - - categorie_id (sauf Administration) # Catégorie
  324 + - categorie_id (sauf Administration) # Catégorie
313 325 #- sous_categorie_id
314 326  
315 327 #- groupes_thematique_id
... ... @@ -366,11 +378,20 @@ UNEDITABLE_FIELDS_AFTER_LOT1:
366 378 # Utilisé par la Gestion pour remplir le champ eotp
367 379 - budgets (sauf Administration)
368 380  
369   - # Devis (CHAMPS VIRTUEL)
370   - # C'est un champ virtuel, il n'existe pas physiquement (sauf dans la table Documents)
  381 +
  382 + # #### CHAMPS VIRTUELS : doc attachés ####
  383 + # Ces champs virtuels n'existent pas physiquement (sauf dans la table Documents)
  384 + # On indique ici les documents attachés à la fiche matériel, qui ne peuvent plus être ni modifiés ni supprimés
  385 + # - Devis
371 386 # Le devis attaché au matériel commandé n'est ni modifiable ni supprimable
372   - # (TODO) Non encore configurable : cet aspect est encore géré "en dur" dans le code source
373   - - DEVIS
  387 + - DOC_DEVIS
  388 + # - Bon de Commande (si un BC a été joint à la fiche, on ne peut plus le modifier ni le supprimer)
  389 + - DOC_BC (sauf Administration)
  390 + # - Bon de Livraison
  391 + #- DOC_BL
  392 + # - Facture
  393 + #- DOC_FACTURE
  394 +
374 395  
375 396 # #### CHAMPS ADMINISTRATIFS : ####
376 397 #- eotp (sauf Administration)
... ... @@ -381,6 +402,15 @@ UNEDITABLE_FIELDS_AFTER_LOT1:
381 402  
382 403  
383 404  
  405 +# Champs NON OBLIGATOIRES MAIS FORTEMENT RECOMMANDÉS APRÈS COMMANDE
  406 +# Ces champs ne seront pas demandés à la saisie, mais un simple rappel sera affiché sur la vue détaillée du matériel (tant que ces éléments sont absents)
  407 +# Attention, les champs RECOMMENDED_FIELDS_XXX définis plus haut sont aussi pris en compte (donc, inutile de les répéter)
  408 +# - Aucun champ
  409 +RECOMMENDED_FIELDS_AFTER_LOT1: []
  410 +#RECOMMENDED_FIELDS_AFTER_LOT1:
  411 + # - Etiquette posée sur le matériel
  412 + #etiquette: "d'imprimer l'étiquette associée et de la coller sur le matériel"
  413 +
384 414  
385 415  
386 416  
... ... @@ -395,9 +425,9 @@ UNEDITABLE_FIELDS_AFTER_LOT1:
395 425 # Champs OBLIGATOIRES POUR VALIDER la livraison
396 426 # Attention, les champs MANDATORY_FIELDS_XXX définis plus haut sont aussi pris en compte (donc, inutile de les répéter)
397 427 # - Aucun champ
398   -#MANDATORY_FIELDS_BEFORE_LOT2: []
  428 +#MANDATORY_FIELDS_FOR_LOT2: []
399 429 # - Au moins un champ
400   -MANDATORY_FIELDS_BEFORE_LOT2:
  430 +MANDATORY_FIELDS_FOR_LOT2:
401 431  
402 432 #//'fournisseur_id' => 'Fournisseur',
403 433 #//'fournisseur' => 'Fournisseur',
... ... @@ -420,19 +450,44 @@ MANDATORY_FIELDS_BEFORE_LOT2:
420 450  
421 451 numero_commande: 'Num. BC'
422 452  
  453 + # Docs attachés obligatoires pour valider
  454 + #DOC_DEVIS: 'Devis'
  455 + #DOC_BC: "Bon de Commande"
  456 + #DOC_BL: "Bon de Livraison"
  457 + #DOC_FACTURE: "Facture"
  458 +
  459 +
  460 + # ******* END OF $MANDATORY_FIELDS_LOT2 ********
  461 +
  462 +
  463 +
  464 +
  465 +# Champs NON OBLIGATOIRES MAIS FORTEMENT RECOMMANDÉS APRÈS VALIDATION de la livraison
  466 +# Ces champs ne seront pas demandés à la saisie, mais un simple rappel sera affiché sur la vue détaillée du matériel (tant que ces éléments sont absents)
  467 +# Attention, les champs RECOMMENDED_FIELDS_XXX définis plus haut sont aussi pris en compte (donc, inutile de les répéter)
  468 +# - Aucun champ
  469 +#RECOMMENDED_FIELDS_AFTER_LOT2: []
  470 +# - Au moins un champ
  471 +RECOMMENDED_FIELDS_AFTER_LOT2:
423 472  
424   - # #### CHAMPS NON OBLIGATOIRES MAIS FORTEMENT RECOMMANDÉS ####
425   - # Ces champs ne seront pas demandés à la saisie, mais un simple rappel sera affiché sur la vue détaillée du matériel
426 473  
427 474 # - Etiquette posée sur le matériel
428   - etiquette: 'Etiquette posée'
  475 + etiquette: "d'imprimer l'étiquette associée et de la coller sur le matériel"
429 476  
430 477 # - Numéro inventaire tutelles
431   - # On ne peut pas exiger ce numéro au moment de la livraison
  478 + # On aurait pu rendre cet élément obligatoire mais on ne peut pas l'exiger au moment de la livraison
432 479 # car le gestionnaire n'a cette info que lorsque "Service fait CNRS" (il récupère alors le n° inventaire "Tutelle" sur GESLAB)
433   - numero_inventaire_organisme: "N° inventaire de l'organisme"
  480 + numero_inventaire_organisme: "de renseigner le champ 'N° inventaire comptable/tutelles (Organisme)'"
  481 +
  482 +
  483 + # DOCS ATTACHÉS recommandés après validation
  484 + #DOC_DEVIS: "d'ajouter un Devis"
  485 + DOC_BC: "d'ajouter le Bon de Commande"
  486 + DOC_BL: "d'ajouter le Bon de Livraison"
  487 + DOC_FACTURE: "d'ajouter la Facture"
  488 +
434 489  
435   - # ******* END OF $MANDATORY_FIELDS_LOT2 ********
  490 +
436 491  
437 492  
438 493 # Liste des champs qui sont NON MODIFIABLES APRÈS la VALIDATION (livraison)
... ... @@ -518,6 +573,16 @@ UNEDITABLE_FIELDS_AFTER_LOT2:
518 573 #- numero_inventaire_old
519 574  
520 575  
  576 + # DOCS ATTACHÉS qui ne sont plus ni supprimables ni modifiables
  577 + # - Devis
  578 + #- DOC_DEVIS
  579 + # - Bon de Commande
  580 + - DOC_BC
  581 + # - Bon de Livraison
  582 + - DOC_BL
  583 + # - Facture
  584 + - DOC_FACTURE
  585 +
521 586  
522 587  
523 588  
... ... @@ -528,7 +593,7 @@ UNEDITABLE_FIELDS_AFTER_LOT2:
528 593 # (TODO) Ce 3e niveau n'est pas encore implémenté, il est pour l'instant codé en dur dans le code
529 594  
530 595 # - Aucun champ
531   -MANDATORY_FIELDS_BEFORE_LOT3: []
  596 +MANDATORY_FIELDS_FOR_LOT3: []
532 597  
533 598 # - Aucun champ
534 599 UNEDITABLE_FIELDS_AFTER_LOT3: []
... ...
src/Controller/AppController.php
... ... @@ -2711,6 +2711,7 @@ class AppController extends Controller
2711 2711 // Toutes les autres actions
2712 2712 !$this->getCurrentEntity()->getErrors()
2713 2713 ) {
  2714 + // On notifie cette action (sauf si CANCELLED)
2714 2715 //if ($this->ACTION_CANCELLED) { debug("CANCELLED"); exit; }
2715 2716 if ($this->ACTION_CANCELLED) return;
2716 2717 $emails = $this->sendNotificationForEntityAction();
... ... @@ -3419,7 +3420,7 @@ class AppController extends Controller
3419 3420 //$DEBUG = true;
3420 3421  
3421 3422 $control = $this->getName();
3422   - //debug($control); exit;
  3423 + //debug($control); //exit;
3423 3424  
3424 3425 // Entité (Entity)
3425 3426 //$entity_nice_name = $this->getNiceName(); // matériel, domaine, utilisateur...
... ... @@ -3436,6 +3437,7 @@ class AppController extends Controller
3436 3437 // Action
3437 3438 //$action = $this->request->getAttribute('params')['action']; // add or edit or delete or ...
3438 3439 $action = $this->a;
  3440 + //debug($action); exit;
3439 3441  
3440 3442 // Cas particulier pour un Document, on veut aussi son type (bon commande, bon livraison, ...)
3441 3443 if ($entity instanceof Document) {
... ...
src/Controller/DocumentsController.php
... ... @@ -573,17 +573,18 @@ class DocumentsController extends AppController
573 573  
574 574 if ($PARENT_IS_MATOS) {
575 575  
576   - $materiel = $this->Documents->Materiels->get($parent_id);
577   -
  576 + // Si le type du document à modifier est readonly (pour le user courant) => action refusée
  577 + $CANNOT_EDIT_ERROR_MSG = $this->_isReadonlyDocTypeForMaterielStatusAndCurrentUser($document, $parent_id);
578 578 /* ATTENTION, règles de gestion complexes :
579 579 * (1) => On ne doit pas pouvoir (modifier ou) supprimer un DEVIS associé à un matériel de status TOBEORDERED (commandé)
580 580 * (2) => On ne doit pouvoir (modifier ou) supprimer AUCUN document associé à un matériel de status VALIDATED (validé)
581 581 */
582   - $CANNOT_EDIT_ERROR_MSG = '';
  582 + /*
583 583 // (Règle 1)
584 584 if ($materiel->is_tobeordered && $document->is_devis) $CANNOT_EDIT_ERROR_MSG = "Ce matériel est en Commande, vous ne pouvez donc pas modifier son devis";
585 585 // (Règle 2)
586 586 elseif ($materiel->is_validated_or_more) $CANNOT_EDIT_ERROR_MSG = "Ce matériel est Validé, vous ne pouvez donc modifier aucun document associé";
  587 + */
587 588 if ($CANNOT_EDIT_ERROR_MSG) {
588 589 $this->Flash->error(__($CANNOT_EDIT_ERROR_MSG));
589 590 $this->ACTION_CANCELLED = TRUE;
... ... @@ -675,18 +676,19 @@ class DocumentsController extends AppController
675 676  
676 677 if ($DOC_IS_ATTACHED_TO_A_MATERIEL) {
677 678  
678   - $materiel = $this->Documents->Materiels->get($parent_id);
679   -
  679 + // Si le type du document à supprimer est readonly (pour le user courant) => action refusée
  680 + $CANNOT_DELETE_ERROR_MSG = $this->_isReadonlyDocTypeForMaterielStatusAndCurrentUser($document, $parent_id);
680 681 /* ATTENTION, règles de gestion complexes :
681 682 * (1) => On ne doit pas pouvoir (sauf admin+) modifier ou supprimer un DEVIS associé à un matériel de status TOBEORDERED (commandé)
682 683 * (2) => On ne doit pouvoir (sauf admin+) modifier ou supprimer AUCUN document associé à un matériel de status VALIDATED (validé)
683 684 */
  685 + /*
684 686 //if ( ! $this->USER_IS_ADMIN_OR_MORE() ) {
685   - $CANNOT_DELETE_ERROR_MSG = '';
686 687 // (Règle 1)
687 688 if ($materiel->is_tobeordered && $document->is_devis) $CANNOT_DELETE_ERROR_MSG = "Ce matériel est en Commande, vous ne pouvez donc pas supprimer son devis";
688 689 // (Règle 2)
689 690 elseif ($materiel->is_validated_or_more) $CANNOT_DELETE_ERROR_MSG = "Ce matériel est Validé, vous ne pouvez donc supprimer aucun document associé";
  691 + */
690 692 if ($CANNOT_DELETE_ERROR_MSG) {
691 693 $this->Flash->error(__($CANNOT_DELETE_ERROR_MSG));
692 694 $this->ACTION_CANCELLED = TRUE;
... ... @@ -703,7 +705,7 @@ class DocumentsController extends AppController
703 705 $materielTable = TableRegistry::getTableLocator()->get('Materiels');
704 706 $materiel = $materielTable->get($document->materiel_id);
705 707 */
706   -
  708 + $materiel = $this->Documents->Materiels->get($parent_id);
707 709 $materiel->photo_id = null;
708 710 $this->Documents->Materiels->save($materiel);
709 711 //$materiel->set('photo_id', null);
... ... @@ -741,6 +743,25 @@ class DocumentsController extends AppController
741 743 }
742 744  
743 745  
  746 + // return true => si le type du document à modifier est readonly (pour le user courant)
  747 + private function _isReadonlyDocTypeForMaterielStatusAndCurrentUser($document, $parent_id) {
  748 + $materiel = $this->Documents->Materiels->get($parent_id);
  749 + // Si le type du document à modifier est readonly (pour le user courant) => action refusée
  750 + $CANNOT_EDIT_ERROR_MSG = '';
  751 + $materiel_readonly_fields = (new MaterielsController())->getUneditableFieldsForMaterielStatusAndCurrentUser($materiel->status);
  752 + //$materiel_readonly_fields = $this->Documents->Materiels->getUneditableFieldsForMaterielStatus($materiel->status);
  753 + //debug($document);//exit;
  754 + //debug($materiel_readonly_fields);
  755 + foreach (array_keys($materiel_readonly_fields) as $fname) {
  756 + // DOC_DEVIS, DOC_BC, ...
  757 + if ( (substr($fname,0,4) == 'DOC_') && $document->isOfType($fname) ) {
  758 + $matos_status = $materiel->getNiceStatus();
  759 + $doc_type = strtoupper($document->type_document->nom);
  760 + $CANNOT_EDIT_ERROR_MSG = "Ce matériel a le statut '$matos_status', vous ne pouvez donc pas modifier (ni supprimer) son document attaché de type '$doc_type'";
  761 + }
  762 + }
  763 + return $CANNOT_EDIT_ERROR_MSG;
  764 + }
744 765  
745 766  
746 767 private function _setViewForDomPdf($filename) {
... ...
src/Controller/MaterielsController.php
... ... @@ -1590,6 +1590,7 @@ class MaterielsController extends AppController {
1590 1590 // 2) HasMany
1591 1591  
1592 1592 'Documents',
  1593 + 'Documents.TypeDocuments',
1593 1594 'Emprunts',
1594 1595 // Tous les suivis de ce $materiel (sans leur type)
1595 1596 //'Suivis',
... ... @@ -1601,6 +1602,7 @@ class MaterielsController extends AppController {
1601 1602  
1602 1603 $this->e = $materiel;
1603 1604 $e = $materiel;
  1605 + //debug($materiel);
1604 1606  
1605 1607 // current user
1606 1608 $u = $this->u;
... ... @@ -1892,11 +1894,11 @@ class MaterielsController extends AppController {
1892 1894 //debug($emails);
1893 1895  
1894 1896 /*
1895   - * Si le materiel est VALIDATED (et que les champs suivants sont obligatoires) :
1896   - * - l'étiquette doit être imprimée (et collée)
1897   - * - le n° inventaire tutelles doit être renseigné
1898   - * Si ça n'est pas le cas, on affiche un message de rappel sur cette vue détaillée
  1897 + * Pour le statut courant du matériel ("créé", "en commande", "validé", "archivé"...),
  1898 + * si il est recommandé (dans la config des champs matériel) de remplir certains champs ou de joindre certains documents (ou de coller l'étiquette)...,
  1899 + * on affiche un message de rappel (flash) en-tête de la fiche détaillée du matériel
1899 1900 */
  1901 + /*
1900 1902 $LABEL_NOT_PRINTED = false;
1901 1903 $NUM_INV_TUTELLES_NOT_FILLED = false;
1902 1904 if ($entity->is_validated) {
... ... @@ -1909,6 +1911,35 @@ class MaterielsController extends AppController {
1909 1911 if ($LABEL_NOT_PRINTED) $this->Flash->set("Cette fiche est validée mais n'oubliez pas d'imprimer l'étiquette associée et de la coller sur le matériel");
1910 1912 if ($NUM_INV_TUTELLES_NOT_FILLED) $this->Flash->set("Cette fiche est validée mais vous n'avez pas encore rempli le champ 'N° inventaire comptable/tutelles'");
1911 1913 }
  1914 + */
  1915 + $recommended_fields = $this->Materiels->getRecommendedFieldsForMaterielStatus($materiel->status);
  1916 + foreach ($recommended_fields as $fname => $msg) {
  1917 +
  1918 + //debug($fname);
  1919 + // - Documents attachés (champs virtuels)
  1920 + // DOC_DEVIS, DOC_BC, ...
  1921 + if ( substr($fname,0,4) == 'DOC_' ) {
  1922 + if ($entity->hasAttachedDocOfType($fname)) unset($recommended_fields[$fname]);
  1923 + }
  1924 +
  1925 + // - Champs réels
  1926 + else {
  1927 + // Champ spécial "etiquette" => boolean
  1928 + if ($fname == 'etiquette' && $CAN_PRINT_LABEL) {
  1929 + if ($entity->$fname) unset($recommended_fields[$fname]);
  1930 + }
  1931 + // Tous les autres champs réels
  1932 + else {
  1933 + if (!empty($entity->$fname)) unset($recommended_fields[$fname]);
  1934 +
  1935 + }
  1936 + }
  1937 +
  1938 + }
  1939 + // Les champs restants sont les champs manquants => message flash de rappel
  1940 + foreach ($recommended_fields as $fname => $reminder_msg)
  1941 + $this->Flash->set("Ce matériel est '".$entity->getNiceStatus()."' mais n'oubliez pas $reminder_msg");
  1942 +
1912 1943  
1913 1944 } // view
1914 1945  
... ... @@ -2206,11 +2237,11 @@ class MaterielsController extends AppController {
2206 2237  
2207 2238 /*
2208 2239 // Attributs obligatoires pour la phase COMMANDE
2209   - //$LOT1 = $this->Materiels->MANDATORY_FIELDS_BEFORE_LOT1;
  2240 + //$LOT1 = $this->Materiels->MANDATORY_FIELDS_FOR_LOT1;
2210 2241 $LOT1 = $this->Materiels->getMandatoryFieldsForLot(1);
2211 2242  
2212 2243 // Attributs obligatoires pour la phase VALIDATION (livré et payé)
2213   - //$LOT2 = $this->Materiels->MANDATORY_FIELDS_BEFORE_LOT2;
  2244 + //$LOT2 = $this->Materiels->MANDATORY_FIELDS_FOR_LOT2;
2214 2245 $LOT2 = $this->Materiels->getMandatoryFieldsForLot(2);
2215 2246  
2216 2247 //TODO 202109
... ... @@ -2235,22 +2266,23 @@ class MaterielsController extends AppController {
2235 2266  
2236 2267 // On vérifie que les infos obligatoires sont présentes
2237 2268 // Si au moins un champ obligatoire est nul ou vide => ERROR
2238   - $ALL_MANDATORY_FIELDS_BEFORE_GIVEN = true;
  2269 + $ALL_MANDATORY_FIELDS_FOR_GIVEN = true;
2239 2270 //foreach ($mandatory_fields as $fname => $fval) {
2240 2271 //print_r($materiel);
2241 2272 foreach ($mandatory_fields as $fname=>$fname_nice) {
2242 2273  
2243 2274 /*
2244 2275 * Champs obligatoires à ignorer :
2245   - * - champs virtuels (n'existent pas physiquement)
2246   - * - champs ne pouvant être exigés si tôt
2247   - * - champs spéciaux dont le caractère obligatoire est géré indirectement (via beforeSave())
  2276 + * - champs virtuels (n'existent pas physiquement) => DOC_XXX (DOC_DEVIS, DOC_BC, ...)
  2277 + * - champs spéciaux dont le caractère obligatoire est géré indirectement (via beforeSave()) => fournisseur
2248 2278 * ...
2249 2279 */
2250   - if ( in_array($fname, ['DEVIS', 'fournisseur_id', 'etiquette', 'numero_inventaire_organisme']) ) continue;
  2280 + if ( substr($fname,0,4) == 'DOC_' ) continue;
  2281 + if ( in_array($fname, ['fournisseur_id']) ) continue;
  2282 + //if ( in_array($fname, ['DOC_DEVIS', 'fournisseur_id', 'etiquette', 'numero_inventaire_organisme']) ) continue;
2251 2283  
2252 2284 if ($materiel->$fname === null || $materiel->$fname == '') {
2253   - $ALL_MANDATORY_FIELDS_BEFORE_GIVEN = false;
  2285 + $ALL_MANDATORY_FIELDS_FOR_GIVEN = false;
2254 2286 /* (EP 2020 03)
2255 2287 * Ce genre de ligne ($this->Flash->...) affichant un message flash en haut de page,
2256 2288 * ne fonctionnait plus à cause de bootstrap (css).
... ... @@ -2260,9 +2292,9 @@ class MaterielsController extends AppController {
2260 2292 * de bootstrap, ou bootsrap-ui, ou cakephp..., à surveiller donc)
2261 2293 */
2262 2294 //$msgError1 = "Le champ suivant est obligatoire : ".$fname_nice.' du matériel';
2263   - $msgError1 = "Le champ suivant est obligatoire : ".$fname_nice;
  2295 + $error_msg = "Le champ suivant est obligatoire : ".$fname_nice;
2264 2296 /////debug($msgError1);
2265   - $this->Flash->error($msgError1);
  2297 + $this->Flash->error($error_msg);
2266 2298 /* MARCHE PAS POURQUOI ?
2267 2299 $materiel->setError($field, 'Ce champ ne doit pas être vide');
2268 2300 $materiel->setError('numero_commande', 'Ce champ ne doit pas être vide');
... ... @@ -2278,7 +2310,7 @@ class MaterielsController extends AppController {
2278 2310 }
2279 2311 }
2280 2312  
2281   - if ($ALL_MANDATORY_FIELDS_BEFORE_GIVEN) {
  2313 + if ($ALL_MANDATORY_FIELDS_FOR_GIVEN) {
2282 2314  
2283 2315 // (3) On l'ajoute en BD, on envoie un email, et on affiche ok sur page accueil
2284 2316 //$verb = $IS_ADD ? "ajouté" : "modifié";
... ... @@ -2350,7 +2382,7 @@ class MaterielsController extends AppController {
2350 2382 ]);
2351 2383 }
2352 2384  
2353   - } // $ALL_MANDATORY_FIELDS_BEFORE_GIVEN
  2385 + } // $ALL_MANDATORY_FIELDS_FOR_GIVEN
2354 2386  
2355 2387 } // if POST...
2356 2388  
... ... @@ -2728,6 +2760,7 @@ class MaterielsController extends AppController {
2728 2760 return in_array($this->getUserRole(), $except_list);
2729 2761 }
2730 2762  
  2763 + public function getUneditableFieldsForMaterielStatusAndCurrentUser($materiel_status) { return $this->getUneditableFieldsForMaterielStatus($materiel_status); }
2731 2764 private function getUneditableFieldsForMaterielStatus($materiel_status) {
2732 2765  
2733 2766 // Superadmin peut tout modifier
... ... @@ -3005,35 +3038,53 @@ class MaterielsController extends AppController {
3005 3038 // Set new status
3006 3039 else $materiel->status = $newStatus;
3007 3040 //$materiel->set('status', $newStatus);
3008   -
3009   -
  3041 +
  3042 + $ACTION = "%s ce matériel,";
  3043 + //$ERROR_MSG_EMPTY_FIELD = "Pour $ACTION le champ suivant ne doit pas être vide : %s du matériel";
  3044 + $ERROR_MSG_EMPTY_FIELD = "Pour $ACTION le champ suivant ne doit pas être vide : %s";
  3045 + $ERROR_MSG_DOC_NOT_ATTACHED = "Pour $ACTION vous devez d'abord joindre un document de type '%s' à cette fiche (bouton 'Lier un doc.') ";
  3046 +
3010 3047 // - TOBEORDERED
3011 3048 if ($newStatus == 'TOBEORDERED') {
3012 3049  
3013 3050 // Attributs obligatoires pour la phase COMMANDE (LOT1)
3014 3051 $mandatoryFields = $this->Materiels->getMandatoryFieldsForLot(1);
3015   -
  3052 + $ACTION = 'ordonner la commande de';
  3053 +
3016 3054 // Si au moins un champ obligatoire est nul ou vide => ERROR
3017 3055 foreach ($mandatoryFields as $fname => $fnicename) {
3018 3056  
3019   - // Champ virtuel ?
3020   - if (strtoupper($fname) == 'DEVIS') {
  3057 + // Doc attaché obligatoire ? (champ virtuel)
  3058 + //if (strtoupper($fname) == 'DOC_DEVIS') {
  3059 + if ( substr($fname,0,4) == 'DOC_' ) { // DOC_DEVIS, DOC_BC, ...
  3060 + if (! $materiel->hasAttachedDocOfType($fname)) {
  3061 + //$msgError1 = Pour $ACTION ce matériel, vous devez d'abord joindre un document de type '".substr($fname,4)."' à cette fiche (bouton 'Lier un doc.') ";
  3062 + $error_msg = sprintf($ERROR_MSG_DOC_NOT_ATTACHED, $ACTION, substr($fname,4));
  3063 + $this->Flash->error($error_msg);
  3064 + $this->ACTION_CANCELLED = TRUE;
  3065 + // => on reste sur "view"
  3066 + return $this->redirect(['action'=>'view',$id]);
  3067 + }
  3068 + /*
3021 3069 if (! $materiel->hasDevis()) {
  3070 + //$msgError1 = "Pour ordonner la commande de ce matériel, vous devez d'abord joindre un devis à cette fiche (bouton 'Lier un doc.') ";
3022 3071 $msgError1 = "Pour ordonner la commande de ce matériel, vous devez d'abord joindre un devis à cette fiche (bouton 'Lier un doc.') ";
3023 3072 $this->Flash->error($msgError1);
3024 3073 $this->ACTION_CANCELLED = TRUE;
3025 3074 // => on reste sur "view"
3026 3075 return $this->redirect(['action'=>'view',$id]);
3027 3076 }
  3077 + */
3028 3078 // on passe au champ suivant
3029 3079 continue;
3030 3080 }
3031 3081  
3032   - // Champ physique (réel) ?
  3082 + // Champ physique (réel) obligatoire ?
3033 3083 $fval = $materiel->$fname;
3034 3084 if ($fval === null || $fval == '') {
3035   - $msgError1 = "Pour ordonner la commande d'un matériel, le champ suivant ne doit pas être vide : ".$fnicename.' du matériel';
3036   - $this->Flash->error($msgError1);
  3085 + //$msgError1 = "Pour $ACTION ce matériel, le champ suivant ne doit pas être vide : ".$fnicename.' du matériel';
  3086 + $error_msg = sprintf($ERROR_MSG_EMPTY_FIELD, $ACTION, $fnicename);
  3087 + $this->Flash->error($error_msg);
3037 3088 // Utile ??? (plante les tests)
3038 3089 ////$this->e->setError($fname, 'Ce champ ne doit pas être vide');
3039 3090 $this->ACTION_CANCELLED = TRUE;
... ... @@ -3055,7 +3106,7 @@ class MaterielsController extends AppController {
3055 3106 if ($newStatus == 'VALIDATED') {
3056 3107 // Attributs obligatoires pour la phase VALIDATION (livré et payé) (LOT2)
3057 3108 $mandatoryFields = $this->Materiels->getMandatoryFieldsForLot(2);
3058   - //$mandatoryFields = $this->Materiels->MANDATORY_FIELDS_BEFORE_LOT2;
  3109 + //$mandatoryFields = $this->Materiels->MANDATORY_FIELDS_FOR_LOT2;
3059 3110 //debug($mandatoryFields);exit;
3060 3111 /*
3061 3112 $mandatoryFields = array(
... ... @@ -3091,9 +3142,31 @@ class MaterielsController extends AppController {
3091 3142 // Si au moins un champ obligatoire est nul ou vide => ERROR
3092 3143 foreach ($mandatoryFields as $fname => $fnicename) {
3093 3144  
3094   - // Champs obligatoires à ignorer : Champs virtuels ou alors ne pouvant être exigés si tôt
3095   - if ( in_array($fname, ['DEVIS', 'etiquette', 'numero_inventaire_organisme']) ) continue;
  3145 + $ACTION = 'valider';
  3146 +
  3147 + /*
  3148 + * Champs obligatoires à ignorer :
  3149 + * - champs virtuels (n'existent pas physiquement) => DOC_XXX (DOC_DEVIS, DOC_BC, ...)
  3150 + * - champs spéciaux dont le caractère obligatoire est géré indirectement (via beforeSave()) => fournisseur
  3151 + //if ( in_array($fname, ['DOC_DEVIS', 'etiquette', 'numero_inventaire_organisme']) ) continue;
  3152 + if ( substr($fname,0,4) == 'DOC_' ) continue;
  3153 + */
  3154 +
  3155 + // Doc attaché obligatoire ? (champ virtuel)
  3156 + if ( substr($fname,0,4) == 'DOC_' ) { // DOC_DEVIS, DOC_BC, ...
  3157 + if (! $materiel->hasAttachedDocOfType($fname)) {
  3158 + //$msgError1 = "Pour ordonner la commande de ce matériel, vous devez d'abord joindre un devis à cette fiche (bouton 'Lier un doc.') ";
  3159 + $error_msg = sprintf($ERROR_MSG_DOC_NOT_ATTACHED, $ACTION, substr($fname,4));
  3160 + $this->Flash->error($error_msg);
  3161 + $this->ACTION_CANCELLED = TRUE;
  3162 + // => on reste sur "view"
  3163 + return $this->redirect(['action'=>'view',$id]);
  3164 + }
  3165 + // on passe au champ suivant
  3166 + continue;
  3167 + }
3096 3168  
  3169 + // Champ obligatoire ?
3097 3170 $fval = $materiel->$fname;
3098 3171 //debug($fname); debug($fval);
3099 3172 if ($fval === null || $fval == '') {
... ... @@ -3108,9 +3181,11 @@ class MaterielsController extends AppController {
3108 3181 * (il se peut qu'on n'aie plus besoin de faire ça dans une prochaine version
3109 3182 * de bootstrap, ou bootsrap-ui, ou cakephp..., à surveiller donc)
3110 3183 */
3111   - $msgError1 = "Pour valider un matériel, le champ suivant ne doit pas être vide : ".$fnicename.' du matériel';
3112   - debug($msgError1);
3113   - $this->Flash->error($msgError1);
  3184 + //$msgError1 = "Pour $ACTION ce matériel, le champ suivant ne doit pas être vide : ".$fnicename.' du matériel';
  3185 + $error_msg = sprintf($ERROR_MSG_EMPTY_FIELD, $ACTION, $fnicename);
  3186 + $this->Flash->error($error_msg);
  3187 + //debug($error_msg);
  3188 +
3114 3189 /* MARCHE PAS POURQUOI ?
3115 3190 $materiel->setError($field, 'Ce champ ne doit pas être vide');
3116 3191 $materiel->setError('numero_commande', 'Ce champ ne doit pas être vide');
... ...
src/Model/Entity/Document.php
... ... @@ -52,4 +52,16 @@ class Document extends Entity
52 52 return strtoupper(trim($this->type_document->nom)) == 'DEVIS';
53 53 }
54 54  
  55 + public function isOfType($doc_type) {
  56 + //debug($doc_type);
  57 + $doc_type_name = 'UNKNOWN';
  58 + switch ($doc_type) {
  59 + case 'DOC_DEVIS': $doc_type_name = 'DEVIS'; break;
  60 + case 'DOC_BC': $doc_type_name = 'BC (BON DE COMMANDE)'; break;
  61 + case 'DOC_BL': $doc_type_name = 'BL (BON DE LIVRAISON)'; break;
  62 + case 'DOC_FACTURE': $doc_type_name = 'FACTURE';
  63 + }
  64 + //debug($doc_type_name); exit;
  65 + return strtoupper(trim($this->type_document->nom)) == $doc_type_name;
  66 + }
55 67 }
... ...
src/Model/Entity/Materiel.php
... ... @@ -135,13 +135,21 @@ class Materiel extends Entity {
135 135 //return true;
136 136 }
137 137  
  138 + public function hasAttachedDocOfType($doc_type) {
  139 + //debug($this->documents);
  140 + foreach ($this->documents as $doc) if ($doc->isOfType($doc_type)) return true;
  141 + // par défaut, faux
  142 + return false;
  143 + }
  144 +
  145 + /*
138 146 public function hasDevis() {
139 147 //debug($this->documents);
140   - foreach ($this->documents as $document)
141   - if ($document->is_devis) return true;
  148 + foreach ($this->documents as $doc) if ($doc->is_devis) return true;
142 149 // par défaut, faux
143   - return false;
  150 + return false;
144 151 }
  152 + */
145 153  
146 154 protected function hasStatus($status) { return $this->status == $status; }
147 155  
... ...
src/Model/Table/MaterielsTable.php
... ... @@ -49,7 +49,7 @@ use Cake\Core\Configure;
49 49 //const MAX_DIFF_YEARS = 10;
50 50  
51 51 /* replaced with configuration file (in yaml format)
52   -const MANDATORY_FIELDS_BEFORE_LOT1 = [
  52 +const MANDATORY_FIELDS_FOR_LOT1 = [
53 53  
54 54 // Infos toujours obligatoires (cachées car calculées automatiquement)
55 55 //'status',
... ... @@ -100,9 +100,9 @@ const MANDATORY_FIELDS_BEFORE_LOT1 = [
100 100 // - EOTP : obligatoire seulement dans LOT2
101 101 //'eotp' => 'Entité(s) dépensière(s) (budget(s))', // ligne budgétaire (sur quel(s) budget(s)) ou entité(s) dépensière(s)
102 102  
103   -]; // $MANDATORY_FIELDS_BEFORE_LOT1
  103 +]; // $MANDATORY_FIELDS_FOR_LOT1
104 104  
105   -const MANDATORY_FIELDS_BEFORE_LOT2 = [
  105 +const MANDATORY_FIELDS_FOR_LOT2 = [
106 106  
107 107 //'fournisseur_id' => 'Fournisseur',
108 108 //'fournisseur' => 'Fournisseur',
... ... @@ -128,8 +128,8 @@ const MANDATORY_FIELDS_BEFORE_LOT2 = [
128 128 ];
129 129  
130 130  
131   -//const MANDATORY_FIELDS_BEFORE_LOT1_IP2I = [
132   -define ('MANDATORY_FIELDS_BEFORE_LOT1_IP2I', [
  131 +//const MANDATORY_FIELDS_FOR_LOT1_IP2I = [
  132 +define ('MANDATORY_FIELDS_FOR_LOT1_IP2I', [
133 133  
134 134  
135 135 // Infos toujours obligatoires (cachées car calculées automatiquement)
... ... @@ -200,10 +200,10 @@ define ('MANDATORY_FIELDS_BEFORE_LOT1_IP2I', [
200 200 ////'numero_commande' => 'Num. BC',
201 201 ////'numero_inventaire_organisme' => "N° inventaire de l'organisme",
202 202  
203   -]); // $MANDATORY_FIELDS_BEFORE_LOT1
  203 +]); // $MANDATORY_FIELDS_FOR_LOT1
204 204  
205   -//const MANDATORY_FIELDS_BEFORE_LOT2_IP2I = MANDATORY_FIELDS_BEFORE_LOT1_IP2I;
206   -define ('MANDATORY_FIELDS_BEFORE_LOT2_IP2I', MANDATORY_FIELDS_BEFORE_LOT1_IP2I);
  205 +//const MANDATORY_FIELDS_FOR_LOT2_IP2I = MANDATORY_FIELDS_FOR_LOT1_IP2I;
  206 +define ('MANDATORY_FIELDS_FOR_LOT2_IP2I', MANDATORY_FIELDS_FOR_LOT1_IP2I);
207 207 */
208 208  
209 209  
... ... @@ -255,17 +255,24 @@ class MaterielsTable extends AppTable
255 255 */
256 256 public static function getMandatoryFieldsForLot($lot_num) {
257 257 /*
258   - $specific_constant_name = "MANDATORY_FIELDS_BEFORE_LOT1_".self::getLabName();
259   - $mandatory_fields_lot1 = defined($specific_constant_name) ? constant($specific_constant_name) : MANDATORY_FIELDS_BEFORE_LOT1;
  258 + $specific_constant_name = "MANDATORY_FIELDS_FOR_LOT1_".self::getLabName();
  259 + $mandatory_fields_lot1 = defined($specific_constant_name) ? constant($specific_constant_name) : MANDATORY_FIELDS_FOR_LOT1;
260 260 return $mandatory_fields_lot1;
261 261 */
262 262 if ($lot_num < 0) return [];
263   - $base_mandatory_fields = self::getMandatoryFieldsForLot($lot_num-1);
264   - $new_mandatory_fields = Configure::readOrFail('MANDATORY_FIELDS_BEFORE_LOT'.$lot_num);
265   - //debug($new_mandatory_fields);
266   - return array_merge($base_mandatory_fields, $new_mandatory_fields);
  263 + $base_fields = self::getMandatoryFieldsForLot($lot_num-1);
  264 + $new_fields = Configure::readOrFail('MANDATORY_FIELDS_FOR_LOT'.$lot_num);
  265 + //debug($new_fields);
  266 + return array_merge($base_fields, $new_fields);
267 267 }
268   -
  268 + public static function getRecommendedFieldsForLot($lot_num) {
  269 + if ($lot_num < 0) return [];
  270 + $base_fields = self::getRecommendedFieldsForLot($lot_num-1);
  271 + $new_fields = Configure::readOrFail('RECOMMENDED_FIELDS_AFTER_LOT'.$lot_num);
  272 + //debug($new_fields);
  273 + return array_merge($base_fields, $new_fields);
  274 + }
  275 +
269 276 // (EP 2021 10)
270 277 public static function list_to_dict($uneditable_fields) {
271 278 $dict = [];
... ... @@ -323,20 +330,20 @@ class MaterielsTable extends AppTable
323 330 /*
324 331 public static function getMandatoryFieldsLot1() {
325 332 /S
326   - $specific_constant_name = "MANDATORY_FIELDS_BEFORE_LOT1_".self::getLabName();
327   - $mandatory_fields_lot1 = defined($specific_constant_name) ? constant($specific_constant_name) : MANDATORY_FIELDS_BEFORE_LOT1;
  333 + $specific_constant_name = "MANDATORY_FIELDS_FOR_LOT1_".self::getLabName();
  334 + $mandatory_fields_lot1 = defined($specific_constant_name) ? constant($specific_constant_name) : MANDATORY_FIELDS_FOR_LOT1;
328 335 return $mandatory_fields_lot1;
329 336 S/
330   - return Configure::readOrFail('MANDATORY_FIELDS_BEFORE_LOT1');
331   - //return Configure::readOrFail('MANDATORY_FIELDS_BEFORE_LOT1');
  337 + return Configure::readOrFail('MANDATORY_FIELDS_FOR_LOT1');
  338 + //return Configure::readOrFail('MANDATORY_FIELDS_FOR_LOT1');
332 339 }
333 340 public static function getMandatoryFieldsLot2() {
334 341 /S
335   - $constantName = "MANDATORY_FIELDS_BEFORE_LOT2_".self::getLabName();
336   - $mandatory_fields_lot2 = defined($constantName) ? constant($constantName) : MANDATORY_FIELDS_BEFORE_LOT2;
  342 + $constantName = "MANDATORY_FIELDS_FOR_LOT2_".self::getLabName();
  343 + $mandatory_fields_lot2 = defined($constantName) ? constant($constantName) : MANDATORY_FIELDS_FOR_LOT2;
337 344 return array_merge(self::getMandatoryFieldsLot1(), $mandatory_fields_lot2);
338 345 S/
339   - $mandatory_fields_lot2 = Configure::readOrFail('MANDATORY_FIELDS_BEFORE_LOT2');
  346 + $mandatory_fields_lot2 = Configure::readOrFail('MANDATORY_FIELDS_FOR_LOT2');
340 347 return array_merge(self::getMandatoryFieldsLot1(), $mandatory_fields_lot2);
341 348 }
342 349 */
... ... @@ -365,7 +372,8 @@ class MaterielsTable extends AppTable
365 372 // >= VALIDATED => LOT2
366 373 else $lot_num=2;
367 374 $fields = self::getMandatoryFieldsForLot($lot_num);
368   -
  375 + //debug($fields);
  376 +
369 377 return $fields;
370 378 }
371 379 public static function getUneditableFieldsForMaterielStatus($status) {
... ... @@ -383,6 +391,28 @@ class MaterielsTable extends AppTable
383 391  
384 392 return $fields;
385 393 }
  394 + public static function getRecommendedFieldsForMaterielStatus($status) {
  395 + return self::getFieldsCategoryForMaterielStatus('RECOMMENDED', $status);
  396 + }
  397 + public static function getFieldsCategoryForMaterielStatus($fields_categ, $status) {
  398 + $func_name = "get".ucfirst($fields_categ)."FieldsForLot"; // getUneditableFieldsForLot()
  399 + if (is_null($status)) $status='CREATED';
  400 + // On recup le LOT qui convient au status courant du matos
  401 + //$fields = ($status == 'CREATED') ? self::getMandatoryFieldsForLot(1) : self::getMandatoryFieldsForLot(2);
  402 + // CREATED => LOT0
  403 + if ($status == 'CREATED') $lot_num = 0;
  404 + // TOBEORDERED => LOT1
  405 + elseif ($status == 'TOBEORDERED') $lot_num = 1;
  406 + // >= VALIDATED => LOT2
  407 + else $lot_num=2;
  408 + //$fields = self::getUneditableFieldsForLot($lot_num);
  409 + $fields = self::$func_name($lot_num);
  410 + //debug($fields);
  411 +
  412 + return $fields;
  413 + }
  414 +
  415 +
386 416  
387 417 /**
388 418 * Initialize method
... ... @@ -405,15 +435,15 @@ class MaterielsTable extends AppTable
405 435  
406 436 // - PHP
407 437 /*
408   - $mf1 = Configure::readOrFail('php_MANDATORY_FIELDS_BEFORE_LOT1');
  438 + $mf1 = Configure::readOrFail('php_MANDATORY_FIELDS_FOR_LOT1');
409 439 debug($mf1);
410   - $mf1 = Configure::readOrFail('php_MANDATORY_FIELDS_BEFORE_LOT1_IP2I');
  440 + $mf1 = Configure::readOrFail('php_MANDATORY_FIELDS_FOR_LOT1_IP2I');
411 441 debug($mf1);
412 442 */
413 443  
414 444 /*
415 445 // - YML
416   - $keys = ['MANDATORY_FIELDS_BEFORE_LOT0', 'MANDATORY_FIELDS_BEFORE_LOT1', 'MANDATORY_FIELDS_BEFORE_LOT2'];
  446 + $keys = ['MANDATORY_FIELDS_FOR_LOT0', 'MANDATORY_FIELDS_FOR_LOT1', 'MANDATORY_FIELDS_FOR_LOT2'];
417 447 foreach ($keys as $k) {
418 448 //debug($k . ' :');
419 449 if ( Configure::check($k) ) {
... ... @@ -596,8 +626,8 @@ class MaterielsTable extends AppTable
596 626 /*
597 627 if (IP2I) {
598 628  
599   - //$this->MANDATORY_FIELDS_BEFORE_LOT1['fournisseur_id'] = 'Fournisseur';
600   - //$this->MANDATORY_FIELDS_BEFORE_LOT1['fournisseur.name'] = 'Fournisseur';
  629 + //$this->MANDATORY_FIELDS_FOR_LOT1['fournisseur_id'] = 'Fournisseur';
  630 + //$this->MANDATORY_FIELDS_FOR_LOT1['fournisseur.name'] = 'Fournisseur';
601 631  
602 632 $optional_fields = [
603 633 'organisme_id',
... ... @@ -612,16 +642,16 @@ class MaterielsTable extends AppTable
612 642  
613 643 foreach ($optional_fields as $fname) {
614 644 // LOT1
615   - unset($this->MANDATORY_FIELDS_BEFORE_LOT1[$fname]);
  645 + unset($this->MANDATORY_FIELDS_FOR_LOT1[$fname]);
616 646  
617 647 // LOT2
618   - unset($this->MANDATORY_FIELDS_BEFORE_LOT2[$fname]);
  648 + unset($this->MANDATORY_FIELDS_FOR_LOT2[$fname]);
619 649  
620 650 $validator->allowEmptyString($fname, true);
621 651 }
622 652  
623 653 }
624   - //print_r($this->MANDATORY_FIELDS_BEFORE_LOT1);
  654 + //print_r($this->MANDATORY_FIELDS_FOR_LOT1);
625 655 */
626 656  
627 657  
... ... @@ -994,7 +1024,7 @@ class MaterielsTable extends AppTable
994 1024  
995 1025 // Définition des champs qui doivent rester optionnels
996 1026 /*
997   - $optional_fields = array_diff_key(MANDATORY_FIELDS_BEFORE_LOT1, $mandatory_fields);
  1027 + $optional_fields = array_diff_key(MANDATORY_FIELDS_FOR_LOT1, $mandatory_fields);
998 1028 //debug($optional_fields);
999 1029 foreach ($optional_fields as $fname) $validator->allowEmptyString($fname, true);
1000 1030 */
... ...