false,'message'=>'Unauthorized']); exit; } $qRaw = trim((string)($_GET['q'] ?? '')); $hasQ = ($qRaw !== ''); $qLike = '%'.$qRaw.'%'; $page = max(1, (int)($_GET['page'] ?? 1)); $limit = 10; $offset= ($page-1)*$limit; try { // ----- TOTAL $sqlTotal = "SELECT COUNT(*) FROM client_dossiers d JOIN client c ON c.id=d.client_id WHERE d.praticien_id=:p AND d.archived_at IS NULL"; $paramsT = [':p'=>$praticien_id]; if ($hasQ) { $sqlTotal .= " AND ( c.nom LIKE :q_nom OR c.prenom LIKE :q_prenom OR c.email LIKE :q_email OR c.telephone LIKE :q_tel OR d.tags LIKE :q_tags )"; $paramsT[':q_nom'] = $qLike; $paramsT[':q_prenom'] = $qLike; $paramsT[':q_email'] = $qLike; $paramsT[':q_tel'] = $qLike; $paramsT[':q_tags'] = $qLike; } $stT = $pdo->prepare($sqlTotal); foreach ($paramsT as $k=>$v) { $stT->bindValue($k, $v, $k===':p' ? PDO::PARAM_INT : PDO::PARAM_STR); } $stT->execute(); $total = (int)$stT->fetchColumn(); // ----- PAGE $sql = "SELECT d.id AS dossier_id, d.tags, c.nom, c.prenom, c.email, c.telephone, (SELECT MAX(rv.date_rdv) FROM rendez_vous rv WHERE rv.client_id=d.client_id AND rv.praticien_id=d.praticien_id AND rv.statut IN ('confirmé','terminé')) AS last_rdv, (SELECT LEFT(s.prochaine_action, 120) FROM client_suivi s WHERE s.dossier_id=d.id ORDER BY s.date_rdv DESC, s.id DESC LIMIT 1) AS last_note FROM client_dossiers d JOIN client c ON c.id=d.client_id WHERE d.praticien_id=:p AND d.archived_at IS NULL"; $params = [':p'=>$praticien_id]; if ($hasQ) { $sql .= " AND ( c.nom LIKE :q_nom OR c.prenom LIKE :q_prenom OR c.email LIKE :q_email OR c.telephone LIKE :q_tel OR d.tags LIKE :q_tags )"; $params[':q_nom'] = $qLike; $params[':q_prenom'] = $qLike; $params[':q_email'] = $qLike; $params[':q_tel'] = $qLike; $params[':q_tags'] = $qLike; } // tri: d'abord ceux qui ont un last_rdv, puis par date desc, puis maj dossier $sql .= " ORDER BY (last_rdv IS NULL) ASC, last_rdv DESC, d.updated_at DESC LIMIT :lim OFFSET :off"; $st = $pdo->prepare($sql); foreach ($params as $k=>$v) { if ($k === ':p') $st->bindValue($k, $v, PDO::PARAM_INT); else $st->bindValue($k, $v, PDO::PARAM_STR); } $st->bindValue(':lim', $limit, PDO::PARAM_INT); $st->bindValue(':off', $offset, PDO::PARAM_INT); $st->execute(); $items=[]; while($r=$st->fetch(PDO::FETCH_ASSOC)){ $items[]=[ 'dossier_id' => (int)$r['dossier_id'], 'tags' => $r['tags'], 'client_name' => trim(($r['prenom'] ?? '').' '.($r['nom'] ?? '')), 'email' => $r['email'] ?? '', 'telephone' => $r['telephone'] ?? '', 'last_rdv_fmt' => !empty($r['last_rdv']) ? (new DateTime($r['last_rdv']))->format('d/m/Y H:i') : '', 'last_note' => $r['last_note'] ?? '' ]; } echo json_encode(['ok'=>true,'items'=>$items,'total'=>$total,'limit'=>$limit]); } catch (Throwable $e) { error_log('clients/ajax_list error: '.$e->getMessage()); http_response_code(500); echo json_encode(['ok'=>false,'message'=>'Erreur serveur']); }