feat: Sistema de Ranking de Consultores CAPES - versão inicial
Backend (FastAPI + DDD):
- Arquitetura DDD com camadas Domain, Application, Infrastructure, Interface
- Integração com Elasticsearch (ATUACAPES) para dados de consultores
- Integração com Oracle (SUCUPIRA_PAINEL) para coordenações PPG
- Cálculo dos 4 componentes de pontuação (A, B, C, D)
- Cache em memória para otimização de performance
- API REST com endpoints /ranking, /ranking/detalhado, /consultor/{id}
Frontend (React + Vite):
- Interface responsiva com cards expansíveis
- Visualização detalhada de pontuação por componente
- Filtro por quantidade de consultores (Top 10, 50, 100, etc)
Docker:
- docker-compose com shared_network externa
- Backend com Oracle Instant Client
- Frontend com Vite dev server
This commit is contained in:
267
README.md
Normal file
267
README.md
Normal file
@@ -0,0 +1,267 @@
|
||||
# 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
|
||||
```
|
||||
|
||||
## Componentes de Pontuação
|
||||
|
||||
### Componente A: Coordenação CAPES (máx 450 pts)
|
||||
- **CA**: 200 base + 100 tempo + 100 áreas + 20 retorno + 30 bônus = 450
|
||||
- **CAJ**: 150 base + 80 tempo + 100 áreas + 20 retorno + 20 bônus = 370
|
||||
- **CAJ-MP**: 120 base + 60 tempo + 100 áreas + 20 retorno + 15 bônus = 315
|
||||
- **CAM**: 100 base + 50 tempo + 100 áreas + 20 retorno + 10 bônus = 280
|
||||
|
||||
### Componente B: Coordenação de Programa PPG (máx 180 pts)
|
||||
- Base: 70 pts
|
||||
- Tempo: 5 pts/ano (máx 50 pts)
|
||||
- Programas extras: 20 pts/programa (máx 40 pts)
|
||||
- Bônus ativo: 20 pts
|
||||
|
||||
### Componente C: Consultoria (máx 230 pts)
|
||||
- Ativo: 150 pts | Histórico: 100 pts
|
||||
- Tempo: 5 pts/ano (máx 50 pts)
|
||||
- Eventos: 2 pts/evento (máx 20 pts)
|
||||
- Responsável: 5 pts/vez (máx 25 pts)
|
||||
- Áreas extras: 10 pts/área (máx 30 pts)
|
||||
|
||||
### Componente D: Premiações (máx 180 pts)
|
||||
- Premiação: 60 pts
|
||||
- Avaliação: 40 pts
|
||||
- Inscrição: 20 pts
|
||||
|
||||
## Requisitos
|
||||
|
||||
- Python 3.11+
|
||||
- Node.js 18+
|
||||
- Docker e Docker Compose (opcional)
|
||||
- Acesso ao Elasticsearch (ATUACAPES)
|
||||
- Acesso ao Oracle (SUCUPIRA_PAINEL)
|
||||
|
||||
## 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:8000`
|
||||
|
||||
### 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:8000`
|
||||
- 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:8000/docs`
|
||||
- ReDoc: `http://localhost:8000/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`
|
||||
Reference in New Issue
Block a user