# Crear una venta

La venta autoriza y captura el importe de la transacción en una sola operación. Este es el flujo estándar para transacciones en punto de venta donde el titular de la tarjeta está presente y el producto o servicio se proporciona inmediatamente.

## Requisitos

Antes de poder procesar un pago, se deben completar los siguientes pasos del ciclo de vida:
1. **Configuración Global**: El entorno y la licencia de la biblioteca deben estar configurados.
2. **Autenticación**: Un inicio de sesión exitoso para obtener `RedCLSTerminalData`.
3. **Inicialización del PIN pad**: El dispositivo físico debe estar conectado e inicializado (`inicializarPinpad` devolvió estado 0).

---

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

El SDK utiliza la clase `RedCLSOperativeWithCardData` para definir los parámetros de la transacción. A diferencia de otros sistemas, el importe se pasa como una **String** con dos decimales (ej., `\"10.00\"`).

```kotlin
import redcls.itpvpc.data.RedCLSOperativeWithCardData

// Definir el importe de la transacción y la referencia
val amount = "25.00"
val saleData = RedCLSOperativeWithCardData(amount).apply {
    this.invoice = "INV-123456" // Número de referencia opcional
}
```

<Callout type="warning">

Asegúrate de que la cadena del importe use un punto `.` como separador decimal y contenga exactamente dos posiciones decimales.

</Callout>

---

## Paso 2: Ejecutar el pago

La transacción se realiza a través del método `operativaConTarjeta` de tu instancia de `RedCLSPinPadManager`. Esta operación es síncrona y maneja todo el flujo: detección de tarjeta, entrada de PIN (si corresponde) y autorización en línea.

```kotlin
// Esto debe ejecutarse en un hilo en segundo plano
Thread {
    try {
        val response = pinpadManager.operativaConTarjeta(saleData)

        if (response.status == 0) {
            val tx = response.transactionData
            if (tx.result == "Autorizada") {
                Log.i("GetMini", "¡Aprobado! Autorización: ${tx.autorizationNumber}")
            } else {
                Log.w("GetMini", "Denegado. Código: ${tx.responseCode}")
            }
        } else {
            Log.e("GetMini", "Error del SDK: ${response.status} - ${response.msgKO}")
        }
    } catch (e: Exception) {
        Log.e("GetMini", "Excepción de Pago: ${e.message}")
    }
}.start()
```

---

## Paso 3: Manejar el resultado de la transacción

El objeto `RedCLSTransactionData` contiene toda la información necesaria para tus registros e impresión de recibos.

| Campo | Descripción |
| :--- | :--- |
| `result` | El resultado de la autorización (ej., `\"Autorizada\"`, `\"Denegada\"`). |
| `autorizationNumber` | El código único proporcionado por el emisor (si se aprueba). |
| `responseCode` | El código de autorización de la operación (si fue aceptada) o el código del motivo de denegación en caso contrario. |
| `identifierRTS` | Un ID de referencia del SDK de 24 caracteres para la transacción. |
| `order` | El número de pedido de la transacción, devuelto por el TPV PC para identificar la operación en el comercio/terminal. |
| `isPinAuthenticated` | Indica si el titular de la tarjeta fue verificado mediante PIN. |

```kotlin
fun handleSuccess(tx: RedCLSTransactionData) {
    when (tx.result) {
        "Autorizada" -> {
            Log.i("GetMini", "¡Aprobado! Autorización: ${tx.autorizationNumber}")
            // Proceder a imprimir/mostrar recibo
        }
        "Denegada" -> {
            Log.w("GetMini", "Transacción Denegada. Código: ${tx.responseCode}")
        }
    }
}
```

---

## Solución de problemas comunes de pago

- **Tiempo de Espera Agotado**: El PIN pad puede agotar el tiempo de espera si el usuario tarda demasiado en presentar la tarjeta o ingresar el PIN. Asegúrate de que el dispositivo sea accesible y que la batería sea suficiente.
- **Tarjeta Denegada**: Si el `result` es "Denegada", el titular de la tarjeta debe contactar a su banco. Puedes encontrar el código de motivo específico en `tx.responseCode`.
- **PIN pad Perdido**: Si la conexión se cae durante el pago, el método devolverá un estado de error. Debes reinicializar la conexión antes de reintentar.

<Callout type="warning">

Siempre almacena el `identifierRTS`, el `order` y el importe (`amount`) de la transacción. Los necesitarás si tienes que procesar una **Devolución** más tarde.

</Callout>

## Próximos pasos

Después de dominar la venta, puedes explorar tipos de transacciones avanzadas:

* [Crear un pago preautorizado](/es/get-mini/android-sdk/guides/process-preauthorized-payment): Reserve fondos para captura posterior.
* [Devolver un pago](/es/get-mini/android-sdk/guides/refund-payment): Devuelva fondos a los clientes.
* [Seguridad y enlace de dispositivos](/es/get-mini/android-sdk/core-concepts/security-device-binding): Optimiza la seguridad de tu integración.