Módulo 1 — Wireframe técnico e instrucciones para el agente del repositorio

1. Arquitectura general

Ruta

/app/paidar/unam/

Comportamiento

Flujo de pantallas

[Lobby /unam/]
    │
    ▼
[Pantalla 1: Bienvenida + Perfil]
    │
    ▼
[Pantalla 2: Percepciones]
    │
    ▼
[Pantalla 3: Antigüedad]
    │
    ▼
[Pantalla 4: Deducciones]
    │
    ▼
[Pantalla 5: Neto y Margen]
    │
    ▼
[Pantalla 6: Resultados + Puente M2]

2. Mecanismo de personalización por perfil

Jerarquía de fuentes (prioridad)

1. URL param  →  ?p=operativo | ?p=administrativo | ?p=academico
2. localStorage  →  paidar_unam_profile (si existe y no expiró)
3. Selector  →  Pantalla 1 del módulo (usuario elige)

Reglas

Almacenamiento

// Al elegir perfil
localStorage.setItem('paidar_unam_profile', JSON.stringify({
  profile: 'operativo',   // operativo | administrativo | academico
  ts: Date.now()
}));

// Al leer: validar que ts < 30 días

Expiración

Parámetro ref (tracking, separado del perfil)


3. Estructura de datos del contenido

Archivo de contenido recomendado

src/_data/markets/unam/modulo1.json

Schema sugerido

{
  "moduleId": "m1",
  "title": "Fundamentos de Nómina UNAM",
  "duration": "6–8 min",
  "screens": [
    {
      "id": "s1",
      "title": "Bienvenida + Perfil",
      "objective": "Identificar perfil para personalizar",
      "lesson": {
        "universal": "Texto de bienvenida…"
      },
      "postSelection": {
        "operativo": "Texto operativo…",
        "administrativo": "Texto administrativo…",
        "academico": "Texto académico…"
      },
      "questions": [
        {
          "id": "q1",
          "text": "¿Cuál se parece más a tu función?",
          "type": "single",
          "options": [
            { "value": "operativo", "label": "Operativo…" },
            { "value": "administrativo", "label": "Administrativo…" },
            { "value": "academico", "label": "Académico…" }
          ]
        }
      ]
    }
  ],
  "glossary": [
    { "term": "Percepciones", "definition": "…" }
  ],
  "scoring": {
    "claridad": { },
    "margen": { },
    "capacidad": { },
    "antiguedad": { },
    "alertas": { }
  }
}

Nota: El contenido completo de cada screen, question, lesson y copy por perfil está en el archivo modulo-1-contenido.md. Este schema es la estructura técnica para consumirlo.


4. Componentes por pantalla

4.1 Componente: ProgressBar

4.2 Componente: ScreenLayout

┌─────────────────────────────┐
│  ProgressBar                │
├─────────────────────────────┤
│  Título de pantalla         │
├─────────────────────────────┤
│  Microlección (texto)       │
│  [Ejemplos por perfil]      │
├─────────────────────────────┤
│  Pregunta(s)                │
│  [Opciones: radio/check]    │
├─────────────────────────────┤
│  Microtip (colapsable)      │
├─────────────────────────────┤
│  [Botón: Siguiente →]       │
└─────────────────────────────┘

4.3 Componente: ProfileBadge

4.4 Componente: MicrotipCard

4.5 Componente: ResultCard (para Pantalla 6)

┌─────────────────────────────┐
│  🟢 / 🟡 / 🔴              │
│  Título del semáforo        │
│  Descripción (2 líneas)     │
└─────────────────────────────┘

4.6 Componente: BenefitsTeaser (colapsable, Pantalla 6)

┌─────────────────────────────┐
│  📋 Beneficios que ya tienes│
│  ▸ Seguro colectivo de vida │
│  ▸ Pago de marcha           │
│  ▸ Fondo de retiro          │
│  ▸ Prestaciones periódicas  │
│  (texto completo colapsado) │
└─────────────────────────────┘

4.7 Componente: CTABlock (Pantalla 6)

┌─────────────────────────────┐
│  [Continuar al Módulo 2]    │  ← Botón primario
│  [Enviarme mi radiografía]  │  ← Botón secundario
└─────────────────────────────┘

5. Gestión de estado (State Management)

Qué se almacena durante el flujo

const moduleState = {
  profile: 'operativo',        // Q1 o precargado
  ref: 'dxn_mant',             // de URL param
  answers: {
    q1: 'operativo',
    q2: 'a_veces',
    q3: '5_10',
    q4: '1_2',
    q5: ['prestamo', 'ahorro'],
    q6: 'no',
    q7: '10_30',
    q8: 'nomina'
  },
  scores: {
    claridad: 'amarillo',
    margen: 'medio',
    capacidad: '250_500',
    antiguedad_msg: '…',
    alertas: []
  },
  completedAt: null,            // timestamp al terminar
  contactCaptured: false
};

