add_action('woocommerce_order_status_on-hold', 'notificar_inventario_multistock_sin_descontar', 99, 1); add_action('woocommerce_order_status_processing', 'notificar_inventario_multistock_sin_descontar', 99, 1); function notificar_inventario_multistock_sin_descontar($order_id) { if (!$order_id) return; $order = wc_get_order($order_id); if (!$order) return; // No intervenir en pedidos POS y evitar doble ejecución. if (get_post_meta($order_id, '_yith_pos_store_id', true) || get_post_meta($order_id, '_multistock_aviso_emitido', true)) { return; } $sucursales = [ 8503 => 'Leona Vicario', 86567 => 'Plaza Damas', 117197 => 'Manuel Doblado', ]; foreach ($order->get_items() as $item_id => $item) { $product = $item->get_product(); if (!$product || !$product->managing_stock()) { continue; } $product_id = $product->get_id(); $cantidad_pedida = (int) $item->get_quantity(); // Stock general (solo lectura) $stock_general_actual = (float) $product->get_stock_quantity(); $cubierto_general = min(max(0, $stock_general_actual), $cantidad_pedida); $faltante = $cantidad_pedida - $cubierto_general; $order->add_order_note(sprintf( 'AVISO (sin descuento) "%s": Pedido=%d | Stock general disponible=%s | Cubriría general=%s | Faltante=%s.', $product->get_name(), $cantidad_pedida, wc_format_decimal($stock_general_actual, 2), wc_format_decimal($cubierto_general, 2), wc_format_decimal($faltante, 2) )); if ($faltante <= 0) { continue; } // Multistock (solo lectura) $multistock_serialized = get_post_meta($product_id, '_yith_pos_multistock', true); $multistock_data = $multistock_serialized ? maybe_unserialize($multistock_serialized) : []; if (!is_array($multistock_data) || empty($multistock_data)) { $order->add_order_note(sprintf( 'AVISO (sin descuento) "%s": No hay multistock para cubrir faltante=%d.', $product->get_name(), $faltante )); continue; } // Normalizar para “simular” de dónde saldría $normalizado = []; foreach ($multistock_data as $idx => $datos_tienda) { if (is_array($datos_tienda)) { $store_id = $datos_tienda['store_id'] ?? $datos_tienda['store'] ?? $idx; $stock_tienda = (float)($datos_tienda['stock'] ?? $datos_tienda['qty'] ?? $datos_tienda['quantity'] ?? 0); } else { $store_id = $idx; $stock_tienda = (float)$datos_tienda; } $normalizado[] = ['store_id' => $store_id, 'stock' => max(0, $stock_tienda)]; } usort($normalizado, function($a, $b) { return $b['stock'] <=> $a['stock']; }); $tiendas_usadas = []; $restante = $faltante; foreach ($normalizado as $t) { if ($restante <= 0) break; $descontar = min($t['stock'], $restante); if ($descontar <= 0) continue; $tiendas_usadas[] = ['id' => $t['store_id'], 'cantidad' => $descontar]; $restante -= $descontar; } if (!empty($tiendas_usadas)) { $partes = []; foreach ($tiendas_usadas as $t) { $nombre = $sucursales[$t['id']] ?? ('Tienda ' . $t['id']); $partes[] = $t['cantidad'] . ' de ' . $nombre; } $order->add_order_note(sprintf( 'AVISO (sin descuento) "%s": Para cubrir faltante=%d se tomaría de: %s. Restante sin cubrir=%d.', $product->get_name(), $faltante, implode(', ', $partes), $restante )); } else { $order->add_order_note(sprintf( 'AVISO (sin descuento) "%s": Multistock sin disponibilidad para cubrir faltante=%d.', $product->get_name(), $faltante )); } } update_post_meta($order_id, '_multistock_aviso_emitido', true); } Bienestar sexual – Productos Chinos Mayoreo
⚠️ Advertencia: Esta categoría contiene productos con contenido para adultos. Está destinada exclusivamente para mayores de 18 años. Si eres menor, por favor abandona esta sección.
Puedes mantener GATITA CON LATIGO DE PLUMA por un máximo de 40 minutos.
  • Ordenar por
    ...
Mi carrito
Vistos Recientemente
Categorías