---
audiencia: usuario
screen_key: ofertas
titulo: Ofertas y Promociones
aliases:
  - ofertas
  - promociones
  - descuentos
  - descuento porcentaje
  - precio especial
  - nxm
  - 3x2
  - combo
  - happy hour
---

# Ofertas y Promociones

Permite crear descuentos, precios especiales, promos NxM (3x2), combos y otras campañas que el POS aplica **automáticamente** al cargar productos al carrito.

## Dónde está esto en el menú

`Productos → pestaña "Ofertas"` — alta y mantenimiento de ofertas. No existe una pantalla "Ofertas y Promociones" en Ventas ni un ítem "Ofertas" en Configuración → Facturación (esa categoría solo tiene Monedas, Métodos de Pago, Configuración de Compras y Planes de Cuotas Automáticos).

## Conceptos generales

- **Oferta**: regla con vigencia, condiciones y un tipo de descuento. Ejemplo: "20% OFF en lácteos del 1 al 15 de mayo".
- **Aplicabilidad**: a qué productos afecta. Puede ser por **producto**, **categoría**, **marca** o **todos** los productos, con posibilidad de **excluir** ítems concretos.
- **Sucursales**: una oferta vale para una o varias sucursales. Si no se carga ninguna, se entiende que aplica en **todas**.
- **Prioridad**: número entero. **Mayor prioridad gana** cuando dos ofertas son aplicables al mismo producto. En empate de prioridad gana la de **mayor descuento**.
- **Evaluación**: el motor `POST /ofertas/evaluar` corre cada vez que el cajero agrega/cambia un ítem en el carrito. El POS muestra precio original vs precio con oferta.
- **Acumulabilidad**: en la versión MVP **no se acumulan ofertas** — solo aplica una por producto. En Fase 3 se puede marcar `acumulable=true` para casos puntuales.
- **Historial**: cada factura registra qué oferta se usó y cuánto descontó (`oferta_usos`), opcionalmente por ítem (`oferta_usos_detalle`).

Permisos: `INV_OFE_OFERTA_VER / CREAR / EDITAR / ELIMINAR` (módulo INVENTARIO).

---

## 1. Tipos de oferta

| Tipo | Fase | Cuándo usarlo |
|---|---|---|
| **Descuento porcentaje** | MVP | "20% OFF en lácteos" |
| **Descuento monto fijo** | MVP | "Gs. 5.000 OFF en shampoo X" |
| **Precio especial** | MVP | "Heladera a Gs. 500.000 (era Gs. 600.000)" |
| **NxM** (3x2, 2x1…) | Fase 2 | "3x2 en bebidas" — lleva 3, paga 2 |
| **Combo** | Fase 2 | "Shampoo + Acondicionador = Gs. 15.000" |
| **Por cantidad** | Fase 3 | "Llevando 6+ unidades, 15% OFF" |
| **Por medio de pago** | Fase 2 | "10% con Visa Crédito" / "15% efectivo" |
| **Por día de la semana** | Fase 3 | "Martes de farmacia 25% OFF" |
| **Por horario** | Fase 3 | "Happy Hour 18 a 20 hs 30% OFF" |

> **Precio especial** siempre gana sobre **descuento porcentaje** y **descuento monto** cuando aplica al mismo producto, aunque tenga menor prioridad.

---

## 2. Alta de oferta

Campos comunes (MVP):

| Campo | Obligatorio | Detalle |
|---|---|---|
| Nombre | Sí | "20% OFF lácteos mayo" |
| Descripción | No | Texto interno para el equipo de ventas |
| Tipo | Sí | Uno de la tabla anterior |
| Valor | Sí | Porcentaje (1-100), monto fijo o precio especial según tipo |
| Vigencia desde / hasta | Sí | Fecha y hora |
| Prioridad | Sí | 0 (default) o mayor. Mayor = se elige antes |
| Activa | Auto | Toggle. Las inactivas no se evalúan |

### Aplicabilidad

Una oferta debe tener al menos una **regla de aplicabilidad**:

- **Producto**: lista de productos específicos.
- **Categoría**: la oferta vale para todos los productos de esa categoría.
- **Marca**: para todos los productos de la marca.
- **Todos**: aplica a cualquier producto (típico para "10% en toda la tienda").

Para cada regla se puede marcar **Excluir** = sí → ese producto/categoría/marca **queda fuera** de la oferta. Útil para casos como "Todos los productos, excepto cigarrillos".

### Sucursales

- Si **no se carga ninguna**, la oferta vale para todas las sucursales de la empresa.
- Si se cargan una o más, **sólo** vale en esas.

### Campos adicionales en Fase 2

| Campo | Para qué |
|---|---|
| Valor N / Valor M | En tipo **NxM**: "Lleva N, paga M". Ej: 3x2 → N=3, M=2 |
| Límite de uso total | Tope global de veces que se puede aplicar la oferta |
| Límite de uso por cliente | Tope por cliente identificado |
| Medios de pago | Lista de métodos válidos (Tarjeta Visa, efectivo, etc.). Si está vacío vale para todos |
| Ítems del combo | Productos + cantidades + **precio combo** total |

### Campos adicionales en Fase 3

