# 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 | - | - | +20 | - | 230 |

**Regras:**
- Bônus Continuidade: aplicado se >= 8 anos consecutivos
- Bônus Retorno: apenas para CONS_ATIVO com reativação
- CONS_FALECIDO não pontua por tempo

### 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 |
|--------|-----------|------|------|
| **AVAL_COMIS_PREMIO** | Avaliador Prêmio | 30 | 60 |
| **AVAL_COMIS_GP** | Avaliador Grande Prêmio | 50 | 80 |

#### Coordenação de Comissão

| Código | Descrição | Base | Teto |
|--------|-----------|------|------|
| **COORD_COMIS_PREMIO** | Coord. Comissão Prêmio | 50 | 100 |
| **COORD_COMIS_GP** | Coord. Comissão GP | 60 | 120 |

#### 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 | 30 |

#### 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 | 50 | 100 |

#### Participações

| Código | Descrição | Base | Teto |
|--------|-----------|------|------|
| **EVENTO** | Participação em Evento | 1 | 5 |
| **PROJ** | Participação em Projeto | 10 | 40 |

#### Orientações

| Código | Descrição | Base | Teto |
|--------|-----------|------|------|
| **ORIENT_POS_DOC** | Orientação Pós-Doc | 15 | 100 |
| **ORIENT_TESE** | Orientação Tese | 10 | 50 |
| **ORIENT_DISS** | Orientação Dissertação | 5 | 25 |
| **CO_ORIENT_POS_DOC** | Co-Orientação Pós-Doc | 7 | 35 |
| **CO_ORIENT_TESE** | Co-Orientação Tese | 5 | 25 |
| **CO_ORIENT_DISS** | Co-Orientação Dissertação | 3 | 15 |

#### Bancas

| Código | Descrição | Base | Teto |
|--------|-----------|------|------|
| **MB_BANCA_POS_DOC** | Banca Pós-Doc | 3 | 15 |
| **MB_BANCA_TESE** | Banca Tese | 3 | 15 |
| **MB_BANCA_DISS** | Banca Dissertação | 2 | 10 |

### 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`
