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, Jobs, Mappers, Services
- Infrastructure Layer: Repositories, Elasticsearch Client, Oracle Client, Cache
- Interface Layer: FastAPI Routes, Schemas, Dependencies
Frontend (React + Vite)
- Interface moderna com componentes reutilizáveis
- Comparação lado a lado de consultores
- Sugestão de consultores por tema
- Exportação de fichas em PDF
- Integração com API via Axios
- Design responsivo
Estrutura do Projeto
ranking/
├── backend/
│ ├── src/
│ │ ├── domain/
│ │ │ ├── entities/
│ │ │ │ ├── consultor.py
│ │ │ │ └── consultor_ranking.py
│ │ │ ├── value_objects/
│ │ │ │ ├── criterios_pontuacao.py
│ │ │ │ ├── periodo.py
│ │ │ │ └── pontuacao.py
│ │ │ ├── repositories/
│ │ │ │ └── consultor_repository.py
│ │ │ └── services/
│ │ │ └── calculador_pontuacao.py
│ │ ├── application/
│ │ │ ├── dtos/
│ │ │ │ └── consultor_dto.py
│ │ │ ├── jobs/
│ │ │ │ ├── job_status.py
│ │ │ │ ├── processar_ranking.py
│ │ │ │ ├── popular_componente_b_job.py
│ │ │ │ └── scheduler.py
│ │ │ ├── mappers/
│ │ │ │ └── ranking_mapper.py
│ │ │ ├── services/
│ │ │ │ └── pdf_service.py
│ │ │ └── use_cases/
│ │ │ ├── obter_ranking.py
│ │ │ └── obter_consultor.py
│ │ ├── infrastructure/
│ │ │ ├── cache/
│ │ │ │ └── ranking_cache.py
│ │ │ ├── elasticsearch/
│ │ │ │ └── client.py
│ │ │ ├── oracle/
│ │ │ │ ├── client.py
│ │ │ │ └── ranking_repository.py
│ │ │ ├── repositories/
│ │ │ │ └── consultor_repository_impl.py
│ │ │ └── ranking_store.py
│ │ └── interface/
│ │ ├── api/
│ │ │ ├── app.py
│ │ │ ├── routes.py
│ │ │ ├── config.py
│ │ │ └── dependencies.py
│ │ └── schemas/
│ │ ├── consultor_schema.py
│ │ └── ranking_schema.py
│ ├── scripts/
│ ├── sql/
│ ├── static/
│ ├── tests/
│ ├── requirements.txt
│ ├── Dockerfile
│ └── .env.example
│
├── frontend/
│ ├── src/
│ │ ├── components/
│ │ │ ├── Header.jsx
│ │ │ ├── ConsultorCard.jsx
│ │ │ ├── CompararModal.jsx
│ │ │ ├── FiltroSelos.jsx
│ │ │ ├── BlocoCriteriosModal.jsx
│ │ │ ├── RawDataModal.jsx
│ │ │ └── SugerirConsultores.jsx
│ │ ├── services/
│ │ │ └── api.js
│ │ ├── App.jsx
│ │ ├── App.css
│ │ ├── main.jsx
│ │ └── index.css
│ ├── package.json
│ ├── vite.config.js
│ └── Dockerfile
│
├── scripts/
├── tools/
├── docker-compose.yml
├── .env.example
├── .gitignore
└── README.md
Critérios de Pontuação
Baseado na Minuta Técnica - Ranking AtuaCAPES
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: Consultoria (máx 230 pts)
| Código | Situação | Base | Tempo | Teto Tempo | Bônus Atualidade | Continuidade 8a+ | Retorno | Teto |
|---|---|---|---|---|---|---|---|---|
| CONS_ATIVO | Ativo | 150 | 5 pts/ano | 50 | +20 | +20 | +15 | 230 |
| CONS_HIST | Histórico | 100 | 5 pts/ano | 50 | - | +20 | +20 | 230 |
| CONS_FALECIDO | Falecido | 100 | 5 pts/ano | 50 | - | +20 | - | 230 |
Regras:
- Bônus Continuidade: aplicado se >= 8 anos consecutivos
- Bônus Retorno: se houve reativação após período de inatividade
Bloco C: Inscrições, Avaliações, Premiações e Orientações
Inscrições
| Código | Descrição | Base | Teto | Bônus Recorrência |
|---|---|---|---|---|
| INSC_AUTOR | Autoinscrição | 10 | 20 | +2/participação (máx 10) |
| INSC_INST_AUTOR | Inscrição Institucional | 20 | 50 | +5/participação (máx 10) |
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 | 40 | 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 | 40 | 100 | +4/ano (máx 20) |
| COORD_COMIS_GP | Coord. Comissão GP | 50 | 120 | +6/ano (máx 20) |
Premiações Recebidas (Autor)
| Código | Descrição | Base | Teto |
|---|---|---|---|
| PREMIACAO_GP_AUTOR | Grande Prêmio CAPES (Autor) | 100 | 300 |
| PREMIACAO_AUTOR | Prêmio CAPES de Tese (Autor) | 50 | 150 |
| MENCAO_AUTOR | Menção Honrosa (Autor) | 30 | 90 |
Orientações e Bancas (apenas selos, sem pontuação direta)
| Código | Descrição | Gera Selo |
|---|---|---|
| ORIENT_POS_DOC | Orientação Pós-Doc | Sim |
| ORIENT_TESE | Orientação Tese | Sim |
| ORIENT_DISS | Orientação Dissertação | Sim |
| CO_ORIENT_POS_DOC | Co-Orientação Pós-Doc | Sim |
| CO_ORIENT_TESE | Co-Orientação Tese | Sim |
| CO_ORIENT_DISS | Co-Orientação Dissertação | Sim |
| MB_BANCA_POS_DOC | Banca Pós-Doc | Sim |
| MB_BANCA_TESE | Banca Tese | Sim |
| MB_BANCA_DISS | Banca Dissertação | Sim |
Nota: Orientações e bancas de trabalhos premiados geram selos especiais (ex: ORIENT_TESE_PREM)
Bloco D: Bolsas e Participações
Bolsas CNPq
| Código | Descrição | Base | Teto |
|---|---|---|---|
| BOL_BPQ_NIVEL | Bolsista PQ (qualquer nível) | 30 | 60 |
Participações
| Código | Descrição | Base | Teto | Bônus Recorrência |
|---|---|---|---|---|
| EVENTO | Participação em Evento | 1 | 5 | +1/participação (máx 10) |
| PROJ | Participação em Projeto | 10 | 30 | +2/participação (máx 10) |
Bloco E: Coordenação PPG
| Código | Descrição | Base | Bônus Atualidade | Bônus Retorno | Continuidade 8a+ |
|---|---|---|---|---|---|
| PPG_COORD | Coordenador de Programa | 0 | +15 | +10 | +15 |
Nota: PPG_COORD gera selo visual mas não pontua diretamente (dados incompletos no AtuaCAPES)
Selos Visuais
Indicadores visuais que aparecem no card do consultor:
| Selo | Descrição |
|---|---|
| Coord. PPG | Coordenador de Programa |
| Bolsista PQ | Bolsista de Produtividade CNPq |
| Grande Prêmio | Autor de Grande Prêmio |
| Prêmio | Autor de Prêmio |
| Menção Honrosa | Autor de Menção Honrosa |
| Orientador Pós-Doc/Tese/Diss | Orientou trabalho |
| Coorientador Pós-Doc/Tese/Diss | Coorientou trabalho |
| Banca Pós-Doc/Tese/Diss | Participou de banca |
| Idioma Bilíngue/Multilíngue | Proficiência em idiomas |
| Titulação | Mestre/Doutor/Pós-Doutor |
Fórmula de Cálculo
Score_Atuação = min(Base + Tempo + Bônus, Teto)
Score_Total = Bloco_A + Bloco_B + Bloco_C + Bloco_D + Bloco_E
Requisitos
- Python 3.11+
- Node.js 18+
- Docker e Docker Compose (opcional)
- Acesso ao Elasticsearch (ATUACAPES)
- Acesso ao Oracle
Setup Local
Backend
- Entre no diretório do backend:
cd backend
- Crie ambiente virtual e instale dependências:
python -m venv venv
source venv/bin/activate
pip install -r requirements.txt
- Configure as variáveis de ambiente:
cp .env.example .env
- Edite
.envcom suas credenciais:
ES_URL=http://seu-elasticsearch:9200
ES_INDEX=atuacapes
ES_USER=seu_usuario_elastic
ES_PASSWORD=sua_senha_elastic
ORACLE_LOCAL_USER=seu_usuario
ORACLE_LOCAL_PASSWORD=sua_senha
ORACLE_LOCAL_DSN=host:1521/service_name
- Execute o backend:
python -m uvicorn src.interface.api.app:app --host 0.0.0.0 --port 8000 --reload
A API estará disponível em http://localhost:8000
Frontend
- Entre no diretório do frontend:
cd frontend
- Instale dependências:
npm install
- Execute em modo desenvolvimento:
npm run dev
O frontend estará disponível em http://localhost:5173
Setup com Docker
- Crie a rede compartilhada (apenas uma vez):
docker network create shared_network
- Configure as variáveis de ambiente:
cp .env.example .env
-
Edite
.envcom suas credenciais -
Execute com Docker Compose:
docker-compose up -d
- Backend:
http://localhost:8010 - Frontend:
http://localhost:5173 - Oracle local:
localhost:1521
Endpoints da API
Ranking
| Método | Endpoint | Descrição |
|---|---|---|
| GET | /api/v1/ranking |
Ranking resumido |
| GET | /api/v1/ranking/paginado |
Ranking paginado com detalhes |
| GET | /api/v1/ranking/detalhado |
Ranking completo |
| GET | /api/v1/ranking/busca?nome=X |
Busca por nome |
| GET | /api/v1/ranking/estatisticas |
Estatísticas do ranking |
| GET | /api/v1/ranking/status |
Status do job de processamento |
| GET | /api/v1/ranking/selos |
Lista de selos disponíveis |
| GET | /api/v1/ranking/posicao/{id} |
Posição de um consultor |
| POST | /api/v1/ranking/processar |
Dispara reprocessamento |
Consultor
| Método | Endpoint | Descrição |
|---|---|---|
| GET | /api/v1/consultor/{id} |
Detalhes do consultor |
| GET | /api/v1/consultor/{id}/raw |
Documento ES completo |
| GET | /api/v1/consultor/{id}/lattes |
Dados do Lattes |
| GET | /api/v1/consultor/{id}/pdf |
Exportar ficha em PDF |
Sugestões
| Método | Endpoint | Descrição |
|---|---|---|
| GET | /api/v1/consultores/sugerir?tema=X |
Sugerir consultores por tema |
| GET | /api/v1/consultores/areas-avaliacao |
Listar áreas de avaliação |
| POST | /api/v1/equipe/pdf |
Gerar PDF de equipe |
Utilitários
| Método | Endpoint | Descrição |
|---|---|---|
| GET | /api/v1/health |
Health check |
| GET | / |
Info da API |
Fontes de Dados
Elasticsearch (ATUACAPES)
- Índice:
atuacapes - Campos:
id,dadosPessoais,atuacoes,idiomas,formacoes,titulacoes,identificadorLattes - Tipos de atuação:
- Coordenação de Área de Avaliação
- Histórico de Coordenação de Área de Avaliação
- Consultor
- Histórico de Consultoria
- Premiação Prêmio
- Avaliação Prêmio
- Inscrição Prêmio
- Docência
- Orientação
- Bolsista CNPq
Oracle Local (Ranking)
- Tabela:
TB_RANKING_CONSULTOR - Armazena ranking pré-calculado para performance
- ~350.000 consultores
Oracle CAPES (SUCUPIRA_PAINEL)
- Tabela:
VM_COORDENADOR - JOIN com:
VM_PROGRAMA_SUCUPIRA,VM_AREA_CONHECIMENTO,VM_AREA_AVALIACAO
Documentação da API
Após iniciar o backend, acesse:
- Swagger UI:
http://localhost:8000/docs - ReDoc:
http://localhost:8000/redoc
Desenvolvimento
Testes
cd backend
pytest
Linting
black src/
ruff check src/
Build para Produção
Backend:
docker build -t ranking-capes-backend ./backend
Frontend:
cd frontend
npm run build
Funcionalidades do Frontend
- Ranking Paginado: Navegação por páginas com 10-500 registros por página
- Busca por Nome: Localiza consultor e navega para sua posição
- Comparação: Selecione 2 consultores para comparar lado a lado
- Sugestão por Tema: Busca consultores por área de conhecimento/pesquisa
- Filtro por Selos: Filtra por tipos de atuação
- Exportação PDF: Gera ficha individual ou de equipe
- Detalhes Expandidos: Card expansível com todas as atuações
- Integração Lattes: Exibe dados do currículo Lattes
Description
Languages
Python
54%
JavaScript
25.8%
CSS
12.9%
HTML
6.2%
Shell
1%