You are not logged in.

Announcement

 Téléchargez la dernière version stable de GLPI      -     Et vous, que pouvez vous faire pour le projet GLPI ? :  Contribuer
 Download last stable version of GLPI                      -     What can you do for GLPI ? :  Contribute

#1 2021-01-08 15:53:30

tomHbarre
Member
From: Normandie
Registered: 2021-01-08
Posts: 6

ASTUCE : Tickets "Attribué (en cours)" sans tech => Nouveau

Bonjour à tous et à toutes !
Pour mon premier post, je propose de partager avec vous le résultat d'un dilemme qui s'est posé dans mon infra.
Et aussi parce que j'ai déjà vu le sujet soulevé mais pas toujours avec la réponse la plus souhaitée par les demandeurs.
C'est un peu technique mais c'est à la portée de tous.

Contexte :
Certains SI souhaitent qu'à la création du ticket par l'utilisateur, il doive choisir une catégorie et que cela attribue automatiquement le ticket à un groupe de techniciens.
Ce n'est pas le cycle de vie normal d'un ticket, mais c'est parfois comme ça qu'on souhaite procéder.

Problème :

  • Le ticket passe automatiquement en "Attribué (en cours)"

  • Le temps de prise en compte est faussé (automatiquement = 1)

Il a été suggéré de mettre dans le gabarit du ticket le groupe de techniciens en tant que groupe observateur.
Ça fonctionne très bien, mais ça ne convient pas forcément à tous les SI.

J'ai donc creusé la piste d'une requête à automatiser pour prendre les tickets qui

  • Sont en "Attribué (en cours)" à un groupe donné

  • N'ont pas de technicien attribué

  • Ne sont pas supprimés

Pour ensuite :

  • Les passer en "Nouveau"

  • Réinitialiser le temps de prise en compte

Résultat.
Ici, le groupe qui est concerné a pour id "1", voici la requête :

UPDATE glpi_tickets SET status= "1",takeintoaccount_delay_stat="0" 
WHERE id IN (
	SELECT glpi_tickets.id 
	FROM glpi_tickets LEFT JOIN glpi_tickets_users ON glpi_tickets.id = glpi_tickets_users.tickets_id AND glpi_tickets_users.type = "2" 
	WHERE glpi_tickets.id IN (
		SELECT glpi_tickets.id 
		FROM glpi_tickets LEFT JOIN glpi_groups_tickets ON glpi_tickets.id = glpi_groups_tickets.tickets_id 
		WHERE glpi_tickets.status = "2" AND glpi_groups_tickets.groups_id = "1" AND glpi_tickets.is_deleted = "0"
	)
	AND glpi_tickets_users.type IS NULL
)

Explications :

  • L'update du "status" passe le ticket en nouveau

  • L'update du "takeintoaccount_delay_stat" réinitialise le temps de prise en compte

  • Dans le dernier WHERE, glpi_groups_tickets.groups_id = "1" indique l'ID du groupe choisi


Automatisation :
Évidemment, on pourrait utiliser une tâche planifiée ou un CRON, mais ça implique de rendre lisible dans un script un login avec des droits d'update sur la base => Faille de sécurité => NON !
La solution la plus propre que j'ai trouvée est d'utiliser l'Event scheduler de MySQL (dit aussi programmateur d'évènements).

Méthode retenue :
Je vais nommer mon évènement "AttribueVersNouveau_INFO" et le faire s'exécuter chaque minute.
J'ai choisi d'intervenir dans phpMyAdmin, avec le compte root de MySQL (il faut un compte admin sur l'ensemble de MySQL pour faire ce qui suit).

Avant toute chose, il faut activer l'Event scheduler de MySQL :
Sur la page d'accueil de phpMyAdmin, aller sur l'onglet "Variables", filtrer sur le mot "event".
Éditer la ligne "event scheduler" en remplaçant "OFF" par "ON", enregistrer.
L'Event scheduler est immédiatement actif.

Aller sur la base glpi puis cliquer sur l'onglet SQL (il faut être sur la base concernée pour que ça fonctionne).
Saisir et exécuter :

CREATE EVENT AttribueVersNouveau_INFO
ON SCHEDULE EVERY 1 MINUTE
DO UPDATE glpi_tickets SET status= "1",takeintoaccount_delay_stat="0" WHERE id IN (SELECT glpi_tickets.id FROM glpi_tickets LEFT JOIN glpi_tickets_users ON glpi_tickets.id = glpi_tickets_users.tickets_id AND glpi_tickets_users.type = "2" WHERE glpi_tickets.id IN (SELECT glpi_tickets.id FROM glpi_tickets LEFT JOIN glpi_groups_tickets ON glpi_tickets.id = glpi_groups_tickets.tickets_id WHERE glpi_tickets.status = "2" AND glpi_groups_tickets.groups_id = "1" AND glpi_tickets.is_deleted = "0") AND glpi_tickets_users.type IS NULL);

On peut activer ou désactiver un évènement avec les commandes suivantes :

ALTER EVENT AttribueVersNouveau_INFO ENABLE;
ALTER EVENT AttribueVersNouveau_INFO DISABLE;

Pour supprimer l'évènement, utiliser la commande :

DROP EVENT AttribueVersNouveau_INFO;

Vous trouverez plus d'infos sur les évènements programmés ici : atranchant.developpez.com/tutoriels/mysql/evenement/ (avec un https devant, évidemment)

Voila, j'espère que ça s'avérera utile, n'hésitez pas à me faire part de vos remarques !

Last edited by tomHbarre (2021-01-08 15:57:59)

Offline

Board footer

Powered by FluxBB