Files
ranking/backend/src/interface/schemas/consultor_schema.py
Frederico Castro 9e6ba459a8 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
2025-12-09 01:24:35 -03:00

99 lines
2.1 KiB
Python

from pydantic import BaseModel, Field
from typing import List, Optional
class PeriodoSchema(BaseModel):
inicio: str
fim: Optional[str] = None
ativo: bool
anos_decorridos: float
class CoordenacaoCapesSchema(BaseModel):
tipo: str
area_avaliacao: str
periodo: PeriodoSchema
areas_adicionais: List[str]
ja_coordenou_antes: bool
class CoordenacaoProgramaSchema(BaseModel):
id_programa: int
nome_programa: str
codigo_programa: str
nota_ppg: str
modalidade: str
area_avaliacao: str
periodo: PeriodoSchema
class ConsultoriaSchema(BaseModel):
total_eventos: int
eventos_recentes: int
primeiro_evento: str
ultimo_evento: str
vezes_responsavel: int
areas: List[str]
class PremiacaoSchema(BaseModel):
tipo: str
nome_premio: str
ano: int
pontos: int
class ComponentePontuacaoSchema(BaseModel):
base: int
tempo: int
extras: int
bonus: int
retorno: int
total: int
class PontuacaoCompletaSchema(BaseModel):
componente_a: ComponentePontuacaoSchema
componente_b: ComponentePontuacaoSchema
componente_c: ComponentePontuacaoSchema
componente_d: ComponentePontuacaoSchema
pontuacao_total: int
class ConsultorResumoSchema(BaseModel):
id_pessoa: int
nome: str
anos_atuacao: float
ativo: bool
veterano: bool
pontuacao_total: int
rank: Optional[int] = None
class ConsultorDetalhadoSchema(BaseModel):
id_pessoa: int
nome: str
cpf: Optional[str] = None
anos_atuacao: float
ativo: bool
veterano: bool
coordenacoes_capes: List[CoordenacaoCapesSchema]
coordenacoes_programas: List[CoordenacaoProgramaSchema]
consultoria: Optional[ConsultoriaSchema] = None
premiacoes: List[PremiacaoSchema]
pontuacao: PontuacaoCompletaSchema
rank: Optional[int] = None
class RankingResponseSchema(BaseModel):
total: int
limite: int
offset: int
consultores: List[ConsultorResumoSchema]
class RankingDetalhadoResponseSchema(BaseModel):
total: int
limite: int
consultores: List[ConsultorDetalhadoSchema]