Hola @antonioonline y @anadigital,
@anadigital tiene razón, Product::hasSpecificPrice solo verifica la existencia. Para deshabilitar los cupones en artículos que ya tienen un descuento activo, debemos intervenir en el momento exacto en que se calcula el valor del cupón para cada producto. El método getContextualValue de la clase CartRule es el lugar ideal para esto, ya que es el responsable de determinar el valor del descuento que se aplicará a un producto específico en el carrito.
Aquí os dejo una solución más robusta para el override en override/classes/CartRule.php para PrestaShop 1.7.6.1. Esta modificación verifica si el producto ya tiene un precio con reducción aplicada y, en ese caso, devuelve 0 para el valor del cupón para ese producto, evitando que se le aplique un descuento adicional.
class CartRule extends CartRuleCore
{
public function getContextualValue($use_tax, Context $context = null, $product = null, $auto_add = false)
{
// Si es un producto del carrito, comprobamos si ya está en oferta.
if ($product && isset($product['id_product'])) {
$originalPrice = Product::getPriceStatic(
$product['id_product'], $use_tax, $product['id_product_attribute'],
6, null, false, false, 1, false, null, null, null, null, true
);
Con este código, el cupón seguirá siendo válido para los productos que no estén en oferta. Siempre es recomendable utilizar un módulo dedicado para estas funcionalidades, ya que los overrides pueden complicar las actualizaciones del sistema. Para una gestión más sencilla y actualizaciones seguras, puedes considerar un módulo para deshabilitar cupones para artículos.