'Al departamento o casa de interes' ahora es un select dependiente:
al elegir desarrollo se cargan sus modelos (MODELOS_POR_PROYECTO) y al
cambiar de desarrollo se resetea. En Monday la columna 'Tipo de
Propiedad' se renombro a 'Modelo de Interes' con los 16 modelos como
labels del status.
Agrega al formulario ligero y a POST /api/leads: tipo de propiedad,
medio de contacto, edad, estado civil, tipo de empleo, ocupacion,
rango salarial, credito, tipo de economia, califica y lo quiere para.
Selects obligatorios (estado civil, tipo de empleo, tipo de economia,
califica) con las etiquetas sembradas como labels status en el tablero
Leads de Monday.
- Nueva columna status 'Desarrollo' (color_mm6s39s9) con los 5 labels;
migrados los 288 valores desde la columna texto (text_mm6ehqqb,
eliminada)
- sync-estatus-maestro.py y sync-obra-estatus.py reapuntados al nuevo
column id; el API lee por título y quedó verificado (288 unidades,
misma distribución por desarrollo)
- Columnas y grupos agregados en los 9 tableros existentes segun el
workspace viejo (sin tocar columnas/labels que usan las
automatizaciones; solo se agrego)
- Tableros nuevos en carpeta Ventas: Cobranza (18429260549) y
Seguimiento Preventa (18429260580), replicas de los originales
- Pendientes manuales documentados: orden de columnas, vistas,
labels de dropdowns existentes y relaciones/mirror
Sin headers, el navegador cacheaba el HTML de entrada y los deploys
nuevos no se veían hasta limpiar caché (el caso del botón de Alta
Afluencia). Los assets de Vite llevan hash y no se afectan.
- Script sync-obra-estatus.py (idempotente, --dry-run, retry/backoff):
parsea ESTATUS OBRA, SENDA-ACT-AGO2026, SENDA/SOLE DG, Diagonal 38 y
las hojas de ventas; mapea a Unidades vía maestro-unidades.json
- Board Unidades: +12 columnas (% avance obra, meses atraso, contratista,
clave catastral, no. oficial, vendedor, broker, venc. autorización,
fecha entrega obra, 4 checkboxes de hitos documentales) — 147 items
actualizados (DIAGONAL 38/38, SENDA 109/142)
- Board nuevo 'Flujo Escrituras' (18429252054): 32 items mayo–ago/2026
por proyecto/semana con escrituras e ingreso
- Board nuevo 'Saldos a Favor' (18429252069): 7 pendientes (Estanza/Sole)
- Receta nativa documentada: recordatorio 7 días antes de Venc.
autorización al coordinador
- SOLE y MUTUO no existen como inventario en Monday: sus datos de obra
se reportan como saltados (no se crean unidades)
- Al avanzar cada paso del wizard: upsert silencioso del borrador local
+ sync a Monday (iniciar → Contacto en PROSPECTO; pasos siguientes →
PATCH con los campos mapeables: datos generales, dirección armada,
actividad económica)
- Al completar: Contacto pasa a CLIENTE + Apartado + funnel (dedup)
- progresoId viaja con el borrador (se restaura solo); fallos de sync
no bloquean el avance (aviso ámbar no bloqueante); submit final con
fallback al endpoint legado si nunca hubo sync
- API: POST /clientes/progreso/iniciar, PATCH /clientes/progreso/:id,
POST /clientes/progreso/:id/completar; POST /clientes legado intacto
- Tests: API 338 (+16), alta-clientes 112 (+4); smoke en vivo
verificado (PROSPECTO → patch → CLIENTE + Apartado) y limpiado
Tras registrar la afluencia, la pantalla de éxito ofrece 'Pasar a Alta
de Cliente': abre el wizard prellenado con los datos recién capturados
(nombre, email, celular) y el leadMondayId ya ligado, sin rebuscar el
lead. Quedan también 'Capturar otro' y 'Volver'.
- Nueva pantalla de entrada en /client con dos opciones:
· Alta Afluencia: captura ligera (nombre, teléfono, email, origen,
desarrollo de interés, notas) → POST /api/leads (lead + oportunidad
Afluencia + round-robin, todo ya existente en el API)
· Alta de Cliente: formato completo actual (picker + wizard intactos)
- Manejo de duplicado por teléfono (409 con nombre del lead existente)
- ?cotizacion=<id> sigue saltando directo al wizard
- Tests: 107 verdes (11 nuevos); smoke en vivo OK y limpio
- Captura rápida crea lead + oportunidad en etapa Afluencia (vinculadas
por nueva tabla LeadOportunidad); también aplica a leads creados
directo en Monday vía webhook
- Transiciones automáticas: AGENDA CITA → Agendo Cita, descarte →
Perdido (+ dropdown Motivo No Compra), cotización con mismo teléfono
ACTUALIZA la oportunidad (no duplica) → Cotizador, alta de cliente
con leadMondayId → Aparto (dedup previo para no duplicar Apartado)
- Columna Desarrollo agregada al board Oportunidades (color_mm6sa20t)
- Migración lead_oportunidad aplicada con migrate diff + resolve (la DB
tiene drift histórico por db push; migrate dev pedía reset)
- Tests: 322 verdes; smoke en vivo verificado y limpiado
- Columna 'Desarrollo' (status, 5 labels) creada en el board Leads de
Monday (color_mm6sw4c2)
- API: crearLead acepta email y desarrollo; el desarrollo se valida
contra los labels reales de la columna (mismo patrón que Origen)
- Mi día: formulario de captura con campos Email y Desarrollo de interés
(select con los 5 desarrollos, opcional)
- Tests: api 296, mi-dia 12
API:
- GET /api/monday/usuarios: usuarios activos no-guest del workspace
- PATCH /api/usuarios/me/monday: vincula/desvincula el mondayUserId del
usuario autenticado (valida contra el workspace)
- GET /api/leads/buscar?q=: búsqueda de leads por nombre/teléfono/email
(sin acentos, orden updatedAt desc, límite 15)
- aPublico/me ahora incluyen mondayUserId
Landing (/):
- Nueva sección 'Configuración de cuenta': login inline, selector del
usuario de Monday, guardar/desvincular, cerrar sesión
Alta de clientes (/client):
- Búsqueda de leads de Monday con debounce en la pantalla de entrada;
al elegir uno prellena nombre/email/celular y guarda leadMondayId
- El picker (borradores + alta nueva + búsqueda de lead) es ahora
siempre la pantalla de entrada
Tests: api 294, landing 8, alta-clientes 96 — todos verdes
- Webhook Oportunidades: cambio de etapa dispara escaneo (Aparto→Apartado,
Ganado→Venta) además del round-robin de leads por create_item
- Acepta los nombres reales de los eventos de Monday: create_pulse/pulseId
y update_column_value (verificados en vivo)
- Token interno (X-Internal-Token) para que los syncs locales llamen
POST /cotizaciones/alertas-inventario sin JWT de usuario
- sync-estatus-maestro.py notifica los cambios aplicados al endpoint de
alertas (actividad al vendedor con cotizaciones recientes)
- Fix P1008 SQLite: escaneos del poll cron secuenciales +
connection_limit=1 en DATABASE_URL
- Webhooks registrados en Monday sobre https://frasa.consultoria-as.com
(Leads create_item, Oportunidades change_column_value); crons quedan
como red de seguridad
- Docs: sección 0 en AUTOMATIZACIONES-MONDAY.md con la matriz de eventos
y los quirks de Monday
- POST /api/auth/cambiar-password (bcrypt 12, política ≥8+1 número) +
modal en las 6 apps con auth
- PWA: manifest + íconos de marca en las 7 apps (sin service worker a
propósito, documentado); instalable en celular
- Dashboards: 'Mi tablero' para vendedor (sus KPIs y funnel) y sección
Equipo para coordinador/corporativo/admin
- mi-dia: equipo.porVendedor gana leadsNuevosSemana
- Tests: api 271, cotizador 88, alta 88, cobranza 81, agente-ia 19,
dashboards 15, mi-dia 11, landing 4
- PlanPago.vendedorId + filtro ?mios=1; toggle Mis planes/Todos en /pay
- Motor de recordatorios: próximos a vencer (3d) y vencidos (re-cada 7d),
canal Monday Actividad + stub WhatsApp listo para WA CRM, log persistente,
cron diario 9:30, run manual con dry-run, historial en /api/cobranza/recordatorios
- Agente IA: memoria por usuario (conversaciones aisladas) y tool calling:
cotizar_unidad (motor real por desarrollo) y buscar_unidad (inventario Monday)
- Tests: api 261, cobranza 75, agente-ia 13
- Borradores por vendedor (guardar/continuar/eliminar), se limpia al registrar
- Pre-llenado con ?cotizacion=<id> (cliente, contacto, proyecto, montos);
botón 'Iniciar alta' en Mis cotizaciones del cotizador
- Liga remota pública /client/firma/<token> (JWT scope firma-remota, 72h,
rate limit, solo datos mínimos sin PLD): firma digital + subida de
documentos que prende checkboxes en Monday Apartado
- Tokens de liga no sirven como sesión y viceversa
- Tests: api 228, alta 82, cotizador 82
- Mis cotizaciones (guardar con cliente, retomar, nueva) asociadas al vendedor del token
- Compartir: resumen copiable + deep link wa.me; PDF con folio, vigencia y QR
- GET /api/cotizaciones/:id/publico (público, datos mínimos sin PII del cliente)
- Comparador lado a lado de 2 unidades (mismo o distinto desarrollo)
- POST /api/cotizaciones/alertas-inventario: avisa al vendedor si una unidad
cotizada cambia de estatus (dedup; wire con syncs documentado)
- Fix: labels de propuesta mapeados a los reales del board Oportunidades
- Tests: api 201, cotizador 82
- App Mi día: KPIs, mis actividades, mis leads con acciones rápidas
(contactado/intento/agenda cita/descartar con motivo), captura rápida
de lead (409 en duplicado por teléfono), vista equipo para coordinadores
- API: GET /api/mi-dia/resumen, POST /api/leads, /leads/:id/estado,
/leads/:id/descartar; mapeo Usuario.mondayUserId (seed listo para
cuando inviten a los vendedores a Monday)
- Landing: tarjeta Mi día; tests api 188, mi-dia 8, landing 4
- MODELOS_POR_PROYECTO con los modelos reales del inventario
(DIAGONAL, SENDA, ATELIER, ESTANZA, SOLANA); texto libre en OTRO/Montebello
- PROYECTOS ampliado con ATELIER, ESTANZA y SOLANA
- Limpia el modelo al cambiar de proyecto si no aplica
- SENDA-410-1-G102, SENDA-410-1-G201, SENDA-401-1-L41 agregadas a Monday,
seeds y conocimiento IA (inventario 288 unidades; solo existían en el
reporte de estatus de venta, todas VENDIDO)
- PDFs del alta verificados exhaustivamente (5 documentos × 4 variantes,
contenido extraído con pdfplumber + renders visuales):
- firma huérfana en página propia (PLD) corregida
- encabezados de contacto huérfanos (checklist) corregidos
- modelo duplicado y enums crudos en perfil corregidos
- Tests pdf 6→16; suites: alta 76, cotizador 71, api 168
- API: viviendaCredito.ubicacion ahora opcional (la app web no la exigía;
el desfase causaba 400 que la app mostraba como fallo de red)
- App: crearAltaCliente distingue conexion/validacion; el 400 muestra
banner rojo con el detalle de los issues en vez del banner ámbar
- Tests: api 160, alta-clientes 66
- Escalado: lead asignado sin contactar >48h genera actividad URGENTE
al coordinador (LEAD_ESCALADO_HORAS, MONDAY_COORDINADOR_USER_ID)
- Oportunidad en Aparto crea item en Apartado (fecha límite +7d);
en Ganado crea la Venta; ambos con dedup
- GET /api/reportes/resumen: leads, funnel, unidades por desarrollo,
cobranza y actividades en una respuesta (cache 60s)
- App dashboards (/dash): 8 KPIs + 3 gráficas Recharts, con auth
- Landing: tarjeta Tableros; docs/AUTOMATIZACIONES-MONDAY.md con las
recetas nativas para activar en la UI
- Tests: api 158, dashboards 7, landing 5 — todo verde
- Modelo Usuario + seed desde lista de vendedores (18 usuarios, bcrypt cost 12)
- POST /api/auth/login + /api/auth/me; middleware Bearer en todo /api
excepto health, login y webhook Monday; flag AUTH_ENABLED
- Username = nombre completo normalizado (case/acentos insensible),
password inicial Frasa2026, admin vía ADMIN_PASSWORD
- Apps: LoginScreen + AuthGate (StudioBlank), token en localStorage,
header Authorization en todas las llamadas, logout en 401
- Tests: api 136, cotizador 71, alta 65, cobranza 71, agente-ia 13, landing 4
- Input de apartado con validación (mínimo 20k), clamp en el motor y bloqueo de PDF si inválido
- El cliente puede apartar con más; solo se recorre del enganche, el total no cambia
- cuotaMantenimiento tipada (number|null) en config por desarrollo; null → PENDIENTE
- Knowledge IA actualizada: apartado mínimo 20k (FAQ + proceso de venta) reindexada
- Tests 61/61 verdes (8 nuevos)
- Vocabulario funnel: labels Intento de contacto/Abandono en Leads,
etapas completas en Oportunidades (Cotizador, Ganado, Perdido...)
- Apartados: pipeline Enkontrol (8 estados) + checkboxes CURP/RFC/Comprobante
que la app de alta prende al subir documentos
- Motivos No Compra: board catálogo + dropdown + endpoint /oportunidades/:id/perder
- Perfil demográfico en Contactos mapeado desde el alta (estado civil,
vivienda, propósito, fecha nac., rango de edad calculado)
- Desarrollos: catálogo maestro sincronizado (precios, m2, tipo, entrega)
- Actividades: board nuevo + creación automática en round-robin e inactividad
- Cobranza: plan liquidado mueve el apartado a 'X Escriturar' en Monday
- Scripts: setup:crm y sync:desarrollos (idempotentes)
- Tests 119/119 verdes
- Motor de cálculo parametrizado por desarrollo (enganches, descuentos, splits,
fuente de N, quirk Infonavit-lista); DIAGONAL byte-idéntico
- 285 unidades (5 desarrollos) en seeds, API (?desarrollo=) y board Monday
- Selector de desarrollo en UI, propuestas por config, PDF multi-desarrollo
- Knowledge IA: catálogo por desarrollo + matriz de diferencias (10 docs)
- Tests: cotizador 53, api 99 — fixtures de los Excel validados al centavo
- Servicio de automatizaciones con estado persistido en SQLite (índice RR, dedup de recordatorios)
- Webhook Monday procesa create_item del board Leads y asigna vendedor
- Crons: polling cada 5 min (respaldo sin webhook público) + escaneo diario 9am
- Endpoints admin: /api/automatizaciones/estado, /round-robin/run, /inactividad/preview
- 15 tests nuevos (70/70 verdes)
- deploy/nginx-host.conf: nginx del host sirve dist/ de las 4 apps y
proxifica /api/ a 127.0.0.1:3000 (client_max_body_size 10m)
- deploy/frasa-api.service: API Gateway como servicio systemd
- landing: URLs relativas (/quote/, /client/, /pay/)
- Dockerfiles de apps: ARG VITE_API_URL=/api para builds same-origin
- docker-compose: NGINX_CONF parametrizado (nginx.http.conf sin SSL)
- README: instrucciones para host LXC y nota de DDNS pendiente
- api-gateway: servicio Monday (retry 429/complejidad, paginacion cursor,
column IDs por titulo), endpoints unidades/cotizaciones/clientes/planes,
webhook con handshake challenge, Prisma SQLite dev, 55 tests
- cotizador: inventario desde /api/unidades con fallback a seed
- alta-clientes: POST /api/clientes + upload multipart de documentos
- cobranza: persistencia via API con respaldo offline en localStorage
- .env.example con board IDs del workspace Frasa-CAS
- Cotizador (/quote): 4 propuestas con formulas validadas del Excel, comparador,
combobox de unidades, vigencia, PDF ANEXO A
- Alta Clientes (/client): wizard 8 pasos, validacion CURP RENAPO, OCR de INE,
checklist de expediente, firma digital, 5 PDFs legales
- Cobranza (/pay): planes de enganche, mora, vista cobranza del dia, recibos PDF,
bitacora, dashboard con filtros
- Landing (/): entrada al ecosistema
- Design system StudioBlank (monocromo, acento #1B4332) en las 4 apps
- 123 tests vitest