El funcionamiento corriente de Prestashop sigue mostrando los productos del catálogo aunque no queden unidades de los mismos. Normalmente muestra un mensaje del tipo «Sin unidades» o «Fuera de stock». Incluso te deja configurar desde el panel de administración si quieres que se pueda seguir comprando o no. También puedes instalar un módulo para que el cliente pueda dejar su correo para ser avisado cuando haya unidades.

¿Pero qué pasa si queremos que los productos fuera de stock no se muestren al cliente? Esto puede ser necesario si vendemos productos únicos o de segunda mano y solo tenemos una unidad de cada uno de ellos. No queremos que los productos se borren porque queremos tener un registro de ellos y permitir, por ejemplo, su devolución. Pero si que queremos que pasen a un estado «inactivo» automáticamente para que no se muestren ni en la categoría a la que pertenecen, ni en «productos destacados», ni en «novedades», etc.

He visto gente que lo intenta solucionar editando el product-list.tpl, pero no me parece la mejor solución porque, aunque sólo muestres los productos en stock, siguen teniendo en cuenta los productos fuera de stock para contabilizar el total de productos a listar. Por tanto, si hay 10 productos y 3 fuera de stock, te pondrá 10 de 10 productos, aunque sólo muestre 7.

También he visto que otras personas modifican la clase Category.php, modificando la consulta a la base de datos del método public function getProducts. Modifican la consulta para que seleccione sólo los productos en stock. Está solución es válida para los listados de productos en las categorías, pero por ejemplo no afecta a la página de novedades u a otros módulos como «productos destacados».

Por tanto la solución que más me convence es la de crear un trigger o disparador en la base de datos, de forma que cada vez que se actualicen las unidades de un producto, si son >0, se active el producto, pero si son = 0 se desactive el producto. Así, el producto seguirá existiendo en el panel de administración, pero nunca aparecerá en la parte pública de la página, en ninguna sección ni en ningún módulo.

– Para activar o desactivar un producto hay que cambiar el campo «active» de la tabla ps_product_shop a 1 o a 0 respectivamente.
–  La información sobre el stock de un producto se almacena en la tabla ps_stock_available.

Por tanto, queremos crear un trigger que cambie la visibilidad de un producto (active=0) cuando la cantidad de un producto baje a 0 y que nos vuelva a activar el producto (active=1) cuando la cantidad vuelva a ser superior a 0 (por ejemplo si se realiza la devolución del producto). Un trigger es un disparador que se asocia a una tabla y que se hace saltar cada vez que se borra, actualiza o añade algún registro en esa tabla. Nosotros, como ya hemos dicho, queremos crear un trigger que se dispare cada vez que se actualice algo en la tabla ps_stock_available y que edite el campo active de la tabla ps_product_shop en consecuencia.

Para ello, en phpMyAdmin, iremos a la tabla ps_stock_available y haremos click sobre el elemento del menú «Disparadores» (si la interfaz está en español) o «Triggers» (si la interfaz está en inglés). En esa sección, daremos a «Agregar Disparador» y rellenaremos el formulario como se muestra en la imagen.

trigger

Y eso es todo. También se puede crear este trigger con una consulta SQL:

CREATE TRIGGER `change_active_after_update` AFTER UPDATE ON `ps_stock_available`
FOR EACH ROW
BEGIN
UPDATE ps_product_shop SET active=0 WHERE id_product IN (SELECT id_product FROM ps_stock_available WHERE quantity=0);
UPDATE ps_product_shop SET active=1 WHERE id_product IN (SELECT id_product FROM ps_stock_available WHERE quantity>0);
END