Uecko_ERP_FactuGES_sync/app/cli.py
2025-12-01 09:55:54 +01:00

69 lines
1.9 KiB
Python

# 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()