fetchAll( "SELECT o.id, p.nombre_completo AS paciente, p.numero_documento, p.eps, o.estado, o.medico_nombre, o.fecha_orden, o.examenes_solicitados, o.requiere_ayuno, o.horas_ayuno, o.created_at, ar.full_name AS revisada_por, aa.full_name AS autorizada_por FROM lab_ordenes_medicas o JOIN lab_pacientes p ON p.id = o.paciente_id LEFT JOIN admin_users ar ON ar.id = o.revisada_por LEFT JOIN admin_users aa ON aa.id = o.autorizada_por WHERE DATE(o.created_at) BETWEEN ? AND ? ORDER BY o.created_at DESC", [$desde, $hasta] ); $filename = "ordenes_$desde\_$hasta.csv"; $headers = ['ID','Paciente','Documento','EPS','Estado','Médico','Fecha Orden','Exámenes','Ayuno','H.Ayuno','Creada','Revisada por','Autorizada por']; break; case 'domicilios': // Soporta filtros extra enviados desde lab_domicilios.php $sqlWhere = 'DATE(d.fecha_programada) BETWEEN ? AND ?'; $sqlParams = [$desde, $hasta]; // Si viene fecha única (filtro de día), tiene prioridad sobre desde/hasta if (!empty($_GET['fecha'])) { $sqlWhere = 'd.fecha_programada = ?'; $sqlParams = [$_GET['fecha']]; } if (!empty($_GET['estado'])) { $sqlWhere .= ' AND d.estado = ?'; $sqlParams[] = $_GET['estado']; } if (!empty($_GET['enfermera_id'])) { $sqlWhere .= ' AND a.enfermera_id = ?'; $sqlParams[] = (int)$_GET['enfermera_id']; } $rows = $db->fetchAll( "SELECT d.id, p.nombre_completo AS paciente, p.numero_documento, p.telefono AS tel_paciente, p.eps, d.fecha_programada, d.hora_programada, d.hora_llegada, d.hora_salida, CASE WHEN d.hora_llegada IS NOT NULL AND d.hora_salida IS NOT NULL THEN CONCAT(TIMESTAMPDIFF(MINUTE, d.hora_llegada, d.hora_salida), ' min') ELSE '' END AS duracion_domicilio, d.estado, COALESCE(e.nombre_completo,'Sin asignar') AS enfermera, d.tipo_servicio, d.tipo_cliente, COALESCE(d.seguro_nombre,'') AS seguro, d.autorizacion, d.examenes_solicitados, d.direccion, d.barrio, d.ciudad, COALESCE(d.valor_domicilio,0) AS valor_domicilio, COALESCE(d.valor_copago,0) AS valor_copago, COALESCE(d.copago_laboratorio,0) AS copago_laboratorio, d.pago_estado, d.pago_modo, COALESCE(d.pago_monto,0) AS monto_recibido, d.observaciones, d.created_at, COALESCE(nc.antecedentes,'') AS antecedentes, COALESCE(nc.medicamentos,'') AS medicamentos, COALESCE(nc.acudiente_nombre,'') AS acudiente_nombre, COALESCE(nc.acudiente_documento,'') AS acudiente_documento, COALESCE( (SELECT GROUP_CONCAT(CONCAT(COALESCE(nl.titulo,''), ': ', COALESCE(nl.cuerpo,'')) ORDER BY nl.created_at ASC SEPARATOR ' | ') FROM lab_domicilio_notas nl WHERE nl.domicilio_id = d.id AND nl.tipo = 'libre'), '') AS notas_libres FROM lab_domicilios d JOIN lab_pacientes p ON p.id = d.paciente_id LEFT JOIN lab_asignaciones a ON a.domicilio_id = d.id AND a.estado NOT IN ('liberada') LEFT JOIN lab_enfermeras e ON e.id = a.enfermera_id LEFT JOIN lab_domicilio_notas nc ON nc.domicilio_id = d.id AND nc.tipo = 'clinica' WHERE $sqlWhere ORDER BY d.fecha_programada ASC, d.hora_programada ASC", $sqlParams ); $rangoLabel = !empty($_GET['fecha']) ? $_GET['fecha'] : "{$desde}_{$hasta}"; $filename = "domicilios_{$rangoLabel}.csv"; $headers = [ 'ID','Paciente','Documento','Teléfono','EPS', 'Fecha','Hora programada','Hora llegada','Hora salida','Duración', 'Estado','Enfermera','Tipo servicio','Tipo cliente','Seguro','Autorización', 'Exámenes','Dirección','Barrio','Ciudad', 'Valor domicilio','Valor copago','Copago lab', 'Pago estado','Pago modo','Monto recibido', 'Observaciones','Registrado', 'Antecedentes','Medicamentos','Acudiente nombre','Acudiente documento','Notas libres', ]; break; case 'pacientes': $rows = $db->fetchAll( "SELECT p.id, p.nombre_completo, p.tipo_documento, p.numero_documento, p.telefono, p.email, p.eps, p.ciudad, p.barrio, p.is_active, COUNT(o.id) AS total_ordenes, p.created_at FROM lab_pacientes p LEFT JOIN lab_ordenes_medicas o ON o.paciente_id = p.id GROUP BY p.id ORDER BY p.nombre_completo", [] ); $filename = "pacientes_" . date('Y-m-d') . ".csv"; $headers = ['ID','Nombre','Tipo Doc.','Documento','Teléfono','Email','EPS','Ciudad','Barrio','Activo','Total Órdenes','Registrado']; break; default: http_response_code(400); exit('Tipo de exportación no válido'); } header('Content-Type: text/csv; charset=utf-8'); header("Content-Disposition: attachment; filename=\"$filename\""); header('Pragma: no-cache'); $f = fopen('php://output', 'w'); fputs($f, "\xEF\xBB\xBF"); // BOM UTF-8 para Excel fputcsv($f, $headers); foreach ($rows as $row) { fputcsv($f, array_values($row)); } fclose($f); exit; } $adminNombre = $_SESSION['admin_user']['full_name'] ?? $_SESSION['admin_user']['username'] ?? 'Admin'; ?>