import sys from datetime import datetime from pathlib import Path from dateutil import tz from app.config import create_logger, get_package_version, load_config, log_config from app.db import get_mysql_connection, sync_invoices_verifactu from app.utils import actualizar_fecha_ultima_ejecucion, obtener_fecha_ultima_ejecucion def main(): # Cargar la configuración config = load_config() version = get_package_version() local_tz = tz.gettz(config['LOCAL_TZ']) state_path = Path(config["STATE_PATH"]) # Logging log_dir = state_path / "logs" log_dir.mkdir(parents=True, exist_ok=True) logger = create_logger( name="factuges-sync", log_path=log_dir / "sync_verifactu.log", # Solo lo genera en producción ) logger.info("============================================================") logger.info("FACTUGES Sync Verifactu - START ") logger.info("Version: %s", version) logger.info("UTC Now: %s", datetime.utcnow().isoformat()) logger.info("Environment: %s", config['ENV']) logger.info("Log: %s", log_dir / "sync_verifactu.log") log_config(config) state_file = Path(config["STATE_PATH"]) / "verifactu_last.ini" conn_factuges = None conn_mysql = None try: # Obtener la fecha de la última ejecución del programa last_execution_date_utc = obtener_fecha_ultima_ejecucion(state_file) last_execution_date_local_tz = last_execution_date_utc.astimezone( tz=local_tz).strftime("%Y-%m-%d %H:%M:%S") logger.info("Last execution (UTC): %s", last_execution_date_utc.strftime("%Y-%m-%d %H:%M:%S %Z")) logger.info("Last execution (Local time): %s", last_execution_date_local_tz) # Abrimos conexión con una única transacción para que todo esté controlado conn_mysql = get_mysql_connection(config) # Sync Verifactu logger.info( ">>>>>>>>>> INI Sync facturas emitidas to Verifactu") sync_invoices_verifactu(conn_mysql, last_execution_date_local_tz) conn_mysql.commit() conn_mysql.close() logger.info(">>>>>>>>>> FIN Sync facturas emitidas to Verifactu") actualizar_fecha_ultima_ejecucion(state_file) # Enviar email # send_orders_mail(inserted_orders) logger.info("== END (0) ==") logger.info("============================================================") sys.exit(0) except Exception as e: logger.error("Se ha producido un error en la última ejecución.") logger.error(e) logger.error("Traceback:", exc_info=True) logger.info("== END (1) ==") logger.info("============================================================") if conn_mysql is not None: conn_mysql.rollback() if conn_factuges is not None: conn_factuges.rollback() sys.exit(1) finally: if conn_factuges: conn_factuges.close() if conn_mysql: conn_mysql.close() if __name__ == "__main__": main()