up
This commit is contained in:
@@ -0,0 +1,111 @@
|
||||
<?php
|
||||
/**
|
||||
* modules/registro_exams/api/get_orden.php
|
||||
* GET ?id=<orden_id>
|
||||
* 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,
|
||||
]),
|
||||
]);
|
||||
Reference in New Issue
Block a user