Voy a explicar como podemos modificar los precios de prestashop de forma masiva por proveedor, fabricante, categoría y en general por todas las opciones de los productos.
Esta modificación esta probada bajo prestashop 1.6.0.9, agradecería si alguien prueba en otras versiones dejen un comentario indicando si funciona o no para informar a otros usuarios. En principio deberá de funcionar en todas las versiones de prestashop que lleven la misma estructura de las tablas de los productos.

Todo esto lo haremos desde mysql sin la necesidad de utilizar ningún módulo que a la larga puede no ser compatible con una posible actualizacion de prestashop.

Lo primero es decir que al instalar prestashop nos da la opcion de escoger un prefijo para las tablas con la idea de poder tener en la misma base de datos varios scripts o por ejemplo varias tiendas prestashop pero que trabajen de forma independiente. Por defecto prestashop utiliza como prefijo:

ps_

¿Como podemos saber nuestro prefijo? Es muy facil al abrir la base de datos en mysql podemos ver a simple vista todas las tablas de esa base de datos, el prefijo será la primera parte del nombre de la tabla que es igual en todas las tablas por ejemplo:

Prefijo base de datos prestashop

Como podemos ver el ps_ es común para todas las tablas, al instalar prestashop podriamos por ejemplo cambiar a ps2_ para crear una segunda tienda totalmente independiente a la primera y en la misma base de datos.
Esto es importante porque en las consultas que pondré utilizaré el prefijo por defecto pero si teneis otro debeis de cambiarlo (En las consultas)

Explicaré la consulta lo más detalladamente posible para la gente que no sepa como funcionan.
El precio de los productos se guardan en dos tablas que serian :

ps_product
ps_product_shop

Como veis utilizo el prefijo por defecto.

En estas dos tablas tendremos todo lo referente a los productos, precio, categorias, fabricante, proveedor etc. y el precio en concreto está en las dos, creo que por algún motivo agregado en alguna version al agregar la opcion de multitienda, pero tampoco lo se exactamente. Al realizar el cambio manualmente desde el back office se cambia en las dos tablas, así que vamos a hacer lo mismo, como si cambiasemos los productos uno a uno.

En las bases de datos los datos se guardan siempre con un id (identidad o identificacion) que es lo que se utiliza para extraer los datos, por ejemplo al guardar un fabricante con el nombre adidas se le asigna un id si es el primero se le asigna el id 1 y si creamos un segundo fabricante se le asiganará el id 2 y asi respectivamente esto se hace para poder modificar otros parametros como por ejemplo el nombre sin que se vea afectado en otras partes de la web.

Dicho esto, pasaré a explicar algunos campos de la tabla ps_product:

id_product id del producto
id_supplier id del proveedor
id_manufacturer id del fabricante
id_category_default id de categoria por defecto
price precio final sin iva
wholesale_price Precio de compra o mayorista sin iva

Para esto utilizaremos la siguiente consulta mysql (ojo con los prefijos):

UPDATE ps_product p, ps_product_shop pp SET p.COLUMAQUEQUEREMOSCAMBIAR = VALOR,pp.COLUMAQUEQUEREMOSCAMBIAR = VALOR WHERE p.COLUMNADONDE = VALOR AND p.id_product = pp.id_product

Bien pongamos un ejemplo real, al cambio de año uno de nuestro proveedores nos dice que para el próximo las tarifas aumentan un 5 %.
Esto a nosotros nos supondría tener que aumentar todos los productos de ese proveedor ese 5 % en el precio de compra o mayorista y en el precio final que es por el que lo queremos vender si queremos ganar lo mismo.

Lo primero es explicar un poco de matemáticas, para sumar un 5% a un valor se puede hacer multiplicando por 1.05, un 10% 1.10. Y para restar a un valor un 5% se puede hacer multiplicando por 0.95 si queremos restar un 10% multiplicamos por 0.90 es decir el valor igual es 1 porque valor x 1 = Valor.

Teniendo esto en cuenta la consulta sería así

UPDATE ps_product p, ps_product_shop pp SET p.price = p.price*1.05,pp.price = pp.price*1.05 WHERE p.id_supplier = 1 AND p.id_product = pp.id_product

