Commit Graph

62 Commits

Author SHA1 Message Date
b5a20aed4e fix(mi-dia,captura): exportar en escrituracion y avance real sin contar checkboxes en false 2026-09-21 07:20:34 +00:00
5e9b2ac456 fix(auditoria completa): bloqueos de Mi Dia, cobranza (saldos y fechas), captura (departamento y rol), contactos (privacidad), cotizador (QR) y validaciones de API 2026-09-21 07:18:39 +00:00
4965a4488a feat: rol manager, arreglos de reportes (cancelacion/afluencias), credito unico, cliente enkontrol, vendedor en bitacora y actualizar afluencia existente 2026-09-18 15:25:34 +00:00
31f83b0504 fix(mi-dia): admin reasigna/mueve leads, capturista real en cards, datos en apartados, INE obligatoria y bitácora persistente 2026-09-17 06:54:57 +00:00
34229f1894 fix(catalogos): SOLE y MUTUO en desarrollos de alta lead/afluencia/cliente y filtros 2026-09-12 22:41:15 +00:00
852182fabc fix(6-mejoras): subcategoría+apartado libre+PDF+coacreditado+docs+dedup
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
2026-09-12 07:09:15 +00:00
c8357fe582 feat(7-mejoras): notas persisten + soporte + captura visible
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
2026-09-11 23:17:25 +00:00
1ba7aa49da feat(mejoras): 22 mejoras UX en todos los módulos
Mi día: cancelación con motivo, conteo escrituración real, cita sin retroceder, calendario completo
Cobranza: MoraDashboard respeta alcance, hoy dinámico, cancelar con motivo
Landing: contactos paginados, error vs vacío diferenciado
Dashboards: KPI renombrado, drill-down planes activos
Chat: historial recarga, preguntas rotativas, error solo toast
Transversal: shadow-sm corrupto corregido en 9 archivos

553 API tests + 7 apps construidas
2026-09-11 12:48:47 +00:00
89d95eb53b feat(purga): Monday eliminado completamente del sistema
14 servicios eliminados, 7 controllers local-only, crons locales,
config sin MONDAY_*, frontend sin banners/avisos Monday.
552 tests API + 7 apps construidas.
2026-09-11 11:47:17 +00:00
64b01246d6 feat(mejoras): 25 mejoras UX en todos los módulos + purga Monday
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
2026-09-11 06:52:37 +00:00
075d47c304 fix(mi-dia): 5 bugs críticos + 8 mejoras UX
Bugs críticos: descartar, kanban drag&drop, escrituración, fases API, export filtros
UX: tel clicable, WhatsApp, filtros por tab, tareas, calendario, estado, notas, navegación
2026-09-11 02:05:25 +00:00
46d20657ea fix(cancelar): botones Cancelación Apartado y Cancelo funcionan con motivo
- ModalDescarteGenerico restaurado (motivo + comentario)
- Cancelación Apartado: abre modal → confirma → cambia estado
- Cancelo en Escrituración: abre modal → confirma → cambia estado
- onFase intercepta ambas fases y abre el modal de cancelación
2026-09-11 00:26:52 +00:00
cfffb36965 fix(apartados): eliminar modal NotasApartado, solo queda DetalleLeadModal
- 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)
2026-09-11 00:08:59 +00:00
4d026a36d2 fix(mi-dia): eliminar modales antiguos, solo queda DetalleLeadModal
- Eliminado ModalDescarteGenerico (función completa)
- Eliminado ModalDescartar (función completa)
- Eliminado TimelineLead import y leadTimeline state
- Eliminado botón 'Historial' de FilaLead
- Eliminado prop onTimeline de FilaLead
- Eliminado modal JSX de timeline
- Descarte ahora es llamada directa sin modal
- 1525 líneas (antes 1800)
2026-09-10 23:58:47 +00:00
b1e408f435 fix(notas): notas persisten entre etapas via clienteClave
- 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
2026-09-10 22:55:11 +00:00
5a50243dff fix(notas): buscar por leadId O nombre del cliente
- 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
2026-09-10 21:31:51 +00:00
98889bbf6a fix(api-url): todas las apps usan || en vez de ?? para VITE_API_URL
- 11 archivos corregidos: agente-ia, alta-clientes, cobranza, cotizador,
  dashboards, mi-dia, landing (auth.ts, api.ts, mi-dia.ts, reportes.ts,
  push.ts, notas.ts, recordatorios.ts, reporte-mi-tablero.ts)
