feat(config): modulo Configuraciones admin + permisos por rol

- Tablas ConfiguracionSistema (7 configs) + RolConfiguracion (6 roles)
- Endpoints: config/sistema GET/PATCH, config/roles GET/PATCH,
  config/usuarios GET/PATCH, config/reset-roles POST, config/acciones GET
- modulosDeRol() async con fallback a MATRIZ estatica
- auth/me devuelve acciones[] segun rol del usuario
- saludMonday.estaDisponible() lee modo_local_forzado de DB (cache 30s)
- Landing: vista Configuraciones con 4 tabs (Modo, Roles, Usuarios, Sistema)
- Mi-dia: boton Descartar se deshabilita si !descartar_lead
- 630 API tests + 24 landing tests + 20 mi-dia tests verdes

Seed: npm run seed:config
This commit is contained in:
2026-09-06 09:46:19 +00:00
parent 50e6eca7da
commit b2634f97ab
35 changed files with 2572 additions and 33 deletions

View File

@@ -39,22 +39,22 @@ const ESPERADOS: Record<string, string[]> = {
}
describe('modulosDeRol', () => {
it.each(Object.entries(ESPERADOS))('rol %s devuelve exactamente su lista', (rol, esperados) => {
expect(modulosDeRol(rol)).toEqual(esperados)
it.each(Object.entries(ESPERADOS))('rol %s devuelve exactamente su lista', async (rol, esperados) => {
expect(await modulosDeRol(rol)).toEqual(esperados)
})
it('roles legacy (coordinador, corporativo) se tratan como director_ventas', () => {
expect(modulosDeRol('coordinador')).toEqual(ESPERADOS['director_ventas'])
expect(modulosDeRol('corporativo')).toEqual(ESPERADOS['director_ventas'])
it('roles legacy (coordinador, corporativo) se tratan como director_ventas', async () => {
expect(await modulosDeRol('coordinador')).toEqual(ESPERADOS['director_ventas'])
expect(await modulosDeRol('corporativo')).toEqual(ESPERADOS['director_ventas'])
})
it('rol desconocido cae al fallback seguro (vendedor)', () => {
expect(modulosDeRol('otro')).toEqual(ESPERADOS['vendedor'])
expect(modulosDeRol('')).toEqual(ESPERADOS['vendedor'])
it('rol desconocido cae al fallback seguro (vendedor)', async () => {
expect(await modulosDeRol('otro')).toEqual(ESPERADOS['vendedor'])
expect(await modulosDeRol('')).toEqual(ESPERADOS['vendedor'])
})
it('tolera mayúsculas y espacios', () => {
expect(modulosDeRol(' Admin ')).toEqual([...MODULOS])
it('tolera mayúsculas y espacios', async () => {
expect(await modulosDeRol(' Admin ')).toEqual([...MODULOS])
})
})