1. Subcategoría en modal descarte (catálogo completo + select)
2. Apartado sin monto mínimo (eliminada validación de 0,000)
3. PDF solo con propuesta elegida (no las 4)
4. Co-acreditado: checkbox 'no tiene' valida sin campos obligatorios
5. Documentos apartado: previsualizar + descargar (endpoint + frontend)
6. Oportunidades: sin duplicados, orden Confirmar→Afluencia→Cotizar→Aparto(verde)→Descartar
1. Notas propagan entre etapas (convertirLead/apartar updateMany)
2. Afluencia: conexión → aviso amarillo
3. Escrituración: click nombre abre bitácora
4. Co-acreditado: opción 'no tiene'
5. Nota del alta de lead → bitácora
6. Módulo Soporte: formulario + listado solicitudes
7. Captura visible para todos
Backend: mi-dia siempre local, vocabulario canónico, AplicacionPago con usuario
Mi día: modal español real, cita desde modal, score falso eliminado
Cotizador: barra sticky, persistencia local con folio
Alta Clientes: redirect eliminado, foto conectada, asesor desde sesión, refs dinámicas
Cobranza: contrato Mora arreglado, link a Plan, abono próximo pago, WhatsApp
Landing: contactos locales, ModalContacto eliminado, ModoTrabajo eliminado
Dashboards: MiTablero unificado, funnel con descartados, drill-down, rango fechas
Chat FRASA: corpus 5 desarrollos, 6 herramientas, historial conversaciones
69 archivos, 7 apps construidas
- Campo clienteClave en RecordatorioVendedor (hash nombre+telefono)
- Al crear nota: se calcula clienteClave del lead/cliente
- Al buscar notas: busca por leadId O clienteClave (no por nombre suelto)
- Mantiene compatibilidad: notas viejas sin clienteClave siguen por leadId
- Migración SQL aplicada
Hermes ahora puede:
- buscar_leads: buscar leads por nombre/teléfono/email
- ver_cliente: info completa de un cliente
- ver_oportunidades: pipeline de ventas con filtro por etapa
- ver_cobranza: resumen de pagos vencidos
Índices DB: LeadCaptura.nombreLead, Cliente.nombreCompleto, PlanPago.status
38 tests nuevos pasan.
1. Cancelar con motivo: Mis apartados y Escrituración piden motivo (modal reutilizado)
2. Origen BROCKER agregado en alta afluencia y captura rápida
3. Etapas oportunidades reordenadas: Agendo Cita → Afluencia → Cotizador
4. Cotizador: mensualidades diferibles (6, 12, 14, 18, 24 meses)
5. Calendario semanal por vendedor en Mi día
6. Hora en citas (datetime-local en vez de solo fecha)
7. Click en nombre → modal DetalleLeadModal (info + notas + historial)
- LeadMiDia ahora incluye campo 'desarrollo'
- Backend: mapeado desde Monday leads y desde LeadCaptura local
- Frontend: FilaLead muestra teléfono · desarrollo · origen
- resumenMiDiaLocal ahora retorna 'todosApartados' (APARTADO filtrado)
- Incluye terminales como Firma Cliente, Escriturado, Cancelo
- Escrituración filtra sobre estos y solo muestra fases de escrituración
- Admin ahora ve 10 apartados en Escrituración (3 con Firma Cliente)
- ResumenMiDia ahora incluye 'todosApartados' (todos los apartados
incluyendo terminales como Firma Cliente, Escriturado, etc.)
- Escrituración filtra sobre 'todosApartados' en vez de 'misApartados'
- Sin esto, Firma Cliente era terminal → se excluía de misApartados →
la pestaña Escrituración no lo encontraba
- 'Firma Cliente' y todas las fases de escrituración añadidas a ESTADOS_FINALES_APARTADO
- Al pasar a Firma Cliente, el apartado YA NO aparece en 'Mis apartados'
- Solo aparece en la pestaña 'Escrituración'
- Lead creation: validación por email y teléfono normalizados (últimos 10 dígitos)
- Si ya existe lead con mismo email/teléfono → 409 con aviso
- Alta Afluencia: nombre dividido en Nombre(s), Apellido Paterno, Apellido Materno
- Fix lada: strip robusto de +52 y +1 con/sin espacio
- Backend + frontend actualizados
- 'Cancelo' añadido a ESTADOS_FINALES_APARTADO (se remueve de la lista)
- Botón 'Agendo →' en Mis leads: color verde
- Botón 'Apartó' en Mis oportunidades: color verde
- Botón 'Firma cliente →' en Mis apartados: color verde
- Campo 'Medio de contacto' reemplazado por 'Número de dependientes'
- Dropdown con opciones: 1, 2, 3, 4, 5 o más
- Backend + frontend + tipos API actualizados
- FASES_APARTADO_PERMITIDAS: añadidas 7 fases de escrituración + Firma Cliente
- El endpoint /apartados/:id/estado ahora acepta todas las fases
- Verificado: cambio a 'Seguimiento' funciona correctamente
- esMio: admin/director_ventas/direccion_general ven todo
- Controller: admin carga todas las capturas y clientes (no solo las suyas)
- Admin ahora ve 123 leads + 8 ops + 5 apartados
- Firma Cliente (Venta) renombrada a Alta Enkontrol (mismo redirect a alta cliente)
- Campo 'Usuario Enkontrol' añadido en Datos Generales del alta cliente
- Unidad se bloquea (APARTADA) al pasar cliente a etapa Aparto
- Backend y frontend actualizados
- Rango salarial: input → select con 14 rangos (A-0 a M-100001)
- Lo quiere para: input → select con 2 opciones (Vivir / Inversión)
- Validación labels origen/desarrollo tolerante en backend (omitir si no existe)
- Redirect a /hoy/ después de crear afluencia o completar alta cliente
- saludMonday: cache modo_local_forzado con _modoLocalDb + setModoLocalDb
- index.ts: eagerly carga modo_local_forzado al startup
- convertirLeadEndpoint: crea LeadCaptura OPORTUNIDADES para ids loc_*
- escaneoOportunidades: crea LeadCaptura APARTADO con usuarioId y oportunidadId
- Mi día: esMio para apartados incluye oportunidadId
Flujo verificado en modo local:
1. Lead loc_* creado y asignado al capturista
2. Cambio de estado funciona (CONTACTADO → CALIFICADO)
3. Agendo crea oportunidad local (loc_*)
4. Aparto crea apartado local vinculado
5. Cola sync: 9 operaciones pendientes para cuando Monday vuelva
6. Mi día muestra apartados correctamente
Nuevas tablas:
- ActividadLocal (historial de llamadas, reuniones, tareas)
- AsignacionLocal (round-robin local)
- fechaLimite en LeadCaptura
Servicios nuevos:
- actividad-local.service.ts (CRUD actividades)
- local-canal.ts (canal de envío para recordatorios)
- seed-modo-local.js (activar modo local)
Mi día local mejorado:
- Mis actividades hoy (filtros usuario/fecha/estado)
- Apartados por vencer (con fechaLimite real)
- Equipo (contadores por vendedor, solo coordinador/admin)
- unidadCodigo en oportunidades desde datosJson
Automatizaciones locales:
- Round-robin: asigna leads sin vendedor + crea actividad
- Inactividad: detecta oportunidades >10 días sin update
- Escalado: alerta oportunidades >48h sin contacto
Reportes: actividadesAbiertas + parcial:false en modo local
Cron wiring: crons locales cuando Monday caído
661 tests verdes.
- misLeads: solo muestra items del tablero Leads (captura ligera)
- misOportunidades: muestra items del tablero Oportunidades (afluencia)
- Eliminado el merge que causaba que el mismo item apareciera en ambas
- apartadosPorVencer: filtrado por esMio (solo propios)
- Limpiado duplicado MONICA RODRIGUEZ VEGA de Monday Leads
- 630 tests verdes
1. apartadosPorVencer: filtrado por esMio — cada vendedor solo ve sus
propios apartados por vencer, no los de todos.
2. misLeads: excluye items que ya estan en misOportunidades — evita que
el mismo item aparezca en ambas pestanas (leads + oportunidades).
3. 630 tests verdes.
Cuando un lead se crea con Monday activo, aparece tanto en el tablero
Monday (misLeads) como en LeadCaptura (misCapturas). Filtrar de
'misCapturas' los items cuyo leadId ya existe en misLeads/misOportunidades
para evitar el duplicado visual que reportan los vendedores.
597 tests verdes.
- Las listas personales de Mi día (leads, oportunidades, apartados) se
calculan por captura local (LeadCaptura/Cliente + mapping
LeadOportunidad) ADEMÁS de la columna people de Monday: la app ya es
totalmente usable sin cuenta Monday
- Config MONDAY_VENDEDOR_COMPARTIDO_ID: cuando el usuario está ligado a
la cuenta compartida, la columna people se ignora para 'lo mío' (si
no, todos verían los leads de todos)
- scripts/vincular-vendedores-compartido.js: vincula todos los usuarios
con rol vendedor a la cuenta Monday compartida
- Tests: 478 API, verde; verificado en vivo con usuario sin Monday
El endpoint POST /oportunidades/:id/etapa en 'Aparto' ahora garantiza la
creación del apartado antes de responder (asegurarApartado con reintentos:
Monday tarda ~1s en propagar la etapa). Antes dependía del webhook y Mis
apartados recargaba antes de que existiera. El webhook y el cron quedan
como red de seguridad para cambios hechos directo en Monday (dedup
compartido, idempotente).
Al apartar, el seguimiento continúa en Mis apartados (pipeline Enkontrol),
así que 'APARTO' pasa a ser etapa terminal para la lista de trabajo (Mis
oportunidades y el merge de Mis leads). El conteo porEtapa del pipeline
personal la sigue incluyendo.
- Mis leads: botón 'Agendo →' convierte el lead en oportunidad (etapa
Agendo Cita, con sus datos, asesor = vendedor del lead o quien
convierte), marca el lead Calificado y guarda el mapping
LeadOportunidad; 409 si ya fue convertido
- Mis oportunidades: se quitan No Asistio y Abandono (redundantes con
Descartar); quedan Cotizar, Afluencia, Agendo Cita y Aparto
- Mis apartados: 'Firma cliente (venta) →' abre el alta de cliente con
TODO lo recolectado prellenado (ficha del apartado + contacto +
oportunidad + cotización vinculada vía GET /altas/prefill-apartado/:id)
- El alta con apartadoMondayId se LIGA al apartado existente y lo
enriquece (curp, teléfono, email, precio final, enganche, forma de
pago, unidad) en vez de crear un duplicado
- monday.service: actualizarApartado + ApartadoMonday con curp, forma de
pago, enganche y monto apartado
- Tests: 470 API + 120 alta-clientes + 16 mi-dia, verde
- GET /api/contactos/:id/detalle: todas las columnas del contacto, la
propiedad comprada/en proceso (apartado relacionado por teléfono/email,
enriquecido con el desarrollo de la unidad), quién atiende cada item
relacionado (leads/oportunidades/apartados, columna people) y el
historial completo de atención (activity log de los 4 tableros +
capturas y alta local con nombre del capturista)
- monday.service: getContactoDetalle (columnas por título),
getHistorialItems (todos los eventos del activity log por items) y
ApartadoMonday enriquecido (teléfono, email, precio final, fecha compra)
- Landing: la lista de Contactos abre un modal por cliente con datos,
propiedad, relaciones CRM (con quién atiende) y timeline de historial
- Tests: 465 API + 12 landing, verde