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,61 @@
|
||||
import { defineConfig, devices } from "@playwright/test";
|
||||
|
||||
/**
|
||||
* Configuración de pruebas de extremo a extremo.
|
||||
*
|
||||
* WebKit está incluido a propósito y no es opcional: es el motor de Safari e iOS,
|
||||
* donde más se rompe la responsividad, y el cliente lo pidió explícitamente.
|
||||
* Una prueba que solo pasa en Chromium no prueba responsividad.
|
||||
*/
|
||||
|
||||
const PUERTO = 3100;
|
||||
const BASE = `http://127.0.0.1:${PUERTO}`;
|
||||
|
||||
export default defineConfig({
|
||||
testDir: "./tests",
|
||||
fullyParallel: true,
|
||||
forbidOnly: true,
|
||||
retries: 1,
|
||||
workers: 3,
|
||||
timeout: 45_000,
|
||||
expect: { timeout: 8_000 },
|
||||
reporter: [
|
||||
["list"],
|
||||
["json", { outputFile: "tests/reporte/resultado.json" }],
|
||||
["html", { outputFolder: "tests/reporte/html", open: "never" }],
|
||||
],
|
||||
use: {
|
||||
baseURL: BASE,
|
||||
locale: "es-MX",
|
||||
timezoneId: "America/Mexico_City",
|
||||
trace: "retain-on-failure",
|
||||
screenshot: "only-on-failure",
|
||||
video: "off",
|
||||
},
|
||||
projects: [
|
||||
{
|
||||
name: "escritorio-chromium",
|
||||
use: { ...devices["Desktop Chrome"], viewport: { width: 1440, height: 900 } },
|
||||
},
|
||||
{
|
||||
name: "escritorio-webkit",
|
||||
use: { ...devices["Desktop Safari"], viewport: { width: 1440, height: 900 } },
|
||||
},
|
||||
{
|
||||
name: "movil-webkit",
|
||||
use: { ...devices["iPhone 13"] },
|
||||
},
|
||||
{
|
||||
name: "movil-chico",
|
||||
use: { ...devices["Desktop Chrome"], viewport: { width: 320, height: 640 }, isMobile: false },
|
||||
},
|
||||
],
|
||||
webServer: {
|
||||
command: `npm run start -- --port ${PUERTO}`,
|
||||
url: `${BASE}/api/salud`,
|
||||
reuseExistingServer: true,
|
||||
timeout: 180_000,
|
||||
stdout: "pipe",
|
||||
stderr: "pipe",
|
||||
},
|
||||
});
|
||||
Reference in New Issue
Block a user