Commit d563f9f234102ec480adbd329fe0b0f0b5791ab1

Authored by Etienne Pallier
1 parent 7f7c0221
Exists in master and in 1 other branch dev

Améliorations diverses

- Précision "acheteur" et "utilisateur" dans les mails de notification

- Amélioration des notifications sur actions spéciales (index avec POST,
remplacement fournisseur...)

- Ajout légende pour le statut (C,V,TBA,A)

v4.105.30-3.7.9
CHANGES.txt
... ... @@ -14,14 +14,16 @@ CHANGEMENTS
14 14  
15 15  
16 16 -------
17   -20/10/2020 NEWS#4 (v4.105.28-3.7.9) :
  17 +20/10/2020 NEWS#4 (v4.105.29-3.7.9) :
18 18  
19   -Page "gestion des fournisseurs" enrichie (/fournisseurs/index) avec :
20   - => requête de nettoyage de la liste (suppression doublons et espaces en trop)
21   - => formulaire de remplacement d'un fournisseur par un autre
  19 +Page "Gestion des fournisseurs" enrichie (/fournisseurs/index) avec :
  20 + => (superadmin) Bouton "Nettoyer la liste complète" (nettoyage "automagique" de la liste par suppression intelligente des doublons et espaces en trop)
  21 + => (administratif) Bouton "Remplacer" un fournisseur par un autre
22 22  
23   -Ajout de la notion d'"utilisateur" en plus de la notion d'"acheteur"
24   - => L'"acheteur commande un matériel pour un "utilisateur" destinataire du bien (par défaut, lui-même)
  23 +Ajout de la notion d'"utilisateur" en plus de la notion d'"acheteur" :
  24 + => L'"acheteur" commande un matériel pour un "utilisateur" destinataire du bien (par défaut, lui-même),
  25 + => peut aussi être juste la précision d'une destination quelconque (local technique, manip...)
  26 + => le but est seulement de préciser QUI utilise ce bien, ou à QUOI il est destiné exactement
25 27  
26 28  
27 29 -------
... ... @@ -132,8 +134,12 @@ Outre ces changements, voici d'autres changements importants :
132 134 ======= CHANGES =======
133 135  
134 136 -------
135   -20/10/2020 v4.105.29-3.7.9
136   - - Version définitive du formulaire de remplacement d'un fournisseur
  137 +20/10/2020 v4.105.30-3.7.9
  138 + - (e) Précision "acheteur" et "utilisateur" dans les mails de notification
  139 + - (i) Amélioration des notifications sur actions spéciales (index avec POST, remplacement fournisseur...)
  140 + - (e) Ajout légende pour le statut (C,V,TBA,A)
  141 + - (b) bugfixes champ utilisateur du matériel, et fournisseur
  142 + - (e) Version définitive du formulaire de remplacement d'un fournisseur
137 143 - (e) Ajout du champ "Utilisateur (destinataire du bien)" pour un matériel
138 144 => par défaut = acheteur
139 145  
... ...
README.md
... ... @@ -43,7 +43,7 @@ Logiciel testé et validé sur les configurations suivantes :
43 43 --------------------------------------------------------------------------------------------
44 44  
45 45 Date: 20/10/2020
46   -Version: 4.105.29-3.7.9
  46 +Version: 4.105.30-3.7.9
47 47  
48 48  
49 49 HISTORIQUE DES CHANGEMENTS DE VERSION : voir le fichier CHANGES.txt (ou la page web /pages/changes)
... ...
src/Controller/AppController.php
... ... @@ -2752,11 +2752,11 @@ class AppController extends Controller
2752 2752  
2753 2753 // pb avec QrCode : pas de $this->e, donc on évite
2754 2754 ////if ($this instanceof QrCodesController) return true;
  2755 +
  2756 + // Pour toutes les actions autres que add, edit, ou index (sauf APRES un POST)
