feat: sitio comercial FSPM con micro CRM interno
Sitio público orientado a venta consultiva e implementación de las recomendaciones de la auditoría de marca y mercado: - Inicio con tres rutas (industria, riesgo, cumplimiento) y clasificador de riesgo en el héroe, contra el hallazgo de que el visitante tenía que inferir qué solución le correspondía. - Cinco páginas por segmento prioritario y catálogo comparable por clase de fuego, capacidad y agente. - Los claims sin evidencia por modelo quedan aislados y se presentan como compromiso de documentación, nunca como característica del producto. - SEO técnico completo: metadatos por página, sitemap derivado de los datos, JSON-LD, iconos y tarjeta social generadas. Micro CRM: - Captura por formulario embebido y por widget de WhatsApp que registra antes de abrir la conversación. - Atribución de primer toque que sobrevive a la navegación. - Deduplicación de contacto; un mismo contacto acumula oportunidades. - Motor de asignación por reglas con reparto por turno de respaldo. - Panel con dos roles de alcance distinto, tablero analítico, bitácora, pedidos y reglas. No enlazado desde el sitio público y con noindex. Empaquetado en Docker multietapa con la base de demostración horneada en la imagen y el volumen de datos separado, para que los leads capturados sobrevivan a los redespliegues. Co-Authored-By: Claude Opus 5 (1M context) <[email protected]>
This commit is contained in:
co-authored by
Claude Opus 5
parent
122e06a4bb
commit
01b817d098
@@ -0,0 +1,119 @@
|
||||
# Tarea: pruebas de calidad del sitio y del panel FSPM
|
||||
|
||||
Eres el agente de QA del proyecto. **No corriges código.** Tu trabajo es ejecutar
|
||||
las pruebas, reproducir lo que falle, y entregar un reporte que el orquestador
|
||||
pueda accionar sin volver a investigar desde cero.
|
||||
|
||||
Repo: `H:\MegaSync\Proyectos\fspm\fspm-web`
|
||||
|
||||
## Contexto
|
||||
|
||||
Sitio comercial de FSPM (protección contra incendios) con un micro CRM interno.
|
||||
Es una demostración para directivos: un error visible cuesta la venta del
|
||||
servicio, así que la barra es alta.
|
||||
|
||||
Lee `docs/CONTRATO.md` para conocer el sistema de diseño y las reglas de
|
||||
contenido, y `README.md` para entender el circuito de captura.
|
||||
|
||||
## Preparación — YA ESTÁ HECHA, no la repitas
|
||||
|
||||
El artefacto de producción **ya está construido y corriendo en un contenedor**:
|
||||
|
||||
- Imagen `fspm-web:demo`, contenedor `fspm-demo`, en `http://127.0.0.1:3100`.
|
||||
- Base sembrada: 5 usuarios, 60 contactos, 95 oportunidades, 18 pedidos, 6 reglas.
|
||||
- `curl http://127.0.0.1:3100/api/salud` responde `{"ok":true,...}`.
|
||||
|
||||
Playwright está configurado con `reuseExistingServer: true` apuntando al 3100,
|
||||
así que **usa ese contenedor y no arranques ningún servidor de desarrollo**.
|
||||
|
||||
**No corras `npm run build` ni `npm run dev` en esta máquina.** El repositorio
|
||||
vive dentro de una carpeta sincronizada a la nube y el cliente de
|
||||
sincronización mueve archivos de `.next` a media compilación: el build falla
|
||||
con `Cannot find module './NNNN.js'` aunque el código esté bien. Ya está
|
||||
comprobado. Si necesitas reiniciar la aplicación, usa
|
||||
`docker restart fspm-demo`.
|
||||
|
||||
Verifica que el contenedor responde antes de empezar:
|
||||
|
||||
```bash
|
||||
docker ps --filter name=fspm-demo
|
||||
curl -s http://127.0.0.1:3100/api/salud
|
||||
```
|
||||
|
||||
## Ejecución
|
||||
|
||||
```bash
|
||||
npm run test:e2e
|
||||
```
|
||||
|
||||
Cuatro proyectos: `escritorio-chromium`, `escritorio-webkit`, `movil-webkit`,
|
||||
`movil-chico` (320px). **Los dos de WebKit son obligatorios**: es el motor de
|
||||
Safari e iOS, donde más se rompe la responsividad, y el cliente lo pidió por
|
||||
nombre. Un resultado que solo cubre Chromium no sirve.
|
||||
|
||||
El servidor de pruebas lo arranca Playwright solo, en el puerto 3100.
|
||||
|
||||
Las suites:
|
||||
|
||||
- `tests/01-humo.spec.ts` — rutas, títulos, meta description, Open Graph,
|
||||
canónicas, sitemap, robots, iconos, 404.
|
||||
- `tests/02-responsivo.spec.ts` — desborde horizontal de 320 a 1440, menú
|
||||
móvil, widget de WhatsApp, tabla comparativa.
|
||||
- `tests/03-captura.spec.ts` — el circuito comercial: campaña → navegación →
|
||||
formulario, y que la atribución de primer toque sobreviva.
|
||||
- `tests/04-panel.spec.ts` — panel no expuesto, sesión obligatoria, y el
|
||||
aislamiento entre administrador y vendedor.
|
||||
- `tests/05-accesibilidad.spec.ts` — alt, etiquetas, jerarquía de encabezados,
|
||||
foco, movimiento reducido.
|
||||
|
||||
## Además de las pruebas automáticas: revisión visual
|
||||
|
||||
Toma capturas y **míralas**. Las pruebas no detectan que algo se ve mal.
|
||||
|
||||
```bash
|
||||
npx playwright screenshot --viewport-size=1440,900 http://127.0.0.1:3100/ tests/reporte/inicio-1440.png
|
||||
npx playwright screenshot --viewport-size=375,900 --full-page http://127.0.0.1:3100/ tests/reporte/inicio-375.png
|
||||
```
|
||||
|
||||
Hazlo para `/`, `/catalogo`, una ficha de producto, `/soluciones/industria-energia`
|
||||
y `/admin` tras entrar con el acceso rápido. Revisa en cada una:
|
||||
|
||||
- Texto encima de imagen: ¿se lee de verdad, o el degradado no alcanza?
|
||||
- Espaciado entre secciones: ¿hay saltos incoherentes o secciones pegadas?
|
||||
Es la falla típica cuando varios agentes escriben CSS en paralelo.
|
||||
- ¿Alguna sección se ve como plantilla genérica frente al resto?
|
||||
- ¿El riel de clases de fuego aparece consistente en sitio y panel?
|
||||
- ¿Hay estados vacíos que se vean como errores?
|
||||
- Contraste: ¿algún texto gris sobre fondo oscuro que no se alcance a leer?
|
||||
|
||||
## Sondeos manuales que valen la pena
|
||||
|
||||
1. **Doble envío.** Manda el formulario dos veces con el mismo correo y
|
||||
confirma en `/admin/contactos` que hay **un contacto con dos oportunidades**,
|
||||
no dos contactos. Es un requisito explícito del cliente.
|
||||
2. **Fuga entre roles.** Entra como vendedor, copia el id de una oportunidad
|
||||
que **no** sea suya (obtenlo entrando como administrador en otra pestaña) y
|
||||
pide `/admin/oportunidades/<id>` directo. Debe negarlo. Si la muestra, es
|
||||
una falla de seguridad y va primero en tu reporte.
|
||||
3. **Widget sin JavaScript de terceros.** Confirma que el enlace de WhatsApp
|
||||
que devuelve la API lleva el prefijo `[DEMO]` y el folio.
|
||||
4. **Panel en móvil real.** 375px de ancho: ¿las tablas se pueden usar o hay
|
||||
que hacer zoom?
|
||||
|
||||
## Reporte final — lo que necesito de ti
|
||||
|
||||
Nada de "todo pasó" ni de listas de pruebas verdes. Quiero:
|
||||
|
||||
1. **Resumen**: cuántas pruebas por proyecto, cuántas fallaron. Cifras reales,
|
||||
pegadas de la salida.
|
||||
2. **Fallas, ordenadas por gravedad.** Para cada una:
|
||||
- qué se rompe, en qué ruta y en qué proyecto/ancho;
|
||||
- el error literal de Playwright;
|
||||
- el archivo y la línea donde está la causa, si lo pudiste localizar;
|
||||
- si es una falla real del producto o una prueba mal escrita — dilo con
|
||||
claridad, no todo lo que falla es un bug.
|
||||
3. **Hallazgos visuales** de las capturas, con la ruta y el ancho.
|
||||
4. **Lo que no pudiste probar** y por qué.
|
||||
|
||||
Sé directo. Si algo está mal hecho, dilo con el argumento técnico. Un reporte
|
||||
complaciente no sirve de nada aquí.
|
||||
Reference in New Issue
Block a user