¡Hola @marinashop92!
@lorena_89 y @martabici están en lo cierto. La función getContextualValue no es el lugar adecuado para implementar una lógica de descuentos acumulativos. Esta función está diseñada para calcular el valor de una regla de carrito en un contexto específico (producto, precio base), no para gestionar la secuencia o acumulación de múltiples reglas.
Tu intento de llamar a $context->cart->getOrderTotal() dentro de getContextualValue es lo que causa problemas de recursividad y cálculos incorrectos. Cuando PrestaShop calcula el total del carrito, itera sobre las reglas de carrito y los productos, y si cada regla intenta recalcular el total general, se crea un ciclo infinito o se utiliza un total parcial que aún no tiene todos los descuentos aplicados.
PrestaShop, en su arquitectura actual (PS 9.1.2, Symfony 6.4, PHP 8.2), no ofrece una opción nativa para descuentos acumulativos complejos a través de su interfaz de reglas de carrito. Para lograr esto de manera robusta, se necesita un módulo que intercepte el proceso de cálculo del carrito en un punto más avanzado y aplique la lógica acumulativa después de que PrestaShop haya procesado sus reglas estándar.
Aunque no puedo darte un fragmento de código que implemente toda la lógica acumulativa (ya que es bastante compleja y requiere un módulo completo), puedo mostrarte dónde podrías intentar intervenir con un módulo, aunque el desarrollo es significativo:
// En un módulo bien estructurado, un hook como este podría ser un punto de partida:
public function hookActionCartUpdate(array $params): void
{
/** @var Cart $cart */
$cart = $params['cart'];
// Aquí, PrestaShop ya ha procesado las reglas estándar.
// Para descuentos acumulativos, necesitarías reevaluar los totales
// y aplicar lógicamente una nueva regla o ajustar las existentes.
// Es un proceso muy delicado y propenso a errores en actualizaciones.
// No es viable con una modificación simple de getContextualValue.
Como ves, incluso este hook solo te da el carrito actualizado. La lógica de reevaluación es lo difícil. Por la complejidad y la necesidad de mantener la tienda funcional tras las actualizaciones, la mejor práctica es usar un módulo dedicado. Para esto, te recomiendo echar un vistazo al módulo Descuentos acumulativos. Está diseñado específicamente para manejar estos escenarios sin overrides de core, asegurando compatibilidad y facilidad de gestión.