Hemos detectado un problema con las versiones 1.7 de PrestaShop (probado en la última 1.7.5.0 y en PS 1.7.3.0). Cuando convertimos desde el backoffice a pedido un carro de la compra de un cliente, el sistema no verifica el stock de los productos en él contenidos.
Si al crear un nuevo pedido desde el backoffice asociado a un cliente lo hacemos partiendo desde un carrito vacío o limpio, no nos encontraremos con este problema, ya que el sistema comprueba el stock de cada producto antes de añadirlo al carro de la compra. Sin embargo, si hacemos un nuevo pedido desde el backoffice basándonos en un carrito de la compra ya existente asociado a un cliente, el sistema permite continuar con el proceso sin hacer ninguna comprobación de stock de los productos contenidos en el carrito. Lo que genera la correspondiente rotura de stock.
Para solucionar este problema hemos hecho un override sobre el controlador: AdminCartsController. Concretamente en su función: getCartSummary de la siguiente manera:
protectec function getCartSummary()
{
$summary = $this->context->cart->getSummaryDetails(null, true);
$stock_problem = false;
if (count($summary['products'])) {
foreach ($summary['products'] as $key => &$product) {
$product['numeric_price'] = $product['price'];
$product['numeric_total'] = $product['total'];
$product['price'] = str_replace($currency->sign, '', Tools::displayPrice($product['price'], $currency));
$product['total'] = str_replace($currency->sign, '', Tools::displayPrice($product['total'], $currency));
$product['image_link'] = $this->context->link->getImageLink($product['link_rewrite'], $product['id_image'],
'small_default');
if (!isset($product['attributes_small'])) {
$product['attributes_small'] = '';
}
$product['customized_datas'] = Product::getAllCustomizedDatas((int)$this->context->cart->id, null,
true, null, (int)$product['id_customization']);
$product['unidades'] = StockAvailableCore::getQuantityAvailableByProduct($product['id_product'],
$product['id_product_attribute']);
if ($product['quantity_available'] < $product['quantity']) {
$stock_problem = true;
$product['reference'] = '<span class="alert alert-danger">'.$product['reference'].
' REVISAR - PROBLEMAS DE STOCK </span>';
}
}
}
if (count($summary['discounts'])) {
foreach ($summary['discounts'] as &$voucher) {
$voucher['value_real'] = Tools::displayPrice($voucher['value_real'], $currency);
}
}
if (isset($summary['gift_products']) && count($summary['gift_products'])) {
foreach ($summary['gift_products'] as &$product) {
$product['image_link'] = $this->context->link->getImageLink($product['link_rewrite'],
$product['id_image'], 'small_default');
if (!isset($product['attributes_small'])) {
$product['attributes_small'] = '';
}
}
}
if ($stock_problem) {
$summary['error'] = true;
} else {
$summary['error'] = false;
}
return $summary;
}
Lo que hacemos es aprovechar el bucle de la función que recorre los artículos del carro, para verificar el stock real de cada uno de ellos. En caso de que un artículo no tenga stock cambiamos su referencia para anunciar esta situación:
product['reference'] = '<span class="alert alert-danger">'.$product['reference'].' REVISAR - PROBLEMAS DE STOCK </span>';
Marcamos el pedido con «error de stock» y añadimos al array de respuesta el estado del pedido para que luego podamos tratarlo en el Json:
$stock_problem = true;
.
.
if ($stock_problem) {
$summary['error'] = true;
} else {
$summary['error'] = false;
}
Una vez realizado este override podemos modificar la plantilla form.tpl situada en:
\carpeta de administración\themes\default\template\controllers\orders\form.tpl
Concretamente podemos editar la función useCart para que nos muestre un aviso de alerta y desactive el botón de confirmar pedido, en caso de que el pedido no tenga el stock suficiente:
function useCart(id_new_cart)
{
id_cart = id_new_cart;
$('#id_cart').val(id_cart);
$('#id_cart').val(id_cart);
$.ajax({
type:"POST",
url: "{$link->getAdminLink('AdminCarts')|addslashes}",
async: false,
dataType: "json",
data : {
ajax: "1",
token: "{getAdminToken tab='AdminCarts'}",
tab: "AdminCarts",
action: "getSummary",
id_cart: id_cart,
id_customer: id_customer
},
success : function(res)
{
if (res.summary.error) {
alert('ATENCION, ESTE CARRITO TIENE PRODUCTOS QUE YA NO TIENEN STOCK,
REVISA LOS MISMOS ANTES DE CONFIRMAR EL PEDIDO');
$('#order_submit_btn').attr("disabled", true);
}
displaySummary(res);
}
});
}
Esperamos que esta aportación os sea de utilidad.
Con esto y más ¡tu tienda online siempre preparada!