Hace unos días uno de nuestros clientes nos reportó un problema con PrestaShop que afecta al menos a sus versiones 1.7.3.0 y anteriores. La incidencia surgía cuando se vendía a la vez un producto pack y un producto contenido en el mismo, PrestaShop no tenía en cuenta el stock total del producto contenido y permitía realizar ventas sin stock. Pero mejor los explicamos con un ejemplo:
Pongamos que tenemos un producto pack que es una escoba formada por su cepillo y palo, donde estos últimos son productos estándar contenidos en el pack.
El stock es el siguiente:
- Palo de escoba: 5 unidades
- Cepillo de escoba: 5 unidades
- Pack escoba de cepillo y palo: 5 unidades
Además, tenemos configurado PrestaShop para que cuando se realice una venta de un producto pack descuenta stock tanto del pack como de los productos individuales.
Ahora pongamos el caso de que un cliente nos realiza el siguiente pedido:
- 5 unidades de cepillo de escoba
- 5 unidades del pack escoba
En este caso, no debería de poder completar el pedido, ya que para el mismo necesitaríamos 10 cepillos y solo tenemos 5 en stock. Pues bien, las versiones antiguas de PrestaShop presentan este fallo que nos permite completar este pedido sin el stock necesario.
Para solucionar este problema en Prestahsop 1.7.3.0 hemos hecho un override sobre la función InitContent de OrderController:
public function initContent()
{
$prs = $this->context->cart->getProducts();
$real_stock = array();
foreach ($prs as $pr) {
if (Pack::isPack($pr['id_product'])) {
$pps = Pack::getItems($pr['id_product'],
$this->context->language->id);
foreach ($pps as $ppi) {
$real_stock[$ppi->id][$ppi->id_pack_product_attribute] =
(int)$real_stock[$ppi->id][$ppi->id_pack_product_attribute] +
($ppi->pack_quantity * $pr['cart_quantity']);
}
} else {
$real_stock[$pr['id_product']][$pr['id_product_attribute']] =
(int)$real_stock[$pr['id_product']][$pr['id_product_attribute']] +
($ppi->pack_quantity * $pr['cart_quantity']);
}
foreach ($real_stock as $k => $v) {
foreach ($v as $kk => $vv) {
$s = StockAvailableCore::getQuantityAvailableByProduct($k, $kk);
if ((int)$vv > (int)$s) {
$link = new Link();
Tools::redirect($link->getPageLink('cart').
'?action=show&qpstock=true');
}
}
}
$s = StockAvailableCore::getQuantityAvailableByProduct($pr['id_product'],
$pr['id_product_attribute']);
if ((int)$pr['cart_quantity'] > (int)$s) {
$link = new Link();
Tools::redirect($link->getPageLink('cart').'?action=show');
}
}
return parent::initContent();
}
Este problema ha sido solucionado en las ultimas versiones de PrestaShop.
Con esto y más ¡tu tienda online siempre preparada!