La ida ya existía: ingest_paciente.php recibe el payload con los exámenes y los guarda (y responde con examenes_guardados como acuse); el ERP genera las muestras solo, a partir del tipo de muestra de su catálogo — por eso el payload NO necesita campos nuevos. Lo que no existía era la vuelta: que el sistema del laboratorio pueda saber qué pasó con cada muestra sin que nadie mire el ERP. get_tracking_muestras.php lo resuelve consultando por rango de fechas (tope 31 días) o por documento, con la misma autenticación X-Lab-Key del ingest. Devuelve, por turno: fecha, código, paciente, exámenes en CÓDIGO LEGACY (el que el Data Lab entiende) y cada muestra con tipo, estado, motivo de rechazo, hora y quién la recibió. Solo lectura. scripts/test_tracking_muestras.php: 11 pruebas ejecutando el endpoint real contra la base real con el caso E018 del 27/08 — sus 10 muestras, el coprológico rechazado con su motivo, el filtro por documento, la clave, y la cordura de parámetros. Pendiente humano (no de código): crear MYBPC3 y SONDA en el módulo Exámenes; son los únicos 2 códigos de 265 vistos en RIPS esta semana sin mapeo, y no los invento porque llevan precio y tipo de muestra clínicos. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
75 lines
3.8 KiB
PHP
75 lines
3.8 KiB
PHP
<?php
|
|
/**
|
|
* scripts/test_tracking_muestras.php — php scripts/test_tracking_muestras.php
|
|
*
|
|
* Prueba el endpoint de tracking de muestras ejecutándolo de verdad con la
|
|
* clave real contra la base real. Solo lectura: el endpoint no escribe nada.
|
|
* Caso de referencia: el turno E018 del 27/08, cuyas muestras conocemos
|
|
* (10 tipos, coprológico rechazado con motivo «la trae mañana»).
|
|
*/
|
|
$fallos = 0;
|
|
function ok(string $d, bool $c): void {
|
|
global $fallos;
|
|
echo ($c ? ' ok ' : ' FALLA ') . $d . "\n";
|
|
if (!$c) $fallos++;
|
|
}
|
|
|
|
function llamar(array $get, ?string $clave): ?array {
|
|
$code = '$_SERVER["REQUEST_METHOD"]="GET";'
|
|
. '$_GET=json_decode(getenv("T_GET"),true);'
|
|
. 'if(getenv("T_KEY")!==false && getenv("T_KEY")!=="")'
|
|
. ' $_SERVER["HTTP_X_LAB_KEY"]=getenv("T_KEY");'
|
|
. 'require ' . var_export(dirname(__DIR__) . '/api/lab/get_tracking_muestras.php', true) . ';';
|
|
$cmd = sprintf('T_GET=%s T_KEY=%s php -r %s 2>/dev/null',
|
|
escapeshellarg(json_encode($get)),
|
|
escapeshellarg($clave ?? ''),
|
|
escapeshellarg($code));
|
|
return json_decode(shell_exec($cmd) ?: 'null', true);
|
|
}
|
|
|
|
require_once __DIR__ . '/../config/config.php';
|
|
$clave = LAB_SYNC_KEY;
|
|
|
|
// ── 1. Sin clave: afuera ────────────────────────────────────────────────
|
|
$r = llamar(['desde' => '2026-08-27'], null);
|
|
ok('sin la clave responde no-autorizado', is_array($r) && ($r['ok'] ?? true) === false);
|
|
|
|
// ── 2. Con clave, el día del E018 conocido ──────────────────────────────
|
|
$r = llamar(['desde' => '2026-08-27'], $clave);
|
|
ok('con la clave responde ok', is_array($r) && ($r['ok'] ?? false) === true);
|
|
ok('trae turnos de ese día', ($r['total'] ?? 0) > 0);
|
|
|
|
$e018 = null;
|
|
foreach ($r['turnos'] ?? [] as $t) if ($t['turno'] === 'E018') { $e018 = $t; break; }
|
|
ok('el E018 está en la respuesta', $e018 !== null);
|
|
if ($e018) {
|
|
ok('con sus 10 muestras', count($e018['muestras']) === 10);
|
|
ok('y sus exámenes en código legacy (49)', count($e018['examenes']) === 49);
|
|
$mf = null;
|
|
foreach ($e018['muestras'] as $m) if ($m['tipo'] === 'MF') { $mf = $m; break; }
|
|
ok('el coprológico aparece RECHAZADO con su motivo',
|
|
$mf && $mf['estado'] === 'rechazada' && $mf['motivo_rechazo'] === 'la trae mañana');
|
|
$ss = null;
|
|
foreach ($e018['muestras'] as $m) if ($m['tipo'] === 'SS') { $ss = $m; break; }
|
|
ok('el suero aparece recibido, con quién y cuándo',
|
|
$ss && $ss['estado'] === 'recibida' && !empty($ss['recibida_por']) && !empty($ss['recibida_at']));
|
|
}
|
|
|
|
// ── 3. Filtro por documento ─────────────────────────────────────────────
|
|
if ($e018) {
|
|
$r = llamar(['desde' => '2026-08-27', 'documento' => $e018['numero_documento']], $clave);
|
|
$codigos = array_column($r['turnos'] ?? [], 'turno');
|
|
ok('filtrando por documento solo vienen los turnos de ese paciente',
|
|
in_array('E018', $codigos, true)
|
|
&& count($codigos) === count(array_filter($r['turnos'], fn($t) => $t['numero_documento'] === $e018['numero_documento'])));
|
|
}
|
|
|
|
// ── 4. Cordura de parámetros ────────────────────────────────────────────
|
|
$r = llamar(['desde' => '2026-01-01', 'hasta' => '2026-12-31'], $clave);
|
|
ok('un rango de un año se rechaza (tope 31 días)', ($r['ok'] ?? true) === false);
|
|
$r = llamar(['desde' => 'basura'], $clave);
|
|
ok('una fecha inválida cae al día de hoy sin romperse', ($r['ok'] ?? false) === true);
|
|
|
|
echo "\n" . ($fallos === 0 ? "Todo correcto.\n" : "$fallos pruebas fallaron.\n");
|
|
exit($fallos === 0 ? 0 : 1);
|