# Deep dive #12a — Legal: TOS, Privacy, Cookies, Refund Policy

**Status**: ✅ Sprint 1 técnico DONE (2026-05-04). 🟡 Pendiente revisión legal humana + integración por-demo opcional.
**Frente master**: #12a NOW
**Tiempo estimado**: 2-3 días total (incluye revisión legal humana). Sprint técnico: 45 min ✅.
**Doc operativo**: este archivo

---

## Por qué es NOW

Sin TOS / Privacy / Refund explícitos, **no podés escalar marketing pago**:
- Google Ads exige links a Privacy Policy + Terms en el sitio anunciado.
- Stripe Atlas / Wise / fiscalización exige Refund Policy publicada.
- Sin Refund explícito, cada refund es un caso negociado en privado → no escala + no queda registro estructurado del feedback.

Además es deuda mínima de compliance — Ley 25.326 (datos personales argentina) y Ley 24.240 (defensa del consumidor) ya aplican; estar en regla es buena práctica básica.

---

## Estado al iniciar este deep dive (2026-05-04)

### Existe (validado)

- `app/Http/Controllers/LegalController.php` — 44 líneas, 3 endpoints (terms, privacy, cookies), inyecta `company`, `contactEmail`, `effectiveDate`, `jurisdiction`.
- `routes/web.php` líneas 90-94 — 3 routes públicas: `/terms`, `/privacy`, `/cookies`.
- `resources/views/legal/_layout.blade.php` — layout compartido.
- `resources/views/legal/terms.blade.php` — 66 líneas, 12 secciones (Ley 24.240, Ley 25.326, GDPR, jurisdicción CABA).
- `resources/views/legal/privacy.blade.php` — 95 líneas, 11 secciones (GDPR + Ley 25.326 completos: derechos, retención, transferencias internacionales, seguridad).
- `resources/views/legal/cookies.blade.php` — 44 líneas (necesarias / analíticas opt-in / no marketing third-party).

### Falta

- ❌ **Refund Policy** como doc independiente (hoy vive como §3 dentro de terms.blade.php).
- ❌ **Links en footer** de los demos (los visitantes no pueden navegar a estas pages desde el sitio).
- ❌ **Smoke test** que valide que las pages cargan OK.
- ⚠️ **Validación legal profesional** — el controller mismo lo dice (línea 12): *"No constituyen asesoría legal — el equipo legal debe revisar antes de pasar a producción comercial real"*.

---

## Decisiones de negocio tomadas (2026-05-04)

### Refund Policy — política liberal "sin fricción"

> **Estrategia**: si un cliente está insatisfecho, devolverle el dinero. Capturar la razón como feedback de producto. Costo marginal vs evitar escalar el problema (legal, reputacional, soporte) es claramente ventajoso.

**Reglas operativas**:

| Aspecto | Decisión | Razón |
|---------|----------|-------|
| **Ventana** | Sin ventana fija — "en cualquier momento bajo causa razonable" | No queremos pelear con clientes por días. La Ley 24.240 garantiza 10 días sin causa, vamos más allá. |
| **Tipo** | Refund completo del último pago | Simplicidad. Sin pro-rateo. |
| **Excepciones** | Ninguna — incluso post-provisión | El refund es el feedback más caro: no lo bloqueamos. |
| **Proceso** | Email a `support@bewpro.com` con razón | Captura razón → ticket → análisis de patrón. Manual al inicio (poco volumen), automatizable después si hace falta. |
| **SLA respuesta** | 5 días hábiles | Holgado, realista para equipo chico. |
| **Comunicación al cliente** | Confirmación por email + Stripe refund evento | Trazabilidad. |
| **Recurrencia** | Cancelación inmediata de la suscripción tras refund | Coherente — si pidió refund, no debería seguir cobrando. |

**Lo que NO hacemos** (intencional):
- ❌ Pedir "razón válida" o validar el motivo del refund.
- ❌ Cobrar fee de procesamiento.
- ❌ Limitar a clientes "primera compra" — también para renovaciones.
- ❌ Imponer ventana de 14/30/60 días arbitraria.

**Lo que SÍ hacemos** (interno, no expuesto):
- ✅ Etiquetar el ticket de refund con razón estructurada (precio / producto / soporte / cambio de necesidad / otro).
- ✅ Reportar mensualmente la tasa de refund + razones top como input al roadmap de producto.
- ✅ Si un cliente pide refund de manera abusiva (ej. tercera vez en 6 meses), solo entonces se evalúa caso a caso.

---

## Plan de ejecución técnico

### Sprint 1 — DONE 2026-05-04 (~45 min)

| # | Acción | Archivo | Estado |
|---|--------|---------|--------|
| 1 | Crear este deep dive | `docs/bewpro2.0/roadmap/12a-legal.md` | ✅ |
| 2 | Crear vista Refund Policy | `resources/views/legal/refund.blade.php` (9 secciones, política liberal) | ✅ |
| 3 | Agregar método `refund()` al controller | `app/Http/Controllers/LegalController.php` | ✅ |
| 4 | Agregar route `/legal/refund` | `routes/web.php` línea 95 | ✅ |
| 5 | Actualizar §3 de `terms.blade.php` para apuntar al nuevo `/legal/refund` | `resources/views/legal/terms.blade.php` | ✅ |
| 6 | Crear partial reutilizable de links legales | `resources/views/layout/front/partials/_legal-links.blade.php` | ✅ |
| 7 | **Incluir el partial en `_footer.blade.php` orquestador** (1 cambio = 18 demos) | `resources/views/layout/front/partials/_footer.blade.php` | ✅ |
| 8 | Smoke test feature de las 4 pages + named routes | `tests/Feature/LegalControllerTest.php` (5/5 pass) | ✅ |
| 9 | Validar `php artisan view:cache` sin errores | — | ✅ |
| 10 | Documentar pendientes humanos | sección abajo | ✅ |

**Decisión clave del Sprint 1**: el partial `_legal-links` se incluye centralmente en el orquestador `_footer.blade.php` (no en cada uno de los 18 footers de demo). Razón: compliance debe ser CONSISTENTE — si un dev frontend olvida el include en 1 footer, ese sitio queda sin links legales = riesgo Google Ads. Con 1 cambio central, todos los 18 demos tienen los 4 links garantizados.

**Customización por demo**: si un demo quiere integrar los links DENTRO de su footer (estética) en lugar de la banda de abajo, puede ocultar la banda con CSS:

```css
html.demo-X .cd-legal-bar { display: none; }
```

Y luego incluir el partial donde le quede mejor:

```blade
@include('layout.front.partials._legal-links')
```

### Sprint 2 — distribuído (días, no bloqueante)

| # | Acción | Owner |
|---|--------|-------|
| 11 | Estilizar `.cd-legal-bar` por demo si la banda default no encaja visualmente | dev frontend (opcional, vía cd-frontend-dev) |
| 12 | **Revisión legal profesional** de TOS / Privacy / Cookies / Refund | abogado humano (pendiente — bloqueante para escalar ads en serio) |
| 13 | Setup banner de cookies con consent management activo | TBD — depende si vamos con vendor (Cookiebot, OneTrust) o build (simple JS) |
| 14 | Validar visualmente que la banda legal no rompe ningún demo en mobile | dev frontend (opcional) |
| 15 | Email `support@bewpro.com` activo + automatización de tickets de refund | ops + ¿desk tool? |

---

## Pendientes humanos (NO resuelvo yo)

⚠️ **Lo escrito en las views legal es draft funcional, NO asesoría legal**. Antes de escalar marketing pago serio o de cobrar a clientes nuevos en jurisdicciones complejas (UE, USA), validar con abogado:

1. **Términos comerciales del Refund** ya documentados acá → revisar si la política liberal expone más de lo aceptable o si está bien.
2. **TOS sección 7 (Limitación de responsabilidad)** — chequear que la cláusula "12 meses anteriores al incidente" sea aceptable.
3. **TOS sección 11 (Jurisdicción)** — confirmar que CABA es la elección correcta para nuestro caso.
4. **Privacy sección 4 (Compartimos con)** — chequear que la lista de proveedores esté completa y actualizada.
5. **Privacy sección 8 (Transferencias internacionales)** — validar que las cláusulas contractuales tipo estén formalmente aceptadas con cada proveedor (Stripe, Cloudinary, Backblaze, Google).
6. **Cookies §2.2 — Google Analytics** — validar que el opt-in implementado coincide con lo que dice el doc (banner de consent existe? captura cookie `cookie_consent`?).

**Checklist para "production-ready legal"**:

- [ ] Los 4 docs revisados por abogado y firmados como "v1 vigente"
- [ ] Banner de cookies funcionando con opt-in real (no solo decorativo)
- [ ] Email `support@bewpro.com` activo con SLA documentado
- [ ] Proceso de refund testeado end-to-end (email recibido → Stripe refund → cancelación de suscripción → confirmación al cliente)
- [ ] Métrica mensual de refunds + razones = ítem en review semanal/mensual del founder

---

## Convenciones aplicadas

- **Idioma**: español (target principal Argentina). Traducir a inglés solo si llegamos a clientes USA.
- **Jurisdicción**: Argentina, CABA. Compatible con GDPR cuando aplique (clientes UE).
- **Tono**: claro, conciso, sin jerga legal innecesaria. Mejor 1 párrafo entendible que 5 párrafos defensivos.
- **Variables del controller**: usar `{{ $company }}`, `{{ $contactEmail }}`, `{{ $effectiveDate }}` — facilita override por tenant si en el futuro otros productos usan estas pages.

---

## Smoke test post-implementación

```bash
# Después de aplicar Sprint 1, validar:
php artisan test --filter=LegalControllerTest

# O manualmente con servidor levantado:
curl -s http://localhost/terms    | head -1   # → <!DOCTYPE html>
curl -s http://localhost/privacy  | head -1
curl -s http://localhost/cookies  | head -1
curl -s http://localhost/refund   | head -1
```

---

## KPIs / éxito

| Métrica | Baseline | Goal 30 días |
|---------|----------|--------------|
| Pages legal accesibles | 3/4 (falta refund) | 4/4 ✅ |
| Links visibles en sitios de clientes | 0/18 demos | 18/18 ✅ |
| Refund SLA respuesta | sin SLA explícito | 5 días hábiles documentado |
| Refunds procesados sin escalación a queja pública | N/A | 100% |
| Tasa de refund (% sobre pagos del mes) | desconocida | medida y reportada en review mensual |

---

*Iniciado: 2026-05-04*. Sprint 1 técnico: ✅ DONE mismo día. Pendiente: revisión legal humana + Sprint 2 distribuído.
