Jump to content

Edit History

jat

jat


un ajuste

En 08/12/2018 a las 8:14 PM, jfcordova dijo:

@jat Nos dejaste con las ganas y no lo subiste 🙄🤓

Os paso el codigo, @jsiesquen @jfcordova ya siento el retraso. 😓

Hay mucha cosas que modificar.

Y mucha gracias @el_charlie por tu ayuda y aportación 😉 

El código que desarrolle en su dia:

<?php
/**
 * User: Jatniel Guzmán
 * E-mail: <[email protected]>
 * Date: 6/08/18
 * Time: 10:58
 */

$currentDir = dirname(__FILE__);
if (!defined('_PS_ROOT_DIR_')) {
    define('_PS_ROOT_DIR_', realpath($currentDir.'/..'));
}
include(_PS_ROOT_DIR_.'/config/config.inc.php');
include(_PS_ROOT_DIR_.'/init.php');

$total_lineas_fichero=0;
$numero_lineas_insertadas=0;
$numero_lineas_modificadas=0;
$error_accesorios='';
$line=0;

$productos_insertados='';
$path_importacion='/upload/';
$path_log=$path_importacion.'logs/';
$path_doc=dirname(_PS_ROOT_DIR_).$path_importacion.'doc_man/';
$path_imagenes=_PS_ROOT_DIR_.$path_importacion.'imagenes/';
$fichier=_PS_ROOT_DIR_.$path_importacion.'productos.csv';
$filename_log=_PS_ROOT_DIR_.$path_log.'log_importacion_productos_'.date("j_m_Y").".txt";

if (file_exists($fichier)) {
    $fp = fopen("$fichier", "r");
} else  {
    echo "Fichero no existe importación parada !.";
    $donnees = array('{lastname}'  => '' ,  '{firstname}'  => '' );
    $destinataire = '[email protected]';
    Mail::Send(1, 'import_erp_error', 'Importacion de produtos ERP' , $donnees, $destinataire);
    exit();
}

$file = new SplFileObject($fichier);
$file->setFlags(SplFileObject::READ_CSV);
$file->setCsvControl(';');

foreach ($file as $row) {
    if (!empty($row[0]))
    {
        list ($referencia_producto, $nombre_producto, $precio ,$disponibilidad,$imagen_principal,$imagenes,$documentacion_man,$documentacion_com,$accesorios) = $row;

        if(!empty($referencia_producto)) {

            $id_product = getProductbyRef($referencia_producto);
            $product = $id_product>0 ? new Product((int)$id_product, true) : new Product();

            if (empty($id_product)) { //solo para los nuevos productos
                $product->id_category_default = 51; // categoría de los productos
                $product->link_rewrite[1] =  Tools::link_rewrite( str_replace('º','', utf8_encode($nombre_producto) ) );
                $product->name[1] =  utf8_encode($nombre_producto) ;
                $product->meta_description[1] = 'Compra online '.utf8_encode($nombre_producto). ' entrega 48h';
                $product->meta_title = utf8_encode($nombre_producto) ;
                $tab_categories=array();
                $tab_categories[]=51; // categoria por defecto
                $productos_insertados.=$referencia_producto .', ';
            }
            $product->active = $disponibilidad ;
            $product->price =  floatval(str_ireplace(',','.',$precio )) ;
            $product->reference = $referencia_producto ;
            product_save($product) ; //salvamos el producto

            // Si se crea un producto se pone la categoria por defecto
            if (empty($id_product)){
                addCategoriestoproducto($tab_categories ,$product->id);
            }

            if ($product->id>0 ){
                //Cantidad de producto
                $quantity=$disponibilidad== 1 ? 10000 : 0 ;
                StockAvailable::setQuantity($product->id,'', $quantity );

                /*
                //Imagen principal del producto
                $tab_imagenes_productos[]=add_images($path_imagenes,$imagen_principal,$product->id,true);
                //Otras Imagenes del producto
                $tab_imagenes=array();
                $tab_imagenes=explode("|",$imagenes);
                foreach ($tab_imagenes as $key =>$nombre_imagen) {
                    if (!empty($nombre_imagen)){
                        $tab_imagenes_productos[]=add_images($path_imagenes,$nombre_imagen,$product->id,false);
                    }
               }

                //Adjuntos documentacion man (manuales...)
                if (isset($documentacion_man)){
                    crud_attachment($product->id,$documentacion_man);
                }

                if (isset($documentacion_com)){
                    crud_attachment($product->id,$documentacion_com);
                }
                */
            }
            $total_lineas_fichero++;
            $id_product ? $numero_lineas_modificadas++ : $numero_lineas_insertadas++  ;
            echo 'Product <b>'.$product->reference .' - '.$product->name[1].'</b> '.($id_product ? 'updated' : 'created').' Disponibilidad :'.$disponibilidad.'<br />';
        }
        $line++;
    }

}

