69 lines
1.9 KiB
Python
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=True)
|
|
|
|
|
|
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 termina por el check=True.
|
|
run_module("app.sync_factuges_main")
|
|
run_module("app.sync_verifactu_main")
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main()
|