fix: Correções no cálculo de pontuação e extração de dados

- Refatora calculador para agrupar coordenações por tipo com hierarquia
- Corrige contagem de eventos separando SAE de consultorias
- Melhora extração de área de avaliação usando dadosConsultoria
- Ajusta pontuação de premiações conforme regras documentadas
- Usa alias ES em vez de índice específico
This commit is contained in:
Frederico Castro
2025-12-09 19:57:35 -03:00
parent 59ae516ee0
commit e7b34e33a8
3 changed files with 98 additions and 36 deletions

View File

@@ -17,21 +17,40 @@ class CalculadorPontuacao:
if not coordenacoes:
return ComponentePontuacao(base=0, tempo=0, extras=0, bonus=0, retorno=0)
coord_atual = next((c for c in coordenacoes if c.periodo.ativo), None)
if not coord_atual:
return ComponentePontuacao(base=0, tempo=0, extras=0, bonus=0, retorno=0)
base_map = {"CA": 200, "CAJ": 150, "CAJ-MP": 120, "CAM": 100}
tempo_max_map = {"CA": 100, "CAJ": 80, "CAJ-MP": 60, "CAM": 50}
bonus_atual_map = {"CA": 30, "CAJ": 20, "CAJ-MP": 15, "CAM": 10}
mult_tempo_map = {"CA": 10, "CAJ": 8, "CAJ-MP": 6, "CAM": 5}
base = base_map.get(coord_atual.tipo, 0)
anos = coord_atual.periodo.anos_decorridos
tempo = min(int(anos * 10), tempo_max_map.get(coord_atual.tipo, 0))
# Agrupa por tipo de coordenação e considera o melhor tipo (hierarquia)
tipos_ordenados = ["CA", "CAJ", "CAJ-MP", "CAM"]
coord_por_tipo = {t: [] for t in tipos_ordenados}
for c in coordenacoes:
coord_por_tipo.setdefault(c.tipo, []).append(c)
extras = min(len(coord_atual.areas_adicionais) * 20, 100)
bonus = bonus_atual_map.get(coord_atual.tipo, 0) if coord_atual.periodo.ativo else 0
retorno = 20 if coord_atual.ja_coordenou_antes else 0
coord_escolhida_tipo = None
for t in tipos_ordenados:
if coord_por_tipo.get(t):
coord_escolhida_tipo = t
break
if not coord_escolhida_tipo:
return ComponentePontuacao(base=0, tempo=0, extras=0, bonus=0, retorno=0)
coord_do_tipo = coord_por_tipo.get(coord_escolhida_tipo, [])
anos_total = sum(c.periodo.anos_decorridos for c in coord_do_tipo)
ativo = any(c.periodo.ativo for c in coord_do_tipo)
base = base_map.get(coord_escolhida_tipo, 0)
tempo = min(int(anos_total * mult_tempo_map.get(coord_escolhida_tipo, 0)), tempo_max_map.get(coord_escolhida_tipo, 0))
extras = 0
areas_adicionais = [a for c in coord_do_tipo for a in c.areas_adicionais]
if areas_adicionais:
extras = min(len(set(areas_adicionais)) * 20, 100)
bonus = bonus_atual_map.get(coord_escolhida_tipo, 0) if ativo else 0
retorno = 20 if len(coord_do_tipo) > 1 else 0
return ComponentePontuacao(base=base, tempo=tempo, extras=extras, bonus=bonus, retorno=retorno)