# Crear un pago preautorizado

Las transacciones de preautorización le permiten verificar la validez de la tarjeta y reservar fondos sin una captura inmediata. Este es un proceso de dos pasos: crear la preautorización y confirmarla más tarde (capturar los fondos).

Esta guía le explica cómo crear preautorizaciones, almacenar referencias de transacciones y confirmar (capturar) los fondos reservados.

## Requisitos

Antes de comenzar, asegúrese de tener:

- **Permiso de preautorización** habilitado en su cuenta de comercio (código de servicio `100101` o `100201`)
- **SDK inicializado** con entorno y licencia a través de `CommonUtils`
- **PIN pad conectado** e inicializado (recibió `PinpadConfig` de `onInitFinished`)
- **Delegados implementados**: `RedsysDelegateGeneric`, `RedsysBTPinpadInitDelegate`, `RedsysBTPinpadPaymentDelegate`

<Callout type="warning">

Use `peticionPerfilComercio` para verificar que su cuenta tiene `permitePreauto` establecido en `YES` antes de intentar realizar preautorizaciones.

</Callout>

## Proceso de preautorización

### Paso 1: Crear la preautorización

Para iniciar una preautorización, use el método `payWithPinpadBluetooth` con un `PagoDTO` configurado para el tipo de preautorización.

**Configurar el PagoDTO**

Cree el DTO de pago y establezca el tipo de transacción en `PREAUTORIZACION`:

```
// Importar vía Bridging Header: PagoDTO.h
func createPreauthorization() {
    let amount: Float = 150.00  // Monto máximo a reservar

    // Inicializar PagoDTO con monto en céntimos
    let pagoDTO = PagoDTO(
        valor: Int(amount * 100),  // 15000 céntimos = €150.00
        mMoneda: 978,              // Código de moneda ISO 4217 (978 = EUR)
        nFactura: "PREAUTH001",    // Número de factura único
        email: "",
        tlfCliente: "",
        datosPropietarios: ""
    )

    // Establecer tipo de transacción a Preautorización
    pagoDTO.setTipoPago("PREAUTORIZACION")

    // Ejecutar la preautorización
    executePreauth(pagoDTO)
}
```

**Ejecutar Preautorización**

Use el mismo método `payWithPinpadBluetooth` que para los pagos regulares:

```
func executePreauth(_ pagoDTO: PagoDTO) {
    // Crear MerchanDTO con campos requeridos
    let merchantDTO = MerchanDTO()
    merchantDTO.fuc = "999008881"
    merchantDTO.fucExtendido = "999008881"
    merchantDTO.terminal = "001"
    merchantDTO.password = "merchant_pass"

    // Ejecutar preautorización
    pinpadManager.payWithPinpadBluetooth(
        selectedDevice,
        merchan: merchantDTO,
        config: pinpadConfig,
        andPagoDTO: pagoDTO,
        withDelegate: self
    )
}
```

El SDK maneja la lectura de la tarjeta, la entrada del PIN y la comunicación con la pasarela. El cliente debe presentar su tarjeta para establecer la reserva de fondos.

### Paso 2: Almacenar referencias de transacción

Cuando la preautorización es exitosa, el delegado `onPaymentFinished` recibe un `RespuestaTransaccionDTO`. **Debe almacenar el `identificadorRTS`** para confirmar la operación más tarde:

```
func onPaymentFinished(_ result: RespuestaTransaccionDTO!, orError error: Error!) {
    if let transaction = result, error == nil {
        // Verificar estado de la transacción
        if transaction.estado == "F" {  // F = Finalizada
            if transaction.resultado == "Autorizada" {
                // Preautorización exitosa
                let rtsID = transaction.identificadorRTS ?? ""
                print("Pre-auth exitosa. ID RTS: \(rtsID)")

                // Almacenar ID RTS para confirmación posterior
                savePreAuthReference(rtsID: rtsID, forBooking: bookingID)
            }
        }
    } else {
        print("Preautorización fallida: \(error?.localizedDescription ?? "")")
    }
}
```

El `identificadorRTS` es una cadena de 24 caracteres que identifica de forma única la transacción de preautorización. Este ID es **requerido** para confirmar o cancelar la transacción más tarde.

| Campo | Propósito |
| :---- | :---- |
| `identificadorRTS` | Identificador de 24 caracteres para confirmación (requerido) |
| `estado` | Estado de la transacción: "F" (Finalizada), "P" (En proceso), "A" (Anulada) |
| `resultado` | Resultado de la transacción: "Autorizada", "Denegada" |

<Callout type="warning">

Las preautorizaciones caducan si no se confirman. Consulte su contrato de comercio para conocer las políticas de expiración específicas.

</Callout>

### Paso 3: Confirmar la preautorización

