import sys import os import time import signal from datetime import datetime, timedelta sys.path.insert(0, os.path.dirname(os.path.abspath(__file__))) from logger_manager import get_logger from service import process_all # ============================================================================ HORARIOS = [ (8, 0, 18, 0, 600, "rapido"), (18, 0, 23, 0, 3600, "full"), ] DIAS_ACTIVOS = [0, 1, 2, 3, 4, 5, 6] _running = True log = get_logger() # ============================================================================ def obtener_intervalo(dt): minutos = dt.hour * 60 + dt.minute for hi, mi, hf, mf, intervalo, modo in HORARIOS: inicio = hi * 60 + mi fin = hf * 60 + mf if inicio <= minutos < fin: return (intervalo, modo) return None # ============================================================================ def segundos_hasta_proximo_inicio(dt): target = dt.replace(hour=HORARIOS[0][0], minute=HORARIOS[0][1], second=0, microsecond=0) if dt >= target: target += timedelta(days=1) return int((target - dt).total_seconds()) # ============================================================================ def segundos_hasta_proximo_dia_activo(dt): for dias in range(1, 8): prox = dt + timedelta(days=dias) if prox.weekday() in DIAS_ACTIVOS: target = prox.replace(hour=HORARIOS[0][0], minute=HORARIOS[0][1], second=0, microsecond=0) return int((target - dt).total_seconds()) return 86400 # ============================================================================ def signal_handler(signum, frame): global _running log.info("🛑 Señal de parada recibida. Deteniendo...") _running = False # ============================================================================ def main(): global _running signal.signal(signal.SIGINT, signal_handler) signal.signal(signal.SIGTERM, signal_handler) log.info("🚀 Servicio ComercioNet - Procesador OC") log.info("📅 Días activos: {} (0=lun, 6=dom)".format(DIAS_ACTIVOS)) log.info("🕐 Horarios:") for hi, mi, hf, mf, intervalo, modo in HORARIOS: log.info(" {:02d}:{:02d} - {:02d}:{:02d} | cada {}s | {}".format(hi, mi, hf, mf, intervalo, modo)) while _running: ahora = datetime.now() if ahora.weekday() not in DIAS_ACTIVOS: espera = segundos_hasta_proximo_dia_activo(ahora) prox = ahora + timedelta(seconds=espera) log.info("📅 Día no activo. Próximo inicio: {}".format(prox.strftime("%a %Y-%m-%d %H:%M:%S"))) for _ in range(int(espera)): if not _running: break time.sleep(1) continue intervalo_info = obtener_intervalo(ahora) if not intervalo_info: espera = segundos_hasta_proximo_inicio(ahora) prox = ahora + timedelta(seconds=espera) log.info("⏸️ Fuera de horario. Próximo inicio: {}".format(prox.strftime("%H:%M:%S"))) for _ in range(int(espera)): if not _running: break time.sleep(1) continue intervalo, modo = intervalo_info log.info("🔄 Ciclo: {} | modo={} | intervalo={}s".format(ahora.strftime("%Y-%m-%d %H:%M:%S"), modo, intervalo)) try: process_all() except Exception as e: log.error("❌ Error en ciclo: {}".format(e)) if _running: log.info("💤 Próximo ciclo [{}] en {}s...".format(modo, intervalo)) for _ in range(intervalo): if not _running: break time.sleep(1) log.info("🛑 Servicio detenido.") # ============================================================================ if __name__ == "__main__": main()