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