Jump to content

Campos requeridos en alta de productos por API


Recommended Posts

Hola.

Según https://devdocs.prestashop.com/1.7/webservice/resources/products/ el único campo requerido para crear artículos por el API del webservice es

Price

pero cuando le envío el XML para crear el artículo me da error, he realizado pruebas y como mínimo he de enviarle la siguiente información:

id_shop_default
is_virtual
state
online_only
low_stock_alert
price
wholesale_price
active
available_for_order
show_price
indexed
link_rewrite
name

Me extraña que en la documentación solo requiera precio pero si no lo envío más completo no me lo acepta.

El XML mínimo que he de enviarle es el siguiente:

<?xml version="1.0" encoding="UTF-8"?>
<prestashop xmlns:xlink="http://www.w3.org/1999/xlink">
<product>
<id_shop_default>
<![CDATA[1]]>
</id_shop_default>
<is_virtual>
<![CDATA[0]]>
</is_virtual>
<state>
<![CDATA[1]]>
</state>
<online_only>
<![CDATA[0]]>
</online_only>
<low_stock_alert>
<![CDATA[0]]>
</low_stock_alert>
<price>
<![CDATA[0.000000]]>
</price>
<wholesale_price>
<![CDATA[0.000000]]>
</wholesale_price>
<active>
<![CDATA[1]]>
</active>
<available_for_order>
<![CDATA[1]]>
</available_for_order>
<show_price>
<![CDATA[1]]>
</show_price>
<indexed>
<![CDATA[1]]>
</indexed>
<link_rewrite>
<language id="1">
<![CDATA[]]>
</language>
</link_rewrite>
<name>
<language id="1">
<![CDATA[ARTICULO NUEVO]]>
</language>
</name>
</product>
</prestashop>

No me importa en enviarlo todo pero me extraña.

 

Mi pregunta es; a la hora de crear productos o cualquier otro recurso, es aconsejable tomar todo el recurso desde ?schema=blank, modificar lo que deseas y enviarlo en XML por PUT o POST o crearlo y enviar solo lo que realmente necesitas para crearlo?

Link to comment
Share on other sites

Esto es lo que yo hago...

function addproduct($id_product,$url,$api,$id_original){
	$hoy = date_create(date('Y-m-d'));

	$id_lang = Configuration::get('PS_LANG_DEFAULT');
	$product = new Product($id_product);
	$id_category = $product->id_category_default;
	$stock = StockAvailable::getQuantityAvailableByProduct($id_product,$id_product_attribute = null, $id_shop = null);;
	
	
	
	
	$id_category_default = checkcat($id_category,$url,$api);
	
	
	
	$webService = new PrestaShopWebservice($url, $api, false);
	$xml = $webService->get( array( 'url' => $url .'api/products?schema=blank' ) );
	
	$xml->product->id_category_default =  $id_category_default;
	
	$xml->product->reference = $product->reference;
	$xml->product->new = $product->new;
	$xml->product->ean13 = $product->ean13;
	$xml->product->on_sale = $product->on_sale;
	$xml->product->minimal_quantity = 1;
	
	$xml->product->id_tax_rules_group = 1;
	$xml->product->id_shop_default = 1;
	
	//$xml->product->quantity = $stock;
	
	$xml->product->show_price = $product->show_price;
	$xml->product->date_add = $product->date_add;
	$xml->product->state = $product->state;
	
	$xml->product->online_only = $product->online_only;
	$xml->product->minimal_quantity = $product->minimal_quantity;
	$xml->product->low_stock_threshold = $product->low_stock_threshold;
	$xml->product->low_stock_alert = $product->low_stock_alert;
	
	$xml->product->price = $product->price;
	$xml->product->unity = $product->unity;
	$xml->product->unit_price_ratio = $product->unit_price_ratio;
	$xml->product->active = $product->active;
	$xml->product->available_for_order = $product->available_for_order;
	$xml->product->available_date = $product->available_date;
	$xml->product->condition = $product->condition;
	$xml->product->show_price = $product->show_price;
	$xml->product->visibility = $product->visibility;
	$xml->product->advanced_stock_management  = $product->advanced_stock_management;
	
	
	$xml->product->name->language[0] = $product->name[$id_lang];
	$xml->product->link_rewrite->language[0] = $product->link_rewrite[$id_lang];
	$xml->product->description->language[0] = $product->description[$id_lang];
	$xml->product->description_short->language[0] = $product->description_short[$id_lang];
	$xml->product->associations->categories->category->id = $id_category_default;
	
	
	$xmld =$xml->asXML();
	$logfile = fopen(dirname(__FILE__).'/xml_blank/product_full.xml', "w");
	fwrite($logfile, $xmld);
	
	$webService = new PrestaShopWebservice($url, $api, false);
	$opt = array( 'resource' => 'products' );
	$opt['postXml'] = $xml->asXML();
	$xmlres = $webService->add( $opt );
	
	$id_product = $xmlres->product->id;
	addimage($id_original,$id_product,$api,$url);
	
	$combinations = $product->getAttributesResume($id_lang);

	$imagescombis= $product->getCombinationImages($id_lang);
	
	if($combinations){
		foreach($combinations as $combination){
			$id_product_attribute = $combination['id_product_attribute'];
			
			/*$imgscombis = array();
			
			foreach($imagescombis as $imagecombi){
				if($imagecombi["id_product_attribute"] == $id_product_attribute){
					$imgscombis[] = $imagecombi["id_image"];
				}
			}*/
			
			$datosatts = Product::getAttributesParams($id_original, $id_product_attribute);
			$valores = array();
			
			foreach($datosatts as $datoatts){
				
				$valores[] = checkattr($url, $api,$datoatts);
			}
			addcombi($url, $api,$id_product,$combination,$valores,$imgscombis,$imagenes);
			echo '</pre>';
			
		}
		
	}
	echo '<br>Añadido el producto!'.$xmlres->product->reference;
	asocseller($url, $api,$id_product);
	

}

Y aqui todo el codigo completo, es de un modulo que tengo que envia productos de un prestashop a otro que tiene instalado el modulo de knowband de marketplace, para que se puedan añadir productos por cada vendedor que ya tenga un PS

Lo de añadir las imagenes es lo que mas me costo encontrar como hacerlo

 

