Commit f18c8ee2f9dc7b00007efbdc5a3982a0a6fa1f6f
1 parent
856422b8
Exists in
master
and in
1 other branch
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
Showing
9 changed files
with
333 additions
and
111 deletions
Show diff stats
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 | */ | ... | ... |