// 1. Validation côté front (checkout) add_action('woocommerce_checkout_process', 'verifier_stock_avant_validation'); function verifier_stock_avant_validation() { foreach (WC()->cart->get_cart() as $cart_item) { $product = $cart_item['data']; $qty = $cart_item['quantity']; if ($product && $product->managing_stock()) { $stock = $product->get_stock_quantity(); if (($stock - $qty) < 0) { wc_add_notice("Stock insuffisant pour le produit : " . $product->get_name(), 'error'); error_log("CHECKOUT - Stock insuffisant pour le produit : " . $product->get_name() . " | Stock actuel : $stock | Demandé : $qty"); } } } } // 2. Sécurité backend : empêcher la réduction de stock si stock insuffisant add_filter('woocommerce_can_reduce_order_stock', 'ne_pas_reduire_stock_si_insuffisant', 10, 2); function ne_pas_reduire_stock_si_insuffisant($can_reduce, $order) { foreach ($order->get_items() as $item) { $product = $item->get_product(); if ($product && $product->managing_stock()) { $stock = $product->get_stock_quantity(); $qty = $item->get_quantity(); if (($stock - $qty) < 0) { error_log("BACKEND - Stock insuffisant pour le produit : " . $product->get_name() . " | Stock actuel : $stock | Demandé : $qty"); return false; // Évite une réduction de stock incohérente } } } return $can_reduce; } add_filter('woocommerce_can_reduce_order_stock', 'ajouter_note_si_stock_insuffisant', 20, 2); function ajouter_note_si_stock_insuffisant($can_reduce, $order) { $note_added = false; foreach ($order->get_items() as $item) { $product = $item->get_product(); if ($product && $product->managing_stock()) { $stock = $product->get_stock_quantity(); $qty = $item->get_quantity(); if (($stock - $qty) < 0) { $message = "⚠️ Réduction de stock annulée pour le produit : " . $product->get_name() . " | Stock actuel : $stock | Quantité commandée : $qty"; error_log("ADMIN NOTE - " . $message); if (!$note_added && method_exists($order, 'add_order_note')) { $order->add_order_note($message, false); // false = note privée (admin seulement) $note_added = true; } return false; // On empêche la réduction de stock } } } return $can_reduce; }