diff --git a/CHANGELOG b/CHANGELOG index 05378d2..0912855 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -13,18 +13,36 @@ CHANGEMENTS ------- -06/09/2021 NEWS#7 (v5.0.0) : +13/09/2021 NEWS#5 (v5) : -- Nouveau workflow incluant la "commande d'un matériel" : - - nouveau bouton "Commander" - - nouveau statut "TOBEORDERED" (à commander) - - L'étape de commande est optionnelle +- Documentation en ligne (install et technique) grandement mise à jour, pour une progression plus logique + +- Nouveau workflow incluant une nouvelle étape (optionnelle) de "commande d'un matériel" (demande d'achat, nouveau bouton "Commander") + +- Champs obligatoires (et modifiables) désormais configurables (pour la saisie d'un matériel) + +- Installation du logiciel désormais disponible via DOCKER (en quelques petites minutes) + +- Liste des matériels beaucoup plus pratique (colonnes plus pertinentes) et filtrage plus efficace + +- Recherche des matériels plus fonctionnelle et résultats affichés exactement comme la liste des matériels (même colonnes pertinentes) -- Champs obligatoires désormais configurables (pour la saisie d'un matériel) +- Correction de nombreux bugs... + +- Page "Gestion des fournisseurs" enrichie (/fournisseurs/index) avec : + => (superadmin) Bouton "Nettoyer la liste complète" (nettoyage "automagique" de la liste par suppression intelligente des doublons et espaces en trop) + => (administratif) Bouton "Remplacer" un fournisseur par un autre + +- Ajout de la notion d'"utilisateur" en plus de la notion d'"acheteur" : + => L'"acheteur" commande un matériel pour un "utilisateur" destinataire du bien (par défaut, lui-même), + => peut aussi être juste la précision d'une destination quelconque (local technique, manip...) + => le but est seulement de préciser QUI utilise ce bien, ou à QUOI il est destiné exactement + +- Et comme toujours : Correction de nombreux bugs pour une version plus stable ------- -31/03/2021 NEWS#6 (v4.108.18) : +31/03/2021 (v4.108.18) : - Installation du logiciel désormais disponible via DOCKER (en quelques petites minutes) @@ -41,14 +59,14 @@ FÉVRIER 2021 (v4.108.0) - GROSSE AMÉLIORATION DE LA PHASE INSTALLATION (FROM S ------- -30/11/2020 NEWS#5 (v4.107.21) : +30/11/2020 (v4.107.21) : - Liste des matériels beaucoup plus pratique (colonnes plus pertinentes) et filtrage plus efficace - Recherche des matériels plus fonctionnelle et résultats affichés exactement comme la liste des matériels (même colonnes pertinentes) ------- -20/10/2020 NEWS#4 (v4.105.29) : +20/10/2020 (v4.105.29) : Page "Gestion des fournisseurs" enrichie (/fournisseurs/index) avec : => (superadmin) Bouton "Nettoyer la liste complète" (nettoyage "automagique" de la liste par suppression intelligente des doublons et espaces en trop) @@ -335,20 +353,14 @@ Commencer à implémenter le nouveau workflow v5 : ======= TODO ======= *) + validation (=livré ET payé) + Facture jointe (si > 10K) + + + *) TESTS !!!! - *) - Mettre à jour le diagramme E-T - -"Pensez à coller l'étiquette" -On ne peut pas supprimer les docs attachés d'un matos VALIDATED -Imprimer étiquette : toujours possible ? - - - *) - NEWS#7 ? - *) Rendre modifiable la config via page web "Gérer les champs obligatoires" @@ -378,11 +390,26 @@ Imprimer étiquette : toujours possible ? *) On doit pouvoir supprimer un devis sur un matériel commandé (TOBEORDERED) à condition qu'il en reste au moins 1 => du coup, astuce, on peut REMPLACER un devis en ajoutant le nouveau puis en supprimant l'ancien - + - (Imprimer étiquette : toujours possible ?) + ======= CHANGES ======= ------- +13/09/2021 v5.2.6-3.7.9 + - NEWSLETTER #5 envoyée + - Mise à jour du diagramme workflow (E-T) pour introduire la nouvelle étape TOBEORDERED ("En Commande") + - Bugfix : infos sur etiquettes affichées SEULEMENT si une étiqueteuse est configurée... + - Message affiché sur l'écran de G après validation et à chaque consultation (view) de la fiche : + - (1) Veuillez imprimer l'étiquette du matériel (et la coller sur le matériel) \n\ + - (2) Pensez à remplir le champ "Inventaire Tutelles' dès que service fait CNRS (GesLab) \n\ + => (Ce message reste affiché sur la fiche du matériel validé \n\ + jusqu'à ce que ces 2 champs soient complétés) + - On ne peut pas modifier ou supprimer le DEVIS d'un matos commandé (TOBEORDERED) + - On ne peut pas modifier ou supprimer les docs attachés d'un matos validé (VALIDATED) + + +------- 10/09/2021 v5.2.5-3.7.9 - Meilleur choix de couleurs et de positions pour les boutons de validation et de dé-validation - Meilleurs noms et tooltips pour les boutons de dé-validation diff --git a/README.md b/README.md index 967436a..5e50972 100644 --- a/README.md +++ b/README.md @@ -52,8 +52,8 @@ Logiciel testé et validé sur les configurations suivantes : -------------------------------------------------------------------------------------------- -Date: 10/09/2021 -Version: v5.2.5-3.7.9 +Date: 13/09/2021 +Version: v5.2.6-3.7.9 diff --git a/src/Controller/DocumentsController.php b/src/Controller/DocumentsController.php index 78831e7..23a8c68 100755 --- a/src/Controller/DocumentsController.php +++ b/src/Controller/DocumentsController.php @@ -90,10 +90,11 @@ class DocumentsController extends AppController /* * Action 'delete' (suppression d'une entité) * (EP 2021 09) ATTENTION : Outre cette règle de base implémentée ici, - * une autre règle (trop complexe pour être gérée par ce biais) est implémentée "EN DUR" dans le code... : - * => On ne doit pas pouvoir supprimer un DEVIS associé à un matériel de status TOBEORDERED (commandé) - * (pas simple comme règle hein ?) - * => implémentée dans le code de l'action delete() de ce controleur + * DEUX autres règles (trop complexes pour être gérées par ce biais) sont implémentées "EN DUR" dans le code... : + * (1) => On ne doit pas pouvoir modifier ou supprimer un DEVIS associé à un matériel de status TOBEORDERED (commandé) + * (2) => On ne doit pouvoir modifier ou supprimer AUCUN document associé à un matériel de status VALIDATED (validé) + * (pas simple comme règle hein ? car elles dépendent du statut d'une autre entité associée à celle-ci : Materiel) + * => implémentées dans le code de l'action delete() de ce controleur */ $this->setAuthorizationsForAction('delete', [0,1], [ // Mais admin (et superadmin) peut supprimer tous les docs attachés @@ -569,10 +570,17 @@ class DocumentsController extends AppController $materiel = $this->Documents->Materiels->get($parent_id); - // ATTENTION, règle de gestion complexe : - // On ne doit pas pouvoir modifier (ni supprimer) un DEVIS associé à un matériel de status TOBEORDERED (commandé) - if ($document->is_devis && $materiel->is_tobeordered) { - $this->Flash->error(__("Ce matériel est en commande, vous ne pouvez donc pas modifier son devis")); + /* ATTENTION, règles de gestion complexes : + * (1) => On ne doit pas pouvoir (modifier ou) supprimer un DEVIS associé à un matériel de status TOBEORDERED (commandé) + * (2) => On ne doit pouvoir (modifier ou) supprimer AUCUN document associé à un matériel de status VALIDATED (validé) + */ + $CANNOT_EDIT_ERROR_MSG = ''; + // (Règle 1) + 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"; + // (Règle 2) + elseif ($materiel->is_validated_or_more) $CANNOT_EDIT_ERROR_MSG = "Ce matériel est Validé, vous ne pouvez donc modifier aucun document associé"; + if ($CANNOT_EDIT_ERROR_MSG) { + $this->Flash->error(__($CANNOT_EDIT_ERROR_MSG)); $this->ACTION_CANCELLED = TRUE; return $this->redirect([ 'controller' => 'materiels', @@ -580,6 +588,7 @@ class DocumentsController extends AppController $parent_id ]); } + } } @@ -663,10 +672,17 @@ class DocumentsController extends AppController $materiel = $this->Documents->Materiels->get($parent_id); - // ATTENTION, règle de gestion complexe : - // On ne doit pas pouvoir supprimer un DEVIS associé à un matériel de status TOBEORDERED (commandé) - if ($document->is_devis && $materiel->is_tobeordered) { - $this->Flash->error(__("Ce matériel est en commande, vous ne pouvez donc pas supprimer son devis")); + /* ATTENTION, règles de gestion complexes : + * (1) => On ne doit pas pouvoir modifier ou supprimer un DEVIS associé à un matériel de status TOBEORDERED (commandé) + * (2) => On ne doit pouvoir modifier ou supprimer AUCUN document associé à un matériel de status VALIDATED (validé) + */ + $CANNOT_DELETE_ERROR_MSG = ''; + // (Règle 1) + 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"; + // (Règle 2) + elseif ($materiel->is_validated_or_more) $CANNOT_DELETE_ERROR_MSG = "Ce matériel est Validé, vous ne pouvez donc supprimer aucun document associé"; + if ($CANNOT_DELETE_ERROR_MSG) { + $this->Flash->error(__($CANNOT_DELETE_ERROR_MSG)); $this->ACTION_CANCELLED = TRUE; return $this->redirect([ 'controller' => 'materiels', diff --git a/src/Controller/MaterielsController.php b/src/Controller/MaterielsController.php index bb3a122..6c0ad08 100755 --- a/src/Controller/MaterielsController.php +++ b/src/Controller/MaterielsController.php @@ -1890,6 +1890,21 @@ class MaterielsController extends AppController { //$emails = $this->sendNotificationForEntityAction($materiel); //debug($emails); + /* + * Si le materiel est VALIDATED : + * - l'étiquette doit être imprimée (et collée) + * - le n° inventaire tutelles doit être renseigné + * Si ça n'est pas le cas, on affiche un message de rappel sur cette vue détaillée + */ + $LABEL_NOT_PRINTED = false; + $NUM_INV_TUTELLES_NOT_FILLED = false; + if ($entity->is_validated) { + if ($CAN_PRINT_LABEL) $LABEL_NOT_PRINTED = ! $entity->etiquette; + $NUM_INV_TUTELLES_NOT_FILLED = empty($entity->numero_inventaire_organisme); + 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"); + 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'"); + } + } // view @@ -2678,16 +2693,18 @@ class MaterielsController extends AppController { // Gestionnaires (id=>name): 'gestionnaires' )); + + //debug($this->Materiels->getUneditableFieldsForMaterielStatus($status)); exit; $this->set('readonlyFields', $IS_ADD ? [] : $this->Materiels->getUneditableFieldsForMaterielStatus($materiel->status)); - + $this->set('CAN_PRINT_LABEL', $this->isAuthorizedActionForCurrentUser('printLabelRuban', $id)); /* (EP) INUTILE (sauf pour faire du json ou xml) !!! $this->set('_serialize', [ 'materiel', ]); */ - + } //add_or_edit() diff --git a/src/Model/Entity/Materiel.php b/src/Model/Entity/Materiel.php index 52f140f..045e1ae 100755 --- a/src/Model/Entity/Materiel.php +++ b/src/Model/Entity/Materiel.php @@ -153,6 +153,7 @@ class Materiel extends Entity { //return $this->status == 'CREATED'; protected function _getIsTobeordered() { return $this->status == 'TOBEORDERED'; } protected function _getIsValidated() { return $this->status == 'VALIDATED'; } + protected function _getIsValidatedOrMore() { return in_array($this->status, ['VALIDATED', 'TOBEARCHIVED', 'ARCHIVED']); } //protected function _getIsValidated() { return $this->_fields['status'] == 'VALIDATED'; } //public function is_tobearchived() { return $this->status == 'TOBEARCHIVED'; } protected function _getIsTobearchived() { return $this->status == 'TOBEARCHIVED'; } @@ -162,7 +163,7 @@ class Materiel extends Entity { //if ($this->is_created) return 'À VALIDER'; if ($this->is_created) return 'CRÉÉ - à valider'; if ($this->is_tobeordered) return 'EN COMMANDE - à valider'; - if ($this->is_validated) return 'VALIDÉ - livré'; + if ($this->is_validated) return 'VALIDÉ - livré & payé'; if ($this->is_tobearchived) return 'À SORTIR'; //if ($this->is_archived) return 'ARCHIVÉ'; diff --git a/src/Template/Materiels/add_edit.ctp b/src/Template/Materiels/add_edit.ctp index ebc6417..eb17207 100644 --- a/src/Template/Materiels/add_edit.ctp +++ b/src/Template/Materiels/add_edit.ctp @@ -74,6 +74,7 @@ $dateProchainControleVerif = $dateProchainControleVerif; // add or edit mode ? true=add ; false=edit $IS_ADD = $IS_ADD; $IS_EDIT = !$IS_ADD; +$CAN_PRINT_LABEL = $CAN_PRINT_LABEL; $entity = $entity; // @deprecated @@ -588,7 +589,7 @@ if (isset($cpMateriel)) { } // - Etiquette posée ? - if ($USER_IS_RESPONSABLE_OR_MORE) { + if ($CAN_PRINT_LABEL && $USER_IS_RESPONSABLE_OR_MORE) { /* * } * if (in_array($role, [ diff --git a/src/Template/Materiels/view.ctp b/src/Template/Materiels/view.ctp index 936a943..c61cb23 100755 --- a/src/Template/Materiels/view.ctp +++ b/src/Template/Materiels/view.ctp @@ -555,7 +555,7 @@ $CAN_PRINT_LABEL = $IS_VALIDATED && $configuration->hasPrinter && $USER_IS_ADMIN // - Bouton "Imprimer étiquette" $echoActionButton($this->Html, 'icon-print', $bStyle, - ' étiquette', '', 'printLabelRuban', h($entity->id), [], + ' Etiquette', '', 'printLabelRuban', h($entity->id), [], "Imprimer une étiquette"); // - Bouton "Etiquette [non] collée" @@ -697,7 +697,7 @@ $CAN_PRINT_LABEL = $IS_VALIDATED && $configuration->hasPrinter && $USER_IS_ADMIN $displayElement(__('Organisme'), $entity->has('organisme') ? h($entity->organisme->nom) : ''); $etiq = (h($entity->etiquette) == 0) ? "Non" : "Oui"; - $displayElement(__('Étiquette placée'), $etiq, $etiq=="Oui"?$style_green:$style_red); + if ($CAN_PRINT_LABEL) $displayElement(__('Étiquette placée'), $etiq, $etiq=="Oui"?$style_green:$style_red); $displayElement(__('N° de série'), $entity->numero_serie); diff --git a/webroot/doc/diagrams/Materiel_status_state_diagram_v5_2021_09.png b/webroot/doc/diagrams/Materiel_status_state_diagram_v5_2021_09.png index a02fb0d..5937fab 100644 Binary files a/webroot/doc/diagrams/Materiel_status_state_diagram_v5_2021_09.png and b/webroot/doc/diagrams/Materiel_status_state_diagram_v5_2021_09.png differ diff --git a/webroot/doc/diagrams/Materiel_status_state_diagram_v5_2021_09.txt b/webroot/doc/diagrams/Materiel_status_state_diagram_v5_2021_09.txt index 884e519..1debd75 100755 --- a/webroot/doc/diagrams/Materiel_status_state_diagram_v5_2021_09.txt +++ b/webroot/doc/diagrams/Materiel_status_state_diagram_v5_2021_09.txt @@ -13,7 +13,7 @@ __CYCLE DE VIE D'UN MATÉRIEL (SES 5 ÉTATS)__ end title -state "**CREATED** (fiche créée, matériel à commander ou valider)" as CREATED +state "**CREATED** (fiche créée, matériel à valider)" as CREATED state "**TOBEORDERED** (en commande)" as TOBEORDERED state "**VALIDATED** (fiche validée, matériel livré et payé)" as VALIDATED state "**TOBEARCHIVED** (à sortir)" as TOBEARCHIVED @@ -33,8 +33,7 @@ CREATED -u-> [*]: \l**Supprimer** (delete)\n(par C, un R, ou un G) \ \n => <&envelope-open> (INFO "Fiche supprimée") : \ \n GR (cc Gestion), C/U, R(s) -CREATED: Si c'est une commande, le matériel est en attente de commande (par un G) \n\ -(La section administrative ne peut être saisie que par un G) \n\n\ +CREATED: La section administrative ne peut être saisie que par un G CREATED --> CREATED: \l**__Actions possibles__ :**\n\ - **Supprimer** \n\ @@ -55,7 +54,7 @@ Infos obligatoires (LOT1 = LOT 0 + ...) : \n\ => <&envelope-open> (COMMANDE) : GR (cc Gestion) [avec __devis joint__] \ \n => <&envelope-open> (INFO) : C/U, R(s) -TOBEORDERED: Une demande d'achat est faite \nà la Gestion pour ce matériel +TOBEORDERED: Une demande d'achat est faite \nà la Gestion pour ce matériel\n(étape optionnelle) TOBEORDERED --> CREATED: \l**Annuler Commande** \n(par un G)\n => <&envelope-open> (INFO) : C/U, R(s) \n\ @@ -76,19 +75,25 @@ TOBEORDERED --> VALIDATED: \l**Valider livraison** \n\ CREATED --> VALIDATED: \l**Valider livraison** \n\ (par un G) \n\ Infos obligatoires (LOT2 = LOT1 + ...) \n\ - => <&envelope-open> (INFO facture payée) : C/U\n(+ "pensez à coller l'étiquette !") + => <&envelope-open> (INFO "matériel livré & facture payée") : C/U\n\ + (+ "pensez à imprimer & coller l'étiquette")\n\ + (+ "pensez à remplir le champ 'num. inventaire tutelle'") VALIDATED --> CREATED : \l **Invalider** \n (par un G) \n => <&envelope-open> : C/U -VALIDATED: Le matériel a été livré et payé, \net son étiquette imprimée \n(et collée si posible) +VALIDATED: Le matériel a été livré et la facture payée. \n\n\ + Message affiché sur l'écran de G :\n\ + - (1) Veuillez imprimer & coller l'étiquette du matériel \n\ + - (2) Pensez à remplir le champ "Inventaire Tutelles' dès que service fait CNRS (GesLab) \n\ + => (reste affiché sur fiche du matériel jusqu'à ce que ces 2 actions soient faites) VALIDATED --> VALIDATED: \l**__Actions posibles__ :**\n\ -- **Modifier** (edit) \n (par C/U, un R, ou un G) \n (LOT2 reste obligatoire et certains champs NON MODIFIABLES)) \n (//NB: on ne doit pas pouvoir modifier la "nature" du bien)// \n => <&envelope-open> : C/U, GR \n\ - **Ajouter documents attachés** (par C/U, un R, ou un G) \n (mais on ne peut pas supprimer les documents déjà attachés) \n\ - **Imprimer fiche ENTRÉE matériel** (par un G) \n\ - **Prêter** (par C/U ou un R) \n\ - **Faire un Suivi** (par C/U ou un R) \n\ -- **Imprimer étiquette** (date cde + tutelle [+ n° inventaire tutelle]) (par C/U, un R, ou un G) +- **Imprimer étiquette** (date cde + tutelle [+ n° inventaire tutelle]) (par C/U, un R, ou un G) \n\ +- **Modifier** (edit) \n (par C/U, un R, ou un G) \n (LOT2 reste obligatoire et certains champs NON MODIFIABLES)) \n (//NB: on ne doit pas pouvoir modifier la "nature" du bien)// \n => <&envelope-open> : C/U, GR \n\ @@ -106,6 +111,9 @@ TOBEARCHIVED --> VALIDATED : \l **Annuler demande sortie** \n\ TOBEARCHIVED: Le matériel est en instance de sortie d'inventaire +TOBEARCHIVED --> TOBEARCHIVED: \l**__Actions posibles__ :** idem VALIDATED \n\ + + ' ========================== ' 4) SORTIE @@ -115,14 +123,15 @@ TOBEARCHIVED --> ARCHIVED : \l**Archiver (sortir de l'inventaire)** (archive) \n (par un G) \ \n => <&envelope-open> : C/U -ARCHIVED --> VALIDATED : \l **Désarchiver** \n\ +ARCHIVED --> TOBEARCHIVED : \l **Désarchiver** \n\ (par un G) \ \n => <&envelope-open> : C/U ARCHIVED: Le matériel n'est plus visible (sauf par un G) -ARCHIVED --> ARCHIVED: \l**Imprimer fiche SORTIE matériel** \n\ -(par un G) +ARCHIVED --> ARCHIVED: \l**AUCUNE ACTION disponible sauf** :\n\ +- **Imprimer fiche SORTIE** matériel** (par un G) \n\ +- **Imprimer étiquette** (date cde + tutelle [+ n° inventaire tutelle]) (par C/U, un R, ou un G) @@ -137,7 +146,7 @@ skinparam legendFontSize 11 legend left Légende: -Diagramme UML d'États-Transitions du 10/09/2021 - Logiciel LabInvent v5.x - E. Pallier - IRAP +Diagramme UML d'États-Transitions du 13/09/2021 - Logiciel LabInvent v5.x - E. Pallier - IRAP Acteurs: - C = Créateur : la personne qui crée la fiche (ou celle qui commande le matériel) -- libgit2 0.21.2