Files
ranking/backend/src/application/dtos/consultor_dto.py
Frederico Castro ff4d838f34 feat: Aprimora cálculo de pontuação e extração de dados
- Adiciona campos situacao, anos_completos, anos_consecutivos e retornos
  na entidade Consultoria para suportar regras documentadas
- Implementa mesclagem de períodos sobrepostos para evitar contagem dupla
- Melhora componente A com cálculo por área e detecção de retornos
- Ajusta componente B com bônus por nota PPG
- Refatora componente C com bônus de continuidade e retorno
- Implementa componente D com classificação de nível de prêmio
  (Grande Prêmio, PCT, Interfarma, outros) e pontuação diferenciada
- Trata datas inconsistentes (fim < início) como períodos em aberto
- Extrai situacaoConsultoria do campo dadosConsultoria.situacaoConsultoria
2025-12-09 22:57:46 -03:00

103 lines
1.9 KiB
Python

from dataclasses import dataclass, asdict
from typing import List, Optional, Dict, Any
from datetime import datetime
@dataclass
class PeriodoDTO:
inicio: str
fim: Optional[str]
ativo: bool
anos_decorridos: float
@dataclass
class CoordenacaoCapesDTO:
tipo: str
area_avaliacao: str
periodo: PeriodoDTO
areas_adicionais: List[str]
ja_coordenou_antes: bool
@dataclass
class CoordenacaoProgramaDTO:
id_programa: int
nome_programa: str
codigo_programa: str
nota_ppg: str
modalidade: str
area_avaliacao: str
periodo: PeriodoDTO
@dataclass
class ConsultoriaDTO:
total_eventos: int
eventos_recentes: int
primeiro_evento: str
ultimo_evento: str
vezes_responsavel: int
areas: List[str]
situacao: str
anos_completos: int
anos_consecutivos: int
retornos: int
@dataclass
class PremiacaoDTO:
tipo: str
nome_premio: str
ano: int
pontos: int
@dataclass
class ComponentePontuacaoDTO:
base: int
tempo: int
extras: int
bonus: int
retorno: int
total: int
@dataclass
class PontuacaoCompletaDTO:
componente_a: ComponentePontuacaoDTO
componente_b: ComponentePontuacaoDTO
componente_c: ComponentePontuacaoDTO
componente_d: ComponentePontuacaoDTO
pontuacao_total: int
@dataclass
class ConsultorResumoDTO:
id_pessoa: int
nome: str
anos_atuacao: float
ativo: bool
veterano: bool
pontuacao_total: int
rank: Optional[int] = None
@dataclass
class ConsultorDetalhadoDTO:
id_pessoa: int
nome: str
cpf: Optional[str]
anos_atuacao: float
ativo: bool
veterano: bool
coordenacoes_capes: List[CoordenacaoCapesDTO]
coordenacoes_programas: List[CoordenacaoProgramaDTO]
consultoria: Optional[ConsultoriaDTO]
premiacoes: List[PremiacaoDTO]
pontuacao: PontuacaoCompletaDTO
rank: Optional[int] = None
def to_dict(self) -> Dict[str, Any]:
return asdict(self)