Jump to content

URGENTE Gastos de envio gratuitos sólo para España


sancalg

Recommended Posts

URGENTE Gastos de envio gratuitos sólo para España[/b]Buenos días, mi problema es el siguiente: desde mi tienda enviamos a distintos paises y los costes de envio están establecidos en función del peso, es decir que tengo una matriz con los rangos zonas y franjas de pesos. El problema es que quería ofrecer gastos de envío gratuitos al superar los 120€ de compra, pero sólo en España, sin embargo como las tasas están establecidas en función del peso no puedo seleccionar a la vez rangos de zonas y franjas de pesos.

Podría seleccionar dentro de "Transporte" -> "Mantenimiento" que el envío gratuito comienza a los 120€, pero entonces me lo aplica a todas las zonas y no sólo a España.

¿Alguien sería tan amable de echarme una mano?
GRACIAS DE ANTEMANO

Link to comment
Share on other sites

  • 2 months later...

Yo también estoy interesado en algo así para mi web. Agradecería que nos informaran si existe un módulo para esto, o si se pueden escribir unas líneas de código para poder tener la opción de que los gastos de envío gratuitos se apliquen sólo a los territorios o zonas que seleccionemos.
Gracias.

Link to comment
Share on other sites

  • 2 months later...

Hola.. yo llevo tiempo con el mismo problema..
Por lo mucho que llevo peleado, creo que no es posible configurar los gastos de envío gratis sólo aplicables a una zona y/o transportista.
Lo más cerca que estoy de encontrar una solución, es crear 2 transportitas distintos: Me explico:

En eso de "Gastos de envio gratis a partir de.." lo dejo a CERO.. ¡Nada de usar esa opcion!..
Creo uno llamado "Envío con cargo (p.ej)" y le configuro el rango de precio de 0 a 150 € (o por peso, da igual).
Otro transportista llamado "Envío gratuito" con rango de precio de 150 a 5000 (p.ej)
Ambos transportitas asociados a la misma zona... y... ¡hasta ahí he llegado!... ;)

El caso, es que ahora me salen los dos transportitas para que el cliente eliga.. y claro.. no consigo que el transportista "gratis" no aparezca en pedidos inferiores, pero me imagino que algo hay que cacharrear por ahí... supongo que el transportista puede mostrarse o no en función al importe, no a la zona...

Link to comment
Share on other sites

  • 2 months later...

Para que los portes de envío sean gratis para una zona (ejemplo españa ) debes modificar estas lineas classes/Cart.php

Buscar:

if ($orderTotalwithDiscounts >= floatval($free_fees_price) AND floatval($free_fees_price) > 0)
return $shipping_cost;

Cambiar:

if ($orderTotalwithDiscounts >= floatval($free_fees_price) AND floatval($free_fees_price) > 0 AND $id_zone == 1)
return $shipping_cost;

sólo debes colocar el ID de la zona que quieres gratis (hablamos de si la compra es mayor que = tu precio)

Listo, ahora solo la zona que coloques si supera el precio que digas pues sera gratis, para las demas zonas, siempre tendran que pagar. Saludos

  • Like 1
Link to comment
Share on other sites

Lo que propone Losian es una solución, pero no veo el problema de asignar a España->Zona-> un transportista único con su rango de pesos y precio.
Los compradores de España sólo verán un trasportista!

Para limitar el número de kg en los que vamos a regalar el transporte mirad este hilo
http://www.prestashop.com/forums/viewthread/90011/discusin_general/aportacin_modificacin_gastos_de_porte_pagados_hasta_xx_kg

Link to comment
Share on other sites

El problema que tendrías Pitus si lo haces como dices, es que si creas un monto especifico para que el envio sea gratuito pues simplemente te lo cojerian todos los transportistas y quizas para una zona te interese mas cantidad de euros y para otra menos, por eso es mejor hacerlo como digo, asi solamente si se cumple que la zona sea la asignada en el codigo pues es gratis y si no pues todas las demas a pagar, sea cual sea el monto para que se convierta en gratis. Hay otra forma de incluir mas zonas como digo, como tambien colocar el monto de euros a pagar para que sea gratuito el envio para cada zona, pero eso ya es otro tema. Saludos

Link to comment
Share on other sites

  • 3 months later...