- ?? solo cubre null/undefined, || cubre string vacío
- 7 apps reconstruidas
2026-09-10 21:26:54 +00:00
913bdff0d1 feat(bitacora): modal de cliente rediseñado con sidebar lateral
- 5 secciones: Info, Cita, Tareas, Notas, Miembros
- Sidebar de navegación con íconos (lucide-react)
- Notas con búsqueda, botón +Añadir, empty state
- Cita programada visible
- Tareas pendientes con checkbox
- Dark mode completo
- Max-w-5xl, layout flex horizontal
2026-09-10 21:17:17 +00:00
16cacd5f31 feat(9-mejoras): limpieza leads + admin CRUD + calendario + CRM360 FRASA
1. Leads limpiados (207 eliminados, 18 apartados conservados)
2. Round-robin desactivado (config round_robin_habilitado=false)
3. Admin puede borrar/reasignar/mover leads (DELETE/PATCH/POST)
4. Calendario: fechaCita guardada y pasada correctamente
5. Avisos Monday eliminados (BannerModoLocal, ChipPendienteSync, vinculación)
6. Contactos filtrados por usuario asignado
7. Modal bitácora: notas persisten entre fases
8. Fases oportunidades: Agendo→Afluencia→Cotizar→Aparto
9. Toast de nota eliminado en cambios de status
10. Branding: CRM360 FRASA + logo en todas las apps
11. 7 apps construidas
2026-09-10 07:05:40 +00:00
356bf46216 fix(escrituracion): fases reordenadas según solicitud
- Fases: Venta → Seguimiento → Integración → X Autorizar → Autorizado
  → X Escriturar → Escriturado → Titulado → Cancelo
- Kanban y botones actualizados con el nuevo orden
- obtenerColumnaEscrituracion actualizado
- Backend FASES_APARTADO_PERMITIDAS actualizado
2026-09-09 10:41:38 +00:00
d546460ba4 feat(8-mejoras): cancelar+motivo, brocker, etapas, calendario, modal cliente
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)
2026-09-09 10:26:36 +00:00
6db9662838 fix(mi-dia): mostrar desarrollo en cards de leads
- LeadMiDia ahora incluye campo 'desarrollo'
- Backend: mapeado desde Monday leads y desde LeadCaptura local
- Frontend: FilaLead muestra teléfono · desarrollo · origen
2026-09-08 18:26:58 +00:00
1a70199de8 fix(escrituracion): Cancelo/Escriturado remueven de la lista
- 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
2026-09-08 10:49:26 +00:00
cfcedd5452 fix(escrituracion): usar todosApartados para que aparezcan los terminales
- 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
2026-09-08 10:17:37 +00:00
df87d17fb2 fix(firma-cliente): cambiar etapa ANTES de mover a Escrituración
- 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
2026-09-08 10:08:49 +00:00
e5d412389d fix(escrituracion): filtrar apartados solo en fases de escrituración
- 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'
2026-09-08 10:06:02 +00:00
3213808741 fix(botones): verde en Aparto (oportunidades) y Firma Cliente (apartados)
- 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
2026-09-08 09:44:54 +00:00
06d4e154a5 fix(etapas): Cancelo remueve de escrituracion + botones verdes
- '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
2026-09-08 09:31:32 +00:00
3e9417667e fix(tabbar): exportar junto a filtros, tab bar sin scroll
- Botón Exportar movido junto a los filtros (misma fila)
- Tab bar solo tiene pestañas + botón Kanban (sin exportar)
- Sin scroll horizontal necesario
2026-09-08 09:18:31 +00:00
350455ddba fix(tabbar): hacer barra de pestañas compacta y scrollable
- 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
2026-09-08 09:15:55 +00:00
8f39b7178c fix(kanban): eliminar botón duplicado + exportar en tab bar
- 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
2026-09-08 09:12:47 +00:00
8212fd919e fix(kanban): botón kanban en todas las pestañas + movimiento a tab bar
- 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
2026-09-08 09:07:02 +00:00
febd636144 feat(kanban): vista kanban en todas las pestañas de Mi día
- 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
2026-09-08 08:59:11 +00:00
a9c6b1e087 feat(escrituracion): nueva etapa Escrituración en Mi día
- 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
2026-09-08 08:49:11 +00:00
dc6ec786d0 fix(responsive): layout 100% width en todas las resoluciones
- Eliminado max-w-[1280px] de todas las apps (mi-dia, landing, cotizador, cobranza, dashboards, alta-clientes)
- Kanban: sin restricción de ancho, columnas min-w-[220px]
- Grids: xl:grid-cols-4/5 para pantallas grandes
- CSS base: -webkit-text-size-adjust + min-h-screen
- 6 apps construidas
2026-09-08 08:36:53 +00:00
de1ee5578e fix(dashboard): mover useMemo antes de early returns (React hooks)
- DashboardVendedor: useMemo de comparativa mensual movido antes de los returns condicionales
- Corrige React error #310 (rendered fewer hooks than expected)
- 5 apps construidas
2026-09-08 08:03:18 +00:00
db18685872 feat(ux): 17 mejoras de experiencia de usuario
Backend (10 endpoints nuevos):
- Recordatorios personales (CRUD + tabla RecordatorioVendedor)
- Lead scoring 0-100 (etapa+recencia+datos)
- Dashboard mora (pagos vencidos, monto, días atraso)
- Timeline de pagos (pagado/vence/futuro)
- Perfil completo contacto (pagos+cotizaciones+docs+score)
- Exportar contactos a CSV

