Hola @lorena_web30 y a todos,
El problema que describes es un caso clásico de cómo los hooks pueden interactuar de forma inesperada cuando un módulo asume ciertos valores. En PrestaShop 9.1.3, con PHP 8.2, las comprobaciones de tipo y la lógica de validación son más rigurosas. El método resolveOrderCarrierReference puede, en efecto, devolver una cadena vacía si el transportista no tiene una referencia externa definida o si hay algún problema en su configuración o en el motor de reglas.
El snippet que compartes es el inicio del hook. La lógica para resolver la referencia del transportista y el punto de fallo ocurrirán más adelante. La clave es añadir una verificación específica después de obtener esa referencia, para asegurar que la validación no se detenga innecesariamente.
Aquí tenéis una modificación que podrías aplicar en vuestro archivo shipmethodrules/shipmethodrules.php para manejar esta situación de forma más robusta. Asegúrate de añadir esto después de las comprobaciones iniciales de Configuration::get y isset($params['cart']):
if (!isset($params['cart']) || !($params['cart'] instanceof Cart)) {
return;
}
$carrierReference = (string) $this->getEngine()->resolveOrderCarrierReference($params);
// Modificación: Si la referencia está vacía pero hay un transportista válido en el carrito,
// permitimos que la validación continúe. Esto evita bloqueos para transportistas sin referencia externa.
if (empty($carrierReference) && !empty($params['cart']->id_carrier)) {
// No retornamos; la lógica del hook debe continuar.
} elseif (empty($carrierReference)) {
// Si no hay referencia Y no hay ID de transportista, entonces sí es un problema. Bloqueamos.
Con esta lógica, si $carrierReference está vacío, pero el carrito tiene un id_carrier válido (lo que indica que el cliente sí seleccionó un transportista), el hook no retornará prematuramente. Solo retornará si no hay ninguna referencia Y tampoco hay un transportista asignado al carrito, lo que sí sería un estado anómalo.
Prueba esto y cuéntanos.