* Devuelve la orden completa: datos, paciente, ítems, muestras, resultados. */ require_once __DIR__ . '/_helpers.php'; requireMethod('GET'); requireExams(); $id = isset($_GET['id']) ? (int) $_GET['id'] : 0; if ($id <= 0) { jsonError('ID de orden inválido'); } $pdo = db(); // Orden + paciente $stmt = $pdo->prepare(' SELECT o.id, o.codigo, o.prioridad, o.estado, o.requiere_ayuno, o.horas_ayuno, o.medico_nombre, o.medico_registro, o.diagnostico, o.notas, o.solicitud_id, o.orden_medica_id, o.creado_por, o.creado_at, o.updated_at, p.id AS paciente_id, p.nombre_completo, p.numero_documento, p.tipo_documento, p.telefono, p.email, p.fecha_nacimiento, p.genero, p.eps FROM exam_ordenes o JOIN lab_pacientes p ON p.id = o.paciente_id WHERE o.id = ? '); $stmt->execute([$id]); $orden = $stmt->fetch(PDO::FETCH_ASSOC); if (!$orden) { jsonError('Orden no encontrada', 404); } // Calcular edad if ($orden['fecha_nacimiento']) { $diff = (new DateTime($orden['fecha_nacimiento']))->diff(new DateTime()); $orden['edad'] = $diff->y; } else { $orden['edad'] = null; } // Ítems $stmt = $pdo->prepare(' SELECT ei.id, ei.orden_id, ei.exam_tipo_id, ei.estado, ei.notas_tecnico, ei.creado_at, et.codigo AS tipo_codigo, et.nombre AS tipo_nombre, et.categoria, et.requiere_ayuno AS tipo_requiere_ayuno, et.instrucciones AS tipo_instrucciones FROM exam_items ei JOIN exam_tipos et ON et.id = ei.exam_tipo_id WHERE ei.orden_id = ? ORDER BY et.categoria, et.nombre '); $stmt->execute([$id]); $items = $stmt->fetchAll(PDO::FETCH_ASSOC); // Resultados por ítem $resultadosPorItem = []; if ($items) { $itemIds = array_column($items, 'id'); $inPh = implode(',', array_fill(0, count($itemIds), '?')); $stmt = $pdo->prepare(" SELECT er.*, au.nombre AS ingresado_nombre FROM exam_resultados er LEFT JOIN admin_users au ON au.id = er.ingresado_por WHERE er.item_id IN ({$inPh}) ORDER BY er.item_id, er.id "); $stmt->execute($itemIds); foreach ($stmt->fetchAll(PDO::FETCH_ASSOC) as $res) { $resultadosPorItem[(int) $res['item_id']][] = $res; } } // Agregar resultados a cada ítem foreach ($items as &$item) { $item['resultados'] = $resultadosPorItem[(int) $item['id']] ?? []; } unset($item); // Muestras $stmt = $pdo->prepare(' SELECT em.*, au.nombre AS tomada_nombre FROM exam_muestras em LEFT JOIN admin_users au ON au.id = em.tomada_por WHERE em.orden_id = ? ORDER BY em.id '); $stmt->execute([$id]); $muestras = $stmt->fetchAll(PDO::FETCH_ASSOC); jsonOk([ 'data' => array_merge($orden, [ 'items' => $items, 'muestras' => $muestras, ]), ]);