Vaya.. pues siguiendo las indicaciones de Yesiam a mi algo no me funciona :(

He buscado en classes/Cart.php las lineas que se indican y mí código no es exactamente igual (supongo que algo variará en función a la versión de PS utilizada). Lo que yo tengo es:

// Free fees

if (isset($configuration['PS_SHIPPING_FREE_PRICE']) AND $orderTotal >= floatval($configuration['PS_SHIPPING_FREE_PRICE']) AND floatval($configuration['PS_SHIPPING_FREE_PRICE']) > 0)
return $shipping_cost;
if (isset($configuration['PS_SHIPPING_FREE_WEIGHT']) AND $this->getTotalWeight() >= floatval($configuration['PS_SHIPPING_FREE_WEIGHT']) AND floatval($configuration['PS_SHIPPING_FREE_WEIGHT']) > 0)
return $shipping_cost;


Pues bien... añado el trozo de código correspondiente (teniendo en cuenta que 6 es el ID de la única zona en la cual quiero aplicar los gastos de envío gratis en función al importe) hasta dejarlo como:

// Free fees

if (isset($configuration['PS_SHIPPING_FREE_PRICE']) AND $orderTotal >= floatval($configuration['PS_SHIPPING_FREE_PRICE']) AND floatval($configuration['PS_SHIPPING_FREE_PRICE']) AND $id_zone == 6 > 0)
return $shipping_cost;
if (isset($configuration['PS_SHIPPING_FREE_WEIGHT']) AND $this->getTotalWeight() >= floatval($configuration['PS_SHIPPING_FREE_WEIGHT']) AND floatval($configuration['PS_SHIPPING_FREE_WEIGHT']) AND $id_zone == 6 > 0)
return $shipping_cost;

(OJO.. Al hacer vista previa de este post, compruebo como el editor de textos del foro no me respeta correctamente el código escrito.. Tal vez esteis viendo que pone AND $id_zone 6 >, sin los signos igual en medio... Esto es lo que se come el foro.. en el código lo tengo bien escrito, con uno o dos iguales he probado. Es decir.. he añadido id_zone == 6

Y nada!... Que todo sigue igual!... Al superar el importe configurado como envío gratis me los descuenta igual con independencia de la dirección del cliente.

-He probado a poner $id_zone = 6 (con un sólo signo igual) por si acaso pero nada...

-He probado a poner $id_zone = 6 (con un sólo igual y/o con dos) sólamente en el primer par de líneas pues deduzco que son las que entran en juego en mi caso ya que los costes gratis van en función del importe y no del peso, pero nada tampoco...

¿Alguien que pueda arrojar un poco más de luz?... Gracias. ;-)

Link to comment
Share on other sites

Solución:

if (isset($configuration[‘PS_SHIPPING_FREE_PRICE’]) AND $orderTotal >= floatval($configuration[‘PS_SHIPPING_FREE_PRICE’]) AND floatval($configuration[‘PS_SHIPPING_FREE_PRICE’]) > 0 AND $id_zone = = 1) return $shipping_cost; if (isset($configuration[‘PS_SHIPPING_FREE_WEIGHT’]) AND $this->getTotalWeight() >= floatval($configuration[‘PS_SHIPPING_FREE_WEIGHT’]) AND floatval($configuration[‘PS_SHIPPING_FREE_WEIGHT’]) > 0 AND $id_zone = = 1) return $shipping_cost;

zone = a la zona que quieres que el envio sea gratis, eso es todo, un saludo !

Link to comment
Share on other sites

Uf estoy igual que uds quiero configurra portes gratis para la peninsula por compras superiores a X € ...¿el código que habeis puesto lo copio y lo pego tal cual??




Solución:

if (isset($configuration[‘PS_SHIPPING_FREE_PRICE’]) AND $orderTotal >= floatval($configuration[‘PS_SHIPPING_FREE_PRICE’]) AND floatval($configuration[‘PS_SHIPPING_FREE_PRICE’]) > 0 AND $id_zone = = 1) return $shipping_cost; if (isset($configuration[‘PS_SHIPPING_FREE_WEIGHT’]) AND $this->getTotalWeight() >= floatval($configuration[‘PS_SHIPPING_FREE_WEIGHT’]) AND floatval($configuration[‘PS_SHIPPING_FREE_WEIGHT’]) > 0 AND $id_zone = = 1) return $shipping_cost;

zone = a la zona que quieres que el envio sea gratis, eso es todo, un saludo !
Link to comment
Share on other sites

Solución:

if (isset($configuration[‘PS_SHIPPING_FREE_PRICE’]) AND $orderTotal >= floatval($configuration[‘PS_SHIPPING_FREE_PRICE’]) AND floatval($configuration[‘PS_SHIPPING_FREE_PRICE’]) > 0 AND $id_zone = = 1) return $shipping_cost; if (isset($configuration[‘PS_SHIPPING_FREE_WEIGHT’]) AND $this->getTotalWeight() >= floatval($configuration[‘PS_SHIPPING_FREE_WEIGHT’]) AND floatval($configuration[‘PS_SHIPPING_FREE_WEIGHT’]) > 0 AND $id_zone = = 1) return $shipping_cost;

zone = a la zona que quieres que el envio sea gratis, eso es todo, un saludo !


Brillante! Pero no tengo ni idea de php.
Para 2 zonas, una gratuita y otra con precios de transporte diferentes habría que repetir ese código 2 veces?
Podrías ilustrarlo un poco?

Yo tengo esas zonas como Condados, pero coge el precio del Estado

Gracias!
Link to comment
Share on other sites

El problema que tendrías Pitus si lo haces como dices, es que si creas un monto especifico para que el envio sea gratuito pues simplemente te lo cojerian todos los transportistas y quizas para una zona te interese mas cantidad de euros y para otra menos, por eso es mejor hacerlo como digo, asi solamente si se cumple que la zona sea la asignada en el codigo pues es gratis y si no pues todas las demas a pagar, sea cual sea el monto para que se convierta en gratis. Hay otra forma de incluir mas zonas como digo, como tambien colocar el monto de euros a pagar para que sea gratuito el envio para cada zona, pero eso ya es otro tema. Saludos


Yesiam, podrías desarrollar esto un poco a modo de tutorial para Dummies? Sería un gran avance para la humanidad!
Link to comment
Share on other sites

  • 4 months later...

Para los que piden varias zonas yo he hecho lo siguiente partiendo del codigo de Yesiam:

He encerrado el $id_zone == 1 entre parentesis para poder hacer un OR, yo tengo 2 zonas gratuitas y las demas de pago, mi codigo queda asi:

 

if ($orderTotalwithDiscounts >= (float)($free_fees_price) AND (float)($free_fees_price) > 0 AND (($id_zone == 10) OR ($id_zone == 9)))

 

Osea mi añadido es: AND (($id_zone == 10) OR ($id_zone == 9))

Para 3 zonas seria: AND (($id_zone == 10) OR ($id_zone == 9) OR ($id_zone == 8))

y asi sucesivamente.

 

Notese en el fragmento de codigo que al final son 3 parentesis el ultimo es el que cierra el if que ya estaba de antes.

Link to comment
Share on other sites

  • 4 months later...

Hola, disculpad por reflotar un tema antiguo, pero estos códigos me funcionaban en la v1.2.3 pero ahora con al v.1.4.6.2 no son iguales, quizá se necesita una pequeña adaptación. Este es código que tengo:

 

// Free fees

$free_fees_price = 0;

if (isset($configuration['PS_SHIPPING_FREE_PRICE']))

$free_fees_price = Tools::convertPrice((float)($configuration['PS_SHIPPING_FREE_PRICE']), Currency::getCurrencyInstance((int)($this->id_currency)));

 

$orderTotalwithDiscounts = $this->getOrderTotal(true, Cart::BOTH_WITHOUT_SHIPPING);

if ($orderTotalwithDiscounts >= (float)($free_fees_price) AND (float)($free_fees_price) > 0)

return $shipping_cost;

if (isset($configuration['PS_SHIPPING_FREE_WEIGHT']) AND $this->getTotalWeight() >= (float)($configuration['PS_SHIPPING_FREE_WEIGHT']) AND (float)($configuration['PS_SHIPPING_FREE_WEIGHT']) > 0)

return $shipping_cost;

Link to comment
Share on other sites

Bueno... he sido rápido, ya lo tengo, y comparto para beneficio de to2:

 

// Free fees

$free_fees_price = 0;

if (isset($configuration['PS_SHIPPING_FREE_PRICE']) AND $id_carrier == xx)

$free_fees_price = Tools::convertPrice((float)($configuration['PS_SHIPPING_FREE_PRICE']), Currency::getCurrencyInstance((int)($this->id_currency)));

 

$orderTotalwithDiscounts = $this->getOrderTotal(true, Cart::BOTH_WITHOUT_SHIPPING);

if ($orderTotalwithDiscounts >= (float)($free_fees_price) AND (float)($free_fees_price) > 0)

return $shipping_cost;

if (isset($configuration['PS_SHIPPING_FREE_WEIGHT']) AND $id_carrier == xx AND $this->getTotalWeight() >= (float)($configuration['PS_SHIPPING_FREE_WEIGHT']) AND (float)($configuration['PS_SHIPPING_FREE_WEIGHT']) > 0)

return $shipping_cost;

 

En el $id_carrier poned el número de transportista que quereis que sea gratis a partir de determinado importe, tal y cómo lo tengais configurado. Para los demás no aplicará esa regla de transporte gratuito.

Link to comment
Share on other sites

Bueno... he sido rápido, ya lo tengo, y comparto para beneficio de to2:

 

// Free fees

$free_fees_price = 0;

if (isset($configuration['PS_SHIPPING_FREE_PRICE']) AND $id_carrier == xx)

$free_fees_price = Tools::convertPrice((float)($configuration['PS_SHIPPING_FREE_PRICE']), Currency::getCurrencyInstance((int)($this->id_currency)));

 

$orderTotalwithDiscounts = $this->getOrderTotal(true, Cart::BOTH_WITHOUT_SHIPPING);

if ($orderTotalwithDiscounts >= (float)($free_fees_price) AND (float)($free_fees_price) > 0)

return $shipping_cost;

if (isset($configuration['PS_SHIPPING_FREE_WEIGHT']) AND $id_carrier == xx AND $this->getTotalWeight() >= (float)($configuration['PS_SHIPPING_FREE_WEIGHT']) AND (float)($configuration['PS_SHIPPING_FREE_WEIGHT']) > 0)

return $shipping_cost;

 

En el $id_carrier poned el número de transportista que quereis que sea gratis a partir de determinado importe, tal y cómo lo tengais configurado. Para los demás no aplicará esa regla de transporte gratuito.

Perfecto, esta solución valdrá para futuros usuarios que busquen lo mismo.

 

Un saludo,

Link to comment
Share on other sites

Gracias! Ahora me surge otra duda... si es posible cambiar 0,00€ en los gastos de envío por la palabra GRATIS. Me sueno haberlo leido, pero solo encuentro como hacerlo en los productos, no en el envío.

Quizas puedas hacer una condición donde lo quieras poner (por ejemplo en el tpl) {if $variable==x}Gratis !!!!!!{/if}

Link to comment
Share on other sites

Gracias, pero no hay manera!!!! El código del tpl:

 

<td class="carrier_price">

{if $carrier.price}

<span class="price">

{if $priceDisplay == 1}{convertPrice price=$carrier.price_tax_exc}{else}{convertPrice price=$carrier.price}{/if}

</span>

{if $use_taxes}{if $priceDisplay == 1} {l s='(tax excl.)' mod='onepagecheckout'}{else} {l s='(tax incl.)' mod='onepagecheckout'}{/if}{/if}

{else}

{l s='Free!' mod='onepagecheckout'}

{/if}

</td>

</tr>

{/foreach}

Link to comment
Share on other sites

Gracias, pero no hay manera!!!! El código del tpl:

 

<td class="carrier_price">

{if $carrier.price}

<span class="price">

{if $priceDisplay == 1}{convertPrice price=$carrier.price_tax_exc}{else}{convertPrice price=$carrier.price}{/if}

</span>

{if $use_taxes}{if $priceDisplay == 1} {l s='(tax excl.)' mod='onepagecheckout'}{else} {l s='(tax incl.)' mod='onepagecheckout'}{/if}{/if}

{else}

{l s='Free!' mod='onepagecheckout'}

{/if}

</td>

</tr>

{/foreach}

Hay puedes hacer la condición, sin problemas en esa parte del codigo.

Link to comment
Share on other sites

Me quedo =

 

Llevo rato probando... pero noy un gurú en php :blink:

La clave esta en hacer la condición, en esta parte del codigo:

{if $priceDisplay == 1}{convertPrice price=$carrier.price_tax_exc}{else}{convertPrice price=$carrier.price}{/if}

Link to comment
Share on other sites

  • 1 month later...

Buenas,

 

No consigo hacer funcionar el código en un prestashop 1.4.

 

¿Alguien lo ha conseguido?

 

 

// Free fees

$free_fees_price = 0;

if (isset($configuration['PS_SHIPPING_FREE_PRICE']) AND $id_carrier == 60)

$free_fees_price = Tools::convertPrice((float)($configuration['PS_SHIPPING_FREE_PRICE']), Currency::getCurrencyInstance((int)($this->id_currency)));

 

$orderTotalwithDiscounts = $this->getOrderTotal(true, Cart::BOTH_WITHOUT_SHIPPING);

if ($orderTotalwithDiscounts >= (float)($free_fees_price) AND (float)($free_fees_price) > 0)

return $shipping_cost;

 

if (isset($configuration['PS_SHIPPING_FREE_WEIGHT']) AND $id_carrier == 60 AND $this->getTotalWeight() >= (float)($configuration['PS_SHIPPING_FREE_WEIGHT']) AND (float)($configuration['PS_SHIPPING_FREE_WEIGHT']) > 0)

return $shipping_cost;

Link to comment
Share on other sites

  • 3 weeks later...
  • 1 month later...
  • 3 weeks later...

Yo también me uno a la pregunta: si hubiese un módulo que facilitase este asunto estaría muy bien. Mientras tanto, a ver si damos con una solución sin necesidad de tocar los .tpl.

 

Si desactivamos el pedido mínimo poniendo 0 € en "el envío gratuito comienza a las:", ¿qué ocurriría si duplicamos las franjas de precios para la misma agencia? Y me explico:

 

Imaginad que quisiéramos hacer que en Europa el envío gratuito fuese a los 100 € y en América a los 300 € (es un ejemplo).

 

Si creamos franjas de precios duplicados, ¿funcionaría?

 

Me refiero a crear cuatro franjas de precios:

De 0 € a 100 €

De 101 € a 9999999999 €

De 0 € a 300 €

De 301 € a 999999999€

 

Con esas cuatro franjas, pondríamos los costes para Europa y para América. Lo que no sé es si podría funcionar, ya que un pedido de 110 €, por ejemplo, entra en dos franjas. ¿Cogería el coste de envío máximo, el mínimo o daría error? He visto que hay una opción para poner qué debe hacer cuando NO encuentra una franja determinada, pero no sé cómo actúa el programa cuando encuentra dos franjas válidas.

Link to comment
Share on other sites

  • 1 month later...

Buenas. A ver si con suerte Yesiam o cualquiera de los sabios de este foro me ayuda.

 

Hice las modificaciones del post #4 y funcionó a la perfección, excepto por un pequeño detalle, pero para mí importante.

 

Explico: Yo tengo gastos de envío gratuitos desde 99 euros para península. Cuando un cliente registrado actualiza el carrito, los gastos se recalculan bien automáticamente, es decir, que un cliente peninsular, al llegar a 100 euros los gastos de envío se ponen a cero, y un cliente de las islas, no. Todo perfecto.

 

El problema son los invitados. Después de esta modficación, cuando un cliente no registrado llena un carro, al llegar a los 100 euros el carrito NO borra los gastos de envío como hacía antes. Si luego ese carrito se registra y el cliente es peninsular, el recálculo se hará bien y los gastos se borrarán, pero tengo miedo de que eso retraiga a clientes que no lleguen a registrarse pensando que tienen que pagar los gastos.

 

ES como si Prestashop, al no saber a qué zona asignar al invitado lo asignara ante la duda a la tarifa más cara, y yo lo que quiero es que a un invitado le asigne la tarifa más ventajosa.

 

¿Alguien tiene alguna idea? Gracias por anticipado.

Link to comment
Share on other sites

  • 2 weeks later...

Conseguido en el 1.4 ha sido modificando el cart.php creo que un módulo no sería suficiente ya que el core de Prestashop no está preparado así que he tenido que modificar el archivo y ya funciona, intenté usar el código que aparecia en el post y mis jefes recibieron un pedido del resto de europa les salio el transporte gratuito y han perdido 50 €, pero ya está solucionado.

  • Like 1
Link to comment
Share on other sites

Conseguido en el 1.4 ha sido modificando el cart.php creo que un módulo no sería suficiente ya que el core de Prestashop no está preparado así que he tenido que modificar el archivo y ya funciona, intenté usar el código que aparecia en el post y mis jefes recibieron un pedido del resto de europa les salio el transporte gratuito y han perdido 50 €, pero ya está solucionado.

 

Hola, perdona que te moleste pero tengo dos dudillas:

 

1. ¿solo modificaste el cart.php?

 

2. y si es asi, podrias subir el codigo a pastebin o algun sitio parecido?

 

muchas gracias!

Link to comment
Share on other sites

  • 2 months later...
Guest
This topic is now closed to further replies.
×
×
  • Create New...