fix(frontend): alinhar insights e criterios com planilha oficial

- Corrigir gerarInsights() removendo conceitos inexistentes (TETOS_BLOCO,
  "Destaque em Coordenação CAPES", aproveitamento % do teto de bloco)
- Adicionar valores corretos de bônus conforme Aba 4 do Excel oficial
- Remover "max 300" do Bloco C (não existe teto de bloco na especificação)
- Remover PRES_CAM do Bloco D (código inexistente na planilha oficial)
This commit is contained in:
Frederico Castro
2025-12-23 22:48:48 -03:00
parent ab1cb1ba8c
commit 73ea0943ba
2 changed files with 23 additions and 27 deletions

View File

@@ -878,8 +878,6 @@ const PONTOS_BASE = {
EVENTO: 1, PROJ: 10,
};
const TETOS_BLOCO = { A: 450, B: 230, C: 500, D: 300 };
const gerarInsights = (consultor, totalConsultores) => {
const insights = [];
const posicao = consultor.posicao || consultor.rank || 0;
@@ -905,10 +903,10 @@ const gerarInsights = (consultor, totalConsultores) => {
}
const blocos = [
{ nome: 'Coordenação CAPES', letra: 'A', valor: blocoA, teto: TETOS_BLOCO.A },
{ nome: 'Consultoria', letra: 'B', valor: blocoB, teto: TETOS_BLOCO.B },
{ nome: 'Avaliações/Premiações', letra: 'C', valor: blocoC, teto: TETOS_BLOCO.C },
{ nome: 'Indicadores', letra: 'D', valor: blocoD, teto: TETOS_BLOCO.D },
{ nome: 'Coordenação CAPES', letra: 'A', valor: blocoA },
{ nome: 'Consultoria', letra: 'B', valor: blocoB },
{ nome: 'Avaliações/Premiações', letra: 'C', valor: blocoC },
{ nome: 'Indicadores', letra: 'D', valor: blocoD },
];
const blocosAtivos = blocos.filter(b => b.valor > 0);
@@ -916,7 +914,7 @@ const gerarInsights = (consultor, totalConsultores) => {
const maiorBloco = blocosAtivos.reduce((a, b) => a.valor > b.valor ? a : b);
const pct = Math.round(maiorBloco.valor / pontuacao * 100);
if (pct >= 50) {
insights.push({ icone: '📊', texto: `${pct}% da pontuação vem de ${maiorBloco.nome} (Bloco ${maiorBloco.letra})` });
insights.push({ icone: '📊', texto: `${pct}% da pontuação vem de ${maiorBloco.nome}` });
}
}
@@ -924,48 +922,48 @@ const gerarInsights = (consultor, totalConsultores) => {
const coordAtiva = coords.find(c => c.ativo ?? !c.fim);
if (coordAtiva) {
const labels = { CA: 'Coordenador de Área', CAJ: 'Coordenador Adjunto', CAJ_MP: 'Coord. Adjunto MP', CAM: 'Câmara Temática' };
insights.push({ icone: '🎯', texto: `${labels[coordAtiva.codigo] || coordAtiva.codigo} em exercício` });
const bonusAtual = { CA: 30, CAJ: 20, CAJ_MP: 15, CAM: 20 };
insights.push({ icone: '🎯', texto: `${labels[coordAtiva.codigo] || coordAtiva.codigo} em exercício (+${bonusAtual[coordAtiva.codigo] || 0} bônus atualidade)` });
} else if (coords.length > 0) {
insights.push({ icone: '📜', texto: `Histórico de ${coords.length} coordenação(ões) CAPES` });
}
if (blocoA >= 300) {
insights.push({ icone: '🌟', texto: 'Destaque em Coordenação CAPES' });
}
const consultoria = consultor.consultoria || {};
if (consultor.ativo && consultoria.anos_consecutivos >= 8) {
insights.push({ icone: '💎', texto: `${consultoria.anos_consecutivos} anos consecutivos de consultoria (+bônus continuidade)` });
} else if (consultor.ativo && consultoria.anos_consecutivos >= 5) {
insights.push({ icone: '💎', texto: `${consultoria.anos_consecutivos} anos consecutivos (+20 bônus continuidade)` });
} else if (consultoria.anos_consecutivos >= 3) {
insights.push({ icone: '🔷', texto: `${consultoria.anos_consecutivos} anos consecutivos de consultoria` });
}
if (consultoria.retornos > 0) {
insights.push({ icone: '🔄', texto: `Retorno à consultoria (+bônus reativação)` });
const bonusRetorno = consultor.ativo ? 15 : 20;
insights.push({ icone: '🔄', texto: `Retorno à consultoria (+${bonusRetorno} bônus reativação)` });
}
const premiacoes = consultor.premiacoes || [];
const gps = premiacoes.filter(p => p.codigo === 'PREMIACAO_GP_AUTOR');
const premios = premiacoes.filter(p => p.codigo === 'PREMIACAO_AUTOR');
const mencoes = premiacoes.filter(p => p.codigo === 'MENCAO_AUTOR');
if (gps.length > 0) {
insights.push({ icone: '🏆', texto: `${gps.length}x Grande Prêmio CAPES` });
} else if (premios.length > 0) {
insights.push({ icone: '🥇', texto: `${premios.length}x Prêmio CAPES` });
insights.push({ icone: '🏆', texto: `${gps.length}x Grande Prêmio CAPES (base 100 pts cada)` });
}
if (premios.length > 0) {
insights.push({ icone: '🥇', texto: `${premios.length}x Prêmio CAPES (base 50 pts cada)` });
}
if (mencoes.length > 0) {
insights.push({ icone: '🎖️', texto: `${mencoes.length}x Menção Honrosa (base 30 pts cada)` });
}
const anos = consultor.anos_atuacao || 0;
if (anos >= 15) {
insights.push({ icone: '👑', texto: `${anos} anos de contribuição ao SNPG` });
} else if (anos >= 10) {
insights.push({ icone: '🎖️', texto: `Veterano com ${anos} anos de atuação` });
insights.push({ icone: '🏅', texto: `Veterano com ${anos} anos de atuação` });
}
blocosAtivos.forEach(b => {
const aproveitamento = Math.round(b.valor / b.teto * 100);
if (aproveitamento >= 80) {
insights.push({ icone: '✅', texto: `${b.nome}: ${aproveitamento}% do teto (${b.valor}/${b.teto})` });
}
});
if (blocoA > 0 && blocoB > 0 && blocoC > 0) {
insights.push({ icone: '🌟', texto: 'Perfil diversificado: coordenação + consultoria + avaliações' });
}
if (insights.length === 0) {
insights.push({ icone: '📋', texto: `Pontuação total: ${pontuacao} pontos` });