You are not logged in.
Bonjour,
Sur certains tickets, des gabarits de tâches sont ajoutés automatiquement en fonction de la catégorie du ticket. Ces tâches sont affectées à des groupes de techniciens. Lorsque l'action est fait par le groupe désigné, il coche la tache sur le ticket. Est-il possible de clôturer automatiquement le ticket lorsque toutes les taches ont été faites (cochées) svp ?
Offline
Bonjour,
Quelqu'un aurait la réponse à cette question svp ?
Offline
Bonjour,
Je serais également intéressé par cette fonctionnalité
Merci
Offline
je ne connais pas de tels workflows nativement dans GLPI.
si je devais le mettre en place, j'ecrirais un script qui récupèrerait par l'API tous ces tickets non clos associé au gabarit, qui vérifierait le statut des tâche et si aucune tâche n'est à faire et ajouterait une solution et j'utiliserais le cron du serveur pour lancer ce script régulièrement.
Trouver la panne avant de réparer...
GLPI10.0.16 (ubuntu 22.04 PHP8.1 Mariadb10.6 ) plugins : comportements 2.7.3 reports 1.16.0 formcreator 2.13.9, datainjection 2.13.5 fields 1.21.9
Offline
Bonjour,
Très intéressé aussi par cette fonctionnalité, quelqu'un aurait-il trouvé une solution ?
Merci !
Online
vous pouvez lancer ce type de script avec un cron pour automatiser la résolution de tous les tickets non résolus de la catégorie choisie qui ont au moins une tâche et dont toutes les tâches sont faites.
créez un utilisateur "API" avec un profil qui a le droit d'ajouter une solution à tous les tickets.
attention aux droits sur les entités et sous entités.
mettez à jour les variables en début de code
/!\ N'oubliez pas de tester avant de mettre en prod .... /!\
<?php
***resolution des tickets de la catégorie avec toutes les taches au statut fait;
function initglobals(){
$_SESSION['app_token']="monapptocken";
$_SESSION['api_url']="monGLPI/apirest.php";
$_SESSION['myuser_token']="mon token";
$_SESSION['mycategory']="le id de la catégorie";
}
function getfullsession(){
$ch = curl_init();
$url=$_SESSION['api_url'] ."/getFullSession/";
curl_setopt($ch, CURLOPT_URL,$url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, $_SESSION['headers']);
$json = curl_exec($ch);
curl_close ($ch);
$obj = json_decode($json,true);
$_SESSION["glpi_user_id"]=$obj['session']['glpiID'];
$_SESSION["utilisateur"]=$obj['session']['glpifirstname']." ".$obj['session']['glpirealname'];
print_r($json);
return $obj;
}
function LoginByToken($myusertoken) {
$url=$_SESSION['api_url'] ."/initSession/";
$headers = array(
('Content-Type: application/json'),
('App-token: ' . $_SESSION['app_token']),
('Authorization: user_token '.$myusertoken)
);
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL,$url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
$json = curl_exec($ch);
curl_close ($ch);
$obj = json_decode($json,true);
curl_close ($ch);
print_r($json);
$sess_token = $obj['session_token'];
$headers = array(
'Content-Type: application/json',
'App-Token: ' . $_SESSION['app_token'],
'Session-Token: '.$sess_token
);
$_SESSION['valid'] = true;
$_SESSION['timeout'] = time();
$_SESSION['headers']=$headers;
$_SESSION['sess_token']=$sess_token;
$_SESSION['glpisessionid']=$sess_token;
$dummy=getfullsession();
return $sess_token;
}
function glpi_get($itemtype,$debugmode=false){
$url=$_SESSION['api_url'] .$itemtype;
if($debugmode){
echo "<br/>*** url***<br/>".$url."<br/>";
}
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL,$url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, $_SESSION['headers']);
$json = curl_exec($ch);
if($debugmode){
$httpcode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
echo "<br/>*** httpcode***<br/>";
print_r($httpcode);
echo "<br/>********json***********<br/>";
print_r($json);
echo "<br/>********************<br/>";
}
curl_close ($ch);
$obj = json_decode($json,true);
return $obj;
}
function glpi_post($itemtype,$fields,$debugmode=false){
$url=$_SESSION['api_url'] .$itemtype;
if($debugmode){
echo "<br/>*** url***<br/>".$url."<br/>***********fields*********<br/>";
print_r($fields);
echo "<br/>";
}
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL,$url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, $_SESSION['headers']);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $fields);
$json = curl_exec($ch);
if($debugmode){
$httpcode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
echo "<br/>*** httpcode***<br/>";
print_r($httpcode);
echo "<br/>***********json*********<br/>";
print_r($json);
echo "<br/>********************<br/>";
}
curl_close ($ch);
$obj = json_decode($json,true);
return $obj;
}
$dummy=initglobals();
$dummy=LoginByToken($_SESSION['myuser_token']);
//echo "mon token de session ".$_SESSION['sess_token'];
//echo "mon nom ".$_SESSION['utilisateur'];
$url="/search/Ticket/?is_deleted=0&as_map=0&browse=0&criteria[0][link]=AND&criteria[0][field]=12&criteria[0][searchtype]=equals&criteria[0][value]=notold&criteria[2][link]=AND&criteria[2][field]=7&criteria[2][searchtype]=equals&criteria[2][value]=".$_SESSION['mycategory']."&criteria[3][link]=AND&criteria[3][field]=33&criteria[3][searchtype]=equals&criteria[3][value]=2&sort[]=19&order[]=DESC";
$obj=glpi_get($url);
foreach($obj['data'] as $ticket)
{ $url="/Ticket/".$ticket[2]."/TicketTask";
$obj=glpi_get($url);
$nbfait=0;
$nbafaire=0;
foreach($obj as $task){
switch ($task['state']) {
case 2:
$nbfait++;
break;
case 1:
$nbafaire++;
break;
}
}
//echo "<br/>Ticket: $ticketid; taches a faire : $nbafaire fait $nbfait ";
if (($nbfait>0) & ($nbafaire==0)){
//echo "ticket à cloturer";
$url="/ITILSolution/";
$json='{"input":
{"itemtype":"Ticket",
"items_id":"'.$ticket[2].'",
"solutiontypes_id":2,
"solutiontype_name":null,
"content":"MySolutionDescription",
"status":1
}}';
$obj=glpi_post($url,$json);
}
}
$obj=glpi_get("/killSession/");
//echo "fin";
?>
Trouver la panne avant de réparer...
GLPI10.0.16 (ubuntu 22.04 PHP8.1 Mariadb10.6 ) plugins : comportements 2.7.3 reports 1.16.0 formcreator 2.13.9, datainjection 2.13.5 fields 1.21.9
Offline
Bonjour LaDenrée !
Merci infiniment pour ce script, mais je bute sur une erreur d'interprétation de votre code avec ma version de PHP 8.1 :
PHP Warning: Trying to access array offset on value of type null in /home/info/script_ticket_task_close.php on line 43
PHP Warning: Trying to access array offset on value of type null in /home/info/script_ticket_task_close.php on line 20
PHP Warning: Trying to access array offset on value of type null in /home/info/script_ticket_task_close.php on line 20
PHP Warning: Trying to access array offset on value of type null in /home/info/script_ticket_task_close.php on line 21
PHP Warning: Trying to access array offset on value of type null in /home/info/script_ticket_task_close.php on line 21
PHP Warning: Trying to access array offset on value of type null in /home/info/script_ticket_task_close.php on line 21
PHP Warning: Trying to access array offset on value of type null in /home/info/script_ticket_task_close.php on line 21
PHP Warning: Trying to access array offset on value of type null in /home/info/script_ticket_task_close.php on line 117
PHP Warning: foreach() argument must be of type array|object, null given in /home/info/script_ticket_task_close.php on line 117
Merci!
Last edited by bfde974 (2024-11-15 17:01:24)
Online
essayez de décommenter les lignes :
//echo "mon token de session ".$_SESSION['sess_token'];
//echo "mon nom ".$_SESSION['utilisateur'];
et regardez si les variables de session sont initialisées, je pense que non.
avez vous bien initialisé les variables avec le bon app_token ?
avez vous créé dans GLPI un client pour l'API avec l'ip de la machine qui appelle votre api ?
sans le jeton de session, aucun des appels ne fonctionne ce qui génère tous les autres messages.
Trouver la panne avant de réparer...
GLPI10.0.16 (ubuntu 22.04 PHP8.1 Mariadb10.6 ) plugins : comportements 2.7.3 reports 1.16.0 formcreator 2.13.9, datainjection 2.13.5 fields 1.21.9
Offline
Ça semble effectivement être un problème d'initialisation des variables :
En décommentant les 2 lignes suggérées :
PHP Warning: Trying to access array offset on value of type null in /home/info/script_ticket_task_close.php on line 43
PHP Warning: Trying to access array offset on value of type null in /home/info/script_ticket_task_close.php on line 20
PHP Warning: Trying to access array offset on value of type null in /home/info/script_ticket_task_close.php on line 20
PHP Warning: Trying to access array offset on value of type null in /home/info/script_ticket_task_close.php on line 21
PHP Warning: Trying to access array offset on value of type null in /home/info/script_ticket_task_close.php on line 21
PHP Warning: Trying to access array offset on value of type null in /home/info/script_ticket_task_close.php on line 21
PHP Warning: Trying to access array offset on value of type null in /home/info/script_ticket_task_close.php on line 21
mon token de session mon nom PHP Warning: Trying to access array offset on value of type null in /home/info/script_ticket_task_close.php on line 117
PHP Warning: foreach() argument must be of type array|object, null given in /home/info/script_ticket_task_close.php on line 117
J'ai regénéré mon app token pour être sûr, idem.
Peut-être une erreur de formatage dans les variables :
function initglobals(){
$_SESSION['app_token']="mon localhost app token";
$_SESSION['api_url']="https://mon serveur glpi/apirest.php/";
$_SESSION['myuser_token']="mon user token";
$_SESSION['mycategory']="8";
J'ai testé une connexion à l'API via URL et je me connecte bien :
https://mon serveur glpi/apirest.php/initSession?Content-Type=application/json&app_token=mon app token&user_token=mon token user
Je vérifie à nouveau...
Merci!
Online
attention : votre test utilise l'IP de votre navigateur, le script est probablement sur un serveur web qui a une autre IP donc un autre apptoken
Trouver la panne avant de réparer...
GLPI10.0.16 (ubuntu 22.04 PHP8.1 Mariadb10.6 ) plugins : comportements 2.7.3 reports 1.16.0 formcreator 2.13.9, datainjection 2.13.5 fields 1.21.9
Offline
Oui j'ai bien fait attention à cela, j'utilise bien le app_token localhost de mon serveur, à partir duquel je lance le script.
Je teste une connexion en ligne de commande à partir de mon serveur avec CURL pour comprendre ce qu'il se passe...
Merci!
Online
Bon la commande CURL me donne une erreur app_token invalid, malgré toutes les tentatives et configurations possibles.
Par contre, j'ai testé avec un autre serveur (DEV) GLPI, en version 10.0.16, et oh surprise .. La commande CURL fonctionne instantanément et j'ai une connexion locale.
Cependant même erreur avec votre script, pas de connexion.
Merci !
Last edited by bfde974 (2024-11-15 19:33:28)
Online
Petite précision : j'utilise un certificat ssl auto signé sur mes 2 serveurs GLPI, donc j'ai lancé mes tests CURL avec l'option -k, autrement j'ai un message d'erreur.
Ça pourrait peut-être expliquer pourquoi la connexion ne s'initialise pas avec votre script ?
J'ai trouvé cette option :
To turn off the verification of the SSL certificate for your cURL, add below line to your request:
curl_setopt ( $curl, CURLOPT_SSL_VERIFYPEER, false);
Est-ce que ça pourrait aider ?
Merci !
Last edited by bfde974 (2024-11-15 19:33:50)
Online
Ça avance ..
J'ai ajouté cette ligne dans votre script pour les chaînes de connexion à l'API :
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false)
Le script se lance bien, j'analyse maintenant les résultats.
Online
Ça y est c'est maintenant 100% fonctionnel !
Il me restait à corriger quelques erreurs comme le FQDN de mon serveur prod dans les configs de l'API et dans le script, le tout avec la version GLPI 10.0.17.
Lancement du script manuellement, le ticket contenant les tâches avec le statut "FAIT" est bien fermé, mission accomplie ! Il me reste juste à ajouter le script dans mon cron.
Un gros bravo et surtout merci à LaDenrée ..!
Online
Dernier petit détail :
Le champ "content":"MySolutionDescription", à la fin de votre code, n'autorise pas les accents (é ou à par ex). J'ai essayé quelques conversion Unicode mais sans succès, le code s'exécute mais ne met pas à jour le champ "content" si il y a des accents.
Une idée ?
Merci !
Online
j'utilise les entités html :
J'ai ajouté une solution à mon ticket
en voici la liste : https://alexandre.alapetite.fr/doc-alex … ecial.html
Trouver la panne avant de réparer...
GLPI10.0.16 (ubuntu 22.04 PHP8.1 Mariadb10.6 ) plugins : comportements 2.7.3 reports 1.16.0 formcreator 2.13.9, datainjection 2.13.5 fields 1.21.9
Offline
Excellent ! Merci ..
Online
Tests du code ces derniers jours en production, tout est fonctionnel.
Est-ce que votre code autoriserait plusieurs catégories ?
Ex :
$_SESSION['mycategory']="cat1";"cat2" ...etc
Merci !
Online
je déclarerais mes id de catégorie sous forme de tableau, et je ferais une boucle pour chaque élément du tableau
changements :
$_SESSION['mycategories']=[cat_ID1,Cat_IDi,...Cat_IDn];
...
foreach($_SESSION['mycategories'] as $category_id){
$url="/search/Ticket/?is_deleted=0&as_map=0&browse=0&criteria[0][link]=AND&criteria[0][field]=12&criteria[0][searchtype]=equals&criteria[0][value]=notold&criteria[2][link]=AND&criteria[2][field]=7&criteria[2][searchtype]=equals&criteria[2][value]=".$category_id."&criteria[3][link]=AND&criteria[3][field]=33&criteria[3][searchtype]=equals&criteria[3][value]=2&sort[]=19&order[]=DESC";
.....
}
<?php
***resolution des tickets de la catégorie avec toutes les taches au statut fait;
function initglobals(){
$_SESSION['app_token']="monapptocken";
$_SESSION['api_url']="monGLPI/apirest.php";
$_SESSION['myuser_token']="mon token";
$_SESSION['mycategories']=[cat_ID1,Cat_IDi,...Cat_IDn];
}
function getfullsession(){
$ch = curl_init();
$url=$_SESSION['api_url'] ."/getFullSession/";
curl_setopt($ch, CURLOPT_URL,$url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, $_SESSION['headers']);
$json = curl_exec($ch);
curl_close ($ch);
$obj = json_decode($json,true);
$_SESSION["glpi_user_id"]=$obj['session']['glpiID'];
$_SESSION["utilisateur"]=$obj['session']['glpifirstname']." ".$obj['session']['glpirealname'];
print_r($json);
return $obj;
}
function LoginByToken($myusertoken) {
$url=$_SESSION['api_url'] ."/initSession/";
$headers = array(
('Content-Type: application/json'),
('App-token: ' . $_SESSION['app_token']),
('Authorization: user_token '.$myusertoken)
);
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL,$url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
$json = curl_exec($ch);
curl_close ($ch);
$obj = json_decode($json,true);
curl_close ($ch);
print_r($json);
$sess_token = $obj['session_token'];
$headers = array(
'Content-Type: application/json',
'App-Token: ' . $_SESSION['app_token'],
'Session-Token: '.$sess_token
);
$_SESSION['valid'] = true;
$_SESSION['timeout'] = time();
$_SESSION['headers']=$headers;
$_SESSION['sess_token']=$sess_token;
$_SESSION['glpisessionid']=$sess_token;
$dummy=getfullsession();
return $sess_token;
}
function glpi_get($itemtype,$debugmode=false){
$url=$_SESSION['api_url'] .$itemtype;
if($debugmode){
echo "<br/>*** url***<br/>".$url."<br/>";
}
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL,$url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, $_SESSION['headers']);
$json = curl_exec($ch);
if($debugmode){
$httpcode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
echo "<br/>*** httpcode***<br/>";
print_r($httpcode);
echo "<br/>********json***********<br/>";
print_r($json);
echo "<br/>********************<br/>";
}
curl_close ($ch);
$obj = json_decode($json,true);
return $obj;
}
function glpi_post($itemtype,$fields,$debugmode=false){
$url=$_SESSION['api_url'] .$itemtype;
if($debugmode){
echo "<br/>*** url***<br/>".$url."<br/>***********fields*********<br/>";
print_r($fields);
echo "<br/>";
}
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL,$url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, $_SESSION['headers']);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $fields);
$json = curl_exec($ch);
if($debugmode){
$httpcode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
echo "<br/>*** httpcode***<br/>";
print_r($httpcode);
echo "<br/>***********json*********<br/>";
print_r($json);
echo "<br/>********************<br/>";
}
curl_close ($ch);
$obj = json_decode($json,true);
return $obj;
}
$dummy=initglobals();
$dummy=LoginByToken($_SESSION['myuser_token']);
//echo "mon token de session ".$_SESSION['sess_token'];
//echo "mon nom ".$_SESSION['utilisateur'];
foreach($_SESSION['mycategories'] as $category_id){
$url="/search/Ticket/?is_deleted=0&as_map=0&browse=0&criteria[0][link]=AND&criteria[0][field]=12&criteria[0][searchtype]=equals&criteria[0][value]=notold&criteria[2][link]=AND&criteria[2][field]=7&criteria[2][searchtype]=equals&criteria[2][value]=".$category_id."&criteria[3][link]=AND&criteria[3][field]=33&criteria[3][searchtype]=equals&criteria[3][value]=2&sort[]=19&order[]=DESC";
$obj=glpi_get($url);
foreach($obj['data'] as $ticket)
{ $url="/Ticket/".$ticket[2]."/TicketTask";
$obj=glpi_get($url);
$nbfait=0;
$nbafaire=0;
foreach($obj as $task){
switch ($task['state']) {
case 2:
$nbfait++;
break;
case 1:
$nbafaire++;
break;
}//fin switch
}//fin boucle tâche
//echo "<br/>Ticket: $ticketid; taches a faire : $nbafaire fait $nbfait ";
if (($nbfait>0) & ($nbafaire==0)){
//echo "ticket à cloturer";
$url="/ITILSolution/";
$json='{"input":
{"itemtype":"Ticket",
"items_id":"'.$ticket[2].'",
"solutiontypes_id":2,
"solutiontype_name":null,
"content":"MySolutionDescription",
"status":1
}}';
$obj=glpi_post($url,$json);
}//fin resolution ticket si critere OK
}//fin boucle ticket
}//fin boucle categories
$obj=glpi_get("/killSession/");
//echo "fin";
?>
Trouver la panne avant de réparer...
GLPI10.0.16 (ubuntu 22.04 PHP8.1 Mariadb10.6 ) plugins : comportements 2.7.3 reports 1.16.0 formcreator 2.13.9, datainjection 2.13.5 fields 1.21.9
Offline
Pleinement fonctionnel, c'est formidable, merci ..!
Online