Para capturar los fondos, realice una operación de confirmación. Esto requiere el `identificadorRTS` original del Paso 2.

**Consultar y Confirmar Usando Filtros**

El SDK usa filtros de consulta para gestionar las confirmaciones:

```
// Importar vía Bridging Header: ConsultaFechasDTOFiltros.h, RedsysTransactionManager.h
func confirmPreauthorization(rtsID: String) {
    // Crear filtro para operaciones de confirmación
    let filtros = ConsultaFechasDTOFiltros()
    filtros.setTipoOperacion("CONFIRMACION")

    // Crear DTO de consulta con el identificador RTS
    let consulta = ConsultaFechasDTO()
    // Configurar consulta con datos del terminal e ID RTS

    // Ejecutar consulta de confirmación
    RedsysTransactionManager.peticionConsultaFechaPagina(
        consulta,
        conValores: filtros.dictValores()
    ) { result, error in
        if let operations = result, error == nil {
            // Procesar resultado de confirmación
            print("Confirmación procesada")
        } else {
            print("Confirmación fallida: \(error?.localizedDescription ?? "")")
        }
    }
}
```

La confirmación captura los fondos reservados. El monto final puede ser menor o igual al monto originalmente preautorizado. Si captura menos, los fondos restantes se liberan de nuevo al saldo disponible del cliente.

<Callout type="warning">

No puede confirmar un monto mayor que la preautorización original. Esto resultará en un error: "No es posible realizar más confirmaciones sobre la preautorización original."

</Callout>

### Paso 4: Cancelar una preautorización (opcional)

Si el servicio se cancela y desea liberar los fondos reservados inmediatamente, realice una cancelación. Las preautorizaciones que no se confirman caducan automáticamente después de su período de validez (típicamente 7 días), pero la cancelación explícita proporciona una liberación inmediata de fondos.

Use el filtro de consulta con el tipo `PREAUTORIZACION` para identificar y cancelar la transacción específica usando el `identificadorRTS` almacenado.

## Restricciones técnicas clave

| Requisito | Descripción |
| :---- | :---- |
| **Identificador RTS** | Debe almacenar el `identificadorRTS` de la preautorización original para confirmar más tarde |
| **Límite de Monto** | El monto de confirmación no puede exceder el valor preautorizado original |
| **Coincidencia de Moneda** | La moneda debe coincidir con el código de moneda de la transacción original |
| **Estado de Transacción** | Verifique siempre `estado == "F"` y `resultado == "Autorizada"` antes de considerar el éxito |
| **Límites de Confirmación** | No puede realizar más confirmaciones de las permitidas por la preautorización original |

## Mejores prácticas

**Almacenar Referencias de Transacción**

Guarde el `identificadorRTS` en su base de datos indexado por referencia de reserva o servicio:

```
func savePreAuthReference(rtsID: String, forBooking bookingID: String) {
    // Vincular ID RTS al registro de reserva
    database.save(rtsID: rtsID, bookingID: bookingID, expiration: Date().addingTimeInterval(7*24*60*60))
}
```

**Implementar Seguimiento de Caducidad**

Monitoree las preautorizaciones que se acercan a su expiración e indique al personal que las finalice o cancele antes de que ocurra la expiración automática.

**Comunicar con los Clientes**

Explique claramente a los clientes cuándo se realizan las preautorizaciones y cuándo se finalizarán para reducir la confusión sobre cargos pendientes en sus estados de cuenta.

## Solución de problemas

**Comercio No Habilitado para Preautorizaciones**

Si recibe el error "El comercio no tiene habilitada la operativa de Preautorizaciones", contacte al soporte de Get Mini para habilitar los permisos de preautorización en su cuenta de comercio.

**Preautorización Caducada**

Si la confirmación falla con errores de expiración, la preautorización excedió su período de validez. Procese una nueva venta por el monto real del cargo.

**Límite de Confirmación Excedido**

El error "No es posible realizar más confirmaciones sobre la preautorización original" significa que ya ha capturado el máximo de confirmaciones permitidas. Verifique su historial de transacciones para intentos de confirmación previos.

**Desajuste de Moneda**

La moneda en la confirmación debe coincidir con la moneda de la preautorización original. Verifique que ambas transacciones usen el mismo código de moneda ISO 4217.

## Próximos pasos

Explore operaciones de pago relacionadas:

* [Crear una venta](/es/get-mini/ios-sdk/guides/single-step-payment-ios) - Transacciones de venta estándar
* [Ciclo de vida de la transacción](/es/get-mini/ios-sdk/core-concepts/ios-lifecycle) - Entender las fases de procesamiento de transacciones
* [Seguridad y licencias](/es/get-mini/ios-sdk/core-concepts/security-pci) - Aprender sobre seguridad de pagos