# app/cli.py # CLI simple para seleccionar el entrypoint correcto. # Permite: # factuges-sync factuges # factuges-sync verifactu # factuges-sync all # # También por variable de entorno: # SYNC_MODE=factuges factuges-sync import argparse import os import subprocess import sys from typing import Literal, Optional Mode = Literal["factuges", "verifactu", "all"] def run_module(module: str) -> None: """Lanza un módulo Python como subproceso y falla en caso de error.""" subprocess.run([sys.executable, "-m", module], check=False) def resolve_mode(arg_mode: Optional[str]) -> Mode: """Resuelve el modo desde CLI o variable de entorno.""" mode = arg_mode or os.getenv("SYNC_MODE") valid_modes: tuple[Mode, ...] = ("factuges", "verifactu", "all") if mode not in valid_modes: print( "Error: debes indicar modo: 'factuges', 'verifactu' " "o 'all' para ejecutar ambos" ) sys.exit(1) return mode # type: ignore[return-value] def main() -> None: """Selector de modos de sincronización.""" parser = argparse.ArgumentParser(description="Factuges Sync Dispatcher") parser.add_argument( "mode", nargs="?", choices=["factuges", "verifactu", "all"], help="Modo de sincronización", ) args = parser.parse_args() mode = resolve_mode(args.mode) if os.getenv("ENV") == "development": print("Running in development mode (no docker)") if mode == "factuges": run_module("app.sync_factuges_main") elif mode == "verifactu": run_module("app.sync_verifactu_main") else: # mode == "all" # Primero sincroniza FactuGES, luego Verifactu. # Si la primera falla, el proceso no termina por el check=False. run_module("app.sync_factuges_main") run_module("app.sync_verifactu_main") if __name__ == "__main__": main()