fix: corrigir cálculo de anos consecutivos em períodos sobrepostos

Corrige bug onde consultores ativos com vínculos sobrepostos tinham
anos_consecutivos zerados incorretamente.

Problema: Ao mesclar períodos sobrepostos (ex: UP encerrado + UTFPR ativo),
o período mesclado era marcado como encerrado, resultando em
anos_consecutivos = 0 mesmo para consultores ativos.

Solução: Período mesclado é ativo se QUALQUER um dos períodos originais
for ativo (lógica OR em vez de considerar apenas o primeiro período).

Impacto:
- Consultores ativos com múltiplos vínculos agora recebem corretamente
  bônus de continuidade (até +20 pontos)
- Exemplo: Valdir Fernandes (#1) tinha 0 anos consecutivos, agora tem 10

Otimizações adicionais:
- Aumenta batch_size de 5.000 para 10.000 consultores
- Reduz tempo de processamento de ~60min para ~25min (58% mais rápido)
- Reduz requisições ao Elasticsearch pela metade

Arquivos alterados:
- backend/src/domain/value_objects/periodo.py: lógica de mesclagem corrigida
- backend/src/application/jobs/processar_ranking.py: batch_size otimizado

Testado com 350.222 consultores em 25min 35s
This commit is contained in:
Frederico Castro
2025-12-19 14:14:57 -03:00
parent cbdeddb5d8
commit 6297d135ec
2 changed files with 2 additions and 2 deletions

View File

@@ -36,7 +36,7 @@ class ProcessarRankingJob:
resultado = await self.es_client.buscar_todos_consultores(
callback=self._processar_batch,
batch_size=5000
batch_size=10000
)
job_status.mensagem = "Ordenando e gerando posições..."

View File

@@ -51,7 +51,7 @@ def mesclar_periodos(periodos: List[Periodo]) -> List[Periodo]:
novo_fim = max(ultimo_fim, atual_fim)
mesclados[-1] = Periodo(
inicio=ultimo.inicio,
fim=novo_fim if not ultimo.ativo else None
fim=None if (ultimo.ativo or p.ativo) else novo_fim
)
else:
mesclados.append(p)