Frontend Mi día:
- Resumen matutino (saludo+KPIs)
- Historial visual lead (timeline)
- Score badge 0-100 (verde/amarillo/rojo)
- Vista kanban (drag & drop)

Frontend Cobranza:
- Dashboard mora (tabla+WhatsApp)
- Timeline pagos visual (nodos coloreados)

Frontend Alta Clientes:
- Checklist documentos visual
- Foto cliente (cámara)

Frontend Landing:
- Perfil contacto completo
- Exportar contactos CSV

Frontend Mi día (extras):
- Comparativa mensual
- KPIs dashboard (leads hoy, ventas, conversión)

806 tests, 5 apps construidas.
2026-09-08 07:42:54 +00:00
5063ffe281 fix(apartados): rename firma→alta enkontrol + campo usuario + bloqueo unidad
- 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
2026-09-08 06:31:41 +00:00
2fc817887d fix(cache): deshabilitar caché del navegador en llamadas API
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.
2026-09-08 02:11:41 +00:00
8b65f903d3 fix(dark-mode): dark mode completo + gráficas adaptadas
Dark mode fixes:
- Cards secundarias: Mis capturas, Mis clientes, Actividades, Apartados por vencer, Equipo
- Botones: Exportar, Descartar, Afluencia, Agendo, Forzar reconexión, Subir archivo
- Config: ModoTrabajo, Usuarios, Sistema, RolesPermisos, ConfigPage
- Cotizador: inputs, tabs, placeholder, botón compartir
- Alta clientes: BotonOcrIne, FileUploader
- Cobranza: toggle dashboard, modal abono
- Dashboards: tabs

Gráficas Recharts:
- CSS variables para colores chart (grid, text, tooltip)
- Helper isDark() + axisTextColor() + gridStroke() + tooltipProps()
- DashboardVendedor: grid, axes, tooltips adaptados
- TableroGeneral: grid, axes, tooltips (BarChart, Funnel, PieChart)
- MiTablero: tooltip adaptado
- Perfilamiento: grid, axes, tooltip

7 apps construidas limpias.
2026-09-07 06:44:08 +00:00
c77b4c0628 feat(mejoras): 14 mejoras al CRM Frasa
Fase 1 - UI: dark mode, skeletons, toasts
Fase 2 - Filtros: avanzados Mi día, búsqueda global Ctrl+K
Fase 3 - Datos: export Excel, notas apartados, auditoría
Fase 4 - Dashboard: gráficas vendedor + métricas uso
Fase 5 - Responsive: tablets optimizadas
Fase 6 - PWA: IndexedDB offline, push notifications

Backend: 3 tablas nuevas, 6 services, 6 endpoints nuevos
721 API tests + fronts verdes.
2026-09-07 06:04:49 +00:00
97c4e5cdf3 fix(fronts): reemplazar IP hardcodeada 192.168.10.123 por /api relativo en TODOS los archivos
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.
2026-09-06 18:50:33 +00:00
1597c6be34 fix(fronts): API_URL usa '/api' relativo en vez de IP hardcodeada
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.
2026-09-06 18:09:35 +00:00
b2634f97ab feat(config): modulo Configuraciones admin + permisos por rol
- Tablas ConfiguracionSistema (7 configs) + RolConfiguracion (6 roles)
- Endpoints: config/sistema GET/PATCH, config/roles GET/PATCH,
  config/usuarios GET/PATCH, config/reset-roles POST, config/acciones GET
- modulosDeRol() async con fallback a MATRIZ estatica
- auth/me devuelve acciones[] segun rol del usuario
- saludMonday.estaDisponible() lee modo_local_forzado de DB (cache 30s)
- Landing: vista Configuraciones con 4 tabs (Modo, Roles, Usuarios, Sistema)
- Mi-dia: boton Descartar se deshabilita si !descartar_lead
- 630 API tests + 24 landing tests + 20 mi-dia tests verdes

