109 lines
3.9 KiB
Python
109 lines
3.9 KiB
Python
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()
|