/*
//Tratamos los accesorios de los productos
$file = new SplFileObject($fichier);
$file->setFlags(SplFileObject::READ_CSV);
$file->setCsvControl(';');
$line=0;
foreach ($file as $row) {
    if ($line!=0){
        list ($referencia_producto, $nombre_producto, $precio ,$disponibilidad,$imagen_principal,$imagenes,$documentacion_man,$documentacion_com,$accesorios) = $row;
        if(!empty($referencia_producto) && !empty($accesorios)) {
            $error=0;
            addaccesories($accesorios,$id_product);
            $error_accesorios.=$error!=0 ? ' Error accesorios en '.$id_product.chr(13).chr(10) :'';
        }
    }
    $line++;
}
*/

// LOG DE IMPORTACION
$log_txt=date("j/m/Y H:i").' -  Log de importacion de productos '.chr(13).chr(10) ;
$log_txt.='Total de productos :'.$total_lineas_fichero.chr(13).chr(10) ;
$log_txt.='Total de productos insertados :'.$numero_lineas_insertadas.chr(13).chr(10) ;
$log_txt.='Total de productos modificados :'.$numero_lineas_modificadas.chr(13).chr(10);
addLog($log_txt,$filename_log);

$file = null;

copy($fichier , _PS_ROOT_DIR_.$path_importacion.'backups/importacion_erp'.date("j_m_Y").'.csv' );

echo "<br>Importacion terminada, con exito.";
$fichier=dirname(__FILE__).'importacion_erp.csv';
$subject = 'Importacion de produtos del ERP';
$donnees = array('{lastname}'  => '' ,  '{firstname}'  => '' ,'{filename}'  => $fichier , '{productos_insertados}'  =>$productos_insertados);
$destinataire = '[email protected]';

Mail::Send(1, 'import_erp', $subject , $donnees, $destinataire);
echo 'Mail enviado';
exit;


//Importación de los accesorios multiples para la compra con el producto
function addaccesories ($accesorios,$id_product) {
    $error=1;
    $group_accesories=array(18=>'1',19=>'2',52=>'3',53=>'5'); // tabla de equivalencia categorias grupos solucions 1, reactivos 2, electrodos y sondas 3 , accesorios y complementos 5
    if (!empty($id_product) && !empty($accesorios)) {
        $error = 0;
        Db::getInstance()->delete('ps_accessory', 'id_product_1=' . $id_product);
        Db::getInstance()->delete('accessory_group_product_lang', 'id_lang=1 and id_accessory_group_product in (select id_accessory_group_product from ps_accessory_group_product where id_product=' . $id_product . ')');
        Db::getInstance()->delete('cart_rule', 'reduction_product in (select id_accessory_group_product from ps_accessory_group_product where id_product=' . $id_product . ' )');
        Db::getInstance()->delete('accessory_product_cart_rule', 'id_accessory in (select id_accessory from ps_accessory_group_product where id_product=' . $id_product . ' )');
        Db::getInstance()->delete('accessory_group_product', 'id_product=' . $id_product  );

        $tab_accesories = explode("$", $accesorios);
        $product = $id_product>0 ? new Product((int)$id_product, true) : new Product();

        foreach ($tab_accesories as $key => $referencia_producto) {
            if (!empty(trim($referencia_producto))) {
                $id_product_accesorio = getProductbyRef(trim($referencia_producto));
                $product_accesorio = new Product((int)$id_product_accesorio, true) ;

                /* para añadir el producto asociado al producot
                $accesorio_asociado = array(
                    'id_product_1' => $id_product,
                    'id_product_2' => (int)$id_product_accesorio
                );
                Db::getInstance()->insert('accessory', $accesorio_asociado);
                  */
                $accessory = new HsAccessoriesGroupProduct();
                $accessory->id_accessory = $id_product_accesorio;
                $accessory->id_product = $id_product ;
                $accessory->id_accessory_group = $group_accesories ;
                $accessory->id_product_attribute = 0;
                $accessory->default_quantity = 1;
                $accessory->min_quantity = 1 ;
                $accessory->name = $product_accesorio->name;
                $accessory->position = HsAccessoriesGroupProductAbstract::getHighestPosition(1 , $id_product) + 1;
                $accessory->add();

                $cart_rule = new HsMaCartRule();
                $cart_rule->product = $product;
                $cart_rule->accessory = $accessory;
                $cart_rule->id_shops = 1 ;
                $cart_rule->addCartRule(0 , 5, array(1=>'descuento para el producto'), 'Solo valido comprando los productos juntos');
            }
        }
    }
    return $error;
}

//Recupera el id del producto con la referencia
function getProductbyRef($referencia_producto){
    $id_product=0;
    $id_product= (int)Db::getInstance()->getValue("SELECT id_product FROM ps_product WHERE reference = '".pSQL($referencia_producto,false)."'");
    return $id_product;
}

//Guarda los datos del producto
function product_save($product){

    $product->id_tax_rules_group= 1 ;
    $product->weight = 0 ;
    $product->quantity = 1;
    $product->redirect_type = '404';
    $product->show_price = 1;
    $product->on_sale = 0 ;
    $product->is_virtual=0;
    $product->minimal_quantity = 1 ;
    if (!isset($product->date_add) || empty($product->date_add)) $product->date_add = date('Y-m-d H:i:s');
    $product->date_upd = date('Y-m-d H:i:s');

    $product->save();
}