2755 2757 if (
2756   - // Pour toutes les actions autres que 'add' ou 'edit'
2757   - ! in_array($this->a,['add','edit'])
  2758 + ! in_array( $this->a, ['add','edit','index'] )
2758 2759 ||
2759   - // Ou bien pour les actions 'add' ou 'edit' après un POST (pas avant)
2760 2760 $this->request->is(['post','patch','put'])
2761 2761 //( in_array($this->a,['add','edit']) && $this->request->is(['post','patch','put']) )
2762 2762 ) {
... ... @@ -2775,7 +2775,9 @@ class AppController extends Controller
2775 2775 */
2776 2776 //if ($this->isNotifierAction($this->a) && $this->e_id && !$this->e->getErrors())
2777 2777 //if ($this->isNotifierAction($this->a) && $this->e_id) {
  2778 + //debug($this->a);
2778 2779 if ($this->isNotifierAction($this->a)) {
  2780 + //debug("ici2"); exit;
2779 2781 // Positionne $this->e ssi il n'existe pas déjà
2780 2782 ////$this->getEntity($this->e_id);
2781 2783 //if (!$this->e->getErrors())
... ... @@ -3561,7 +3563,7 @@ class AppController extends Controller
3561 3563 *
3562 3564 * - Materiel => $IS_ENTITY_MATERIEL => max d'infos
3563 3565 * - Entité liée au Materiel (HasMany Document, Emprunt, Suivi, ...) => $IS_ENTITY_LINKED_TO_MATERIEL => infos sur l'entité ET sur le matériel lié
3564   - * - Entité autre (BelongsTo User, Categorie, ...) => $IS_ENTITY_OTHER => infos minimum sur l'entité seulement
  3566 + * - Entité autre (BelongsTo User, Fournisseur, Categorie, ...) => $IS_ENTITY_OTHER => infos minimum sur l'entité seulement
3565 3567 */
3566 3568 $IS_ENTITY_MATERIEL = $entity instanceof Materiel;
3567 3569 $IS_ENTITY_LINKED_TO_MATERIEL = false;
... ... @@ -3608,7 +3610,14 @@ class AppController extends Controller
3608 3610 //$msglog = "$entity_type {$action_attrs['past_verb']} = '$entity' (id=$id)";
3609 3611 //$msglog = "$entity_type {$action_attrs['past_verb']} = '$entity_name' (id=$id)";
3610 3612 //$msglog = ucfirst($entity_type).' '.$action_attrs['past_verb_conj'];
3611   - $msglog = ucfirst($entity_nice_type_name).' '.$action_attrs['past_verb_conj'];
  3613 + //$msglog = ucfirst($entity_nice_type_name).' '.$action_attrs['past_verb_conj'];
  3614 + $msglog = ucfirst($entity_nice_type_name);
  3615 + if ($IS_ENTITY_OTHER) $msglog .= '(s)';
  3616 + $msglog .= ' '.$action_attrs['past_verb_conj'];
  3617 + if ($IS_ENTITY_OTHER) {
  3618 + $msglog .= '(s)';
  3619 + if ($action=='index') $msglog .= ' (avec POST)';
  3620 + }
3612 3621 if ($entity) $msglog .= " = '$entity_name' (id=$id)";
3613 3622 // Cas particulier d'un Document : on affiche son type
3614 3623 if ($entity instanceof Document) $msglog .= $doc_infos;
... ... @@ -3650,10 +3659,16 @@ class AppController extends Controller
3650 3659 *
3651 3660 */
3652 3661  
3653   - // (1) Sujet :
  3662 + // (1) Sujet : <Action passive> d'un(e) <entité>
3654 3663  
3655 3664 //$subject = $subject ? $subject : "{$action_attrs['noun']} $article_dun$entity_type";
3656   - $subject = $subject ? $subject : "{$action_attrs['noun']} $article_dun$entity_nice_type_name";
  3665 + //$subject = $subject ? $subject : "{$action_attrs['noun']} $article_dun$entity_nice_type_name";
  3666 + if (!$subject) {
  3667 + $subject = $action_attrs['noun'].' ';
  3668 + $subject .= $IS_ENTITY_OTHER ? 'de ' : $article_dun;
  3669 + $subject .= $entity_nice_type_name;
  3670 + if ($IS_ENTITY_OTHER) $subject .= '(s)';
  3671 + }
3657 3672 $DEBUG && debug($subject);
3658 3673  
3659 3674 // (2) Message (body) :
... ... @@ -3667,9 +3682,14 @@ class AppController extends Controller
3667 3682 $msg_mail = $msg;
3668 3683 //$msg_mail .= "$user a {$action_attrs['past_verb']} $article_le $entity_type '$entity'";
3669 3684 $msg_mail .= "$user a ".$action_attrs['past_verb'];
3670   - if ($entity) {
  3685 + if (! $entity) {
  3686 + $msg_mail .= ' des '.$entity_nice_type_name."s (action '$action')";
  3687 + if ($action=='index') $msg_mail .= ' (avec POST)';
  3688 + }
  3689 + else {
3671 3690 //$msg_mail .= " $article_le$entity_type '$entity_name'";
3672 3691 $msg_mail .= " $article_le$entity_nice_type_name '$entity_name'";
  3692 + if ($action=='index') $msg_mail .= ' (avec POST)';
3673 3693 // Cas particulier d'un Document : on affiche son type
3674 3694 //if ($entity instanceof Document) $msg_mail .= " (type={$entity->type_doc})";
3675 3695 if ($entity instanceof Document) $msg_mail .= $doc_infos;
... ... @@ -3703,7 +3723,8 @@ class AppController extends Controller
3703 3723 // marche pas pour 'edit' car sur_category contient l'ancien nom (avant modif)...
3704 3724 //if (!$materiel->has('sur_category')) {
3705 3725 $fields = [
3706   - 'nom_responsable' => ['hasnot!', 'Utilisateur'],
  3726 + 'nom_responsable' => ['hasnot!', 'Acheteur'],
  3727 + 'nom_user' => ['hasnot!', 'Utilisateur'],
3707 3728 'sur_categorie_id' => ['sur_category', 'Domaine'],
3708 3729 'categorie_id' => ['category', 'Catégorie'],
3709 3730 'sous_categorie_id' => ['sous_category', 'Sous-catégorie'],
... ... @@ -3725,7 +3746,7 @@ class AppController extends Controller
3725 3746 $msg_mail .= "\n\nVeuillez vérifier et compléter si besoin la fiche correspondante.";
3726 3747  
3727 3748 // - (4) TOUS : "Vous recevez ce message car... (raison)"
3728   - if ($entity) {
  3749 + //if ($entity) {
3729 3750 $msg_mail .= "\n\nVous recevez ce message car";
3730 3751 $raison = " vous êtes concerné(e) par cette action effectuée sur l'inventaire des matériels du laboratoire";
3731 3752 if ($action == 'mailDevis')
... ... @@ -3735,7 +3756,7 @@ class AppController extends Controller
3735 3756 if ($action != 'mailDevis')
3736 3757 $raison .= "\n\n(ou alors, vous êtes dans la liste mail spécifique gérée via la page de configuration du logiciel LabInvent).";
3737 3758 $msg_mail .= $raison;
3738   - }
  3759 + //}
3739 3760 $DEBUG && debug($msg_mail);
3740 3761  
3741 3762  
... ...
src/Controller/FournisseursController.php
... ... @@ -21,6 +21,36 @@ class FournisseursController extends AppController
21 21 protected function setAuthorizations() {
22 22  
23 23 /*
  24 + * a) Noms et verbes à utiliser (surtout dans les notifications) pour les actions
  25 + *
  26 + */
  27 + $this->setActionsNounAndPastVerb([
  28 + 'cleanupFournisseurs' => ['Nettoyage','nettoyé'],
  29 + //'replaceFournisseur' => ['Remplacement','remplacé'],
  30 + ]);
  31 +
  32 +
  33 + /*
  34 + * b) Actions de ce controleur qui enverront des notifications (log et/ou email)
  35 + *
  36 + * 'log' = logger seulement
  37 + * 'mail' => envoyer un mail seulement
  38 + * 'both' = faire les 2 (logger ET envoyer un mail)
  39 + *
  40 + */
  41 + $this->setNotificationAllowedOnActions([
  42 + 'cleanupFournisseurs' => 'both',
  43 + //'replaceFournisseur' => 'both',
  44 + 'index' => 'both',
  45 + ]);
  46 +
  47 +
  48 + /*
  49 + * c) Règles d'accès (ACLs)
  50 + *
  51 + */
  52 +
  53 + /*
24 54 // - Action 'cleanup'
25 55 $this->setAuthorizationsForAction('cleanup (page de Nettoyage)', -1, [
26 56 'admin' => 0,
... ... @@ -31,12 +61,15 @@ class FournisseursController extends AppController
31 61 'admin' => 0,
32 62 'super' => 0,
33 63 ]);
  64 + /*
34 65 $this->setAuthorizationsForAction("replaceFournisseur (remplacement d'un fournisseur)", -1, [
35 66 'admin' => 0,
36 67 'super' => 0,
37 68 ]);
  69 + */
38 70  
39   - }
  71 + } // setAuthorizations()
  72 +
40 73  
41 74 /**
42 75 * Give authorization for unite
... ... @@ -104,7 +137,7 @@ class FournisseursController extends AppController
104 137 */
105 138  
106 139 // (EP20201019) Remplacement d'un fournisseur doublon ($f_doublon) par un autre ($f_ok) (en BD)
107   - public function replaceFournisseur($f_doublon, $f_ok, $DEBUG=false) {
  140 + private function _replaceFournisseur($f_doublon, $f_ok, $DEBUG=false) {
108 141 $NL = '<br />';
109 142 $ftable= $this->Fournisseurs;
110 143 $DEBUG && print( '- Relie les matos de ['.$f_doublon->nom.'](id '.$f_doublon->id.') à ['.$f_ok->nom.'](id '.$f_ok->id.') :'.$NL );
... ... @@ -243,7 +276,7 @@ class FournisseursController extends AppController
243 276 if ($fdoublon->nom != $f_max->nom) {
244 277 //debug("diff");
245 278 // on associe les matos du doublon $fdoublon au fournisseur f_max
246   - $this->replaceFournisseur($fdoublon, $f_max, $DEBUG);
  279 + $this->_replaceFournisseur($fdoublon, $f_max, $DEBUG);
247 280 /*
248 281 echo( '- Relie les matos de ['.$fdoublon->nom.']('.$fdoublon->id.') à ['.$f_max->nom.']('.$f_max->id.') :'.$NL );
249 282 foreach ($fdoublon->materiels as $m) {
... ... @@ -285,7 +318,10 @@ class FournisseursController extends AppController
285 318 print "Liste fournisseurs APRÈS cleanup ($nb) : $NL $NL";
286 319 show($fournisseurs);
287 320  
288   - exit;
  321 + //exit;
  322 + $this->redirect(
  323 + ['action' => 'index']
  324 + );
289 325  
290 326 }
291 327  
... ... @@ -312,7 +348,7 @@ class FournisseursController extends AppController
312 348 //debug("ok");
313 349 $f_ok = $this->Fournisseurs->get($f_ok_id);
314 350 $f_bad = $this->Fournisseurs->get( $f_bad_id, [ 'contain'=>['Materiels'] ] );
315   - $this->replaceFournisseur($f_bad, $f_ok, $DEBUG);
  351 + $this->_replaceFournisseur($f_bad, $f_ok, $DEBUG);
316 352 $success = 'Le remplacement a bien été effectué';
317 353 }
318 354 //else debug("ko");
... ...
src/Controller/MaterielsController.php
... ... @@ -472,7 +472,7 @@ class MaterielsController extends AppController {
472 472  
473 473 //debug($this->is_authorized_action);exit;
474 474  
475   - } // _setAuthorizations()
  475 + } // setAuthorizations()
476 476  
477 477  
478 478  
... ...
src/Template/Materiels/index.ctp
... ... @@ -557,12 +557,13 @@ $displayActionButtonsForSelectedOrAllElements = function(
557 557 * Couleurs en fonction du statut du matos
558 558 *
559 559 */
560   -$displayColorLegend = function() {
  560 +$displayLegend = function() {
561 561 // CREATED => bleu
562 562 // VALIDATED => vert
563 563 // TBA => orange
564 564 // ARCHIVED => rouge
565 565 //echo "<p><i><b><u>Couleur</u> :</b> <div>bleu=à valider</div> ; vert=validé ; orange=à sortir ; rouge=archivé (couleur date rouge = fin garantie)</i></p>";
  566 + echo "<p><i><b><u>Statut</u> :</b> <i><b>C</b>(réé)=Matériel à commander</i> ; <i><b>V</b>(alidé)=Matériel livré</i> ; <i><b>TBA</b>=à sortir</i> ; <i><b>A</b>=Archivé</i> ; </p>";
566 567 echo "<p><i><b><u>Couleur</u> :</b> <i style='color:blue'>bleu=à valider</i> ; <i style='color:green'>vert=validé</i> ; <i style='color:orange'>orange=à sortir</i> ; <i style='color:red'>rouge=archivé</i> ; couleur date rouge = <i style='color:red'>fin garantie</i></i></p>";
567 568 };
568 569  
... ... @@ -943,7 +944,7 @@ if ($SELECTED_STATUS) echo $this-&gt;Form-&gt;hidden(&#39;what&#39;, [&#39;value&#39;=&gt;$SELECTED_STATU
943 944  
944 945 <?php
945 946  
946   - $displayColorLegend();
  947 + $displayLegend();
947 948  
948 949 $displayActionButtonsForSelectedOrAllElements(
949 950 $this->Form,
... ...