- Matriz de roles (vendedor, administracion_venta, director_ventas, escrituracion, direccion_general, admin) con modulos visibles por rol; auth/me y login incluyen 'modulos'; PATCH /usuarios/:id/rol (admin). - Landing: Cobranza -> Clientes, Chat IA -> Chat Hermes, nuevo modulo Contactos (vista interna leyendo el tablero Contactos), grid filtrado por rol, rol visible en Configuracion de cuenta. - Dashboards: tab 'Tablero comercial' y tabs filtrados por rol. - Boton '<- Menu' en el header de todas las apps. - Mi dia: cada lead muestra el ultimo cambio (que, quien, cuando) desde el activity log de Monday (normalizacion de created_at 100ns/us/ms). - Descarte: el motivo se crea en el grupo de su categoria en el tablero Motivos No Compra.
73 lines
2.1 KiB
TypeScript
73 lines
2.1 KiB
TypeScript
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))
|
|
}
|