//function para añadir una imagen
function add_images($path_imagenes,$tab_imagen,$id_product,$principal) {
    $imagen=explode("$",$tab_imagen);
    $nombre_imagen=$imagen[0];
    $desc_imagen=$imagen[1];
    $fecha_imagen=$imagen[2];
    // formateamos la fecha de imagen para poder compararla
    $fecha_imagen= new DateTime($fecha_imagen);
    $fecha_imagen=$fecha_imagen->format('Y-m-d');

    //recuperamos los parametros de log de las imagenes
    $imagen_log=get_fecha_log($id_product,$nombre_imagen);
    $fecha_imagen_log=$imagen_log['fecha_modificacion'];
    $id_imagen_log=$imagen_log['id_imagen'];

    if ( $fecha_imagen > $fecha_imagen_log  || empty($fecha_imagen_log)) { // si se ha modificado o si es una nueva imagen la borramos o la añadimos
        // si la imagen existe la boramos
        delete_image($id_imagen_log,$id_product,$principal) ;
        $shops = Shop::getShops(true, null, true);
        $image = new Image();
        $image->id_product = $id_product;
        $image->legend = $desc_imagen ;
        $image->position = Image::getHighestPosition($id_product) + 1;
        $image->cover = $principal; // or false;

        if (($image->validateFields(false, true)) === true && ($image->validateFieldsLang(false, true)) === true && $image->add())
        {
            $id_imagen_log=$image->id ;
            $image->associateTo($shops);


            if (!AdminImportController::copyImg($id_product, $image->id, $path_imagenes.$nombre_imagen , 'products', true))  {
                $image->delete();
            } else {
                add_image_to_log($fecha_imagen, $nombre_imagen,$id_product,$image->id); // añadimos la imagen a la tabla de logs
            }
        }
    }
    return $id_imagen_log;
}

//function para modificar añadir o borrar los manuales
function crud_attachment($id_product, $tab_adjuntos)
{
    global $path_doc;
    $attachment = new Attachment();
    //recogemos los adjuntos del producto de la BD
    $tab_attachments = $attachment->getAttachments(1, $id_product);
    if (!empty($tab_adjuntos)){
        if (!empty($tab_adjuntos) ) {
            $tab_adjuntos =explode("|",$tab_adjuntos );
            foreach($tab_adjuntos as $key_adjunto => $adjunto) {
                $adjunto =explode("$",$adjunto );
                $nombre_fichero=$adjunto[0];
                $descripcion_fichero=$adjunto[1];
                $fecha_modificacion_fichero=$adjunto[2];
                // formateamos la fecha de imagen para poder compararla
                $fecha_modificacion_fichero= new DateTime($fecha_modificacion_fichero);
                $fecha_modificacion_fichero=$fecha_modificacion_fichero->format('Y-m-d');

                //recuperamos los parametros de log de las imagenes
                $fichero_log=get_fecha_log_fichero($id_product,$nombre_fichero);
                $fecha_fichero_log=$fichero_log['fecha_modificacion'];
                $id_imagen_log=$fichero_log['id_attachment'];

                if ( $fecha_modificacion_fichero > $fecha_fichero_log  || empty($fecha_fichero_log)) { // si se ha modificado o si es un nuevo fichero

                    if (  array_search( $nombre_fichero , array_column($tab_attachments, 'file_name') )  !== false ) {
                        $key_file =array_search( $nombre_fichero , array_column($tab_attachments, 'file_name') ) ;
                        $row_attachment=$tab_attachments[$key_file];
                        $attachment = new Attachment($row_attachment['id_attachment']);
                        // borramos el fichero fisico
                        if (file_exists(_PS_DOWNLOAD_DIR_.$attachment->file )) {
                            unlink(_PS_DOWNLOAD_DIR_.$attachment->file);
                            echo 'unlink';
                        }

                        // creamos el uniq ID para presta
                        do $uniqid = sha1(microtime());
                        while (file_exists(_PS_DOWNLOAD_DIR_.$uniqid));
                        $path_file = $path_doc.$nombre_fichero ;
                        copy(trim($path_file), _PS_DOWNLOAD_DIR_.$uniqid);
                        $attachment->file=$uniqid;

                        $finfo = finfo_open(FILEINFO_MIME_TYPE);
                        $attachment->mime = finfo_file($finfo, $path_file);
                        $attachment->file_name = $nombre_fichero;
                        $attachment->file_size = filesize($path_file);
                        $attachment->update_documentos($path_file);     // update attachment BD
                        $id_attachment=$attachment->id_attachment;
                        // echo 'update'.$nombre_fichero;
                    } else {
                        $id_attachment= add_attachment($id_product,$adjunto);
                        //  echo 'add'.$nombre_fichero;
                    }
                    delete_ficheros_to_log($id_attachment,$id_product) ;
                    add_ficheros_to_log($fecha_modificacion_fichero, $nombre_fichero,$id_product,$id_attachment) ;
                }
            }
        }

        // Borramos lod ficheros que no estan en la lista porque se han suprimidos
        $tab_attachments = $attachment->getAttachments(1, $id_product);
        foreach($tab_attachments as $attachment) {
            $file_exist=0;
            foreach($tab_adjuntos as $key_adjunto => $adjunto) {
                $adjunto =explode("$",$adjunto );

                if ($adjunto[0]== $attachment['file_name']) $file_exist=1 ;
            }
            if (!$file_exist ){
                echo 'delete'.$attachment['file_name'];

                $myattachment = new Attachment($attachment['id_attachment']);
                $myattachment->deleteProductAttachments($id_product);
                delete_ficheros_to_log($myattachment->id,$id_product) ;
            }
        }
    }
}

