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