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); }