Files
whatsapp/modules/registro_exams/api/save_resultado.php
T
2026-04-18 23:41:01 -05:00

122 lines
3.7 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<?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);
}