| Campo | Para qué |
|---|---|
| Días de la semana | Array (0=domingo, 6=sábado). Si está vacío vale todos los días |
| Hora inicio / fin | Rango horario (ej. 18:00 a 20:00) |
| Acumulable | Si está ON, la oferta puede sumarse a otra acumulable sobre el mismo ítem |
| Condiciones avanzadas | Cantidad mínima, monto mínimo, tipo de cliente, cliente nuevo, cuotas mínimas, etc. con operadores `= / >= / <= / > / < / in / not_in` |

---

## 3. Cómo se aplica en el POS

Cada vez que el cajero modifica el carrito, el motor:

1. Filtra ofertas **activas y vigentes** para la empresa.
2. Filtra por **sucursal** actual.
3. Filtra por **aplicabilidad** del producto (producto / categoría / marca / todos), respetando exclusiones.
4. Ordena las que aplican por **prioridad** descendente. En empate, por **mayor descuento**.
5. Aplica **una sola** oferta por ítem (salvo que `acumulable=true` en Fase 3).
6. En Fase 2 valida que el **medio de pago** seleccionado sea uno de los habilitados.
7. Devuelve para cada ítem: `precio_original`, `precio_final`, `descuento`, `nombre_oferta`.

En el POS retail el cajero ve el precio tachado y el precio nuevo, con un chip con el nombre de la oferta. En el ticket / factura sale el descuento desglosado.

---

## 4. Historial de uso

- Por cada factura donde se aplicó una oferta, se guarda una línea en `oferta_usos`: oferta, factura, cliente, monto descontado.
- En Fase 2 se agrega `oferta_usos_detalle` con la cantidad afectada y el descuento por ítem.
- Desde el detalle de cada oferta hay un botón **Historial de uso** con la lista y los totales.

Reportes útiles (Fase 3): % de facturas con oferta, descuento total por campaña, ticket promedio con vs sin oferta, oferta más exitosa.

---

## Validaciones (texto que ve el usuario)

- "Debe seleccionar al menos un producto, categoría o marca".
- "La fecha fin no puede ser anterior a la fecha inicio".
- "El porcentaje debe estar entre 1 y 100".
- "El precio especial debe ser mayor a 0".
- "Para NxM: N debe ser mayor que M".
- "El combo debe tener al menos 2 productos".
- "Se alcanzó el límite de uso total de la oferta".
- "Esta oferta ya fue utilizada por este cliente la cantidad máxima de veces".

## Lo que NO se puede hacer

- **No se pueden acumular ofertas** en MVP — gana una sola por producto.
- **No se puede aplicar una oferta vencida** ni inactiva (el motor las filtra).
- **No se puede usar precio especial menor a 0**.
- **No se pueden combinar dos combos** que compartan productos.
- **No se puede borrar una oferta** con uso histórico: se desactiva (`active = false`) para preservar trazabilidad fiscal de las facturas.
- **No se pueden tener dos ofertas con prioridad alta y mismo descuento** sin resultados predecibles — siempre ganaría la primera que evalúa el motor; conviene jugar con `prioridad`.
- **No se aplican ofertas a productos exentos** que estén excluidos por regla.

## Problemas frecuentes

- **"La oferta no aparece en el POS"**: revisar (1) `Activa = ON`, (2) fechas de vigencia, (3) sucursal actual del POS está incluida (o ninguna sucursal cargada), (4) el producto está cubierto por la regla de aplicabilidad, (5) no está excluido.
- **"Se aplica una oferta vieja que ya no quiero"**: marcarla **Inactiva** o ajustar la fecha de fin a hoy.
- **"El cliente dice que el combo no le descuenta"**: el motor sólo aplica el combo cuando **todos los productos del combo** están en el carrito con la cantidad mínima requerida.
- **"Pasa una oferta y no la otra"**: por diseño aplica una sola — subir la **prioridad** de la que querés que gane, o bajar la de la otra.
- **"El cajero tiene que aplicar el descuento manual"**: revisar que el **producto** esté correctamente categorizado (la oferta busca por categoría/marca).
- **"NxM no descuenta"**: validar `valor_n > valor_m`. Por ejemplo en 3x2: N=3, M=2. Si carga 5 unidades, descuenta 1 (5 / 3 = 1 grupo completo → 1 unidad gratis).

## Limitaciones actuales

- **MVP no acumula ofertas**. La acumulabilidad llega en Fase 3.
- **No hay reportes** de campañas en MVP — sólo el historial por oferta.
- **No hay segmentación por cliente** en MVP (sólo Fase 3 con condiciones avanzadas).
- **No se programan ofertas futuras automáticas** más allá de las fechas de vigencia.
- **No hay límite por sucursal** (los topes son globales).
- **No hay cupones** ni códigos promocionales que el cliente tipea — todo es automático por reglas.
- **El motor no recomienda** ofertas al cajero proactivamente; sólo aplica las que pegan.

## Documentos relacionados

- `guia-facturacion.md` — cómo el descuento aparece en el documento electrónico.
- `guia-monedas-metodos-pago.md` — métodos de pago utilizados en Fase 2 para condicionar ofertas.
- `guia-sucursales-cajas-pos.md` — POS retail donde el cajero ve las ofertas aplicadas.
- `guia-inventario.md` — categorías y marcas que usa la aplicabilidad.
