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)