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:
@@ -3,7 +3,8 @@ import { z } from 'zod'
|
||||
import { mondayService } from '../services/monday.service.js'
|
||||
import { prisma } from '../services/prisma.js'
|
||||
import { aPublico } from '../services/auth.service.js'
|
||||
import { BadRequestError } from '../utils/errors.js'
|
||||
import { esRolValido } from '../config/roles.js'
|
||||
import { AppError, BadRequestError } from '../utils/errors.js'
|
||||
|
||||
/**
|
||||
* Vínculo usuario del ecosistema ↔ usuario de Monday (people). Es el mapeo
|
||||
@@ -42,3 +43,27 @@ export async function actualizarVinculoMondayEndpoint(req: Request, res: Respons
|
||||
})
|
||||
res.json(aPublico(usuario))
|
||||
}
|
||||
|
||||
const cambiarRolSchema = z.object({
|
||||
rol: z.string().min(1),
|
||||
})
|
||||
|
||||
/**
|
||||
* PATCH /api/usuarios/:id/rol (Bearer, solo admin) { rol } → usuario público
|
||||
* actualizado. Solo roles de la matriz nueva (config/roles.ts); los legacy
|
||||
* ('coordinador', 'corporativo') ya no se asignan.
|
||||
*/
|
||||
export async function actualizarRolEndpoint(req: Request, res: Response): Promise<void> {
|
||||
if (!req.usuarioToken) throw new BadRequestError('Falta el token verificado')
|
||||
if (req.usuarioToken.rol !== 'admin') {
|
||||
throw new AppError(403, 'Solo un administrador puede cambiar roles')
|
||||
}
|
||||
const { rol } = cambiarRolSchema.parse(req.body)
|
||||
if (!esRolValido(rol)) throw new BadRequestError(`Rol inválido: ${rol}`)
|
||||
|
||||
const usuario = await prisma.usuario.update({
|
||||
where: { id: req.params.id as string },
|
||||
data: { rol },
|
||||
})
|
||||
res.json(aPublico(usuario))
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user