Saltar al contenido principal

Guía: Lectura desde GET · ← Condiciones · Efectos →

rule_application — referencia completa

:::info Campo en la respuesta GET En GET /points y GET /points/{id}, este bloque viene en rule_application (string JSON). Tras parsear, la raíz interna es application.and[] (no conditions). :::

Índice​


Aplicación por when​

whenrule_application en Owner App / GET
Carrito (after_create_activity)Líneas (array_field: lines: producto, categoría, atributos), additional_costs.*, y métodos de pago (array_field: payments) — ver Aplicación sobre pagos. Misma familia que descuentos en líneas, con pagos además en aplicación (en descuentos el pago suele ir solo en condiciones).
Evento personalizadoUn solo atributo numérico de la entidad custom sobre el que se calcula el efecto — ver Aplicación en evento personalizado.
Trigger / manualSin sección de aplicación: el efecto va a total sobre el contexto del evento o la asignación directa.

Para efectos percentage y ratio en carrito, la aplicación suele ser obligatoria en Owner App.

Aplicación en evento personalizado​

En campañas con when: "after_create_custom_entity", Owner App no usa catálogo de producto ni líneas de carrito. En rule_application eliges un único campo de la entidad custom sobre el que se aplica el efecto (percentage, ratio o direct_value con distribution: "total").

Regla del field: en cláusulas key: "custom_event", el field siempre es data. + nombre del atributo en la definición del evento (p. ej. atributo amount → "field": "data.amount"). No uses el nombre del atributo sin el prefijo data..

ReglaDetalle
Tipo de campoSolo atributos numéricos (p. ej. amount, quantity).
fieldSiempre data.<nombre_atributo> (ej. data.amount).
entity_attribute_keySlug del atributo sin prefijo data. (ej. "amount").
Operador habitual en aplicaciónexists — indica qué campo numérico alimenta el cálculo (no filtra umbrales; eso va en rule_conditions).

Ejemplo: la aplicación usa el campo amount del evento. El efecto es ratio con unit: 1 y value: 0.01 (importe monetario en BD; con score_exchange 0,01 → 1 unidad de amount = 10 puntos mostrados al customer). Ver valor monetario de value.

rule_application (string en GET):

{
"conditions": {
"and": [
{
"key": "custom_event",
"field": "data.amount",
"operator": "exists",
"entity_attribute_key": "amount"
}
]
}
}

rule_effects asociado:

{
"key": "ratio",
"type": "ratio",
"unit": 1,
"value": 0.01,
"limits": 0,
"formula": null,
"distribution": "total",
"strikethrough_data": null
}

En eventos personalizados, el JSON de rule_application puede venir con raíz conditions.and[] (no application.and[] como en carrito). Parsea el string y localiza la cláusula custom_event.

Las condiciones de victoria sobre otros campos del evento (umbrales, texto, etc.) van en rule_conditions, no en aplicación.

Qué hace (y qué no hace)​

BloquePregunta 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 otorgamiento si la campaña aplica? (líneas del ticket 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 ticket.

Vacío vs definido​

Estado de rule_applicationComportamiento
Vacío / ausente / nullEl otorgamiento puede aplicar sobre todas las líneas del ticket (según rule_effects.distribution)
Con filtrosEl otorgamiento solo aplica donde indique la regla (líneas, additional_costs y/o pagos)

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.):

  1. Deja **rule_conditions vacío** (sin requisitos de elegibilidad).
  2. 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 /points y GET /points/{id}, rule_conditions y rule_application vienen como string JSON; parsear ambos por separado.

Dos familias de aplicación​

FamiliaCómo se identificaQué acota
Líneas del ticketarray_field: linesProductos, categorías, atributos de línea
Coste adicionalfield: additional_costs.nombre``Un cargo concreto del objeto additional_costs del ticket (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ónEn rule_conditionsEn 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​

ConceptoEn rule_conditionsEn rule_application
Producto por catálogoPuede exigir qty y/o total líneaDefine sobre qué productos se aplica; subcondición típica: solo quantity
Producto manual (cart_product_id)IgualIgual
Categoría (product_categories)Puede exigir qty/totalDefine categorías objetivo; subcondición: solo quantity
Atributos de líneaCondición de victoriaAcota 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 ticket (no sobre una línea de producto).

CampoDescripción
fieldRuta al coste: additional_costs.clave`` (ej. additional_costs.delivery si en el ticket existe "delivery": 2.99 dentro de additional_costs)
operator / valueComparación sobre el importe de ese coste (ej. gt + 0 → que exista y sea > 0)
keySuele ser total_cart_without_additional_costs (informativo); manda **field**
additional_cost_idID 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 otorgamiento/efecto se aplica sobre el componente delivery del bloque additional_costs del ticket (cuando su valor es > 0), no sobre líneas de producto.

Aplicación sobre métodos de pago (solo carrito)​

En campañas de puntos con evento carrito, puedes acotar el otorgamiento a líneas pagadas con un método de pago concreto usando array_field: payments en rule_application (además de filtrar el pago en rule_conditions si la victoria depende del método).

CampoDescripción
array_fieldpayments
fieldtype (nombre del método en el ticket)
valuesLista de métodos (ej. "Tarjeta OH!", "Agora Pay Web")
operatorin, not_in, etc.
payment_method_idsIDs internos (auxiliar; el criterio de negocio es field + values)

Ejemplo — otorgar solo si el ticket se pagó con métodos concretos:

{
"application": {
"and": [
{
"key": "payment",
"field": "type",
"values": ["Tarjeta OH!", "Agora Pay Web"],
"operator": "in",
"array_field": "payments",
"payment_method_ids": [95, 92]
}
]
}
}

Interpretación: el efecto de puntos/wallet en líneas calificadas solo se calcula cuando el ticket incluye un pago cuyo type está en la lista (p. ej. campaña «extra puntos pagando con tarjeta co-brand»).

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 / contextoInterpretación
1lines → product_categoriesDescuento en líneas de categorías `gaston_interno
2lines → product_code, catálogoCódigos del catálogo listados; qty≥1
3lines → product_code, manualCódigos ingresados a mano (cart_product_id); qty≥1
4lines → attributes.colorSolo líneas con color = azul
5lines → attributes.product_conditionExcluye líneas refurbished (neq)

Condiciones de victoria + aplicación distinta (caso frecuente)​

La campaña gana con una lógica y el otorgamiento cae en un subconjunto de líneas:

BloqueEjemplo de negocio
rule_conditionsCarrito ≥ 50 € y al menos 2 unidades de Coca-Cola
rule_applicationEl % solo en líneas de categoría Snacks

Integración: el ticket puede cumplir condiciones por Coca-Cola pero el otorgamiento 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ónCómo resolverlo
Condición vs aplicaciónrule_conditions = ¿aplica la campaña? · rule_application = ¿en qué líneas va el otorgamiento?
Copiar condiciones de cliente en aplicaciónCliente/carrito van en rule_conditions; aplicación = líneas y/o additional_costs
Buscar total en subcondición de aplicaciónEn aplicación solo existe **quantity** en conditions[]; total de línea no aplica
rule_conditions vacío mal interpretadoVacío = sin filtros de victoria, no “campana desactivada”
Descuento no en producto esperadoRevisar field + values en aplicación, no solo condiciones de victoria
Confundir líneas con additional_costsarray_field: lines = productos; field: additional_costs.X = cargo extra (envío, etc.)
Mismo producto en condiciones y aplicaciónVálido: condiciones exigen comprarlo; aplicación limita dónde se otorga (puede ser la misma lista u otra)


Siguiente: Efectos (rule_effects)