Hola @paula94, @felix_tech tiene razón. Tu enfoque de usar hookActionCartSave para encontrar el producto más caro es un buen inicio, pero las CartRule de PrestaShop 1.7.3.4 (asumo que esa es tu versión, como es común para esos rangos de PHP) están pensadas para condiciones más estáticas. No hay un método simple para decirle a una regla de carrito estándar 'aplícase a este producto específico que acabo de identificar dinámicamente'.
Modificar el precio de un producto directamente en el objeto $product dentro del hook $cart->getProducts() no se traduce en una reducción de CartRule porque las reglas se procesan en otra parte del ciclo. Para una solución personalizada que simule esto, tendrías que crear una CartRule temporal programáticamente o modificar el total del carrito, pero es muy complejo y propenso a errores. Una forma más 'limpia' de hacerlo con código, aunque aún con sus complejidades, sería la siguiente, enfocándose en cómo se calcula el total final:
// En un módulo custom, dentro de MyCustomModule.php
public function hookActionCartUpdateQuantity($params)
{
$cart = $params['cart'];
$products = $cart->getProducts(true); // Siempre obtener los productos actualizados
if (!empty($products)) {
usort($products, function ($a, $b) {
return (float)$b['price_with_reduction'] <=> (float)$a['price_with_reduction'];
});
$mostExpensiveProductId = (int)$products[0]['id_product'];
Como ves, incluso este snippet es solo una parte de la solución y no es trivial integrarlo. Para lograr esto de manera robusta y sin tener que mantener overrides complejos que se rompan con cada actualización, especialmente si piensas migrar a versiones más nuevas de PrestaShop, mi recomendación es utilizar un módulo dedicado. Hay herramientas específicas que manejan esta lógica a la perfección, como el módulo para código de descuento sólo. Te ahorrará muchos dolores de cabeza y es mucho más fácil de mantener.