$sql = "select * from "._DB_PREFIX_."product where id_product > ".$lastid." order by id_product ASC limit 6000";
$productos = Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS($sql);
if(count($productos) < 50){
	$filecontrol = dirname(__FILE__).'/logs/lastpr.txt';
	$idfile = fopen($filecontrol, "w");
	fwrite($idfile, 0);
	$lastid = 0;
	$sql = "select * from "._DB_PREFIX_."product where id_product > ".$lastid." order by id_product ASC";
	$productos = Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS($sql);
}
foreach($productos as $producto){
	$id_product = $producto["id_product"];
	$id_original = $id_product;
	
	$product = new Product($id_product);
	$opt = array(
		'resource' => 'products',
		'filter[reference]' => $product->reference,
	);
	$webService = new PrestaShopWebservice($url, $api,false);
	$xmlpr = $webService->get($opt);
	
	
	
	if(!isset($xmlpr->products->product)){
		echo 'No exite producto! --->'.$product->reference;
	
		addproduct($id_product,$url,$api,$id_original);
		
	}else{
	
		
		continue;
	}
	
}
function addproduct($id_product,$url,$api,$id_original){
	$hoy = date_create(date('Y-m-d'));

	$id_lang = Configuration::get('PS_LANG_DEFAULT');
	$product = new Product($id_product);
	$id_category = $product->id_category_default;
	$stock = StockAvailable::getQuantityAvailableByProduct($id_product,$id_product_attribute = null, $id_shop = null);;
	
	
	
	
	$id_category_default = checkcat($id_category,$url,$api);
	
	
	
	$webService = new PrestaShopWebservice($url, $api, false);
	$xml = $webService->get( array( 'url' => $url .'api/products?schema=blank' ) );
	
	$xml->product->id_category_default =  $id_category_default;
	
	$xml->product->reference = $product->reference;
	$xml->product->new = $product->new;
	$xml->product->ean13 = $product->ean13;
	$xml->product->on_sale = $product->on_sale;
	$xml->product->minimal_quantity = 1;
	
	$xml->product->id_tax_rules_group = 1;
	$xml->product->id_shop_default = 1;
	
	//$xml->product->quantity = $stock;
	
	$xml->product->show_price = $product->show_price;
	$xml->product->date_add = $product->date_add;
	$xml->product->state = $product->state;
	
	$xml->product->online_only = $product->online_only;
	$xml->product->minimal_quantity = $product->minimal_quantity;
	$xml->product->low_stock_threshold = $product->low_stock_threshold;
	$xml->product->low_stock_alert = $product->low_stock_alert;
	
	$xml->product->price = $product->price;
	$xml->product->unity = $product->unity;
	$xml->product->unit_price_ratio = $product->unit_price_ratio;
	$xml->product->active = $product->active;
	$xml->product->available_for_order = $product->available_for_order;
	$xml->product->available_date = $product->available_date;
	$xml->product->condition = $product->condition;
	$xml->product->show_price = $product->show_price;
	$xml->product->visibility = $product->visibility;
	$xml->product->advanced_stock_management  = $product->advanced_stock_management;
	
	
	$xml->product->name->language[0] = $product->name[$id_lang];
	$xml->product->link_rewrite->language[0] = $product->link_rewrite[$id_lang];
	$xml->product->description->language[0] = $product->description[$id_lang];
	$xml->product->description_short->language[0] = $product->description_short[$id_lang];
	$xml->product->associations->categories->category->id = $id_category_default;
	
	
	$xmld =$xml->asXML();
	$logfile = fopen(dirname(__FILE__).'/xml_blank/product_full.xml', "w");
	fwrite($logfile, $xmld);
	
	$webService = new PrestaShopWebservice($url, $api, false);
	$opt = array( 'resource' => 'products' );
	$opt['postXml'] = $xml->asXML();
	$xmlres = $webService->add( $opt );
	
	$id_product = $xmlres->product->id;
	addimage($id_original,$id_product,$api,$url);
	
	$combinations = $product->getAttributesResume($id_lang);

	$imagescombis= $product->getCombinationImages($id_lang);
	
	if($combinations){
		foreach($combinations as $combination){
			$id_product_attribute = $combination['id_product_attribute'];
			
			/*$imgscombis = array();
			
			foreach($imagescombis as $imagecombi){
				if($imagecombi["id_product_attribute"] == $id_product_attribute){
					$imgscombis[] = $imagecombi["id_image"];
				}
			}*/
			
			$datosatts = Product::getAttributesParams($id_original, $id_product_attribute);
			$valores = array();
			
			foreach($datosatts as $datoatts){
				
				$valores[] = checkattr($url, $api,$datoatts);
			}
			addcombi($url, $api,$id_product,$combination,$valores,$imgscombis,$imagenes);
			echo '</pre>';
			
		}
		
	}
	echo '<br>Añadido el producto!'.$xmlres->product->reference;
	asocseller($url, $api,$id_product);
	

}
function addcombi($url, $api,$id_product,$combination,$valores,$imgscombis,$imagenes){
	$webService = new PrestaShopWebservice($url, $api, false);
	$xml = $webService->get( array( 'url' => $url .'api/combinations?schema=blank'));
	
	
	unset($xml->combination->id);
	unset($xml->combination->associations->product_option_values);
	unset($xml->combination->associations->images);
	$xml->combination->id_product = $id_product;
	$xml->combination->location = '';
	$xml->combination->ean13 = (string)$combination['ean13'];
	$xml->combination->isbn = $combination['isbn'];
	$xml->combination->upc = $combination['upc'];
	$xml->combination->quantity = $combination['quantity'];
	$xml->combination->reference = $combination['reference'];
	$xml->combination->supplier_reference = $combination['supplier_reference'];
	$xml->combination->wholesale_price = $combination['wholesale_price'];
	$xml->combination->price = $combination['price'];
	$xml->combination->ecotax = $combination['ecotax'];
	$xml->combination->weight = $combination['weight'];
	$xml->combination->unit_price_impact = $combination['unit_price_impact'];
	$xml->combination->minimal_quantity = $combination['minimal_quantity'];
	$xml->combination->low_stock_threshold = $combination['low_stock_threshold'];
	$xml->combination->low_stock_alert = $combination['low_stock_alert'];
	$xml->combination->default_on = $combination['default_on'];
	$xml->combination->available_date = $combination['available_date'];

	$lin = 0;
	$product_option_values = $xml->combination->associations->addChild('product_option_values');
	foreach($valores as $valor){
		
		$product_option_value = $product_option_values->addChild('product_option_value');
		$product_option_value->id = $valor;
		$lin ++;
	
		
	}
	
	$imagenesc = $xml->combination->associations->addChild('images');
	foreach($imgscombis as $imgc){
		$foto = $imagenesc->addChild('image');	
		$foto->id =0 ;
		$xml->combination->associations->images->image->id = $imagenes[$combination['id_image']];
	}
	
	
	
	$webService = new PrestaShopWebservice($url, $api, false);
	$opt = array( 'resource' => 'combinations' );
	$opt['postXml'] = $xml->asXML();
	$xmlres = $webService->add( $opt );
	
	return ;
	
	
	
	
}

