Versões comparadas

Chave

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

...

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.



...

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": {}
    }
  }
}

...