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

144 lines
5.3 KiB
PHP

<?php
/**
* modules/registro_exams/api/cambiar_estado_item.php
* POST — cambia el estado de un ítem, muestra o de la orden entera.
*
* Body JSON:
* {
* "tipo": "item" | "muestra" | "orden",
* "id": int,
* "estado": string, // valor según ENUM de la tabla
* "notas": string // opcional, solo para ítem
* }
*
* Adicional para tipo="muestra" (crear muestra si id=null):
* {
* "tipo": "muestra",
* "id": null, // null = crear nueva
* "orden_id": int,
* "tipo_muestra": "sangre_venosa" | ...,
* "codigo_barras": string,
* "estado": "tomada"
* }
*/
require_once __DIR__ . '/_helpers.php';
requireMethod('POST');
requireExams();
$body = inputJson();
$tipo = $body['tipo'] ?? '';
$estadosItem = ['pendiente','muestra_tomada','en_proceso','resultado_listo','entregado'];
$estadosMuestra = ['pendiente','tomada','procesando','procesada','rechazada'];
$estadosOrden = ['pendiente','en_proceso','completa','entregada','cancelada'];
$pdo = db();
switch ($tipo) {
// ── Cambiar estado de un ítem individual ──────────────────────
case 'item': {
$id = isset($body['id']) ? (int) $body['id'] : 0;
$estado = $body['estado'] ?? '';
if ($id <= 0 || !in_array($estado, $estadosItem, true)) {
jsonError('Parámetros inválidos para ítem');
}
$notas = isset($body['notas']) && $body['notas'] !== '' ? $body['notas'] : null;
// Obtener orden_id para actualizar padre si aplica
$stmtG = $pdo->prepare('SELECT orden_id FROM exam_items WHERE id = ?');
$stmtG->execute([$id]);
$item = $stmtG->fetch(PDO::FETCH_ASSOC);
if (!$item) {
jsonError('Ítem no encontrado', 404);
}
$pdo->prepare(
'UPDATE exam_items SET estado = ?, notas_tecnico = ?, creado_at = creado_at WHERE id = ?'
)->execute([$estado, $notas, $id]);
// Si todos los ítems de la orden están listos → marcar orden como completa
if ($estado === 'resultado_listo' || $estado === 'entregado') {
$stmtC = $pdo->prepare(
"SELECT COUNT(*) FROM exam_items
WHERE orden_id = ?
AND estado NOT IN ('resultado_listo','entregado')"
);
$stmtC->execute([$item['orden_id']]);
if ((int) $stmtC->fetchColumn() === 0) {
$pdo->prepare(
"UPDATE exam_ordenes SET estado = 'completa', updated_at = NOW() WHERE id = ?"
)->execute([$item['orden_id']]);
}
}
jsonOk([], 'Estado actualizado');
}
// ── Crear o actualizar una muestra ──────────────────────────
case 'muestra': {
$id = isset($body['id']) && $body['id'] !== null ? (int) $body['id'] : null;
$estado = $body['estado'] ?? 'tomada';
$ordenId = isset($body['orden_id']) ? (int) $body['orden_id'] : 0;
$tipoMuest = $body['tipo_muestra'] ?? 'sangre_venosa';
$barcode = trim($body['codigo_barras'] ?? '');
if (!in_array($estado, $estadosMuestra, true)) {
jsonError('Estado de muestra inválido');
}
if ($id === null) {
// Crear nueva muestra
if ($ordenId <= 0) {
jsonError('orden_id requerido para crear muestra');
}
$pdo->prepare('
INSERT INTO exam_muestras
(orden_id, tipo_muestra, codigo_barras, tomada_por, tomada_at, estado)
VALUES (?, ?, ?, ?, NOW(), ?)
')->execute([$ordenId, $tipoMuest, $barcode ?: null, adminId(), $estado]);
$newId = (int) $pdo->lastInsertId();
// Marcar ítems como muestra_tomada si están pendientes
$pdo->prepare(
"UPDATE exam_items SET estado = 'muestra_tomada'
WHERE orden_id = ? AND estado = 'pendiente'"
)->execute([$ordenId]);
// Actualizar orden a en_proceso si aún está pendiente
$pdo->prepare(
"UPDATE exam_ordenes SET estado = 'en_proceso', updated_at = NOW()
WHERE id = ? AND estado = 'pendiente'"
)->execute([$ordenId]);
jsonOk(['muestra_id' => $newId], 'Muestra registrada');
} else {
// Actualizar muestra existente
$pdo->prepare(
'UPDATE exam_muestras SET estado = ?, codigo_barras = ? WHERE id = ?'
)->execute([$estado, $barcode ?: null, $id]);
jsonOk([], 'Muestra actualizada');
}
}
// ── Cambiar estado de la orden completa ─────────────────────
case 'orden': {
$id = isset($body['id']) ? (int) $body['id'] : 0;
$estado = $body['estado'] ?? '';
if ($id <= 0 || !in_array($estado, $estadosOrden, true)) {
jsonError('Parámetros inválidos para orden');
}
$pdo->prepare(
'UPDATE exam_ordenes SET estado = ?, updated_at = NOW() WHERE id = ?'
)->execute([$estado, $id]);
jsonOk([], 'Estado de orden actualizado');
}
default:
jsonError('Tipo de operación desconocido: ' . $tipo);
}