up
This commit is contained in:
@@ -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);
|
||||
}
|
||||
Reference in New Issue
Block a user