Lo que viene a decir esto es:

Actualizar tabla ps_product como (a partir de ahora la identificaremos como p) p, ps_product_shop como (a partir de ahora se la identificaremos como pp) pp CONFIGURAR de la tabla ps_product (p) la columna price que es igual a precio por 1.05, de la tabla ps_product_shop (pp) la columna price que es igual al price por 1.05 donde en la tabla ps_product el valor de id_supplier = 1 y en la tabla de ps_product (p) el id del producto = al id de producto de la tabla ps_product_shopt (pp).

Al explicarlo parece mas engorroso pero si traduciis las palabras en ingles update por actualizar y where por donde entendereis la consulta.

Buen con esto modificamos el precio final ahora vamos a modificar el precio de compra, precio mayorista, o precio de proveedor como le querais llamar.
Deciamos que el precio de compra es la columna wholesale_price bien pues miramos en nuestro backoffice el id del mayorista en mi caso el id 1 y creamos la consulta.

UPDATE ps_product p, ps_product_shop pp SET p.wholesale_price = p.wholesale_price*1.05,pp.wholesale_price = pp.wholesale_price*1.05 WHERE p.id_supplier = 1 AND p.id_product = pp.id_product

Ahora imaginemos que en vez de un 5 % queremos subirlo 5 Euros, dolares o lo que querais subirlo 5 puntos. Tendrías que cambiar en nuestra consulta el:

wholesale_price*1.05

por

wholesale_price+5

para restar:

wholesale_price-5

Otro ejemplo, supongamos que queremos bajar los precios de una categoria por ejemplo la categoria deportes un 5% por 2 días.
Nos vamos al backoffice y miramos el id de la categoria en la que queremos el descuento hay que decir que las categorias y las subcategorias en realidad es lo mismo por lo que no afectará, nosotros miramos el id.
En mi caso el id es el id 12 y deciamos que la tabla de la categoria por defecto es la id_category_default y las tablas de precios son price ok pues lo tenemos todo, nos cogemos la consulta base y cambiamos los nombres de las tablas:

UPDATE ps_product p, ps_product_shop pp SET p.price = p.price*0.95,pp.price = pp.price*0.95 WHERE p.id_category_default = 12 AND p.id_product = pp.id_product

Despues de los dos días generamos la misma consulta pero modficando:

price*0.95

por:

price*1.05

Quizas para algunos pueda parecer dificil de entender pero realmente es bastante sencillo una vez que se entiende, para los que sepan un mínimo de mysql les parecerá una atentica chorrada super efectiva. Intente explicarlo lo más sencillo posible pero lo funcamental es entender la consulta antes de realizar ningún cambio luego el resto es coser y cantar. Los cambios realizados directamente en la base de datos son definitivos por lo que recomiendo realizar una copia de seguridad antes de realizar ningun cambio por si algo os saliera mal y en ese caso restaurarla. Yo he realizado todas las consultas de este artículo y he comprobado que todas funcionan perfectamente.

He visto algún modulo gratuito bastante truño, he visto otros por 80 € para hacer esto que principalmente son a través de tablas de excel que al final hacen lo mismo y es mas lioso, hasta la fomula es igual. Los que no son por excel no localice ninguno que permita ni modificar masicamente el precio de compra.

Espero que os sirva de ayuda y como siempre en este tipo de cosas:

Usenlo bajo su responsibilidad, no me hago responsable de cualquier problema que tengan por instalar y/o usar esta modificacion o por el su mal uso.

por korud

