# Pendiente para producción: Yape/Plin (QR) e Izipay

Ambas integraciones están construidas y con tests, pero no pueden procesar
pagos reales todavía porque no hay credenciales configuradas. Esta es la
checklist de lo que falta antes de anunciarlas a clientes reales.

## Yape / Plin (QR vía Culqi Órdenes)

- [ ] Confirmar con Culqi que la cuenta tiene **billeteras móviles (Yape/Plin)
      habilitadas** — no es automático, puede requerir contactar a soporte/ventas
      de Culqi además de tener la cuenta ya activa para tarjetas.
- [ ] Usa las **mismas** `CULQI_PUBLIC_KEY`/`CULQI_SECRET_KEY` que ya usa el pago
      con tarjeta — no se necesitan credenciales nuevas, solo que la cuenta
      tenga el producto de billeteras móviles activo.
- [ ] Configurar en **CulqiPanel → Eventos → Webhooks** una notificación hacia
      `https://<tu-dominio>/webhooks/culqi` (eventos de Órdenes).
- [ ] El dominio de producción debe ser **HTTPS real** — Culqi no puede avisar a
      `localhost`. Para probar antes de desplegar, usar un túnel como `ngrok`.
- [ ] Hacer un pedido de prueba real por un monto pequeño (dentro de S/6–S/500)
      y confirmar que:
  - El QR se muestra correctamente dentro del modal de Culqi.
  - El pedido pasa a "Pagado" solo (por webhook), sin depender únicamente del
    polling del navegador.
- [ ] **Puntos no verificados al 100% sin cuenta real** (revisar primero si algo
      falla) — están marcados en el código con el mismo tipo de advertencia
      usada para Yape por OTP:
  - `CulqiService::isOrderPaid()` asume que el campo `state` vale `'paid'`
    cuando la orden se pagó — ajustar si Culqi devuelve otro valor.
  - La estructura de `client_details` en `CulqiService::createOrder()`
    (`first_name`/`last_name`/`phone_number`) es un best-effort a partir del
    nombre del usuario — revisar si Culqi la rechaza por formato.
- [ ] **Reembolsos NO están automatizados para este método** — a propósito
      (`OrderService::refund()` lanza un error claro pidiendo hacerlo manual
      desde el panel de Culqi). Si se vuelve algo frecuente, hay que investigar
      el endpoint de reembolso de Órdenes antes de automatizarlo.

Archivos clave: `app/Services/Payments/CulqiService.php` (`createOrder`,
`getOrder`, `isOrderPaid`), `app/Http/Controllers/Webhooks/CulqiWebhookController.php`,
`app/Http/Controllers/Checkout/CulqiQrCheckoutController.php`.

## Izipay

- [ ] Afiliarse como comercio con Izipay (según su documentación, se hace vía un
      asesor comercial, no es autoservicio).
- [ ] Obtener las 4 credenciales desde el panel de Izipay y ponerlas en `.env`:
  - `IZIPAY_USERNAME`
  - `IZIPAY_PASSWORD`
  - `IZIPAY_PUBLIC_KEY`
  - `IZIPAY_HMAC_KEY`
  - (`IZIPAY_BASE_URL` normalmente no cambia entre pruebas y producción, pero
    confirmar con Izipay si usan URLs distintas)
- [ ] Configurar en el panel de Izipay la **URL de notificación IPN** hacia
      `https://<tu-dominio>/webhooks/izipay`.
- [ ] Mismo requisito de **HTTPS real** (o `ngrok` para probar localmente antes
      de desplegar).
- [ ] Hacer un pago de prueba real con tarjeta de prueba y confirmar que:
  - El widget de Izipay carga y acepta el pago.
  - El pedido se confirma tanto por el redirect del navegador como (idealmente
    probar también) por el webhook.
- [ ] **Puntos no verificados al 100% sin cuenta real**:
  - `OrderService::confirmIzipayPayment()` asume que el id de transacción está
    en `transactions.0.uuid` dentro de `kr-answer` — ajustar si el campo real
    tiene otro nombre/ubicación.
  - `IzipayService::refund()` llama a `Charge/CancelOrRefund` por convención
    del API Lyra, pero no se pudo confirmar el path exacto sin cuenta real —
    es el primer lugar a revisar si un reembolso de Izipay falla.

Archivos clave: `app/Services/Payments/IzipayService.php`,
`app/Http/Controllers/Checkout/IzipayCheckoutController.php`,
`app/Http/Controllers/Webhooks/IzipayWebhookController.php`.

## Común a ambos

- [ ] Confirmar que `bootstrap/app.php` sigue excluyendo `webhooks/*` y
      `checkout/izipay/*/confirmar` de la verificación CSRF (ya está hecho, solo
      no romperlo en cambios futuros).
- [x] ~~Revisar `.env.example`~~: `CULQI_*`, `NUBEFACT_*` e `IZIPAY_*` ya están
      documentados ahí (con valores vacíos, como corresponde) — quien clone el
      repo los ve sin tener que leer `config/services.php`.
