# Crie um pagamento parcelado com planos

Este guia mostra como processar pagamentos com cartão de crédito parcelados usando o Getnet Payment App. Você pode deixar o terminal calcular os juros (modo Manual) ou enviar o valor final já calculado pelo seu próprio sistema (modo Calculado).

## Antes de começar

Antes de seguir os passos, você precisa de:

* Getnet Payment App instalado no terminal.
* Usar cartão de crédito como meio de pagamento (`paymentMethod="1"`).
* O estabelecimento precisa estar autorizado para os planos de parcelamento específicos na configuração do seu Tax Engine.

<Callout type="note">

Os parâmetros de parcelamento se aplicam somente a transações com cartão de crédito. Eles não valem para débito, QR Code ou voucher.

</Callout>

## Como funciona

Quando um cartão de crédito é detectado, o terminal valida o plano solicitado contra as configurações autorizadas do estabelecimento por meio de um Tax Engine. Entender essa validação ajuda você a prever o comportamento do terminal:

| Etapa | Condição | Comportamento do terminal |
|------|-----------|-------------------|
| **Seleção** | Se os parâmetros `planId` ou `installments` estiverem ausentes | O terminal exibe uma tela de seleção para o operador escolher o plano manualmente. |
| **Validação do plano** | Se o `planId` informado corresponder à resposta do Tax Engine | O terminal pula a tela de seleção de plano. |
| **Validação das parcelas** | Se o valor de `installments` for compatível com a resposta do Tax Engine | O terminal pula a tela de seleção de parcelas e segue para a confirmação. |
| **Ajuste** | Se o plano solicitado não estiver autorizado ou divergir do Tax Engine | O terminal obriga o usuário a selecionar manualmente uma opção válida e autorizada. |

## Passo 1: escolha o modo de operação

Antes de iniciar a transação, defina o `operationMode`. Esse parâmetro controla como os valores da transação são calculados:

| Modo de operação | Valor | Comportamento |
| :--- | :--- | :--- |
| **Manual** | "0" (padrão) | O terminal calcula os valores finais da transação com base em regras de negócio internas e nos dados que o usuário informa em tempo real durante o fluxo de pagamento. |
| **Calculado** | "1" | A aplicação de terceiros é responsável por fazer os cálculos e enviar o valor final; o terminal recebe os dados sem aplicar nenhuma modificação. |

> Se o `operationMode` não for especificado, o terminal assume o modo manual (`"0"`).

## Passo 2: crie o pagamento parcelado

Para processar um pagamento parcelado, você precisa criar um Intent com a operação de pagamento e incluir os parâmetros específicos de parcelamento.

> **Como funciona a validação de plano e parcelas**
>
> O terminal faz uma validação em duas etapas contra o Tax Engine:
>
> 1. **Validação do plano**: se o `planId` que você envia corresponder aos planos autorizados do estabelecimento retornados pelo Tax Engine, o terminal pula a tela de seleção de plano.
>
> 2. **Validação das parcelas**: depois de validar o plano, se o valor de `installments` for compatível com a resposta do Tax Engine para aquele plano, o terminal também pula a tela de seleção de parcelas.
>
> Somente quando **as duas** validações passam o terminal segue direto para a tela de confirmação. Se qualquer uma falhar, o terminal pede que o usuário selecione manualmente uma opção válida e autorizada.

A tabela abaixo lista os parâmetros que você pode enviar no Intent:

| Parâmetro | Tipo | Descrição | Obrigatório |
| :--- | :--- | :--- | :--- |
| `amount` | String | Valor da transação com duas casas decimais implícitas (por exemplo, "10000" = \$100.00). | Sim |
| `originalAmount` | String | Valor em moeda local para realizar a transação. | Sim |
| `tip` | String | Valor da gorjeta a ser somado ao total da transação. A representação decimal é a mesma do parâmetro amount (por exemplo, "500" = \$5.00). | Não |
| `waiterCode` | String | Código do garçom para atribuição da gorjeta. Obrigatório se uma gorjeta for informada. | Condicional |
| `receiptCode` | String | Código de identificação a ser impresso no recibo. | Sim |
| `callerId` | String | Identificador único para correlacionar a requisição com a resposta. | Sim |
| `paymentMethod` | String | Meio de pagamento: `"1"` para Cartão, `"2"` para QR Code. Se não for especificado, o usuário será solicitado a escolher. | Não |
| `installments` | String | Número de parcelas desejado. Aplicável somente a transações de crédito. | Não |
| `planId` | String | ID do plano de parcelamento. Consulte os planos disponíveis para o seu mercado. | Não |
| `interest` | String | Indica se o plano de parcelamento tem juros (`"true"`) ou é sem juros (`"false"`). | Não |
| `operationMode` | String | Define o modo de cálculo: `"0"` para manual (o terminal calcula) ou `"1"` para calculado (a aplicação calcula). Consulte o guia Estratégia de cálculo de juros. | Não |
| `skipConfirmation` | String | Defina como `"true"` para pular as telas de confirmação dos detalhes do parcelamento; `"false"` (padrão) exibe a tela normalmente - o usuário precisa interagir para prosseguir. | Não |
| `skipReceipt` | String | Defina como `"true"` para suprimir a tela de visualização do recibo do cliente após a aprovação. `"false"` (padrão) exibe a tela normalmente. | Não |
| `allowPrintCurrentTransaction` | String | Defina como `"true"` para a Getnet cuidar da impressão do recibo (comportamento padrão), `"false"` para receber os dados brutos do recibo. Consulte o guia Responsabilidade de impressão. | Não |

