Reimpresión por Folio

La reimpresión por folio es una funcionalidad nueva que además de ayudar a reimprimir en diversos casos el ticket de la venta en papel, otorga tambien la respuesta en formato JSON y que funciona como duplicado de la venta original. Básicamente es similar a la reimpresión por orderId pero con mayor alcance y potencial que se explicaran más adelante:

Requisitos para la reimpresión por folio:

Implementación de método sendPrint()

Este método tiene el objetivo de buscar el estatus de una transacción mediante el folio que haya sido asignado en la venta.

Campos utilizados para la reimpresión:

Nombre campoDescripciónTipo de dato
folioIdNúmero identificador de transacción que puede ser enviado en la solicitud de venta y que debe ser un valor único interno del sistema punto de venta del comercio.String (Máximo hasta 250 caracteres)
orderIdIdentificador único de transacción con NetPay. Se genera en una venta exitosa y puede ser utilizado posteriormente en reimpresión y cancelación.String (Máximo hasta 250 caracteres)

A partir de la versión de Smart PinPad 2.0 y la DLL 16.0 es posible buscar más variedad de estatus de una transacción. Contando con estas 2 condiciones se puede ejecutar el metodo sendPrint() y pasarle como parámetro el folio de la venta para consultar el estatus.

🚧

Es importante tomar en cuenta que la venta previa debió haberse generado previamente con el folio de su sistema punto de venta.

A continuación, un ejemplo de una venta:

 connectorPAX.SetAmount(Convert.ToDouble(textBox1.Text));
    if (CAMPOTIP == "")
    {
      connectorPAX.SetTip(0.0);
    }
    else
    {
      connectorPAX.SetTip(Convert.ToDouble(textBox5.Text));
    }
    connectorPAX.SetFolio(textBox2.Text); //Se envía el folio en la venta
    connectorPAX.SetMSI(Convert.ToInt32(msiValue));
    connectorPAX.setDisablePrintAnimation(checkBox1.Checked);
    connectorPAX.sendData();
}

Posterior a la venta generada se puede ejecutar en otro proceso interno del sistema punto de venta del comercio la reimpresión por folio como se presenta a continuación:

private void button2_Click(object sender, EventArgs e)
{
  connectorPAX.SetCustomeCOMM("COM9");  //PARA LA DLL 1.6.0 ES NECESARIO ESPECIFICAR EL PUERTO COM.
  if (folioId.Text != "")
  {
    button2.Enabled = false;
    button3.Enabled = false;
    timer2.Enabled = true;
    timer1.Enabled = true;
    connectorPAX.setDisablePrintAnimation(checkBox1.Checked);
    string result = connectorPAX.sendPrint("", folioId.Text);

    textBox4.Text = result;
  }
}

❗️

Para la reimpresión por folio se recomienda enviar el orderId vacío, puesto que de enviar ambos con valores al mismo tiempo, el servicio siempre dará prioridad al orderId y por lo cuál pudiera generar que no reciban la respuesta deseada.


Recibiendo respuesta de una reimpresión por folio de una venta exitosa (dll 1.6.0)

Presentamos un ejemplo de cómo pueden recibir la respuesta para esta operación a partir del método ReceiveData() y getResponse():

private void getResponseData()
{
    connectorPAX.ReceiveData();
    if (connectorPAX.getResponse() != null)
    { 
      responseTextbox.Text = JsonConvert.SerializeObject(connectorPAX.getResponse());
      timer1.Enabled = false;
    }
}

y un ejemplo de como deben recibir el objeto en formato JSON:

