# Sistema de Controle de Militantes

Sistema para gerenciamento de militantes, células, setores e comitês regionais.

## Estrutura de Permissões (RBAC)

O sistema utiliza um sistema de controle de acesso baseado em papéis (RBAC) com a seguinte hierarquia:

### Níveis de Papéis

1. **Militante Básico** (Nível 1)
   - Visualizar próprios dados
   - Editar próprios dados
   - Visualizar dados da célula

2. **Secretário de Célula** (Nível 2)
   - Todas as permissões do Militante Básico
   - Gerenciar membros da célula
   - Criar membros na célula
   - Visualizar relatórios da célula

3. **Membro de Setor** (Nível 3)
   - Todas as permissões do Secretário de Célula
   - Visualizar relatórios do setor

4. **Secretário de Setor** (Nível 4)
   - Todas as permissões do Membro de Setor
   - Gerenciar células do setor
   - Criar células no setor

5. **Membro de CR** (Nível 5)
   - Todas as permissões do Secretário de Setor
   - Visualizar relatórios do CR

6. **Secretário de CR** (Nível 6)
   - Todas as permissões do Membro de CR
   - Gerenciar setores do CR
   - Criar setores no CR

7. **Membro do CC** (Nível 7)
   - Todas as permissões do Secretário de CR
   - Visualizar relatórios nacionais

8. **Secretário Geral** (Nível 8)
   - Todas as permissões do Membro do CC
   - Gerenciar CRs
   - Criar CRs
   - Configurar sistema

## Instalação

1. Clone o repositório
2. Crie um ambiente virtual:
   ```bash
   python -m venv venv
   source venv/bin/activate  # Linux/Mac
   # ou
   venv\Scripts\activate  # Windows
   ```
3. Instale as dependências:
   ```bash
   pip install -r requirements.txt
   ```
4. Execute as migrações do banco de dados:
   ```bash
   python sql/migrate_db.py
   ```
5. Configure as variáveis de ambiente no arquivo `.env`:
   ```
   FLASK_APP=app.py
   FLASK_ENV=development
   SECRET_KEY=sua_chave_secreta
   MAIL_SERVER=seu_servidor_smtp
   MAIL_PORT=587
   MAIL_USE_TLS=True
   MAIL_USERNAME=seu_email
   MAIL_PASSWORD=sua_senha
   ```
6. Execute o aplicativo:
   ```bash
   flask run
   ```

## Uso

### Decoradores de Permissão

O sistema fornece três decoradores para controle de acesso:

1. `@require_permission(permission_name)`
   - Verifica se o usuário tem uma permissão específica
   - Exemplo: `@require_permission('create_cell_member')`

2. `@require_role(role_name)`
   - Verifica se o usuário tem um papel específico
   - Exemplo: `@require_role('Secretário de Célula')`

3. `@require_minimum_role(min_level)`
   - Verifica se o usuário tem um papel com nível mínimo
   - Exemplo: `@require_minimum_role(Role.SECRETARIO_CR)`

### Verificando Permissões no Código

```python
# Verificar se um usuário tem uma permissão
if user.has_permission('create_cell_member'):
    # Faça algo

# Verificar se um usuário tem um papel
if user.has_role('Secretário de Célula'):
    # Faça algo

# Obter o papel mais alto do usuário
highest_role = user.get_highest_role()
if highest_role and highest_role.nivel >= Role.SECRETARIO_CR:
    # Faça algo
```

## Estrutura do Banco de Dados

O sistema utiliza as seguintes tabelas para o RBAC:

- `roles`: Armazena os papéis disponíveis
- `permissions`: Armazena as permissões disponíveis
- `role_permissions`: Mapeia papéis para permissões
- `user_roles`: Mapeia usuários para papéis

## Segurança

- Todas as senhas são armazenadas com hash bcrypt
- Sessões expiram após período de inatividade
- Controle de acesso granular baseado em papéis
- Proteção contra CSRF
- Validação de entrada de dados
