Getnet DocsGetnet Docs

Genera reportes de ventas

Esta guía explica cómo obtener los datos de transacciones desde el terminal con la Getnet Payment App. Aprenderás a solicitar listas detalladas de transacciones para pistas de auditoría o resúmenes consolidados de totales para la conciliación.

Antes de comenzar

Antes de seguir los pasos, asegúrate de que:

  • La Getnet Payment App esté instalada y operativa en el terminal
  • Se haya procesado al menos una transacción en el lote actual
  • Tu aplicación pueda parsear respuestas JSON

Los reportes de ventas entregan los datos de las transacciones del lote actual. Los lotes se cierran normalmente al final del día, durante el procesamiento de la liquidación (Cierre de Lote).

Tipos de reporte

La Getnet Payment App admite dos tipos de reportes de ventas, cada uno pensado para casos de uso distintos:

Reporte detallado (reportType="0")

Devuelve un arreglo JSON con las transacciones individuales y todos los detalles de cada operación. Este reporte es ideal para:

  • Pistas de auditoría y verificación de cumplimiento
  • Buscar transacciones específicas por NSU
  • Verificar el estado de pagos individuales
  • Conciliación detallada y resolución de problemas

Resumen de totales (reportType="1")

Devuelve un objeto JSON con los totales agregados de todas las transacciones del lote actual. Este reporte es ideal para:

  • Cierre diario y conciliación de caja
  • Vista rápida del desempeño del lote
  • Verificación de la liquidación al cierre del día
  • Reportes resumidos para sistemas de back-office

Proceso de generación de reportes

Esta sección te guía para solicitar ambos tipos de reportes y manejar sus respuestas.

Solicita un reporte detallado de ventas

Para obtener la lista completa de transacciones individuales, crea un Intent con reportType="0". La respuesta incluye información detallada de cada transacción del lote actual.

Parámetros de la solicitud

ParámetroTipoObligatorioDescripción
reportTypeStringSíTipo de reporte. Define "0" para ventas detalladas.
allowPrintCurrentTransactionStringNoDefine "true" para que Getnet se encargue de imprimir el recibo (predeterminado) o "false" para recibir los datos del recibo sin procesar.
fun getDetailedReport() {
    val intent = Intent(Intent.ACTION_VIEW, Uri.parse("getnet://payment/v1/reports")).apply {
        putExtra("reportType", "0")
    }
    startActivityForResult(intent, REPORT_REQ_CODE)
}

Parámetros de la respuesta

ParámetroTipoDescripción
resultStringCódigo de resultado de la transacción (por ejemplo, "0" para éxito).
resultDetailsStringMensaje detallado sobre el resultado de la transacción.
reportDetailsStringCadena en formato JSON con la lista de objetos Operation.

El campo reportDetails contiene un arreglo JSON con objetos Operation. Cada Operation tiene la siguiente estructura:

CampoTipoDescripción
paymentIdStringID interno del pago
paymentTypeStringTipo de pago (actualmente devuelve una cadena vacía)
opReasonMessageStatusStringMensaje de estado de la operación
capturedStateStringEstado de captura (actualmente devuelve una cadena vacía)
timestampStringMarca de tiempo en formato ISO8601 con zona horaria
brandTypeStringMarca de la tarjeta
cardLastNumberStringÚltimos 4 dígitos de la tarjeta usada
operationValueStringValor de la operación
operationStringTipo de operación: credit, debit, voucher, qrcode o cancellation
opDescriptionStringDescripción de la operación (actualmente devuelve una cadena vacía)

Ejemplo de manejo de la respuesta:

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
    super.onActivityResult(requestCode, resultCode, data)
    if (requestCode == REPORT_REQ_CODE && resultCode == RESULT_OK) {
        val result = data?.getStringExtra("result")
        val reportDetails = data?.getStringExtra("reportDetails")
        
        if (result == "0" && !reportDetails.isNullOrEmpty()) {
            val operations = JSONArray(reportDetails)
            for (i in 0 until operations.length()) {
                val op = operations.getJSONObject(i)
                val paymentId = op.getString("paymentId")
                val operation = op.getString("operation")
                val operationValue = op.getString("operationValue")
                // Process each operation
            }
        }
    }
}

Solicita un resumen de totales

Para obtener los totales agregados del lote actual, crea un Intent con reportType="1". La respuesta incluye las sumas y los conteos consolidados de todas las transacciones.

Parámetros de la solicitud