{
    "data": {
        "affiliation": "7389108",
        "amount": "505",
        "applicationLabel": "MASTERCARD",
        "arqc": "DD37B1142323273E",
        "aid": "A0000000041010",
        "authCode": "222110",
        "bankName": "BANORTE",
        "cardExpDate": "12/26",
        "cardType": "C",
        "cardNumber": "9087",
        "cardTypeName": "MASTERCARD",
        "cityName": "LINARES,NUEVO LEON",
        "responseCode": "00",
        "folioNumber": "Ftest02-29-07-2024",
        "hasPin": false,
        "hexSign": "null",
        "isQPS": 0,
        "isReprint": true,
        "message": "Transaccion Valida",
        "moduleCharge": "5",
        "moduleLote": "1",
        "customerName": "BORBONIO/JHONATTAN",
        "terminalId": "1492339353",
        "orderId": "240729110107-1492339353",
        "preAuth": "0",
        "preStatus": 0,
        "promotion": "0",
        "rePrintDate": "2.0.p.p_20240725",
        "rePrintMark": "MASTER",
        "reprintModule": "C",
        "rrnNumber": "072911010834",
        "storeId": "651268",
        "storeName": "COREI3",
        "streetName": "LINARE 107 ",
        "ticketDate": "JUL. 29, 24 11:07:15",
        "tipAmount": "0",
        "tipLessAmount": "0",
        "transDate": "2024-07-29 11:01:07.0",
        "transType": "A",
        "transactionCertificate": "DD37B1142323273E",
        "transactionId": "79ED32C8-A647-B479-85F5-1C12FC15EBB7"
    },
    "idReport": 1
}

Para poder diferenciar las respuestas existentes de declinación y reversos es necesario tomar en cuenta el campo reprintModule, este campo va devolver los siguientes valores dependiendo del caso presentado:

Excepciones

  • Al utilizar un folioId repetido la reimpresión mostrará la última transacción realizada con el folio ingresado.
  • Al ingresar un folioId no existente la terminal mostrará un mensaje de “No se encontraron datos”.
  • Al consultar una transacción que mostró error de conexión en la terminal y consultar por medio de la reimpresión por folioId la respuesta regresará en el campo "message" transacción pendiente de reversar.

Recibiendo respuesta de una reimpresión por folio de un reverso (dll 1.6.0)

Para poder diferenciar las respuestas existentes de declinación y reverso es necesario tomar en cuenta el campo reprintModule, este campo va devolver los siguientes valores dependiendo del caso presentado:

Transacción Pendiente por reversar:
reprintModule: PRV

Transacción Reversada:
reprintModule: RV

Transacción Declinada:
reprintModule: D

Este campo es el esencial y que debe utilizarse para realizar las validaciones necesarias en caso de que no les llegue la respuesta original durante la transacción y que deseen realizar una reimpresión desde su punto de venta. Es de vital importancia que no se basen en el campo responseCode ya que al ser una operación de tipo reimpresión devolverá un valor genérico que indica que ocurrió un error, sin embargo a través del campo reprintModule les ayudará a identificar el estatus de dicha transacción.

A continuación se presenta ejemplos de la respuesta en transacciones declinadas que les devolverá en cada escenario remarcando el campo reprintModule.


Como se puede apreciar en los ejemplos anteriores, también se están regresando los valores de los campos adicionales y que pueden imprimir en su ticket propio como parte del estándar necesario para hacerse válido ante cualquier aclaración bancaria. Esta información se encuentra en el excel de ticket map que se les compartió anteriormente.

Nota Importante: Recordamos que esta información es válida únicamente para las reimpresiones. Durante el proceso de transacción de una venta por ejemplo, va devolver responseCode diferentes y el campo reprintModule va tener valor nulo puesto que solamente al realizar una reimpresión se determina su valor. Esto quiere decir que si se realiza una venta y al finalizar aprueba o declina va devolver estos campos de forma diferente puesto que es el proceso original y no una reimpresión.

Recibiendo respuesta de una reimpresión por folio de una cancelación (dll 1.6.0)

A continuación compartimos la respuesta que regresa al realizar una reimpresión por folio de una cancelación:

Al igual que los escenarios de declinación y reversos con reimpresión por folio que se compartió en el documento compartido con anterioridad, la reimpresión por folio ayuda a conocer el estatus actual de la transacción y el campo que debe tomarse en cuenta para esta operación es el de reprintModule. Como se muestra en el ejemplo anterior se encuentra con el estatus V que indica que la transacción ha sido cancelada.

Si por alguna razón la cancelación no se realizó exitosamente, al realizar la reimpresión por folio, la respuesta sería la siguiente:

Como se visualiza en el ejemplo anterior con la respuesta después de ejecutar una reimpresión por folio, en el campo reprintModule tiene el valor de C, indicando que la transacción fue completada y la cancelación no fue realizada con éxito. Es decir esta respuesta es de una transacción aprobada.

De esta manera el campo ayuda a conocer el estatus actual de la transacción por lo que es necesario contemplar la reimpresión por folio para conocer estos estatus en los casos que sean necesarios.