86 lines
4.2 KiB
TypeScript
86 lines
4.2 KiB
TypeScript
// Espejo de skeen_whatsapp/permissions.py. Sirve de respaldo mientras /auth/me
|
|
// no ha respondido o hay una sesión cacheada de antes del despliegue, y para
|
|
// que el editor de roles muestre algo si /permisos falla. El backend es la
|
|
// autoridad: si algo no cuadra, la UI esconde de más, nunca de menos.
|
|
|
|
export const PERM_KEYS: string[] = [
|
|
'agenda.ver', 'agenda.agendar', 'agenda.editar', 'agenda.eliminar',
|
|
'agenda.mover', 'agenda.visitas', 'agenda.todas', 'agenda.bloquear',
|
|
'pacientes.ver', 'pacientes.expediente', 'pacientes.crear', 'pacientes.editar',
|
|
'pacientes.eliminar', 'pacientes.exportar', 'pacientes.saldos',
|
|
'visitas.ver', 'visitas.crear', 'visitas.editar', 'visitas.eliminar', 'visitas.archivos',
|
|
'ventas.vender', 'ventas.cobrar', 'ventas.descuentos', 'ventas.impuestos', 'ventas.cancelar',
|
|
'ventas.devolver', 'ventas.reimprimir',
|
|
'inventario.ver', 'inventario.ajustar', 'inventario.mover', 'inventario.costos',
|
|
'servicios.ver', 'servicios.editar',
|
|
'reportes.ver', 'reportes.exportar', 'caja.ver', 'caja.cerrar',
|
|
'whatsapp.ver', 'whatsapp.responder', 'whatsapp.asignar',
|
|
'notificaciones.ver', 'notificaciones.enviar', 'notificaciones.editar',
|
|
'formularios.ver', 'formularios.crear', 'formularios.editar', 'formularios.enviar',
|
|
'config.usuarios', 'config.roles', 'config.editar', 'config.auditoria',
|
|
];
|
|
|
|
const W = ['admin', 'medico', 'recepcion', 'enfermeria', 'cosmetologia',
|
|
'psicologa', 'farmacia', 'gerencia', 'marketing'];
|
|
const WN = W.filter((r) => r !== 'marketing');
|
|
const MONEY = W.filter((r) => r !== 'medico' && r !== 'marketing');
|
|
const AG = ['admin', 'gerencia'];
|
|
const AD = ['admin'];
|
|
const ALL = [...W, 'lectura'];
|
|
// Llenar/enviar formularios: quien atiende al paciente.
|
|
const FORM_WRITE = ['admin', 'medico', 'recepcion', 'enfermeria', 'gerencia'];
|
|
|
|
const READ_PERM_KEYS = new Set([
|
|
'agenda.ver', 'agenda.todas',
|
|
'pacientes.ver', 'pacientes.expediente', 'pacientes.exportar', 'pacientes.saldos',
|
|
'visitas.ver',
|
|
'inventario.ver',
|
|
'servicios.ver',
|
|
'reportes.ver', 'reportes.exportar', 'caja.ver',
|
|
'ventas.reimprimir',
|
|
'whatsapp.ver',
|
|
'notificaciones.ver',
|
|
'formularios.ver',
|
|
]);
|
|
|
|
const DEFAULT_PERM_ROLES: Record<string, string[]> = {
|
|
'agenda.ver': ALL, 'agenda.agendar': W, 'agenda.editar': W, 'agenda.eliminar': W,
|
|
'agenda.mover': W, 'agenda.visitas': W, 'agenda.todas': W, 'agenda.bloquear': W,
|
|
'pacientes.ver': ALL, 'pacientes.expediente': ALL, 'pacientes.crear': W,
|
|
'pacientes.editar': W, 'pacientes.eliminar': W, 'pacientes.exportar': ALL,
|
|
'pacientes.saldos': ALL,
|
|
'visitas.ver': ALL, 'visitas.crear': W, 'visitas.editar': W,
|
|
'visitas.eliminar': W, 'visitas.archivos': W,
|
|
'ventas.vender': MONEY, 'ventas.cobrar': WN, 'ventas.descuentos': MONEY,
|
|
'ventas.impuestos': MONEY,
|
|
'ventas.cancelar': AG, 'ventas.devolver': MONEY, 'ventas.reimprimir': ALL,
|
|
'inventario.ver': ALL, 'inventario.ajustar': WN, 'inventario.mover': WN,
|
|
'inventario.costos': WN,
|
|
'servicios.ver': ALL, 'servicios.editar': AD,
|
|
'reportes.ver': ALL, 'reportes.exportar': ALL, 'caja.ver': ALL, 'caja.cerrar': MONEY,
|
|
'whatsapp.ver': W, 'whatsapp.responder': W, 'whatsapp.asignar': W,
|
|
'notificaciones.ver': ALL, 'notificaciones.enviar': W, 'notificaciones.editar': AG,
|
|
'formularios.ver': ALL, 'formularios.crear': FORM_WRITE, 'formularios.editar': AG,
|
|
'formularios.enviar': FORM_WRITE,
|
|
'config.usuarios': AG, 'config.roles': AG, 'config.editar': AG, 'config.auditoria': AD,
|
|
};
|
|
|
|
export const BASE_ROLES = ['admin', 'medico', 'recepcion', 'enfermeria',
|
|
'cosmetologia', 'psicologa', 'farmacia', 'gerencia', 'marketing', 'lectura'];
|
|
|
|
export const DEFAULT_PERMS_BY_ROLE: Record<string, Record<string, boolean>> =
|
|
Object.fromEntries(BASE_ROLES.map((role) => [
|
|
role,
|
|
Object.fromEntries(PERM_KEYS.map((key) => [
|
|
key,
|
|
role === 'lectura' ? READ_PERM_KEYS.has(key) : (DEFAULT_PERM_ROLES[key] || []).includes(role),
|
|
])),
|
|
]));
|
|
|
|
/** Default de un permiso para un rol (incluye roles personalizados = lectura). */
|
|
export const defaultPermFor = (role: string, key: string): boolean => {
|
|
const base = BASE_ROLES.includes(role) ? role : 'lectura';
|
|
return DEFAULT_PERMS_BY_ROLE[base]?.[key]
|
|
?? (READ_PERM_KEYS.has(key) && base === 'lectura');
|
|
};
|