🏷️ Nuevo Sistema de Descuentos — PrestaShop 9.1

Actualizado: 2026-04
ℹ️
Feature Flag — Beta

El nuevo sistema de descuentos esta bajo el feature flag discount. Desactivado por defecto. Coexiste con el sistema de Cart Rules clasico.

#Introduccion

PrestaShop 9.1 introduce un sistema de descuentos completamente rediseñado. El sistema clasico de Cart Rules (reglas de carrito) se mantiene por retrocompatibilidad, pero el nuevo sistema ofrece una interfaz mas clara con 4 tipos especificos de descuento.

El objetivo es simplificar la gestion de descuentos, que en PS 8 mezclaba conceptos (un 'voucher' podia ser descuento de catalogo, de carrito, envio gratis o regalo — todo en la misma interfaz confusa).

#4 tipos de descuento

TipoDescripcionAlcance
Catalog DiscountDescuento aplicado a productos o segmentos de productos. Puede ser porcentaje o importe fijo.Se aplica antes del carrito — visible en la ficha de producto
Cart DiscountDescuento sobre el total del carrito (excl. envio). Porcentaje o importe fijo.Se aplica al finalizar — visible en el resumen del carrito
Free ShippingOfrece envio gratuito. Maximo 1 por pedido.Se aplica al coste de envio
Free GiftAñade un producto especifico al pedido como regalo.Se añade al carrito automaticamente

Cada tipo tiene su propia interfaz de configuracion en el Back Office con:

#Nuevas tablas de base de datos

ps_cart_rule_type — tipos de descuento
sql
CREATE TABLE IF NOT EXISTS `PREFIX_cart_rule_type` (
    `id_cart_rule_type`  INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
    `name`               VARCHAR(64) NOT NULL,
    `is_core`            TINYINT(1) UNSIGNED NOT NULL DEFAULT 0,
    `active`             TINYINT(1) UNSIGNED NOT NULL DEFAULT 1,
    PRIMARY KEY (`id_cart_rule_type`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- Tipos core pre-insertados:
-- 1: free_shipping
-- 2: cart_level
-- 3: order_level (catalogo)
-- 4: product_level
-- 5: free_gift
ps_cart_rule_type_lang — traducciones
sql
CREATE TABLE IF NOT EXISTS `PREFIX_cart_rule_type_lang` (
    `id_cart_rule_type`  INT(10) UNSIGNED NOT NULL,
    `id_lang`            INT(10) UNSIGNED NOT NULL,
    `name`               VARCHAR(255) NOT NULL,
    `description`        TEXT DEFAULT NULL,
    PRIMARY KEY (`id_cart_rule_type`, `id_lang`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
ps_cart_rule_compatible_types — compatibilidad
sql
CREATE TABLE IF NOT EXISTS `PREFIX_cart_rule_compatible_types` (
    `id_cart_rule`       INT(10) UNSIGNED NOT NULL,
    `id_cart_rule_type`  INT(10) UNSIGNED NOT NULL,
    PRIMARY KEY (`id_cart_rule`, `id_cart_rule_type`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

Ademas, la tabla ps_cart_rule_product_rule amplía su columna type con nuevos valores: products, categories, attributes, manufacturers, suppliers, combinations, features.

#Sistema de compatibilidad

El nuevo sistema introduce un motor de compatibilidad que define que tipos de descuento pueden combinarse. El orden de aplicacion es:

Dentro del mismo tipo, se aplican por prioridad (de menor a mayor). Esto elimina los conflictos que existian en el sistema legacy donde el orden de aplicacion era impredecible.

#Hooks nuevos para descuentos

HookTipoDescripcion
actionAdminDuplicateDiscountBeforeActionAntes de duplicar un descuento en el BO
actionAdminDuplicateDiscountAfterActionDespues de duplicar un descuento en el BO
actionDiscountGridDefinitionModifierActionModificar columnas/filtros del grid de descuentos
actionDiscountGridQueryBuilderModifierActionModificar la query SQL del grid de descuentos
actionDiscountGridDataModifierActionModificar los datos del grid antes de renderizar

#Hooks eliminados

🚨
Breaking change

Estos hooks ya NO existen en PS 9.1 si el feature flag discount esta activo:

Hook eliminadoAlternativa
actionCartRuleFormDataProviderDataUsar actionDiscountGrid*Modifier hooks
actionCartRuleFormDataProviderDefaultDataUsar el nuevo sistema de FormType para descuentos

#Migracion desde Cart Rules

Las Cart Rules existentes siguen funcionando incluso con el nuevo sistema activado. La tabla ps_cart_rule no se elimina. El nuevo sistema añade una capa de tipado encima.

Detectar si el nuevo sistema de descuentos esta activo
php
// Verificar feature flag
$discountSystemActive = (bool) Db::getInstance()->getValue(
    'SELECT state FROM ' . _DB_PREFIX_ . 'feature_flag WHERE name = "discount"'
);

if ($discountSystemActive) {
    // Nuevo sistema — los descuentos tienen tipo
    // Usar la nueva interfaz y hooks
} else {
    // Sistema clasico de Cart Rules
    // Mantener logica legacy
}

#Impacto en modulos de descuento

Tipo de moduloImpactoAccion
Generadores de cuponesAltoAsignar tipo al crear CartRule. Registrar compatibilidad en ps_cart_rule_compatible_types.
Descuentos por volumenMedioUsar tipo 'catalog_level' o 'product_level' segun alcance.
Envio gratis condicionalMedioUsar tipo 'free_shipping' y los hooks actionOverrideShippingFree*.
Regalos con compraMedioUsar tipo 'free_gift' con las nuevas restricciones.
Modulos de marketingBajoAdaptar UI para mostrar tipo de descuento, no solo 'regla de carrito'.
Descargar en Markdown Pensado para pegar en ChatGPT, Claude u otra IA. Incluye solo el contenido de esta pagina.