feat: auto-load RIPS exams when patient is selected in recepcion
When a patient with a cedula is selected, the system queries RIPS Manager for exams registered in the last 5 minutes. A green banner shows the count with a "Cargar" button that pre-fills TomSelect. Unmapped exam codes shown as a warning. Banner clears on deselect/reset. - config.php: RIPS_MANAGER_URL constant from env var - api/lab/get_examenes_rips.php: proxy + codigo_legacy mapper - recepcion.php: banner HTML + consultarExamenesRips/cargarExamenesRips JS Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Sonnet 4.6
parent
bffa38e9c0
commit
d0a42dba33
@@ -0,0 +1,81 @@
|
||||
<?php
|
||||
/**
|
||||
* GET /api/lab/get_examenes_rips.php?cedula=X
|
||||
* Consulta al RIPS Manager los exámenes registrados en los últimos 5 minutos
|
||||
* para la cédula indicada, y los mapea a exam_tipos locales por codigo_legacy.
|
||||
*/
|
||||
require_once __DIR__ . '/_helpers.php';
|
||||
requireMethod('GET');
|
||||
|
||||
$cedula = trim($_GET['cedula'] ?? '');
|
||||
if (!$cedula) jsonError('cedula requerida', 400);
|
||||
|
||||
$ripsUrl = defined('RIPS_MANAGER_URL') ? rtrim(RIPS_MANAGER_URL, '/') : '';
|
||||
if (!$ripsUrl) jsonError('RIPS_MANAGER_URL no configurado en el servidor', 503);
|
||||
|
||||
// Llamada server-to-server al RIPS Manager
|
||||
$url = $ripsUrl . '/pacientes/examenes?cedula=' . urlencode($cedula);
|
||||
$ctx = stream_context_create([
|
||||
'http' => [
|
||||
'method' => 'GET',
|
||||
'header' => 'X-Lab-Key: ' . LAB_SYNC_KEY . "\r\n",
|
||||
'timeout' => 8,
|
||||
'ignore_errors' => true,
|
||||
],
|
||||
]);
|
||||
|
||||
$resp = @file_get_contents($url, false, $ctx);
|
||||
if ($resp === false) jsonError('No se pudo conectar con RIPS Manager', 503);
|
||||
|
||||
$data = json_decode($resp, true);
|
||||
if (!($data['ok'] ?? false)) {
|
||||
jsonError($data['error'] ?? 'Error en RIPS Manager', 502);
|
||||
}
|
||||
|
||||
$examenes = $data['examenes'] ?? [];
|
||||
if (!$examenes) {
|
||||
jsonOk(['encontrados' => [], 'no_mapeados' => [], 'total_rips' => 0]);
|
||||
}
|
||||
|
||||
// Mapear COD_EXAMEN → exam_tipos por codigo_legacy
|
||||
$codigos = array_values(array_unique(array_filter(
|
||||
array_map(fn($e) => trim($e['cod_examen'] ?? ''), $examenes)
|
||||
)));
|
||||
|
||||
$encontrados = [];
|
||||
$no_mapeados = [];
|
||||
|
||||
if ($codigos) {
|
||||
$ph = implode(',', array_fill(0, count($codigos), '?'));
|
||||
$stmt = db()->prepare(
|
||||
"SELECT id AS exam_tipo_id, codigo, nombre, codigo_legacy
|
||||
FROM exam_tipos
|
||||
WHERE codigo_legacy IN ($ph) AND activo = 1"
|
||||
);
|
||||
$stmt->execute($codigos);
|
||||
$mapa = [];
|
||||
foreach ($stmt->fetchAll(PDO::FETCH_ASSOC) as $r) {
|
||||
$mapa[trim($r['codigo_legacy'])] = $r;
|
||||
}
|
||||
foreach ($codigos as $cod) {
|
||||
if (isset($mapa[$cod])) {
|
||||
$encontrados[] = [
|
||||
'exam_tipo_id' => (int)$mapa[$cod]['exam_tipo_id'],
|
||||
'codigo' => $mapa[$cod]['codigo'],
|
||||
'nombre' => $mapa[$cod]['nombre'],
|
||||
'cod_rips' => $cod,
|
||||
];
|
||||
} else {
|
||||
$no_mapeados[] = $cod;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$meta = $examenes[0] ?? [];
|
||||
jsonOk([
|
||||
'encontrados' => $encontrados,
|
||||
'no_mapeados' => $no_mapeados,
|
||||
'total_rips' => count($examenes),
|
||||
'recepcion_id' => $meta['recepcion_id'] ?? null,
|
||||
'hora' => $meta['hora'] ?? null,
|
||||
]);
|
||||
Reference in New Issue
Block a user