15 comentario en “Modificar precios prestashop masivamente”
  1. Hola.
    En primer lugar dar las gracias por estas ayudas. Pero aún me queda alguna duda; exactamente como hacer para cambiar los precios de una categoría en un determinado porcentaje; o sea, si quiero incrementar (o disminuir, pero en mi caso es incrementar) un 3% los productos de una categoría determinada, luego repetir la operación en otra categoría incrementando solo un 2%, y así sucesivamente. Por lo que explicas aquí, imagino que se podrán escribir las órdenes todas juntas en la base de datos en la pestaña de SQL. En este caso, ¿se hace en líneas independientes? Quiero decir, si no se escribe todo seguido, sino que se escribe cada orden en una línea.
    O si por el contrario, se escriben todas las órdenes separadas por comas o por puntos y coma.
    También saber si al tener un precio especial e aplicar el incremento del 3%, ¿Éste también cambia? o sea, ¿aplica directamente ese incremento al precio especial antiguo?
    Disculpa por mi ignorancia.
    Gracias de nuevo por toda la info.

    Un saludo

    1. jorgecdli Hola, No recuerdo muy bien ahora mismo la estructura de la base de datos de prestashop, pero intentaré responderte a lo que preguntas.

      Respecto a si se puede hacer todo en una sola consulta, te recomendaria que lo hicieras por separado. Primero una categoria y luego otra si no controlas de mysql. Con la práctica y una vez tengas las lineas funcionando puedes probar a unirlas en una sola, pero sería una consulta bastante compleja. Si quieres hacerlo todo a la vez puedes copiar, modificar y resubir la base de datos una vez modificada y así se cambiarías todo al mismo tiempo.

      Respecto si cambia el precio especial, lo desconozco, es decir depende de como lo gestione prestashop. Si el precio especial se guarda en la base de datos, en principio no se cambiaría automaticamente, pero si en cambio si lo que se guarda en la base de datos es por ejemplo un tanto por ciento, si se cambiaría. Me explico: Si el precio se calcula cada vez que se muestre en un artículo o producto por ejemplo -10% del precio se debería cambiar porque lo calcula cada vez del precio "base" pero si se guarda en la base de datos como un total por ejemplo 10,99 € no se cambiaría, porque se muestra lo que está en la base de datos.

      De todas formas te recomiendo que crees una copia de tu prestashop, archivos y base de datos y pruebes, si tienes la web funcionando puedes crear una copia en un subdominio y ponerla en mantenimiento para que solo puedas entrar tu como administrador o tambien en tu propio pc con el programa xampp, si no lo conoces te crea un servidor en tu pc con mysql entre otras opciones muy util y práctico para realizar modificaciones. Podrás realizar los cambios y comprobar el funcionamiento, ver si es correcto o si se han cometido errores y una vez lo tengas claro, aplicarlo a la tienda online o directamente subir la base de datos modificada.

      1. Muchas gracias, @koruitch !! Muy buena idea lo de probar con el xampp. De hecho primero monte la tienda en local y luego la subí al servidor. Ya no la tengo, pero tengo otra en local y probaré ahí.
        Y en principio también veía mejor hacer cambios categoría a categoría, sin liarme, pero era por si había una fórmula mágica para ello. 😉
        Lo que quería exactamente era la orden explícita para cambiar un precio determinado (de mayorista, o de venta) en un porcentaje dado, por categoría. Aquí mencionas la subida por porcentaje para el total de la tienda, o una subida de una determinada cantidad para una categoría: de ahí mi pregunta, pues no sé reflejar la orden determinada en mysql. ¿Podrías, pues, darme un ejemplo de una subida de un 2% del precio de mayorista en una categoría determinada?
        Luego yo debería solo cambiar el numero de la categoria y/o el precio de venta o precio de mayorista. ¿no?
        Muchas gracias por todo.

        1. @jorgecdli según entiendo es más o menos el ejemplo que pongo de camiar el precio del mayorista pero agregandole una condición más de la categoría pero no recuerdo la estructura de la base de datos y no tengo ninguno instalado. Más o menos sería el ejemplo de arriba:

          UPDATE ps_product p, ps_product_shop pp SET p.wholesale_price = p.wholesale_price*1.02,pp.wholesale_price = pp.wholesale_price*1.02 WHERE p.id_supplier = 1 AND p.id_product = pp.id_product

          y le agregamos la condición de la categoría al final:

          AND p.id_category_default = 12

          quedaria algo así:

          UPDATE ps_product p, ps_product_shop pp SET p.wholesale_price = p.wholesale_price*1.02,pp.wholesale_price = pp.wholesale_price*1.02 WHERE p.id_supplier = 1 AND p.id_product = pp.id_product AND p.id_category_default = 12

          creo que debería de funcionar y creo que es lo que quieres hacer. Debes de cambiar el 12 por el id de la categoría y el 1 por el id del proveedor. Algo así. No lo puedo comprobar por lo que dije antes.

  2. @koruitch genial la explicación, muy fácil y sencillo. Ya se que hace mucho tiempo desde este tutorial, pero sigue siendo perfectamente válido, y yo he llegado a él después de mucho buscar. Ahora bien, me surge una duda, que no he conseguido solucionar. ¿es posible aumentar directamente el precio con iva? Te lo digo, porque tengo un cliente que siempre trabaja con números redondos. Es decir, 29,39,49,59,69, y claro, el me dice, hay que subir por ejemplo, 30€ los productos de 99€ por ejemplo, es decir a 129. Y claro, mátate tu para calcular el precio base a aplicar para que cuadre a 129€. Jugando con el precio base,he llegado a dejarlo en 129.01, pero eso no les vale…y es un engorro. Te agradeceria mucho si me echas un cable.

    Saludos y gracias!

  3. En lugar de subir todos los precios de una categoría ¿es posible subir los precios solamente de un determinado grupo de productos? Por ejemplo, subir los precios de los productos de la categoría A con ID comprendidas entre X y XX.

    Gracias por el aporte y un saludo,

    1. Si, sin problema tienes que agregar las codiciones despues del Where (donde). Puede hacer algo asi copio el ejemplo del ultimo codigo del post:
      UPDATE ps_product p, ps_product_shop pp SET p.price = p.price*0.95,pp.price = pp.price*0.95 WHERE p.id_category_default = 12 AND p.id_product = pp.id_product AND p.id_product > 50 AND p.id_product < 100.

      Los simbolos -mayor que-. Creo que se podría usar también 50 AND p.id_product <= 100 " esto viene diciendo "donde id producto es mayor que 50 e id producto es menor o igual que 100". Deberia de funcionar. Se puede hacer complicandolo más pero creo que podría funcionar así y todo el mundo lo entiende.

  4. Buenas tardes buen tutorial y muy bien explicado. Pero tengo un par de dudas me gustaría realizar la consulta de reducir el precio por categorías, seria a mas de una y quisiera saber como podría poner más de 1 categoría en una sola sentencia, y la otra cosilla es como podría activar esa sentencia automáticamente como si fuera un cron jobs.
    Muchas gracias de antemano.

    1. Lo de cron jobs no te puedo ayudar, nunca lo he tenido que usar y no tengo ni idea. Para lo de seleccionar mas de una categoría lo puedes hacer con «OR» (o), es jugar con OR, AND y parentesis si fueran necesarios para establecer las condiciones que quieras hacer, te pongo un ejemplo:

      UPDATE ps_product p, ps_product_shop pp SET p.price = p.price*0.95,pp.price = pp.price*0.95 WHERE p.id_category_default = 12 OR p.id_category_default = 1 AND p.id_product = pp.id_product

      Deberia de modificar los precios de la categoria 12 y la categoría 1 aunque es posible que tenga haya que añadir parentesis no estoy seguro. Asi con parentesis:

      UPDATE ps_product p, ps_product_shop pp SET p.price = p.price*0.95,pp.price = pp.price*0.95 WHERE (p.id_category_default = 12 OR p.id_category_default = 1) AND p.id_product = pp.id_product

      1. Ok muchas gracias, lo del cron jobs parece ser que es algo más complicado, así que me he decantado por un disparador o trigger, aun no lo he podido hacer funcionar cuando lo tenga todo correcto lo enviaré por si ha alguien le sirviera no obstante si alguien sabe hacerlo escucho proposiciones.

  5. Buenos días soy nuevo en esto y estoy haciendo una tienda virtual con prestashop, tengo 1400 productos de los cuales no tengo precio de venta pero si tengo el precio mayorista, mi pregunta es la siguiente, mediante un sql podría añadir el precio de venta calculándolo por el precio mayorista mas un % de incremento, podrían ayudarme en el sql por favor.

    Gracias

    1. Si, tienes que hacer la multiplicación similar al tutorial. lo que no se es si prestashop tiene esta opción para aumentar automáticamente a todos los productos el mismo %.

Deja una respuesta

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