feat: roles con modulos por rol + mejoras Mi dia y descarte
- 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.
This commit is contained in:
69
api-gateway/src/config/roles.ts
Normal file
69
api-gateway/src/config/roles.ts
Normal file
@@ -0,0 +1,69 @@
|
||||
// Matriz de módulos visibles por rol (definida con el cliente, sep-2026).
|
||||
// Es la fuente de verdad del ecosistema: GET /auth/me la expone como
|
||||
// `modulos` y las apps filtran su navegación con ella.
|
||||
|
||||
export const MODULOS = [
|
||||
'mi-dia',
|
||||
'alta-cliente',
|
||||
'alta-afluencia',
|
||||
'cotizador',
|
||||
'mi-tablero',
|
||||
'tablero-comercial',
|
||||
'cobranza',
|
||||
'contactos',
|
||||
'chat',
|
||||
] as const
|
||||
export type Modulo = (typeof MODULOS)[number]
|
||||
|
||||
export const ROLES = [
|
||||
'vendedor',
|
||||
'administracion_venta',
|
||||
'director_ventas',
|
||||
'escrituracion',
|
||||
'direccion_general',
|
||||
'admin',
|
||||
] as const
|
||||
export type Rol = (typeof ROLES)[number]
|
||||
|
||||
const MODULOS_VENDEDOR: readonly Modulo[] = [
|
||||
'mi-dia',
|
||||
'alta-cliente',
|
||||
'alta-afluencia',
|
||||
'cotizador',
|
||||
'mi-tablero',
|
||||
'contactos',
|
||||
'chat',
|
||||
]
|
||||
|
||||
const MATRIZ: Record<Rol, readonly Modulo[]> = {
|
||||
vendedor: MODULOS_VENDEDOR,
|
||||
administracion_venta: [...MODULOS_VENDEDOR, 'cobranza'],
|
||||
director_ventas: [...MODULOS_VENDEDOR, 'cobranza', 'tablero-comercial'],
|
||||
escrituracion: [...MODULOS_VENDEDOR, 'cobranza'],
|
||||
direccion_general: ['mi-dia', 'tablero-comercial', 'cobranza', 'chat'],
|
||||
admin: MODULOS,
|
||||
}
|
||||
|
||||
// Roles que ya existen en la BD pero no en la matriz nueva: se homologan a
|
||||
// director_ventas (su equivalente funcional en la operación actual).
|
||||
const ROLES_LEGACY: Record<string, Rol> = {
|
||||
coordinador: 'director_ventas',
|
||||
corporativo: 'director_ventas',
|
||||
}
|
||||
|
||||
/**
|
||||
* Módulos visibles para un rol. Roles legacy ('coordinador', 'corporativo') se
|
||||
* tratan como director_ventas; un rol desconocido cae a vendedor (fallback
|
||||
* seguro: es el conjunto más chico de módulos operativos).
|
||||
*/
|
||||
export function modulosDeRol(rol: string): Modulo[] {
|
||||
const clave = rol.trim().toLowerCase()
|
||||
const rolEfectivo: Rol =
|
||||
(ROLES as readonly string[]).includes(clave) ? (clave as Rol) : (ROLES_LEGACY[clave] ?? 'vendedor')
|
||||
return [...MATRIZ[rolEfectivo]]
|
||||
}
|
||||
|
||||
/** ¿Es un rol válido de la matriz nueva? (para PATCH /usuarios/:id/rol) */
|
||||
export function esRolValido(rol: string): boolean {
|
||||
return (ROLES as readonly string[]).includes(rol)
|
||||
}
|
||||
Reference in New Issue
Block a user