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

97
frontend/src/App.css Normal file
View File

@@ -0,0 +1,97 @@
.container {
width: 100%;
}
.loading,
.error {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
min-height: 60vh;
text-align: center;
gap: 1rem;
}
.loading {
font-size: 1.2rem;
color: var(--accent-2);
}
.error {
background: rgba(255, 59, 48, 0.1);
border: 1px solid rgba(255, 59, 48, 0.3);
border-radius: 12px;
padding: 2rem;
}
.error h2 {
color: #ff3b30;
margin-bottom: 0.5rem;
}
.error button {
margin-top: 1rem;
padding: 0.6rem 1.2rem;
background: var(--accent);
border: none;
border-radius: 8px;
color: white;
font-weight: 600;
cursor: pointer;
transition: background 200ms;
}
.error button:hover {
background: var(--accent-2);
}
.controls {
margin: 1.5rem 0;
display: flex;
gap: 1rem;
flex-wrap: wrap;
align-items: center;
}
.controls label {
display: flex;
align-items: center;
gap: 0.5rem;
font-size: 0.9rem;
color: var(--muted);
}
.controls select {
padding: 0.5rem 1rem;
background: rgba(255,255,255,0.06);
border: 1px solid var(--stroke);
border-radius: 8px;
color: var(--text);
font-size: 0.9rem;
cursor: pointer;
transition: border-color 200ms;
}
.controls select:hover {
border-color: var(--accent-2);
}
.ranking-list {
display: flex;
flex-direction: column;
}
footer {
text-align: center;
margin-top: 2.4rem;
padding: 1.4rem 0 0.8rem;
color: var(--muted);
border-top: 1px solid var(--stroke);
font-size: 0.9rem;
}
footer p + p {
margin-top: 0.5rem;
font-size: 0.8rem;
}