prepare("SELECT access_token, refresh_token, expires_at FROM outlook_tokens WHERE praticien_id = ?"); $stmt->execute([$praticien_id]); $tokenData = $stmt->fetch(); if (!$tokenData) { die("⚠️ Connectez-vous à Outlook d'abord."); } $access_token = $tokenData['access_token']; if (time() >= $tokenData['expires_at']) { require_once '../includes/outlook_refresh.php'; $access_token = refreshOutlookToken($pdo, $praticien_id); if (!$access_token) { die("❌ Impossible de rafraîchir le token."); } } // Récupérer les RDV non encore synchronisés avec nom/prénom du client $stmt = $pdo->prepare(" SELECT r.*, c.prenom, c.nom FROM rendez_vous r JOIN client c ON c.id = r.client_id WHERE r.praticien_id = ? AND r.outlook_event_id IS NULL "); $stmt->execute([$praticien_id]); $rdvs = $stmt->fetchAll(); $success = 0; $fail = 0; foreach ($rdvs as $rdv) { $nom_patient = $rdv['prenom'] . ' ' . $rdv['nom']; $start = date('Y-m-d\TH:i:s', strtotime($rdv['date_rdv'])); $end = date('Y-m-d\TH:i:s', strtotime($rdv['date_rdv'] . ' +1 hour')); $event = [ "subject" => "Rendez-vous avec $nom_patient", "start" => [ "dateTime" => $start, "timeZone" => "Europe/Paris" ], "end" => [ "dateTime" => $end, "timeZone" => "Europe/Paris" ], "body" => [ "contentType" => "text", "content" => "RDV Avec : $nom_patient" ] ]; $ch = curl_init("https://graph.microsoft.com/v1.0/me/events"); curl_setopt($ch, CURLOPT_HTTPHEADER, [ "Authorization: Bearer $access_token", "Content-Type: application/json" ]); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($event)); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); $response = curl_exec($ch); $data = json_decode($response, true); $httpcode = curl_getinfo($ch, CURLINFO_HTTP_CODE); curl_close($ch); if ($httpcode === 201 && isset($data['id'])) { $stmtUpdate = $pdo->prepare("UPDATE rendez_vous SET outlook_event_id = ? WHERE id = ?"); $stmtUpdate->execute([$data['id'], $rdv['id']]); $success++; } else { $fail++; echo "❌ Erreur RDV {$rdv['id']} - Code: $httpcode
"; } } // Pluriels russes function ruPlural($n, $one, $few, $many){ $n = abs((int)$n); $n1 = $n % 10; $n2 = $n % 100; if ($n1 == 1 && $n2 != 11) return $one; if ($n1 >= 2 && $n1 <= 4 && ($n2 < 10 || $n2 >= 20)) return $few; return $many; } $successLabel = ruPlural($success, 'запись', 'записи', 'записей'); $failLabel = ruPlural($fail, 'ошибка синхронизации', 'ошибки синхронизации', 'ошибок синхронизации'); // Box centrée (horizontal + vertical) echo ''; echo <<
✅

Синхронизация завершена

Успешно синхронизировано {$success} {$successLabel} с Outlook.

HTML; if ((int)$fail > 0) { echo << Не удалось синхронизировать {$fail} {$failLabel}.

HTML; } echo << Открыть календарь
HTML; ?>