# RF-ROLE-002: Gestion de Permisos

## Identificacion

| Campo | Valor |
|-------|-------|
| **ID** | RF-ROLE-002 |
| **Modulo** | MGN-003 Roles/RBAC |
| **Prioridad** | P0 - Critica |
| **Estado** | Ready |
| **Fecha** | 2025-12-05 |

---

## Descripcion

El sistema debe mantener un catalogo de permisos que definen las acciones granulares que los usuarios pueden realizar. Los permisos se agrupan por modulo y se asignan a roles. El sistema soporta permisos jerarquicos donde un permiso padre implica todos sus hijos.

---

## Actores

| Actor | Descripcion |
|-------|-------------|
| Super Admin | Puede ver todos los permisos del sistema |
| Admin | Puede ver permisos disponibles para su tenant |
| Sistema | Registra nuevos permisos al instalar modulos |

---

## Precondiciones

1. Usuario autenticado con permiso `permissions:read`
2. Permisos base del sistema inicializados

---

## Catalogo de Permisos

### Estructura de Permisos

Los permisos siguen el patron `modulo:accion` o `modulo:recurso:accion`:

```
users:read           - Leer usuarios
users:create         - Crear usuarios
users:update         - Actualizar usuarios
users:delete         - Eliminar usuarios
users:*              - Todos los permisos de usuarios (wildcard)

inventory:products:read    - Leer productos
inventory:products:create  - Crear productos
inventory:*                - Todo el modulo inventario
```

### Permisos por Modulo

#### Modulo Auth (MGN-001)

| Permiso | Descripcion |
|---------|-------------|
| auth:sessions:read | Ver sesiones activas |
| auth:sessions:revoke | Revocar sesiones |

#### Modulo Users (MGN-002)

| Permiso | Descripcion |
|---------|-------------|
| users:read | Listar y ver usuarios |
| users:create | Crear usuarios |
| users:update | Actualizar usuarios |
| users:delete | Eliminar usuarios |
| users:activate | Activar/desactivar usuarios |
| users:export | Exportar lista de usuarios |
| users:import | Importar usuarios |

#### Modulo Roles (MGN-003)

| Permiso | Descripcion |
|---------|-------------|
| roles:read | Listar y ver roles |
| roles:create | Crear roles |
| roles:update | Actualizar roles |
| roles:delete | Eliminar roles |
| roles:assign | Asignar roles a usuarios |
| permissions:read | Ver permisos disponibles |

#### Modulo Tenants (MGN-004)

| Permiso | Descripcion |
|---------|-------------|
| tenants:read | Ver configuracion del tenant |
| tenants:update | Actualizar configuracion |
| tenants:billing | Gestionar facturacion |

#### Modulo Settings (MGN-006)

| Permiso | Descripcion |
|---------|-------------|
| settings:read | Ver configuracion |
| settings:update | Modificar configuracion |

#### Modulo Audit (MGN-007)

| Permiso | Descripcion |
|---------|-------------|
| audit:read | Ver logs de auditoria |
| audit:export | Exportar logs |

#### Modulo Reports (MGN-009)

| Permiso | Descripcion |
|---------|-------------|
| reports:read | Ver reportes |
| reports:create | Crear reportes personalizados |
| reports:export | Exportar reportes |
| reports:schedule | Programar reportes |

#### Modulo Financial (MGN-010)

| Permiso | Descripcion |
|---------|-------------|
| financial:accounts:read | Ver cuentas contables |
| financial:accounts:manage | Gestionar cuentas |
| financial:transactions:read | Ver transacciones |
| financial:transactions:create | Crear transacciones |
| financial:transactions:approve | Aprobar transacciones |
| financial:reports:read | Ver reportes financieros |

#### Modulo Inventory (MGN-011)

| Permiso | Descripcion |
|---------|-------------|
| inventory:products:read | Ver productos |
| inventory:products:create | Crear productos |
| inventory:products:update | Actualizar productos |
| inventory:products:delete | Eliminar productos |
| inventory:stock:read | Ver stock |
| inventory:stock:adjust | Ajustar stock |
| inventory:movements:read | Ver movimientos |
| inventory:movements:create | Crear movimientos |

---

## Flujo Principal

### Listar Permisos Disponibles

```
1. Admin accede a Configuracion > Roles > Nuevo/Editar
2. Sistema carga lista de permisos agrupados por modulo
3. Sistema muestra solo permisos habilitados para el tenant
4. Admin puede expandir/colapsar grupos
5. Admin puede buscar permisos por nombre
```

