Error: No hay transportistas disponibles que envien a algunas de sus direcciones

El día a día de un desarrollador puede ser increiblemente aburrido o no. Hoy me ha sucedido que probando la tienda de un cliente, no podía hacer un pedido, al finalizar el pedido, obtenía siempre el error «Error: No hay transportistas disponibles que envien a algunas de sus direcciones».
Revisé todas las configuraciones de transportistas, pesos, zonas, etc… y estaba todo correcto, así que me he decidido por bajar a las profundidades y localizar qué estaba sucediendo, es decir, a trazar código ( como casi todos los días 😀 ).

Lo voy a resumir muchísimo, y si alguien tiene dudas… que pregunte.

1.- Por donde comenzar. El error aparece al realizar el pedido, en mi caso, un pedido rápido. Si abro firebug y clickeo en los términos y condiciones, veo que se lanza una petición ajax al servidor que devuelve toda la información con la que rellena los medios de pago, los transportistas, etc… que la petición se lanza es «pedido-rapido».

[php]
http://localhost/prestashop/es/pedido-rapido
{«HOOK_TOP_PAYMENT»:» «,»HOOK_PAYMENT»:»<p class=\»warning\»>Error: No hay transportistas disponibles que envien a algunas de sus direcciones<\/p>»}
[/php]

2.- Para localizar que controller gestiona esta url nos vamos al backend en «Preferencias > SEO + URL’s» y buscamos ‘pedido-rapido’ en la columna de ‘url-amigable’ y vemos que en página aparece ‘order-opc’. Ese el nombre del controller que gestionará las peticiones para ‘pedido-rapido’

3.- Siguiendo nuestros conocimientos vemos en OrderOpcControllerCore::init() que hay una serie de casos, si la llamada es ajax , nos centramos en el TOS y lo que nos intresa es que lo nos devuelve la funcion «$this->_getPaymentMethods()»

[php]
case ‘updateTOSStatusAndGetPayments’:
if (Tools::isSubmit(‘checked’))
{
$this->context->cookie->checkedTOS = (int)(Tools::getValue(‘checked’));
die(Tools::jsonEncode(array(
‘HOOK_TOP_PAYMENT’ => Hook::exec(‘displayPaymentTop’),
‘HOOK_PAYMENT’ => $this->_getPaymentMethods()
)));
}
break;
[/php]

4.- En _getPaymentMethods() el bloque que nos interesa es este y concretamente «$this->context->cart->getDeliveryOptionList()»

[php]
if (count($this->context->cart->getDeliveryOptionList()) == 0 && !$this->context->cart->isVirtualCart())
{
if ($this->context->cart->isMultiAddressDelivery())
return ‘<p class=»warning»>’.Tools::displayError(‘Error: None of your chosen carriers deliver to some of  the addresses you\’ve selected.’).'</p>’;
else
return ‘<p class=»warning»>’.Tools::displayError(‘Error: None of your chosen carriers deliver to the address you\’ve selected.’).'</p>’;
}
[/php]

5.- Nos vamos a la case Cart para tracear Cart::getDeliveryOptionList() y después de echarle unas trazas vemos que realmente la chicha de todo el proceso de gestión de los envíos lo tenemos en esta linea
[php]
$package_list = $this->getPackageList();
[/php]

6.- La funcion Cart::getPackageList() devolverá informacion sobre los envíos y transportistas con lo que puedes anotarla en tus marcadores de código, para ir directamente y trazar por aquí cuando no sepas muy bien por dónde comenzar.

No obstante en mi caso, resultó que la parte que necesitaba verificar era esta última linea, que carga los transportistas para los productos, almacenes, etc.. etc…

[php]
$product[‘carrier_list’] = array_merge($product[‘carrier_list’], Carrier::getAvailableCarrierList(new Product($product[‘id_product’]), $id_war, $product[‘id_address_delivery’], null, $this));
[/php]

Todo este trabajo, concluye en que mis cookies estaban dando problemas y tuve que borrarlas para que me funcionar, eso pasa por mezclar muchas instalaciones !!!!


Publicado

en

,

por

Etiquetas:

Comentarios

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.