function checkattr($url, $api,$datoatts){
	$grupo = $datoatts['group'];
	$name = $datoatts["name"];
				
	$webService = new PrestaShopWebservice($url, $api, false);
	$opt = array(
	'resource' => 'product_options',
	'filter[name]' => $grupo,
	'display' => 'full'
	);
	$webService = new PrestaShopWebservice($url, $api, false);
	$xmlcat = $webService->get($opt);
	$valores = array();
	if(!$xmlcat->product_options->product_option){
		$idgrupo = addgrupo($url, $api,$datoatts);
		$id_option_value = addvalor($url, $api,$datoatts,$idgrupo);
		$valores = (int)$id_option_value;
		
		
	}else{
		$idgrupo = $xmlcat->product_options->product_option->id;
		$name = $datoatts['name'];
		
		$opt = array(
		'resource' => 'product_option_values',
		'filter[id_attribute_group]' => (int)$idgrupo,
		'filter[name]' => $name,
		'display' => 'full'
		);
		$webService = new PrestaShopWebservice($url, $api, false);
		$xmlcat = $webService->get($opt);
		if(!$xmlcat->product_option_values->product_option_value){
			$id_option_value = addvalor($url, $api,$datoatts,$idgrupo);
		}else{
			$id_option_value = $xmlcat->product_option_values->product_option_value->id ;
		}
		$valores = (int)$id_option_value;
		
		
		//$id_option_value = addvalor($url, $api,$datoatts,$idgrupo);
		
		
		/*array(
			'grupo' => (int)$idgrupo,
			'atributo' => (int)$id_option_value
		);*/
	}
	return $valores;
	
	
}
function addvalor($url, $api,$datoatts,$idgrupo){
	$webService = new PrestaShopWebservice($url, $api, false);
	$xml = $webService->get( array( 'url' => $url .'api/product_option_values?schema=blank'));
	
	unset($xml->product_option_value->id);
	$xml->product_option_value->id_attribute_group = $idgrupo;
	$xml->product_option_value->position = 0;
	$xml->product_option_value->name->language[0]= $datoatts['name'];
	$opt = array( 'resource' => 'product_option_values' );
	$opt['postXml'] = $xml->asXML();
	$xmlres = $webService->add( $opt );
	
	return $xmlres->product_option_value->id;

}
function addgrupo($url, $api,$datoatts){
	$grupo = $datoatts['group'];
	$webService = new PrestaShopWebservice($url, $api, false);
	$xml = $webService->get( array( 'url' => $url .'api/product_options?schema=blank'));
	unset($xml->product_option->id);
	$xml->product_option->is_color_group= 0;
	$xml->product_option->group_type =  'radio';
	$xml->product_option->position = 0;
	$xml->product_option->name->language[0]= $grupo;
	$xml->product_option->public_name->language[0]= $grupo;
	$webService = new PrestaShopWebservice($url, $api, false);
	$opt = array( 'resource' => 'product_options' );
	$opt['postXml'] = $xml->asXML();
	$xmlres = $webService->add( $opt );
	return $xmlres->product_option->id;
	
	
	

}

function addstock($url, $api,$id_product,$stock){
	echo '<br>Añadiendo Stock!';
	$webService = new PrestaShopWebservice($url, $api, false);
	$xml = $webService->get( array( 'url' => $url .'api/stock_availables?schema=blank' ) );
	unset($xml->stock_available->id);
	$xml->stock_available->id_product = $id_product;
	//$xml->stock_available->stock_available =11;
	$xml->stock_available->id_product_attribute = 0;
	$xml->stock_available->id_shop = 1;
	$xml->stock_available->quantity = 11;
	$xml->stock_available->depends_on_stock = 0;
	$xml->stock_available->out_of_stock = 0;

	$webService = new PrestaShopWebservice($url, $api, false);
	$opt = array( 'resource' => 'stock_availables' );
	$opt['postXml'] = $xml->asXML();
	$xmlres = $webService->add( $opt );
	
	
	
	
}


function checkcat($id_category,$url,$api){
	$id_lang = Configuration::get('PS_LANG_DEFAULT');
	$category = new Category($id_category);
	$cat_name = $category->name[$id_lang];
	$catmarket = Configuration::get('QUINTANAR_MARKETPLACE_CATSELLER');
 
	$opt = array(
	'resource' => 'categories',
	'filter[name]' => $cat_name,
	'display' => 'full'
	);
	$webService = new PrestaShopWebservice($url, $api, false);
	$xmlcat = $webService->get($opt);
	
	if(!isset($xmlcat->categories->category)){
		$id_parent = (string)$category->id_parent;
		
		if($id_parent == '2'){
		
			$id_parent = (string)$catmarket;
		}
		echo '<br>No exite Categoria--> Añadiendo!!!!'.$id_category.'---'.(string)$id_parent;
		
		$id_category_default = addcat($id_category,$url,$api,$id_parent);
		
		return $id_category_default ;
	}else{
		$id_category_default = $xmlcat->categories->category->id;
		return $id_category_default ;
	}
	
	
}


function addcat($id_category,$url,$api,$id_parent){

	$hoy = date_create(date('Y-m-d'));
	

	
	$id_lang = Configuration::get('PS_LANG_DEFAULT');
	$category = new Category($id_category);
	$webService = new PrestaShopWebservice($url, $api, false);
	$xml = $webService->get( array( 'url' => $url .'api/categories?schema=blank' ) );
	
	$id_parent = checkcat($id_parent,$url,$api);
	
	$xml->category->id_parent = $id_parent;
	$xml->category->active = 1;
	$xml->category->date_add = $hoy;
	$xml->category->is_root_category = false;
	$xml->category->id_shop_default = 1;
	$xml->category->position = 0;
	//$xml->category->associations->categories->category-> 2;
	
	$xml->category->name->language[0]  = $category->name[$id_lang];
	$xml->category->link_rewrite->language[0] = $category->link_rewrite[$id_lang];
	$xml->category->description->language[0] = $category->description[$id_lang];
	
	$xmld =$xml->asXML();
	$logfile = fopen(dirname(__FILE__).'/xml_blank/category_full.xml', "w");
	fwrite($logfile, $xmld);
	
	try{
		$webService = new PrestaShopWebservice($url, $api, false);
		$opt = array( 'resource' => 'categories' );
		$opt['postXml'] = $xml->asXML();
		$xmlres = $webService->add( $opt );
		
		
		
	}catch(Exception $e){
			echo '<br>Error!!!';
			
			print_r($e);
		
			$logfile = fopen(dirname(__FILE__).'/error_.log', "w");

			fwrite($logfile, $e);
			return false;
			
			
	}
	return $xmlres->category->id;
}

function addimage($id_original,$id_product,$api,$url){

	$id_lang = Configuration::get('PS_LANG_DEFAULT');
	$images = Image::getImages($id_lang, $id_original);
 
	
	$product = new Product($id_original);
	$fotos = array();
	foreach($images as $image){
		$image_id = $image['id_image'];
		$linki = new Link();
		$value = $linki->getImageLink($product->link_rewrite[$id_lang], $image_id, 'large_default');
		$url_img = 'https://' . $value;
		
		
		$image_path = geturl($id_original,$image_id,$url_img,$api);
				
		$urlImage = $url.'/api/images/products/'.$id_product.'';
		 
		$image_mime = 'image/jpg';
		$args['image'] = new CurlFile($image_path, $image_mime);
		$ch = curl_init();
		curl_setopt($ch, CURLOPT_HEADER, 1);
		curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
		curl_setopt($ch, CURLINFO_HEADER_OUT, 1);
		curl_setopt($ch, CURLOPT_URL, $urlImage);
		curl_setopt($ch, CURLOPT_POST, 1);
		curl_setopt($ch, CURLOPT_USERPWD, $api.':');
		curl_setopt($ch, CURLOPT_POSTFIELDS, $args);
		
		$result = curl_exec($ch);
		$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
		curl_close($ch);
		
		unlink($image_path);
				
		

	}
	return ;
}

function geturl($id_original,$image_id,$url_img,$api){


		 
		$curl = curl_init();
		
		$apien = base64_encode($api);
		curl_setopt_array($curl, array(
			CURLOPT_URL => $url_img,
			CURLOPT_RETURNTRANSFER => true,
			CURLOPT_ENCODING => "",
			CURLOPT_MAXREDIRS => 10,
			CURLOPT_TIMEOUT => 0,
			CURLOPT_FOLLOWLOCATION => true,
			CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
			CURLOPT_CUSTOMREQUEST => "GET",
			CURLOPT_HTTPHEADER => array(
			": ",
			"Authorization: Basic ".$apien,
			)
		));
		$response = curl_exec($curl);
		if(curl_errno($curl))
		{
			echo 'Curl error: ' . curl_error($curl);
			return;
		}
		curl_close($curl);
		$savefile = fopen(dirname(__FILE__).'/tmp'.$id_original.'_'.$image_id.'.jpg', 'w');
		fwrite($savefile, $response);
		fclose($savefile);
		$dominio = Tools::getHttpHost(true).__PS_BASE_URI__;
		$image_url = 'tmp'.$id_original.'_'.$image_id.'.jpg';
		return $image_url;
	}

 