6. Lógica de scoring (pseudocódigo)

// ── SEMÁFORO DE CLARIDAD ──
if q2 == "no_casi_nunca" AND q4 != "no_seguro" AND q5.length > 0:
    claridad = "verde"
elif q2 == "si_seguido" AND (q4 == "no_seguro" OR "no_se" in q5):
    claridad = "rojo"
else:
    claridad = "amarillo"

// ── SEMÁFORO DE MARGEN ──
if q7 == "mayor_30" AND q6 == "no":
    margen = "alto"
elif q7 == "menor_10" OR (q4 == "3_mas" AND q6 == "si"):
    margen = "bajo"
else:
    margen = "medio"

// ── CAPACIDAD DE PRIMA ──
switch margen:
    "bajo"  → capacidad = "$100–$250"
    "medio" → capacidad = "$250–$500"
    "alto"  → capacidad = "$500+"

// ── ALERTA DE DEDUCCIONES ──
alertas = []
if q4 == "3_mas":
    alertas.push("Tienes 3+ compromisos activos en nómina…")
if q6 == "si":
    alertas.push("Las deudas con interés fuera de nómina…")

// ── MENSAJE DE ANTIGÜEDAD ──
switch q3:
    "menos_5"  → msg = "Tu compensación se acumula…"
    "5_10"     → msg = "Ya deberías ver un extra…"
    "11_20"    → msg = "Tu antigüedad ya representa…"
    "mas_20"   → msg = "Con más de 20 años, tu %…"

7. Personalización visual (CSS Variables por mercado)

En el layout base (paidar-unam.njk):

<style>
  :root {
    --paidar-primary: #0B3D91;       /* Azul UNAM */
    --paidar-primary-light: #1A5BB5;
    --paidar-accent: #C5A03F;        /* Dorado UNAM */
    --paidar-bg: #F8F9FA;
    --paidar-text: #1A1A2E;
    --paidar-success: #28A745;
    --paidar-warning: #FFC107;
    --paidar-danger: #DC3545;
  }
</style>

Tema por perfil (opcional, sutil):


8. Consideraciones responsive (Mobile-first)

Operativos (prioridad: celular)

Administrativos (celular + desktop)

Académicos (puede ser desktop)

Breakpoints sugeridos

/* Mobile */  max-width: 640px
/* Tablet */  641px – 1024px
/* Desktop */ 1025px+

9. Navegación y transiciones

Entre pantallas

Pantalla 6 → Módulo 2


10. Captura de contacto (lead capture)

¿Cuándo?

¿Qué se envía?

Integración futura (Pipedrive)

Para MVP: guardar en localStorage y/o enviar por webhook simple. Pipedrive se integra en Sprint 2.


11. Resumen de archivos a crear / modificar

Nuevos

Archivo Propósito
src/_data/markets/unam/modulo1.json Contenido: pantallas, copy por perfil, preguntas, opciones, glosario, scoring rules
src/app/paidar/unam/index.njk Lobby / policía de tránsito
src/app/paidar/unam/m1.njk Template del Módulo 1 (wizard)
src/_includes/components/paidar/progress-bar.njk Barra de progreso
src/_includes/components/paidar/screen-layout.njk Layout de pantalla (lesson + question + tip)
src/_includes/components/paidar/profile-badge.njk Badge de perfil activo
src/_includes/components/paidar/microtip-card.njk Tarjeta de tip colapsable
src/_includes/components/paidar/result-card.njk Tarjeta de resultado (semáforo)
src/_includes/components/paidar/benefits-teaser.njk Teaser de beneficios institucionales
src/_includes/components/paidar/cta-block.njk Bloque de CTAs
src/_includes/layouts/paidar-unam.njk Layout de PAIDAR UNAM (hereda de base)
src/assets/paidar/unam/styles.css CSS específico UNAM (variables, overrides)
src/assets/paidar/shared/wizard.js JS del wizard (navegación, estado, scoring, personalización)

Existentes a modificar (posiblemente)

Archivo Cambio
src/_includes/layouts/paidar-minimal-base.njk Crear si no existe; layout base compartido
src/_data/markets/unam.json Agregar metadata del mercado (theme, profiles, routes)

12. Orden de implementación sugerido (3 sprints)

Sprint 1 — Estructura + Lobby + Pantallas 1–5 (5–7 días)

Sprint 2 — Resultados + Scoring + Lead capture (3–5 días)

Sprint 3 — Pulido + Integración (3–5 días)


13. Criterios de aceptación (QA checklist)