Jump to content

[Solucionado]Añadir pedido por webservice obligando precios de productos


gusman126

Recommended Posts

Hola a todos.

Estoy intentando añadir un pedido por medio de webservice, pero obligando los precios de los productos.

He podido añadir todo, cliente, direccion, carrito, y pedido,

Cuando voy a enviar el pedido añado las lineas de productos obligando el precio :

<order_rows>
	<order_row>
	<id>0</id>
	<product_id>8510</product_id>
	<product_attribute_id>0</product_attribute_id>
	<product_quantity>1</product_quantity>
	<product_name>GORMITI S2 - BLISTER HERALDS VALUE PACK</product_name>
	<product_reference>GRE06000</product_reference>
	<product_ean13>8056379082132</product_ean13>
	<product_isbn></product_isbn>
	<product_upc></product_upc>
	<product_price>17.35</product_price>
	<unit_price_tax_incl>20.990000</unit_price_tax_incl>
	<unit_price_tax_excl>17.350000</unit_price_tax_excl>
	</order_row>
</order_rows>

El problema esta en que al enviar el pedido, la respuesta y por lo tanto al guardar en la tienda , se guardan con los precios internos de prestashop

<order_rows nodeType="order_row" virtualEntity="true">
	<order_row>
	<id>37</id>
	<product_id>8510</product_id>
	<product_attribute_id>0</product_attribute_id>
	<product_quantity>1</product_quantity>
	<product_name>GORMITI S2 - BLISTER HERALDS VALUE PACK</product_name>
	<product_reference>GRE06000</product_reference>
	<product_ean13>8056379082132</product_ean13>
	<product_isbn/>
	<product_upc/>
	<product_price>13.214876</product_price>
	<unit_price_tax_incl>15.990000</unit_price_tax_incl>
	<unit_price_tax_excl>13.214876</unit_price_tax_excl>
	</order_row>
</order_rows>
</association>

Puedo añadir el "total paid y total products"

<total_paid>20.990000</total_paid>
	<total_paid_tax_incl>20.990000</total_paid_tax_incl>
	<total_paid_tax_excl>17.350000</total_paid_tax_excl>
	<total_paid_real>0.000000</total_paid_real>
	<total_products>17.350000</total_products>
	<total_products_wt>20.990000</total_products_wt>

Y eso si que me lo respeta

<total_paid>20.990000</total_paid>
	<total_paid_tax_incl>20.990000</total_paid_tax_incl>
	<total_paid_tax_excl>17.350000</total_paid_tax_excl>
	<total_paid_real>0.000000</total_paid_real>
	<total_products>17.350000</total_products>
	<total_products_wt>20.990000</total_products_wt>

El problema que tengo es que en la tienda da un error de pago

image.png.751d1fcebcc1b7af96ee2a05dd65ae18.png

 

Alguna solución??

 

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

Hola,

 

estoy interesado en empezar a desarrollar cosas por webservice pero no acabo de encontrar un buen tutorial sobre cómo empezar y hacerlo, por casualidad no tendrás algún enlace útil?

 

Respecto al tema del precio creo que es porque el precio con impuestos te lo hace una función al multiplicar el impuesto que tengas que está en otra tabla con el precio sin impuesto, aunque no estoy al 100%seguro, pero si no tienes algún enlace de impuestos con el producto dudo mucho que te funcione.

Saludos

Link to comment
Share on other sites

hace 12 horas, centrobolsos dijo:

Hola,

 

estoy interesado en empezar a desarrollar cosas por webservice pero no acabo de encontrar un buen tutorial sobre cómo empezar y hacerlo, por casualidad no tendrás algún enlace útil?

 

Respecto al tema del precio creo que es porque el precio con impuestos te lo hace una función al multiplicar el impuesto que tengas que está en otra tabla con el precio sin impuesto, aunque no estoy al 100%seguro, pero si no tienes algún enlace de impuestos con el producto dudo mucho que te funcione.

Saludos

La documentación de Prestashop es algo escasa https://devdocs.prestashop.com/1.7/development/webservice/ , a mi me ayudo mucho esta orden 

$xml = $webService->get( array( 'url' => $url .'api/customers?schema=blank' ) );

Donde customers = el dato que quieres rellenar, de esa manera tienes un xml vacio donde sabes que debes poner y que dato debe ir en el XML

 

Respecto a mi consulta y tu respuesta

EL problema no es el IVA , mira este pedido

Yo envió esto :

<order_row>
	<id>0</id>
	<product_id>8553</product_id>
	<product_attribute_id>0</product_attribute_id>
	<product_quantity>1</product_quantity>
	<product_name>BICICLETA 18" DIANA BLANCA/ROSA</product_name>
	<product_reference>187153</product_reference>
	<product_ean13>1011802331116</product_ean13>
	<product_isbn></product_isbn>
	<product_upc></product_upc>
	<product_price>126.12</product_price>
	<unit_price_tax_incl>152.610000</unit_price_tax_incl>
	<unit_price_tax_excl>126.120000</unit_price_tax_excl>
	</order_row>

