feat(backend): adicionar validação de selos ao script
- Verifica se bolsas, premiações e orientações do DB batem com ES - Valida top 50 consultores por padrão - Integra validação de selos no fluxo principal (passo 4/5)
This commit is contained in:
@@ -17,6 +17,7 @@ Saída:
|
||||
import asyncio
|
||||
import argparse
|
||||
import csv
|
||||
import json
|
||||
import os
|
||||
import sys
|
||||
from datetime import datetime
|
||||
@@ -308,6 +309,59 @@ async def validar_pontuacao_amostra(
|
||||
return resultados
|
||||
|
||||
|
||||
async def validar_selos(oracle: OracleClient, es_client: ElasticsearchClient, limite: int = 50) -> Tuple[bool, List[str]]:
|
||||
result = oracle.executar_query(f'''
|
||||
SELECT ID_PESSOA, NOME, JSON_DETALHES
|
||||
FROM TB_RANKING_CONSULTOR
|
||||
WHERE POSICAO <= {limite}
|
||||
ORDER BY POSICAO
|
||||
''')
|
||||
|
||||
erros = []
|
||||
for r in result:
|
||||
id_pessoa = r['ID_PESSOA']
|
||||
nome = r['NOME']
|
||||
detalhes = json.loads(r['JSON_DETALHES'])
|
||||
|
||||
db_bolsas = len(detalhes.get('bolsas_cnpq', []))
|
||||
db_prem = len(detalhes.get('premiacoes', []))
|
||||
db_orient = len(detalhes.get('orientacoes', []))
|
||||
|
||||
doc = await es_client.buscar_por_id(id_pessoa)
|
||||
if not doc:
|
||||
erros.append(f'{nome}: Não encontrado no ES')
|
||||
continue
|
||||
|
||||
atuacoes = doc.get('atuacoes', [])
|
||||
|
||||
es_bolsas = sum(1 for a in atuacoes
|
||||
if 'bolsista' in str(a.get('tipo', '')).lower()
|
||||
and 'cnpq' in str(a.get('tipo', '')).lower())
|
||||
|
||||
es_prem = sum(1 for a in atuacoes if a.get('tipo') == 'Premiação Prêmio')
|
||||
|
||||
es_orient = 0
|
||||
for a in atuacoes:
|
||||
if a.get('tipo') == 'Orientação de Discentes':
|
||||
dados = a.get('dadosOrientacaoDiscente', {})
|
||||
es_orient += (dados.get('totalOrientacaoFinalizadaMestrado') or 0)
|
||||
es_orient += (dados.get('totalOrientacaoFinalizadaDoutorado') or 0)
|
||||
es_orient += (dados.get('totalAcompanhamentoPosDoutorado') or 0)
|
||||
|
||||
diffs = []
|
||||
if db_bolsas != es_bolsas:
|
||||
diffs.append(f'Bolsas DB:{db_bolsas} ES:{es_bolsas}')
|
||||
if db_prem != es_prem:
|
||||
diffs.append(f'Prem DB:{db_prem} ES:{es_prem}')
|
||||
if db_orient != es_orient:
|
||||
diffs.append(f'Orient DB:{db_orient} ES:{es_orient}')
|
||||
|
||||
if diffs:
|
||||
erros.append(f'{nome}: {" | ".join(diffs)}')
|
||||
|
||||
return len(erros) == 0, erros
|
||||
|
||||
|
||||
def gerar_amostra_ids(oracle: OracleClient, tamanho: int = 100) -> List[int]:
|
||||
ids = []
|
||||
|
||||
@@ -434,7 +488,16 @@ async def main():
|
||||
for erro in gaps_erros:
|
||||
print(f" - {erro}")
|
||||
|
||||
print("\n[4/4] Validando pontuação da amostra...")
|
||||
print("\n[4/5] Validando selos (top 50)...")
|
||||
selos_ok, selos_erros = await validar_selos(oracle, es_client, limite=50)
|
||||
if selos_ok:
|
||||
print("✓ Selos validados com sucesso")
|
||||
else:
|
||||
print(f"✗ {len(selos_erros)} divergência(s) nos selos:")
|
||||
for erro in selos_erros[:5]:
|
||||
print(f" - {erro}")
|
||||
|
||||
print("\n[5/5] Validando pontuação da amostra...")
|
||||
|
||||
if args.id:
|
||||
ids = [int(x.strip()) for x in args.id.split(",")]
|
||||
@@ -482,7 +545,7 @@ async def main():
|
||||
print("RESUMO DA VALIDAÇÃO")
|
||||
print("=" * 70)
|
||||
|
||||
tudo_ok = criterios_ok and ordem_ok and dup_ok and gaps_ok and divergente_count == 0
|
||||
tudo_ok = criterios_ok and ordem_ok and dup_ok and gaps_ok and selos_ok and divergente_count == 0
|
||||
|
||||
if tudo_ok:
|
||||
print("✓ RANKING VÁLIDO - Todas as verificações passaram")
|
||||
@@ -496,6 +559,8 @@ async def main():
|
||||
print(f" - Posições duplicadas")
|
||||
if not gaps_ok:
|
||||
print(f" - Gaps nas posições")
|
||||
if not selos_ok:
|
||||
print(f" - {len(selos_erros)} divergência(s) nos selos")
|
||||
if divergente_count > 0:
|
||||
print(f" - {divergente_count} pontuação(ões) divergente(s)")
|
||||
|
||||
|
||||
Reference in New Issue
Block a user