chore: initial commit del proyecto SCAII_Sync_Client

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
2026-07-09 13:38:20 -05:00
commit 10dc063cf1
26 changed files with 2069 additions and 0 deletions

117
config.py Normal file
View File

@@ -0,0 +1,117 @@
import argparse
import configparser
import os
import sys
from typing import List, Dict, Any
from logger_utils import log
class ConfiguracionApp:
def __init__(self):
self.datos: Dict[str, Any] = {
"servidor": "",
"base_datos": "",
"usuario": "sa",
"password": "",
"puerto": 0,
"sistema": "SCAF",
"pedimento": "",
"tipo_moneda": "ME",
"proceso": 1,
"url_api": "", # Se calculará dinámicamente
"progreso_actual": 0
}
self.usuario_rpa = ""
self.password_rpa = ""
def cargar(self):
log.info("Iniciando carga de configuración (Modo Parámetros)...")
log.info(f"=== ARGUMENTOS RECIBIDOS (sys.argv) ===")
log.info(f"Total de argumentos: {len(sys.argv)}")
for i, arg in enumerate(sys.argv):
log.info(f" argv[{i}] = '{arg}'")
log.info(f"=======================================")
# 2. Parseo manual de argumentos - compatible con -KEY=VALUE (WinDev) y /KEY VALUE (legacy)
params = {}
argv = sys.argv[1:]
i = 0
while i < len(argv):
arg = argv[i]
# Formato -KEY=VALUE o /KEY=VALUE
if '=' in arg:
key, value = arg.split('=', 1)
key = key.lstrip('-').lstrip('/')
params[key] = value
# Formato -KEY VALUE o /KEY VALUE (sin signo igual)
elif arg.startswith('-') or arg.startswith('/'):
key = arg.lstrip('-').lstrip('/')
if i + 1 < len(argv) and not argv[i+1].startswith('-') and not argv[i+1].startswith('/'):
params[key] = argv[i+1]
i += 1
else:
params[key] = True
i += 1
log.info(f"Parámetros interpretados: {list(params.keys())}")
self._aplicar_dict_params(params)
# 3. Validación (Sin modo test por defecto)
if not self.datos["servidor"]:
log.error("FALTA PARÁMETRO: No se recibió DBServer. El proceso no puede continuar.")
# 4. Lógica de URL Dinámica (Solo SCAII o SCAF)
self.datos["url_api"] = "https://104.192.7.152:3529/"
# 5. Valores por defecto finales
if not self.datos["puerto"] or self.datos["puerto"] == 0:
self.datos["puerto"] = 1433
# 6. Asegurar que las credenciales RPA estén en el dict de datos
self.datos["usuario_rpa"] = self.usuario_rpa
self.datos["password_rpa"] = self.password_rpa
log.info(f"Configuración cargada. Servidor: {self.datos['servidor']}, DB: {self.datos['base_datos']}, Sistema: {self.datos['sistema']}")
def _leer_archivo_ini(self):
config = configparser.ConfigParser()
# Buscamos el archivo en el mismo directorio del EXE
ruta_ini = os.path.join(os.path.dirname(os.path.abspath(sys.argv[0])), "SCAII_Sync.ini")
try:
if config.read(ruta_ini):
# Buscar sección Database de forma insensible a mayúsculas
section_db = next((s for s in config.sections() if s.lower() == "database"), None)
if section_db:
db = config[section_db]
self.datos["servidor"] = db.get("Server", self.datos["servidor"])
self.datos["base_datos"] = db.get("Database", self.datos["base_datos"])
self.datos["usuario"] = db.get("User", self.datos["usuario"])
self.datos["password"] = db.get("Pass", self.datos["password"])
self.datos["puerto"] = int(db.get("Port", "1433"))
log.info(f"Datos de DB cargados desde sección [{section_db}]")
# Buscar sección API de forma insensible a mayúsculas
section_api = next((s for s in config.sections() if s.lower() == "api"), None)
if section_api:
api = config[section_api]
self.usuario_rpa = api.get("User", self.usuario_rpa)
self.password_rpa = api.get("Pass", self.password_rpa)
log.info(f"Datos de API cargados desde sección [{section_api}]")
log.info(f"Archivo INI leído con éxito desde: {ruta_ini}")
except Exception as e:
log.error(f"Error al leer archivo INI: {e}")
pass
def _aplicar_dict_params(self, params: dict):
"""Aplica los parámetros desde un diccionario -KEY=VALUE (formato WinDev)"""
if params.get("DBServer"): self.datos["servidor"] = params["DBServer"]
if params.get("DBPort"): self.datos["puerto"] = int(params["DBPort"])
if params.get("DBUser"): self.datos["usuario"] = params["DBUser"]
if params.get("DBPass"): self.datos["password"] = params["DBPass"]
if params.get("DBDatabase"): self.datos["base_datos"] = params["DBDatabase"]
if params.get("DBSystem"): self.datos["sistema"] = params["DBSystem"]
if params.get("DBPedi"): self.datos["pedimento"] = params["DBPedi"]
if params.get("DBMoneda"): self.datos["tipo_moneda"] = params["DBMoneda"]
if params.get("DBProcess") is not None: self.datos["proceso"] = int(params["DBProcess"])
if params.get("RPAUser"): self.usuario_rpa = params["RPAUser"]
if params.get("RPAPass"): self.password_rpa = params["RPAPass"]
log.info(f"Parámetros aplicados -> Servidor: {self.datos['servidor']}, DB: {self.datos['base_datos']}, Sistema: {self.datos['sistema']}, Pedimento: {self.datos['pedimento']}")