122 lines
3.7 KiB
PHP
122 lines
3.7 KiB
PHP
<?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);
|
||
}
|