Versões comparadas

Chave

  • Esta linha foi adicionada.
  • Esta linha foi removida.
  • A formatação mudou.


Image Added

PROMO 7.

...

8 - Manual de Integración - Motor




Painel
borderColor#E4E3E3
titleColor#ffffff
borderWidth1
titleBGColor#704581
titleCONTENIDO


Expandir
titleExpandir contenido
Índice
maxLevel3


...

Propiedad

Tipo de dato

Descripción

Requerido

Valor ante ausencia

companyId

Alfanumérico

Identifica la compañía que envía el mensaje

SI


store

Alfanumérico

Identifica el local que envía el mensaje.


channelAlfanuméricoIdentifica el canal donde asociado a la transacción.No""

terminal

Numérico

Identifica la terminal emisora


date-time

YYYY-MM-DD HH:MM:SS

Fecha y hora del mensaje. (date-time="2017-03-21 15:20:26")


messageId

Numérico positivo

Identifica cada uno de los mensajes enviados por la terminal, siendo este número utilizado por el Motor de Promociones como identificador cuando envíe una respuesta.


void-trx

Booleano

Indica si la transacción es una devolución.

No

"false"

response

Booleano

Indica si se desea que el Motor dé una respuesta ante el mensaje enviado. (deprecado a partir de 6.5)

No

"false"

init-tck

Booleano

Indica si con este mensaje se debe iniciar una nueva sesión.

No

"false"

evaluate

Booleano

Le indica al motor que calcule las promociones utilizando los elementos ingresado hasta ese momento.

No

"false"

status

Alfanumérico

Indica en que estado se encuentra el punto de venta

  • sales
  • total
  • payment
    Existen valores específicos de esta propiedad que serán presentados en la sección de Fidelidad

No

""

msg-version

Alfanumérico

Indica la versión del mensaje en cuestión

No

""

map-version

Entero positivo

Indica al motor que mapa utilizar. Tendrá sentido sólo si el valor de "void-trx" es verdadero.

No

""

suggest

Booleano

Le indica al motor si debe sugerir promociones o no. Si suggest-seq y suggest-seq-type no están presentes se tomará todo el contexto para realizar la sugerencia.

No

"false"

suggest-seq

Numérico

Indica el número de secuencia sobre el que el motor realizará la sugerencia en caso de que el atributo suggest="true". Este atributo será acompañado por el suggest-seq-type, que de no ser especificado, se asumirá suggest-seq-type="item"

No

"1" o null

suggest-seq-type

Alfabético

Indica el tipo de línea sobre la que deberá hacerse la sugerencia en caso de que el atributo suggest="true". Este atributo será acompañado por el suggest-seq, que de no estar especificado, se asumirá sugget-seq="1". Los valores que puede tomar este atributo son: item, coupon, payment, event, customer.

No

"item" o null

suggest-per-type

Booleano

Le indica al motor si deben sugerir promociones teniendo en cuenta el tipo de los conjuntos participantes de la promoción o no. Si suggest-filter-type no está presente se sugerirán todas las promociones que estén disponibles para sugerencia teniendo en cuenta el atributo suggest del mapa y las promociones. Si está presente y en verdadero, los atributos suggest, suggest-seq y suggest-seq-type serán ignorados.

No

"false"

suggest-filter-type

Alfabético

Indica el tipo de conjunto participante de la promoción que deberá tenerse en cuenta para la sugerencia en caso de que el atributo suggest-per-type="true". Los valores que puede tomar este atributo son: item, coupon, payment, event, customer. Si no estuviera presente, se asume todos los tipos de conjuntos.

No

"null"

suggest-extended

Booleano

Le indica al motor si debe mostrar la información de los beneficios de cada promoción sugerida. Si suggest es false, el valor de este campo no tiene relevancia.

No

"false"

offline

Booleano

Le indica al motor que la transacción será tratada en modo offline, es decir ante una contingencia de comunicación con PROMO Central se almacenará para su posterior envío (ver nota debajo "Comportamiento de Promo en modo offline").

No

"false"

originalTransaction

Alfabético

Para el caso de un valor de status = requestTransaction, esta propiedad indicará la transacción que se requiere consultar

No

""

chosenOptionEntero positivoEn el caso de que el resultado de la evaluación haya resultado en una serie de opciones (varios bloques "optional") este atributo permite que el sistema externo informe al motor de Promo, cual de esas opciones fue la que finalmente se han aplicado u otorgado al cliente.  El valor es basado en 0, es decir la primer opción es la número 0, la siguiente la número 1 y así sucesivamente.No0
storeChainAlfabéticoIdentificador de la "Cadena" a la que pertenece la tienda (Store) de la transacción.  Puede ser utilizada en la condición de una promoción.No""
formatAlfabéticoIdentificador del Formato al cual pertenece la tienda (Store) de la transacción.  Puede ser utilizada en la condición de una promoción.No""
zoneAlfabéticoIdentificador de la Zona a la cual pertenece la tienda (Store) de la transacción.  Puede ser utilizada en la condición de una promoción.No""
subZoneAlfabéticoIdentificador de la SubZona a la cual pertenece la tienda (Store) de la transacción.  Puede ser utilizada en la condición de una promoción.No""
tenderGroupCodeAlfabéticoCuando se utilice preciadores, si se envía el valor "cr" retornara el precio a crédito, en caso de otro valor o de no enviarlo retornara el precio de venta.No""
currencyCodeAlfabéticoCódigo de la moneda en la cual se está realizando la transacción. Puede ser utilizada en la condición de una promoción, por ejemplo para condicionar la entrega de puntos a esa moneda.No""
limitBalancesBooleanoCuando se envíe en 'true' se devolverá en la respuesta del motor al POS los saldos de limites de Tienda y General (retail) que tengan definido las promociones que hayan participado de la transacción en curso. Valor por defecto "false" (A partir de Promo 7.0.2)No"false"
extendedResponseBooleanoPermite consultar al motor de Promo las respuestas extendidas para un cliente determinado.

