feat: automatizaciones ronda 2 + app de dashboards /dash

- 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
This commit is contained in:
2026-08-27 09:05:09 +00:00
parent de11af985e
commit 04568a5603
34 changed files with 6279 additions and 8 deletions

View File

@@ -2,9 +2,9 @@ import { describe, it, expect } from 'vitest'
import { MODULOS } from './modulos'
describe('MODULOS', () => {
it('expone los 4 módulos del ecosistema', () => {
expect(MODULOS).toHaveLength(4)
expect(MODULOS.map((m) => m.id)).toEqual(['cotizador', 'alta-clientes', 'cobranza', 'agente-ia'])
it('expone los 5 módulos del ecosistema', () => {
expect(MODULOS).toHaveLength(5)
expect(MODULOS.map((m) => m.id)).toEqual(['cotizador', 'alta-clientes', 'cobranza', 'agente-ia', 'tableros'])
})
it('cada módulo tiene nombre, descripción y URL válida', () => {
@@ -21,6 +21,7 @@ describe('MODULOS', () => {
expect(urls['alta-clientes']).toBe('/client/')
expect(urls['cobranza']).toBe('/pay/')
expect(urls['agente-ia']).toBe('/ai/')
expect(urls['tableros']).toBe('/dash/')
})
it('no hay ids ni URLs duplicadas', () => {

View File

@@ -31,4 +31,10 @@ export const MODULOS: Modulo[] = [
descripcion: 'Asistente IA con la base de conocimiento de Frasa',
url: '/ai/',
},
{
id: 'tableros',
nombre: 'Tableros',
descripcion: 'KPIs comerciales, inventario y cobranza en tiempo real',
url: '/dash/',
},
]