O bloco de código a seguir mostra um exemplo de como criar um pagamento parcelado:

```
private val REQUEST_CODE = 1001

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    val intent = Intent(Intent.ACTION_VIEW, Uri.parse("getnet://payment/v1/payment"))
    
    // Mandatory for Payment
    intent.putExtra("amount", "10000") // $100.00
    intent.putExtra("originalAmount", "10000")
    intent.putExtra("callerId", "123456")
    intent.putExtra("receiptCode", "654321")
    
    // Specific for Installments and Plans
    intent.putExtra("installments", 5) 
    intent.putExtra("planId", "plan_emisor")
    intent.putExtra("interest", "false")
    intent.putExtra("operationMode", "1") // Calculated mode
    intent.putExtra("skipConfirmation", "false")
    
    startActivityForResult(intent, REQUEST_CODE)
}
```

## Passo 3: trate a resposta

Depois que o cliente conclui a transação, o Getnet Payment App devolve os detalhes finais do plano confirmado para a sua aplicação via `onActivityResult`.

**Parâmetros de resposta**

A tabela a seguir lista os parâmetros de resposta que você recebe:

| Parâmetro | Tipo | Descrição |
| :--- | :--- | :--- |
| result | String | Resultado da transação: `"0"` indica sucesso. Consulte a referência Códigos de resultado para todos os códigos. |
| resultDetails | String | Mensagem detalhada sobre o resultado da transação (por exemplo, "APPROVED", descrições de erro) |
| amount | String | Valor final da transação com duas casas decimais implícitas |
| tip | String | Valor da gorjeta somado à transação (se informado) |
| waiterCode | String | Código do garçom para atribuição da gorjeta (se informado) |
| receiptCode | String | Código de identificação impresso no recibo |
| callerId | String | Identificador único enviado na requisição para correlacionar com a resposta |
| nsu | String | Código de autorização da transação na Getnet - único por terminal (não pode se repetir no mesmo dia) |
| authorizationCode | String | Código de autorização fornecido pelo emissor do cartão |
| paymentType | String | Tipo de pagamento usado: crédito, débito, voucher etc. |
| brand | String | Bandeira do cartão (por exemplo, "VISA", "MASTERCARD") |
| cardBin | String | Primeiros 8 dígitos do cartão (BIN) |
| cardLastDigits | String | Últimos 4 dígitos do cartão usado |
| inputType | String | Método de leitura do cartão: `"021"` (tarja magnética), `"051"` (chip), `"071"` (chip por aproximação), `"801"` (tarja magnética - fallback) |
| gmtDateTime | String | Data e hora GMT da transação (formato: MMDDhhmmss, GMT UTC 0) |
| installments | String | Número de parcelas confirmado para a transação |
| planId | String | Plano de parcelamento selecionado ou validado durante a transação |
| interest | String | Indica se houve juros: `"true"` (com juros) ou `"false"` (sem juros) |
| automationSlip | String | Dados do recibo em formato JSON (retornado quando `allowPrintCurrentTransaction = "false"`). Consulte o guia Responsabilidade de impressão. |

O bloco de código a seguir mostra um exemplo de tratamento da resposta:

```
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
    super.onActivityResult(requestCode, resultCode, data)
    
    if (requestCode == REQUEST_CODE && resultCode == RESULT_OK) {
        val extras = data?.extras
        val result = extras?.getString("result")
        
        if (result == "0") {
            // SUCCESS: Extract transaction details
            val installments = extras?.getString("installments")
            val planId = extras?.getString("planId")
            val interest = extras?.getString("interest")
            val nsu = extras?.getString("nsu")
            val authCode = extras?.getString("authorizationCode")
            val amount = extras?.getString("amount")
            
            Log.d("Payment", "Payment approved with $installments installments")
            Log.d("Payment", "Plan: $planId, Interest: $interest")
            Log.d("Payment", "NSU: $nsu, Auth Code: $authCode")
        } else {
            // FAILURE: Handle error
            val errorDetails = extras?.getString("resultDetails")
            Log.e("Payment", "Payment failed: $errorDetails (Code: $result)")
        }
    }
}
```

Exemplo de resposta bem-sucedida:

```json
{
  "result": "0",
  "resultDetails": "APPROVED",
  "amount": "10000",
  "installments": "5",
  "planId": "plan_emisor",
  "interest": "false",
  "callerId": "123456",
  "nsu": "57003",
  "authorizationCode": "004433"
}
```

## Próximos passos

* [Regras de parcelamento por país](/pt/app2app/reference-a2a/installment-rules) - os IDs de plano e as restrições de meio de pagamento por país.
* [Estratégia de cálculo de juros](/pt/app2app/core-concept-a2a/interest-calculation-strategy) - decida se o terminal ou a sua aplicação calcula os juros.