false, 'message' => 'Petición inválida.']; if ($_SERVER['REQUEST_METHOD'] === 'POST') { $sede_id = isset($_POST['sede_id']) ? trim($_POST['sede_id']) : ''; $product_id_raw = isset($_POST['product_id']) ? trim($_POST['product_id']) : ''; $quantity_to_remove = isset($_POST['quantity']) ? (int)$_POST['quantity'] : 0; // Extraer el ID numérico del producto $product_id_parts = explode('-', $product_id_raw); $product_id = end($product_id_parts); if (empty($sede_id) || !is_numeric($product_id) || $quantity_to_remove <= 0) { $response['message'] = 'Por favor, complete todos los campos correctamente.'; echo json_encode($response); exit; } $pdo = db(); $pdo->beginTransaction(); try { // 1. Obtener el stock actual y bloquear la fila para evitar concurrencia $stmt = $pdo->prepare("SELECT quantity FROM stock_sedes WHERE sede_id = :sede_id AND product_id = :product_id FOR UPDATE"); $stmt->execute(['sede_id' => $sede_id, 'product_id' => $product_id]); $stock = $stmt->fetch(PDO::FETCH_ASSOC); $current_quantity = $stock ? (int)$stock['quantity'] : 0; if ($current_quantity < $quantity_to_remove) { $response['message'] = "No se puede retirar más stock del disponible. Stock actual: {$current_quantity}."; $pdo->rollBack(); echo json_encode($response); exit; } // 2. Calcular la nueva cantidad $new_quantity = $current_quantity - $quantity_to_remove; // 3. Actualizar la tabla de stock $update_stmt = $pdo->prepare( "UPDATE stock_sedes SET quantity = :new_quantity WHERE sede_id = :sede_id AND product_id = :product_id" ); $update_stmt->execute([ 'new_quantity' => $new_quantity, 'sede_id' => $sede_id, 'product_id' => $product_id ]); // 4. (Opcional pero recomendado) Registrar el movimiento $movement_stmt = $pdo->prepare( "INSERT INTO stock_movements (product_id, sede_id, quantity, type, movement_date) VALUES (:product_id, :sede_id, :quantity, 'salida', NOW())" ); $movement_stmt->execute([ 'product_id' => $product_id, 'sede_id' => $sede_id, 'quantity' => $quantity_to_remove ]); $pdo->commit(); $response['success'] = true; $response['message'] = "Salida manual registrada con éxito. Stock actualizado a {$new_quantity} unidades."; } catch (PDOException $e) { $pdo->rollBack(); // En un entorno de producción, no deberías exponer el mensaje de error detallado. // Considera registrar el error en un archivo de logs. $response['message'] = 'Error en la base de datos al procesar la solicitud.'; // Mensaje genérico para el usuario } } echo json_encode($response); ?>