🏷️ Nuevo Sistema de Descuentos — PrestaShop 9.1
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
| Tipo | Descripcion | Alcance |
|---|---|---|
| Catalog Discount | Descuento 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 Discount | Descuento sobre el total del carrito (excl. envio). Porcentaje o importe fijo. | Se aplica al finalizar — visible en el resumen del carrito |
| Free Shipping | Ofrece envio gratuito. Maximo 1 por pedido. | Se aplica al coste de envio |
| Free Gift | Añ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
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
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;
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
| Hook | Tipo | Descripcion |
|---|---|---|
| actionAdminDuplicateDiscountBefore | Action | Antes de duplicar un descuento en el BO |
| actionAdminDuplicateDiscountAfter | Action | Despues de duplicar un descuento en el BO |
| actionDiscountGridDefinitionModifier | Action | Modificar columnas/filtros del grid de descuentos |
| actionDiscountGridQueryBuilderModifier | Action | Modificar la query SQL del grid de descuentos |
| actionDiscountGridDataModifier | Action | Modificar los datos del grid antes de renderizar |
#Hooks eliminados
Estos hooks ya NO existen en PS 9.1 si el feature flag discount esta activo:
| Hook eliminado | Alternativa |
|---|---|
| actionCartRuleFormDataProviderData | Usar actionDiscountGrid*Modifier hooks |
| actionCartRuleFormDataProviderDefaultData | Usar 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.
// 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 modulo | Impacto | Accion |
|---|---|---|
| Generadores de cupones | Alto | Asignar tipo al crear CartRule. Registrar compatibilidad en ps_cart_rule_compatible_types. |
| Descuentos por volumen | Medio | Usar tipo 'catalog_level' o 'product_level' segun alcance. |
| Envio gratis condicional | Medio | Usar tipo 'free_shipping' y los hooks actionOverrideShippingFree*. |
| Regalos con compra | Medio | Usar tipo 'free_gift' con las nuevas restricciones. |
| Modulos de marketing | Bajo | Adaptar UI para mostrar tipo de descuento, no solo 'regla de carrito'. |