Hola @saratech, @irenelab y @inma_9689 han dado en el clavo. PrestaShop no permite aplicar un objeto CartRule que no haya sido previamente guardado en la base de datos para obtener un ID. La función addCartRule() en la clase Cart siempre espera un ID numérico de una regla existente.
La solución 'limpia' pasa por crear una CartRule en la base de datos (con add()), obtener su ID, aplicarla al carrito, y luego gestionar su eliminación cuando ya no sea necesaria (por ejemplo, cuando el carrito no cumpla las condiciones, se vacíe o se complete el pedido). Es un proceso más complejo de lo que parece, ya que hay que manejar el ciclo de vida de esa regla temporal.
Aquí tienes un fragmento de código que ilustra cómo podrías crear una regla temporal y aplicarla. Ten en cuenta que esto es solo una parte de la solución, y necesitarías una lógica robusta para eliminar esta regla cuando deje de ser válida o el carrito se actualice fuera de las condiciones:
// En tu módulo custom, dentro de hookActionCartUpdate
$rule = new CartRule();
$rule->name = ['1' => 'Descuento por Total Dinámico'];
$rule->reduction_amount = 10; // Ejemplo: 10€ de descuento
$rule->reduction_tax = true;
$rule->active = true;
$rule->add(); // Paso crucial: guarda la regla y asigna un ID
$cart->addCartRule($rule->id); // Ahora se puede aplicar al carrito
$cart->update(); // Guarda los cambios en el carrito
Como ves, la gestión completa (creación, aplicación, eliminación condicional) es un trabajo considerable para un módulo custom y puede volverse frágil con actualizaciones. Para una tienda en producción, y si no quieres reinventar la rueda, una solución para descuento del carrito basado ya desarrollada suele ser más robusta y fácil de mantener.