Impresión de comprobantes

Impresión de comprobantes

ℹ️

Este proceso es opcional

La impresión del comprobante marca el cierre de una transacción y en esta sección se detallan los diferentes métodos que ofrece el SDK para imprimir un comprobante.

Requisitos

  • Datos de la transacción

Paso a paso

  1. Obtener la impresora con ReceiptPrinterFactory.create(context), que retorna la interfaz ReceiptPrinter.
  2. Validar el estado de la impresora antes de usarla.
  3. Instanciar objeto TextFormat para el texto que se quiere imprimir.
  4. Agregar las líneas a la cola de impresión con el método addLine.
  5. Iniciar la impresión y obtener el resultado con ReceiptPrinterFactory.printAndAwaitResult(printer) { result -> ... } dentro de un Thread (a partir de la v7.6.0, este método invoca startPrint internamente, ya no es necesario llamarlo por separado).
⚠️

A partir de la v7.6.0, la impresora ya no se instancia con DevicePrintImpl. Ver el detalle de la migración en las notas de release de la v7.6.0.

Métodos disponibles

MétodoDescripción
getStatus
  • Retorna el estado de la impresora.
  • 0x00 = Disponible
  • 0xF0 = No hay papel disponible.
  • 0xD1 = Batería muy baja para imprimir.
  • 0xF7 = Impresora ocupada.
addDoubleColumnTextAgrega 2 columnas en el ticket.
addLineAgrega una línea en el ticket.
addLinebreakAgrega saltos de línea.
addTripleColumnTextAgrega 3 columnas en el ticket.
addBlackLineAgrega una línea de separación en el ticket. Reemplaza a addImage, que queda deprecado.
startPrintInicia el proceso de impresión. A partir de la v7.6.0, es invocado internamente por ReceiptPrinterFactory.printAndAwaitResult.

Estos métodos posibilitan la creación de un formato de ticket personalizado, agregando los datos que se consideren necesarios. Sin embargo, a continuación se detallan los campos que son obligatorios por país:

Argentina
  • Fecha y hora de la transacción
  • Datos del comercio
    • Nombre
    • Dirección
  • Identificación
  • Monto de la transacción
  • Últimos 4 dígitos de la tarjeta
México
  • Fecha y hora de la transacción
  • Nombre del adquirente
  • Datos del comercio
    • Nombre
    • Dirección
    • Teléfono
  • Número de afiliación con la adquirencia
  • Identificador de la transacción
  • Marca y tipo de tarjeta
  • Número de serie de la terminal
  • Código de autorización
  • Monto de la transacción

Ejemplo de implementación

import com.menta.android.core.terminal.ReceiptPrinterFactory
import com.menta.android.emv.contract.printer.Align
import com.menta.android.emv.contract.printer.TextFormat
import com.menta.android.emv.contract.printer.INSTALLMENT_LABEL
import com.menta.android.emv.contract.printer.TOTAL_LABEL
 
val devicePrintImpl = ReceiptPrinterFactory.create(applicationContext)
val status = devicePrintImpl.getStatus()
Log.i(TAG, "status impresora: $status")
if (status == 0) {
    val thread = Thread {
        devicePrintImpl.addLine(
            TextFormat(align = Align.CENTER, bold = true, font = 1),
            "Nombre del comercio"
        )
        devicePrintImpl.addLine(
            TextFormat(align = Align.CENTER, bold = false),
            "Dirección del comercio"
        )
        devicePrintImpl.addLine(
            TextFormat(align = Align.CENTER, bold = false),
            "DNI del comercio"
        )
        devicePrintImpl.addLine(
            TextFormat(align = Align.CENTER, bold = false),
            "CUIT del comercio"
        )
 
        devicePrintImpl.addLinebreak(1)
        devicePrintImpl.addLine(
            TextFormat(align = Align.CENTER, bold = true),
            "Pago con Tarjeta de Crédito"
        )
 
        devicePrintImpl.addLinebreak(1)
        devicePrintImpl.addDoubleColumnText(
            TextFormat(),
            "Número de Operación",
            "#123456"
        )
        devicePrintImpl.addDoubleColumnText(
            TextFormat(),
            "Tarj: ***1234",
            "Visa"
        )
        devicePrintImpl.addDoubleColumnText(
            TextFormat(),
            "CONTACTLESS",
            ""
        )
        devicePrintImpl.addLinebreak(1)
        try {
            devicePrintImpl.addBlackLine(2)
        } catch (e: RemoteException) {
            e.printStackTrace()
        }
 
        devicePrintImpl.addDoubleColumnText(
            TextFormat(bold = true, font = 1),
            TOTAL_LABEL.uppercase(Locale.getDefault()),
            "10,00"
        )
        devicePrintImpl.addDoubleColumnText(
            TextFormat(), INSTALLMENT_LABEL, "01"
        )
 
        devicePrintImpl.addDoubleColumnText(
            TextFormat(),
            CURRENCY_LABEL,
            Currency.ARS.name
        )
        devicePrintImpl.addLinebreak(1)
 
        try {
            ReceiptPrinterFactory.printAndAwaitResult(devicePrintImpl) { result ->
                if (result == 0) {
                    Log.i(TAG, "Impresión exitosa")
                } else {
                    Log.i(TAG, "Error de impresión: $result")
                }
            }
        } catch (e: Exception) {
            e.printStackTrace()
        }
    }
    thread.start()
}