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