Reimplementa sistema de ranking com novos critérios V2
Mudanças principais: - Substitui 4 Componentes (A,B,C,D) por 3 Blocos (A,C,D) - Remove Componente B (Coordenação PPG = 0 pts no V1) - Adiciona novos tipos de atuação do Elasticsearch - Implementa critérios de pontuação com tetos individuais Bloco A - Coordenação CAPES: - CA (max 450), CAJ (max 370), CAJ_MP (max 315), CAM (max 280) - Calcula base + tempo + bônus atualidade + bônus retorno Bloco C - Consultoria: - CONS_ATIVO (base 150), CONS_HIST (base 100), CONS_FALECIDO (base 100) - Bônus continuidade: 3anos=+5, 5anos=+10, 8anos=+15 - Bônus retorno: +15 Bloco D - Premiações/Avaliações: - Inscrições (INSC_AUTOR, INSC_INST) - Avaliações (AVAL_COMIS_PREMIO, AVAL_COMIS_GP) - Coordenações (COORD_COMIS_PREMIO, COORD_COMIS_GP) - Premiações (PREMIACAO, PREMIACAO_GP, MENCAO) - Bolsas CNPQ, Participações, Orientações, Membros de Banca Frontend: - Header, ConsultorCard, CompararModal atualizados para 3 blocos - API service atualizado para nova estrutura de dados
This commit is contained in:
289
backend/src/domain/value_objects/criterios_pontuacao.py
Normal file
289
backend/src/domain/value_objects/criterios_pontuacao.py
Normal file
@@ -0,0 +1,289 @@
|
||||
from dataclasses import dataclass
|
||||
from typing import Dict, Optional
|
||||
from enum import Enum
|
||||
|
||||
|
||||
class Bloco(Enum):
|
||||
A = "A"
|
||||
C = "C"
|
||||
D = "D"
|
||||
|
||||
|
||||
class TipoAtuacao(Enum):
|
||||
FUNCAO = "Função"
|
||||
RESULTADO = "Resultado"
|
||||
PAPEL = "Papel"
|
||||
PARTICIPACAO = "Participação"
|
||||
|
||||
|
||||
@dataclass(frozen=True)
|
||||
class CriterioPontuacao:
|
||||
codigo: str
|
||||
bloco: Bloco
|
||||
tipo: TipoAtuacao
|
||||
base: int
|
||||
teto: int
|
||||
pontua_tempo: bool = False
|
||||
multiplicador_tempo: int = 0
|
||||
teto_tempo: int = 0
|
||||
bonus_atualidade: int = 0
|
||||
bonus_retorno: int = 0
|
||||
bonus_continuidade_3anos: int = 0
|
||||
bonus_continuidade_5anos: int = 0
|
||||
bonus_continuidade_8anos: int = 0
|
||||
|
||||
|
||||
CRITERIOS: Dict[str, CriterioPontuacao] = {
|
||||
"CA": CriterioPontuacao(
|
||||
codigo="CA",
|
||||
bloco=Bloco.A,
|
||||
tipo=TipoAtuacao.FUNCAO,
|
||||
base=200,
|
||||
teto=450,
|
||||
pontua_tempo=True,
|
||||
multiplicador_tempo=10,
|
||||
teto_tempo=100,
|
||||
bonus_atualidade=30,
|
||||
bonus_retorno=20,
|
||||
),
|
||||
"CAJ": CriterioPontuacao(
|
||||
codigo="CAJ",
|
||||
bloco=Bloco.A,
|
||||
tipo=TipoAtuacao.FUNCAO,
|
||||
base=150,
|
||||
teto=370,
|
||||
pontua_tempo=True,
|
||||
multiplicador_tempo=8,
|
||||
teto_tempo=80,
|
||||
bonus_atualidade=20,
|
||||
bonus_retorno=20,
|
||||
),
|
||||
"CAJ_MP": CriterioPontuacao(
|
||||
codigo="CAJ_MP",
|
||||
bloco=Bloco.A,
|
||||
tipo=TipoAtuacao.FUNCAO,
|
||||
base=120,
|
||||
teto=315,
|
||||
pontua_tempo=True,
|
||||
multiplicador_tempo=6,
|
||||
teto_tempo=60,
|
||||
bonus_atualidade=15,
|
||||
bonus_retorno=20,
|
||||
),
|
||||
"CAM": CriterioPontuacao(
|
||||
codigo="CAM",
|
||||
bloco=Bloco.A,
|
||||
tipo=TipoAtuacao.FUNCAO,
|
||||
base=100,
|
||||
teto=280,
|
||||
pontua_tempo=True,
|
||||
multiplicador_tempo=5,
|
||||
teto_tempo=50,
|
||||
bonus_atualidade=10,
|
||||
bonus_retorno=20,
|
||||
),
|
||||
"PPG_COORD": CriterioPontuacao(
|
||||
codigo="PPG_COORD",
|
||||
bloco=Bloco.A,
|
||||
tipo=TipoAtuacao.FUNCAO,
|
||||
base=0,
|
||||
teto=0,
|
||||
pontua_tempo=True,
|
||||
multiplicador_tempo=0,
|
||||
teto_tempo=0,
|
||||
),
|
||||
"CONS_ATIVO": CriterioPontuacao(
|
||||
codigo="CONS_ATIVO",
|
||||
bloco=Bloco.C,
|
||||
tipo=TipoAtuacao.FUNCAO,
|
||||
base=150,
|
||||
teto=230,
|
||||
pontua_tempo=True,
|
||||
multiplicador_tempo=5,
|
||||
teto_tempo=50,
|
||||
bonus_continuidade_3anos=5,
|
||||
bonus_continuidade_5anos=10,
|
||||
bonus_continuidade_8anos=15,
|
||||
bonus_retorno=15,
|
||||
),
|
||||
"CONS_HIST": CriterioPontuacao(
|
||||
codigo="CONS_HIST",
|
||||
bloco=Bloco.C,
|
||||
tipo=TipoAtuacao.FUNCAO,
|
||||
base=100,
|
||||
teto=230,
|
||||
pontua_tempo=True,
|
||||
multiplicador_tempo=5,
|
||||
teto_tempo=50,
|
||||
),
|
||||
"CONS_FALECIDO": CriterioPontuacao(
|
||||
codigo="CONS_FALECIDO",
|
||||
bloco=Bloco.C,
|
||||
tipo=TipoAtuacao.FUNCAO,
|
||||
base=100,
|
||||
teto=230,
|
||||
pontua_tempo=False,
|
||||
),
|
||||
"INSC_AUTOR": CriterioPontuacao(
|
||||
codigo="INSC_AUTOR",
|
||||
bloco=Bloco.D,
|
||||
tipo=TipoAtuacao.PAPEL,
|
||||
base=10,
|
||||
teto=20,
|
||||
),
|
||||
"INSC_INST": CriterioPontuacao(
|
||||
codigo="INSC_INST",
|
||||
bloco=Bloco.D,
|
||||
tipo=TipoAtuacao.PAPEL,
|
||||
base=30,
|
||||
teto=60,
|
||||
),
|
||||
"AVAL_COMIS_PREMIO": CriterioPontuacao(
|
||||
codigo="AVAL_COMIS_PREMIO",
|
||||
bloco=Bloco.D,
|
||||
tipo=TipoAtuacao.FUNCAO,
|
||||
base=30,
|
||||
teto=60,
|
||||
),
|
||||
"AVAL_COMIS_GP": CriterioPontuacao(
|
||||
codigo="AVAL_COMIS_GP",
|
||||
bloco=Bloco.D,
|
||||
tipo=TipoAtuacao.FUNCAO,
|
||||
base=50,
|
||||
teto=100,
|
||||
),
|
||||
"COORD_COMIS_PREMIO": CriterioPontuacao(
|
||||
codigo="COORD_COMIS_PREMIO",
|
||||
bloco=Bloco.D,
|
||||
tipo=TipoAtuacao.FUNCAO,
|
||||
base=50,
|
||||
teto=100,
|
||||
),
|
||||
"COORD_COMIS_GP": CriterioPontuacao(
|
||||
codigo="COORD_COMIS_GP",
|
||||
bloco=Bloco.D,
|
||||
tipo=TipoAtuacao.FUNCAO,
|
||||
base=60,
|
||||
teto=120,
|
||||
),
|
||||
"BOL_BPQ_SUPERIOR": CriterioPontuacao(
|
||||
codigo="BOL_BPQ_SUPERIOR",
|
||||
bloco=Bloco.D,
|
||||
tipo=TipoAtuacao.RESULTADO,
|
||||
base=30,
|
||||
teto=60,
|
||||
),
|
||||
"BOL_BPQ_INTERMEDIARIO": CriterioPontuacao(
|
||||
codigo="BOL_BPQ_INTERMEDIARIO",
|
||||
bloco=Bloco.D,
|
||||
tipo=TipoAtuacao.RESULTADO,
|
||||
base=50,
|
||||
teto=100,
|
||||
),
|
||||
"PREMIACAO": CriterioPontuacao(
|
||||
codigo="PREMIACAO",
|
||||
bloco=Bloco.D,
|
||||
tipo=TipoAtuacao.RESULTADO,
|
||||
base=150,
|
||||
teto=180,
|
||||
),
|
||||
"PREMIACAO_GP": CriterioPontuacao(
|
||||
codigo="PREMIACAO_GP",
|
||||
bloco=Bloco.D,
|
||||
tipo=TipoAtuacao.RESULTADO,
|
||||
base=30,
|
||||
teto=60,
|
||||
),
|
||||
"MENCAO": CriterioPontuacao(
|
||||
codigo="MENCAO",
|
||||
bloco=Bloco.D,
|
||||
tipo=TipoAtuacao.RESULTADO,
|
||||
base=10,
|
||||
teto=20,
|
||||
),
|
||||
"EVENTO": CriterioPontuacao(
|
||||
codigo="EVENTO",
|
||||
bloco=Bloco.D,
|
||||
tipo=TipoAtuacao.PARTICIPACAO,
|
||||
base=1,
|
||||
teto=5,
|
||||
),
|
||||
"PROJ": CriterioPontuacao(
|
||||
codigo="PROJ",
|
||||
bloco=Bloco.D,
|
||||
tipo=TipoAtuacao.PARTICIPACAO,
|
||||
base=10,
|
||||
teto=40,
|
||||
),
|
||||
"ORIENT_POS_DOC": CriterioPontuacao(
|
||||
codigo="ORIENT_POS_DOC",
|
||||
bloco=Bloco.D,
|
||||
tipo=TipoAtuacao.PARTICIPACAO,
|
||||
base=15,
|
||||
teto=100,
|
||||
),
|
||||
"ORIENT_TESE": CriterioPontuacao(
|
||||
codigo="ORIENT_TESE",
|
||||
bloco=Bloco.D,
|
||||
tipo=TipoAtuacao.PARTICIPACAO,
|
||||
base=10,
|
||||
teto=50,
|
||||
),
|
||||
"ORIENT_DISS": CriterioPontuacao(
|
||||
codigo="ORIENT_DISS",
|
||||
bloco=Bloco.D,
|
||||
tipo=TipoAtuacao.PARTICIPACAO,
|
||||
base=5,
|
||||
teto=25,
|
||||
),
|
||||
"CO_ORIENT_POS_DOC": CriterioPontuacao(
|
||||
codigo="CO_ORIENT_POS_DOC",
|
||||
bloco=Bloco.D,
|
||||
tipo=TipoAtuacao.PARTICIPACAO,
|
||||
base=7,
|
||||
teto=35,
|
||||
),
|
||||
"CO_ORIENT_TESE": CriterioPontuacao(
|
||||
codigo="CO_ORIENT_TESE",
|
||||
bloco=Bloco.D,
|
||||
tipo=TipoAtuacao.PARTICIPACAO,
|
||||
base=5,
|
||||
teto=25,
|
||||
),
|
||||
"CO_ORIENT_DISS": CriterioPontuacao(
|
||||
codigo="CO_ORIENT_DISS",
|
||||
bloco=Bloco.D,
|
||||
tipo=TipoAtuacao.PARTICIPACAO,
|
||||
base=3,
|
||||
teto=15,
|
||||
),
|
||||
"MB_BANCA_POS_DOC": CriterioPontuacao(
|
||||
codigo="MB_BANCA_POS_DOC",
|
||||
bloco=Bloco.D,
|
||||
tipo=TipoAtuacao.PARTICIPACAO,
|
||||
base=3,
|
||||
teto=15,
|
||||
),
|
||||
"MB_BANCA_TESE": CriterioPontuacao(
|
||||
codigo="MB_BANCA_TESE",
|
||||
bloco=Bloco.D,
|
||||
tipo=TipoAtuacao.PARTICIPACAO,
|
||||
base=3,
|
||||
teto=15,
|
||||
),
|
||||
"MB_BANCA_DISS": CriterioPontuacao(
|
||||
codigo="MB_BANCA_DISS",
|
||||
bloco=Bloco.D,
|
||||
tipo=TipoAtuacao.PARTICIPACAO,
|
||||
base=2,
|
||||
teto=10,
|
||||
),
|
||||
}
|
||||
|
||||
|
||||
def get_criterio(codigo: str) -> Optional[CriterioPontuacao]:
|
||||
return CRITERIOS.get(codigo)
|
||||
|
||||
|
||||
def get_criterios_bloco(bloco: Bloco) -> Dict[str, CriterioPontuacao]:
|
||||
return {k: v for k, v in CRITERIOS.items() if v.bloco == bloco}
|
||||
Reference in New Issue
Block a user