Ferramentas/RCVinculaPartesLivroAntigo/main.py
2025-12-02 10:37:13 -03:00

156 lines
5 KiB
Python

import asyncio
import os
import platform
import sys
import traceback
from datetime import datetime
from pathlib import Path
from firebird.driver import driver_config
from actions.ui.ui import ok, rule, warn
from packages.v1.manutencao.controller.manutencao_v_casamento_controller import (
ManutencaoVCasamentoController,
)
# ==============================================================
# Corrige BASE_DIR (funciona no .exe, --onefile e ambiente normal)
# ==============================================================
if getattr(sys, "frozen", False):
BASE_DIR = Path(getattr(sys, "_MEIPASS", Path(sys.executable).parent))
else:
BASE_DIR = Path(__file__).resolve().parent
sys.path.insert(0, str(BASE_DIR))
# ==============================================================
# Prepara pasta de logs (100% seguro)
# ==============================================================
def get_log_path() -> Path:
"""Sempre retorna o caminho correto para logs + cria pasta storage."""
storage_dir = BASE_DIR / "storage"
storage_dir.mkdir(parents=True, exist_ok=True)
# arquivo de log diário
today = datetime.now().strftime("%Y-%m-%d")
return storage_dir / f"errors_{today}.log"
# ==============================================================
# Logging robusto para qualquer exceção
# ==============================================================
def registrar_erro(e: Exception, contexto: str = ""):
"""Grava traceback completo em storage/errors_YYYY-MM-DD.log."""
log_path = get_log_path()
try:
with open(log_path, "a", encoding="utf-8") as f:
f.write("\n" + "=" * 80 + "\n")
f.write(f"DATA: {datetime.now().isoformat()}\n")
if contexto:
f.write(f"CONTEXTO: {contexto}\n")
f.write("ERRO:\n")
traceback.print_exc(file=f)
f.write("=" * 80 + "\n")
warn(f"⚠️ Erro registrado em {log_path}")
except Exception as log_error:
print("❌ Falha ao escrever no arquivo de log:", log_error)
print("Erro original:", e)
input("\nPressione ENTER para sair...")
sys.exit(1)
# ==============================================================
# Configuração do Firebird
# ==============================================================
def configurar_firebird():
try:
system = platform.system()
if system == "Windows":
fb_client_local = BASE_DIR / "fbclient.dll"
if fb_client_local.exists():
os.add_dll_directory(str(BASE_DIR))
driver_config.fb_client_library.value = str(fb_client_local)
ok(f"🔗 Firebird DLL carregada: {fb_client_local}")
else:
raise FileNotFoundError(
f"fbclient.dll não encontrada em {fb_client_local}"
)
elif system == "Linux":
possible_paths = [
"/usr/lib/x86_64-linux-gnu/firebird/4.0/lib/libfbclient.so.2",
"/usr/lib/x86_64-linux-gnu/libfbclient.so.2",
"/usr/lib/x86_64-linux-gnu/libfbclient.so.4.0.5",
str(BASE_DIR / "libfbclient.so"),
]
for path in possible_paths:
if os.path.exists(path):
driver_config.fb_client_library.value = path
ok(f"🔗 Firebird client carregado: {path}")
break
else:
raise FileNotFoundError(
"❌ libfbclient.so não encontrada. "
"Instale o firebird-client no Linux."
)
else:
warn(f"⚠️ Sistema operacional não suportado: {system}")
except Exception as e:
registrar_erro(e, contexto="CONFIGURAÇÃO FIREBIRD")
raise
# ==============================================================
# Execução principal
# ==============================================================
async def main():
manutencao_v_casamento_controller = ManutencaoVCasamentoController()
response = manutencao_v_casamento_controller.VincularNoivosAtosAntigos()
print(response)
# ==============================================================
# Entry point
# ==============================================================
if __name__ == "__main__":
try:
configurar_firebird()
except Exception:
traceback.print_exc()
input("\nErro ao configurar o Firebird. Pressione ENTER para sair...")
sys.exit(1)
# Corrige event loop no Windows
if platform.system() == "Windows":
try:
asyncio.set_event_loop_policy(asyncio.WindowsSelectorEventLoopPolicy())
except Exception:
pass
try:
asyncio.run(main())
input("\nProcesso concluído. Pressione ENTER para sair...")
except Exception as e:
registrar_erro(e, contexto="EXECUÇÃO PRINCIPAL")
traceback.print_exc()
input("\nOcorreu um erro. Pressione ENTER para sair...")
sys.exit(1)