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:
Frederico Castro
2025-12-09 01:24:35 -03:00
commit 9e6ba459a8
69 changed files with 4902 additions and 0 deletions

View File

@@ -0,0 +1,23 @@
from dataclasses import dataclass
from datetime import datetime
from typing import Optional
@dataclass(frozen=True)
class Periodo:
inicio: datetime
fim: Optional[datetime] = None
@property
def ativo(self) -> bool:
return self.fim is None
@property
def anos_decorridos(self) -> float:
fim = self.fim if self.fim else datetime.now()
dias = (fim - self.inicio).days
return round(dias / 365.25, 1)
def __post_init__(self) -> None:
if self.fim and self.fim < self.inicio:
raise ValueError("Data de fim não pode ser anterior à data de início")