Files
ranking/README.md
2025-12-14 21:29:43 -03:00

369 lines
10 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Sistema de Ranking de Consultores CAPES
Sistema completo de ranking de consultores CAPES baseado na Minuta Técnica, desenvolvido com arquitetura DDD (Domain-Driven Design).
## Arquitetura
### Backend (Python + FastAPI + DDD)
- **Domain Layer**: Entities, Value Objects, Domain Services
- **Application Layer**: Use Cases, DTOs
- **Infrastructure Layer**: Repositories, Elasticsearch Client, Oracle Client
- **Interface Layer**: FastAPI Routes, Schemas, Dependencies
### Frontend (React + Vite)
- Interface moderna baseada no layout do HTML de referência
- Componentes reutilizáveis
- Integração com API via Axios
- Design responsivo
## Estrutura do Projeto
```
ranking/
├── backend/
│ ├── src/
│ │ ├── domain/
│ │ │ ├── entities/
│ │ │ │ └── consultor.py
│ │ │ ├── value_objects/
│ │ │ │ ├── periodo.py
│ │ │ │ └── pontuacao.py
│ │ │ ├── repositories/
│ │ │ │ └── consultor_repository.py
│ │ │ └── services/
│ │ │ └── calculador_pontuacao.py
│ │ ├── application/
│ │ │ ├── dtos/
│ │ │ │ └── consultor_dto.py
│ │ │ └── use_cases/
│ │ │ ├── obter_ranking.py
│ │ │ └── obter_consultor.py
│ │ ├── infrastructure/
│ │ │ ├── elasticsearch/
│ │ │ │ └── client.py
│ │ │ ├── oracle/
│ │ │ │ └── client.py
│ │ │ └── repositories/
│ │ │ └── consultor_repository_impl.py
│ │ └── interface/
│ │ ├── api/
│ │ │ ├── app.py
│ │ │ ├── routes.py
│ │ │ ├── config.py
│ │ │ └── dependencies.py
│ │ └── schemas/
│ │ └── consultor_schema.py
│ ├── pyproject.toml
│ ├── Dockerfile
│ └── .env.example
├── frontend/
│ ├── src/
│ │ ├── components/
│ │ │ ├── Header.jsx
│ │ │ ├── Header.css
│ │ │ ├── ConsultorCard.jsx
│ │ │ └── ConsultorCard.css
│ │ ├── services/
│ │ │ └── api.js
│ │ ├── App.jsx
│ │ ├── App.css
│ │ ├── main.jsx
│ │ └── index.css
│ ├── package.json
│ ├── vite.config.js
│ ├── Dockerfile
│ └── nginx.conf
├── docker-compose.yml
├── .env.example
├── .gitignore
└── README.md
```
## Critérios de Pontuação V2
> Baseado na Minuta Técnica - Ranking AtuaCAPES v2.0
### Bloco A: Coordenação CAPES
| Código | Função | Base | Tempo | Teto Tempo | Bônus Atualidade | Bônus Retorno | Teto |
|--------|--------|------|-------|------------|------------------|---------------|------|
| **CA** | Coordenador de Área | 200 | 10 pts/ano | 100 | +30 | +20 | 450 |
| **CAJ** | Coordenador Adjunto | 150 | 8 pts/ano | 80 | +20 | +15 | 370 |
| **CAJ_MP** | Coord. Adjunto MP | 120 | 6 pts/ano | 60 | +15 | +10 | 315 |
| **CAM** | Câmara Temática | 100 | 5 pts/ano | 50 | +20 | +10 | 280 |
**Regras:**
- Tempo = anos completos × multiplicador (respeitando teto)
- Bônus Atualidade: apenas se mandato vigente
- Bônus Retorno: se houve retorno após período de inatividade
### Bloco B: Coordenação de Programa PPG (máx 180 pts)
| Critério | Pontuação |
|----------|-----------|
| Base | 70 pts |
| Tempo | 5 pts/ano (máx 50) |
| Programas extras | 20 pts/programa (máx 40) |
| Bônus por nota PPG | até 20 pts |
> **Nota**: Bloco B = 0 no V1 (dados incompletos no AtuaCAPES)
### Bloco C: Consultoria (máx 230 pts)
| Código | Situação | Base | Tempo | Teto Tempo | Continuidade 8a+ | Retorno | Teto |
|--------|----------|------|-------|------------|------------------|---------|------|
| **CONS_ATIVO** | Ativo | 150 | 5 pts/ano | 50 | +20 | +15 | 230 |
| **CONS_HIST** | Histórico | 100 | 5 pts/ano | 50 | +20 | - | 230 |
| **CONS_FALECIDO** | Falecido | 100 | 5 pts/ano | 50 | +20 | - | 230 |
**Regras:**
- Bônus Continuidade: aplicado se >= 8 anos consecutivos
- Bônus Retorno: apenas para CONS_ATIVO com reativação
### Bloco D: Premiações, Avaliações e Participações
#### Inscrições
| Código | Descrição | Base | Teto |
|--------|-----------|------|------|
| **INSC_AUTOR** | Autoinscrição | 10 | 20 |
| **INSC_INST** | Inscrição Institucional | 30 | 60 |
#### Avaliação de Comissão
| Código | Descrição | Base | Teto | Bônus Recorrência |
|--------|-----------|------|------|-------------------|
| **AVAL_COMIS_PREMIO** | Avaliador Prêmio | 30 | 60 | +2/ano (máx 15) |
| **AVAL_COMIS_GP** | Avaliador Grande Prêmio | 50 | 80 | +3/ano (máx 20) |
#### Coordenação de Comissão
| Código | Descrição | Base | Teto | Bônus Recorrência |
|--------|-----------|------|------|-------------------|
| **COORD_COMIS_PREMIO** | Coord. Comissão Prêmio | 50 | 100 | +4/ano (máx 20) |
| **COORD_COMIS_GP** | Coord. Comissão GP | 60 | 120 | +6/ano (máx 20) |
#### Premiações Recebidas
| Código | Descrição | Base | Teto |
|--------|-----------|------|------|
| **PREMIACAO** | Grande Prêmio CAPES | 100 | 180 |
| **PREMIACAO_GP** | Prêmio CAPES de Tese | 50 | 60 |
| **MENCAO** | Menção Honrosa | 30 | 20 |
#### Bolsas CNPq
| Código | Descrição | Base | Teto |
|--------|-----------|------|------|
| **BOL_BPQ_SUPERIOR** | Bolsa PQ nível 1A/1B/1C | 30 | 60 |
| **BOL_BPQ_INTERMEDIARIO** | Bolsa PQ nível 1D/2 | 30 | 60 |
#### Participações
| Código | Descrição | Base | Teto |
|--------|-----------|------|------|
| **EVENTO** | Participação em Evento | 1 | 5 |
| **PROJ** | Participação em Projeto | 10 | 40 |
#### Orientações (sem teto)
| Código | Descrição | Base |
|--------|-----------|------|
| **ORIENT_POS_DOC** | Orientação Pós-Doc | 15 |
| **ORIENT_TESE** | Orientação Tese | 10 |
| **ORIENT_DISS** | Orientação Dissertação | 5 |
| **CO_ORIENT_POS_DOC** | Co-Orientação Pós-Doc | 7 |
| **CO_ORIENT_TESE** | Co-Orientação Tese | 5 |
| **CO_ORIENT_DISS** | Co-Orientação Dissertação | 3 |
#### Bancas (sem teto)
| Código | Descrição | Base |
|--------|-----------|------|
| **MB_BANCA_POS_DOC** | Banca Pós-Doc | 3 |
| **MB_BANCA_TESE** | Banca Tese | 3 |
| **MB_BANCA_DISS** | Banca Dissertação | 2 |
### Selos Visuais (sem pontuação)
Indicadores visuais que aparecem no card do consultor:
| Selo | Descrição | Ícone |
|------|-----------|-------|
| Coord. PPG | Coordenador de Programa | 🎓 |
| Presid. Câmara | Presidente de Câmara Temática | 🏛️ |
| Bolsista PQ | Bolsista de Produtividade CNPq | 🔬 |
| Grande Prêmio | Vencedor do Grande Prêmio | 🏆 |
| Prêmio | Vencedor de Prêmio | 🥇 |
| Menção Honrosa | Menção Honrosa | 🎖️ |
| Orientações | Orient. Pós-Doc/Tese/Diss | 📚📖📝 |
| Co-Orientações | Co-Orient. Pós-Doc/Tese/Diss | 📚📖📝 |
### Fórmula de Cálculo
```
Score_Atuação = min(Base + Tempo + Bônus, Teto)
Score_Total = Bloco_A + Bloco_B + Bloco_C + Bloco_D
```
## Requisitos
- Python 3.11+
- Node.js 18+
- Docker e Docker Compose (opcional)
- Acesso ao Elasticsearch (ATUACAPES)
- Acesso ao Oracle
## Setup Local
### Backend
1. Entre no diretório do backend:
```bash
cd backend
```
2. Crie ambiente virtual e instale dependências:
```bash
poetry install
```
3. Configure as variáveis de ambiente:
```bash
cp .env.example .env
```
4. Edite `.env` com suas credenciais:
```
ES_URL=http://seu-elasticsearch:9200
ES_INDEX=atuacapes
ES_USER=seu_usuario_elastic
ES_PASSWORD=sua_senha_elastic
ORACLE_USER=seu_usuario
ORACLE_PASSWORD=sua_senha
ORACLE_DSN=host:1521/service_name
```
5. Execute o backend:
```bash
poetry run python src/main.py
```
A API estará disponível em `http://localhost:8010`
### Frontend
1. Entre no diretório do frontend:
```bash
cd frontend
```
2. Instale dependências:
```bash
npm install
```
3. Execute em modo desenvolvimento:
```bash
npm run dev
```
O frontend estará disponível em `http://localhost:5173`
## Setup com Docker
1. Configure as variáveis de ambiente:
```bash
cp .env.example .env
```
2. Edite `.env` com suas credenciais
3. Execute com Docker Compose:
```bash
docker-compose up -d
```
- Backend: `http://localhost:8010`
- Frontend: `http://localhost`
## Endpoints da API
### GET /api/v1/ranking
Retorna o ranking resumido de consultores.
**Query Parameters:**
- `limite` (int, default=100): Limite de consultores
- `offset` (int, default=0): Offset para paginação
- `componente` (str, optional): Filtrar por componente (a, b, c, d)
### GET /api/v1/ranking/detalhado
Retorna o ranking completo com todos os detalhes.
**Query Parameters:**
- `limite` (int, default=100): Limite de consultores
- `componente` (str, optional): Filtrar por componente (a, b, c, d)
### GET /api/v1/consultor/{id_pessoa}
Retorna detalhes completos de um consultor específico.
### GET /api/v1/health
Health check da API.
## Fontes de Dados
### Elasticsearch (ATUACAPES)
- Índice: `atuacapes__1763197236`
- Campos: `id`, `dadosPessoais`, `atuacoes`
- Tipos de atuação:
- Coordenação de Área de Avaliação
- Consultor
- Premiação Prêmio
- Avaliação Prêmio
- Inscrição Prêmio
### Oracle (SUCUPIRA_PAINEL)
- Tabela: `VM_COORDENADOR`
- JOIN com: `VM_PROGRAMA_SUCUPIRA`, `VM_AREA_CONHECIMENTO`, `VM_AREA_AVALIACAO`
- 29.546 registros (4.150 ativos, 25.396 históricos)
## Documentação da API
Após iniciar o backend, acesse:
- Swagger UI: `http://localhost:8010/docs`
- ReDoc: `http://localhost:8010/redoc`
## Desenvolvimento
### Testes
```bash
cd backend
poetry run pytest
```
### Linting
```bash
poetry run black src/
poetry run ruff check src/
```
### Build para Produção
**Backend:**
```bash
docker build -t ranking-capes-backend ./backend
```
**Frontend:**
```bash
cd frontend
npm run build
```
## Referências
- Documentação dos critérios: `.claude/rules/ranking-consultores-capes.md`
- Queries e mapeamentos: `.claude/rules/ranking-queries-elasticsearch.md`