Bug #5538

SQL Error when using "getLastLinkedGroupByType" for NotificationTarget

Added by yeti over 1 year ago. Updated over 1 year ago.

Status:ClosedStart date:11/08/2017
Priority:NormalDue date:
Assignee:yllen% Done:

100%

Category:-
Target version:2.0.2

Description

*** MySQL query error:
  SQL: SELECT  `groups_id` FROM `glpi_groups_tickets` WHERE `tickets_id` = 2017110482 AND `type` = 2 AND ('groups_id' => Array['groups_id'])
  Error: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '=> Array['groups_id'])' at line 1
  Backtrace :
  inc/dbmysqliterator.class.php:274                  
  inc/dbmysql.class.php:542                          DBmysqlIterator->__construct()
  plugins/behaviors/inc/ticket.class.php:225         DBmysql->request()
  plugins/behaviors/inc/ticket.class.php:96          PluginBehaviorsTicket::getLastLinkedGroupByType()
  inc/plugin.class.php:1258                          PluginBehaviorsTicket::addActionTargets()
  inc/notificationtarget.class.php:1100              Plugin::doHook()
  inc/notificationeventabstract.class.php:86         NotificationTarget->addForTarget()
  inc/notificationevent.class.php:163                NotificationEventAbstract::raise()
  inc/commonitilactor.class.php:381                  NotificationEvent::raiseEvent()
  inc/commondbtm.class.php:929                       CommonITILActor->post_addItem()
  inc/commonitilobject.class.php:780                 CommonDBTM->add()
  inc/ticket.class.php:1340                          CommonITILObject->prepareInputForUpdate()
  inc/commondbtm.class.php:1150                      Ticket->prepareInputForUpdate()
  front/ticket.form.php:77                           CommonDBTM->update()

Associated revisions

Revision 250
Added by yllen over 1 year ago

fix nex recipients for global notifications - fixed #5538

Revision 251
Added by yllen over 1 year ago

fix last group for notification - fixed #5538

Revision 253
Added by yllen over 1 year ago

fix last group - fixed #5538

History

#1 Updated by yllen over 1 year ago

Version of the plugin used?
I can't reproduce with latest stable version of the plugin (2.0.0)

#2 Updated by yeti over 1 year ago

Bonjour yllen,

J'ai re-testé avec la dernière version (2.0.0).

Une notification configurée avec :
- Événement = Nouveau groupe responsable
- Destinataires = Dernier groupe assigné (Behaviors)
L'ajout d'un nouveau groupe responsable sur un ticket provoque l'erreur SQL indiquée dans la description plus haut.

Une notification configurée avec :
- Événement = Tickets non résolus
- Destinataires = Superviseur du dernier groupe chargé du ticket (Behaviors)
Provoque l'erreur SQL suivante (au moment de l’exécution de l'action automatique correspondante) :

  *** MySQL query error:
  SQL: SELECT  `groups_id` FROM `glpi_groups_tickets` WHERE `tickets_id` IS NULL AND `type` = 2 AND ()
  Error: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ')' at line 1
  Backtrace :
  inc/dbmysqliterator.class.php:274                  
  inc/dbmysql.class.php:542                          DBmysqlIterator->__construct()
  plugins/behaviors/inc/ticket.class.php:225         DBmysql->request()
  plugins/behaviors/inc/ticket.class.php:96          PluginBehaviorsTicket::getLastLinkedGroupByType()
  inc/plugin.class.php:1258                          PluginBehaviorsTicket::addActionTargets()
  inc/notificationtarget.class.php:1101              Plugin::doHook()
  inc/notificationeventabstract.class.php:86         NotificationTarget->addForTarget()
  inc/notificationevent.class.php:163                NotificationEventAbstract::raise()
  inc/ticket.class.php:6432                          NotificationEvent::raiseEvent()
  inc/crontask.class.php:832                         Ticket::cronAlertNotClosed()
  front/crontask.form.php:49                         CronTask::launch()

#3 Updated by yllen over 1 year ago

  • Status changed from New to Resolved
  • % Done changed from 0 to 100

Bonjour Yeti

Je viens de refire un test avec tes exemples et la dernière version stable : 2.0.1.

Concernant le premier cas, je n'arrive pas à reproduire l'erreur.

Concernant le second cas, cela n'a aucune utilité de proposer les nouveaux destinataires pour des notifications qui sont globales.
J'ai donc supprimer la possibilité de les choisir pour toutes les notifications globales de GLPI.
Applied in changeset r250.

#4 Updated by yeti over 1 year ago

Salut yllen,

Pour isoler complètement le premier problème j'ai réinstallé un environnement clean avec uniquement :
  • GLPI 9.2.1
  • Behaviors 2.0.1
  • Notifications
  • Activer le suivi=Oui
  • Activer le suivi par courriel=Oui
  • Désactivation de toutes les notifications sauf "New group in assignees" (id=64)
  • Supprimer un élément : Destinataire (Groupe technique (129))
  • Ajout d'un élément : Destinataire (Dernier groupe assigné (Behaviors) (132))
  • Création d'un groupe "GROUPEA"
  • Ajout de l'utilisateur "glpi" dans ce groupe (+ajout d'un email à l'utilisateur)
  • Création d'un nouveau ticket non attribué
  • Retour sur la fiche du nouveau ticket créé, attribution au "GROUPEA"
  • Aucune notification n'est créée

