Hace unos días nos surgió un pequeño problema en una de las tiendas que administramos en Tiendaprest. Hicimos un desarrollo a medida para que los productos tipo pack tomasen su stock con la cantidad mínima disponible de los productos contenidos en el pack, es decir, si un pack contiene el producto A y el producto B y estos tienen 100 y 150 unidades respectivamente, el producto pack constará que tiene 100 unidades.
Cuando entrabas dentro de la ficha del producto pack, el stock se reflejaba correctamente ya que se hace una llamada a la función estática getQuantityAvailableByProduct de la clase StockAvailable. El problema surge al mostrar las unidades del producto en el listado del backoffice. Este toma directamente la información almacenada en el campo quantity de la tabla stock_availible, lo que en ocasiones descuadraba con la cantidad real del producto que se mostraba en la ficha, lo que generaba al cliente un problema a la hora de gestionar sus existencias fiándose de los datos recibidos en el listado.
Para solucionar este problema hay que tocar el archivo AdminProductDataProvider.php en la ruta de src > Adapter > Product concretamente sobre la linea 361. dentro del loop foreach que recorre los productos. Añadiremos lo siguiente para cada uno de ellos:
$product['sav_quantity'] = StockAvailable::getQuantityAvailableByProduct( $product['id_product'] );
Con esto forzamos a que se muestre la cantidad actual de stock del producto haciendo una llamada a getQuantityAvailableByProduct. Hay que tener en cuenta que esta modificación se perderá en caso de actualizar PrestaShop, por lo tanto habrá que rehacerla al actualizar el sistema.
Aprovechamos también para dejar el código que utilizamos para obtener el stock de un producto pack en base a los productos que contenga, por si fuera de utilidad:
if ( Pack::isPack( $id_product)) { $items = Pack::getItems($id_product, Context::getContext()->language->id); $unidades = 999999999; foreach ($items as $item) { $c = StockAvailable::getQuantityAvailableByProduct($item->id, $item->id_pack_product_attribute); if ($c < $unidades) { $unidades = $c; } } $result = $c; }
La imagen anterior muestra un override sobre la función getQuantityAvailableByProduct de StockQuantity.
Con esto y más ¡tu tienda online siempre preparada!