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
- Eliminado NotasApartado import y JSX
- Eliminado apartadoSeleccionado state
- Eliminado onClick/tabIndex/role del card de apartado
- El único modal es DetalleLeadModal (se abre al click en el nombre)
- 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
- Las notas se buscan por leadId O por nombre del cliente
- Al convertir lead→oportunidad, las notas siguen visibles
- Funciona en todas las etapas: lead, oportunidad, apartado, escrituración
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
- Escrituración ahora solo muestra fases ACTIVAS:
Firma Cliente, Seguimiento, Llamada Escrituras, X Escriturar,
Banco/Infonavit, X Autorizar
- Cancelo y Escriturado son terminales → se remueven de la lista
- 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
- Al dar click en 'Firma Cliente', ahora primero cambia el estado del
apartado a 'Firma Cliente' y DESPUÉS cambia a la pestaña Escrituración
- Antes solo cambiaba la pestaña sin cambiar el estado
- Escrituración solo muestra apartados en fases: Seguimiento, Llamada Escrituras, X Escriturar, Banco/Infonavit, X Autorizar, Escriturado, Cancelo, Firma Cliente
- Ya no muestra apartados que están en Pago Apartado, Alta Enkontrol, etc.
- Solo llegan a Escrituración cuando se da click en 'Firma Cliente'
- Aparto en Mis oportunidades: botón verde (bg-green-600)
- Firma Cliente en Mis apartados: botón verde (bg-green-600)
- Los demás botones mantienen su estilo actual
- 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
- Nombres de tabs acortados: Leads, Oportunidades, Apartados, Escrituración, Tablero
- Barra scrollable en móvil (overflow-x-auto)
- Botones Exportar y Kanban más compactos (px-2 py-1 text-[11px])
- Sin wrap: todo en una fila con scroll horizontal
- Eliminado botón kanban duplicado en contenido de 'Mis leads'
- Botón 'Exportar' movido al final de la barra de pestañas (junto a Kanban)
- Exportar aparece en leads, oportunidades y apartados
- Un solo botón Kanban/Lista visible en todas las pestañas
- Botón Kanban/Lista movido al final de la barra de pestañas
- Visible en todas las pestañas (leads, oportunidades, apartados, escrituración)
- Eliminado botón duplicado del contenido principal
- TabsCrm recibe vistaKanban + onToggleKanban como props
- KanbanView genérico: acepta items, columnas y extractor de columna
- Kanban en Mis leads (5 columnas: Nuevo/Contactado/Interesado/Agendo/Descartado)
- Kanban en Mis oportunidades (5 columnas: Afluencia/Cotizador/Agendó/Apartó/Perdido)
- Kanban en Mis apartados (7 columnas: Pago Apartado → Cancelación)
- Kanban en Escrituración (7 columnas: Seguimiento → Canceló)
- Drag & drop funcional en todas las pestañas
- Layout full-width en modo kanban
- Nueva pestaña 'Escrituración' después de 'Mis apartados'
- 7 fases: Seguimiento, Llamada Escrituras, X Escriturar, Banco/Infonavit, X Autorizar, Escriturado, Cancelo
- 'Firma Cliente' en Apartados mueve a pestaña Escrituración
- Backend: fases de escrituración añadidas al controller de apartados
- UI: cada apartado muestra botones de fases de escrituración
- 630 API tests + 5 apps construidas
- 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
- Modal con 28 campos agrupados por sección (Datos, Contacto, Crédito, Propiedad, Marketing, Venta)
- Click en fila abre modal
- Dark mode completo
- Agregado 'clientes-maestro' a todos los roles
Añadido cache: 'no-store' a conAuth() en todas las apps. El navegador
cacheaba respuestas GET de la API, causando que los cambios (crear lead,
cambiar estado, etc.) no se reflejaran hasta borrar cookies.
6 apps reconstruidas.
El controller de config/roles ya devuelve modulos (array) y acciones
(objeto) parseados, pero el frontend intentaba JSON.parse() otra vez
sobre algo que no era string. Ahora verifica el tipo antes de parsear.
Causa raiz: import.meta.env.VITE_API_URL ?? '/api' no activa el fallback
cuando VITE_API_URL es string vacio (?? solo cubre null/undefined).
Cambiado a || en auth.ts y sistema.ts de todas las apps.
Tambien reemplazada la IP hardcodeada en api.ts, mi-dia.ts, reportes.ts
y agente-ia.api.ts de todas las apps. Ahora funciona desde IP y dominio
sin depender de la red local.
Las apps (cotizador, mi-dia, alta-clientes, cobranza, dashboards) tenían
VITE_API_URL default a http://192.168.10.123:3000/api que no funciona
desde dominio externo (Cloudflare). Cambiado a '/api' relativo como
ya lo usaba landing. Ahora funciona desde IP y desde dominio.
- 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
- Mis leads: botón Interesado (label sembrado en Monday, mueve a Leads
Progreso); el botón Agenda cita ahora solo vive en Mis oportunidades
- Descarte: además de la categoría, subcategoría del catálogo de Monday
(workspace de referencia CRM FRASA); se guarda en la columna
Subcategoria del tablero Motivos No Compra y el item queda en el grupo
de su categoría
- Teléfonos con selector de lada 🇲🇽 +52 / 🇺🇸 +1 en captura rápida (Mi
día), Alta Afluencia y Alta de Cliente (tel. casa y celular); Monday
escribe countryShortName MX/US y el número compacto (rechaza espacios);
el dedup sigue comparando por los últimos 10 dígitos
- Origen nuevo en captura rápida y afluencia: PASE, PROSPECCION ASESOR,
ACTIVACION, FACEBOOK FRASA, REFERIDO, OTRO (sembrados en Leads.Origen y
Oportunidades.Origen del Lead)
- Tests: 461 API + 16 mi-dia + 116 alta-clientes, verde