y me contesta esto :

<order_row>
	<id>51</id>
	<product_id>8553</product_id>
	<product_attribute_id>0</product_attribute_id>
	<product_quantity>1</product_quantity>
	<product_name>BICICLETA 18" DIANA BLANCA/ROSA</product_name>
	<product_reference>187153</product_reference>
	<product_ean13>1011802331116</product_ean13>
	<product_isbn/>
	<product_upc/>
	<product_price>95.033058</product_price>
	<unit_price_tax_incl>114.990000</unit_price_tax_incl>
	<unit_price_tax_excl>95.033058</unit_price_tax_excl>
	</order_row>

Esta leyendo el precio del producto de prestashop

image.png.781da7892ed9f3fea0e6a06d6b3730e9.png

Y en el pedido no se refleja correctamente, lee el total pagado , pero las lineas de pedido no 

No puedo obligar a poner un precio en el pedido.

Si fuera con codigo directo lo tengo claro como se hace, tengo módulos que leen de marketplaces y añado el precio que me da la gana, pero por Webservice no encuentro la manera

 

image.thumb.png.260cd683095c1b8903077e2b9c86f22a.png

Link to comment
Share on other sites

  • 3 weeks later...
  • 6 months later...

Hola Gusman26 me ha parecido interesando tu modulo... pero quiero hacer una pregunta, tengo un proyecto de multitienda y quiero mostrar los productos de las otras tiendas en la tienda principal solo mostrarlo no agregarlos, mostrar los productos con enlace a cada tienda correspondiente, lo he tratado de hacer modificando algunas clases y métodos pero sin mucho acierto. La pregunta en concreto es,  si has hecho algo parecido o por medio de webservice se puede hacer, ya que no tengo mucho conocimiento manejando webservice... 

gracias de antemano por cualquier ayuda que me puedas dar...

Link to comment
Share on other sites

No he hecho nada parecido y por webservice dudo que puedas hacerlo,el webservice es para comunicar herramientas externas con un PrestaShop

 

La única manera será haciendo un módulo el cual puedes elegir productos de otras tiendas y hacer un listado o página para mostrarlos.

No modifiques classes o controllers, solo veo que por módulo podrías hacerlo mejor.

Ni idea como ,pero es la única manera

 

Link to comment
Share on other sites

En 23/6/2020 a las 1:53 PM, gusman126 dijo:

Todo parece indicar que el sistema Webservice NO puede cambiar el precio de las lineas de los productos en los pedidos
Es una mierda 

Estaba equivocado, si que se puede , se soluciono haciendo un update de esos pedidos.

Los problemas que puse aquí ya se solucionaron.

 

Link to comment
Share on other sites

Una vez he añadido el pedido en Prestashop, guardo la respuesta en un XML

$xmlres = $webService->add( $opt );
$id_original = $xmlres->order->id; 

Una vez se ha añadido utilizo el mismo XML, en este caso $xmlres para añadir los datos correctos, totales del pedido, cambios de estado y otros cambios

$xmlres->order->current_state  = 2;
			
			$xmlres->order->total_paid             = $total_paid;
			$xmlres->order->total_paid_tax_incl        = $total_paid_tax_incl ;
			$xmlres->order->total_paid_tax_excl        = $total_paid_tax_excl ;
			$xmlres->order->total_paid_real        = $total_paid_real;
			
			$xmlres->order->total_products         = $total_products;
			$xmlres->order->total_products_wt      = $total_products_wt;
			
			$xmlres->order->total_shipping             = $total_shipping;
			$xmlres->order->total_shipping_tax_incl    = $total_shipping_tax_incl;
			$xmlres->order->total_shipping_tax_excl    = $total_shipping_tax_excl;
			
			$xmlres->order->carrier_tax_rate = '';
			
			$xmlres->order->total_wrapping = $order->total_wrapping;
			$xmlres->order->total_wrapping_tax_incl = $order->total_wrapping_tax_incl;
			$xmlres->order->total_wrapping_tax_excl = $order->total_wrapping_tax_excl;
			$xmlres->order->round_mode = $order->round_mode;
			$xmlres->order->round_type = $order->round_type;
			$xmlres->order->conversion_rate        = 1;
				
			$hoy = date_create(date('Y-m-d H:i:s'));
			$date = date_format($hoy, 'Y-m-d H:i:s');
			
			$xml->order->date_add = $date;
			$xml->order->date_upd = $date;
			
			$lin = 0;
			
			

