fix: alinhar criterios 100% com documento PDF oficial

Backend:
- Reescrever criterios_pontuacao.py com valores corretos do PDF
- Adicionar Blocos B e E ao enum
- Corrigir Base/Teto: AVAL_COMIS_GP (40), COORD_COMIS_PREMIO (40),
  COORD_COMIS_GP (50), PROJ teto (30)
- Orientacoes/Bancas agora sao selos (Base=0, Teto=0)
- CONS_FALECIDO agora pontua tempo (5 pts/ano)
- Remover codigos obsoletos (PREMIACAO, MENCAO, BOL_BPQ_SUP/INT)
- Usar apenas BOL_BPQ_NIVEL, PREMIACAO_*_AUTOR, MENCAO_AUTOR
- Atualizar ranking_store.py e validar_ranking.py

Frontend:
- Atualizar ConsultorCard e CompararModal com codigos corretos
- Adicionar logo CAPES em PNG com transparencia
- Ajustar espacamento do header e tamanho das fontes
- Mapear pasta public no docker-compose
This commit is contained in:
Frederico Castro
2025-12-20 06:53:45 -03:00
parent 7ba2c2be9d
commit 26492c880c
11 changed files with 252 additions and 223 deletions

View File

@@ -5,8 +5,10 @@ from enum import Enum
class Bloco(Enum):
A = "A"
B = "B"
C = "C"
D = "D"
E = "E"
class TipoAtuacao(Enum):
@@ -33,6 +35,7 @@ class CriterioPontuacao:
teto_recorrencia: int = 0
bonus_recorrencia_participacao: int = 0
teto_recorrencia_participacao: int = 0
gera_selo: bool = False
CRITERIOS: Dict[str, CriterioPontuacao] = {
@@ -86,17 +89,21 @@ CRITERIOS: Dict[str, CriterioPontuacao] = {
),
"PPG_COORD": CriterioPontuacao(
codigo="PPG_COORD",
bloco=Bloco.A,
bloco=Bloco.E,
tipo=TipoAtuacao.FUNCAO,
base=0,
teto=0,
pontua_tempo=True,
multiplicador_tempo=0,
teto_tempo=0,
bonus_atualidade=15,
bonus_retorno=10,
bonus_continuidade_8anos=15,
gera_selo=True,
),
"CONS_ATIVO": CriterioPontuacao(
codigo="CONS_ATIVO",
bloco=Bloco.C,
bloco=Bloco.B,
tipo=TipoAtuacao.FUNCAO,
base=150,
teto=230,
@@ -109,7 +116,7 @@ CRITERIOS: Dict[str, CriterioPontuacao] = {
),
"CONS_HIST": CriterioPontuacao(
codigo="CONS_HIST",
bloco=Bloco.C,
bloco=Bloco.B,
tipo=TipoAtuacao.FUNCAO,
base=100,
teto=230,
@@ -121,18 +128,18 @@ CRITERIOS: Dict[str, CriterioPontuacao] = {
),
"CONS_FALECIDO": CriterioPontuacao(
codigo="CONS_FALECIDO",
bloco=Bloco.C,
bloco=Bloco.B,
tipo=TipoAtuacao.FUNCAO,
base=100,
teto=230,
pontua_tempo=False,
multiplicador_tempo=0,
teto_tempo=0,
pontua_tempo=True,
multiplicador_tempo=5,
teto_tempo=50,
bonus_continuidade_8anos=20,
),
"INSC_AUTOR": CriterioPontuacao(
codigo="INSC_AUTOR",
bloco=Bloco.D,
bloco=Bloco.C,
tipo=TipoAtuacao.FUNCAO,
base=10,
teto=20,
@@ -141,23 +148,16 @@ CRITERIOS: Dict[str, CriterioPontuacao] = {
),
"INSC_INST_AUTOR": CriterioPontuacao(
codigo="INSC_INST_AUTOR",
bloco=Bloco.D,
bloco=Bloco.C,
tipo=TipoAtuacao.FUNCAO,
base=20,
teto=50,
bonus_recorrencia_participacao=5,
teto_recorrencia_participacao=10,
),
"INSC_INST": CriterioPontuacao(
codigo="INSC_INST",
bloco=Bloco.D,
tipo=TipoAtuacao.FUNCAO,
base=30,
teto=60,
),
"AVAL_COMIS_PREMIO": CriterioPontuacao(
codigo="AVAL_COMIS_PREMIO",
bloco=Bloco.D,
bloco=Bloco.C,
tipo=TipoAtuacao.PAPEL,
base=30,
teto=60,
@@ -166,107 +166,62 @@ CRITERIOS: Dict[str, CriterioPontuacao] = {
),
"AVAL_COMIS_GP": CriterioPontuacao(
codigo="AVAL_COMIS_GP",
bloco=Bloco.D,
bloco=Bloco.C,
tipo=TipoAtuacao.PAPEL,
base=50,
base=40,
teto=80,
bonus_recorrencia_anual=3,
teto_recorrencia=20,
),
"COORD_COMIS_PREMIO": CriterioPontuacao(
codigo="COORD_COMIS_PREMIO",
bloco=Bloco.D,
bloco=Bloco.C,
tipo=TipoAtuacao.FUNCAO,
base=50,
base=40,
teto=100,
bonus_recorrencia_anual=4,
teto_recorrencia=20,
),
"COORD_COMIS_GP": CriterioPontuacao(
codigo="COORD_COMIS_GP",
bloco=Bloco.D,
bloco=Bloco.C,
tipo=TipoAtuacao.FUNCAO,
base=60,
base=50,
teto=120,
bonus_recorrencia_anual=6,
teto_recorrencia=20,
),
"BOL_BPQ_SUPERIOR": CriterioPontuacao(
codigo="BOL_BPQ_SUPERIOR",
bloco=Bloco.D,
tipo=TipoAtuacao.COMPETENCIA_RECONHECIMENTO,
base=30,
teto=60,
),
"BOL_BPQ_INTERMEDIARIO": 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,
),
"BOL_BPQ_NIVEL": CriterioPontuacao(
codigo="BOL_BPQ_NIVEL",
bloco=Bloco.D,
tipo=TipoAtuacao.COMPETENCIA_RECONHECIMENTO,
base=30,
teto=60,
),
"PREMIACAO": CriterioPontuacao(
codigo="PREMIACAO",
bloco=Bloco.D,
tipo=TipoAtuacao.COMPETENCIA_RECONHECIMENTO,
base=100,
teto=180,
),
"PREMIACAO_GP": CriterioPontuacao(
codigo="PREMIACAO_GP",
bloco=Bloco.D,
tipo=TipoAtuacao.COMPETENCIA_RECONHECIMENTO,
base=50,
teto=60,
gera_selo=True,
),
"PREMIACAO_GP_AUTOR": CriterioPontuacao(
codigo="PREMIACAO_GP_AUTOR",
bloco=Bloco.D,
bloco=Bloco.C,
tipo=TipoAtuacao.COMPETENCIA_RECONHECIMENTO,
base=100,
teto=300,
gera_selo=True,
),
"PREMIACAO_AUTOR": CriterioPontuacao(
codigo="PREMIACAO_AUTOR",
bloco=Bloco.D,
bloco=Bloco.C,
tipo=TipoAtuacao.COMPETENCIA_RECONHECIMENTO,
base=50,
teto=150,
),
"MENCAO": CriterioPontuacao(
codigo="MENCAO",
bloco=Bloco.D,
tipo=TipoAtuacao.COMPETENCIA_RECONHECIMENTO,
base=30,
teto=30,
gera_selo=True,
),
"MENCAO_AUTOR": CriterioPontuacao(
codigo="MENCAO_AUTOR",
bloco=Bloco.D,
bloco=Bloco.C,
tipo=TipoAtuacao.COMPETENCIA_RECONHECIMENTO,
base=30,
teto=90,
gera_selo=True,
),
"EVENTO": CriterioPontuacao(
codigo="EVENTO",
@@ -282,72 +237,193 @@ CRITERIOS: Dict[str, CriterioPontuacao] = {
bloco=Bloco.D,
tipo=TipoAtuacao.PARTICIPACAO,
base=10,
teto=40,
teto=30,
bonus_recorrencia_participacao=2,
teto_recorrencia_participacao=10,
),
"IDIOMA_BILINGUE": CriterioPontuacao(
codigo="IDIOMA_BILINGUE",
bloco=Bloco.D,
tipo=TipoAtuacao.COMPETENCIA_RECONHECIMENTO,
base=0,
teto=0,
gera_selo=True,
),
"IDIOMA_MULTILINGUE": CriterioPontuacao(
codigo="IDIOMA_MULTILINGUE",
bloco=Bloco.D,
tipo=TipoAtuacao.COMPETENCIA_RECONHECIMENTO,
base=0,
teto=0,
gera_selo=True,
),
"TITULACAO_MESTRE": CriterioPontuacao(
codigo="TITULACAO_MESTRE",
bloco=Bloco.D,
tipo=TipoAtuacao.COMPETENCIA_RECONHECIMENTO,
base=0,
teto=0,
gera_selo=True,
),
"TITULACAO_DOUTOR": CriterioPontuacao(
codigo="TITULACAO_DOUTOR",
bloco=Bloco.D,
tipo=TipoAtuacao.COMPETENCIA_RECONHECIMENTO,
base=0,
teto=0,
gera_selo=True,
),
"TITULACAO_POS_DOUTOR": CriterioPontuacao(
codigo="TITULACAO_POS_DOUTOR",
bloco=Bloco.D,
tipo=TipoAtuacao.COMPETENCIA_RECONHECIMENTO,
base=0,
teto=0,
gera_selo=True,
),
"ORIENT_POS_DOC": CriterioPontuacao(
codigo="ORIENT_POS_DOC",
bloco=Bloco.D,
bloco=Bloco.C,
tipo=TipoAtuacao.PARTICIPACAO,
base=15,
teto=100,
base=0,
teto=0,
gera_selo=True,
),
"ORIENT_POS_DOC_PREM": CriterioPontuacao(
codigo="ORIENT_POS_DOC_PREM",
bloco=Bloco.C,
tipo=TipoAtuacao.PARTICIPACAO,
base=0,
teto=0,
gera_selo=True,
),
"ORIENT_TESE": CriterioPontuacao(
codigo="ORIENT_TESE",
bloco=Bloco.D,
bloco=Bloco.C,
tipo=TipoAtuacao.PARTICIPACAO,
base=10,
teto=50,
base=0,
teto=0,
gera_selo=True,
),
"ORIENT_TESE_PREM": CriterioPontuacao(
codigo="ORIENT_TESE_PREM",
bloco=Bloco.C,
tipo=TipoAtuacao.PARTICIPACAO,
base=0,
teto=0,
gera_selo=True,
),
"ORIENT_DISS": CriterioPontuacao(
codigo="ORIENT_DISS",
bloco=Bloco.D,
bloco=Bloco.C,
tipo=TipoAtuacao.PARTICIPACAO,
base=5,
teto=25,
base=0,
teto=0,
gera_selo=True,
),
"ORIENT_DISS_PREM": CriterioPontuacao(
codigo="ORIENT_DISS_PREM",
bloco=Bloco.C,
tipo=TipoAtuacao.PARTICIPACAO,
base=0,
teto=0,
gera_selo=True,
),
"CO_ORIENT_POS_DOC": CriterioPontuacao(
codigo="CO_ORIENT_POS_DOC",
bloco=Bloco.D,
bloco=Bloco.C,
tipo=TipoAtuacao.PARTICIPACAO,
base=7,
teto=35,
base=0,
teto=0,
gera_selo=True,
),
"CO_ORIENT_POS_DOC_PREM": CriterioPontuacao(
codigo="CO_ORIENT_POS_DOC_PREM",
bloco=Bloco.C,
tipo=TipoAtuacao.PARTICIPACAO,
base=0,
teto=0,
gera_selo=True,
),
"CO_ORIENT_TESE": CriterioPontuacao(
codigo="CO_ORIENT_TESE",
bloco=Bloco.D,
bloco=Bloco.C,
tipo=TipoAtuacao.PARTICIPACAO,
base=5,
teto=25,
base=0,
teto=0,
gera_selo=True,
),
"CO_ORIENT_TESE_PREM": CriterioPontuacao(
codigo="CO_ORIENT_TESE_PREM",
bloco=Bloco.C,
tipo=TipoAtuacao.PARTICIPACAO,
base=0,
teto=0,
gera_selo=True,
),
"CO_ORIENT_DISS": CriterioPontuacao(
codigo="CO_ORIENT_DISS",
bloco=Bloco.D,
bloco=Bloco.C,
tipo=TipoAtuacao.PARTICIPACAO,
base=3,
teto=15,
base=0,
teto=0,
gera_selo=True,
),
"CO_ORIENT_DISS_PREM": CriterioPontuacao(
codigo="CO_ORIENT_DISS_PREM",
bloco=Bloco.C,
tipo=TipoAtuacao.PARTICIPACAO,
base=0,
teto=0,
gera_selo=True,
),
"MB_BANCA_POS_DOC": CriterioPontuacao(
codigo="MB_BANCA_POS_DOC",
bloco=Bloco.D,
bloco=Bloco.C,
tipo=TipoAtuacao.PARTICIPACAO,
base=3,
teto=15,
base=0,
teto=0,
gera_selo=True,
),
"MB_BANCA_POS_DOC_PREM": CriterioPontuacao(
codigo="MB_BANCA_POS_DOC_PREM",
bloco=Bloco.C,
tipo=TipoAtuacao.PARTICIPACAO,
base=0,
teto=0,
gera_selo=True,
),
"MB_BANCA_TESE": CriterioPontuacao(
codigo="MB_BANCA_TESE",
bloco=Bloco.D,
bloco=Bloco.C,
tipo=TipoAtuacao.PARTICIPACAO,
base=3,
teto=15,
base=0,
teto=0,
gera_selo=True,
),
"MB_BANCA_TESE_PREM": CriterioPontuacao(
codigo="MB_BANCA_TESE_PREM",
bloco=Bloco.C,
tipo=TipoAtuacao.PARTICIPACAO,
base=0,
teto=0,
gera_selo=True,
),
"MB_BANCA_DISS": CriterioPontuacao(
codigo="MB_BANCA_DISS",
bloco=Bloco.D,
bloco=Bloco.C,
tipo=TipoAtuacao.PARTICIPACAO,
base=2,
teto=10,
base=0,
teto=0,
gera_selo=True,
),
"MB_BANCA_DISS_PREM": CriterioPontuacao(
codigo="MB_BANCA_DISS_PREM",
bloco=Bloco.C,
tipo=TipoAtuacao.PARTICIPACAO,
base=0,
teto=0,
gera_selo=True,
),
}

View File

@@ -42,33 +42,14 @@ def extrair_selos_entry(detalhes: Dict[str, Any]) -> Set[str]:
selos.add("BPQ")
for prem in detalhes.get("premiacoes", []):
papel = (prem.get("papel") or "").lower()
codigo = prem.get("codigo", "")
if codigo == "PREMIACAO":
tipo_prem = "GP"
elif codigo == "PREMIACAO_GP":
tipo_prem = "PREMIO"
elif codigo == "MENCAO":
tipo_prem = "MENCAO"
elif codigo == "PREMIACAO_GP_AUTOR":
if codigo == "PREMIACAO_GP_AUTOR":
selos.add("AUTOR_GP")
continue
elif codigo == "PREMIACAO_AUTOR":
selos.add("AUTOR_PREMIO")
continue
elif codigo == "MENCAO_AUTOR":
selos.add("AUTOR_MENCAO")
continue
else:
continue
if "autor" in papel:
selos.add(f"AUTOR_{tipo_prem}")
elif "orientador" in papel:
selos.add(f"ORIENT_{tipo_prem}")
elif "coorientador" in papel or "co-orientador" in papel:
selos.add(f"COORIENT_{tipo_prem}")
for orient in detalhes.get("orientacoes", []):
codigo = orient.get("codigo", "")

View File

@@ -330,23 +330,12 @@ class ConsultorRepositoryImpl(ConsultorRepository):
nome_lower = str(nome_premio).lower()
tipo_norm = self._inferir_premiacao_tipo(f"{tipo_lower} {nome_lower}")
papel_lower = str(papel or "").lower()
is_autor = "autor" in papel_lower
if is_autor:
if tipo_norm == "GP":
codigo = "PREMIACAO_GP_AUTOR"
elif tipo_norm == "MENCAO":
codigo = "MENCAO_AUTOR"
else:
codigo = "PREMIACAO_AUTOR"
if tipo_norm == "GP":
codigo = "PREMIACAO_GP_AUTOR"
elif tipo_norm == "MENCAO":
codigo = "MENCAO_AUTOR"
else:
if tipo_norm == "GP":
codigo = "PREMIACAO"
elif tipo_norm == "MENCAO":
codigo = "MENCAO"
else:
codigo = "PREMIACAO_GP"
codigo = "PREMIACAO_AUTOR"
premiacoes.append(Premiacao(
codigo=codigo,
@@ -368,16 +357,8 @@ class ConsultorRepositoryImpl(ConsultorRepository):
nivel = dados.get("nivel", "") or dados.get("categoria", "") or ""
area = dados.get("areaConhecimento", "") or ""
nivel_lower = nivel.lower()
if not nivel_lower:
codigo = "BOL_BPQ_NIVEL"
elif "1d" in nivel_lower or "2" in nivel_lower:
codigo = "BOL_BPQ_INT"
else:
codigo = "BOL_BPQ_SUP"
bolsas.append(BolsaCNPQ(
codigo=codigo,
codigo="BOL_BPQ_NIVEL",
nivel=nivel,
area=area,
))