- Add TIPOS_ATUACAO_ELASTICSEARCH.md: mapping of ES activity types - Add TOP_10_RANKING_CAPES.md: sample ranking output documentation - Add backend/scripts/: utility scripts for analysis and debugging - analise_detalhada.py: detailed consultant analysis - auditar_ranking.py: ranking audit tool - bootstrap_ranking.sh: bootstrap script - buscar_consultores_especificos.py: search specific consultants - popular_componente_b.py: populate component B - top10_ranking.py: generate top 10 ranking - Add scripts/reload_atuacapes.sh: reload ES index script
171 lines
6.6 KiB
Python
171 lines
6.6 KiB
Python
#!/usr/bin/env python3
|
|
import sys
|
|
import os
|
|
import asyncio
|
|
import json
|
|
from datetime import datetime
|
|
|
|
sys.path.insert(0, os.path.join(os.path.dirname(__file__), '..', 'src'))
|
|
|
|
from infrastructure.elasticsearch.client import ElasticsearchClient
|
|
|
|
ES_URL = "http://elastic-atuacapes.hom.capes.gov.br:9200"
|
|
ES_INDEX = "atuacapes"
|
|
ES_USER = "admin-atuacapes"
|
|
ES_PASSWORD = "O}!S0bj%FhJ:"
|
|
|
|
IDS = [12932, 6273]
|
|
|
|
|
|
async def buscar_por_id(es_client, id_pessoa):
|
|
response = await es_client.client.post(
|
|
f"{es_client.url}/{es_client.index}/_search",
|
|
json={
|
|
"size": 1,
|
|
"query": {"term": {"id": id_pessoa}},
|
|
"_source": ["id", "dadosPessoais", "atuacoes"]
|
|
}
|
|
)
|
|
response.raise_for_status()
|
|
result = response.json()
|
|
hits = result.get("hits", {}).get("hits", [])
|
|
return hits[0]["_source"] if hits else None
|
|
|
|
|
|
async def main():
|
|
print("Conectando ao Elasticsearch...")
|
|
es_client = ElasticsearchClient(ES_URL, ES_INDEX, ES_USER, ES_PASSWORD)
|
|
await es_client.connect()
|
|
|
|
try:
|
|
for id_pessoa in IDS:
|
|
print(f"\n{'='*120}")
|
|
print(f"ANÁLISE DETALHADA - ID: {id_pessoa}")
|
|
print(f"{'='*120}")
|
|
|
|
doc = await buscar_por_id(es_client, id_pessoa)
|
|
if not doc:
|
|
print(f" Não encontrado")
|
|
continue
|
|
|
|
dados_pessoais = doc.get("dadosPessoais", {})
|
|
nome = dados_pessoais.get("nome", "N/A")
|
|
atuacoes = doc.get("atuacoes", [])
|
|
|
|
print(f"\nNOME: {nome}")
|
|
print(f"ID: {id_pessoa}")
|
|
print(f"CPF: {dados_pessoais.get('cpf', 'N/A')}")
|
|
print(f"\nTOTAL DE ATUAÇÕES: {len(atuacoes)}")
|
|
|
|
por_tipo = {}
|
|
for a in atuacoes:
|
|
tipo = a.get("tipo", "Desconhecido")
|
|
por_tipo[tipo] = por_tipo.get(tipo, 0) + 1
|
|
|
|
print(f"\nDISTRIBUIÇÃO POR TIPO:")
|
|
for tipo, count in sorted(por_tipo.items()):
|
|
print(f" {tipo}: {count}")
|
|
|
|
print(f"\n{'='*120}")
|
|
print("EVENTOS DETALHADOS")
|
|
print(f"{'='*120}")
|
|
|
|
eventos = [a for a in atuacoes if a.get("tipo") == "Evento"]
|
|
print(f"\nTOTAL DE EVENTOS: {len(eventos)}")
|
|
|
|
if eventos:
|
|
por_descricao = {}
|
|
for e in eventos:
|
|
desc = e.get("descricao", "Sem descrição")
|
|
por_descricao[desc] = por_descricao.get(desc, 0) + 1
|
|
|
|
print(f"\nEVENTOS POR DESCRIÇÃO:")
|
|
for desc, count in sorted(por_descricao.items(), key=lambda x: x[1], reverse=True):
|
|
print(f" {desc}: {count}")
|
|
|
|
print(f"\nPRIMEIROS 10 EVENTOS:")
|
|
for idx, e in enumerate(eventos[:10], 1):
|
|
print(f"\n Evento {idx}:")
|
|
print(f" Descrição: {e.get('descricao', 'N/A')}")
|
|
print(f" Início: {e.get('inicio', 'N/A')}")
|
|
print(f" Fim: {e.get('fim', 'N/A')}")
|
|
print(f" Nome: {e.get('nome', 'N/A')}")
|
|
if e.get("dadosEvento"):
|
|
print(f" Dados Evento: {json.dumps(e['dadosEvento'], indent=8, ensure_ascii=False)[:200]}")
|
|
|
|
print(f"\n{'='*120}")
|
|
print("COORDENAÇÕES CAPES")
|
|
print(f"{'='*120}")
|
|
|
|
coordenacoes = [a for a in atuacoes if a.get("tipo") in [
|
|
"Coordenação de Área de Avaliação",
|
|
"Histórico de Coordenação de Área de Avaliação"
|
|
]]
|
|
|
|
for idx, coord in enumerate(coordenacoes, 1):
|
|
print(f"\nCoordenação {idx}:")
|
|
print(f" Tipo: {coord.get('tipo')}")
|
|
print(f" Nome: {coord.get('nome', 'N/A')}")
|
|
print(f" Descrição: {coord.get('descricao', 'N/A')}")
|
|
print(f" Início: {coord.get('inicio', 'N/A')}")
|
|
print(f" Fim: {coord.get('fim', 'N/A')}")
|
|
|
|
dados = coord.get("dadosCoordenacaoArea") or coord.get("dadosHistoricoCoordenacaoArea")
|
|
if dados:
|
|
print(f" Dados detalhados:")
|
|
print(f" Tipo função: {dados.get('tipo', 'N/A')}")
|
|
area = dados.get("areaAvaliacao", {})
|
|
if isinstance(area, dict):
|
|
print(f" Área: {area.get('nome', 'N/A')} (ID: {area.get('id', 'N/A')})")
|
|
else:
|
|
print(f" Área: {area}")
|
|
colegios = dados.get("colegio", [])
|
|
if colegios:
|
|
print(f" Colégios: {[c.get('nome') for c in colegios if isinstance(c, dict)]}")
|
|
|
|
print(f"\n{'='*120}")
|
|
print("CONSULTORIAS")
|
|
print(f"{'='*120}")
|
|
|
|
consultorias = [a for a in atuacoes if a.get("tipo") in ["Consultor", "Histórico de Consultoria"]]
|
|
for idx, cons in enumerate(consultorias, 1):
|
|
print(f"\nConsultoria {idx}:")
|
|
print(f" Tipo: {cons.get('tipo')}")
|
|
print(f" Início: {cons.get('inicio', 'N/A')}")
|
|
print(f" Fim: {cons.get('fim', 'N/A')}")
|
|
dados = cons.get("dadosConsultoria", {})
|
|
if dados:
|
|
print(f" Situação: {dados.get('situacaoConsultoria', 'N/A')}")
|
|
print(f" Início situação: {dados.get('inicioSituacao', 'N/A')}")
|
|
print(f" Inativação: {dados.get('inativacaoSituacao', 'N/A')}")
|
|
|
|
print(f"\n{'='*120}")
|
|
print("PREMIAÇÕES")
|
|
print(f"{'='*120}")
|
|
|
|
premiacoes = [a for a in atuacoes if "Prêmio" in a.get("tipo", "")]
|
|
print(f"\nTOTAL DE PREMIAÇÕES: {len(premiacoes)}")
|
|
|
|
por_tipo_prem = {}
|
|
for p in premiacoes:
|
|
tipo = p.get("tipo", "Desconhecido")
|
|
por_tipo_prem[tipo] = por_tipo_prem.get(tipo, 0) + 1
|
|
|
|
print(f"\nPREMIAÇÕES POR TIPO:")
|
|
for tipo, count in sorted(por_tipo_prem.items()):
|
|
print(f" {tipo}: {count}")
|
|
|
|
for tipo_prem in ["Premiação Prêmio", "Avaliação Prêmio", "Inscrição Prêmio"]:
|
|
prems = [p for p in premiacoes if p.get("tipo") == tipo_prem]
|
|
if prems:
|
|
print(f"\n{tipo_prem} ({len(prems)}):")
|
|
for idx, p in enumerate(prems[:5], 1):
|
|
print(f" {idx}. {p.get('descricao', 'N/A')} ({p.get('inicio', 'N/A')})")
|
|
|
|
finally:
|
|
await es_client.close()
|
|
|
|
|
|
if __name__ == "__main__":
|
|
asyncio.run(main())
|