Link to comment
Share on other sites

Gracias por la info!!!!

más o menos es como lo hago yo ahora. Me bajo los schema en blanco y los relleno, aunque en la documentación dice que como campos obligatorios para el producto son el precio, nanai, si le envías un xml con el precio solo te lo escupe, que se entiende, porque le hace falta la tienda, categoría, etc... pero al menos que lo diga en la doc...

Lo que no he visto en tu fuente es para "modificar" productos o cualquier otro recurso (PUT)

Yo lo estoy haciendo en otro lenguaje (harbour) y de momento tengo un escollo ya que no dispongo de la función curl_file(), estoy investigando a ver que opciones tengo, porque no sé realmente que devuelve esta función.

Link to comment
Share on other sites

21 minutes ago, gusman126 said:

Esto es lo que yo hago...


function addproduct($id_product,$url,$api,$id_original){
	$hoy = date_create(date('Y-m-d'));

	$id_lang = Configuration::get('PS_LANG_DEFAULT');
	$product = new Product($id_product);
	$id_category = $product->id_category_default;
	$stock = StockAvailable::getQuantityAvailableByProduct($id_product,$id_product_attribute = null, $id_shop = null);;
	
	
	
	
	$id_category_default = checkcat($id_category,$url,$api);
	
	
	
	$webService = new PrestaShopWebservice($url, $api, false);
	$xml = $webService->get( array( 'url' => $url .'api/products?schema=blank' ) );
	
	$xml->product->id_category_default =  $id_category_default;
	
	$xml->product->reference = $product->reference;
	$xml->product->new = $product->new;
	$xml->product->ean13 = $product->ean13;
	$xml->product->on_sale = $product->on_sale;
	$xml->product->minimal_quantity = 1;
	
	$xml->product->id_tax_rules_group = 1;
	$xml->product->id_shop_default = 1;
	
	//$xml->product->quantity = $stock;
	
	$xml->product->show_price = $product->show_price;
	$xml->product->date_add = $product->date_add;
	$xml->product->state = $product->state;
	
	$xml->product->online_only = $product->online_only;
	$xml->product->minimal_quantity = $product->minimal_quantity;
	$xml->product->low_stock_threshold = $product->low_stock_threshold;
	$xml->product->low_stock_alert = $product->low_stock_alert;
	
	$xml->product->price = $product->price;
	$xml->product->unity = $product->unity;
	$xml->product->unit_price_ratio = $product->unit_price_ratio;
	$xml->product->active = $product->active;
	$xml->product->available_for_order = $product->available_for_order;
	$xml->product->available_date = $product->available_date;
	$xml->product->condition = $product->condition;
	$xml->product->show_price = $product->show_price;
	$xml->product->visibility = $product->visibility;
	$xml->product->advanced_stock_management  = $product->advanced_stock_management;
	
	
	$xml->product->name->language[0] = $product->name[$id_lang];
	$xml->product->link_rewrite->language[0] = $product->link_rewrite[$id_lang];
	$xml->product->description->language[0] = $product->description[$id_lang];
	$xml->product->description_short->language[0] = $product->description_short[$id_lang];
	$xml->product->associations->categories->category->id = $id_category_default;
	
	
	$xmld =$xml->asXML();
	$logfile = fopen(dirname(__FILE__).'/xml_blank/product_full.xml', "w");
	fwrite($logfile, $xmld);
	
	$webService = new PrestaShopWebservice($url, $api, false);
	$opt = array( 'resource' => 'products' );
	$opt['postXml'] = $xml->asXML();
	$xmlres = $webService->add( $opt );
	
	$id_product = $xmlres->product->id;
	addimage($id_original,$id_product,$api,$url);
	
	$combinations = $product->getAttributesResume($id_lang);

	$imagescombis= $product->getCombinationImages($id_lang);
	
	if($combinations){
		foreach($combinations as $combination){
			$id_product_attribute = $combination['id_product_attribute'];
			
			/*$imgscombis = array();
			
			foreach($imagescombis as $imagecombi){
				if($imagecombi["id_product_attribute"] == $id_product_attribute){
					$imgscombis[] = $imagecombi["id_image"];
				}
			}*/
			
			$datosatts = Product::getAttributesParams($id_original, $id_product_attribute);
			$valores = array();
			
			foreach($datosatts as $datoatts){
				
				$valores[] = checkattr($url, $api,$datoatts);
			}
			addcombi($url, $api,$id_product,$combination,$valores,$imgscombis,$imagenes);
			echo '</pre>';
			
		}
		
	}
	echo '<br>Añadido el producto!'.$xmlres->product->reference;
	asocseller($url, $api,$id_product);
	

}

Y aqui todo el codigo completo, es de un modulo que tengo que envia productos de un prestashop a otro que tiene instalado el modulo de knowband de marketplace, para que se puedan añadir productos por cada vendedor que ya tenga un PS

Lo de añadir las imagenes es lo que mas me costo encontrar como hacerlo

 


