# Devolver un pago

Esta guía explica cómo devolver (o cancelar) un pago aprobado previamente con la operación `Refund` del TPV Integrado.

## ¿Qué es una devolución?

La operación Refund revierte una venta completada, de forma total o parcial. Puedes ejecutarla el mismo día de la venta original o dentro de un plazo de hasta 365 días. Si no envías algún parámetro, el TPV muestra las pantallas de entrada correspondientes. El manual usa el término "Cancellation" para este comando.

## Antes de comenzar

Antes de emitir una devolución:

* Debes crear un Connector y validarlo con `Polling`
* El Modo TPV Integrado debe estar activo
* La transacción original debe ser elegible para la devolución

## Paso 1: Ejecuta la devolución

Para realizar una devolución, llama a la operación `Refund` con los datos de la transacción original. La mayoría de los parámetros son opcionales: si faltan, el TPV los solicita en pantalla. Enviarlos hace que el flujo de automatización sea más fluido.

| Parámetro | Tipo | Obligatorio | Descripción |
| :--- | :--- | :--- | :--- |
| `AuthorizationCode` | String | No | Código de autorización de la transacción original (por ejemplo, el "AUT" del recibo o el de la respuesta de Sale). |
| `OriginTransDate` | Date | No | Fecha de la transacción original, en formato ISO8601 con zona horaria. No puede ser posterior a la fecha actual. |
| `Amount` | Long | No | Importe de la devolución en moneda local. Si se omite, se devuelve el importe total (se admiten devoluciones parciales). |
| `SkipConfirmation` | Bool | No | Omite la pantalla de confirmación. |
| `SkipReceipt` | Bool | No | No imprime el recibo del cliente. |
| `PrintOnPos` | Bool | No | Imprime en el TPV o devuelve el contenido del recibo. Consulta el Capítulo 4 Responsabilidad de impresión. |
| `RefundType` | Enum | No | Qué parte de una venta se devuelve: `SaleWithdrawal` (venta y retiro), `Sale` (solo la venta) o `Withdrawal` (solo el retiro). |

<Callout type="note">

Si omites información obligatoria, el TPV la solicita en pantalla. El TPV y el adquirente aplican las reglas de elegibilidad y de devolución parcial. Puedes emitir varias devoluciones sobre la misma transacción original hasta que la suma de sus importes alcance el total original.

</Callout>

El siguiente ejemplo muestra cómo iniciar una devolución de una venta aprobada previamente. La fecha de la transacción (`OriginTransDate`) no puede ser posterior a la fecha actual; la fecha que devuelve la venta original es un valor válido.

```csharp
var refundRequest = new RefundRequest
{
    AuthorizationCode = "551437",
    OriginTransDate = originalSale.AccountingDate,
    Amount = 10000
};

var refundResult = await connector.RefundAsync(refundRequest);
```

## Paso 2: Gestiona la respuesta

Cuando el procesamiento es exitoso, el TPV devuelve una respuesta estructurada con el resultado de la reversión. Los siguientes campos **siempre están presentes** en una respuesta de devolución exitosa:

```json
{
  "Code": 0,
  "Message": "APPROVED",
  "CommerceCode": "1234567890",
  "TerminalId": "GET00123",
  "AuthorizationCode": "654321",
  "NsuLastSuccessfulMessage": "123456789",
  "ReceiptContent": null
}
```

Donde:

| Campo | Tipo | Obligatorio | Descripción |
| :--- | :--- | :--- | :--- |
| `Code` | Int | Sí | Código de respuesta. `0` indica éxito. |
| `Message` | String | Sí | Mensaje de resultado (por ejemplo, `APPROVED`). |
| `CommerceCode` | String | Sí | Código de sucursal aprobado por Getnet para procesar transacciones. |
| `TerminalId` | String | Sí | Código del terminal TPV. |
| `AuthorizationCode` | String | Sí | Código de autorización de la transacción de devolución. |
| `NsuLastSuccessfulMessage` | String | Sí | Último mensaje NSU. |
| `ReceiptContent` | Dict | No | Contenido estructurado del recibo. Es `null` cuando `PrintOnPos` es `true`. Consulta [Responsabilidad de impresión](/es/integrated-pos/core-concepts-pos/printing-responsibility). |

<Callout type="note">

`ReceiptContent` es `null` cuando la solicitud define `PrintOnPos` como `true`: el terminal imprime el recibo en lugar de devolverlo.

</Callout>

Verifica siempre los campos `Code` y `Message` antes de confirmar la devolución en tu sistema.

## Siguientes pasos

* Para saber cómo procesar ventas que generan códigos de autorización, consulta la guía [Pago en un solo paso](/es/integrated-pos/pos-payment-guides/single-step-payment).
* Para controlar la impresión de recibos y obtener el contenido del recibo, consulta la guía [Responsabilidad de impresión](/es/integrated-pos/core-concepts-pos/printing-responsibility).
* Para una referencia completa de los parámetros y valores de retorno de Refund, consulta la [Referencia de métodos y parámetros](/es/integrated-pos/reference/methods-parameters).