feat(vinculos): adicionar vínculos de consultoria com IES e ordenação cronológica

- Adicionar entidades e DTOs para vínculos de consultoria (IES, período, situação)
- Extrair vínculos do Elasticsearch com datas e informações da IES
- Exibir vínculos no card do consultor com sigla e nome completo da IES
- Ordenar todas as listas do detalhe por data/ano decrescente (mais recente primeiro)
This commit is contained in:
Frederico Castro
2025-12-17 20:48:50 -03:00
parent 678be6170f
commit 99ce6e30d8
9 changed files with 167 additions and 7 deletions

View File

@@ -458,6 +458,13 @@
min-width: 50px;
}
.list-item .ies-nome {
flex: 1;
color: var(--text);
font-weight: 500;
font-size: 0.85rem;
}
@media (max-width: 1200px) {
.details-grid {
grid-template-columns: repeat(3, 1fr);

View File

@@ -346,11 +346,44 @@ const ConsultorCard = memo(({ consultor, highlight, selecionado, onToggleSelecio
</div>
)}
{consultoria?.vinculos?.length > 0 && (
<div className="extra-details">
<h4>Vinculos de Consultoria</h4>
<div className="list-items">
{[...consultoria.vinculos]
.sort((a, b) => new Date(b.periodo?.inicio || 0) - new Date(a.periodo?.inicio || 0))
.map((vinculo, idx) => {
const periodo = vinculo.periodo || {};
const isAtivo = periodo.ativo ?? !periodo.fim;
return (
<div key={idx} className="list-item">
<span className={`badge ${isAtivo ? 'badge-ativo' : 'badge-historico'}`}>
{isAtivo ? 'ATIVO' : 'ENCERRADO'}
</span>
<span className="ies-nome">
{vinculo.ies
? vinculo.ies.sigla && vinculo.ies.nome
? `${vinculo.ies.sigla} - ${vinculo.ies.nome}`
: vinculo.ies.sigla || vinculo.ies.nome
: 'IES nao informada'}
</span>
<span className="muted">
{formatDate(periodo.inicio)} - {isAtivo ? 'Atual' : formatDate(periodo.fim)}
</span>
</div>
);
})}
</div>
</div>
)}
{consultor.coordenacoes_capes?.length > 0 && (
<div className="extra-details">
<h4>Coordenacoes CAPES</h4>
<div className="list-items">
{consultor.coordenacoes_capes.map((coord, idx) => (
{[...consultor.coordenacoes_capes]
.sort((a, b) => new Date(b.inicio || b.periodo?.inicio || 0) - new Date(a.inicio || a.periodo?.inicio || 0))
.map((coord, idx) => (
<div key={idx} className="list-item">
<span className="badge">{coord.codigo || coord.tipo}</span>
<span className="pontos">{PONTOS_BASE[coord.codigo] || 0} pts</span>
@@ -368,7 +401,9 @@ const ConsultorCard = memo(({ consultor, highlight, selecionado, onToggleSelecio
<div className="extra-details">
<h4>Premiacoes</h4>
<div className="list-items">
{consultor.premiacoes.map((prem, idx) => (
{[...consultor.premiacoes]
.sort((a, b) => (b.ano || 0) - (a.ano || 0))
.map((prem, idx) => (
<div key={idx} className="list-item">
<span className="badge">{prem.codigo}</span>
<span className="pontos">{PONTOS_BASE[prem.codigo] || 0} pts</span>
@@ -384,7 +419,9 @@ const ConsultorCard = memo(({ consultor, highlight, selecionado, onToggleSelecio
<div className="extra-details">
<h4>Avaliacoes de Comissao</h4>
<div className="list-items">
{consultor.avaliacoes_comissao.map((aval, idx) => (
{[...consultor.avaliacoes_comissao]
.sort((a, b) => (b.ano || 0) - (a.ano || 0))
.map((aval, idx) => (
<div key={idx} className="list-item">
<span className="badge">{aval.codigo}</span>
<span className="pontos">{PONTOS_BASE[aval.codigo] || 0} pts</span>
@@ -400,7 +437,9 @@ const ConsultorCard = memo(({ consultor, highlight, selecionado, onToggleSelecio
<div className="extra-details">
<h4>Inscricoes</h4>
<div className="list-items">
{consultor.inscricoes.map((insc, idx) => (
{[...consultor.inscricoes]
.sort((a, b) => (b.ano || 0) - (a.ano || 0))
.map((insc, idx) => (
<div key={idx} className="list-item">
<span className="badge">{insc.codigo}</span>
<span className="pontos">{PONTOS_BASE[insc.codigo] || 0} pts</span>
@@ -416,7 +455,10 @@ const ConsultorCard = memo(({ consultor, highlight, selecionado, onToggleSelecio
<div className="extra-details">
<h4>Participacoes (Eventos/Projetos)</h4>
<div className="list-items">
{consultor.participacoes.slice(0, 10).map((part, idx) => (
{[...consultor.participacoes]
.sort((a, b) => (b.ano || 0) - (a.ano || 0))
.slice(0, 10)
.map((part, idx) => (
<div key={idx} className="list-item">
<span className="badge">{part.codigo}</span>
<span className="pontos">{PONTOS_BASE[part.codigo] || 0} pts</span>

View File

@@ -69,6 +69,15 @@ export const rankingService = {
areas: consultoria.areas || [],
anos_consecutivos: consultoria.anos_consecutivos || 0,
retornos: consultoria.retornos || 0,
vinculos: (consultoria.vinculos || []).map((v) => ({
periodo: {
inicio: v.inicio || v.periodo?.inicio || null,
fim: v.fim || v.periodo?.fim || null,
ativo: v.ativo ?? v.periodo?.ativo ?? !v.fim,
},
ies: v.ies || null,
situacao: v.situacao || '',
})),
},
coordenacoes_capes: coordenacoesCapes,
inscricoes: c.inscricoes || [],