feat(backend): ranking 100% Elasticsearch e critérios do PDF

This commit is contained in:
Frederico Castro
2025-12-15 00:13:12 -03:00
parent 70787fbb51
commit 2a0dc1a652
25 changed files with 522 additions and 263 deletions

View File

@@ -14,6 +14,7 @@ class CoordenacaoCapes:
periodo: Periodo
areas_adicionais: List[str] = field(default_factory=list)
ja_coordenou_antes: bool = False
presidente: bool = False
@dataclass
@@ -51,6 +52,7 @@ class Premiacao:
tipo: str
nome_premio: str
ano: int
papel: Optional[str] = None
@dataclass
@@ -74,6 +76,9 @@ class Orientacao:
tipo: str
nivel: str
ano: Optional[int] = None
coorientacao: bool = False
premiada: bool = False
premiacao_tipo: Optional[str] = None
@dataclass
@@ -89,6 +94,7 @@ class Consultor:
id_pessoa: int
nome: str
cpf: Optional[str] = None
coordenador_ppg: bool = False
coordenacoes_capes: List[CoordenacaoCapes] = field(default_factory=list)
consultoria: Optional[Consultoria] = None
inscricoes: List[Inscricao] = field(default_factory=list)

View File

@@ -89,10 +89,19 @@ class CalculadorPontuacao:
tempo = min(anos_total * criterio.multiplicador_tempo, criterio.teto_tempo)
bonus = 0
if consultoria.anos_consecutivos >= 8 and criterio.bonus_continuidade_8anos:
bonus += criterio.bonus_continuidade_8anos
if codigo == "CONS_ATIVO" and consultoria.retornos > 0 and criterio.bonus_retorno:
bonus += criterio.bonus_retorno
# Bônus de continuidade (escalonado, não cumulativo) - apenas CONS_ATIVO
if codigo == "CONS_ATIVO":
if consultoria.anos_consecutivos >= 8:
bonus += 15
elif consultoria.anos_consecutivos >= 5:
bonus += 10
elif consultoria.anos_consecutivos >= 3:
bonus += 5
# Bônus de retorno (uma vez) - apenas CONS_ATIVO
if consultoria.retornos > 0 and criterio.bonus_retorno:
bonus += criterio.bonus_retorno
total_bruto = base + tempo + bonus
total = min(total_bruto, criterio.teto) if criterio.teto > 0 else total_bruto

View File

@@ -101,7 +101,6 @@ CRITERIOS: Dict[str, CriterioPontuacao] = {
pontua_tempo=True,
multiplicador_tempo=5,
teto_tempo=50,
bonus_continuidade_8anos=20,
bonus_retorno=15,
),
"CONS_HIST": CriterioPontuacao(
@@ -113,7 +112,6 @@ CRITERIOS: Dict[str, CriterioPontuacao] = {
pontua_tempo=True,
multiplicador_tempo=5,
teto_tempo=50,
bonus_continuidade_8anos=20,
),
"CONS_FALECIDO": CriterioPontuacao(
codigo="CONS_FALECIDO",
@@ -124,7 +122,6 @@ CRITERIOS: Dict[str, CriterioPontuacao] = {
pontua_tempo=True,
multiplicador_tempo=5,
teto_tempo=50,
bonus_continuidade_8anos=20,
),
"INSC_AUTOR": CriterioPontuacao(
codigo="INSC_AUTOR",
@@ -154,7 +151,7 @@ CRITERIOS: Dict[str, CriterioPontuacao] = {
bloco=Bloco.D,
tipo=TipoAtuacao.PAPEL,
base=50,
teto=80,
teto=100,
bonus_recorrencia_anual=3,
teto_recorrencia=20,
),
@@ -187,9 +184,23 @@ CRITERIOS: Dict[str, CriterioPontuacao] = {
codigo="BOL_BPQ_INTERMEDIARIO",
bloco=Bloco.D,
tipo=TipoAtuacao.COMPETENCIA_RECONHECIMENTO,
base=50,
teto=100,
),
"BOL_BPQ_SUP": CriterioPontuacao(
codigo="BOL_BPQ_SUP",
bloco=Bloco.D,
tipo=TipoAtuacao.COMPETENCIA_RECONHECIMENTO,
base=30,
teto=60,
),
"BOL_BPQ_INT": CriterioPontuacao(
codigo="BOL_BPQ_INT",
bloco=Bloco.D,
tipo=TipoAtuacao.COMPETENCIA_RECONHECIMENTO,
base=50,
teto=100,
),
"PREMIACAO": CriterioPontuacao(
codigo="PREMIACAO",
bloco=Bloco.D,
@@ -201,14 +212,14 @@ CRITERIOS: Dict[str, CriterioPontuacao] = {
codigo="PREMIACAO_GP",
bloco=Bloco.D,
tipo=TipoAtuacao.COMPETENCIA_RECONHECIMENTO,
base=50,
base=30,
teto=60,
),
"MENCAO": CriterioPontuacao(
codigo="MENCAO",
bloco=Bloco.D,
tipo=TipoAtuacao.COMPETENCIA_RECONHECIMENTO,
base=30,
base=10,
teto=20,
),
"EVENTO": CriterioPontuacao(
@@ -230,63 +241,63 @@ CRITERIOS: Dict[str, CriterioPontuacao] = {
bloco=Bloco.D,
tipo=TipoAtuacao.PARTICIPACAO,
base=15,
teto=0,
teto=100,
),
"ORIENT_TESE": CriterioPontuacao(
codigo="ORIENT_TESE",
bloco=Bloco.D,
tipo=TipoAtuacao.PARTICIPACAO,
base=10,
teto=0,
teto=50,
),
"ORIENT_DISS": CriterioPontuacao(
codigo="ORIENT_DISS",
bloco=Bloco.D,
tipo=TipoAtuacao.PARTICIPACAO,
base=5,
teto=0,
teto=25,
),
"CO_ORIENT_POS_DOC": CriterioPontuacao(
codigo="CO_ORIENT_POS_DOC",
bloco=Bloco.D,
tipo=TipoAtuacao.PARTICIPACAO,
base=7,
teto=0,
teto=35,
),
"CO_ORIENT_TESE": CriterioPontuacao(
codigo="CO_ORIENT_TESE",
bloco=Bloco.D,
tipo=TipoAtuacao.PARTICIPACAO,
base=5,
teto=0,
teto=25,
),
"CO_ORIENT_DISS": CriterioPontuacao(
codigo="CO_ORIENT_DISS",
bloco=Bloco.D,
tipo=TipoAtuacao.PARTICIPACAO,
base=3,
teto=0,
teto=15,
),
"MB_BANCA_POS_DOC": CriterioPontuacao(
codigo="MB_BANCA_POS_DOC",
bloco=Bloco.D,
tipo=TipoAtuacao.PARTICIPACAO,
base=3,
teto=0,
teto=15,
),
"MB_BANCA_TESE": CriterioPontuacao(
codigo="MB_BANCA_TESE",
bloco=Bloco.D,
tipo=TipoAtuacao.PARTICIPACAO,
base=3,
teto=0,
teto=15,
),
"MB_BANCA_DISS": CriterioPontuacao(
codigo="MB_BANCA_DISS",
bloco=Bloco.D,
tipo=TipoAtuacao.PARTICIPACAO,
base=2,
teto=0,
teto=10,
),
}