Files
crm-ms1/t3.php
2026-05-27 11:48:31 -04:00

174 lines
5.5 KiB
PHP
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php
$email = 'info@ultratrailfjord.com';
$liste = jira_get_tickets_by_email($email);
if ($liste['success']) {
foreach ($liste['tickets'] as $ticket) {
echo '<a href="' . $ticket['url'] . '" target="_blank">' . $ticket['key'] . ' - ' . $ticket['summary'] . ' (' . $ticket['status'] . ')</a><br>';
}
} else {
echo 'Erreur : ' . $liste['message'];
}
/**
* Recherche tous les tickets JIRA ouverts dun utilisateur selon son courriel (ou accountId)
* Compatible avec le nouvel endpoint /rest/api/3/search/jql
*/
function jira_get_tickets_by_email($email)
{
$jiraDomain = 'https://progiwebinc.atlassian.net';
$userEmail = 'stephan@progiweb.ca';
$apiToken = 'ATATT3xFfGF0DuhOhRUxFlj2hFpLuzYGapJIrhMETB35NnLFi1TyxDszp3tTa8MaadTpT72GfDk9FOpDm07m6HbdXoQ9plDeRvB6OwRnD19VrIqA8M3HmDGgf_MWR7Pwk5731ahbgb4UBdRgj-ICBqt9A0SjJPnnoTfu4ECVh51HjM0RsekOmeM=908B030C';
$projectKey = 'SM';
// 1) Résoudre l'accountId à partir de l'email
$accountId = jira_find_account_id_by_email($jiraDomain, $userEmail, $apiToken, $email);
// 2) Construire le ou les JQL à tester (accountId en priorité)
$jqls = [];
if ($accountId) {
$jqls[] = 'project = ' . $projectKey . ' AND reporter = ' . $accountId . ' ORDER BY created DESC';
}
$jqls[] = 'project = ' . $projectKey . ' AND reporter = "' . addslashes($email) . '" ORDER BY created DESC';
// 3) Interroger le nouvel endpoint /rest/api/3/search/jql (POST)
$headers = [
'Authorization: Basic ' . base64_encode("$userEmail:$apiToken"),
'Content-Type: application/json',
'Accept: application/json'
];
$fieldsWanted = ["summary","status"];
$maxPerPage = 100;
$tickets = [];
$usedJql = null;
$lastErr = null;
foreach ($jqls as $jql) {
$tickets = [];
$usedJql = $jql;
$nextPageToken = null;
do {
$payload = [
"jql" => $jql,
"maxResults" => $maxPerPage,
"fields" => $fieldsWanted
];
if ($nextPageToken) {
$payload["nextPageToken"] = $nextPageToken;
}
$ch = curl_init($jiraDomain . '/rest/api/3/search/jql');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($payload, JSON_UNESCAPED_SLASHES|JSON_UNESCAPED_UNICODE));
$response = curl_exec($ch);
$httpcode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
$curlErr = curl_error($ch);
curl_close($ch);
if ($httpcode !== 200) {
$lastErr = "HTTP $httpcode - " . ($response ?: $curlErr ?: 'Erreur inconnue');
$tickets = [];
break;
}
$data = json_decode($response, true);
if (!isset($data['issues'])) {
$lastErr = 'Réponse inattendue du service de recherche.';
$tickets = [];
break;
}
foreach ($data['issues'] as $issue) {
$tickets[] = [
'key' => $issue['key'],
'summary' => $issue['fields']['summary'] ?? '',
'status' => $issue['fields']['status']['name'] ?? '',
'url' => $jiraDomain . '/browse/' . $issue['key']
];
}
// pagination nouvelle API : token ou fin de résultats
$nextPageToken = $data['nextPageToken'] ?? null;
} while ($nextPageToken);
if (!empty($tickets)) {
break;
}
}
if (!empty($tickets)) {
return ['success' => true, 'tickets' => $tickets];
}
return [
'success' => false,
'message' => $lastErr ?: "Aucun ticket trouvé (JQL testé : $usedJql)"
];
}
/**
* Recherche laccountId dun utilisateur à partir de son email.
*/
function jira_find_account_id_by_email($jiraDomain, $userEmail, $apiToken, $email)
{
$headers = [
'Authorization: Basic ' . base64_encode("$userEmail:$apiToken"),
'Accept: application/json'
];
$url = $jiraDomain . '/rest/api/3/user/search?query=' . urlencode($email);
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
$response = curl_exec($ch);
$httpcode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
if ($httpcode !== 200) {
return null;
}
$users = json_decode($response, true);
if (is_array($users) && count($users) > 0) {
foreach ($users as $u) {
if (!empty($u['emailAddress']) && strcasecmp($u['emailAddress'], $email) === 0) {
return $u['accountId'] ?? null;
}
}
return $users[0]['accountId'] ?? null;
}
return null;
}
/**
* (Optionnel) Exemple pour lister les projets disponibles.
*/
function jira_get_projects()
{
$jiraDomain = 'https://progiwebinc.atlassian.net';
$userEmail = 'stephan@progiweb.ca';
$apiToken = 'ATATT...';
$ch = curl_init($jiraDomain . '/rest/api/3/project/search');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
'Authorization: Basic ' . base64_encode("$userEmail:$apiToken"),
'Content-Type: application/json'
]);
$response = curl_exec($ch);
curl_close($ch);
return json_decode($response, true);
}