# RF-MGN-001-002: Gestión de Roles y Permisos (RBAC)

**Módulo:** MGN-001 - Fundamentos
**Prioridad:** P0 (MVP)
**Story Points:** 13
**Estado:** Definido
**Fecha:** 2025-11-23

## Descripción

El sistema debe permitir la gestión de roles y permisos granulares basados en RBAC (Role-Based Access Control). Los roles agrupan permisos CRUD sobre modelos y los usuarios heredan permisos según sus roles asignados.

## Actores

- **Actor Principal:** Administrador de Sistema
- **Actores Secundarios:** Usuario final (consume permisos)

## Precondiciones

1. Usuario administrador debe estar autenticado
2. Sistema debe tener modelos registrados en auth.models
3. Base de datos debe estar disponible

## Flujo Principal

1. Administrador accede a módulo de Gestión de Roles
2. Administrador crea nuevo rol con nombre y descripción
3. Administrador selecciona modelo (ej: sale.order)
4. Administrador asigna permisos CRUD: create, read, update, delete
5. Sistema crea registros en auth.permissions (rol + modelo + permisos)
6. Administrador asigna rol a usuarios (tabla auth.user_roles)
7. Sistema valida que permisos se apliquen inmediatamente
8. Usuario con rol asignado puede ejecutar acciones permitidas

## Flujos Alternativos

### FA-1: Rol con Herencia
1. Si administrador define parent_role_id
2. Sistema copia permisos del rol padre automáticamente
3. Administrador puede agregar permisos adicionales
4. Usuario hereda permisos del rol padre + permisos específicos

### FA-2: Eliminación de Rol en Uso
1. Si administrador intenta eliminar rol asignado a usuarios
2. Sistema retorna error 400: "Rol en uso. Reasigne usuarios antes de eliminar"

### FA-3: Usuario sin Permisos
1. Usuario intenta acción sin permiso correspondiente
2. Sistema valida permisos en middleware
3. Sistema retorna error 403: "No tiene permisos para esta acción"
4. Sistema registra intento en audit_log

### FA-4: Conflicto de Permisos (Múltiples Roles)
1. Usuario tiene múltiples roles con permisos contradictorios
2. Sistema aplica política "allow overrides deny" (si algún rol permite, se permite)

## Reglas de Negocio

- **RN-1:** Un usuario puede tener múltiples roles
- **RN-2:** Un rol puede tener múltiples permisos sobre múltiples modelos
- **RN-3:** Permisos son granulares: create, read, update, delete por modelo
- **RN-4:** Herencia de roles: hijo hereda todos los permisos del padre
- **RN-5:** Roles predefinidos: Administrator (todos los permisos), User (solo lectura)
- **RN-6:** Administrador tiene permisos absolutos (bypass RBAC)
- **RN-7:** Política de resolución: "allow overrides deny"

## Criterios de Aceptación

- [ ] Administrador puede crear, editar y eliminar roles
- [ ] Administrador puede asignar permisos CRUD por modelo a roles
- [ ] Administrador puede asignar múltiples roles a un usuario
- [ ] Usuario solo puede ejecutar acciones para las que tiene permisos
- [ ] Sistema retorna 403 cuando usuario sin permisos intenta acción
- [ ] Herencia de roles funciona correctamente (hijo hereda permisos del padre)
- [ ] Roles predefinidos (Administrator, User) existen por defecto
- [ ] Cambios de permisos se aplican inmediatamente sin logout
- [ ] Sistema registra intentos de acceso no autorizado en audit_log

## Entidades Involucradas

- **Principales:**
  - auth.roles (name, description, parent_role_id, is_admin)
  - auth.permissions (role_id, model_id, can_create, can_read, can_update, can_delete)
  - auth.user_roles (user_id, role_id)
- **Relacionadas:**
  - auth.models (nombre de modelos del sistema)
  - auth.users (usuarios con roles)

## Referencias

- [ALCANCE-POR-MODULO.md - MGN-001](../../01-definicion-modulos/ALCANCE-POR-MODULO.md#mgn-001-fundamentos)
- [Auth Domain Model](../domain-models/auth-domain.md)
- [Auth Schema DDL](../database-design/schemas/auth-schema-ddl.sql)
- [Gap Analysis MGN-001](../../01-definicion-modulos/gaps/GAP-ANALYSIS-MGN-001.md)

## Notas Técnicas

- **Patrón Odoo:** Similar a res.groups + ir.model.access (pero más simple)
- **Patrón Gamilit:** RBAC con tabla permissions + middleware de validación
- **Middleware:** Guard/Interceptor que valida permisos antes de ejecutar acción
- **Caché:** Cachear permisos de usuario en Redis para performance
- **Backend:** NestJS Guards + CASL para RBAC
- **Frontend:** Hook usePermissions(['sale.order.create']) para condicionar UI

## Dependencias

- **RF Dependientes:** RF-MGN-001-001 (Autenticación)
- **Bloqueante para:** Todos los módulos transaccionales (necesitan validar permisos)