$sql = "select * from "._DB_PREFIX_."product where id_product > ".$lastid." order by id_product ASC limit 6000";
$productos = Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS($sql);
if(count($productos) < 50){
	$filecontrol = dirname(__FILE__).'/logs/lastpr.txt';
	$idfile = fopen($filecontrol, "w");
	fwrite($idfile, 0);
	$lastid = 0;
	$sql = "select * from "._DB_PREFIX_."product where id_product > ".$lastid." order by id_product ASC";
	$productos = Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS($sql);
}
foreach($productos as $producto){
	$id_product = $producto["id_product"];
	$id_original = $id_product;
	
	$product = new Product($id_product);
	$opt = array(
		'resource' => 'products',
		'filter[reference]' => $product->reference,
	);
	$webService = new PrestaShopWebservice($url, $api,false);
	$xmlpr = $webService->get($opt);
	
	
	
	if(!isset($xmlpr->products->product)){
		echo 'No exite producto! --->'.$product->reference;
	
		addproduct($id_product,$url,$api,$id_original);
		
	}else{
	
		
		continue;
	}
	
}
function addproduct($id_product,$url,$api,$id_original){
	$hoy = date_create(date('Y-m-d'));

	$id_lang = Configuration::get('PS_LANG_DEFAULT');
	$product = new Product($id_product);
	$id_category = $product->id_category_default;
	$stock = StockAvailable::getQuantityAvailableByProduct($id_product,$id_product_attribute = null, $id_shop = null);;
	
	
	
	
	$id_category_default = checkcat($id_category,$url,$api);
	
	
	
	$webService = new PrestaShopWebservice($url, $api, false);
	$xml = $webService->get( array( 'url' => $url .'api/products?schema=blank' ) );
	
	$xml->product->id_category_default =  $id_category_default;
	
	$xml->product->reference = $product->reference;
	$xml->product->new = $product->new;
	$xml->product->ean13 = $product->ean13;
	$xml->product->on_sale = $product->on_sale;
	$xml->product->minimal_quantity = 1;
	
	$xml->product->id_tax_rules_group = 1;
	$xml->product->id_shop_default = 1;
	
	//$xml->product->quantity = $stock;
	
	$xml->product->show_price = $product->show_price;
	$xml->product->date_add = $product->date_add;
	$xml->product->state = $product->state;
	
	$xml->product->online_only = $product->online_only;
	$xml->product->minimal_quantity = $product->minimal_quantity;
	$xml->product->low_stock_threshold = $product->low_stock_threshold;
	$xml->product->low_stock_alert = $product->low_stock_alert;
	
	$xml->product->price = $product->price;
	$xml->product->unity = $product->unity;
	$xml->product->unit_price_ratio = $product->unit_price_ratio;
	$xml->product->active = $product->active;
	$xml->product->available_for_order = $product->available_for_order;
	$xml->product->available_date = $product->available_date;
	$xml->product->condition = $product->condition;
	$xml->product->show_price = $product->show_price;
	$xml->product->visibility = $product->visibility;
	$xml->product->advanced_stock_management  = $product->advanced_stock_management;
	
	
	$xml->product->name->language[0] = $product->name[$id_lang];
	$xml->product->link_rewrite->language[0] = $product->link_rewrite[$id_lang];
	$xml->product->description->language[0] = $product->description[$id_lang];
	$xml->product->description_short->language[0] = $product->description_short[$id_lang];
	$xml->product->associations->categories->category->id = $id_category_default;
	
	
	$xmld =$xml->asXML();
	$logfile = fopen(dirname(__FILE__).'/xml_blank/product_full.xml', "w");
	fwrite($logfile, $xmld);
	
	$webService = new PrestaShopWebservice($url, $api, false);
	$opt = array( 'resource' => 'products' );
	$opt['postXml'] = $xml->asXML();
	$xmlres = $webService->add( $opt );
	
	$id_product = $xmlres->product->id;
	addimage($id_original,$id_product,$api,$url);
	
	$combinations = $product->getAttributesResume($id_lang);

	$imagescombis= $product->getCombinationImages($id_lang);
	
	if($combinations){
		foreach($combinations as $combination){
			$id_product_attribute = $combination['id_product_attribute'];
			
			/*$imgscombis = array();
			
			foreach($imagescombis as $imagecombi){
				if($imagecombi["id_product_attribute"] == $id_product_attribute){
					$imgscombis[] = $imagecombi["id_image"];
				}
			}*/
			
			$datosatts = Product::getAttributesParams($id_original, $id_product_attribute);
			$valores = array();
			
			foreach($datosatts as $datoatts){
				
				$valores[] = checkattr($url, $api,$datoatts);
			}
			addcombi($url, $api,$id_product,$combination,$valores,$imgscombis,$imagenes);
			echo '</pre>';
			
		}
		
	}
	echo '<br>Añadido el producto!'.$xmlres->product->reference;
	asocseller($url, $api,$id_product);
	

}
function addcombi($url, $api,$id_product,$combination,$valores,$imgscombis,$imagenes){
	$webService = new PrestaShopWebservice($url, $api, false);
	$xml = $webService->get( array( 'url' => $url .'api/combinations?schema=blank'));
	
	
	unset($xml->combination->id);
	unset($xml->combination->associations->product_option_values);
	unset($xml->combination->associations->images);
	$xml->combination->id_product = $id_product;
	$xml->combination->location = '';
	$xml->combination->ean13 = (string)$combination['ean13'];
	$xml->combination->isbn = $combination['isbn'];
	$xml->combination->upc = $combination['upc'];
	$xml->combination->quantity = $combination['quantity'];
	$xml->combination->reference = $combination['reference'];
	$xml->combination->supplier_reference = $combination['supplier_reference'];
	$xml->combination->wholesale_price = $combination['wholesale_price'];
	$xml->combination->price = $combination['price'];
	$xml->combination->ecotax = $combination['ecotax'];
	$xml->combination->weight = $combination['weight'];
	$xml->combination->unit_price_impact = $combination['unit_price_impact'];
	$xml->combination->minimal_quantity = $combination['minimal_quantity'];
	$xml->combination->low_stock_threshold = $combination['low_stock_threshold'];
	$xml->combination->low_stock_alert = $combination['low_stock_alert'];
	$xml->combination->default_on = $combination['default_on'];
	$xml->combination->available_date = $combination['available_date'];

	$lin = 0;
	$product_option_values = $xml->combination->associations->addChild('product_option_values');
	foreach($valores as $valor){
		
		$product_option_value = $product_option_values->addChild('product_option_value');
		$product_option_value->id = $valor;
		$lin ++;
	
		
	}
	
	$imagenesc = $xml->combination->associations->addChild('images');
	foreach($imgscombis as $imgc){
		$foto = $imagenesc->addChild('image');	
		$foto->id =0 ;
		$xml->combination->associations->images->image->id = $imagenes[$combination['id_image']];
	}
	
	
	
	$webService = new PrestaShopWebservice($url, $api, false);
	$opt = array( 'resource' => 'combinations' );
	$opt['postXml'] = $xml->asXML();
	$xmlres = $webService->add( $opt );
	
	return ;
	
	
	
	
}

function checkattr($url, $api,$datoatts){
	$grupo = $datoatts['group'];
	$name = $datoatts["name"];
				
	$webService = new PrestaShopWebservice($url, $api, false);
	$opt = array(
	'resource' => 'product_options',
	'filter[name]' => $grupo,
	'display' => 'full'
	);
	$webService = new PrestaShopWebservice($url, $api, false);
	$xmlcat = $webService->get($opt);
	$valores = array();
	if(!$xmlcat->product_options->product_option){
		$idgrupo = addgrupo($url, $api,$datoatts);
		$id_option_value = addvalor($url, $api,$datoatts,$idgrupo);
		$valores = (int)$id_option_value;
		
		
	}else{
		$idgrupo = $xmlcat->product_options->product_option->id;
		$name = $datoatts['name'];
		
		$opt = array(
		'resource' => 'product_option_values',
		'filter[id_attribute_group]' => (int)$idgrupo,
		'filter[name]' => $name,
		'display' => 'full'
		);
		$webService = new PrestaShopWebservice($url, $api, false);
		$xmlcat = $webService->get($opt);
		if(!$xmlcat->product_option_values->product_option_value){
			$id_option_value = addvalor($url, $api,$datoatts,$idgrupo);
		}else{
			$id_option_value = $xmlcat->product_option_values->product_option_value->id ;
		}
		$valores = (int)$id_option_value;
		
		
		//$id_option_value = addvalor($url, $api,$datoatts,$idgrupo);
		
		
		/*array(
			'grupo' => (int)$idgrupo,
			'atributo' => (int)$id_option_value
		);*/
	}
	return $valores;
	
	
}
function addvalor($url, $api,$datoatts,$idgrupo){
	$webService = new PrestaShopWebservice($url, $api, false);
	$xml = $webService->get( array( 'url' => $url .'api/product_option_values?schema=blank'));
	
	unset($xml->product_option_value->id);
	$xml->product_option_value->id_attribute_group = $idgrupo;
	$xml->product_option_value->position = 0;
	$xml->product_option_value->name->language[0]= $datoatts['name'];
	$opt = array( 'resource' => 'product_option_values' );
	$opt['postXml'] = $xml->asXML();
	$xmlres = $webService->add( $opt );
	
	return $xmlres->product_option_value->id;

}
function addgrupo($url, $api,$datoatts){
	$grupo = $datoatts['group'];
	$webService = new PrestaShopWebservice($url, $api, false);
	$xml = $webService->get( array( 'url' => $url .'api/product_options?schema=blank'));
	unset($xml->product_option->id);
	$xml->product_option->is_color_group= 0;
	$xml->product_option->group_type =  'radio';
	$xml->product_option->position = 0;
	$xml->product_option->name->language[0]= $grupo;
	$xml->product_option->public_name->language[0]= $grupo;
	$webService = new PrestaShopWebservice($url, $api, false);
	$opt = array( 'resource' => 'product_options' );
	$opt['postXml'] = $xml->asXML();
	$xmlres = $webService->add( $opt );
	return $xmlres->product_option->id;
	
	
	

}

