144 lines
5.3 KiB
PHP
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);
|
|
}
|