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:
98
backend/src/interface/schemas/consultor_schema.py
Normal file
98
backend/src/interface/schemas/consultor_schema.py
Normal file
@@ -0,0 +1,98 @@
|
||||
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]
|
||||
Reference in New Issue
Block a user