// Function para añadir un manual
function add_attachment ($id_product,$adjunto)
{
    global $path_doc;
    $nombre_fichero=$adjunto[0];
    $descripcion_fichero=$adjunto[1];
    $fecha_modificacion_fichero=$adjunto[2];
    $path_file=$path_doc.$nombre_fichero;

    $filename=basename($path_file);
    // Generate unique filename
    do $uniqid = sha1(microtime());
    while (file_exists(_PS_DOWNLOAD_DIR_.$uniqid));
    // Copy file to target
    copy(trim($path_file), _PS_DOWNLOAD_DIR_.$uniqid);
    // Create file attachment
    $attachment = new Attachment();
    $attachment->file = $uniqid;
    $path_file = $path_doc.$filename;
    $finfo = finfo_open(FILEINFO_MIME_TYPE);
    $attachment->mime = finfo_file($finfo, $path_file);
    $attachment->file_name = $nombre_fichero ;
    $attachment->file_size = filesize($path_file);
    // Create name and description for each language
    $languages = Language::getLanguages(false);
    foreach ($languages as $language)
    {
        $attachment->name[(int)$language['id_lang']] = substr($descripcion_fichero , 0, 32);
        $attachment->description[(int)$language['id_lang']] = '' ;
    }
    // Put to DB
    $attachment->add();
    // Attach to product
    $attachment->attachProduct($id_product);
    return (int)$attachment->id;
}


//recupera la fecha de modificaion de una imagen
function get_fecha_log($id_product,$nombre_imagen) {
    $row='';
    if (!empty($id_product) && !empty($nombre_imagen)) {
    }
    return $row;
}

//recupera la fecha de modificacion de un fichero
function get_fecha_log_fichero($id_product,$nombre_fichero) {
    $row='';
    if (!empty($id_product) && !empty($nombre_fichero)) {
        $sql = "select fecha_modificacion, id_attachment from log_import_manuales where id_producto=".$id_product." and  nombre_fichero='".$nombre_fichero."'"  ;
        $row= Db::getInstance()->getRow($sql);
    }
    return $row;
}

//Añade las imagenes de la tabla de log de las imagenes
function add_image_to_log($fecha_imagen, $nombre_imagen,$id_product,$id_imagen){
    $sql = "insert into log_import_imagenes values (null,".$id_product.",".$id_imagen.",'".$nombre_imagen."','".$fecha_imagen."')"  ;
    return  Db::getInstance()->Execute($sql);
}

//Añade los ficheros a la tabla de log de las ficheros
function add_ficheros_to_log($fecha_fichero, $nombre_fichero,$id_product,$id_attachment){
    $sql = "insert into log_import_manuales values (null,".$id_product.",".$id_attachment.",'".$nombre_fichero."','".$fecha_fichero."')"  ;
    return  Db::getInstance()->Execute($sql);
}

// borramos del log los ficheros
function delete_ficheros_to_log($id_attachment,$id_product) {
    if (!empty($id_attachment)){ // si la imagen existe la borramos
        $sql = "delete from log_import_manuales where id_attachment=".$id_attachment." and id_producto=".$id_product  ;
        Db::getInstance()->Execute($sql);
    }
}

//Recuepera el id_imegen que hay que borrar
function get_image_to_delete($tab_imagenes_productos,$id_producto){
    $id_imagenes='';
    $rows='';
    foreach ($tab_imagenes_productos as $key=> $imagenes) {
        $id_imagenes.=$imagenes.",";
    }
    $id_imagenes.='0';
    $sql = "select id_imagen from log_import_imagenes where id_producto=".$id_producto."  and id_imagen not in (".$id_imagenes.") "  ;
    $rows=Db::getInstance()->ExecuteS($sql);
    return $rows  ;
}

function addLog($txt,$filename) {
    if (!file_exists($filename)) file_put_contents($filename, "");
    file_put_contents($filename,$txt." \r\n".file_get_contents($filename));
}

// borramos del log
function delete_image($id_image,$id_product,$principal) {
    // Borramos del log
    if ($principal && empty($id_image) ) {
        $image = Product::getCover($id_product) ;
        $id_image=$image['id_image'];
    }

    if (!empty($id_image)){ // si la imagen existe la borramos
        $image = new Image($id_image);
        $image->delete();

        $sql = "delete from log_import_imagenes where id_imagen=".$id_image." and id_producto=".$id_product  ;
        Db::getInstance()->Execute($sql);
    }
}


function addCategoriestoproducto($tab_categories ,$id_product)
{
    $product_cats = array();
    foreach ($tab_categories as $key=>$new_id_categ) {
        $product_cats[] = array(
            'id_category' => (int)$new_id_categ,
            'id_product' => (int)$id_product,
            'position' => 1,
        );
    }
    Db::getInstance()->insert('category_product', $product_cats);
    return true;
}

