Jump to content

Actualizar stock mediante php en 1.6.0.11


Javier1959

Recommended Posts

Hola:

 

He encontrado este script para actualizar los stocks y teóricamente sirve para todas las versiones igual o superiores a 1.6.

 

 

----------------------------------------------------------------------------------------------------------

 

<?php
 
// PRESTASHOP SETTINGS FILE
require_once ('config/settings.inc.php');
 
// REMOTE CSV FILE (CUSTOMIZE YOURCSVFILEPATH, CAN BE AN URL OR A LOCAL PATH)
$remote_csv_file = 'YOURCSVFILEPATH.csv';
 
// DB CONNECTION (CUSTOMIZE YOURDBHOSTNAME AND YOURDBPORT)
$db = new PDO("mysql:host=YOURDBHOSTNAME;port=YOURDBPORT;dbname="._DB_NAME_."", _DB_USER_, _DB_PASSWD_);
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
 
// MAIN CYCLE
$row_num = 0;
if (($handle = fopen($remote_csv_file, "r")) !== false) {
  while (($data = fgetcsv($handle, 1000, ",")) !== false) {
    $row_num++;
    if ($row_num == 1) {
      // SKIP FIRST LINE (HEADER)
      continue;
    }
    if ($data[0] == '' || !is_numeric($data[1])) {
      // SKIP EMPTY VALUES
      continue;
    }
    
    // INPUT SANITIZATION
    $reference = trim($data[0]);
    $quantity  = ($data[1] >= 0) ? $data[1] : 0;
    
    try {
      $res4 = $db->prepare("SELECT id_product, id_product_attribute from "._DB_PREFIX_."product_attribute WHERE reference = :reference");
      $res4->execute(array(':reference'=>$reference));
 
      if ($res4->rowCount() > 0) {
 
        // IT'S A PRODUCT COMBINATION
        
        $row4 = $res4->fetch();
    
        $res = $db->prepare("update "._DB_PREFIX_."stock_available set quantity = :q where id_product_attribute = :id_product_attribute");
        $res->execute(array(':q'=>$quantity, ':id_product_attribute'=>$row4['id_product_attribute']));
            
        $res = $db->prepare("update "._DB_PREFIX_."product_attribute set quantity = :q where id_product_attribute = :id_product_attribute");
        $res->execute(array(':q'=>$quantity, ':id_product_attribute'=>$row4['id_product_attribute']));
 
        $res = $db->prepare("update "._DB_PREFIX_."stock_available set quantity = quantity + :q where id_product = :id_product and id_product_attribute = 0");
        $res->execute(array(':q'=>$quantity, ':id_product'=>$row4['id_product']));
        
        $res = $db->prepare("update "._DB_PREFIX_."product set quantity = quantity + :q where id_product = :id_product");
        $res->execute(array(':q'=>$quantity, ':id_product'=>$row4['id_product']));
 
      } else {
 
        // IT'S A SIMPLE PRODUCT
        
        $res4 = $db->prepare("SELECT id_product from "._DB_PREFIX_."product WHERE reference = :reference");
        $res4->execute(array(':reference'=>$reference));
        if ($res4->rowCount() > 0) {
          $row4 = $res4->fetch();
    
          $res = $db->prepare("update "._DB_PREFIX_."stock_available set quantity = :q where id_product = :id_product and id_product_attribute = 0");
          $res->execute(array(':q'=>$quantity, ':id_product'=>$row4['id_product']));
 
          $res = $db->prepare("update "._DB_PREFIX_."product set quantity = :q where id_product = :id_product");
          $res->execute(array(':q'=>$quantity, ':id_product'=>$row4['id_product']));
        }
 
      }
    } catch (PDOException $e) {
      echo 'Sql Error: '. $e->getMessage() .'<br /><br />';
    }
  }
  fclose($handle);
}
 
 
----------------------------------------------------------------------------------------------------------------
 
 
No se si alguien lo habrá probado y si funciona correctamente.
 
Yo necesito que lea el CSV de mi proveedor que tiene unas 7000 referencias y actualice el stock de unas 3000 que tengo en la base de datos, descartando el resto, y que no toque las referencias de otros proveedores distintos que hay en la base de datos.
 
A priori creo que me podría servir, aunque no utilizo las combinaciones (¿quizás habría que comentar o eliminar las líneas que actualizan las combinaciones?)
 
Como estoy muy pez en PHP, si alguien puede revisarlo y orientarme se lo agradecería mucho.
 
Un saludo y gracias por adelantado.
Link to comment
Share on other sites

Solo he puesto mi archivo csv en donde pone YOURCSVFILEPATH.csv, mi base de datos en YOURDBHOSTNAME y el puerto en YOURDBPORT.

En el csv tengo los campos separados por coma. Si necesitas cambiar el separador puedes hacerlo cambiando la línea 

 while (($data = fgetcsv($handle, 1000, ",")) !== false) {

por 

 while (($data = fgetcsv($handle, 1000, "SEPARADOR")) !== false) {

Link to comment
Share on other sites

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