# Validación: correo, dominio y pagos

Este documento no incluye secretos. Distingue **implementado**, **verificado con pruebas** y **pendiente de acceso externo**.

## 1. Correo y dominio

**Implementado**

- En consola (colas, Artisan) las URLs salen de `APP_URL`.
- En HTTP se usa el host de la petición (evita CSRF 419).
- Producción debe usar `APP_URL=https://goberdata.com`, `APP_ENV=production`, `APP_DEBUG=false`.
- El aprovisionamiento de demo ya no se marca fallido si solo falla SMTP. El correo va en `SendDemoCredentials`.
- El reenvío de una demo vigente despacha el job de verdad (límite 3/hora por correo).
- Una solicitud pública no cambia contraseña ni roles de `super_admin` ni de dueños `client` / `internal_test`.

**Verificado con pruebas:** `FormularioDemoTest`, `WompiYQaPrivadoTest::test_solicitud_publica_no_toca_superadmin`.

**Pendiente:** entrega SMTP real en el servidor; rotar `MAIL_VERIFY_PEER=false` cuando el certificado coincida con `mail.vps101639.mylogin.co`. Tras cambiar `APP_URL` en el VPS: `php artisan config:clear` y reiniciar workers de cola.

## 2. Administración

| Uso | Ruta |
| --- | --- |
| Login | `/login` |
| Superadmin | `/superadmin/estadisticas` |
| Ambientes | `/superadmin/ambientes` |
| Cobros | `/superadmin/cobros` |
| Pasarelas plataforma | `/admin/payment-gateways` |
| Panel candidato | `/m/dashboard` |

Las contraseñas de seeders **no** son las vigentes. Restablecer de forma explícita:

```bash
php artisan goberdata:admin:reset-password correo@dominio --generate
```

La temporal se muestra una vez en la terminal. No la versionar.

## 3. Pagos

| Concepto | Estado |
| --- | --- |
| Adaptadores | Bold, Wompi, PayU en código |
| Membresías | tabla `platform_payment_gateways` (perfil `sandbox` / `production`) |
| Donaciones de campaña | tabla `payment_gateways` (distinta) |
| Proveedor elegido ahora | **Wompi sandbox** |
| Cobros reales | bloqueados (`PAYMENTS_ALLOW_LIVE_CHARGES=false`) |

Wompi:

- Checkout: SHA-256 `referencia + centavos + COP + integrity_secret`.
- Eventos: SHA-256 de `data.{properties}` + `timestamp` + `events_secret` (fixture oficial de la docs).
- `event_id` incluye estado para no perder `PENDING` → `APPROVED`.
- Un pago `is_test` no convierte demo/QA a cliente ni entra en MRR.

Bold webhook: HMAC-SHA256 de **Base64(cuerpo crudo)**, alineado a donaciones.

Cargar sandbox desde `.env` (local/QA, no producción):

```bash
php artisan goberdata:wompi:sandbox-sync
php artisan goberdata:wompi:sandbox-sync --activar
```

Probar conexión en `/admin/payment-gateways`. Un HTTP 404/500 no se marca `ok`.

Webhooks previstos (registrarlos en el comercio Wompi sandbox):

- `https://goberdata.com/webhooks/membresia/wompi` (producción)
- En local, una URL pública de túnel hacia el mismo path.

**Pendiente:** round-trip real en checkout.wompi.co con tarjeta `4242…` y webhook recibido; PayU no se declara verificado.

## 4. Despliegue de revisión (no ejecutar contra producción desde esta tarea)

1. Copiar migraciones, en especial `2026_09_27_100000_qa_interno_y_perfiles_pasarela.php`.
2. `php artisan migrate` (nunca `migrate:fresh`).
3. `php artisan config:clear && php artisan route:clear`.
4. `php artisan goberdata:qa:provision` solo en BD de desarrollo/QA.
5. Reiniciar queue workers para que usen el `APP_URL` nuevo.

## 5. CRUD del panel

Varias acciones del runtime Blade/JS (`guardarCampana`, eventos, QR) pueden seguir siendo en memoria. Eso **no** está cubierto como “aplicación completa”. El alcance de esta entrega es correo, acceso admin, Wompi sandbox, tenant privado y las protecciones listadas.
