Hay stock en la ficha pero el carrito no deja comprar
Un cliente de Rekire veía stock en la ficha pero el carrito rechazaba el producto. La causa era el campo depends_on_stock, heredado de 1.6, que seguía a 1 en productos migrados. Explicamos cómo comprobarlo y corregirlo sin romper el stock.
Un cliente de Rekire tenía activada la opción de no vender sin stock. Sus productos mostraban unidades disponibles en la ficha, pero al añadirlos al carrito PrestaShop decía que no había existencias. El culpable era un campo heredado de versiones antiguas, depends_on_stock, que en muchos productos migrados se había quedado a 1.
Lo que veía el cliente
Pasaba solo con algunos artículos. La ficha enseñaba stock, el botón de comprar estaba activo y, en el carrito, el producto se rechazaba por falta de existencias. Si se editaba el producto a mano en el back-office y se guardaba, el problema desaparecía para ese artículo. Con cientos de productos afectados, ir uno a uno no era una opción.
Primera sospecha: el stock está en dos sitios
Por razones históricas, PrestaShop guarda la cantidad en dos tablas: en ps_product (campo quantity) y en ps_stock_available, que es la que manda desde la 1.7. Algunos módulos, conectores e importadores escriben solo en una y las dejan desparejadas. Esta consulta, de solo lectura, te dice qué productos sin combinaciones tienen cifras distintas:
SELECT psa.id_product,
psa.quantity AS stock_available,
pp.quantity AS stock_producto
FROM ps_stock_available psa
JOIN ps_product pp ON pp.id_product = psa.id_product
WHERE psa.id_product_attribute = 0
AND psa.quantity <> pp.quantity;La condición id_product_attribute = 0 la hemos añadido nosotros: sin ella, cada combinación sale como diferencia, porque en ps_stock_available hay una fila por combinación y otra con el total del producto. Cambia el prefijo ps_ si tu tienda usa otro.
Igualar esas cifras no resolvió el caso. Otro miembro del grupo lo probó y vio cómo le cambiaban valores que antes tenía a cero: no lances un UPDATE sobre el stock sin una copia de la base de datos y sin entender antes de dónde sale cada número.
La causa real: depends_on_stock
Siguiendo el rastro, Rekire encontró el origen, que según comprobó es frecuente en tiendas que vienen de una migración. En ps_stock_available hay un campo, depends_on_stock, que pertenecía a la gestión avanzada de stock de PrestaShop 1.6 y ya no se usa. En muchos artículos migrados seguía a 1, cuando debe estar a 0. Con ese valor, el carrito no da por buena la cantidad que enseña la ficha y rechaza el producto.
Por eso editar el producto lo arreglaba: al guardar, el back-office deja el campo a 0. Para hacerlo de golpe:
- Haz una copia de la base de datos.
- Comprueba cuántas filas hay afectadas:
SELECT COUNT(*) FROM ps_stock_available WHERE depends_on_stock = 1; - Pon el campo a 0:
UPDATE ps_stock_available SET depends_on_stock = 0 WHERE depends_on_stock = 1; - Vacía la caché de PrestaShop y prueba a comprar uno de los productos que fallaban.
¿Y la tabla de movimientos?
En el mismo hilo salió otra duda: con la gestión avanzada de stock activa en 1.7, la tabla ps_stock_mvt no guarda el id del producto sino un id_stock, que apunta a ps_stock, y esa tabla estaba vacía en todas las tiendas que Rekire revisó. Gustavo contestó que él no toca esas tablas directamente: actualiza el stock con una clase de PrestaShop, que mantiene todo coherente. Es la forma segura de hacerlo desde un conector o un script.
Si te pasa algo parecido
- Si la ficha y el carrito no coinciden, mira primero
depends_on_stock, sobre todo si la tienda viene de 1.6. - Si el stock cambia solo, busca qué módulo o conector escribe en las tablas de stock y a qué hora.
- Para integraciones nuevas, usa las clases de PrestaShop y no SQL directo.
El caso era de una tienda PrestaShop 1.7 con datos migrados. En PrestaShop 9.2 la columna sigue en la tabla, pero el núcleo ya no la tiene en cuenta al comprobar el carrito. Si tu tienda viene de una migración y sigue en 1.7, la comprobación con el SELECT no cuesta nada.
Esto salió en @PrestashopEsp, la mayor comunidad PrestaShop de España en Telegram. Ver la conversación