extendedResponseFilterAlfabético(A partir de Promo 7.4) funciona en conjunto con el atributo extendedResponse. Con estos atributos se podrá consultar al motor de Promo las respuestas extendidas para un cliente determinado.

...

Elemento

Propiedad

Tipo de dato

Descripción

Requerido

Valor ante ausencia

Ítem

unitprice

Numérico positivo

Precio unitario del artículo en cuestión.

Si



xprice

Numérico positivo

Precio extendido del artículo en cuestión. Es igual a la cantidad por el precio unitario.

Si



qty

Entero positivo

Cantidad de artículos en la línea.

Si

1


magnitude

Numérico positivo

Si el artículo es mensurable por otra unidad que no sea la cantidad, deberá ser expresada en esta propiedad.

No

0


code

Alfanumérico

Código propio del artículo.

No

"-"


ProductcodeAlfanumérico

Código del Producto.

Soporta múltiples valores.

No

BarcodeAlfanumérico

Código de Barras del Producto.

Soporta múltiples valores.

No


brand

Alfanumérico

Marca del artículo.

No

"-"


supplier

Alfanumérico

Proveedor al que pertenece el artículo.

No

"-"


discountable

Alfanumérico

Si el artículo es puede recibir descuentos o no.

No

"-"


level1

Alfanumérico

Nivel 1 de categorización del artículo. Anteriormente este nivel se conocía con el nombre de Departamento.

Soporta múltiples valores.

No

"-"


level2

Alfanumérico

Nivel 2 de categorización del artículo. Anteriormente este nivel se conocía como la Familia del artículo.

Soporta múltiples valores.

No

"-"


level3

Alfanumérico

Nivel 3 de categorización del artículo. Anteriormente este nivel se conocía como la Categoría del artículo.

Soporta múltiples valores.

No

"-"


level4

Alfanumérico

Nivel 4 de categorización del artículo. Anteriormente este nivel se conocía como la subcategoría del artículo.

Soporta múltiples valores.

No

"-"


discontinuousbooleanoDetermina si el producto es un producto discontinuoNofalse

lowTurnoverbooleanoDetermina si el producto es un producto de baja rotaciónNofalse

keyProductbooleanoDetermina si el producto es un producto estrellaNofalse

applyCatalogRedeembooleanoDetermina si el producto participa en el Canje de Puntos por CatálogoNofalse

taxesNumérico positivoValor de los impuestos discriminados respecto al precio unitario. (Ver atributo valueWithTaxes)No0

qty2

Entero positivo

(Versión > 7.EP2.1) Cantidad del producto a superar para otorgar el precio 2 (price2).  Solo para Promociones de Nuevo Precio que indican usar monto externo.No0

price2

Numérico positivo

(Versión > 7.EP2.1) Precio una vez superada la cantidad 2 (qty2). Solo para Promociones de Nuevo Precio que indican usar monto externo.No0

qty3

Entero positivo

(Versión > 7.EP2.1) Cantidad del producto a superar para otorgar el precio 3 (price3). Solo para Promociones de Nuevo Precio que indican usar monto externo.No0

price3

Numérico positivo

(Versión > 7.EP2.1) Precio una vez superada la cantidad 3 (qty3). Solo para Promociones de Nuevo Precio que indican usar monto externo.No0

redeemOptionAlfanumérico(Versión > 7.EP2.1) Beneficio "Canje con opciones" - informara las opciones entre las que puede elegir el cliente para acceder a un determinado beneficio canjeando una determinada cantidad de puntos (del cliente y/o elemento de fidelidad) Mas detalle en Apéndice I - Canje con opcionesNo

Coupon

amount

Numérico positivo

Se utiliza para indicar el valor monetario del cupón. Si no tiene no se utiliza.

No

0


type

Alfanumérico

Tipo de cupón (Aclaración: el tipo de cupón externo son cupones no administrados por PROMO. Este tipo de cupón es emitido y/o redimido por un sistema externo a PROMO).

No

"-"


qty

Entero positivo

Cantidad

No

1


id

Alfanumérico

Identificador del cupón.

No

"-"

LoyaltyCard

type

Alfanumérico

Tipo de elemento de fidelidad loyalty

No

"-"


id

Alfanumérico

Identificador del elemento de fidelidad loyalty

Si

"-"


amount

Numérico positivo

Saldo del elemento de fidelidad loyalty

No

0


chargeAmount

Numérico positivo

Saldo a acreditar a un elemento de fidelidad loyalty

No

0


consumeAmount

Numérico positivo

Saldo a debitar a un elemento de fidelidad loyalty

No

0


status

