# Criar um Pagamento de Etapa Única

A função principal do TPV é processar pagamentos com cartão. O `PaymentRepository` gerencia esta operação, lidando com a comunicação entre o leitor de cartões e o Get Smart SDK Payment Service.

Antes de processar qualquer pagamento, certifique-se de que você já [**inicializou o TPV**](/pt/get-smart/get-smart-sdk/integration-guides/payment-operations/initialize-the-tpv).

## Realizando um Pagamento Padrão

Para processar um pagamento simples com cartão, use a função `makePayment`. O único parâmetro obrigatório é o `amount` (como um 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 Pagamento Avançados

A função `makePayment` suporta vários parâmetros opcionais para enriquecer os dados da transação:

* **`tip`**: Um objeto `Money` representando o valor da gorjeta.  
* **`shiftInfo`**: Um objeto `ShiftInfo` para associar o pagamento a um turno de trabalho específico (Número e Data).  
* **`financialConditions`**: Condições financeiras específicas (como Plazox), se aplicável.  
* **`proprietaryExtraData`**: Um objeto para anexar dados de terceiros à transação.  
* **`language`**: Um enum `LanguageIso6391` para forçar a interface do serviço para um idioma específico nesta operação.

**Exemplo com parâmetros opcionais:**

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

## Interpretando o PaymentResult

Quando a chamada do repositório é bem-sucedida (`RepositoryResult.Success`), ela retorna um objeto `PaymentResult`. Você **deve** verificar este objeto para determinar se a operação financeira foi realmente aprovada ou negada pelo banco.

O `PaymentResult` é uma interface selada (sealed interface) com três estados possíveis:

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

O pagamento foi autorizado pelo host.

* **Dados**: Contém um objeto `Transaction` com detalhes completos (cartão usado, código de autorização, dados do comprovante).  
* **Ação**: Imprima o comprovante e complete a venda em seu app.

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

O pagamento foi rejeitado pelo host ou banco.

* **Dados**: Contém um objeto `Transaction` (geralmente com o motivo da rejeição).  
* **Ação**: Informe ao usuário que o cartão foi recusado.

### 3. Cartão Não Encontrado (`PaymentResult.CardNotFound`)

Erro específico para fluxos de entrada manual onde o número do cartão inserido não existe.

### Exemplo de Lógica de Tratamento

```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 Passos

* [**Criar um Pagamento Pré-autorizado**](/pt/get-smart/get-smart-sdk/integration-guides/payment-operations/create-a-pre-authorized-payment): Saiba como reservar fundos em um cartão.
* [**Estornar um Pagamento**](/pt/get-smart/get-smart-sdk/integration-guides/payment-operations/refund-a-payment): Como devolver fundos se um pagamento foi feito por engano.