Hola @inmaes82 y @gonzalosevilla,
Es un buen punto lo que comenta @gonzalosevilla. El resolveOrderCarrierReference en PrestaShop 8 puede ser inconsistente si la estructura delivery_option_list no está perfectamente alineada o si el contexto del pedido no se propaga completamente en $params en todos los escenarios. Aunque la Cart es válida, la información sobre el transportista puede no estar siempre disponible de la forma que espera ese método.
Para solucionar esto y asegurarte de que siempre tienes una referencia de transportista, te sugiero añadir una lógica de fallback justo después de tu llamada a resolveOrderCarrierReference. Esto intentará obtener el ID del transportista directamente del objeto Cart si la primera llamada falla o devuelve un valor vacío. Deberías reemplazar la línea donde obtienes $carrierReference y añadir estas comprobaciones:
$carrierReference = $this->getEngine()->resolveOrderCarrierReference($params);
if (empty($carrierReference) && isset($params['cart']->id_carrier)) {
$carrierReference = (int) $params['cart']->id_carrier;
}
if (empty($carrierReference)) {
return; // No se pudo determinar el transportista, salir
}
// Continúa con la lógica del hook aquí
Con esto, si resolveOrderCarrierReference no te da un valor, el hook intentará usar id_carrier del carrito, que suele estar disponible. Si incluso después de eso no hay referencia, entonces el hook saldrá, evitando errores posteriores con reglas sin transportista.