ParámetroTipoObligatorioDescripción
reportTypeStringSíTipo de reporte. Define "1" para el total de ventas.
allowPrintCurrentTransactionStringNoDefine "true" para que Getnet se encargue de imprimir el recibo (predeterminado) o "false" para recibir los datos del recibo sin procesar.
fun getTotalsSummary() {
    val intent = Intent(Intent.ACTION_VIEW, Uri.parse("getnet://payment/v1/reports")).apply {
        putExtra("reportType", "1")
    }
    startActivityForResult(intent, REPORT_REQ_CODE)
}

Parámetros de la respuesta

ParámetroTipoDescripción
resultStringCódigo de resultado de la transacción (por ejemplo, "0" para éxito).
resultDetailsStringMensaje detallado sobre el resultado de la transacción.
reportDetailsStringCadena en formato JSON con las operaciones resumidas y los totales.

El campo reportDetails contiene un objeto JSON con secciones de operaciones y totales agregados:

Totales de operaciones (sección operationTotals):

CampoTipoDescripción
salesAmountStringMonto total de las ventas
salesQuantityStringCantidad de ventas
refundsAmountStringMonto total de las devoluciones
refundsQuantityStringCantidad de devoluciones
tipAmountStringMonto total de las propinas
tipQuantityStringCantidad de propinas
qrPctAmountStringMonto total de los QR Codes
qrPctQuantityStringCantidad de QR Codes
totalCreditStringMonto total de las ventas con crédito
totalDebitStringMonto total de las ventas con débito
totalPrepaidStringMonto total de las ventas con prepago

El reporte también incluye secciones detalladas de operaciones: debitOperation, creditOperation, qrcodeCreditOperation, qrcodeDebitOperation, qrcodePrePaidOperation, devolutionOperation, prePaidOperation, qrcodeOperation, cada una con los conteos de transacciones, los montos y las listas de operaciones.

Comparación de tipos de reporte

La siguiente tabla te ayuda a elegir el tipo de reporte adecuado para tu caso de uso:

CaracterísticaReporte detallado ("0")Resumen de totales ("1")
Campo de respuestareportDetails (arreglo JSON)reportDetails (objeto JSON)
Caso de usoPistas de auditoría, búsqueda de transacciones específicasCierre diario, conciliación de caja
ContenidoLista de objetos Operation con los detalles del pagoTotales agregados por tipo de operación
AlcanceTodas las transacciones del lote actualTodas las transacciones del lote actual
Campos de operaciónpaymentId, operation, operationValue, timestamp, brandType, cardLastNumbersalesAmount, salesQuantity, refundsAmount, tipAmount, totalCredit, totalDebit
Tamaño de la respuestaMayor (crece con la cantidad de transacciones)Compacto (estructura fija)
ProcesamientoRequiere iterar el arregloAcceso directo al objeto

Manejo de errores

Al generar reportes, puedes encontrar los siguientes escenarios de error:

Reporte vacío

Si el terminal devuelve result="3", no se procesaron transacciones desde el último cierre de lote. Esto es normal al inicio de un lote nuevo. Espera a que se procesen transacciones antes de solicitar un reporte.

Errores de parseo

Verifica siempre que el campo reportDetails no sea null ni esté vacío antes de intentar parsearlo. Maneja las excepciones de parseo de JSON de forma controlada para evitar que tu aplicación falle.

Tipo de reporte inválido

Si envías un valor de reportType inválido (distinto de "0" o "1"), la solicitud se rechaza. Asegúrate de usar el tipo de reporte correcto para tu caso de uso.

Buenas prácticas

Al trabajar con reportes de ventas, sigue estas buenas prácticas:

  1. Valida siempre que los datos de la respuesta no sean null ni estén vacíos antes de parsear el contenido JSON.
  2. Usa los reportes detallados para pistas de auditoría y búsquedas de transacciones específicas. Así evitas procesar datos innecesarios.
  3. Usa los resúmenes de totales para la conciliación del cierre del día. Así reduces la transferencia de datos y el tiempo de procesamiento.
  4. Guarda los datos del reporte en caché local si necesitas consultarlos varias veces, para evitar solicitudes redundantes.
  5. Implementa un manejo de errores adecuado para el parseo de JSON y garantiza la estabilidad de la aplicación.
  6. Incluye valores únicos de callerId en cada solicitud para ayudar en la resolución de problemas y el seguimiento de soporte.

Siguientes pasos