### Ver Permisos de un Rol

```
1. Admin accede a detalle de un rol
2. Sistema muestra permisos agrupados por modulo
3. Sistema indica cuales son heredados vs directos
4. Sistema muestra descripcion de cada permiso
```

---

## Reglas de Negocio

| ID | Regla |
|----|-------|
| RN-001 | Permisos son inmutables por usuarios |
| RN-002 | Permisos se registran por el sistema al instalar modulos |
| RN-003 | Permiso wildcard (*) incluye todas las acciones del modulo |
| RN-004 | Tenant solo ve permisos de modulos que tiene activos |
| RN-005 | Codigo de permiso unico globalmente |
| RN-006 | Permisos pueden estar activos o deprecados |

---

## Jerarquia de Permisos

```
users:*                     (Wildcard - todos los permisos de users)
├── users:read
├── users:create
├── users:update
├── users:delete
├── users:activate
├── users:export
└── users:import

inventory:*                 (Wildcard - todo inventario)
├── inventory:products:*    (Wildcard - productos)
│   ├── inventory:products:read
│   ├── inventory:products:create
│   ├── inventory:products:update
│   └── inventory:products:delete
├── inventory:stock:*
│   ├── inventory:stock:read
│   └── inventory:stock:adjust
└── inventory:movements:*
    ├── inventory:movements:read
    └── inventory:movements:create
```

---

## Criterios de Aceptacion

### Escenario 1: Listar permisos disponibles

```gherkin
Given un admin autenticado
When solicita GET /api/v1/permissions
Then el sistema retorna permisos agrupados por modulo
  And cada permiso incluye code, name, description
  And solo incluye permisos de modulos activos en el tenant
```

### Escenario 2: Buscar permisos

```gherkin
Given lista de 50 permisos
When el admin busca "users"
Then el sistema retorna solo permisos que contienen "users"
  And mantiene agrupacion por modulo
```

### Escenario 3: Validar wildcard

```gherkin
Given un rol con permiso "users:*"
When se verifica si tiene "users:delete"
Then el sistema confirma que SI tiene el permiso
  And el permiso es heredado (no directo)
```

### Escenario 4: Permisos por modulo deshabilitado

```gherkin
Given tenant sin modulo de inventario activo
When admin lista permisos disponibles
Then NO aparecen permisos de "inventory:*"
```

---

## Notas Tecnicas

### API Endpoints

```typescript
// Listar todos los permisos
GET /api/v1/permissions
// Query params: ?search=users&module=users

// Response 200
{
  "data": [
    {
      "module": "users",
      "moduleName": "Gestion de Usuarios",
      "permissions": [
        {
          "id": "perm-uuid",
          "code": "users:read",
          "name": "Leer usuarios",
          "description": "Permite ver listado y detalle de usuarios",
          "isDeprecated": false
        },
        // ...
      ]
    },
    {
      "module": "roles",
      "moduleName": "Roles y Permisos",
      "permissions": [...]
    }
  ]
}

// Listar permisos de un rol
GET /api/v1/roles/:roleId/permissions

// Response 200
{
  "direct": ["users:read", "users:create"],
  "inherited": ["users:update"],  // via wildcard
  "all": ["users:read", "users:create", "users:update"]
}
```

### Modelo de Datos

```typescript
interface Permission {
  id: string;
  code: string;           // users:read
  name: string;           // Leer usuarios
  description: string;
  module: string;         // users
  parentCode?: string;    // users:* (para jerarquia)
  isDeprecated: boolean;
  createdAt: Date;
}
```

---

## Dependencias

| ID | Descripcion |
|----|-------------|
| RF-ROLE-001 | Roles que contienen permisos |
| MGN-004 | Tenants para filtrar por modulos activos |

---

## Estimacion

| Tarea | Puntos |
|-------|--------|
| Backend: Seed de permisos | 2 |
| Backend: Endpoint listar | 2 |
| Backend: Logica wildcard | 3 |
| Backend: Tests | 2 |
| Frontend: PermissionsList component | 2 |
| Frontend: Tests | 1 |
| **Total** | **12 SP** |

---

## Historial

| Version | Fecha | Autor | Cambios |
|---------|-------|-------|---------|
| 1.0 | 2025-12-05 | System | Creacion inicial |
