Zion

Aplicação desktop (PyQt5) para limpeza e validação de dados financeiros com regras dinâmicas por convênio.

Corporativo · 2025 — Capital Consig
PythonPostgreSQLPyQt5
Imagem de destaque do projeto Zion

O Problema

Processar e validar dados financeiros de múltiplos convênios (INSS, Zetra, Consiglog, entre outros) era manual e sujeito a erro: cada convênio tinha layout de arquivo, regras de negócio e nomenclatura de colunas diferentes, e as bases envolvidas somavam mais de R$ 40 milhões em valores processados — qualquer inconsistência tinha impacto direto em auditoria e tomada de decisão.

A Solução

  • Interface desktop dividida em "Limpeza de Planilhas" e "Validador de Convênios", com regras específicas por tipo de convênio.
  • Módulo de limpeza dinâmico, dirigido por um dicionário de regras aplicado conforme o convênio selecionado.
  • Carga dos arquivos para tabelas em PostgreSQL, com schemas pré-definidos ou gerados dinamicamente.
  • Execução de scripts SQL transacionais (commit/rollback) para validação e cálculo por convênio.

Arquitetura

  • PyQt5 para a interface desktop.
  • PostgreSQL como camada de persistência e validação via SQL transacional.
  • Configuração de conexão isolada em um módulo próprio, testável pela própria interface.

Interface

Código em destaque

validacao_base.py
import psycopg2
from design.settings_manager import get_db_config

def run_validation_process(convenio, file_paths, output_path, progress_callback=None):
    conn = None
    try:
        current_db_config = get_db_config()
        conn = psycopg2.connect(**current_db_config)
        cur = conn.cursor()

        for i, (table_name, file_path) in enumerate(file_paths.items()):
            progress_callback and progress_callback.emit(
                10 + int((i / len(file_paths)) * 65), f"Importando '{table_name}'..."
            )
            import_csv_to_postgres(conn, cur, table_name, file_path, convenio)

        conn.autocommit = False
        cur.execute("BEGIN;")
        try:
            for step in steps:
                if step["sql"].strip():
                    cur.execute(step["sql"])
            conn.commit()
        except Exception as e_sql:
            conn.rollback()
            raise Exception(f"Erro na etapa SQL '{step['name']}': {e_sql}")
        finally:
            conn.autocommit = True
    finally:
        if conn:
            cur.close()
            conn.close()

Aprendizados

Regras de negócio distintas por convênio só se tornam sustentáveis quando modeladas como dados (dicionário de regras), não como condicionais espalhados pelo código — foi a decisão de design que mais facilitou adicionar novos convênios depois.