Jump to content

Como actualizar stock de artículos


nairobi

Recommended Posts

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

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

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

  • 4 weeks later...

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

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

  • 1 month later...

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

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

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();
?>
  • Like 1
Link to comment
Share on other sites

  • 1 month later...

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

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 by danivh (see edit history)
Link to comment
Share on other sites

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

  • 2 weeks later...

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

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

 

 

<?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

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

Guest
This topic is now closed to further replies.
×
×
  • Create New...