Files
comercio-net/main.py
T

109 lines
3.9 KiB
Python
Raw Normal View History

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