# Crear un pago

La función principal del TPV es procesar pagos con tarjeta. El `PaymentRepository` gestiona esta operación, encargándose de la comunicación entre el lector de tarjetas y el Get Smart SDK Payment Service.

Antes de procesar cualquier pago, asegúrate de haber [**inicializado el TPV**](/es/get-smart/get-smart-sdk/integration-guides/payment-operations/initialize-the-tpv).

## Realizar un pago estándar

Para procesar un pago sencillo con tarjeta, utiliza la función `makePayment`. El único parámetro obligatorio es el `amount` (como un objeto `Money`).

```kotlin
suspend fun pay(amount: BigDecimal, currency: Currency) {
    // 1. Create the Money object
    val money = Money(amount, currency)

    // 2. Call makePayment
    val result = paymentRepository.makePayment(
        amount = money
    )

    // 3. Handle the result
    when (result) {
        is RepositoryResult.Success -> handlePaymentResult(result.data)
        is RepositoryResult.ConnectionError -> showError("Connection failed")
        is RepositoryResult.Cancelled -> showInfo("User cancelled: ${result.message}")
        is RepositoryResult.ProtocolError -> showError("Error: ${result.type}")
    }
}
```

### Parámetros de pago avanzados

La función `makePayment` admite varios parámetros opcionales para enriquecer los datos de la transacción:

* **`tip`**: Un objeto `Money` que representa el importe de la propina.  
* **`shiftInfo`**: Un objeto `ShiftInfo` para asociar el pago con un turno de trabajo específico (Número y Fecha).  
* **`financialConditions`**: Condiciones financieras específicas si aplica (como Plazox).  
* **`proprietaryExtraData`**: Un objeto para adjuntar datos de terceros a la transacción.  
* **`language`**: Un enum `LanguageIso6391` para forzar la interfaz del servicio a un idioma específico en esta operación.

**Ejemplo con parámetros opcionales:**

```kotlin
val result = paymentRepository.makePayment(
    amount = Money(BigDecimal("50.00"), Currency.getInstance("EUR")),
    tip = Money(BigDecimal("5.00"), Currency.getInstance("EUR")),
    language = LanguageIso6391.ES
)
```

## Interpretar el PaymentResult

Cuando la llamada al repositorio es exitosa (`RepositoryResult.Success`), devuelve un objeto `PaymentResult`. **Debes** verificar este objeto para determinar si la operación financiera fue realmente aprobada o denegada por el banco.

`PaymentResult` es una interfaz sellada (sealed interface) con tres estados posibles:

### 1. Aceptado (`PaymentResult.Accepted`)

El pago fue autorizado por el host.

* **Datos**: Contiene un objeto `Transaction` con detalles completos (tarjeta utilizada, código de autorización, datos del recibo).  
* **Acción**: Imprime el recibo y completa la venta en tu aplicación.

### 2. Denegado (`PaymentResult.Denied`)

El pago fue rechazado por el host o el banco.

* **Datos**: Contiene un objeto `Transaction` (a menudo con el motivo del rechazo).  
* **Acción**: Informa al usuario de que la tarjeta fue declinada.

### 3. Tarjeta no encontrada (`PaymentResult.CardNotFound`)

Error específico para flujos de entrada manual donde el número de tarjeta ingresado no existe.

### Ejemplo de lógica de gestión

```kotlin
fun handlePaymentResult(paymentResult: PaymentResult) {
    when (paymentResult) {
        is PaymentResult.Accepted -> {
            val transaction = paymentResult.data
            val authCode = transaction.operationInfo.authorizationNumber
            println("✅ Payment Approved! Auth Code: $authCode")
            // Proceed to print ticket...
        }
        is PaymentResult.Denied -> {
            val transaction = paymentResult.data
            val reason = transaction.operationInfo.failedReasonInfo?.desc ?: "Unknown"
            println("❌ Payment Denied. Reason: $reason")
        }
        is PaymentResult.CardNotFound -> {
            println("❌ Error: Card not found.")
        }
    }
}
```

## Próximos pasos

* [**Crear un Pago Preautorizado**](/es/get-smart/get-smart-sdk/integration-guides/payment-operations/create-a-pre-authorized-payment): Aprende sobre la reserva de fondos en una tarjeta.
* [**Devolver un Pago**](/es/get-smart/get-smart-sdk/integration-guides/payment-operations/refund-a-payment): Cómo devolver fondos si un pago se realizó por error.