SEGURIDAD (agente IA):
- Conversaciones: GET /ai/conversations/:id y el reanudar chat verifican
propiedad (antes cualquier usuario leia/continuaba la conversacion de otro).
- /ai/documents pasa a solo-admin (antes cualquien podia inyectar o borrar
documentos de la base de conocimiento).
DATOS / CORRUPCION:
- Cotizador: elegir un cliente del maestro en el buscador ya no crea un lead
fantasma "Registro previo (CRM anterior)" en el embudo.
- Afluencia con oportunidadId inexistente: 404 en vez de crear sombra fantasma.
- Cobranza: los 103 planes importados quedaron con vendedor asignado (7 con su
asesor real segun el Excel, el resto al admin) y el motor de recordatorios
cae al admin cuando un plan no tiene vendedor: antes los 411 recordatorios
se registraban 'sin-destinatario' y no los veia nadie.
- Backups: script reescrito para el host real (sqlite .backup + uploads + env
en /root/backups) y cron instalado (antes: script que asumia docker y sin
cron programado = cero respaldos).
REPORTES / METRICAS:
- Mi tablero: el embudo ya excluye cancelaciones reales (Cancelo/Cancelacion
Apartado) y cuenta como vendidos Firma Cliente/Escriturado/Titulado (antes
41 "apartados" donde habia 13 activos y vendidos buscaba una etapa que no
existe); tasa de descarte ya compara el mismo periodo.
- Scoring: etapa real 'Agendo Cita' (antes 'AGENDO' nunca aplicaba) y los
descartados/perdidos ya no reciben score.
- ver_cobranza (IA): ignora planes cancelados y no cuenta como vencido el pago
que vence hoy.
UI / FLUJOS:
- mi-dia: typo CANCO -> CANCELO (los cancelados reaparecen en Escrituracion);
confirmar cita ya no retrocede la etapa de Cotizador/Aparto (boton y kanban).
- alta-clientes: la firma ya no se borra al navegar fuera del paso de firmas;
toast de exito solo cuando el API confirma; prefill de apartado trae
direccion, estado civil y fecha de nacimiento desde el alta.
- Auditoria: el filtro por usuario funciona (el front enviaba 'usuario' y el
API esperaba 'usuarioId') y 'hasta' incluye todo el dia.
- Contactos: paginacion aplicada despues de fusionar fuentes (antes saltaban o
se repetian contactos entre paginas y 'Siguiente' se deshabilitaba antes de
tiempo).
- Buscador global: leads -> /hoy/, contactos -> /; el cotizador entiende
?cotizacion=<id> para retomar desde la liga.
- Export mi-dia: columnas Desarrollo/Origen rellenas y sin duplicados.
- Recibo de cobranza: "Recibio" es FRASA (el cliente paga, no recibe).
- Alta de plan de cobranza: proyecto libre con sugerencias del catalogo real
(antes limitado a 3 proyectos que no cubrian la cartera).
Verificado en vivo: autorizacion IA (3x 403), filtro de auditoria, 404 de
afluencia. Suites: 717 API + 124 alta-clientes + 115 cotizador + 92 cobranza +
89 landing + 32 mi-dia en verde. Backup de hoy generado en /root/backups.
Modulo nuevo (solo admin) para dar de alta desarrollos sin tocar codigo:
- CRUD de la ficha, modelos e inventario (alta manual y generador por rango)
- Reglas del cotizador por desarrollo, editables y persistidas en la BD
- El cotizador consume las reglas desde /desarrollos/reglas-cotizador y cae a
las constantes con aviso cuando un desarrollo aun no tiene reglas guardadas
- Micrositio publico en /d/:clave (sin sesion) con ficha, modelos y
disponibilidad; jamas expone datos de clientes ni cotizaciones
Integracion:
- La landing monta el modulo en el grid (clave 'desarrollos', solo admin) y el
micrositio fuera del login; el rol manager NO accede (matriz y API con 403)
- La tabla de roles de Configuracion ahora lista todos los modulos
- Se alinea la FK de ReglaCotizadorDesarrollo con la BD viva (Desarrollo.id)
Verificado: 708 pruebas del API, 115 del cotizador y 89 de la landing en verde;
12/12 cotizaciones identicas antes y despues del cambio de reglas; prueba en
vivo del API con alta, modelos, inventario, reglas, micrositio y baja (30/30).
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
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.
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 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
- 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
- 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
- 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
- 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
- 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
- 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