Confirmación de pedidos desde el backoffice sin stock

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);
			}
		});
	}

Espero que esta aportación os sea de utilidad.

Con esto y más ¡tu tienda online siempre preparada!

Te puede interesar

  • Entrada

    Forzar stock en el listado de productos

    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 …

    Seguir leyendo

  • Servicio

    Formación Prestashop

    Gestiona de manera efectiva tu tienda Prestashop: Te enseñamos a usar todo el gestor de contenidos y resolvemos todas tus dudas.

    Seguir leyendo

¿Necesitas ayuda más avanzada para solucionar tus problemas?

Contáctanos o echa un vistazo a nuestros servicios, entre los cuales podrás encontrar varios planes de mantenimiento de Prestahop.

Nuestros servicios

Impulsa la venta online y haz crecer tu negocio en poco tiempo.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *