# Implementer evidence — CLUB-002 ## Resumen Implementé la primera superficie frontend/PWA del Club sobre el backend de CLUB-001. ## Qué se añadió ### 1) Proxy Next.js para Club - `project/frontend/src/app/api/club/[...path]/route.ts` Función: - reenviar `GET/POST/PATCH` al backend - propagar cookies entrantes - reenviar `set-cookie` del backend para conservar `mdv_club` same-origin ### 2) Rutas frontend del Club - `project/frontend/src/app/club/page.tsx` - `project/frontend/src/app/club/join/page.tsx` - `project/frontend/src/app/club/card/page.tsx` - `project/frontend/src/components/club/ClubExperience.tsx` Comportamiento: - landing Club - alta anónima desde `POST /api/club/join` - tarjeta digital con `memberCode`, saldo y movimientos recientes - CTA para abrir la tarjeta cuando ya existe identidad Club en el dispositivo - bloque de instalación PWA usando `beforeinstallprompt` ### 3) Manifest e iconos PWA - `project/frontend/src/app/manifest.ts` - `project/frontend/public/images/club-icon-192.png` - `project/frontend/public/images/club-icon-512.png` Además: - `project/frontend/src/app/layout.tsx` ahora declara manifest + metadata Apple Web App + viewport themeColor. ### 4) Descubribilidad en storefront - enlace `Club` añadido en header y footer. ## Decisiones de implementación - Reutilicé un único componente cliente `ClubExperience` para `/club`, `/club/join` y `/club/card`. - El frontend consume el backend Club vía proxy Next same-origin para que la cookie `mdv_club` quede gestionada correctamente por el navegador. - La tarjeta muestra una credencial visual móvil basada en `memberCode` y deja el contrato final de lectura en caja para CLUB-003, como estaba previsto en la fase TPV. ## Validación ejecutada - `cd project/frontend && npm run build` ✅ - `./scripts/verify.sh` ✅ - `git diff --check` ✅ ## Riesgos / siguiente paso - CLUB-003 debe cerrar el contrato exacto de identificación en TPV/caja para usar la tarjeta digital también en escaneo/lectura operativa. - Conviene hacer smoke manual real en navegador/móvil para comprobar el prompt de instalación y la persistencia de `mdv_club` después de `POST /club/join`.