/app/paidar/unam/
[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]
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)
?p= está presente → se usa ese valor, se guarda en localStorage, se salta confirmación en Pantalla 1 (solo muestra texto de bienvenida + botón "Empezar").?p= pero hay localStorage válido (< 30 días) → se precarga ese perfil, pero se muestra confirmación suave: "La última vez elegiste Operativo. ¿Es correcto?" [Sí / Cambiar].// 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
ref (tracking, separado del perfil)?ref=dxn_mant, ?ref=qr_poster, etc.paidar_unam_ref.src/_data/markets/unam/modulo1.json
{
"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.
┌─────────────────────────────┐
│ ProgressBar │
├─────────────────────────────┤
│ Título de pantalla │
├─────────────────────────────┤
│ Microlección (texto) │
│ [Ejemplos por perfil] │
├─────────────────────────────┤
│ Pregunta(s) │
│ [Opciones: radio/check] │
├─────────────────────────────┤
│ Microtip (colapsable) │
├─────────────────────────────┤
│ [Botón: Siguiente →] │
└─────────────────────────────┘
┌─────────────────────────────┐
│ 🟢 / 🟡 / 🔴 │
│ Título del semáforo │
│ Descripción (2 líneas) │
└─────────────────────────────┘
┌─────────────────────────────┐
│ 📋 Beneficios que ya tienes│
│ ▸ Seguro colectivo de vida │
│ ▸ Pago de marcha │
│ ▸ Fondo de retiro │
│ ▸ Prestaciones periódicas │
│ (texto completo colapsado) │
└─────────────────────────────┘
┌─────────────────────────────┐
│ [Continuar al Módulo 2] │ ← Botón primario
│ [Enviarme mi radiografía] │ ← Botón secundario
└─────────────────────────────┘
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
};
localStorage como paidar_unam_m1_state.completedAt = Date.now().// ── 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 %…"
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>
/* Mobile */ max-width: 640px
/* Tablet */ 641px – 1024px
/* Desktop */ 1025px+
/app/paidar/unam/m2 (o cambia estado del wizard a módulo 2).m1_completed: true en localStorage.moduleState.scores + profile + ref.UNAM-{profile}Claridad: verde / amarillo / rojoMargen: alto / medio / bajoCapacidadPrima: rangoPagoPreferido: nómina / tarjetaRef: valor de ref paramPara MVP: guardar en localStorage y/o enviar por webhook simple. Pipedrive se integra en Sprint 2.
| 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) |
| 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) |
/unam/) con selector de perfil.?p= + localStorage.modulo1.json./app/paidar/unam/ funciona sin parámetros (muestra selector).?p=operativo se salta selector y muestra bienvenida personalizada.