Erreur php générée:

  *** PHP Notice(8): Array to string conversion
  Backtrace :
  plugins/behaviors/inc/ticket.class.php:211         
  plugins/behaviors/inc/ticket.class.php:96          PluginBehaviorsTicket::getLastLinkedGroupByType()
  inc/plugin.class.php:1258                          PluginBehaviorsTicket::addActionTargets()
  inc/notificationtarget.class.php:1100              Plugin::doHook()
  inc/notificationeventabstract.class.php:86         NotificationTarget->addForTarget()
  inc/notificationevent.class.php:163                NotificationEventAbstract::raise()
  inc/commonitilactor.class.php:381                  NotificationEvent::raiseEvent()
  inc/commondbtm.class.php:929                       CommonITILActor->post_addItem()
  inc/commonitilobject.class.php:780                 CommonDBTM->add()
  inc/ticket.class.php:1340                          CommonITILObject->prepareInputForUpdate()
  inc/commondbtm.class.php:1150                      Ticket->prepareInputForUpdate()
  front/ticket.form.php:77                           CommonDBTM->update()

Erreur sql générée:

  *** MySQL query error:
  SQL: SELECT  `groups_id` FROM `glpi_groups_tickets` WHERE `tickets_id` = 1 AND `type` = 2 AND ('groups_id' => Array['groups_id'])
  Error: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '=> Array['groups_id'])' at line 1
  Backtrace :
  inc/dbmysqliterator.class.php:274                  
  inc/dbmysql.class.php:542                          DBmysqlIterator->__construct()
  plugins/behaviors/inc/ticket.class.php:225         DBmysql->request()
  plugins/behaviors/inc/ticket.class.php:96          PluginBehaviorsTicket::getLastLinkedGroupByType()
  inc/plugin.class.php:1258                          PluginBehaviorsTicket::addActionTargets()
  inc/notificationtarget.class.php:1100              Plugin::doHook()
  inc/notificationeventabstract.class.php:86         NotificationTarget->addForTarget()
  inc/notificationevent.class.php:163                NotificationEventAbstract::raise()
  inc/commonitilactor.class.php:381                  NotificationEvent::raiseEvent()
  inc/commondbtm.class.php:929                       CommonITILActor->post_addItem()
  inc/commonitilobject.class.php:780                 CommonDBTM->add()
  inc/ticket.class.php:1340                          CommonITILObject->prepareInputForUpdate()
  inc/commondbtm.class.php:1150                      Ticket->prepareInputForUpdate()
  front/ticket.form.php:77                           CommonDBTM->update()

Pour le second problème, je ne comprends pas pourquoi désactiver la possibilité d'envoyer le rapport des tickets non résolus au superviseur du dernier groupe chargé du ticket ?

C'était une fonctionnalité très intéressante :(

#5 Updated by yllen over 1 year ago

OK. Avec tes explications j'ai pu reproduire ton premier problème.
Corrigé Applied in changeset r251.

Concernant le second problème, une notification d'alerte est une notification globale donc comme son nom l'indique ne se limite pas à certains paramètres.
Ce qui fait que le notification comprendra la totalité des tickets non clos et pas seulement les tickets non clos pour le superviseur d'un groupe en particulier.

C'est le mécanisme du coeur de GLPI pour les alertes et les notifications globales.
Un plugin peut ajouter des évènements ou des destinataires mais ne peut pas changer une alerte déjà définie dans le coeur.

#6 Updated by yllen over 1 year ago

  • Assignee set to yllen
  • Target version set to 2.0.2

#7 Updated by yeti over 1 year ago

Merci pour l'explication sur le second point, je vais voir comment on peut améliorer ça (côté GLPI), le besoin fonctionnel me semble une bonne idée.

Pour le premier point, voici un patch qui rend fonctionnelle la notification :

diff --git a/inc/ticket.class.php b/inc/ticket.class.php
index c916a35..442d000 100644
--- a/inc/ticket.class.php
+++ b/inc/ticket.class.php
@@ -211,7 +211,7 @@ class PluginBehaviorsTicket {
       if ($data = $result->next()) {
          $object    = new $target->obj->grouplinkclass();
          if ($object->getFromDB($data['lastid'])) {
-            $querylast = " AND 'groups_id' = '".$object->fields['groups_id']."'";
+            $querylast = " AND `groups_id` = '".$object->fields['groups_id']."'";
          }
       }

@@ -224,7 +224,7 @@ class PluginBehaviorsTicket {

       foreach ($DB->request($query) as $data) {
          //Add the group in the notified users list
-         self::addForGroup($supervisor, $object->fields['groups_id']);
+         self::addForGroup($supervisor, $object->fields['groups_id'], $target);
       }
    }

@@ -715,7 +715,7 @@ class PluginBehaviorsTicket {
    }

-   static function addForGroup($manager, $group_id) {
+   static function addForGroup($manager, $group_id, $target) {
       global $DB;

       // members/managers of the group allowed on object entity
@@ -727,7 +727,7 @@ class PluginBehaviorsTicket {
                INNER JOIN `glpi_profiles_users`
                ON (`glpi_profiles_users`.`users_id` = `glpi_users`.`id` ".
                      getEntitiesRestrictRequest("AND", "glpi_profiles_users", "entities_id",
-                     $this->getEntity(), true).")
+                     $target->getEntity(), true).")
                INNER JOIN `glpi_groups` ON (`glpi_groups_users`.`groups_id` = `glpi_groups`.`id`)
                WHERE `glpi_groups_users`.`groups_id` = '$group_id'
                AND `glpi_groups`.`is_notify`";
@@ -739,7 +739,7 @@ class PluginBehaviorsTicket {
                }

                foreach ($DB->request($query) as $data) {
-                  $this->addToRecipientsList($data);
+                  $target->addToRecipientsList($data);
                }
    }

08/02/2018: edit du patch.

#8 Updated by yllen over 1 year ago

Applied in changeset r253.

#9 Updated by yllen over 1 year ago

  • Status changed from Resolved to Closed

Also available in: Atom PDF