Automatiza componente B e ajuste frontend do ranking

This commit is contained in:
Frederico Castro
2025-12-10 13:49:43 -03:00
parent d1379b4f5c
commit 6f11b7c166
11 changed files with 431 additions and 186 deletions

View File

@@ -9,11 +9,63 @@ const api = axios.create({
});
export const rankingService = {
async getRanking(limite = 100, componente = null) {
const params = { limite };
if (componente) params.componente = componente;
const response = await api.get('/ranking/detalhado', { params });
return response.data;
async getRanking(limite = 100) {
// Usa ranking paginado (Oracle) para não depender do Elasticsearch
const params = { page: 1, size: limite };
const response = await api.get('/ranking/paginado', { params });
const data = response.data;
// Adapta para o formato esperado pelo frontend
const hoje = new Date();
const consultores = (data.consultores || []).map((c) => {
const anos = Number(c.anos_atuacao || 0);
const consultoria = c.consultoria || {};
const primeiroEvento = consultoria.primeiro_evento
? new Date(consultoria.primeiro_evento)
: (() => {
const d = new Date(hoje);
d.setFullYear(d.getFullYear() - Math.floor(anos));
return d;
})();
return {
id_pessoa: c.id_pessoa,
nome: c.nome,
rank: c.posicao,
posicao: c.posicao,
pontuacao_total: c.pontuacao_total,
componente_a: c.componente_a,
componente_b: c.componente_b,
componente_c: c.componente_c,
componente_d: c.componente_d,
ativo: c.ativo,
anos_atuacao: c.anos_atuacao,
veterano: anos >= 10,
pontuacao: {
pontuacao_total: c.pontuacao_total,
componente_a: { base: c.componente_a, tempo: 0, extras: 0, bonus: 0, retorno: 0, total: c.componente_a },
componente_b: { base: c.componente_b, tempo: 0, extras: 0, bonus: 0, retorno: 0, total: c.componente_b },
componente_c: { base: c.componente_c, tempo: 0, extras: 0, bonus: 0, retorno: 0, total: c.componente_c },
componente_d: { base: c.componente_d, tempo: 0, extras: 0, bonus: 0, retorno: 0, total: c.componente_d },
},
consultoria: {
total_eventos: consultoria.total_eventos ?? 0,
eventos_recentes: consultoria.eventos_recentes ?? 0,
vezes_responsavel: consultoria.vezes_responsavel ?? 0,
primeiro_evento: consultoria.primeiro_evento || primeiroEvento.toISOString(),
ultimo_evento: consultoria.ultimo_evento || null,
},
coordenacoes_capes: [],
coordenacoes_programas: [],
premiacoes: [],
}});
return {
total: data.total,
total_pages: data.total_pages,
consultores,
};
},
async getConsultor(idPessoa) {