Alfanumérico

ENABLED o DISABLED para habilitar o deshabilitar un elemento de fidelidad  (solo valido en status LoyatyActivation)

ENABLED para habilitar un elemento de fidelidad (solo valido en status FINISH)

No

"ENABLED"


nextExpDate

NuméricoFecha de la próxima expiración de puntos en format YYYYmmdd.  Solo es informado en elementos de fidelidad que posean vencimiento de carga definido.No"-"

nextExpValue

NuméricoCantidad de puntos que vencerán en el próximo vencimiento (nextExpDate) y se informa solo si el elemento de fidelidad posee vencimiento de carga definido.No"-"

reason

Alfanumérico

Código del motivo por el cual se está realizando el chargeAmount o consumeAmount pertinente.  Este código corresponde a los valores de motivos definidos en la consola de PromoNo"-"

cvv

Alfanumérico

Corresponde al código de seguridad o cvv asociado al elemento de fidelidad.No"-"

validFromAlfanuméricoFecha de inicio de vigencia . Formato "YYYY-MM-DD" (Año-Mes-Dia) .Ejemplo"2021-07-16"No"-"

validToAlfanuméricoFecha de fin de vigencia . Formato "YYYY-MM-DD" (Año-Mes-Dia) .Ejemplo"2021-07-16"No"-"

Customer

type

Alfanumérico

Tipo de cliente.

No

"-"


id

Alfanumérico

Identifica al cliente a través del Código.

No

"-"


remainingAmount

Numérico positivo

Propiedad que se puede utilizar para indicar el saldo a favor o en contra del cliente en cuestión. (compatibilidad con PROMO 4 y versiones anteriores)

No

0


points

Entero positivo

Saldo que posee el cliente. (compatibilidad con PROMO 4 y versiones anteriores)

No

0


email

Alfanumérico

Atributo incluido para la consulta de clientes

No

""


name

Alfanumérico

Atributo incluido para la consulta de clientes

No

""


lastName

Alfanumérico

Atributo incluido para la consulta de clientes

No

""


Identifier

Numérico positivo

Atributo incluido para la consulta de clientes

No

""


cardNumber

Numérico positivo

Atributo incluido para la consulta de clientes

No

""


creditCampaignCode

Alfanumérico

Código de la Campaña crediticia

No

""


profileCode

Alfanumérico

Código del perfil del cliente

No

""


limitedBenefits

Alfanumérico

Consiste en un listado de Limites asociados a Convenios.  El mismo es del tipo: limitedBenefits:"limite1:valor1;limite2:valor2;limite3:valor3.....".  Estos valores pueden ser informados desde el Punto de Venta o bien son obtenidos mediante una respuesta a LoyaltyValidation y reinyectados por parte del Puntos de venta como han sido recibidos.

No

""

segmentAlfanuméricoLista de Códigos de Segmento a los cuales pertenece el cliente, separados por ;. Se listarán los segmentos que tenga el cliente (internos o externos). Si posee segmentos internos y externos, solo taerá los externos porque los toma como prioritarios.No""

amountNumérico positivoPropiedad que se puede utilizar para indicar el saldo correspondiente a un clienteNo0

raffleData

Alfanumérico

Datos para imprimir en cupones informativos, orientado principalmente a sorteos.  Ver Manual de Usuario para información sobre cupones Informativos.No"-"

"Payment Los atributos amount e itemamount son excluyentes y su uso depende de la versión de la promoción codificada que se
configure en el motor para manejar los pagos parciales.

type

Alfanumérico

Tipo de medio de pago.

No

"-"


id

Alfanumérico

Identificador del pago.

No

"-"


plan

Alfanumérico

Plan del medio de pago.

No

"-"


amount

Numérico positivo

Dinero que se utiliza con ese medio de pago. Dado que el monto del pago (PA) se calcula como PA = PIA  (1 - %desc) o PA = PIA * (1+%recargo)*
se obtiene que el monto de los ítems que se desea pagar (PIA) se calcula como PIA = PA / (1 - %desc) o PIA = PA / (1+%recargo)

No

0


bank

Alfanumérico

Banco relacionado con el medio de pago.

No

"-"


itemamount

Numérico positivo

Dinero que representa el monto de ítems que se desea pagar.

No

0


balance

Booleano

Indica si con este medio de pago se cancela el saldo de la transacción. Sí el valor es true, entonces no es necesario enviar el amount o itemaount.

No

false


pointsTypeAlfanuméricoIdentifica el tipo de pago con puntos (ver manual de usuario Final Promo 7 - "Ignorar pago con Puntos" - Ver también beneficio PromotionPaidInPoints)No""

installmentsNumérico positivo

Indica la cantidad de cuotas asociadas al pago

No""

prefixAlfanuméricoIndica el Prefijo asociado al pagoNo""

pocketAlfanuméricoIndica el Bolsillo asociado al pago No""

prefixGroupAlfanuméricoIndica el grupo de Prefijos asociado al pagoNo""

payCreditCampaignAlfanuméricoIndica la Campaña Crediticia asociada al pagoNo""

Event

type

Alfanumérico

Tipo de evento.

No

"-"


id

Alfanumérico

Identificador del evento.

No

"-"


value

Alfanumérico

Valor que representa el evento.

No

"-"

BenefitidAlfanumérico

