156 lines
5 KiB
Python
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)
|