function addstock($url, $api,$id_product,$stock){
	echo '<br>Añadiendo Stock!';
	$webService = new PrestaShopWebservice($url, $api, false);
	$xml = $webService->get( array( 'url' => $url .'api/stock_availables?schema=blank' ) );
	unset($xml->stock_available->id);
	$xml->stock_available->id_product = $id_product;
	//$xml->stock_available->stock_available =11;
	$xml->stock_available->id_product_attribute = 0;
	$xml->stock_available->id_shop = 1;
	$xml->stock_available->quantity = 11;
	$xml->stock_available->depends_on_stock = 0;
	$xml->stock_available->out_of_stock = 0;

	$webService = new PrestaShopWebservice($url, $api, false);
	$opt = array( 'resource' => 'stock_availables' );
	$opt['postXml'] = $xml->asXML();
	$xmlres = $webService->add( $opt );
	
	
	
	
}


function checkcat($id_category,$url,$api){
	$id_lang = Configuration::get('PS_LANG_DEFAULT');
	$category = new Category($id_category);
	$cat_name = $category->name[$id_lang];
	$catmarket = Configuration::get('QUINTANAR_MARKETPLACE_CATSELLER');
 
	$opt = array(
	'resource' => 'categories',
	'filter[name]' => $cat_name,
	'display' => 'full'
	);
	$webService = new PrestaShopWebservice($url, $api, false);
	$xmlcat = $webService->get($opt);
	
	if(!isset($xmlcat->categories->category)){
		$id_parent = (string)$category->id_parent;
		
		if($id_parent == '2'){
		
			$id_parent = (string)$catmarket;
		}
		echo '<br>No exite Categoria--> Añadiendo!!!!'.$id_category.'---'.(string)$id_parent;
		
		$id_category_default = addcat($id_category,$url,$api,$id_parent);
		
		return $id_category_default ;
	}else{
		$id_category_default = $xmlcat->categories->category->id;
		return $id_category_default ;
	}
	
	
}


function addcat($id_category,$url,$api,$id_parent){

	$hoy = date_create(date('Y-m-d'));
	

	
	$id_lang = Configuration::get('PS_LANG_DEFAULT');
	$category = new Category($id_category);
	$webService = new PrestaShopWebservice($url, $api, false);
	$xml = $webService->get( array( 'url' => $url .'api/categories?schema=blank' ) );
	
	$id_parent = checkcat($id_parent,$url,$api);
	
	$xml->category->id_parent = $id_parent;
	$xml->category->active = 1;
	$xml->category->date_add = $hoy;
	$xml->category->is_root_category = false;
	$xml->category->id_shop_default = 1;
	$xml->category->position = 0;
	//$xml->category->associations->categories->category-> 2;
	
	$xml->category->name->language[0]  = $category->name[$id_lang];
	$xml->category->link_rewrite->language[0] = $category->link_rewrite[$id_lang];
	$xml->category->description->language[0] = $category->description[$id_lang];
	
	$xmld =$xml->asXML();
	$logfile = fopen(dirname(__FILE__).'/xml_blank/category_full.xml', "w");
	fwrite($logfile, $xmld);
	
	try{
		$webService = new PrestaShopWebservice($url, $api, false);
		$opt = array( 'resource' => 'categories' );
		$opt['postXml'] = $xml->asXML();
		$xmlres = $webService->add( $opt );
		
		
		
	}catch(Exception $e){
			echo '<br>Error!!!';
			
			print_r($e);
		
			$logfile = fopen(dirname(__FILE__).'/error_.log', "w");

			fwrite($logfile, $e);
			return false;
			
			
	}
	return $xmlres->category->id;
}

function addimage($id_original,$id_product,$api,$url){

	$id_lang = Configuration::get('PS_LANG_DEFAULT');
	$images = Image::getImages($id_lang, $id_original);
 
	
	$product = new Product($id_original);
	$fotos = array();
	foreach($images as $image){
		$image_id = $image['id_image'];
		$linki = new Link();
		$value = $linki->getImageLink($product->link_rewrite[$id_lang], $image_id, 'large_default');
		$url_img = 'https://' . $value;
		
		
		$image_path = geturl($id_original,$image_id,$url_img,$api);
				
		$urlImage = $url.'/api/images/products/'.$id_product.'';
		 
		$image_mime = 'image/jpg';
		$args['image'] = new CurlFile($image_path, $image_mime);
		$ch = curl_init();
		curl_setopt($ch, CURLOPT_HEADER, 1);
		curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
		curl_setopt($ch, CURLINFO_HEADER_OUT, 1);
		curl_setopt($ch, CURLOPT_URL, $urlImage);
		curl_setopt($ch, CURLOPT_POST, 1);
		curl_setopt($ch, CURLOPT_USERPWD, $api.':');
		curl_setopt($ch, CURLOPT_POSTFIELDS, $args);
		
		$result = curl_exec($ch);
		$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
		curl_close($ch);
		
		unlink($image_path);
				
		

	}
	return ;
}

function geturl($id_original,$image_id,$url_img,$api){


		 
		$curl = curl_init();
		
		$apien = base64_encode($api);
		curl_setopt_array($curl, array(
			CURLOPT_URL => $url_img,
			CURLOPT_RETURNTRANSFER => true,
			CURLOPT_ENCODING => "",
			CURLOPT_MAXREDIRS => 10,
			CURLOPT_TIMEOUT => 0,
			CURLOPT_FOLLOWLOCATION => true,
			CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
			CURLOPT_CUSTOMREQUEST => "GET",
			CURLOPT_HTTPHEADER => array(
			": ",
			"Authorization: Basic ".$apien,
			)
		));
		$response = curl_exec($curl);
		if(curl_errno($curl))
		{
			echo 'Curl error: ' . curl_error($curl);
			return;
		}
		curl_close($curl);
		$savefile = fopen(dirname(__FILE__).'/tmp'.$id_original.'_'.$image_id.'.jpg', 'w');
		fwrite($savefile, $response);
		fclose($savefile);
		$dominio = Tools::getHttpHost(true).__PS_BASE_URI__;
		$image_url = 'tmp'.$id_original.'_'.$image_id.'.jpg';
		return $image_url;
	}

 

 

Al añadir el producto desde Webservice, ¿te aparece en el PrestaShop en Catálogo > Stocks? Yo añado los productos correctamente, actualiza el stock bien, pero no hay manera de que aparezcan en el listado de Gestión de Stocks (PS 1.7.6.5)

 

