export interface Modulo { id: string nombre: string descripcion: string // Claves de la matriz de roles del API (GET /auth/me → modulos): el módulo // es visible si ALGUNA de sus claves está permitida. Sin sesión se muestran todos. claves: string[] // Los módulos sin url abren una vista interna de la landing (no navegan fuera) url?: string } // Rutas relativas: la landing se sirve desde el mismo NGINX que las apps. export const MODULOS: Modulo[] = [ { id: 'cotizador', nombre: 'Cotizador', descripcion: 'Propuestas comerciales y PDF en tiempo real', claves: ['cotizador'], url: '/quote/', }, { id: 'alta-clientes', nombre: 'Alta de clientes', descripcion: 'Expediente digital, firmas y formatos PLD', claves: ['alta-cliente', 'alta-afluencia'], url: '/client/', }, { id: 'clientes', nombre: 'Clientes', descripcion: 'Planes de enganche, vencidos y estados de cuenta', claves: ['cobranza'], url: '/pay/', }, { id: 'chat-hermes', nombre: 'Chat Hermes', descripcion: 'Asistente IA con la base de conocimiento de Frasa', claves: ['chat'], url: '/ai/', }, { id: 'tableros', nombre: 'Tableros', descripcion: 'KPIs comerciales, inventario y cobranza en tiempo real', claves: ['mi-tablero', 'tablero-comercial'], url: '/dash/', }, { id: 'mi-dia', nombre: 'Mi día', descripcion: 'Agenda del vendedor: leads, actividades y captura rápida', claves: ['mi-dia'], url: '/hoy/', }, { id: 'contactos', nombre: 'Contactos', descripcion: 'Directorio de contactos del CRM: teléfono, email y estado', claves: ['contactos'], }, ] /** * ¿El módulo se muestra en el grid? Con sesión, solo si alguna de sus claves * está en los módulos permitidos del rol; sin sesión se muestran todos (cada * app mantiene su propio login wall). */ export function esModuloVisible(modulo: Modulo, permitidos: string[] | null): boolean { if (permitidos === null) return true return modulo.claves.some((clave) => permitidos.includes(clave)) }