Muchas gracias a tod@s

jat

jat

En 08/12/2018 a las 8:14 PM, jfcordova dijo:

@jat Nos dejaste con las ganas y no lo subiste 🙄🤓

Os paso el codigo, ya siento el retraso. 😓

Hay mucha cosas que modificar.

Y mucha gracias @el_charlie por tu ayuda y aportación 😉 

El código que desarrolle en su dia:

<?php
/**
 * User: Jatniel Guzmán
 * E-mail: <[email protected]>
 * Date: 6/08/18
 * Time: 10:58
 */

$currentDir = dirname(__FILE__);
if (!defined('_PS_ROOT_DIR_')) {
    define('_PS_ROOT_DIR_', realpath($currentDir.'/..'));
}
include(_PS_ROOT_DIR_.'/config/config.inc.php');
include(_PS_ROOT_DIR_.'/init.php');

$total_lineas_fichero=0;
$numero_lineas_insertadas=0;
$numero_lineas_modificadas=0;
$error_accesorios='';
$line=0;

$productos_insertados='';
$path_importacion='/upload/';
$path_log=$path_importacion.'logs/';
$path_doc=dirname(_PS_ROOT_DIR_).$path_importacion.'doc_man/';
$path_imagenes=_PS_ROOT_DIR_.$path_importacion.'imagenes/';
$fichier=_PS_ROOT_DIR_.$path_importacion.'productos.csv';
$filename_log=_PS_ROOT_DIR_.$path_log.'log_importacion_productos_'.date("j_m_Y").".txt";

if (file_exists($fichier)) {
    $fp = fopen("$fichier", "r");
} else  {
    echo "Fichero no existe importación parada !.";
    $donnees = array('{lastname}'  => '' ,  '{firstname}'  => '' );
    $destinataire = '[email protected]';
    Mail::Send(1, 'import_erp_error', 'Importacion de produtos ERP' , $donnees, $destinataire);
    exit();
}

$file = new SplFileObject($fichier);
$file->setFlags(SplFileObject::READ_CSV);
$file->setCsvControl(';');

foreach ($file as $row) {
    if (!empty($row[0]))
    {
        list ($referencia_producto, $nombre_producto, $precio ,$disponibilidad,$imagen_principal,$imagenes,$documentacion_man,$documentacion_com,$accesorios) = $row;

        if(!empty($referencia_producto)) {

            $id_product = getProductbyRef($referencia_producto);
            $product = $id_product>0 ? new Product((int)$id_product, true) : new Product();

            if (empty($id_product)) { //solo para los nuevos productos
                $product->id_category_default = 51; // categoría de los productos
                $product->link_rewrite[1] =  Tools::link_rewrite( str_replace('º','', utf8_encode($nombre_producto) ) );
                $product->name[1] =  utf8_encode($nombre_producto) ;
                $product->meta_description[1] = 'Compra online '.utf8_encode($nombre_producto). ' entrega 48h';
                $product->meta_title = utf8_encode($nombre_producto) ;
                $tab_categories=array();
                $tab_categories[]=51; // categoria por defecto
                $productos_insertados.=$referencia_producto .', ';
            }
            $product->active = $disponibilidad ;
            $product->price =  floatval(str_ireplace(',','.',$precio )) ;
            $product->reference = $referencia_producto ;
            product_save($product) ; //salvamos el producto

            // Si se crea un producto se pone la categoria por defecto
            if (empty($id_product)){
                addCategoriestoproducto($tab_categories ,$product->id);
            }

            if ($product->id>0 ){
                //Cantidad de producto
                $quantity=$disponibilidad== 1 ? 10000 : 0 ;
                StockAvailable::setQuantity($product->id,'', $quantity );

                /*
                //Imagen principal del producto
                $tab_imagenes_productos[]=add_images($path_imagenes,$imagen_principal,$product->id,true);
                //Otras Imagenes del producto
                $tab_imagenes=array();
                $tab_imagenes=explode("|",$imagenes);
                foreach ($tab_imagenes as $key =>$nombre_imagen) {
                    if (!empty($nombre_imagen)){
                        $tab_imagenes_productos[]=add_images($path_imagenes,$nombre_imagen,$product->id,false);
                    }
               }

                //Adjuntos documentacion man (manuales...)
                if (isset($documentacion_man)){
                    crud_attachment($product->id,$documentacion_man);
                }

                if (isset($documentacion_com)){
                    crud_attachment($product->id,$documentacion_com);
                }
                */
            }
            $total_lineas_fichero++;
            $id_product ? $numero_lineas_modificadas++ : $numero_lineas_insertadas++  ;
            echo 'Product <b>'.$product->reference .' - '.$product->name[1].'</b> '.($id_product ? 'updated' : 'created').' Disponibilidad :'.$disponibilidad.'<br />';
        }
        $line++;
    }

}

/*
//Tratamos los accesorios de los productos
$file = new SplFileObject($fichier);
$file->setFlags(SplFileObject::READ_CSV);
$file->setCsvControl(';');
$line=0;
foreach ($file as $row) {
    if ($line!=0){
        list ($referencia_producto, $nombre_producto, $precio ,$disponibilidad,$imagen_principal,$imagenes,$documentacion_man,$documentacion_com,$accesorios) = $row;
        if(!empty($referencia_producto) && !empty($accesorios)) {
            $error=0;
            addaccesories($accesorios,$id_product);
            $error_accesorios.=$error!=0 ? ' Error accesorios en '.$id_product.chr(13).chr(10) :'';
        }
    }
    $line++;
}
*/

