Hola @raul_store, este es un escenario común en PrestaShop, especialmente cuando hay módulos de pago o de envío complejos interactuando con el proceso de validación. La condición que verifica $params['cart'] es necesaria, pero a veces, en ciertos contextos de ejecución del hook, el objeto Cart puede no estar directamente en $params o puede que aún no se haya inicializado completamente de la forma esperada, pero la información del carrito sí está en el Context.
El problema es que si el hook retorna tempranamente, tu módulo nunca aplica sus reglas de envío, lo que deriva en un $carrierReference vacío o incorrecto en la validación final del pedido. Para hacerlo más robusto, podemos intentar cargar el carrito desde el contexto si no está disponible o no es una instancia válida en los parámetros. Aquí tienes una modificación que debería ayudar:
function hookActionValidateOrderBefore($params)
{
if (!(int) Configuration::get('SHIPMETHODRULES_ENABLED')) {
return;
}
$cart = isset($params['cart']) && ($params['cart'] instanceof Cart) ? $params['cart'] : Context::getContext()->cart;
if (!($cart instanceof Cart) || !$cart->id) {
return; // Si aún no tenemos un carrito válido, salimos.
}
Con este cambio, si $params['cart'] no es un Cart válido, el módulo intentará usar el carrito del contexto actual. Esto cubre más escenarios y asegura que la lógica de tu módulo tenga un objeto Cart con el que trabajar. Para una gestión más avanzada y sin tener que tocar código directamente en los módulos, te recomiendo considerar soluciones dedicadas para restringir transportistas por código postal que manejan estas situaciones de forma más controlada.