84 lines
2.6 KiB
PHP
84 lines
2.6 KiB
PHP
<?php
|
|
// /public/cabinet/events.php
|
|
require_once __DIR__ . '/../includes/init_secretaire.php';
|
|
|
|
|
|
// --- Inputs ---
|
|
$compteId = (int)($_SESSION['compte_id'] ?? 0);
|
|
$praticien_id = (int)($_POST['praticien_id'] ?? $_GET['praticien_id'] ?? 0);
|
|
|
|
// FullCalendar envoie start/end en ISO (UTC). On les rend optionnels.
|
|
$startIso = isset($_POST['start']) ? (string)$_POST['start'] : (isset($_GET['start']) ? (string)$_GET['start'] : null);
|
|
$endIso = isset($_POST['end']) ? (string)$_POST['end'] : (isset($_GET['end']) ? (string)$_GET['end'] : null);
|
|
|
|
if ($compteId <= 0 || $praticien_id <= 0) { echo json_encode([]); exit; }
|
|
|
|
// --- Sécurité: vérifier appartenance secrétaire → praticien ---
|
|
$chk = $pdo->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);
|