// LOG DE IMPORTACION
$log_txt=date("j/m/Y H:i").' -  Log de importacion de productos '.chr(13).chr(10) ;
$log_txt.='Total de productos :'.$total_lineas_fichero.chr(13).chr(10) ;
$log_txt.='Total de productos insertados :'.$numero_lineas_insertadas.chr(13).chr(10) ;
$log_txt.='Total de productos modificados :'.$numero_lineas_modificadas.chr(13).chr(10);
addLog($log_txt,$filename_log);

$file = null;

copy($fichier , _PS_ROOT_DIR_.$path_importacion.'backups/importacion_erp'.date("j_m_Y").'.csv' );

echo "<br>Importacion terminada, con exito.";
$fichier=dirname(__FILE__).'importacion_erp.csv';
$subject = 'Importacion de produtos del ERP';
$donnees = array('{lastname}'  => '' ,  '{firstname}'  => '' ,'{filename}'  => $fichier , '{productos_insertados}'  =>$productos_insertados);
$destinataire = '[email protected]';

Mail::Send(1, 'import_erp', $subject , $donnees, $destinataire);
echo 'Mail enviado';
exit;


//Importación de los accesorios multiples para la compra con el producto
function addaccesories ($accesorios,$id_product) {
    $error=1;
    $group_accesories=array(18=>'1',19=>'2',52=>'3',53=>'5'); // tabla de equivalencia categorias grupos solucions 1, reactivos 2, electrodos y sondas 3 , accesorios y complementos 5
    if (!empty($id_product) && !empty($accesorios)) {
        $error = 0;
        Db::getInstance()->delete('ps_accessory', 'id_product_1=' . $id_product);
        Db::getInstance()->delete('accessory_group_product_lang', 'id_lang=1 and id_accessory_group_product in (select id_accessory_group_product from ps_accessory_group_product where id_product=' . $id_product . ')');
        Db::getInstance()->delete('cart_rule', 'reduction_product in (select id_accessory_group_product from ps_accessory_group_product where id_product=' . $id_product . ' )');
        Db::getInstance()->delete('accessory_product_cart_rule', 'id_accessory in (select id_accessory from ps_accessory_group_product where id_product=' . $id_product . ' )');
        Db::getInstance()->delete('accessory_group_product', 'id_product=' . $id_product  );

        $tab_accesories = explode("$", $accesorios);
        $product = $id_product>0 ? new Product((int)$id_product, true) : new Product();

        foreach ($tab_accesories as $key => $referencia_producto) {
            if (!empty(trim($referencia_producto))) {
                $id_product_accesorio = getProductbyRef(trim($referencia_producto));
                $product_accesorio = new Product((int)$id_product_accesorio, true) ;

                /* para añadir el producto asociado al producot
                $accesorio_asociado = array(
                    'id_product_1' => $id_product,
                    'id_product_2' => (int)$id_product_accesorio
                );
                Db::getInstance()->insert('accessory', $accesorio_asociado);
                  */
                $accessory = new HsAccessoriesGroupProduct();
                $accessory->id_accessory = $id_product_accesorio;
                $accessory->id_product = $id_product ;
                $accessory->id_accessory_group = $group_accesories ;
                $accessory->id_product_attribute = 0;
                $accessory->default_quantity = 1;
                $accessory->min_quantity = 1 ;
                $accessory->name = $product_accesorio->name;
                $accessory->position = HsAccessoriesGroupProductAbstract::getHighestPosition(1 , $id_product) + 1;
                $accessory->add();

                $cart_rule = new HsMaCartRule();
                $cart_rule->product = $product;
                $cart_rule->accessory = $accessory;
                $cart_rule->id_shops = 1 ;
                $cart_rule->addCartRule(0 , 5, array(1=>'descuento para el producto'), 'Solo valido comprando los productos juntos');
            }
        }
    }
    return $error;
}

//Recupera el id del producto con la referencia
function getProductbyRef($referencia_producto){
    $id_product=0;
    $id_product= (int)Db::getInstance()->getValue("SELECT id_product FROM ps_product WHERE reference = '".pSQL($referencia_producto,false)."'");
    return $id_product;
}

//Guarda los datos del producto
function product_save($product){

    $product->id_tax_rules_group= 1 ;
    $product->weight = 0 ;
    $product->quantity = 1;
    $product->redirect_type = '404';
    $product->show_price = 1;
    $product->on_sale = 0 ;
    $product->is_virtual=0;
    $product->minimal_quantity = 1 ;
    if (!isset($product->date_add) || empty($product->date_add)) $product->date_add = date('Y-m-d H:i:s');
    $product->date_upd = date('Y-m-d H:i:s');

    $product->save();
}

