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:
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user