prepare('SELECT id FROM turnero_sesiones WHERE fecha = ? LIMIT 1'); $stmtS->execute([$fecha]); $sesion = $stmtS->fetch(PDO::FETCH_ASSOC); if (!$sesion) { // Sin sesión: CSV vacío con encabezado header('Content-Type: text/csv; charset=utf-8'); header('Content-Disposition: attachment; filename="turnero_' . $fecha . '.csv"'); echo "\xEF\xBB\xBF"; // BOM UTF-8 para Excel echo "Sin datos para la fecha {$fecha}\n"; exit; } $sesionId = (int)$sesion['id']; $stmt = $pdo->prepare( "SELECT t.codigo, t.numero, p.codigo AS prioridad, p.nombre AS prioridad_nombre, COALESCE(s.nombre_completo, t.paciente_nombre) AS paciente, s.numero_documento, s.tipo_documento, t.paciente_cel AS celular, l.nombre AS lugar, t.estado, t.creado_at, t.llamado_recepcion_at, t.inicio_recepcion_at, t.fin_recepcion_at, t.llamado_lugar_at, t.inicio_lugar_at, t.fin_lugar_at, ROUND(TIMESTAMPDIFF(SECOND, t.creado_at, COALESCE(t.inicio_recepcion_at, t.fin_recepcion_at, NOW())) / 60.0, 1) AS espera_recepcion_min, ROUND(TIMESTAMPDIFF(SECOND, t.inicio_lugar_at, COALESCE(t.fin_lugar_at, NOW())) / 60.0, 1) AS servicio_lugar_min, sol.total_cobrado, sol.metodo_pago, GROUP_CONCAT(et.nombre ORDER BY et.nombre SEPARATOR ' | ') AS examenes, SUM(CASE WHEN tc.estado = 'firmado' THEN 1 ELSE 0 END) AS consent_firmados, SUM(CASE WHEN tc.estado = 'pendiente' THEN 1 ELSE 0 END) AS consent_pendientes FROM turnero_turnos t JOIN turnero_prioridades p ON p.id = t.prioridad_id LEFT JOIN turnero_lugares l ON l.id = t.lugar_destino_id LEFT JOIN turnero_solicitudes sol ON sol.turno_id = t.id LEFT JOIN lab_pacientes s ON s.id = sol.paciente_id LEFT JOIN turnero_examen_items tei ON tei.solicitud_id = sol.id LEFT JOIN exam_tipos et ON et.id = tei.exam_tipo_id LEFT JOIN turnero_consentimientos tc ON tc.turno_id = t.id WHERE t.sesion_id = ? GROUP BY t.id ORDER BY t.numero ASC" ); $stmt->execute([$sesionId]); $rows = $stmt->fetchAll(PDO::FETCH_ASSOC); // ── Encabezados CSV ─────────────────────────────────────────── $headers = [ 'Código', 'Número', 'Prioridad', 'Prioridad nombre', 'Paciente', 'Documento', 'Tipo doc.', 'Celular', 'Lugar', 'Estado', 'Creado', 'Llamado recepción', 'Inicio recepción', 'Fin recepción', 'Llamado lugar', 'Inicio lugar', 'Fin lugar', 'Espera recepción (min)', 'Servicio lugar (min)', 'Total cobrado', 'Método pago', 'Exámenes', 'Consentimientos firmados', 'Consentimientos pendientes', ]; $fields = [ 'codigo', 'numero', 'prioridad', 'prioridad_nombre', 'paciente', 'numero_documento', 'tipo_documento', 'celular', 'lugar', 'estado', 'creado_at', 'llamado_recepcion_at', 'inicio_recepcion_at', 'fin_recepcion_at', 'llamado_lugar_at', 'inicio_lugar_at', 'fin_lugar_at', 'espera_recepcion_min', 'servicio_lugar_min', 'total_cobrado', 'metodo_pago', 'examenes', 'consent_firmados', 'consent_pendientes', ]; // ── Output ──────────────────────────────────────────────────── header('Content-Type: text/csv; charset=utf-8'); header('Content-Disposition: attachment; filename="turnero_' . $fecha . '.csv"'); header('Cache-Control: no-cache, no-store, must-revalidate'); $out = fopen('php://output', 'w'); echo "\xEF\xBB\xBF"; // BOM UTF-8 para Excel fputcsv($out, $headers, ',', '"'); foreach ($rows as $row) { $line = []; foreach ($fields as $f) { $v = $row[$f] ?? ''; // Formatear fechas: quitar segundos fraccionarios si los hay if ($v && in_array($f, ['creado_at','llamado_recepcion_at','inicio_recepcion_at','fin_recepcion_at','llamado_lugar_at','inicio_lugar_at','fin_lugar_at'])) { $v = $v ? date('d/m/Y H:i:s', strtotime($v)) : ''; } $line[] = $v ?? ''; } fputcsv($out, $line, ',', '"'); } fclose($out); exit;