# Devolver un pago

El Get Mini Android SDK te permite devolver fondos a la tarjeta de un cliente para transacciones previamente autorizadas. En este SDK, las devoluciones son típicamente referenciales (basadas en los identificadores de transacción originales) y se procesan como una operación de red, aunque también se admite una "Devolución sin original" con tarjeta presente como alternativa.

## Requisitos

Antes de procesar una devolución, asegúrate de:
1.  El SDK está inicializado y el comercio ha iniciado sesión.
2.  Tienes los **Datos del Terminal** (`RedCLSTerminalData`) obtenidos durante el inicio de sesión.
3.  Tienes los **Datos de la Transacción Original** (`identifierRTS`, `order`, etc.).

---

## Paso 1: Preparar los datos de la devolución

Para realizar una devolución estándar, debes usar el objeto `RedCLSTransactionData` recibido durante la venta original u obtenido a través de una operación de consulta.

<Callout type="warning">

Siempre que sea posible, usa el objeto `RedCLSTransactionData` devuelto por la venta original o por una operación de consulta. La instanciación manual debe usarse solo cuando el objeto original no esté disponible. El campo `amount` en el `RedCLSTransactionData` pasado al gestor de devoluciones debe contener el **importe específico que deseas devolver** (que puede ser un importe parcial).

</Callout>

```kotlin
import redcls.itpvpc.data.RedCLSTransactionData
import redcls.itpvpc.data.RedCLSRefundData

// 1. Preparar los datos de la transacción original
// PREFERIDO: Usa el objeto devuelto por una venta o consulta anterior.
// ALTERNATIVA: Si el objeto original no está disponible, instáncialo manualmente.
val originalTx = RedCLSTransactionData().apply {
    order = "12345"
    identifierRTS = "012345678901234567890123"
    amount = "10.00" // El importe a devolver
}

// 2. Envolverlo en un objeto RefundData con tu configuración de terminal
val refundData = RedCLSRefundData(merchantTerminalData, originalTx)
```

### Devolución entre comercios del mismo grupo

Si la transacción original fue procesada bajo un comercio diferente (dentro del mismo grupo), debes usar el constructor alternativo de `RedCLSRefundData` que no requiere un objeto de transacción:

```kotlin
val interMerchantRefundData = RedCLSRefundData(
    merchantTerminalData,  // Tus datos de terminal actuales
    "987654321",           // originalMerchantFuc
    "123456",              // originalOrder
    "10.00",               // amountToRefund
    "20231027",            // originalDate (yyyyMMdd)
    "999999"               // originalAutorizationNumber
)
```

---

## Paso 2: Ejecutar la devolución

Las devoluciones son manejadas por el `RedCLSRefundManager`. Esta es una operación de red y típicamente no requiere que se inserte una tarjeta a menos que se realice una "Devolución sin original".

```kotlin
import redcls.itpvpc.managers.RedCLSRefundManager

Thread {
    val response = RedCLSRefundManager.peticionDevolucion(context, refundData)

    if (response.status == 0) {
        // La devolución fue procesada exitosamente por el host
        Log.d("GetMini", "Devolución aprobada. Identificador: ${response.getIdentificadorRTS()}")
    } else {
        Log.e("GetMini", "Devolución fallida: ${response.msgKO}")
    }
}.start()
```

---

## Paso 3: Devolución sin original (lectura de tarjeta)

Si no tienes los identificadores de la transacción original (por ejemplo, para transacciones heredadas o datos perdidos), debes realizar una devolución con tarjeta presente. Esto requiere que el cliente presente la tarjeta en el PIN pad.

```kotlin
// Usando el PinPadManager en lugar del RefundManager
// NOTA: Este método espera un Double para el importe
val response = pinpadManager.devolucionSinOriginal(10.00, "INV-REF-001")

if (response.status == 0) {
    Log.d("GetMini", "Devolución con tarjeta presente aprobada")
}
```

---

## Mejores prácticas

- **Devoluciones parciales**: Puedes realizar múltiples devoluciones parciales siempre que el total acumulado no exceda el importe de la transacción original.
- **Referenciar el original**: Vincula siempre la devolución en tu sistema al `order` e `identifierRTS` originales para una contabilidad más limpia y soporte al cliente.
- **Recibos**: El `RedCLSRefundResponse` incluye una cadena XML de "Response". Asegúrate de que tu lógica de recibo extraiga el campo `resultado` para confirmar la autorización al cliente.

## Próximos pasos

* [Crear una venta](/es/get-mini/android-sdk/guides/process-single-step-payments): Revisa la operación de venta base.
* [Crear un pago preautorizado](/es/get-mini/android-sdk/guides/process-preauthorized-payment): Aprende cómo cancelar reservas.
* [Crear un pago con plazos](/es/get-mini/android-sdk/guides/process-installments-payment): Aprende sobre cuotas.