//function para añadir una imagen
function add_images($path_imagenes,$tab_imagen,$id_product,$principal) {
    $imagen=explode("$",$tab_imagen);
    $nombre_imagen=$imagen[0];
    $desc_imagen=$imagen[1];
    $fecha_imagen=$imagen[2];
    // formateamos la fecha de imagen para poder compararla
    $fecha_imagen= new DateTime($fecha_imagen);
    $fecha_imagen=$fecha_imagen->format('Y-m-d');

    //recuperamos los parametros de log de las imagenes
    $imagen_log=get_fecha_log($id_product,$nombre_imagen);
    $fecha_imagen_log=$imagen_log['fecha_modificacion'];
    $id_imagen_log=$imagen_log['id_imagen'];

    if ( $fecha_imagen > $fecha_imagen_log  || empty($fecha_imagen_log)) { // si se ha modificado o si es una nueva imagen la borramos o la añadimos
        // si la imagen existe la boramos
        delete_image($id_imagen_log,$id_product,$principal) ;
        $shops = Shop::getShops(true, null, true);
        $image = new Image();
        $image->id_product = $id_product;
        $image->legend = $desc_imagen ;
        $image->position = Image::getHighestPosition($id_product) + 1;
        $image->cover = $principal; // or false;

        if (($image->validateFields(false, true)) === true && ($image->validateFieldsLang(false, true)) === true && $image->add())
        {
            $id_imagen_log=$image->id ;
            $image->associateTo($shops);


            if (!AdminImportController::copyImg($id_product, $image->id, $path_imagenes.$nombre_imagen , 'products', true))  {
                $image->delete();
            } else {
                add_image_to_log($fecha_imagen, $nombre_imagen,$id_product,$image->id); // añadimos la imagen a la tabla de logs
            }
        }
    }
    return $id_imagen_log;
}

//function para modificar añadir o borrar los manuales
function crud_attachment($id_product, $tab_adjuntos)
{
    global $path_doc;
    $attachment = new Attachment();
    //recogemos los adjuntos del producto de la BD
    $tab_attachments = $attachment->getAttachments(1, $id_product);
    if (!empty($tab_adjuntos)){
        if (!empty($tab_adjuntos) ) {
            $tab_adjuntos =explode("|",$tab_adjuntos );
            foreach($tab_adjuntos as $key_adjunto => $adjunto) {
                $adjunto =explode("$",$adjunto );
                $nombre_fichero=$adjunto[0];
                $descripcion_fichero=$adjunto[1];
                $fecha_modificacion_fichero=$adjunto[2];
                // formateamos la fecha de imagen para poder compararla
                $fecha_modificacion_fichero= new DateTime($fecha_modificacion_fichero);
                $fecha_modificacion_fichero=$fecha_modificacion_fichero->format('Y-m-d');

                //recuperamos los parametros de log de las imagenes
                $fichero_log=get_fecha_log_fichero($id_product,$nombre_fichero);
                $fecha_fichero_log=$fichero_log['fecha_modificacion'];
                $id_imagen_log=$fichero_log['id_attachment'];

                if ( $fecha_modificacion_fichero > $fecha_fichero_log  || empty($fecha_fichero_log)) { // si se ha modificado o si es un nuevo fichero

                    if (  array_search( $nombre_fichero , array_column($tab_attachments, 'file_name') )  !== false ) {
                        $key_file =array_search( $nombre_fichero , array_column($tab_attachments, 'file_name') ) ;
                        $row_attachment=$tab_attachments[$key_file];
                        $attachment = new Attachment($row_attachment['id_attachment']);
                        // borramos el fichero fisico
                        if (file_exists(_PS_DOWNLOAD_DIR_.$attachment->file )) {
                            unlink(_PS_DOWNLOAD_DIR_.$attachment->file);
                            echo 'unlink';
                        }

                        // creamos el uniq ID para presta
                        do $uniqid = sha1(microtime());
                        while (file_exists(_PS_DOWNLOAD_DIR_.$uniqid));
                        $path_file = $path_doc.$nombre_fichero ;
                        copy(trim($path_file), _PS_DOWNLOAD_DIR_.$uniqid);
                        $attachment->file=$uniqid;

                        $finfo = finfo_open(FILEINFO_MIME_TYPE);
                        $attachment->mime = finfo_file($finfo, $path_file);
                        $attachment->file_name = $nombre_fichero;
                        $attachment->file_size = filesize($path_file);
                        $attachment->update_documentos($path_file);     // update attachment BD
                        $id_attachment=$attachment->id_attachment;
                        // echo 'update'.$nombre_fichero;
                    } else {
                        $id_attachment= add_attachment($id_product,$adjunto);
                        //  echo 'add'.$nombre_fichero;
                    }
                    delete_ficheros_to_log($id_attachment,$id_product) ;
                    add_ficheros_to_log($fecha_modificacion_fichero, $nombre_fichero,$id_product,$id_attachment) ;
                }
            }
        }

        // Borramos lod ficheros que no estan en la lista porque se han suprimidos
        $tab_attachments = $attachment->getAttachments(1, $id_product);
        foreach($tab_attachments as $attachment) {
            $file_exist=0;
            foreach($tab_adjuntos as $key_adjunto => $adjunto) {
                $adjunto =explode("$",$adjunto );

                if ($adjunto[0]== $attachment['file_name']) $file_exist=1 ;
            }
            if (!$file_exist ){
                echo 'delete'.$attachment['file_name'];

                $myattachment = new Attachment($attachment['id_attachment']);
                $myattachment->deleteProductAttachments($id_product);
                delete_ficheros_to_log($myattachment->id,$id_product) ;
            }
        }
    }
}

