Guía: Lectura desde GET · ← Condiciones · Efectos →
rule_application — referencia completa
Campo en la respuesta GET
En GET /discounts y GET /discounts/{id}, este bloque viene en **rule_application** (string JSON). Tras parsear, la raíz interna es **application.and[]** (no conditions).
Índice
- Qué hace (y qué no hace)
- Vacío vs definido
- Caso típico: sin condiciones de victoria, solo aplicación
- Dos familias de aplicación
- Subcondiciones anidadas en líneas: solo
quantity - Gramática compartida con condiciones de líneas
- Bundle / 2x1:
quantityen aplicación - Aplicación sobre
additional_costs - JSON maestro de referencia — aplicación en líneas
- Condiciones de victoria + aplicación distinta (caso frecuente)
- Obligatoriedad (porcentaje / ratio)
- Errores frecuentes —
rule_application
Qué hace (y qué no hace)
| Bloque | Pregunta que responde |
|---|---|
**rule_conditions** | ¿Cuándo puede entrar en juego la campaña? (elegibilidad: cliente, carrito, líneas, umbrales, …) |
**rule_application** | ¿Dónde se aplica el descuento si la campaña aplica? (líneas del carrito y/o un coste adicional concreto) |
rule_application no sustituye a las condiciones de victoria: acota el alcance del efecto. Reutiliza gramática similar a condiciones de líneas (conditions.and, array_field: lines, field, values, …) y admite además aplicación sobre un campo de **additional_costs** del carrito.
Vacío vs definido
Estado de rule_application | Comportamiento |
|---|---|
Vacío / ausente / null | El descuento puede aplicar sobre todas las líneas del carrito (según rule_effects.distribution) |
| Con filtros | El descuento solo aplica donde indique la regla (líneas y/o un additional_costs.nombre``) |
Caso típico: sin condiciones de victoria, solo aplicación
Para una campaña que debe descontar ciertos productos siempre (sin umbral de carrito, sin qty mínima en condiciones, etc.):
- Deja
**rule_conditionsvacío** (sin requisitos de elegibilidad). - Define en
**rule_application** únicamente los productos (o categorías) objetivo.
Ejemplo conceptual:
{
"rule_conditions": { "conditions": { "and": [] } },
"rule_application": {
"conditions": {
"and": [
{
"array_field": "lines",
"field": "product_id",
"key": "cart_item_product",
"operator": "in",
"values": [10045, 10046]
}
]
}
},
"rule_effects": "{ ... percentage, distribution: individual_items ... }"
}
Interpretación: «La campaña no exige nada especial para “ganar”; si está activa y el customer califica por audiencia/stackability, el % (o valor) solo baja en las líneas con product_id 10045 o 10046.»
En
GET /discountsyGET /discounts/{id},rule_conditionsyrule_applicationvienen como string JSON; parsear ambos por separado.
Dos familias de aplicación
| Familia | Cómo se identifica | Qué acota |
|---|---|---|
| Líneas del carrito | array_field: lines | Productos, categorías, atributos de línea |
| Coste adicional | field: additional_costs.nombre`` | Un cargo concreto del objeto additional_costs del carrito (ej. envío) |
No uses en aplicación condiciones de cliente (customer.*), país, total de carrito, pagos, etc. — eso va en rule_conditions.
Subcondiciones anidadas en líneas: solo quantity
Dentro de conditions[] en cláusulas de aplicación sobre líneas, solo existe quantity. No se puede elegir **total** de línea (a diferencia de rule_conditions, donde sí puede aparecer total).
field en subcondición | En rule_conditions | En rule_application |
|---|---|---|
quantity | ✓ | ✓ |
total | ✓ | No disponible |
Ejemplo válido en aplicación:
"conditions": [{ "field": "quantity", "value": 1, "operator": "gte" }]
Gramática compartida con condiciones de líneas
| Concepto | En rule_conditions | En rule_application |
|---|---|---|
| Producto por catálogo | Puede exigir qty y/o total línea | Define sobre qué productos se aplica; subcondición típica: solo quantity |
Producto manual (cart_product_id) | Igual | Igual |
Categoría (product_categories) | Puede exigir qty/total | Define categorías objetivo; subcondición: solo quantity |
| Atributos de línea | Condición de victoria | Acota aplicación (sin subcondición de qty si no hace falta) |
Reglas de lectura (igual que en condiciones):
**field**define el dato;**key**es informativo.cart_item_product= catálogo;cart_product_id= manual.- Categorías:
values= feature_pk (taxonomy_slug|external_id). bundle/grouped: flags internos — ignorar valor del flag.
Bundle / 2x1: quantity en aplicación
Si rule_effects.rule_group es **true**, la subcondición **quantity** en **rule_application** define cuántas unidades de cada grupo reciben el efecto (p. ej. gte 1 = una unidad con descuento por cada grupo armado en condiciones de victoria). Ver Mecánica bundle.
Aplicación sobre additional_costs
Puedes indicar que el efecto aplica sobre un coste adicional concreto del carrito (no sobre una línea de producto).
| Campo | Descripción |
|---|---|
field | Ruta al coste: additional_costs.clave`` (ej. additional_costs.delivery si en el carrito existe "delivery": 2.99 dentro de additional_costs) |
operator / value | Comparación sobre el importe de ese coste (ej. gt + 0 → que exista y sea > 0) |
key | Suele ser total_cart_without_additional_costs (informativo); manda **field** |
additional_cost_id | ID interno del tipo de coste adicional (auxiliar; ej. 34 = envío en la Company) |
Ejemplo — efecto sobre el coste de envío:
{
"conditions": {
"and": [
{
"key": "total_cart_without_additional_costs",
"field": "additional_costs.delivery",
"value": 0,
"operator": "gt",
"additional_cost_id": 34
}
]
}
}
Interpretación: el descuento/efecto se aplica sobre el componente delivery del bloque additional_costs del carrito (cuando su valor es > 0), no sobre líneas de producto.
JSON maestro de referencia — aplicación en líneas
Ejemplo real con categorías, productos (catálogo y manual) y atributos de línea:
{
"conditions": {
"and": [
{
"key": "cart_item_product_category",
"field": "product_categories",
"bundle": 1,
"values": ["gaston_interno|106", "frutas|17852"],
"grouped": true,
"operator": "in",
"conditions": [{ "field": "quantity", "value": 1, "operator": "gte" }],
"array_field": "lines",
"feature_ids": [17885, 17852]
},
{
"key": "cart_item_product",
"field": "product_code",
"bundle": 1,
"values": ["12000041", "camisetaGlobo", "croata_01", "croata_02", "undefined"],
"grouped": true,
"operator": "in",
"conditions": [{ "field": "quantity", "value": 1, "operator": "gte" }],
"array_field": "lines",
"product_ids": ["1", "2", "4", "5", "6"]
},
{
"key": "cart_product_id",
"field": "product_code",
"bundle": 1,
"values": ["22333", "98999", "977788"],
"grouped": true,
"operator": "in",
"conditions": [{ "field": "quantity", "value": 1, "operator": "gte" }],
"array_field": "lines"
},
{
"key": "cart_item_attributes",
"field": "attributes.color",
"value": "azul",
"operator": "eq",
"array_field": "lines"
},
{
"key": "cart_item_attributes",
"field": "attributes.product_condition",
"value": "refurbished",
"operator": "neq",
"array_field": "lines"
}
]
}
}
Lectura rápida del JSON maestro (aplicación)
| # | field / contexto | Interpretación |
|---|---|---|
| 1 | lines → product_categories | Descuento en líneas de categorías `gaston_interno |
| 2 | lines → product_code, catálogo | Códigos del catálogo listados; qty≥1 |
| 3 | lines → product_code, manual | Códigos ingresados a mano (cart_product_id); qty≥1 |
| 4 | lines → attributes.color | Solo líneas con color = azul |
| 5 | lines → attributes.product_condition | Excluye líneas refurbished (neq) |
Condiciones de victoria + aplicación distinta (caso frecuente)
La campaña gana con una lógica y el descuento cae en un subconjunto de líneas:
| Bloque | Ejemplo de negocio |
|---|---|
rule_conditions | Carrito ≥ 50 € y al menos 2 unidades de Coca-Cola |
rule_application | El % solo en líneas de categoría Snacks |
Integración: el carrito puede cumplir condiciones por Coca-Cola pero el descuento en la respuesta solo aparece en líneas Snacks que cumplan rule_application.
Obligatoriedad (porcentaje / ratio)
Para efectos **percentage** y **ratio** en carrito, la aplicación suele ser obligatoria en Owner App (véase Detalles operativos §5). Si falta y el efecto es % por línea, revisar configuración incompleta.
Errores frecuentes — rule_application
| Confusión | Cómo resolverlo |
|---|---|
| Condición vs aplicación | rule_conditions = ¿aplica la campaña? · rule_application = ¿en qué líneas va el descuento? |
| Copiar condiciones de cliente en aplicación | Cliente/carrito van en rule_conditions; aplicación = líneas y/o additional_costs |
Buscar total en subcondición de aplicación | En aplicación solo existe **quantity** en conditions[]; total de línea no aplica |
rule_conditions vacío mal interpretado | Vacío = sin filtros de victoria, no “campana desactivada” |
| Descuento no en producto esperado | Revisar field + values en aplicación, no solo condiciones de victoria |
Confundir líneas con additional_costs | array_field: lines = productos; field: additional_costs.X = cargo extra (envío, etc.) |
| Mismo producto en condiciones y aplicación | Válido: condiciones exigen comprarlo; aplicación limita dónde se descuenta (puede ser la misma lista u otra) |
Siguiente: Efectos (rule_effects)