Identificador del beneficio externo.

SiNo

typeAlfanumérico

Tipo de beneficio externo.

SiNo

amountNumérico positivo

Se utiliza para indicar el monto a descontar o el porcentaje de descuento (de acuerdo al benefitType).

Si

benefitTypeAlfanumérico

Indica el tipo de beneficio a generar.

  • desc: aplica el descuento sobre los ítem. Valor por defecto.
  • porc: porcentaje de descuento
No"desc"

seqItemAlfanumérico

Número de secuencia de los ítems a los cuales hay que aplicar el descuento. Si no viene el atributo o viene vacío se asume que es para todo el ticket. En caso de tener varios secuencias, las mismas deben venir separados por coma. Si algún alguna secuencia tiene mas de una cantidad, se debe concatenar con un =. Ejemplo: 1=2,2,3=3 (indica que el descuento se aplica a dos elementos de la secuencia uno, uno de la secuencia dos y tres la secuencia 3

No

...

Informações
titleImportante

Existen otros campos que no están en ese mensaje y podrían aparecer y eso dependerá de cómo esté armada la promoción. Por ejemplo:

item-seg

coupon-seq

payment-seq

event-seq

loyaltycard-seq

Otro campo nuevo (desde Promo 7.4) que no está en ese mensaje y podría aparecer es:

coupon-cond

...

También podrían aparece (desde Promo 7.

...

8) los siguientes campos:

hyperDailyTrxMax: cantidad diaria máxima permitida configurada en PROMO, este valor se tomará de la configuración del parámetro, deberá mostrar los valores acá seteados.

hyperDailyTrxStatus: cantidad de transacciones asociadas a un Id cliente que hayan aplicado un beneficio hiperpersonalizado.

hyperDailyTrxMaxReached: TRUE/FALSE cuando los parámetros dailyLimitOfCustomerIdForAlert => numberOfTransactionPerCustomerID entonces se mostrará TRUE en caso contrario, se muestra FALSE.


Aviso
titleUPDATE V7.8

    En el bloque de cupones dentro de loyaltyValidationEx, se han agregado nuevos atributos que detallan la información del cupón:
        name: Nombre del cupón.
        validFrom: Fecha de inicio de vigencia del cupón.
        validTo: Fecha de expiración del cupón. (Cuando el cupón no tiene fecha de vencimiento (configurado en el sistema como "Sin vencimiento"), validTo mostrará una fecha que corresponde a 100 años en el futuro.)


Ejemplo de respuesta de un cupón:

<coupon ack="0" amount="0.00" barcode="101pse0018666" couponId="cupi" name="El Cupi" validFrom="20230908" validTo="20331008"/>
<coupon ack="0" amount="0.00" barcode="104T100040000000002147483647" couponId="cupinovence" name="el cupi que no vence" validFrom="20240605" validTo="21240512"/>




Respuesta del mensaje loyaltyValidationEx

A partir de la versión 7.8 de Promo, se implementó una nueva funcionalidad en el mensaje loyaltyValidationEx. Ahora, el sistema incluye en el campo itemCondValue los códigos y nombres de los productos disponibles, permitiendo una mejor identificación de los ítems sugeridos. Esta mejora está diseñada para facilitar la visualización y selección de productos por parte del usuario.

El sistema mostrará dentro del campo itemCondValue (en la etiqueta de sugerencias) el código y nombre del producto, siguiendo el formato establecido.


Ejemplo de salida:

itemCondValue="super95:Nafta Super 95,pr98:Nafta Premium 98,a1040:Aceite 10w40,a1540:Aceite 15w40"


Formato:

itemCondValue="Código1:Nombre1,Código2:Nombre2,Código3:Nombre3"


Nota
titlePrecondición

 El catálogo de ítems debe estar cargado previamente. En caso contrario, el sistema devolverá únicamente el formato código:código.




A partir de la versión de Promo 7.4, se devuelven mas campos por cada una de las promociones sugeridas. A continuación el detalle:

PropiedadDescripción
benefitAttribute(campo nuevo desde Promo 7.4) Muestra xprice porque está basado en Precio Total (Aplicación Máxima (medida))
benefitMaxUnit(campo nuevo desde Promo 7.4) define la unidad máxima aplicable para un beneficio de promoción, como cantidad (qty) o precio (xprice), determinando el límite sobre el cual se aplicará dicho beneficio.
benefitMaxValue(campo nuevo desde Promo 7.4) Aplicación Máxima (valor), es el máximo de xprice. Nota: por default este campo si no se lo utiliza viene en -1.
benefitNumber(campo nuevo desde Promo 7.4) Es el "id del beneficio" en la sección "Beneficios a Otorgar"
benefitType(campo nuevo desde Promo 7.4) Es la "Clase de beneficio" en la sección "Beneficios a Otorgar"
benefitValue(campo nuevo desde Promo 7.4) Es el valor del beneficio a otorgar de acuerdo al tipo de beneficio seleccionado en la sección "Beneficios a Otorgar"
codeEs el código de la promoción
customer-cond(campo nuevo desde Promo 7.4) Son los segmentos presentes en la condición de esta promoción, si es que se a condicionado por segmento.
customer-seqEs la secuencia con que fue ingresado el customer
descriptorEs el "Mensaje de la sugerencia"
idEs el nombre de la promoción
image
(campo nuevo desde Promo 7.4) 

Para las promociones que tengan sugerencia hyper e imagen cargada, en el mapa generado que contenga esa promoción en el tag 'promotion' aparecerá el atributo "image" el cual tiene la URL de la imagen.

La URL de imagen tiene como base, el valor configurado en "promocache.imagesURL", en Administración\Información de Configuración, y el servidor lo guarda en el path configurado en "promotion.images.path" .  

itemCondAttribute(campo nuevo desde Promo 7.4) El atributo de ítem de la condición que va a utilizarse en la evaluación (en este ejemplo es por código sku). Para que la hiperpersonalizada funcione tiene que estar armada la promoción por sku. Este campo corresponde a la condición de ítem para que se otorgue la promoción.
itemCondOperator(campo nuevo desde Promo 7.4) Es el operador que dispara la condición (que pueden ser into: IGUAL o distinct: DISTINTO). Este campo corresponde a la condición de ítem para que se otorgue la promoción.
itemCondValue(campo nuevo desde Promo 7.4) Cantidad de usos de la promoción. Este campo solo se enviará si en la promoción se

(campo nuevo desde Promo 7.4) El valor del atributo de ítem, ej en este caso: super95. Puede ser uno o varios separados por coma (El formato es: itemCondValue="Codigo1:Nombre1,Codigo2:Nombre2,Codigo3:Nombre3"). Este campo corresponde a la condición de ítem para que se otorgue la promoción.

Nota
limitCurrentValue
titleRequisitos del Catálogo de Ítems

Para que el sistema PROMO pueda proporcionar el nombre completo de los productos en la mensajería, el catálogo de ítems debe estar previamente cargado en el sistema. Si el catálogo no está cargado, el sistema solo devolverá el código del producto. Esto es esencial para que las promociones personalizadas puedan mostrarse adecuadamente en el POS, ya que permite a los usuarios identificar fácilmente los productos elegibles en las promociones.

En caso de que el catálogo no esté cargado nextSegmento esta incompleto, la respuesta de la mensajería mostrará únicamente el código del producto en el campo itemCondValue, sin el nombre.


limitCurrentValue(campo nuevo desde Promo 7.4) Cantidad de usos de la promoción. Este campo solo se enviará si en la promoción se configuraron los límites de aplicación.
limitMaxValue(campo nuevo desde Promo 7.4) Valor del límite definido (Valor Máximo que el cliente puede cargar). Este campo solo se enviará si en la promoción se configuraron los límites de aplicación.
limitType

(campo nuevo desde Promo 7.4) Que tipo de límite es. Este campo solo se enviará si en la promoción se configuraron los límites de aplicación.

  • Se agregó un Límite por “Monto Total” viene como: limitType="benefiedProductTotal"
  • Se agregó la cantidad máxima de veces que se puede aplicar el beneficio dentro del límite de "Monto Total", se presentara como limitType="benefitApplicationCount" 
nro(campo nuevo desde Promo 7.4) Es el número (o id) de la promoción
priceChange(campo nuevo desde Promo 7.4) Es booleano. Aceptará "true" o "false" y se utilizará para indicar al POS si esa promoción es para realizar un cambio de precio. Vendrá por default en "false". Cuando en el beneficio de la promoción se haya activado el atributo "Cambio de precio" en la creación o edición de un beneficio de tipo "Monetario"
suggest(campo nuevo desde Promo 7.4) Este campo se utilizará para indicar si la promoción es "Hiperpersonalizada" traerá el valor "hyper", para el resto de las promociones traerá el valor "simple".
item-seqNo siempre se mostrará, dependerá de cómo esté armada la promoción. Muestra las secuencias de tipo ítem que hacen posible que la promoción sea sugerida. Si no hubiera secuencias de este tipo para la promoción, entonces este atributo no se incluye en la etiqueta
coupon-seqNo siempre se mostrará, dependerá de cómo esté armada la promoción. Muestra las secuencias de tipo cupón que hacen posible que la promoción sea sugerida. Si no hubiera secuencias de este tipo para la promoción, entonces este atributo no se incluye en la etiqueta.
payment-seqNo siempre se mostrará, dependerá de cómo esté armada la promoción. Muestra las secuencias de tipo medio de pago que hacen posible que la promoción sea sugerida. Si no hubiera secuencias de este tipo para la promoción, entonces este atributo no se incluye en la etiqueta.
event-seqNo siempre se mostrará, dependerá de cómo esté armada la promoción. Muestra las secuencias de tipo evento que hacen posible que la promoción sea sugerida. Si no hubiera secuencias de este tipo para la promoción, entonces este atributo no se incluye en la etiqueta
loyaltycard-seqNo siempre se mostrará, dependerá de cómo esté armada la promoción. Muestra las secuencias de tipo elementos de fidelidad de fidelidad que hacen posible que la promoción sea sugerida. Si no hubiera secuencias de este tipo para la promoción, entonces este atributo no se incluye en la etiqueta.
coupon-cond(campo nuevo desde Promo 7.4) No siempre se mostrará, dependerá de cómo esté armada la promoción. Se mostrará si hay una condición por cupón

...

En el tab goalsPrograms se podrá ver la siguiente información sobre Programas de Objetivos:

PropiedadDescripción
segmentsegmento actual
nextSegment(a partir de Promo 7.4) es el próximo segmento
nextSegmentRemaining(a partir de Promo 7.4) es lo que falta para pasar al próximo segmento
lastPurchasees la fecha de la última compra
lastIncrementes la fecha del último incremento del Progrma de Objetivos
ides el código del Programa de Objetivos
valuees el saldo actual acumulado en el Programa de Objetivos

...

Aviso
titleUPDATE 7.4.3 - Registro de cliente Basico (pre-fidelizado)
  • Mensajes de fidelización: Los mensajes de loyaltyValidation ahora incluyen soporte para clientes registrados únicamente con el DNI. El motor enviará un mensaje con el código del cliente y el número de tarjeta de fidelidad, mientras que los demás campos se dejarán vacíos o con valores predeterminados.
  • Respuesta del motor: Al procesar una transacción que involucra un cliente registrado solo con su DNI, el motor devolverá el código del cliente, el número de tarjeta de fidelidad y el estado de la misma, permitiendo que el POS u otras interfaces puedan interactuar con estos clientes.


Nota
titlepromoplus.properties

promo.allowNonExistingCustomers = true


Este parámetro,  activa la funcionalidad que permite crear un nuevo cliente, con los datos minimos ya mencionados. Se incorpora en PROMO 7.4.3, con esta configuracion la posibilidad de registrar al cliente ingresando únicamente su DNI, sin requerir información adicional en ese momento. Ver: CONFIGURACIONES PARA EL ALTA DE CLIENTE DE REGISTRO BÁSICO (pre-fidelizado)


Expandir
titleEjemplos - Mensajería


Bloco de código
languagexml
themeEmacs
titleREQUEST
<message companyId="napse" store="napse" terminal="1" date-time="2024-08-27 14:58:17" init-tck="true" messageId="4356" void-trx="false" response="true" status="loyaltyvalidation" map-version="35" evaluate="true" >
<customer-add seq="1" id="99999802"  />
</message>


Bloco de código
languagexml
themeEmacs
titleRESPONSE
<?xml version="1.0" encoding="UTF-8"?><message ack="0" companyId="napse" engine="7.4.2-SNAPSHOT" mapversion="35" messageId="4356" store="napse" terminal="1" transaction="napse_napse_1_20240827145817">
<loyalty>
<loyaltycards/>
<coupons/>
<errors/>
<customers>
<customer birthday="false" code="99999802" email="-" identifier="-" incompleteData="false" lastName="-" limitedBenefits="" name="-" segment="" seq="1" type="-">
<loyaltycard ack="0" amount="0.00" amountChargeLimit="0.00" chargeLimit="5000.00" chargeLimitType="WEEKLY" contract="" id="1100001003" status="Activa" type="tarji" usePartial="true" validFrom="20240826" validTo="21240826"/>
</customer>
</customers>
<redeemTable/>
<goalsPrograms/>
</loyalty>




Dica
titleCrear Clientes (Alta de clientes pre-fidelizados)


Aviso

 Esta funcionalidad aplica solo si se ha habilitado el funcionamiento sin clientes pre-existentes.

Desde la versión Promo 7.4.3, se incorporó soporte para la creación automática de clientes durante el proceso de validación de fidelidad (loyaltyValidation) cuando el identificador (por ejemplo, DNI) del cliente no existe previamente en Promo. Esta modalidad fue extendida en versiones posteriores con los siguientes alcances:

  • Crear un cliente de forma automática únicamente a partir del DNI (identificador).

  • Clasificarlo como un cliente pre-fidelizado.

  • Asignar una tarjeta de fidelidad automática si la configuración lo permite.

  • Utilizar el identificador del cliente como número de tarjeta, respetando el prefijo y largo definidos por el tipo de tarjeta configurado.

  • Enviar automáticamente un evento de nuevo cliente a RabbitMQ para que sistemas externos (como Dynamics) puedan complementar la información o aplicar beneficios relacionados (por ejemplo, promociones por cargas acumuladas).

Configuraciones necesarias

Para habilitar esta funcionalidad, deben configurarse los siguientes parámetros:

1. En promoplus.properties:

Bloco de código
languagexml
themeEmacs
promo.allowNonExistingCustomers = true
lvCreateCustomersByID = true: habilita la creación con solo el identificador.
lvCustomerCardCreation = true: permite generar tarjeta automáticamente con el alta.
lvCustomerCardType = <código>: define el tipo de tarjeta a crear.
lvCustomerCardMethod = customerId: método de generación (por identificador del cliente).


Nota

El valor del ID del cliente no debe ser "‐", y el proceso no debe interferir con los validadores de cliente existentes.


Lógica de creación del cliente y tarjeta

  • Si el cliente no existe al momento del loyaltyValidation, y está habilitado el parámetro lvCreateCustomersByID, se crea un cliente pre-fidelizado solo con el DNI.

  • Si lvCustomerCardCreation = true, se genera automáticamente un elemento de fidelidad (tarjeta).

    • Si el método es customerId, se genera el número de tarjeta como:

Bloco de código
languagexml
themeEmacs
<prefijo configurado> + <DNI> (completando con ceros a la izquierda si es necesario)


  • Esta lógica replica la utilizada en el servicio de administración de clientes, asegurando consistencia en la numeración.

Ejemplo de mensaje XML con creación automática

Bloco de código
languagexml
themeEmacs
<message companyId="napse" store="1" terminal="1" date-time="2025-04-10T10:00:00" init-tck="true" messageId="123" void-trx="false" response="true" status="loyaltyValidation" evaluate="true">
    <customer-add seq="1" id="12345678"/>
</message>


Ejemplo de respuesta XML (cliente + tarjeta generada)

Bloco de código
languagexml
themeEmacs
<message ack="0" companyId="napse" engine="7.4.6" mapversion="100" messageId="123" store="1" terminal="1">
  <loyalty>
    <customers>
      <customer code="12345678" identifier="12345678" name="-" lastName="-" email="-">
        <loyaltycard id="5412345678" type="tarji" status="Activa"/>
      </customer>
    </customers>
  </loyalty>
</message>


Nota
titleConsideraciones
  • Esta funcionalidad fue diseñada con alcance limitado a clientes pre-fidelizados. No reemplaza ni modifica los flujos de fidelización completa, ni las validaciones de datos requeridas para clientes fidelizados.

  • Puede coexistir con flujos que utilizan servicios externos de validación (por ejemplo, validadores de cliente integrados a Promo 7.4).

  • En caso de que posteriormente el cliente se fidelice completamente (por ejemplo, desde una app), los datos pueden ser actualizados mediante API.




Expandir
titleMENSAJERIA - Ejemplos Prácticos

Veamos ahora un ejemplo de intercambio de estos mensajes:

Realizamos una petición con loyaltyValidation y el cliente no existe:


<message companyId="napse" store="1" terminal="10" date-time="2018-08-09 10:51:50" init-tck="true" messageId="1" void-trx="false" response="true" status="loyaltyValidation" evaluate="true" offline="false" >
<customer-add seq="1" id="10090504" type="test" limitedBenefits="5b7044246491fa1604a6d15b:200.00;" />
</message>




{
  "message": {
    "companyId": "napse",
    "store": "1",
    "terminal": "10",
    "date-time": "2018-08-09 10:51:50",
    "init-tck": "true",
    "messageId": "1",
    "void-trx": "false",
    "response": "true",
    "status": "loyaltyValidation",
    "evaluate": "true",
    "offline": "false",
    "customer-add": [{
      "seq": "1",
      "id": "10090504",
      "type": "test",
      "limitedBenefits": "5b7044246491fa1604a6d15b:200.00;"
    }]
  }
}



2.La respuesta entrega valores por defecto:


<message ack="0" companyId="napse" engine="6.4.6" mapversion="1" messageId="1" store="1" terminal="10" transaction="napse_1_10_20180809105150">  
<loyalty>    
<loyaltycards/>    
<coupons/>    
<errors/>    
<customers>      
<customer code="10090504" email="-" identifier="-" lastName="-" limitedBenefits="" name="-" segment="" seq="1"/>    
</customers>  
</loyalty>
</message>




{
  "message": {
    "ack": "0",
    "companyId": "napse",
    "engine": "6.4.6",
    "mapversion": "1",
    "messageId": "1",
    "store": "1",
    "terminal": "10",
    "transaction": "napse_1_10_20180809105150",
    "loyalty": {
      "loyaltycards": {},
      "coupons": {},
      "errors": {},
      "customers": {
        "customer": [{
          "code": "10090504",
          "email": "-",
          "identifier": "-",
          "lastName": "-",
          "limitedBenefits": "",
          "name": "-",
          "segment": "",
          "seq": "1"
        }]
      },
      "redeemTable": {}
    }
  }
}

En este caso enviamos datos del cliente pero no completamos todos los campos necesarios:

<message companyId="napse" store="1" terminal="10" date-time="2018-08-09 10:51:50" init-tck="true" messageId="1" void-trx="false" response="true" status="loyaltyValidation" evaluate="true" offline="false" >
<customer-add seq="1" id="10090504" identifier="10090504" type="test" limitedBenefits="5b7044246491fa1604a6d15b:200.00;"  name="pepe" lastName="rodrigues" identifierType="cpf" />
</message>




{
  "message": {
    "companyId": "napse",
    "store": "1",
    "terminal": "10",
    "date-time": "2018-08-09 10:51:50",
    "init-tck": "true",
    "messageId": "1",
    "void-trx": "false",
    "response": "true",
    "status": "loyaltyValidation",
    "evaluate": "true",
    "offline": "false",
    "customer-add": [{
      "seq": "1",
      "id": "10090504",
      "identifier": "10090504",
      "type": "test",
      "limitedBenefits": "5b7044246491fa1604a6d15b:200.00;",
      "name": "pepe",
      "lastName": "rodrigues",
      "identifierType": "cpf"
    }]
  }
}



La respuesta aun contiene datos por defecto:

<message ack="0" companyId="napse" engine="6.4.6" mapversion="1" messageId="1" store="1" terminal="10" transaction="napse_1_10_20180809105150">
<loyalty>
<loyaltycards/>
<coupons/>
<errors/>
<customers>
<customer code="10090504" email="-" identifier="10090504" lastName="rodrigues" limitedBenefits="" name="pepe" segment="" seq="1"/>
</customers>  
</loyalty></message>




{
  "message": {
    "ack": "0",
    "companyId": "napse",
    "engine": "6.4.6",
    "mapversion": "1",
    "messageId": "1",
    "store": "1",
    "terminal": "10",
    "transaction": "napse_1_10_20180809105150",
    "loyalty": {
      "loyaltycards": {},
      "coupons": {},
      "errors": {},
      "customers": {
        "customer": [{
          "code": "10090504",
          "email": "-",
          "identifier": "10090504",
          "lastName": "rodrigues",
          "limitedBenefits": "",
          "name": "pepe",
          "segment": "",
          "seq": "1"
        }]
      },
      "redeemTable": {}
    }
  }
}



Ahora enviamos TODOS los datos obligatorios para que el cliente sea creado


<message companyId="napse" store="1" terminal="10" date-time="2018-08-09 10:51:50" init-tck="true" messageId="1" void-trx="false" response="true" status="loyaltyValidation" evaluate="true" offline="false" >
<customer-add seq="1" id="10090504" identifier="10090504" type="test" limitedBenefits="5b7044246491fa1604a6d15b:200.00;"  name="pepe" lastName="rodrigues" identifierType="cpf" email="pepe@test.com" />
</message>




{
  "message": {
    "companyId": "napse",
    "store": "1",
    "terminal": "10",
    "date-time": "2018-08-09 10:51:50",
    "init-tck": "true",
    "messageId": "1",
    "void-trx": "false",
    "response": "true",
    "status": "loyaltyValidation",
    "evaluate": "true",
    "offline": "false",
    "customer-add": [{
      "seq": "1",
      "id": "10090504",
      "identifier": "10090504",
      "type": "test",
      "limitedBenefits": "5b7044246491fa1604a6d15b:200.00;",
      "name": "pepe",
      "lastName": "rodrigues",
      "identifierType": "cpf",
      "email": "pepe@test.com"
    }]
  }
}


La respuesta es:

<?xml version="1.0" encoding="UTF-8"?>
<message ack="0" companyId="napse" engine="6.4.6" mapversion="1" messageId="1" store="1" terminal="10" transaction="napse_1_10_20180809105150">
<loyalty>
<loyaltycards/>
<coupons/>
<errors/>
<customers>
<customer code="10090504" email="pepe@test.com" identifier="10090504" lastName="rodrigues" limitedBenefits="" name="pepe" segment="" seq="1"/>    
</customers>  
</loyalty>
</message>




{
  "message": {
    "ack": "0",
    "companyId": "napse",
    "engine": "6.4.6",
    "mapversion": "1",
    "messageId": "1",
    "store": "1",
    "terminal": "10",
    "transaction": "napse_1_10_20180809105150",
    "loyalty": {
      "loyaltycards": {},
      "coupons": {},
      "errors": {},
      "customers": {
        "customer": [{
          "code": "10090504",
          "email": "pepe@test.com",
          "identifier": "10090504",
          "lastName": "rodrigues",
          "limitedBenefits": "",
          "name": "pepe",
          "segment": "",
          "seq": "1"
        }]
      },
      "redeemTable": {}
    }
  }
}


Ahora vamos a enviar el mensaje que enviamos en el punto 1, el cual tiene solo los datos básicos del cliente y por el cual en el punto 1 nos retornaba valores por defecto (el cliente no era conocido) mientras que ahora nos tendría que retornar todos los datos que ya conocemos y creamos en el punto 3.

<message companyId="napse" store="1" terminal="10" date-time="2018-08-09 10:51:50" init-tck="true" messageId="1" void-trx="false" response="true" status="loyaltyValidation" evaluate="true" offline="false" >
<customer-add seq="1" id="10090504" type="test" limitedBenefits="" />
</message>



{
  "message": {
    "companyId": "napse",
    "store": "1",
    "terminal": "10",
    "date-time": "2018-08-09 10:51:50",
    "init-tck": "true",
    "messageId": "1",
    "void-trx": "false",
    "response": "true",
    "status": "loyaltyValidation",
    "evaluate": "true",
    "offline": "false",
    "customer-add": [{
      "seq": "1",
      "id": "10090504",
      "type": "test",
      "limitedBenefits": ""
    }]
  }
}



La respuesta efectivamente es:

<?xml version="1.0" encoding="UTF-8"?>
<message ack="0" companyId="napse" engine="6.4.6" mapversion="1" messageId="1" store="1" terminal="10" transaction="napse_1_10_20180809105150">
<loyalty>
<loyaltycards/>
<coupons/>
<errors/>
<customers>
<customer code="10090504" email="pepe@test.com" identifier="10090504" lastName="rodrigues" limitedBenefits="" name="pepe" segment="" seq="1"/>    
</customers>  
</loyalty>
</message>



{
  "message": {
    "ack": "0",
    "companyId": "napse",
    "engine": "6.4.6",
    "mapversion": "1",
    "messageId": "1",
    "store": "1",
    "terminal": "10",
    "transaction": "napse_1_10_20180809105150",
    "loyalty": {
      "loyaltycards": {},
      "coupons": {},
      "errors": {},
      "customers": {
        "customer": [{
          "code": "10090504",
          "email": "pepe@test.com",
          "identifier": "10090504",
          "lastName": "rodrigues",
          "limitedBenefits": "",
          "name": "pepe",
          "segment": "",
          "seq": "1"
        }]
      },
      "redeemTable": {}
    }
  }
}

...