Link to comment
Share on other sites

Justo ahora, elenaso dijo:

 

Al añadir el producto desde Webservice, ¿te aparece en el PrestaShop en Catálogo > Stocks? Yo añado los productos correctamente, actualiza el stock bien, pero no hay manera de que aparezcan en el listado de Gestión de Stocks (PS 1.7.6.5)

 

Justo eso es lo que estoy mirando porque no me registra el stock incluso añadiendo por webservice "stock_availables"

Me pasa lo mismo

Link to comment
Share on other sites

Yo los estoy actualizando por el recurso https://devdocs.prestashop.com/1.7/webservice/resources/stock_availables/ y me está funcionando bien.

Puedes poner un ejemplo del XML que le envías?

la synopsis es la siguiente:

<prestashop xmlns:xlink="http://www.w3.org/1999/xlink">
<stock_available>
<id_product required="true" format="isUnsignedId"/>
<id_product_attribute required="true" format="isUnsignedId"/>
<id_shop format="isUnsignedId"/>
<id_shop_group format="isUnsignedId"/>
<quantity required="true" format="isInt"/>
<depends_on_stock required="true" format="isBool"/>
<out_of_stock required="true" format="isInt"/>
<location maxSize="255" format="isString"/>
</stock_available>
</prestashop>

hay algunos campos "required" y otros que no lo pone pero quizás igualmente hay que ponerlos como la id_shop, is_shop_group, etc...

Link to comment
Share on other sites

hace 7 minutos, Victor Casajuana Mas dijo:

lo estás enviando por PUT o POST? si el recurso ya está creado y quieres modificarlo, has de enviarlo por PUT

Post, pero ahora que lo dices... puede que el cabroncete este añadiendo uno por defecto cuando se da de alta el producto.

Gracias

Link to comment
Share on other sites

A mi el stock_availables me funciona OK. Actualiza sin problemas. Este recurso es de actualización, no de insercción, por lo que hay que enviarlo con PUT. El id hay que cogerlo del recurso products.

 

El problema que veo que es que en el backoffice (panel de PrestaShop), los productos no aparecen en Catálogo > Stocks. ¿Os ocurre esto? ¿Vosotros los veis? No digo en Catálogo > Productos, ahí sí que los veo bien y está bien el stock. Digo en Catálogo > Stocks:

image.thumb.png.90c89c12d33a60a4c2cbada902322967.png

 

Link to comment
Share on other sites

hace 2 horas, elenaso dijo:

A mi el stock_availables me funciona OK. Actualiza sin problemas. Este recurso es de actualización, no de insercción, por lo que hay que enviarlo con PUT. El id hay que cogerlo del recurso products.

 

El problema que veo que es que en el backoffice (panel de PrestaShop), los productos no aparecen en Catálogo > Stocks. ¿Os ocurre esto? ¿Vosotros los veis? No digo en Catálogo > Productos, ahí sí que los veo bien y está bien el stock. Digo en Catálogo > Stocks:

image.thumb.png.90c89c12d33a60a4c2cbada902322967.png

 

a mí sí que me aparecen, veo que en la captura de pantalla que pasas también te salen en "Fisico" y "disponible"

Link to comment
Share on other sites

hace 12 minutos, Victor Casajuana Mas dijo:

pon el XML que le envías y se verá enseguida donde está el problema.

Ya lo tengo solucionado, gracias... abajo pongo el codigo.

@elenaso

Mira lo que me hace ahora despues de encontrar la solución...

image.thumb.png.f6e1f1d6af01e7488a24d8a9ca064ab7.png

 

El codigo ...

Lo primero que hago es actualizar el Stock_available que añade al añadir el producto

Leo el id del stock_available que ha generado , de la respuesta de añadir el producto y el atributo, en el primer paso es el "0"

Envio los datos y actualizo el stock, aqui lo tenia mal, utilizaba el "get" cuando tenia que utilizar el "blank" rellenando los datos y luego "putxml"

$stock_available = (string)$xmlres->product->associations->stock_availables->stock_available->id;
$id_product_attribute = (string)$xmlres->product->associations->stock_availables->stock_available->id_product_attribute;

addstock($url, $api,$id_product,$stock,$id_product_attribute,$stock_available);
function addstock($url, $api,$id_product,$stock,$id_product_attribute,$stock_available){
	echo '<br>Añadiendo Stock!'.$stock_available;
	$webService = new PrestaShopWebservice($url, $api, false);
	$opt = array(
	'resource' => 'stock_availables',
	'filter[id]' => (int)$stock_available,
	'display' => 'full'
	);
	
	$webService = new PrestaShopWebservice($url, $api, false);
	$xml = $webService->get( array( 'url' => $url .'api/stock_availables?schema=blank' ) );
	$xml->stock_available->id = (int)$stock_available;
	$xml->stock_available->id_product = $id_product;
	$xml->stock_available->id_product_attribute = $id_product_attribute;
	$xml->stock_available->id_shop = 1;
	$xml->stock_available->quantity = $stock;
	$xml->stock_available->depends_on_stock = 0;
	$xml->stock_available->out_of_stock = 2;
	
	
	$webService = new PrestaShopWebservice($url, $api, false);
	$updatedXml = $webService->edit([
		'resource' => 'stock_availables',
		'id' => (int)$stock_available,
		'putXml' => $xml->asXML(),
	]);

	return;
	
	
}

 

Una vez se actualiza el stock del producto si tengo combinaciones dentro de cada una , despues de generarla

$combinationsadd = addcombi($url, $api,$id_product,$combination,$valores,$imgscombis,$imagenes);
$stockcombi = $combination['quantity'];
updatestock($url, $api,$id_product,$stockcombi,$combinationsadd);

Leo los datos, combinacion (atributo) el stock de la combinacion y el id del producto, esto lo envio a una funcion, donde leo todos los "stock_availables " y verifico que sea de ese atributo y entonces actualizo el stock_available llamando a la funcion que he puesto arriba 

 

function updatestock($url, $api,$id_product,$stockcombi,$combinationsadd){
	$webService = new PrestaShopWebservice($url, $api, false);
	$opt = array(
		'resource' => 'stock_availables',
		'filter[id_product]' => $id_product,
		'display' => 'full'
	);
	$webService = new PrestaShopWebservice($url, $api, false);
	$xmlsv = $webService->get($opt);
	foreach($xmlsv->stock_availables->stock_available  as $stockv){
		
		if($stockv->id_product_attribute == $combinationsadd){
			$stock_available = $stockv->id;
			$stock = $stockcombi;
			$id_product_attribute = $combinationsadd;
			addstock($url, $api,$id_product,$stock,$id_product_attribute,$stock_available);
		}
		
		
	}
	
	

}

  Con todo esto, se actualiza el stock tanto del producto como de combinaciones y en el menu "stock" de prestashop se muestra como la imagen que te he puesto.

stock en combinaciones

image.png.38b824d4849557a675b26992b5309065.png

Listado pantalla de stock

image.thumb.png.5f0f032ccf2619dc985e9f1e01bc72d9.png

Edited by gusman126 (see edit history)
Link to comment
Share on other sites

Yo estoy enviando productos simples, sin combinaciones. El producto que se ven en mi pantalla de Catálogo > Stocks es un producto que añadí a mano desde el Backoffice, los que subo por el Webservice no hay manera, no aparecen por ningún lado.

