---
title: Nuevo Sistema de Descuentos — PrestaShop 9.1
section: ps91
slug: discounts-system
description: "Nuevo sistema de descuentos en PrestaShop 9.1: 4 tipos, compatibilidad, nuevas tablas DB, hooks y migracion desde Cart Rules."
last_updated: 2026-04
source_url: "https://ayudaprestashop.es/ps91/discounts-system"
---

# Nuevo Sistema de Descuentos — PrestaShop 9.1

> Nuevo sistema de descuentos en PrestaShop 9.1: 4 tipos, compatibilidad, nuevas tablas DB, hooks y migracion desde Cart Rules.

> **[I] 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

| 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

*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

| 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

> **[!!] Breaking change**
>
> 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.

*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 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'. |


---

*Fuente: [https://ayudaprestashop.es/ps91/discounts-system](https://ayudaprestashop.es/ps91/discounts-system). Version Markdown generada automaticamente para consumo por LLMs.*