una vez cambio los datos de ese xml, recuerda que los demas datos son correctos porque es la respuesta de la orden del webservice, lo actualizando usando un PUT

$webService = new PrestaShopWebservice($url, $api, false);
			
			$updatedXml = $webService->edit([
				'resource' => 'orders',
				'id' => (int)$xmlres->order->id,
				'putXml' => $xmlres->asXML(),
			]);

Ademas actualizo el coste de envío , ya que es posible que sea diferente 

$webService = new PrestaShopWebservice($url, $api, false);
			$xml = $webService->get(array('url' => $url .'api/order_carriers/?schema=blank'));
			$xml->order_carrier->id_order = $id_original;
			$xml->order_carrier->id_carrier = 9;
			$xml->order_carrier->shipping_cost_tax_excl = $total_shipping_tax_excl;
			$xml->order_carrier->shipping_cost_tax_incl = $total_shipping_tax_incl;
			$xml->order_carrier->tracking_number = '';
			$xml->order_carrier->date_add = $date;
			$opt = array( 'resource' => 'order_carriers' );
			$opt['postXml'] = $xml->asXML();
			$xmloc = $webService->add( $opt );

 

Link to comment
Share on other sites

  • gusman126 changed the title to [Solucionado]Añadir pedido por webservice obligando precios de productos
28 minutes ago, gusman126 said:

Una vez he añadido el pedido en Prestashop, guardo la respuesta en un XML


$xmlres = $webService->add( $opt );
$id_original = $xmlres->order->id; 

Una vez se ha añadido utilizo el mismo XML, en este caso $xmlres para añadir los datos correctos, totales del pedido, cambios de estado y otros cambios


$xmlres->order->current_state  = 2;
			
			$xmlres->order->total_paid             = $total_paid;
			$xmlres->order->total_paid_tax_incl        = $total_paid_tax_incl ;
			$xmlres->order->total_paid_tax_excl        = $total_paid_tax_excl ;
			$xmlres->order->total_paid_real        = $total_paid_real;
			
			$xmlres->order->total_products         = $total_products;
			$xmlres->order->total_products_wt      = $total_products_wt;
			
			$xmlres->order->total_shipping             = $total_shipping;
			$xmlres->order->total_shipping_tax_incl    = $total_shipping_tax_incl;
			$xmlres->order->total_shipping_tax_excl    = $total_shipping_tax_excl;
			
			$xmlres->order->carrier_tax_rate = '';
			
			$xmlres->order->total_wrapping = $order->total_wrapping;
			$xmlres->order->total_wrapping_tax_incl = $order->total_wrapping_tax_incl;
			$xmlres->order->total_wrapping_tax_excl = $order->total_wrapping_tax_excl;
			$xmlres->order->round_mode = $order->round_mode;
			$xmlres->order->round_type = $order->round_type;
			$xmlres->order->conversion_rate        = 1;
				
			$hoy = date_create(date('Y-m-d H:i:s'));
			$date = date_format($hoy, 'Y-m-d H:i:s');
			
			$xml->order->date_add = $date;
			$xml->order->date_upd = $date;
			
			$lin = 0;
			
			

una vez cambio los datos de ese xml, recuerda que los demas datos son correctos porque es la respuesta de la orden del webservice, lo actualizando usando un PUT


$webService = new PrestaShopWebservice($url, $api, false);
			
			$updatedXml = $webService->edit([
				'resource' => 'orders',
				'id' => (int)$xmlres->order->id,
				'putXml' => $xmlres->asXML(),
			]);

Ademas actualizo el coste de envío , ya que es posible que sea diferente 


$webService = new PrestaShopWebservice($url, $api, false);
			$xml = $webService->get(array('url' => $url .'api/order_carriers/?schema=blank'));
			$xml->order_carrier->id_order = $id_original;
			$xml->order_carrier->id_carrier = 9;
			$xml->order_carrier->shipping_cost_tax_excl = $total_shipping_tax_excl;
			$xml->order_carrier->shipping_cost_tax_incl = $total_shipping_tax_incl;
			$xml->order_carrier->tracking_number = '';
			$xml->order_carrier->date_add = $date;
			$opt = array( 'resource' => 'order_carriers' );
			$opt['postXml'] = $xml->asXML();
			$xmloc = $webService->add( $opt );

 

Muchas gracias!

Link to comment
Share on other sites

6 hours ago, gusman126 said:

No he hecho nada parecido y por webservice dudo que puedas hacerlo,el webservice es para comunicar herramientas externas con un PrestaShop

 

La única manera será haciendo un módulo el cual puedes elegir productos de otras tiendas y hacer un listado o página para mostrarlos.

No modifiques classes o controllers, solo veo que por módulo podrías hacerlo mejor.

Ni idea como ,pero es la única manera

 

Gracias por responder. seguiré buscando la solución...

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