¿Habéis probado a subir productos simples? ¿Os aparecen en Catálogo > Stocks? Es que no entiendo en qué punto me he perdido, el webservice no me devuelve ningún error...
 

Quizá me falte enviar algún campo... Os detallo: Yo añado un producto nuevo enviando todos estos campos (el resto no los modifico, van con lo que devuelve el schema blanco). No especifico todos, cada producto tiene su valor, indico los que pongo por defecto por si hay algo que estoy enviando mal o por si me falta alguno que hay que especificar:

id_manufacturer
id_shop_default (solo tengo una, pero se lo indico)
is_virtual=0
state=1 (aunque no tengo muy claro para qué es)
online_only=0
ecotax=0
customizable=0
active=1
available_for_order=1
advanced_stock_management=1 (este he probado con 0 y con 1, obteniendo el mismo resultado)
show_price=1
indexed=1
visibility='both'
date_add=date('Y-m-d H:m:s')
date_upd=date('Y-m-d H:m:s')
redirect_type='301-category'
minimal_quantity=1
price
wholesale_price (precio de coste)
reference
name->language[0][0]
id_tax_rules_group
id_category_default
associations->categories->category->id


 

Después de añadir el producto, obtengo el id de stock_availables, con este id, obtengo el schema XML para este id y solo modifico los siguientes campos (el resto los dejo tal y como me llegan del XML):

quantity
depends_on_stock=0
out_of_stock=0

 

Y no hago nada más. Con esto, el webservice no me suelta error, todo va OK. En el Backoffice veo el producto en Catálogo > Productos, y ahí el stock y todos los demás datos están correctos. El problema es cuando voy a Catálogo > Stocks, ahí no aparece, no es que aparezca con stock erróneo, es que no aparece ni el producto.

¿Alguna idea? 

Edited by elenaso (see edit history)
Link to comment
Share on other sites

Acabo de hacer la prueba de añadir un producto sin combinaciones. Me pasa lo mismo.

Lo extraño es que añado "echo" para saber que esta haciendo el codigo en ese momento..

No exite producto! --->ORD001
Añadiendo Stock! 750
Añadido el producto!ORD001
Add seller!

image.png.d89db1649bef13c58e094b62ff0082b1.png

 

image.png.9a50e26b436bfb8c903194414de4c4dd.png

 

Lo extraño es que el stock_available es correcto

 

image.png.0806e32a3c20354bd6debc461ef6e602.png

image.png

Link to comment
Share on other sites

19 minutes ago, gusman126 said:

Debe haber algo que se nos escapa.

 

He detectado algo curioso. En Catálogo > Stocks no veo los productos simples que añado con el Webservice, pero si le doy a "Exportar datos a CSV" en esta misma pantalla (iconito arriba a la derecha), sí me aparece, aunque la cantidad física, reservada y disponible viene vacía:

image.thumb.png.42cae44f44c0e953302f415985d798a2.png

Después de tantas pruebas con el Webservice tengo la BD inconsistente (líneas en ps_stock_availables con id_producto=0....), así que creo que haré una limpieza para volver a hacer pruebas. Quizá sea un problema en la visualización ¿?

 

Link to comment
Share on other sites

28 minutes ago, gusman126 said:

Mira esto, aun mas raro, cuando he añadido mas de 100 productos, sale la paginación pero no el listado. es de locos

image.thumb.png.f65342f9943ff244462c05cbc7264443.png

 

¡A mi me pasa exactamente lo mismo! Yo entendía que era por algún problema con mis productos, porque son simples y algo me debe faltar... ¿Los tuyos que son con combinaciones tampoco te salen en la paginación?

Yo estoy pendiente de reinstalar PS (es un proyecto en pruebas y tengo la BD hecha un desastre de tanta prueba con el Webservice) y hoy tengo lío. El lunes te cuento cómo me fue.

Link to comment
Share on other sites

  • 2 months later...

Lamento tardar tanto en constestar, pero abandoné el proceso de actualización mediante Webservice. Demasiados problemas, cero documentación y ninguna ayuda del personal que sabe cómo funciona.

Mi solución, para la importación de productos (desde TPV a PS) pasó por usar el script que se comenta en este hilo: 

 

  • Like 1
Link to comment
Share on other sites

  • 1 month later...
En 7/12/2020 a las 11:41 PM, elenaso dijo:

Lamento tardar tanto en constestar, pero abandoné el proceso de actualización mediante Webservice. Demasiados problemas, cero documentación y ninguna ayuda del personal que sabe cómo funciona.

Mi solución, para la importación de productos (desde TPV a PS) pasó por usar el script que se comenta en este hilo: 

 

¿Que solución TPV usas para Prestashop?

Link to comment
Share on other sites

15 hours ago, Aldeag said:

¿Que solución TPV usas para Prestashop?

¿A qué te refieres? No uso un TPV específico para PS. El TPV que tengo en tienda física (ya antes de tener PS) me genera un CSV (bueno, casi) y es lo que le mando al PS...
No se si te resuelvo algo... Sino, pregúntame de nuevo.

Link to comment
Share on other sites

5 hours ago, Aldeag said:

Ah! Ok

Que no tienes un conector o módulo de tpv. 

No, no tengo un módulo para conectar el TPV con PS. Mi TPV me deja archivos de texto cuando pulso un botón. Yo los paso a CSV y uso el script que comentaba para poder importar los productos  en PrestaShop ;) 

Link to comment
Share on other sites

  • 2 years later...

Buenos dias, tengo el siguiente error al intentar subir productos. PS 1.7.8.8 php 7.4:

Los datos se envian correctamente y se crean los productos, aparecen activos, con precios y asociados a sus categorias. El gran problema es que si no entro al backoffice y le doy a guardar de forma manual, NO SE PUBLICAN.

Esto es lo que envio, utilizando la libreria prestapyt. Creeria que los datos estan bien o no se si hay algun campo que fuerce esto que me este faltando.

data['product']['id_manufacturer'] = ut.buscar_manufacturas(id, cursor)
            data['product']['name']['language']['value'] = fila['despub'].strip().upper()
            data['product']['description']['language']['value'] = fila['desamp'].strip()
            data['product']['description_short']['language']['value'] = fila['desred'].strip()
            data['product']['active'] = "1"
            lw = fila['despub'].strip()
            precio = str(ut.vcalpre('POLO', cursor, id, cotdolar, LISTA, DESCUENTO_1))
            data['product']['price'] = precio
            data['product']['wholesale_price'] = "0"
            data['product']['id_category_default'] = ut.buscar_categorias(fila['id_wcategorias'], cursor)
            data['product']['show_price'] = "1"
            data['product']['id_shop_default'] = tienda
            data['product']['is_virtual'] = "0"
            data['product']['state'] = "1"
            data['product']['online_only'] = "0"
            data['product']['low_stock_alert'] = "0"
            data['product']['available_for_order'] = "1"
            data['product']['indexed'] = "1"
            data['product']['ean13'] = fila["num_art"]
            data['product']['reference'] = fila["num_art"]
            data['product']['quantity'] = "0"
            data['product']["width"] = str(fila["ancho"])
            data['product']["height"] = str(fila["alto"])
            data['product']["depth"] = str(fila["largo"])
            del data['product']['position_in_category']
            del data['product']['quantity']
            del data['product']['associations']
            del data['product']['manufacturer_name']

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...