diff --git a/CHANGELOG b/CHANGELOG index 152a106..f56b642 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -334,15 +334,26 @@ Commencer à implémenter le nouveau workflow v5 : ======= TODO ======= + bugfix droits edit/delete dans Element/buttons_edit_del.ctp - Relance auto lors de suivis périodiques + bugfix droits edit/delete dans liste des documents attachés + Pouvoir modifier le champ "n° inventaire Tutelle" sur un matos validé + (Service fait CNRS ----> je récupère le n° inventaire "Tutelle" sur GESLAB (SIFAC ?) et je complète la fiche INVENTIRAP + Envoi mail à l'utilisateur du matériel lors de livraison + + Définir (dans le fichier de conf) la liste des infos qui ne doivent pas pouvoir être modifiées une fois le matériel : + - en commande (lot1) + - validé (lot2) + + Détail lieu stockage demandé seulement si > 10K€ Procédures pour les utilisateurs et les gestionnaires désormais configurable via le fichier de conf TESTS !!!! + Relance auto lors de suivis périodiques @@ -350,6 +361,11 @@ Commencer à implémenter le nouveau workflow v5 : ======= CHANGES ======= +------- +08/09/2021 v5.1.1-3.7.9 + - (e) Ajouter lien "Voir les matériels à commander" (configurable) sur page accueil Gestionnaires (le mettre avant "voir les matos à valider") + - (b) Bugfix : cocher les boutons "A valider", et "En commande" quand activés + - (b) Bugfix : sur la page accueil des gestionnaires, correction des liens vers les matos ------- 08/09/2021 v5.1.0-3.7.9 @@ -358,7 +374,7 @@ Commencer à implémenter le nouveau workflow v5 : ------- 08/09/2021 v5.0.2-3.7.9 - - (b) Bugfix lien vers doc utilisateurs + - (b) Bugfix : lien vers doc utilisateurs ------- 07/09/2021 v5.0.1-3.7.9 diff --git a/README.md b/README.md index 827ad57..b2f1cc5 100644 --- a/README.md +++ b/README.md @@ -53,7 +53,7 @@ Logiciel testé et validé sur les configurations suivantes : -------------------------------------------------------------------------------------------- Date: 08/09/2021 -Version: v5.1.0-3.7.9 +Version: v5.1.1-3.7.9 diff --git a/config/app_labinvent_mandatory_fields.default.yml b/config/app_labinvent_mandatory_fields.default.yml index f36c993..8a89a43 100644 --- a/config/app_labinvent_mandatory_fields.default.yml +++ b/config/app_labinvent_mandatory_fields.default.yml @@ -100,19 +100,28 @@ MANDATORY_FIELDS_LOT1: #'fournisseur' - # Devis joint : c'est un champ virtuel, il n'existe pas physiquement (sauf dans la table Documents) - DEVIS: 'Devis' - # Utilisé par la Gestion pour remplir le champ eotp budgets: 'Budgets' # INFOS ADMINISTRATIVES # - EOTP : obligatoire seulement dans LOT2 #'eotp' => 'Entité(s) dépensière(s) (budget(s))', // ligne budgétaire (sur quel(s) budget(s)) ou entité(s) dépensière(s) - + + + # CHAMPS VIRTUELS + # - Devis joint : c'est un champ virtuel, il n'existe pas physiquement (sauf dans la table Documents) + DEVIS: 'Devis' + # ******* END OF MANDATORY_FIELDS_LOT1 ******** +# Liste des champs qui ne peuvent plus être modifiés après la demande d'achat (commande) +UNEDITABLE_FIELDS_LOT1: [] + + + + + # ************************************* @@ -148,11 +157,53 @@ MANDATORY_FIELDS_LOT2: eotp: 'Entité(s) dépensière(s) (budget(s))' numero_commande: 'Num. BC' - numero_inventaire_organisme: "N° inventaire de l'organisme" + + # PROBLEME : + # On ne peut pas exiger ce numéro au moment de la livraison + # car le gestionnaire n'a cette info que lorsque "Service fait CNRS" (il récupère alors le n° inventaire "Tutelle" sur GESLAB) + #numero_inventaire_organisme: "N° inventaire de l'organisme" # ******* END OF $MANDATORY_FIELDS_LOT2 ******** +# Liste des champs qui ne peuvent plus être modifiés après la validation (livraison) +#UNEDITABLE_FIELDS_LOT2: [] +UNEDITABLE_FIELDS_LOT2: + + # Champs généraux : + + sur_categorie_id: + + categorie_id: + + materiel_administratif: + + materiel_technique: + + site_id: + + date_acquisition: + + date_reception: + + organisme_id: + + prix_ht: + + gestionnaire_id: + + # Champs administratifs : + + eotp: + + numero_commande: + + numero_inventaire_organisme: + + numero_inventaire_old: + + + # Astuce utilisable : diff --git a/src/Controller/AppController.php b/src/Controller/AppController.php index 62770f0..0cd256a 100755 --- a/src/Controller/AppController.php +++ b/src/Controller/AppController.php @@ -46,6 +46,9 @@ use Cake\Utility\Inflector; class AppController extends Controller { + // Bouton "Commander" disponible ? + private static $HAS_ORDER_BUTTON = null; + // Si DEBUG, affiche plus d'infos protected $DEBUG=false; //protected $DEBUG=true; @@ -356,6 +359,19 @@ class AppController extends Controller 'delete' => ['Suppression','supprimé'], ]; + + // Les matos peuvent-ils être commandés (bouton commander) ? + // vrai par défaut (sauf si explicité dans la config) + public static function hasOrderButton() { + // OPTIM : si déjà lu, on relit pas + if (! is_null(self::$HAS_ORDER_BUTTON)) return self::$HAS_ORDER_BUTTON; + // Pas encore lu, on lit + $has_order_button = Configure::read('HAS_ORDER_BUTTON'); + if (is_null($has_order_button)) $has_order_button = true; + self::$HAS_ORDER_BUTTON = $has_order_button; + return $has_order_button; + } + protected function setActionsNounAndPastVerb(array $actionsNounAndPastVerb) { /* Non, finalement on fait ça dans le get() // Si genre féminin, on féminise tous les verbes en ajoutant 'e' à la fin (ajouté-e, modifié-e, ...) diff --git a/src/Controller/DocumentsController.php b/src/Controller/DocumentsController.php index 471d4cc..f716d60 100755 --- a/src/Controller/DocumentsController.php +++ b/src/Controller/DocumentsController.php @@ -83,6 +83,7 @@ class DocumentsController extends AppController // Action 'edit' (modif d'une entité) => comme pour 'add' $this->setAuthorizationsForAction('edit', 'add', [ + 'admin' => 0, 'super' => ['default',0] ]); diff --git a/src/Controller/MaterielsController.php b/src/Controller/MaterielsController.php index 5220dc9..99db117 100755 --- a/src/Controller/MaterielsController.php +++ b/src/Controller/MaterielsController.php @@ -28,10 +28,6 @@ use Cake\Core\Configure; */ class MaterielsController extends AppController { - // Bouton "Commander" disponible ? - private static $HAS_ORDER_BUTTON = null; - - // - ATTRIBUTS CONSTANTES /* @@ -375,7 +371,8 @@ class MaterielsController extends AppController { public function getNameFieldLabel() { return 'designation'; } - + + /* moved to AppController // Les matos peuvent-ils être commandés (bouton commander) ? // vrai par défaut (sauf si explicité dans la config) public static function hasOrderButton() { @@ -387,6 +384,7 @@ class MaterielsController extends AppController { self::$HAS_ORDER_BUTTON = $has_order_button; return $has_order_button; } + */ /* @@ -3220,7 +3218,7 @@ class MaterielsController extends AppController { */ public function statusValidated($id = null, $from = 'index') { - $this->_statusSetTo('VALIDATED', 'Le matériel a bien été validé', $id, $from); + $this->_statusSetTo('VALIDATED', "Le matériel a bien été validé (n'oubliez pas de saisir le n° inventaire 'tutelle' une fois le 'service fait')", $id, $from); /* * (EP) moved to statusSetTo() * if (in_array($_SESSION['Auth']['User']['sn'][0], TableRegistry::get('Users') diff --git a/src/Controller/PagesController.php b/src/Controller/PagesController.php index 2a82104..7cc24eb 100755 --- a/src/Controller/PagesController.php +++ b/src/Controller/PagesController.php @@ -275,6 +275,11 @@ class PagesController extends AppController // Finalement, on affiche la $page demandée (avec render()) $this->set('page', $this->page); $this->set(compact('subpage')); + + // - Page d'ACCUEIL + if ($this->page=='home') { + $this->set('HAS_ORDER_BUTTON',self::hasOrderButton()); + } // - Page des LOGS // /pages/logs?level=info diff --git a/src/Template/Materiels/add_edit.ctp b/src/Template/Materiels/add_edit.ctp index 42fab3c..6ef328f 100644 --- a/src/Template/Materiels/add_edit.ctp +++ b/src/Template/Materiels/add_edit.ctp @@ -190,19 +190,20 @@ $administrationData = array( $myReadonlyFields = array(); if ($IS_VALIDATED) // can only modify some fields - $myReadonlyFields = array_merge(array( - 'sur_categorie_id', - 'categorie_id', - 'materiel_administratif', - 'materiel_technique', - 'site_id', - 'date_acquisition', - 'date_reception', - 'organisme_id', - 'prix_ht', - 'gestionnaire_id' - ), - $administrationData + $myReadonlyFields = array_merge( + array( + 'sur_categorie_id', + 'categorie_id', + 'materiel_administratif', + 'materiel_technique', + 'site_id', + 'date_acquisition', + 'date_reception', + 'organisme_id', + 'prix_ht', + 'gestionnaire_id' + ), + $administrationData ); else if ($IS_ARCHIVED_OR_TOBE) $myReadonlyFields = array('*','status'); if ($IS_VALIDATED && $materiel->sous_categorie_id) @@ -216,6 +217,7 @@ if ($IS_VALIDATED && $materiel->numero_serie) $myReadonlyFields ); } // EDIT only +debug($myReadonlyFields); // Création des 2 boutons submit du formulaire (Enregistrer et Cancel) @@ -432,7 +434,7 @@ if (isset($cpMateriel)) { // ADD only //////'default' => $materiel->sur_categorie_id, // EDIT only - 'readonly' => $IS_ADD ? false : $isReadonlyField('sur_categorie_id', $myReadonlyFields), + //'readonly' => $IS_ADD ? false : $isReadonlyField('sur_categorie_id', $myReadonlyFields), 'disabled' => $IS_ADD ? false : $isReadonlyField('sur_categorie_id', $myReadonlyFields) ]); // - CATEGORIE @@ -983,7 +985,7 @@ if (isset($cpMateriel)) { */ if ($IS_EDIT || ($IS_ADD && $USER_IS_ADMIN_OR_MORE)) { - $DISABLED = $IS_ADD ? false : !$USER_IS_ADMIN_OR_MORE; + //$DISABLED = $IS_ADD ? false : !$USER_IS_ADMIN_OR_MORE; echo '
Partie administrative'; //(EDIT only) @@ -1004,20 +1006,24 @@ if (isset($cpMateriel)) { * 'Super Administrateur' * ])) { */ - echo $this->Form->control('eotp', [ + $fname = 'eotp'; + echo $this->Form->control($fname, [ 'label' => 'Entité(s) dépensière(s) (voir champ Budgets juste au-dessus)', //'label' => 'Entité(s) dépensière(s) (i.e. sur quel(s) budget(s) ?)', //'label' => 'Centre(s) financier(s) / EOTP', // EDIT only - 'disabled' => $DISABLED, + //'disabled' => $DISABLED, + 'disabled' => $IS_ADD ? false : $isReadonlyField($fname, $myReadonlyFields), 'placeholder' => 'Si plusieurs, séparer avec virgule' ]); // - Numéro BC // On peut entrer le numero bon commande si le materiel est technique et qu'on est responsable du groupe - $BC_DISABLED = $DISABLED; + $fname = 'numero_commande'; + //$BC_DISABLED = $DISABLED; + $BC_DISABLED = $IS_ADD ? false : $isReadonlyField($fname, $myReadonlyFields); if ($IS_EDIT && $USER_IS_RESPONSABLE_AND_SAME_GROUP_AS_MATERIEL && $materiel->materiel_administratif==0) $BC_DISABLED = False; - echo $this->Form->control('numero_commande', [ + echo $this->Form->control($fname, [ 'label' => 'Numéro BC', // EDIT only 'disabled' => $BC_DISABLED @@ -1045,14 +1051,14 @@ if (isset($cpMateriel)) { echo $this->Form->control('numero_inventaire_organisme', [ 'label' => 'N° inventaire comptable/tutelles', // EDIT only - 'disabled' => $DISABLED + //'disabled' => $DISABLED ]); // Num inventaire (ancien) echo $this->Form->control('numero_inventaire_old', [ 'label' => 'Ancien N° inventaire', // EDIT only - 'disabled' => $DISABLED + //'disabled' => $DISABLED ]); echo '
'; diff --git a/src/Template/Materiels/index.ctp b/src/Template/Materiels/index.ctp index 3d82e65..6de625f 100644 --- a/src/Template/Materiels/index.ctp +++ b/src/Template/Materiels/index.ctp @@ -199,22 +199,23 @@ $displayStatusButtons = function($HAS_ORDER_BUTTON, $SELECTED_STATUS, $params, $ ?>
'; echo "Afficher les matériels : "; echo '
'; echo '
'; - $b_all = $b_cre = $b_val = $b_toarc = $b_arc = ''; + $b_all = $b_cre = $b_tbo = $b_val = $b_tba = $b_arc = ''; $SELECTED = ''; //if (isset($SELECTED_STATUS)) { if ($SELECTED_STATUS) { if ($SELECTED_STATUS == 'CREATED') $b_cre = $SELECTED; - else if ($SELECTED_STATUS == 'VALIDATED') + elseif ($SELECTED_STATUS == 'TOBEORDERED') + $b_tbo = $SELECTED; + elseif ($SELECTED_STATUS == 'VALIDATED') $b_val = $SELECTED; - else if ($SELECTED_STATUS == 'TOBEARCHIVED') - $b_toarc = $SELECTED; - else if ($SELECTED_STATUS == 'ARCHIVED') + elseif ($SELECTED_STATUS == 'TOBEARCHIVED') + $b_tba = $SELECTED; + elseif ($SELECTED_STATUS == 'ARCHIVED') $b_arc = $SELECTED; } else $b_all = $SELECTED; @@ -228,9 +229,9 @@ $displayStatusButtons = function($HAS_ORDER_BUTTON, $SELECTED_STATUS, $params, $ 'TOUS' => [$b_all, 'TOUS', 'Tous les matériels', 5], 'CREATED' => [$b_cre, 'À VALIDER', 'Seulement les matériels créés (à valider)', 5] ]; - if ($HAS_ORDER_BUTTON) $statuses['TOBEORDERED'] = [$b_cre, 'EN COMMANDE', 'Seulement les matériels commandés (à valider)', 5]; + if ($HAS_ORDER_BUTTON) $statuses['TOBEORDERED'] = [$b_tbo, 'EN COMMANDE', 'Seulement les matériels commandés (à valider)', 5]; $statuses['VALIDATED'] = [$b_val, 'VALIDÉS', "Seulement les matériels validés", 5]; - $statuses['TOBEARCHIVED'] = [$b_toarc, 'À SORTIR', "Seulement les matériels à archiver", 5]; + $statuses['TOBEARCHIVED'] = [$b_tba, 'À SORTIR', "Seulement les matériels à archiver", 5]; $statuses['ARCHIVED'] = [$b_arc, 'ARCHIVÉS', "Seulement les matériels sortis de l'inventaire", 0]; // https://book.cakephp.org/3/en/views/helpers/html.html#creating-links @@ -259,72 +260,6 @@ $displayStatusButtons = function($HAS_ORDER_BUTTON, $SELECTED_STATUS, $params, $ ]); } - /* - //echo $this->Html->link($b_all . ' Tous', [ - echo $html->link($b_all . ' TOUS', [ - //'action' => 'index', - //'?' => $params - '?' => array_merge($params, ['status'=>null]) - ], [ - 'title' => 'Tous', - 'style' => 'margin-right: 5px', - 'escape' => false - ]); - - $status = 'CREATED'; - echo $html->link($b_cre . ' A valider', [ - //'action' => 'index', - //'CREATED', - // https://book.cakephp.org/3/en/views/helpers/html.html#creating-links - //'?' => ['height' => 400, 'width' => 500] - //'?' => $params + ['status'=>'CREATED'] - '?' => array_merge($params, ['status'=>$status]) - //'?' => null - //[$args], - //"http://".$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'] - ], [ - 'title' => 'Liste des matériels créés', - 'style' => 'margin-right: 5px', - 'escape' => false - ]); - - $status = 'VALIDATED'; - echo $html->link($b_val . ' Validés', [ - //'action' => 'index', - //'VALIDATED', - //'?' => $params - '?' => array_merge($params, ['status'=>$status]) - ], [ - 'title' => "Liste des materiels qu'on peut archiver", - 'style' => 'margin-right: 5px', - 'escape' => false - ]); - - $status = 'TOBEARCHIVED'; - echo $html->link($b_toarc . ' A sortir', [ - //'action' => 'index', - //'TOBEARCHIVED', - //'?' => $params - '?' => array_merge($params, ['status'=>$status]) - ], [ - 'title' => "A sortir de l'inventaire", - 'style' => 'margin-right: 5px', - 'escape' => false - ]); - - $status = 'ARCHIVED'; - echo $html->link($b_arc . ' Archivés', [ - //'action' => 'index', - //'ARCHIVED', - //'?' => $params - '?' => array_merge($params, ['status'=>$status]) - ], [ - 'title' => "Sortis de l'inventaire", - 'style' => 'margin-right: 0px', - 'escape' => false - ]); - */ - echo '

'; // ACTIONS : buttons "Tout selectionner", "Tout decocher" diff --git a/src/Template/Pages/home_app.ctp b/src/Template/Pages/home_app.ctp index d2f88e7..a3450cd 100755 --- a/src/Template/Pages/home_app.ctp +++ b/src/Template/Pages/home_app.ctp @@ -4,6 +4,7 @@ //debug($this->viewVars); $configuration = $configuration; $USER_IS_RESPONSABLE = $USER_IS_RESPONSABLE; +$HAS_ORDER_BUTTON = $HAS_ORDER_BUTTON; $lab_name = $configuration->labPresent; @@ -162,16 +163,25 @@ if (in_array($role, [ echo $TABLE_START; echo $SEP; - echo ' ' . $this->Html->link('Voir les matériels à valider', [ + //http://labinvent21.devv/materiels?status=TOBEORDERED + +if ($HAS_ORDER_BUTTON) echo ' ' . $this->Html->link('Voir les matériels à Commander', [ + 'controller' => 'materiels', + 'action' => 'index', + 'status' => 'TOBEORDERED' + ]) . ' '; + + + echo ' ' . $this->Html->link('Voir les matériels à Valider', [ 'controller' => 'materiels', 'action' => 'index', - 'CREATED' + 'status' => 'CREATED' ]) . ' '; - echo ' ' . $this->Html->link('Voir les matériels à sortir de l\'inventaire', [ + echo ' ' . $this->Html->link("Voir les matériels à Sortir de l'inventaire", [ 'controller' => 'materiels', 'action' => 'index', - 'TOBEARCHIVED' + 'status' => 'TOBEARCHIVED' ]) . ' '; echo $TABLE_END; -- libgit2 0.21.2