nairobi Posted February 1, 2013 Share Posted February 1, 2013 Hola me gustaría saber como se actualiza el stock de todos los artículos que poseo en mi tienda virtual, me explico resulta que tengo una tienda virtual que trabaja con el sistema dropshipping es decir que no tengo stock físico , es el mayorista quien lo tiene y quien se encarga de enviar directamente los pedidos a los clientes. Tengo que decir que yo me puedo descargar desde la página del mayorista los archivos en varios formatos de los productos que estan en stock y los que estan fuera de stock y también de los productos que descatalogan o bien de los productos que añaden nuevos. Lo que quiero saber es que que formato de archivo los descargo y como y donde los tengo que insertar.. Un saludo Link to comment Share on other sites More sharing options...
nadie Posted February 1, 2013 Share Posted February 1, 2013 Hola me gustaría saber como se actualiza el stock de todos los artículos que poseo en mi tienda virtual, me explico resulta que tengo una tienda virtual que trabaja con el sistema dropshipping es decir que no tengo stock físico , es el mayorista quien lo tiene y quien se encarga de enviar directamente los pedidos a los clientes. Tengo que decir que yo me puedo descargar desde la página del mayorista los archivos en varios formatos de los productos que estan en stock y los que estan fuera de stock y también de los productos que descatalogan o bien de los productos que añaden nuevos. Lo que quiero saber es que que formato de archivo los descargo y como y donde los tengo que insertar.. Un saludo Si tienes posibilidad, descargalos en formato CSV. Por otro lado las importaciones masivas o actualizaciones masivas, las puedes hacer en la pestaña Parametros Avanzados -> CVS del panel de tu tienda. Link to comment Share on other sites More sharing options...
nairobi Posted February 1, 2013 Author Share Posted February 1, 2013 Si tienes posibilidad, descargalos en formato CSV. Por otro lado las importaciones masivas o actualizaciones masivas, las puedes hacer en la pestaña Parametros Avanzados -> CVS del panel de tu tienda. Muchas gracias por la respuesta tan rápida.Un saludo Link to comment Share on other sites More sharing options...
donpablito Posted February 23, 2013 Share Posted February 23, 2013 Buenas tardes, pensaba poder actualizar el stock y/o precios del prestashop utilizando la importación masiva .CSV. Efectivamente, si creo un fichero .csv con el mismo numero de REFERENCIA, prestashop me actualiza el campo existente. El problema es que los demas campos que no indico en el CSV viene = 0 o espacio. ----------------------- Lo que necesito es utilizando el campo REFERENCIA como clave, actualizar precio y stock del producto. Alguna ayuda? Link to comment Share on other sites More sharing options...
Sergio Ruiz Posted February 23, 2013 Share Posted February 23, 2013 Buenas tardes, pensaba poder actualizar el stock y/o precios del prestashop utilizando la importación masiva .CSV. Efectivamente, si creo un fichero .csv con el mismo numero de REFERENCIA, prestashop me actualiza el campo existente. El problema es que los demas campos que no indico en el CSV viene = 0 o espacio. ----------------------- Lo que necesito es utilizando el campo REFERENCIA como clave, actualizar precio y stock del producto. Alguna ayuda? No se si algo de esto te vale: http://www.prestashop.com/forums/index.php?/topic/227463-generar-referencias-unicas-14 http://www.prestashop.com/forums/topic/227625-14triggersreferencias-automaticas-productoscombinaciones/ http://www.prestashop.com/forums/index.php?/topic/227452-massedit-pro-14-productos-por-categorias/ Link to comment Share on other sites More sharing options...
donpablito Posted February 25, 2013 Share Posted February 25, 2013 Hola rubalcaba, pues creo que no me sirven. Yo creo un fichero csv con Referencia, Precio Venta, Stock. Necesito actualizar la tabla de los productos utilizando el campo clave Referencia para actualizar precio de venta y stock. No encuentro nada... Link to comment Share on other sites More sharing options...
danivh Posted April 11, 2013 Share Posted April 11, 2013 Hola a todos. Yo soy uno de los muchos que se han vuelto locos para intentar solucionar el problema que plantea donpablito. Al final, picando un poco de aquí y de allá, invirtiendo unas cuantas horas, y tras muchos dolores de cabeza, he conseguido echar a andar un script en php que: - Descarga un archivo csv (comprimido en gz) con los productos de mi tienda de un FTP externo - Descomprime el archivo - Recorre el archivo línea por línea, se conecta a la bb.dd. de prestashop y actualiza: precio de compra, pvp y stock del artículo - Si hay líneas nuevas en el CSV me envía un mail diciendo: Estas referencias no figuran en la bb.dd (para poder darlas de alta si me interesa) El script se ejecuta mediante una tarea cron diariamente a horas de poca carga del servidor (de madrugada) Solo me falta que haga el recorrido inverso, es decir, que cada artículo de la bb.dd. lo busque en el csv, y si no existe me avise: serían artículos que el proveedor ha retirado y debería borrarlos de mi tienda. No tengo ningún interés económico, publicaré en este y algún otro foro el script cuando lo tenga funcionando, pro ahora mismo no tengo mucho tiempo para dedicarle... Link to comment Share on other sites More sharing options...
Sergio Ruiz Posted April 11, 2013 Share Posted April 11, 2013 Hola a todos. Yo soy uno de los muchos que se han vuelto locos para intentar solucionar el problema que plantea donpablito. Al final, picando un poco de aquí y de allá, invirtiendo unas cuantas horas, y tras muchos dolores de cabeza, he conseguido echar a andar un script en php que: - Descarga un archivo csv (comprimido en gz) con los productos de mi tienda de un FTP externo - Descomprime el archivo - Recorre el archivo línea por línea, se conecta a la bb.dd. de prestashop y actualiza: precio de compra, pvp y stock del artículo - Si hay líneas nuevas en el CSV me envía un mail diciendo: Estas referencias no figuran en la bb.dd (para poder darlas de alta si me interesa) El script se ejecuta mediante una tarea cron diariamente a horas de poca carga del servidor (de madrugada) Solo me falta que haga el recorrido inverso, es decir, que cada artículo de la bb.dd. lo busque en el csv, y si no existe me avise: serían artículos que el proveedor ha retirado y debería borrarlos de mi tienda. No tengo ningún interés económico, publicaré en este y algún otro foro el script cuando lo tenga funcionando, pro ahora mismo no tengo mucho tiempo para dedicarle... Si tienes el script, y puedes compartirlo, sera de ayuda para la Comunidad. Un Saludo Link to comment Share on other sites More sharing options...
danivh Posted April 11, 2013 Share Posted April 11, 2013 Lo que he hecho es añadir una línea que pone todo el stock a cero antes de actualizar. <?php /* ACTUALIZADOR PRESTASHOP Actualiza Stock, precio de compra y PVP de nuestros artículos Adaptado, ampliado, retocado, etc por Dani Brokman ([email protected]) Actualmente en uso en www.vayachollo.es si te gusta, envíame un mail Este script en PHP funciona de la siguiente manera: Descarga un archivo CSV comprimido en gz del ftp de nuestro proveedor el proveedor actualiza el archivo una vez al día. Es el unico archivo en el FTP). Una vez descargado, lo renombramos a update.gz (no sabemos el nombre del archivo original, puesto que cambia cada día). Una vez renombrado, lo descomprimimos. Ahora recorremos el archivo CSV, tomando las columnas que nos interesan, y actualizando los valores en nuestra bb.dd. Si en el CSV aparece alguna referencia que no existe en nuestra bb.dd nos enviará un mail indicándonoslo para poder darlo de alta Antes de actualizar stocks, se ponen todos a cero para no tener stock de articulos obsoletos OJO: Tendréis que adaptar el manejo del archivo CSV en función de vuestras necesidades. Tendréis que adaptar la parte del código que recorre el archivo CSV en función de vuestro origen Especial atención a las columnas que necesitamos!! Si teneis stock en local de artículos que no están en el CSV, se os pondrá a 0, salvo que quitéis esa línea */ echo "Descarga de archivo..." . '<br>'; flush(); //-- Datos FTP $ftp_server = "direccion.del.servidor"; $ftp_user_name = "usuario"; $ftp_user_pass = "contraseña"; // conectamos $conn_id = ftp_connect($ftp_server); // login $login_result = ftp_login($conn_id, $ftp_user_name, $ftp_user_pass); // bajamos todo del ftp function ftp_sync ($dir) { global $conn_id; if ($dir != ".") { if (ftp_chdir($conn_id, $dir) == false) { echo ("Change Dir Failed: $dir") . '<br>'; flush(); return; } if (!(is_dir($dir))) mkdir($dir); chdir ($dir); } $contents = ftp_nlist($conn_id, "."); foreach ($contents as $file) { if ($file == '.' || $file == '..') continue; if (@ftp_chdir($conn_id, $file)) { ftp_chdir ($conn_id, ".."); ftp_sync ($file); } else ftp_get($conn_id, $file, $file, FTP_BINARY); } ftp_chdir ($conn_id, ".."); chdir (".."); } ftp_sync ("."); // adios ftp_close($conn_id); echo "Archivo descargado" . '<br>'; flush(); chdir ('/var/www/vhosts/tuweb/httpdocs/updater'); // Busco el archivo y lo renombro $dir = opendir('.'); //$dir = opendir('./updater'); // recorro los archivos del directorio while (false !== ($file = readdir($dir))) { echo "$file<p>" . '<br>'; flush(); // si la extensión es '.gz' if (pathinfo($file, PATHINFO_EXTENSION) == 'gz') { // rename echo "Encontrado archivo $file" . '<br>'; flush(); rename($file, "update.gz"); } } closedir($dir); echo "Archivo renombrado..." . '<br>'; flush(); //descomprimo el archivo echo "Descomprimimos..." . '<br>'; flush(); $sfp = gzopen("update.gz", "rb"); $fp = fopen("update.csv", "w"); while ($string = gzread($sfp, 4096)) { fwrite($fp, $string, strlen($string)); } gzclose($sfp); fclose($fp); echo "Archivo descomprimido..." . '<br>'; flush(); echo "Conectamos a la bb.dd." . '<br>'; flush(); mysql_connect("servidor", "usuario", "contraseña") or die(mysql_error()); mysql_select_db("nombre bb.dd") or die(mysql_error()); // Como la primera fila son los nombres de las columnas: $fila = 1; // Tenemos que actualizar en dos tablas: $update_table = "ps_product inner join ps_stock_available on (ps_product.id_product = ps_stock_available.id_product)"; //antes que nada, stock de todo a 0 para no tener descatalogados con stock: mysql_query ("UPDATE $update_table SET ps_stock_available.quantity=0"); echo "Abrimos el fichero." . '<br>'; flush(); $handle = fopen("update.csv", "r"); $falta = fopen("falta.txt", "w"); echo "Recorremos el CSV..." . '<br>'; flush(); while (($data = fgetcsv($handle, 0, ",")) !== FALSE) { $num = count($data); echo "<p>" . '<br>'; flush(); echo "( $fila )" . '<br>'; flush(); $fila++; for ($c=0; $c < $num; $c++) { if ($c = 3) { //Referencia proveedor $reference = $data[($c - 1)]; $row = mysql_query("SELECT * FROM ps_product WHERE supplier_reference='$reference'") or die (mysql_error()); // $existe = mysql_num_rows($row); // if ($existe == 0) {fwrite ($falta, "La referencia $reference no existe en bb.dd." . PHP_EOL);} // echo $reference . " - Referencia Proveedor" . '<br>'; flush(); } if ($c = 25) { //precio de compra $compra = $data[($c - 1)]; mysql_query("UPDATE $update_table SET wholesale_price='$compra' WHERE supplier_reference='$reference'") or die(mysql_error()); echo $compra . " - Coste actualizado" . '<br>'; flush(); } if ($c = 33) { //Stock $quantity = $data[($c - 1)]; mysql_query("UPDATE $update_table SET ps_stock_available.quantity='$quantity' WHERE supplier_reference='$reference'") or die(mysql_error()); echo $quantity . " - Stock actualizado" . '<br>'; flush(); } if ($c = 37) { //Precio PVP $price = $data[($c - 1)]; mysql_query("UPDATE $update_table SET price='$price' WHERE supplier_reference='$reference'") or die(mysql_error()); echo $price . " - PVP actualizado" . '<br>'; flush(); } echo "_____________________________________________________<p>"; } } fclose($handle); fclose($falta); //mandamos el archivo por mail # Leer el contenido del archivo $archivo = file_get_contents("falta.txt"); # De quien $nombre_from = 'Nombre tienda'; $email_from = "[email protected]"; # Para quien $email_to = "[email protected]"; # Asunto $asunto = "Articulos faltantes"; # Encabezado del E-mail $header = "From: ".$nombre_from." <".$email_from.">\r\n"; # Envio del email $ok = mail($email_to,$asunto,$archivo,$header); # Si el email se envío, se imprime... echo ($ok) ? "Enviado..." : "Falló el envío"; echo " <p>" . '<br>'; flush(); echo " - - - ACTUALIZACION COMPLETADA - - - <p>" . '<br>'; flush(); //Borro los archivos viejos para no tener problema al renombrar o descargar unlink('update.csv'); unlink('update.gz'); unlink('falta.txt'); echo "Archivos temporales eliminados" . '<br>'; flush(); echo "Todo hecho" . '<br>'; flush(); ?> 1 Link to comment Share on other sites More sharing options...
txar Posted May 22, 2013 Share Posted May 22, 2013 Lo que he hecho es añadir una línea que pone todo el stock a cero antes de actualizar. <?php /* ACTUALIZADOR PRESTASHOP Actualiza Stock, precio de compra y PVP de nuestros artículos Adaptado, ampliado, retocado, etc por Dani Brokman ([email protected]) Actualmente en uso en www.vayachollo.es si te gusta, envíame un mail Este script en PHP funciona de la siguiente manera: Descarga un archivo CSV comprimido en gz del ftp de nuestro proveedor el proveedor actualiza el archivo una vez al día. Es el unico archivo en el FTP). Una vez descargado, lo renombramos a update.gz (no sabemos el nombre del archivo original, puesto que cambia cada día). Una vez renombrado, lo descomprimimos. Ahora recorremos el archivo CSV, tomando las columnas que nos interesan, y actualizando los valores en nuestra bb.dd. Si en el CSV aparece alguna referencia que no existe en nuestra bb.dd nos enviará un mail indicándonoslo para poder darlo de alta Antes de actualizar stocks, se ponen todos a cero para no tener stock de articulos obsoletos OJO: Tendréis que adaptar el manejo del archivo CSV en función de vuestras necesidades. Tendréis que adaptar la parte del código que recorre el archivo CSV en función de vuestro origen Especial atención a las columnas que necesitamos!! Si teneis stock en local de artículos que no están en el CSV, se os pondrá a 0, salvo que quitéis esa línea */ echo "Descarga de archivo..." . '<br>'; flush(); //-- Datos FTP $ftp_server = "direccion.del.servidor"; $ftp_user_name = "usuario"; $ftp_user_pass = "contraseña"; // conectamos $conn_id = ftp_connect($ftp_server); // login $login_result = ftp_login($conn_id, $ftp_user_name, $ftp_user_pass); // bajamos todo del ftp function ftp_sync ($dir) { global $conn_id; if ($dir != ".") { if (ftp_chdir($conn_id, $dir) == false) { echo ("Change Dir Failed: $dir") . '<br>'; flush(); return; } if (!(is_dir($dir))) mkdir($dir); chdir ($dir); } $contents = ftp_nlist($conn_id, "."); foreach ($contents as $file) { if ($file == '.' || $file == '..') continue; if (@ftp_chdir($conn_id, $file)) { ftp_chdir ($conn_id, ".."); ftp_sync ($file); } else ftp_get($conn_id, $file, $file, FTP_BINARY); } ftp_chdir ($conn_id, ".."); chdir (".."); } ftp_sync ("."); // adios ftp_close($conn_id); echo "Archivo descargado" . '<br>'; flush(); chdir ('/var/www/vhosts/tuweb/httpdocs/updater'); // Busco el archivo y lo renombro $dir = opendir('.'); //$dir = opendir('./updater'); // recorro los archivos del directorio while (false !== ($file = readdir($dir))) { echo "$file<p>" . '<br>'; flush(); // si la extensión es '.gz' if (pathinfo($file, PATHINFO_EXTENSION) == 'gz') { // rename echo "Encontrado archivo $file" . '<br>'; flush(); rename($file, "update.gz"); } } closedir($dir); echo "Archivo renombrado..." . '<br>'; flush(); //descomprimo el archivo echo "Descomprimimos..." . '<br>'; flush(); $sfp = gzopen("update.gz", "rb"); $fp = fopen("update.csv", "w"); while ($string = gzread($sfp, 4096)) { fwrite($fp, $string, strlen($string)); } gzclose($sfp); fclose($fp); echo "Archivo descomprimido..." . '<br>'; flush(); echo "Conectamos a la bb.dd." . '<br>'; flush(); mysql_connect("servidor", "usuario", "contraseña") or die(mysql_error()); mysql_select_db("nombre bb.dd") or die(mysql_error()); // Como la primera fila son los nombres de las columnas: $fila = 1; // Tenemos que actualizar en dos tablas: $update_table = "ps_product inner join ps_stock_available on (ps_product.id_product = ps_stock_available.id_product)"; //antes que nada, stock de todo a 0 para no tener descatalogados con stock: mysql_query ("UPDATE $update_table SET ps_stock_available.quantity=0"); echo "Abrimos el fichero." . '<br>'; flush(); $handle = fopen("update.csv", "r"); $falta = fopen("falta.txt", "w"); echo "Recorremos el CSV..." . '<br>'; flush(); while (($data = fgetcsv($handle, 0, ",")) !== FALSE) { $num = count($data); echo "<p>" . '<br>'; flush(); echo "( $fila )" . '<br>'; flush(); $fila++; for ($c=0; $c < $num; $c++) { if ($c = 3) { //Referencia proveedor $reference = $data[($c - 1)]; $row = mysql_query("SELECT * FROM ps_product WHERE supplier_reference='$reference'") or die (mysql_error()); // $existe = mysql_num_rows($row); // if ($existe == 0) {fwrite ($falta, "La referencia $reference no existe en bb.dd." . PHP_EOL);} // echo $reference . " - Referencia Proveedor" . '<br>'; flush(); } if ($c = 25) { //precio de compra $compra = $data[($c - 1)]; mysql_query("UPDATE $update_table SET wholesale_price='$compra' WHERE supplier_reference='$reference'") or die(mysql_error()); echo $compra . " - Coste actualizado" . '<br>'; flush(); } if ($c = 33) { //Stock $quantity = $data[($c - 1)]; mysql_query("UPDATE $update_table SET ps_stock_available.quantity='$quantity' WHERE supplier_reference='$reference'") or die(mysql_error()); echo $quantity . " - Stock actualizado" . '<br>'; flush(); } if ($c = 37) { //Precio PVP $price = $data[($c - 1)]; mysql_query("UPDATE $update_table SET price='$price' WHERE supplier_reference='$reference'") or die(mysql_error()); echo $price . " - PVP actualizado" . '<br>'; flush(); } echo "_____________________________________________________<p>"; } } fclose($handle); fclose($falta); //mandamos el archivo por mail # Leer el contenido del archivo $archivo = file_get_contents("falta.txt"); # De quien $nombre_from = 'Nombre tienda'; $email_from = "[email protected]"; # Para quien $email_to = "[email protected]"; # Asunto $asunto = "Articulos faltantes"; # Encabezado del E-mail $header = "From: ".$nombre_from." <".$email_from.">\r\n"; # Envio del email $ok = mail($email_to,$asunto,$archivo,$header); # Si el email se envío, se imprime... echo ($ok) ? "Enviado..." : "Falló el envío"; echo " <p>" . '<br>'; flush(); echo " - - - ACTUALIZACION COMPLETADA - - - <p>" . '<br>'; flush(); //Borro los archivos viejos para no tener problema al renombrar o descargar unlink('update.csv'); unlink('update.gz'); unlink('falta.txt'); echo "Archivos temporales eliminados" . '<br>'; flush(); echo "Todo hecho" . '<br>'; flush(); ?> Hola danivh, primero de todo gracias por tu aportación!! La verdad es que muchos somos bastante negados para algunas cosas, y seguro que esto ayuda a agilizar todo el proceso de actualización de stock y productos. Yo tengo la siguiente duda respecto a cómo usar el script: yo también utilizo dropshipping, y me gustaría actualizar el stock cada día (necesario) y los precios cada semana (como mucho bajan, no suben). El problema es que el csv de mi proveedor sólo indica si tiene stock o no (0 no, 1 sí) pero no dice cuanta cantidad. Lo que yo hice al subir el csv fue sustituir el campo de 1 por 1000. Al usar tu script, no sé como debería hacerlo para que sustituyera eso. Espero que hayas entendido mi duda porque a veces me lio hasta yo misma xDD. Un saludo y gracias!! Link to comment Share on other sites More sharing options...
danivh Posted May 22, 2013 Share Posted May 22, 2013 (edited) Hola danivh, primero de todo gracias por tu aportación!! La verdad es que muchos somos bastante negados para algunas cosas, y seguro que esto ayuda a agilizar todo el proceso de actualización de stock y productos. Yo tengo la siguiente duda respecto a cómo usar el script: yo también utilizo dropshipping, y me gustaría actualizar el stock cada día (necesario) y los precios cada semana (como mucho bajan, no suben). El problema es que el csv de mi proveedor sólo indica si tiene stock o no (0 no, 1 sí) pero no dice cuanta cantidad. Lo que yo hice al subir el csv fue sustituir el campo de 1 por 1000. Al usar tu script, no sé como debería hacerlo para que sustituyera eso. Espero que hayas entendido mi duda porque a veces me lio hasta yo misma xDD. Un saludo y gracias!! Tendrías que modificar esto: if ($c = 33) { //Stock $quantity = $data[($c - 1)]; mysql_query("UPDATE $update_table SET ps_stock_available.quantity='$quantity' WHERE supplier_reference='$reference'") or die(mysql_error()); echo $quantity . " - Stock actualizado" . '<br>'; flush(); } Por algo como if ($c = 33) { //Stock if ($quantity = $data[($c - 1)] > 0) { mysql_query("UPDATE $update_table SET ps_stock_available.quantity='1000' WHERE supplier_reference='$reference'"); else mysql_query("UPDATE $update_table SET ps_stock_available.quantity='0' WHERE supplier_reference='$reference'"); or die(mysql_error()); echo $quantity . " - Stock actualizado" . '<br>'; flush(); } Lo acabo de escribir un poco al tuntún... igual me he comido algun punto y coma o paréntesis. Si usas un editor como notepad++ lo verás más fácil. Un saludo. Edited May 22, 2013 by danivh (see edit history) Link to comment Share on other sites More sharing options...
solnuevo Posted May 22, 2013 Share Posted May 22, 2013 Gracias compañero por el aporte y compartirlo. Saludos Link to comment Share on other sites More sharing options...
txar Posted May 23, 2013 Share Posted May 23, 2013 Tendrías que modificar esto: if ($c = 33) { //Stock $quantity = $data[($c - 1)]; mysql_query("UPDATE $update_table SET ps_stock_available.quantity='$quantity' WHERE supplier_reference='$reference'") or die(mysql_error()); echo $quantity . " - Stock actualizado" . '<br>'; flush(); } Por algo como if ($c = 33) { //Stock if ($quantity = $data[($c - 1)] > 0) { mysql_query("UPDATE $update_table SET ps_stock_available.quantity='1000' WHERE supplier_reference='$reference'"); else mysql_query("UPDATE $update_table SET ps_stock_available.quantity='0' WHERE supplier_reference='$reference'"); or die(mysql_error()); echo $quantity . " - Stock actualizado" . '<br>'; flush(); } Lo acabo de escribir un poco al tuntún... igual me he comido algun punto y coma o paréntesis. Si usas un editor como notepad++ lo verás más fácil. Un saludo. Gradias danivh! Entonces todo lo demás lo debo dejar tal cual está? Porque no quiero que me actualice el precio final de compra, si un caso que me avise de que el precio de cesión (el que me da el proveedor) ha cambiado, pero no modificarlo sin saberlo. Es eso posible? Link to comment Share on other sites More sharing options...
danivh Posted June 4, 2013 Share Posted June 4, 2013 Gradias danivh! Entonces todo lo demás lo debo dejar tal cual está? Porque no quiero que me actualice el precio final de compra, si un caso que me avise de que el precio de cesión (el que me da el proveedor) ha cambiado, pero no modificarlo sin saberlo. Es eso posible? Todo es posible... únicamente tendrás que modificar el código a tu gusto. Link to comment Share on other sites More sharing options...
danivh Posted June 4, 2013 Share Posted June 4, 2013 Un detalle. Si utilizáis prestashop 1.5, para que esto funcione habría que modificar las consultas UPDATE para las tablas y campos adecuados de precio de compra y compra, así como tener en cuenta que prestashop siempre maneja precios sin IVA... Como "parche" para mi script se puede añadir esto al final: mysql_query("UPDATE ps_product_shop INNER JOIN ps_product on (ps_product_shop.id_product = ps_product.id_product) SET ps_product_shop.wholesale_price = ps_product.wholesale_price") or die(mysql_error()); mysql_query("UPDATE ps_product_shop INNER JOIN ps_product on (ps_product_shop.id_product = ps_product.id_product) SET ps_product_shop.price = ps_product.price") or die(mysql_error()); Link to comment Share on other sites More sharing options...
erikmlb Posted June 4, 2013 Share Posted June 4, 2013 <?php /* ACTUALIZADOR PRESTASHOP Actualiza Stock, precio de compra y PVP de nuestros artículos Adaptado, ampliado, retocado, etc por Dani Brokman ([email protected]) Actualmente en uso en www.vayachollo.es si te gusta, envíame un mail Este script en PHP funciona de la siguiente manera: Descarga un archivo CSV comprimido en gz del ftp de nuestro proveedor el proveedor actualiza el archivo una vez al día. Es el unico archivo en el FTP). Una vez descargado, lo renombramos a update.gz (no sabemos el nombre del archivo original, puesto que cambia cada día). Una vez renombrado, lo descomprimimos. Ahora recorremos el archivo CSV, tomando las columnas que nos interesan, y actualizando los valores en nuestra bb.dd. Si en el CSV aparece alguna referencia que no existe en nuestra bb.dd nos enviará un mail indicándonoslo para poder darlo de alta Antes de actualizar stocks, se ponen todos a cero para no tener stock de articulos obsoletos OJO: Tendréis que adaptar el manejo del archivo CSV en función de vuestras necesidades. Tendréis que adaptar la parte del código que recorre el archivo CSV en función de vuestro origen Especial atención a las columnas que necesitamos!! Si teneis stock en local de artículos que no están en el CSV, se os pondrá a 0, salvo que quitéis esa línea */ echo "Descarga de archivo..." . '<br>'; flush(); //-- Datos FTP $ftp_server = "direccion.del.servidor"; $ftp_user_name = "usuario"; $ftp_user_pass = "contraseña"; // conectamos $conn_id = ftp_connect($ftp_server); // login $login_result = ftp_login($conn_id, $ftp_user_name, $ftp_user_pass); // bajamos todo del ftp function ftp_sync ($dir) { global $conn_id; if ($dir != ".") { if (ftp_chdir($conn_id, $dir) == false) { echo ("Change Dir Failed: $dir") . '<br>'; flush(); return; } if (!(is_dir($dir))) mkdir($dir); chdir ($dir); } $contents = ftp_nlist($conn_id, "."); foreach ($contents as $file) { if ($file == '.' || $file == '..') continue; if (@ftp_chdir($conn_id, $file)) { ftp_chdir ($conn_id, ".."); ftp_sync ($file); } else ftp_get($conn_id, $file, $file, FTP_BINARY); } ftp_chdir ($conn_id, ".."); chdir (".."); } ftp_sync ("."); // adios ftp_close($conn_id); echo "Archivo descargado" . '<br>'; flush(); chdir ('/var/www/vhosts/tuweb/httpdocs/updater'); // Busco el archivo y lo renombro $dir = opendir('.'); //$dir = opendir('./updater'); // recorro los archivos del directorio while (false !== ($file = readdir($dir))) { echo "$file<p>" . '<br>'; flush(); // si la extensión es '.gz' if (pathinfo($file, PATHINFO_EXTENSION) == 'gz') { // rename echo "Encontrado archivo $file" . '<br>'; flush(); rename($file, "update.gz"); } } closedir($dir); echo "Archivo renombrado..." . '<br>'; flush(); //descomprimo el archivo echo "Descomprimimos..." . '<br>'; flush(); $sfp = gzopen("update.gz", "rb"); $fp = fopen("update.csv", "w"); while ($string = gzread($sfp, 4096)) { fwrite($fp, $string, strlen($string)); } gzclose($sfp); fclose($fp); echo "Archivo descomprimido..." . '<br>'; flush(); echo "Conectamos a la bb.dd." . '<br>'; flush(); mysql_connect("servidor", "usuario", "contraseña") or die(mysql_error()); mysql_select_db("nombre bb.dd") or die(mysql_error()); // Como la primera fila son los nombres de las columnas: $fila = 1; // Tenemos que actualizar en dos tablas: $update_table = "ps_product inner join ps_stock_available on (ps_product.id_product = ps_stock_available.id_product)"; //antes que nada, stock de todo a 0 para no tener descatalogados con stock: mysql_query ("UPDATE $update_table SET ps_stock_available.quantity=0"); echo "Abrimos el fichero." . '<br>'; flush(); $handle = fopen("update.csv", "r"); $falta = fopen("falta.txt", "w"); echo "Recorremos el CSV..." . '<br>'; flush(); while (($data = fgetcsv($handle, 0, ",")) !== FALSE) { $num = count($data); echo "<p>" . '<br>'; flush(); echo "( $fila )" . '<br>'; flush(); $fila++; for ($c=0; $c < $num; $c++) { if ($c = 3) { //Referencia proveedor $reference = $data[($c - 1)]; $row = mysql_query("SELECT * FROM ps_product WHERE supplier_reference='$reference'") or die (mysql_error()); // $existe = mysql_num_rows($row); // if ($existe == 0) {fwrite ($falta, "La referencia $reference no existe en bb.dd." . PHP_EOL);} // echo $reference . " - Referencia Proveedor" . '<br>'; flush(); } if ($c = 25) { //precio de compra $compra = $data[($c - 1)]; mysql_query("UPDATE $update_table SET wholesale_price='$compra' WHERE supplier_reference='$reference'") or die(mysql_error()); echo $compra . " - Coste actualizado" . '<br>'; flush(); } if ($c = 33) { //Stock $quantity = $data[($c - 1)]; mysql_query("UPDATE $update_table SET ps_stock_available.quantity='$quantity' WHERE supplier_reference='$reference'") or die(mysql_error()); echo $quantity . " - Stock actualizado" . '<br>'; flush(); } if ($c = 37) { //Precio PVP $price = $data[($c - 1)]; mysql_query("UPDATE $update_table SET price='$price' WHERE supplier_reference='$reference'") or die(mysql_error()); echo $price . " - PVP actualizado" . '<br>'; flush(); } echo "_____________________________________________________<p>"; } } fclose($handle); fclose($falta); //mandamos el archivo por mail # Leer el contenido del archivo $archivo = file_get_contents("falta.txt"); # De quien $nombre_from = 'Nombre tienda'; $email_from = "[email protected]"; # Para quien $email_to = "[email protected]"; # Asunto $asunto = "Articulos faltantes"; # Encabezado del E-mail $header = "From: ".$nombre_from." <".$email_from.">\r\n"; # Envio del email $ok = mail($email_to,$asunto,$archivo,$header); # Si el email se envío, se imprime... echo ($ok) ? "Enviado..." : "Falló el envío"; echo " <p>" . '<br>'; flush(); echo " - - - ACTUALIZACION COMPLETADA - - - <p>" . '<br>'; flush(); //Borro los archivos viejos para no tener problema al renombrar o descargar unlink('update.csv'); unlink('update.gz'); unlink('falta.txt'); echo "Archivos temporales eliminados" . '<br>'; flush(); echo "Todo hecho" . '<br>'; flush(); ?> Hola amigo buenas tardes.... Muchas Gracias por compartir esta informacion.... Tengo unas preguntas si fuera posible que puedan ayudarme.... Ya que para que sepan yo soy un Novato en todo esto y estoy aqui para ir tratando de aprender y con su ayudas lograr mis planes... Bueno mis dudas son las siguientes... Nosotros usamos en la tienda fisica un programa llamado premium-soft y lo que no hemos podido encontrar como poder hacer uso de esa base de datos para la union y modificacion en la tienda online. Es posible que puedan explicarme como hacer esto ? OK el scrip que da el amigo danivh es el que hace el trabajo pero como tengo que exportar el archivo del programa fisico ? No se como se crea un csv ... Y disculpen mi ignorancia pero el codigo tengo que copiarlo en Notepad++ y llamarlo por ejemplo Actualizar.php ? Espero que puedan ayudarme ya que me falta mucho conocimiento para poder hacer esto solo y que sea funcional. POfavor SAludos y GRacias. Link to comment Share on other sites More sharing options...
danivh Posted June 4, 2013 Share Posted June 4, 2013 Hola erikmlb. Cada uno tenemos una circunstancia particular en nuestras tiendas. Personalmente yo descargo un archivo CSV que me facilita mi proveedor, y parto desde ahí para actualizar precio de coste, stock y precio de venta... pero en tu caso tendrías que enterarte de cómo exportar tu stock y precio en tu programa de gestión y tratar el archivo exportado... Cada caso es único y requiere su adaptación. Yo lo que os he dejado aquí es una muestra de que se puede hacer y cómo hacerlo en un caso similar al mio. Saludos. Link to comment Share on other sites More sharing options...
erikmlb Posted June 4, 2013 Share Posted June 4, 2013 Hola danivh gracias por comentar.... Bueno me pondre a buscar en el programa como crear el archivo primero que nada si lo consigo vere como utilizarlo GRacias SAludos. Link to comment Share on other sites More sharing options...
Recommended Posts