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
99 lines
2.1 KiB
Python
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]
|