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ámetro | Tipo | Obligatorio | Descripción |
|---|---|---|---|
reportType | String | Sí | Tipo de reporte. Define "0" para ventas detalladas. |
allowPrintCurrentTransaction | String | No | Define "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ámetro | Tipo | Descripción |
|---|---|---|
result | String | Código de resultado de la transacción (por ejemplo, "0" para éxito). |
resultDetails | String | Mensaje detallado sobre el resultado de la transacción. |
reportDetails | String | Cadena 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:
| Campo | Tipo | Descripción |
|---|---|---|
paymentId | String | ID interno del pago |
paymentType | String | Tipo de pago (actualmente devuelve una cadena vacía) |
opReasonMessageStatus | String | Mensaje de estado de la operación |
capturedState | String | Estado de captura (actualmente devuelve una cadena vacía) |
timestamp | String | Marca de tiempo en formato ISO8601 con zona horaria |
brandType | String | Marca de la tarjeta |
cardLastNumber | String | Últimos 4 dígitos de la tarjeta usada |
operationValue | String | Valor de la operación |
operation | String | Tipo de operación: credit, debit, voucher, qrcode o cancellation |
opDescription | String | Descripció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ámetro | Tipo | Obligatorio | Descripción |
|---|---|---|---|
reportType | String | Sí | Tipo de reporte. Define "1" para el total de ventas. |
allowPrintCurrentTransaction | String | No | Define "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ámetro | Tipo | Descripción |
|---|---|---|
result | String | Código de resultado de la transacción (por ejemplo, "0" para éxito). |
resultDetails | String | Mensaje detallado sobre el resultado de la transacción. |
reportDetails | String | Cadena 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):
| Campo | Tipo | Descripción |
|---|---|---|
salesAmount | String | Monto total de las ventas |
salesQuantity | String | Cantidad de ventas |
refundsAmount | String | Monto total de las devoluciones |
refundsQuantity | String | Cantidad de devoluciones |
tipAmount | String | Monto total de las propinas |
tipQuantity | String | Cantidad de propinas |
qrPctAmount | String | Monto total de los QR Codes |
qrPctQuantity | String | Cantidad de QR Codes |
totalCredit | String | Monto total de las ventas con crédito |
totalDebit | String | Monto total de las ventas con débito |
totalPrepaid | String | Monto 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ística | Reporte detallado ("0") | Resumen de totales ("1") |
|---|---|---|
| Campo de respuesta | reportDetails (arreglo JSON) | reportDetails (objeto JSON) |
| Caso de uso | Pistas de auditoría, búsqueda de transacciones específicas | Cierre diario, conciliación de caja |
| Contenido | Lista de objetos Operation con los detalles del pago | Totales agregados por tipo de operación |
| Alcance | Todas las transacciones del lote actual | Todas las transacciones del lote actual |
| Campos de operación | paymentId, operation, operationValue, timestamp, brandType, cardLastNumber | salesAmount, salesQuantity, refundsAmount, tipAmount, totalCredit, totalDebit |
| Tamaño de la respuesta | Mayor (crece con la cantidad de transacciones) | Compacto (estructura fija) |
| Procesamiento | Requiere iterar el arreglo | Acceso 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:
- Valida siempre que los datos de la respuesta no sean null ni estén vacíos antes de parsear el contenido JSON.
- Usa los reportes detallados para pistas de auditoría y búsquedas de transacciones específicas. Así evitas procesar datos innecesarios.
- 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.
- Guarda los datos del reporte en caché local si necesitas consultarlos varias veces, para evitar solicitudes redundantes.
- Implementa un manejo de errores adecuado para el parseo de JSON y garantiza la estabilidad de la aplicación.
- Incluye valores únicos de
callerIden cada solicitud para ayudar en la resolución de problemas y el seguimiento de soporte.
Siguientes pasos
- Referencia de parámetros del deeplink - los parámetros de solicitud y respuesta del reporte.
- Códigos de resultado y estructuras de datos - interpreta los códigos que devuelve una solicitud de reporte.
- Gestiona los turnos de operador - configura los turnos que resume un reporte de turno.