Commit d563f9f234102ec480adbd329fe0b0f0b5791ab1
1 parent
7f7c0221
Exists in
master
and in
1 other branch
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
Showing
6 changed files
with
92 additions
and
28 deletions
Show diff stats
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
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->Form->hidden('what', ['value'=>$SELECTED_STATU |
943 | 944 | |
944 | 945 | <?php |
945 | 946 | |
946 | - $displayColorLegend(); | |
947 | + $displayLegend(); | |
947 | 948 | |
948 | 949 | $displayActionButtonsForSelectedOrAllElements( |
949 | 950 | $this->Form, | ... | ... |