prepare(" SELECT 1 FROM secretaire_praticien WHERE secretaire_user_id = :u AND praticien_id = :p AND is_active = 1 LIMIT 1 "); $chk->execute(['u'=>$compteId,'p'=>$praticien_id]); if (!$chk->fetchColumn()) { echo json_encode([]); exit; } // --- Requête RDV (avec plage si fournie) --- $params = [':p' => $praticien_id]; $whereDates = ''; if ($startIso && $endIso) { // On normalise en 'Y-m-d H:i:s' $startSql = date('Y-m-d H:i:s', strtotime($startIso)); $endSql = date('Y-m-d H:i:s', strtotime($endIso)); $whereDates = " AND rv.date_rdv BETWEEN :d1 AND :d2 "; $params[':d1'] = $startSql; $params[':d2'] = $endSql; } $sql = " SELECT rv.id, rv.date_rdv, rv.duree_minutes, rv.statut, rv.lieu, c.nom, c.prenom FROM rendez_vous rv JOIN client c ON rv.client_id = c.id WHERE rv.praticien_id = :p $whereDates ORDER BY rv.date_rdv ASC "; $stmt = $pdo->prepare($sql); $stmt->execute($params); $rdvs = $stmt->fetchAll(PDO::FETCH_ASSOC); // --- Mappage couleurs par statut --- $couleurs = [ 'prévu' => '#f39c12', // orange 'confirmé' => '#27ae60', // vert 'annulé' => '#c0392b', // rouge 'terminé' => '#7f8c8d', // gris ]; // --- Construction des events --- $tz = new DateTimeZone('Europe/Paris'); $events = []; foreach ($rdvs as $r) { $start = new DateTime($r['date_rdv'], $tz); $end = (clone $start)->modify('+' . (int)($r['duree_minutes'] ?? 60) . ' minutes'); $statut = (string)$r['statut']; $events[] = [ 'id' => (int)$r['id'], 'title' => trim(($r['prenom'] ?? '') . ' ' . ($r['nom'] ?? '')), 'start' => $start->format(DateTime::ATOM), // ISO 8601 'end' => $end->format(DateTime::ATOM), 'allDay' => false, 'color' => $couleurs[$statut] ?? '#999', // Champ non standard → disponible via event.extendedProps.statut côté FC 'statut' => ucfirst($statut), ]; } echo json_encode($events, JSON_UNESCAPED_UNICODE);