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
This commit is contained in:
Frederico Castro
2025-12-09 22:57:46 -03:00
parent 9a8332b740
commit ff4d838f34
7 changed files with 348 additions and 83 deletions

View File

@@ -18,6 +18,17 @@ class Periodo:
dias = (fim - self.inicio).days
return round(dias / 365.25, 1)
def anos_completos(self, data_referencia: Optional[datetime] = None) -> int:
"""
Retorna apenas anos completos entre início e fim (ou data de referência).
Usado para pontuação que desconsidera frações de ano.
"""
fim = self.fim or data_referencia or datetime.now()
if fim < self.inicio:
return 0
return int((fim - self.inicio).days // 365)
def __post_init__(self) -> None:
# Se houver fim anterior ao início, o período é tratado como aberto.
if self.fim and self.fim < self.inicio:
raise ValueError("Data de fim não pode ser anterior à data de início")
object.__setattr__(self, "fim", None)