# Task: Redsys Sales Registration Fix

## Estado actual al cierre de sesión (2026-02-19)

La implementación está completa. Pendiente de verificación:

- `authorize()` ya NO espera el IPN — lee el `redsys_pending_{order_id}` Transient generado al abrir el popup
- Si el IPN llega antes del form submit → se usa (datos más precisos)
- Si el IPN llega después → `handle_ipn()` lo detecta via `_redsys_order_id` meta

## Checklist

- [x] Analizar causa raíz: race condition IPN vs form submission
- [x] Diseñar flujo `authorize()` + Transient (aprobado)
- [x] Reescribir `class-gf-redsys.php` con flujo authorize()
- [x] Fix: `GFFormsModel::get_field_values()` → usar `create_lead()`
- [x] Fix race condition: authorize() sin sleep loop
- [x] authorize() confía en el "pending transient" (generado por nuestro server)
- [x] handle_ipn() actualizado: NO borra el pending transient, busca entry ya creada
- [x] Añadido `save_order_id_to_entry()` via `gform_after_submission` hook
- [x] JS: delay subida de 500ms → 3000ms
- [x] **VERIFICADO: Pago de prueba completo**
- [x] Confirmar entry aparece como "Paid" en GF Entradas
- [x] Confirmar venta se registra en GF Sales Stats (Dashboard)
- [x] Probar pago fallido / cancelado

## Archivos clave modificados

| Archivo | Cambios |
|---|---|
| `includes/class-gf-redsys.php` | Reescritura completa: authorize(), get_params_ajax(), handle_ipn(), save_order_id_to_entry() |
| `assets/js/gf-redsys.js` | Delay de 500ms → 3000ms antes de enviar el formulario |
