This commit is contained in:
Lizandro Guarnizo
2026-04-18 23:41:01 -05:00
parent 876e935a66
commit 318a1742cc
37 changed files with 8838 additions and 89 deletions
@@ -0,0 +1,121 @@
<?php
/**
* modules/registro_exams/api/save_resultado.php
* POST — agrega o reemplaza resultados de un ítem de examen.
*
* Body JSON:
* {
* "item_id": int, // requerido
* "resultados": [
* {
* "campo_nombre": "Hemoglobina",
* "valor_texto": "14.5",
* "valor_numerico": 14.5, // null si no aplica
* "unidad": "g/dL",
* "referencia_min": 12.0, // null si no aplica
* "referencia_max": 16.0,
* "referencia_texto":"12.0 16.0 g/dL",
* "es_anormal": false
* },
* ...
* ]
* }
*
* Respuesta: { ok: true, inserted: N }
*/
require_once __DIR__ . '/_helpers.php';
requireMethod('POST');
requireExams();
$body = inputJson();
$itemId = isset($body['item_id']) ? (int) $body['item_id'] : 0;
if ($itemId <= 0) {
jsonError('item_id inválido');
}
$resultados = $body['resultados'] ?? [];
if (!is_array($resultados) || count($resultados) === 0) {
jsonError('Debe enviar al menos un resultado');
}
$pdo = db();
// Verificar que el ítem existe
$stmt = $pdo->prepare('SELECT id, orden_id FROM exam_items WHERE id = ?');
$stmt->execute([$itemId]);
$item = $stmt->fetch(PDO::FETCH_ASSOC);
if (!$item) {
jsonError('Ítem no encontrado', 404);
}
try {
$pdo->beginTransaction();
// Borrar resultados anteriores del ítem (reemplazo completo)
$pdo->prepare('DELETE FROM exam_resultados WHERE item_id = ?')->execute([$itemId]);
$ins = $pdo->prepare('
INSERT INTO exam_resultados
(item_id, campo_nombre, valor_texto, valor_numerico,
unidad, referencia_min, referencia_max, referencia_texto,
es_anormal, ingresado_por)
VALUES
(?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
');
$inserted = 0;
foreach ($resultados as $r) {
$campo = trim($r['campo_nombre'] ?? '');
if ($campo === '') {
continue;
}
$ins->execute([
$itemId,
$campo,
isset($r['valor_texto']) && $r['valor_texto'] !== '' ? $r['valor_texto'] : null,
isset($r['valor_numerico']) && $r['valor_numerico'] !== null ? (float) $r['valor_numerico'] : null,
isset($r['unidad']) && $r['unidad'] !== '' ? $r['unidad'] : null,
isset($r['referencia_min']) && $r['referencia_min'] !== null ? (float) $r['referencia_min'] : null,
isset($r['referencia_max']) && $r['referencia_max'] !== null ? (float) $r['referencia_max'] : null,
isset($r['referencia_texto']) && $r['referencia_texto'] !== '' ? $r['referencia_texto'] : null,
empty($r['es_anormal']) ? 0 : 1,
adminId(),
]);
$inserted++;
}
if ($inserted === 0) {
$pdo->rollBack();
jsonError('No se guardó ningún resultado (verifique los campos)');
}
// Actualizar estado del ítem a resultado_listo
$pdo->prepare(
"UPDATE exam_items SET estado = 'resultado_listo' WHERE id = ?"
)->execute([$itemId]);
// Verificar si todos los ítems de la orden están listos para cerrarla
$stmtCheck = $pdo->prepare(
"SELECT COUNT(*) FROM exam_items
WHERE orden_id = ?
AND estado NOT IN ('resultado_listo','entregado')"
);
$stmtCheck->execute([$item['orden_id']]);
$pendientes = (int) $stmtCheck->fetchColumn();
if ($pendientes === 0) {
$pdo->prepare(
"UPDATE exam_ordenes SET estado = 'completa', updated_at = NOW() WHERE id = ?"
)->execute([$item['orden_id']]);
}
$pdo->commit();
jsonOk(['inserted' => $inserted], 'Resultados guardados');
} catch (\Throwable $e) {
$pdo->rollBack();
jsonError('Error al guardar resultados: ' . $e->getMessage(), 500);
}