Seed: npm run seed:config
2026-09-06 09:46:19 +00:00
60649890eb feat(modo-local): fallback completo sin Monday + cola de sincronización
- Circuit breaker saludMonday (3 fallos → modo local; ping cada 60s)
- Endpoint GET /api/sistema/estado {mondayOk, pendientesSync}
- LeadCaptura extendida (board, etapa, origen, motivo, pendienteSync)
- Tablas Unidad (espejo inventario, 288 seed) + SyncPendiente
- crmLocal: crearLead, afluencia, cambio etapa, descarte, conversión, apartar
- Ruteo en controllers: fallback local ante 502 o Monday caído
- Mi día local: resumen completo desde SQLite + unión con Monday
- Fallbacks: unidades, contactos, reportes, prefill, buscador
- Sync worker cada 2min + handlers 15 tipos (con DependenciaPendienteError)
- Gate automatizaciones: skip si !mondayOk
- Banner 'Modo local' en 5 apps + badge pendiente en mi-dia
- 597 API tests + 263 front tests verdes

Env MODO_LOCAL_FORZADO=true para testing sin Monday.
2026-09-06 08:08:56 +00:00
5b348d21e5 feat: conversión lead→oportunidad (Agendo) y alta ligada a apartado
- 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
2026-09-05 00:33:53 +00:00
27ba9ea8fa feat: Interesado en leads, lada MX/USA, orígenes FRASA y subcategoría de descarte
- 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
2026-09-04 23:28:56 +00:00
5d7c6f58cd feat(mi-dia): botón Afluencia abre el formulario prellenado y actualiza la oportunidad
- Mis oportunidades: 'Afluencia →' navega a /client/?afluencia=<id> con
  nombre, contacto, desarrollo y modelo prellenados
- Alta Afluencia: con oportunidadId el envío ACTUALIZA la oportunidad en
  Monday (perfil completo + etapa Afluencia) en vez de crear duplicado;
  sin oportunidadId el flujo de captura nueva no cambia
- monday.service: actualizarOportunidadAfluencia (mismo builder de la
  creación + name); moverAGrupoSegunEstado tras actualizar
- Tests: 457 API + 16 mi-dia + 116 alta-clientes, verde
2026-09-04 22:53:21 +00:00
cbd50e2066 feat: docs en apartados, enganche seleccionable y prefill de clientes
- Mis apartados (Mi día): botón Documentos con precarga del expediente —
  captura del cotizador y captura de pago apartado (obligatorios) más
  documentos generales; los archivos se guardan en el cliente ligado al
  apartado (se crea la ficha mínima si no existe). Endpoints
  GET/POST /apartados/:id/documentos (multipart, 10 MB, pdf/jpg/png)
- Cotizador: se oculta el editor de descuento (usan los % del Excel);
  enganche seleccionable con mínimo 2.5% del valor de la propiedad, solo
  en esquemas con crédito (bancario/Infonavit); mensualidades se
  recalculan con el enganche elegido y nunca quedan en negativo
- Cotizador: buscador de cliente en Monday (lead u oportunidad) que
  prellena nombre/contacto/desarrollo y vincula la cotización a la
  oportunidad al guardar
- Alta Afluencia: buscador que jala nombre, contacto, origen, desarrollo
  y modelo desde leads y oportunidades existentes
- buscarLeads devuelve desarrollo y modelo de interés
- Landing: el módulo Clientes vuelve a llamarse Cobranza
- Tests: 456 API + 94 cotizador + 14 mi-dia + 116 alta-clientes, verde
2026-09-04 22:32:40 +00:00
1963c06d93 feat(mi-dia): tabs Mis oportunidades/Mis apartados con fases y cotizador vinculado
- Resumen Mi día: misOportunidades.items (lista de trabajo con perfil y
  último cambio) y misApartados (Vendedor = yo, estados no finales)
- Nuevos endpoints: POST /oportunidades/:id/etapa (Agendo Cita, Afluencia,
  Cotizador, Aparto, No Asistio, Abandono; con fecha de cita) y
  POST /apartados/:id/estado (pipeline Enkontrol: Pago Apartado →
  Firma Cliente (Venta) / Cancelacion Apartado); ambos mueven el item al
  grupo Monday correspondiente
- Mi día: tabs Mis leads / Mis oportunidades / Mis apartados; botón
  Cotizar abre /quote con el cliente prellenado y la oportunidad ligada
- Cotizador: prefill desde query params (cliente, teléfono, email,
  desarrollo, unidad) y envío de oportunidadId; al guardar, el API
  actualiza ESE item (Precio final, Tipo propuesta, etapa Cotizador)
  en vez de buscar por teléfono o crear duplicado
- grupos-estado: 'Cancelacion Apartado' → Historico
- Estados finales de apartado: agrega Firma Cliente (Venta) y
  Cancelacion Apartado
- Tests: 455 API + 14 mi-dia + 88 cotizador, todo en verde
2026-09-04 21:54:44 +00:00