// Function para añadir un manual
function add_attachment ($id_product,$adjunto)
{
    global $path_doc;
    $nombre_fichero=$adjunto[0];
    $descripcion_fichero=$adjunto[1];
    $fecha_modificacion_fichero=$adjunto[2];
    $path_file=$path_doc.$nombre_fichero;

    $filename=basename($path_file);
    // Generate unique filename
    do $uniqid = sha1(microtime());
    while (file_exists(_PS_DOWNLOAD_DIR_.$uniqid));
    // Copy file to target
    copy(trim($path_file), _PS_DOWNLOAD_DIR_.$uniqid);
    // Create file attachment
    $attachment = new Attachment();
    $attachment->file = $uniqid;
    $path_file = $path_doc.$filename;
    $finfo = finfo_open(FILEINFO_MIME_TYPE);
    $attachment->mime = finfo_file($finfo, $path_file);
    $attachment->file_name = $nombre_fichero ;
    $attachment->file_size = filesize($path_file);
    // Create name and description for each language
    $languages = Language::getLanguages(false);
    foreach ($languages as $language)
    {
        $attachment->name[(int)$language['id_lang']] = substr($descripcion_fichero , 0, 32);
        $attachment->description[(int)$language['id_lang']] = '' ;
    }
    // Put to DB
    $attachment->add();
    // Attach to product
    $attachment->attachProduct($id_product);
    return (int)$attachment->id;
}


//recupera la fecha de modificaion de una imagen
function get_fecha_log($id_product,$nombre_imagen) {
    $row='';
    if (!empty($id_product) && !empty($nombre_imagen)) {
    }
    return $row;
}

//recupera la fecha de modificacion de un fichero
function get_fecha_log_fichero($id_product,$nombre_fichero) {
    $row='';
    if (!empty($id_product) && !empty($nombre_fichero)) {
        $sql = "select fecha_modificacion, id_attachment from log_import_manuales where id_producto=".$id_product." and  nombre_fichero='".$nombre_fichero."'"  ;
        $row= Db::getInstance()->getRow($sql);
    }
    return $row;
}

//Añade las imagenes de la tabla de log de las imagenes
function add_image_to_log($fecha_imagen, $nombre_imagen,$id_product,$id_imagen){
    $sql = "insert into log_import_imagenes values (null,".$id_product.",".$id_imagen.",'".$nombre_imagen."','".$fecha_imagen."')"  ;
    return  Db::getInstance()->Execute($sql);
}

//Añade los ficheros a la tabla de log de las ficheros
function add_ficheros_to_log($fecha_fichero, $nombre_fichero,$id_product,$id_attachment){
    $sql = "insert into log_import_manuales values (null,".$id_product.",".$id_attachment.",'".$nombre_fichero."','".$fecha_fichero."')"  ;
    return  Db::getInstance()->Execute($sql);
}

// borramos del log los ficheros
function delete_ficheros_to_log($id_attachment,$id_product) {
    if (!empty($id_attachment)){ // si la imagen existe la borramos
        $sql = "delete from log_import_manuales where id_attachment=".$id_attachment." and id_producto=".$id_product  ;
        Db::getInstance()->Execute($sql);
    }
}

//Recuepera el id_imegen que hay que borrar
function get_image_to_delete($tab_imagenes_productos,$id_producto){
    $id_imagenes='';
    $rows='';
    foreach ($tab_imagenes_productos as $key=> $imagenes) {
        $id_imagenes.=$imagenes.",";
    }
    $id_imagenes.='0';
    $sql = "select id_imagen from log_import_imagenes where id_producto=".$id_producto."  and id_imagen not in (".$id_imagenes.") "  ;
    $rows=Db::getInstance()->ExecuteS($sql);
    return $rows  ;
}

function addLog($txt,$filename) {
    if (!file_exists($filename)) file_put_contents($filename, "");
    file_put_contents($filename,$txt." \r\n".file_get_contents($filename));
}

// borramos del log
function delete_image($id_image,$id_product,$principal) {
    // Borramos del log
    if ($principal && empty($id_image) ) {
        $image = Product::getCover($id_product) ;
        $id_image=$image['id_image'];
    }

    if (!empty($id_image)){ // si la imagen existe la borramos
        $image = new Image($id_image);
        $image->delete();

        $sql = "delete from log_import_imagenes where id_imagen=".$id_image." and id_producto=".$id_product  ;
        Db::getInstance()->Execute($sql);
    }
}


function addCategoriestoproducto($tab_categories ,$id_product)
{
    $product_cats = array();
    foreach ($tab_categories as $key=>$new_id_categ) {
        $product_cats[] = array(
            'id_category' => (int)$new_id_categ,
            'id_product' => (int)$id_product,
            'position' => 1,
        );
    }
    Db::getInstance()->insert('category_product', $product_cats);
    return true;
}

Muchas gracias a tod@s

×
×
  • Create New...