cambio en el horario de ejecución
This commit is contained in:
1 parent
457ca296fa
commit
3ec141c752
2 files changed
+97
-44
No files matched your search
+1
-1
@@ -38,7 +38,7 @@ def get_connection():
|
|||||||
return None
|
return None
|
||||||
|
|
||||||
# ============================================================================
|
# ============================================================================
|
||||||
def obtener_documentos_creados_actualizados_hace_x_minutos(schema, minutes=60):
|
def obtener_documentos_creados_actualizados_hace_60_minutos(schema, minutes=60):
|
||||||
"""
|
"""
|
||||||
Se conecta a la base de datos SAP HANA, realiza una consulta a la tabla OPCH,
|
Se conecta a la base de datos SAP HANA, realiza una consulta a la tabla OPCH,
|
||||||
y formatea el resultado para que coincida con el esquema de documentos.json.
|
y formatea el resultado para que coincida con el esquema de documentos.json.
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
import json
|
import json
|
||||||
import time
|
import time
|
||||||
from datetime import datetime
|
from datetime import datetime, timedelta
|
||||||
from dotenv import load_dotenv
|
from dotenv import load_dotenv
|
||||||
|
|
||||||
import logger_utilities
|
import logger_utilities
|
||||||
@@ -11,9 +11,35 @@ from constants import ESTADOS_COMPROBANTE
|
|||||||
from hana_manager import actualizar_documento_sap
|
from hana_manager import actualizar_documento_sap
|
||||||
|
|
||||||
# ============================================================================
|
# ============================================================================
|
||||||
def es_hora_pico(dt: datetime) -> bool:
|
|
||||||
|
HORARIOS = [
|
||||||
|
(6, 30, 13, 15, 10, "rapido"), # 06:30 - 13:15 -> cada 10 segundos
|
||||||
|
(13, 15, 14, 0, 1800, "full"), # 13:15 - 14:00 -> cada 30 minutos
|
||||||
|
(14, 0, 17, 30, 10, "rapido"), # 14:00 - 17:30 -> cada 10 segundos
|
||||||
|
(17, 30, 21, 30, 1800, "full"), # 17:30 - 21:30 -> cada 30 minutos
|
||||||
|
]
|
||||||
|
|
||||||
|
# ============================================================================
|
||||||
|
def obtener_intervalo(dt: datetime) -> tuple[int, str] | None:
|
||||||
minutos = dt.hour * 60 + dt.minute
|
minutos = dt.hour * 60 + dt.minute
|
||||||
return (360 <= minutos < 795) or (840 <= minutos < 1050)
|
|
||||||
|
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: datetime) -> int:
|
||||||
|
inicio = dt.replace(hour=6, minute=30, second=0, microsecond=0)
|
||||||
|
|
||||||
|
if dt >= inicio:
|
||||||
|
inicio += timedelta(days=1)
|
||||||
|
|
||||||
|
return int((inicio - dt).total_seconds())
|
||||||
|
|
||||||
# ============================================================================
|
# ============================================================================
|
||||||
def cargar_empresas():
|
def cargar_empresas():
|
||||||
@@ -98,11 +124,11 @@ def enviar_mensaje_sl(usercode, doc, resultado, schema):
|
|||||||
# ============================================================================
|
# ============================================================================
|
||||||
def procesar_empresa(schema, datos_empresa, modo):
|
def procesar_empresa(schema, datos_empresa, modo):
|
||||||
print(f"\n{'='*60}")
|
print(f"\n{'='*60}")
|
||||||
print(f"🏢 Procesando empresa: {schema}")
|
print(f"🏢 Procesando empresa: {schema} [{modo}]")
|
||||||
print(f"{'='*60}")
|
print(f"{'='*60}")
|
||||||
|
|
||||||
if modo == "rapido":
|
if modo == "rapido":
|
||||||
documentos = hana_manager.obtener_documentos_creados_actualizados_hace_x_minutos(schema, 60)
|
documentos = hana_manager.obtener_documentos_creados_actualizados_hace_60_minutos(schema, 60)
|
||||||
else:
|
else:
|
||||||
documentos = hana_manager.obtener_documentos_fecha_emision_ultimos_8_dias(schema)
|
documentos = hana_manager.obtener_documentos_fecha_emision_ultimos_8_dias(schema)
|
||||||
if not documentos:
|
if not documentos:
|
||||||
@@ -186,69 +212,96 @@ def procesar_empresa(schema, datos_empresa, modo):
|
|||||||
|
|
||||||
return procesados, errores
|
return procesados, errores
|
||||||
|
|
||||||
|
# ============================================================================
|
||||||
|
def procesar_todas_empresas(inicio_ciclo, modo):
|
||||||
|
|
||||||
|
empresas = cargar_empresas()
|
||||||
|
print(f"📋 Empresas cargadas: {len(empresas)}")
|
||||||
|
|
||||||
|
total_procesados = 0
|
||||||
|
total_errores = 0
|
||||||
|
|
||||||
|
for empresa in empresas:
|
||||||
|
schema = empresa["CompanyDB"]
|
||||||
|
|
||||||
|
if empresa.get("Locked") == "Y":
|
||||||
|
print(f"\n⏭️ Empresa {schema} está bloqueada (LOCKED=Y), saltando...")
|
||||||
|
continue
|
||||||
|
|
||||||
|
sapb1_manager._sap_credentials = {
|
||||||
|
"company": empresa["CompanyDB"],
|
||||||
|
"username": empresa["UserName"],
|
||||||
|
"password": empresa["Password"],
|
||||||
|
}
|
||||||
|
|
||||||
|
try:
|
||||||
|
p, e = procesar_empresa(schema, empresa, modo)
|
||||||
|
total_procesados += p
|
||||||
|
total_errores += e
|
||||||
|
except Exception as ex:
|
||||||
|
print(f"❌ Error procesando empresa {schema}: {ex}")
|
||||||
|
total_errores += 1
|
||||||
|
|
||||||
|
duracion_ciclo = datetime.now() - inicio_ciclo
|
||||||
|
print(f"\n📊 CICLO COMPLETADO en {str(duracion_ciclo).split('.')[0]}")
|
||||||
|
print(f" ✅ {total_procesados} procesados | ❌ {total_errores} errores")
|
||||||
|
return total_procesados, total_errores
|
||||||
|
|
||||||
# ============================================================================
|
# ============================================================================
|
||||||
def main():
|
def main():
|
||||||
|
|
||||||
log_path = logger_utilities.setup_logger()
|
log_path = logger_utilities.setup_logger()
|
||||||
logger_utilities.limpiar_logs_antiguos(dias=7)
|
logger_utilities.limpiar_logs_antiguos(dias=7)
|
||||||
|
|
||||||
load_dotenv(dotenv_path=".env.dev")
|
load_dotenv(dotenv_path=".env.dev")
|
||||||
|
|
||||||
empresas = cargar_empresas()
|
|
||||||
print(f"📋 Empresas cargadas: {len(empresas)}")
|
|
||||||
|
|
||||||
print("=" * 60)
|
print("=" * 60)
|
||||||
print("🚀 Demonio iniciado")
|
print("🚀 Demonio iniciado")
|
||||||
print(f"📄 Log guardado en: {log_path}")
|
print(f"📄 Log guardado en: {log_path}")
|
||||||
print(" Horario pico (cada 10 seg): 06:00 - 13:15 | 14:00 - 17:30")
|
print("Servicio iniciado")
|
||||||
print(" Horario valle (cada 30 min): resto del día")
|
|
||||||
print("=" * 60)
|
print("=" * 60)
|
||||||
|
|
||||||
while True:
|
while True:
|
||||||
|
|
||||||
inicio_ciclo = datetime.now()
|
inicio_ciclo = datetime.now()
|
||||||
|
|
||||||
logger_utilities.rotar_log()
|
resultado = obtener_intervalo(inicio_ciclo)
|
||||||
logger_utilities.limpiar_logs_antiguos(dias=7)
|
|
||||||
|
|
||||||
modo = "rapido" if es_hora_pico(inicio_ciclo) else "lento"
|
if resultado is not None:
|
||||||
|
|
||||||
print(f"\n{'='*60}")
|
intervalo, modo = resultado
|
||||||
print(f"🔄 Ciclo [{modo.upper()}] {inicio_ciclo.strftime('%Y-%m-%d %H:%M:%S')}")
|
|
||||||
print(f"{'='*60}")
|
|
||||||
|
|
||||||
total_procesados = 0
|
print(
|
||||||
total_errores = 0
|
f"\n[{inicio_ciclo:%Y-%m-%d %H:%M:%S}] "
|
||||||
|
f"Iniciando ciclo [{modo}] (cada {intervalo}s)"
|
||||||
|
)
|
||||||
|
|
||||||
for empresa in empresas:
|
procesar_todas_empresas(inicio_ciclo, modo)
|
||||||
schema = empresa["CompanyDB"]
|
|
||||||
|
|
||||||
if empresa.get("Locked") == "Y":
|
duracion = (datetime.now() - inicio_ciclo).total_seconds()
|
||||||
print(f"\n⏭️ Empresa {schema} está bloqueada (LOCKED=Y), saltando...")
|
|
||||||
continue
|
|
||||||
|
|
||||||
sapb1_manager._sap_credentials = {
|
if duracion > intervalo:
|
||||||
"company": empresa["CompanyDB"],
|
print(
|
||||||
"username": empresa["UserName"],
|
f"⚠️ El ciclo demoró {duracion:.1f}s "
|
||||||
"password": empresa["Password"],
|
f"(intervalo configurado {intervalo}s)"
|
||||||
}
|
)
|
||||||
|
|
||||||
try:
|
dormir = max(0, intervalo - duracion)
|
||||||
p, e = procesar_empresa(schema, empresa, modo)
|
|
||||||
total_procesados += p
|
|
||||||
total_errores += e
|
|
||||||
except Exception as ex:
|
|
||||||
print(f"❌ Error procesando empresa {schema}: {ex}")
|
|
||||||
total_errores += 1
|
|
||||||
|
|
||||||
duracion_ciclo = datetime.now() - inicio_ciclo
|
print(f"💤 Próximo ciclo [{modo}] en {dormir:.0f}s...")
|
||||||
print(f"\n📊 CICLO COMPLETADO en {str(duracion_ciclo).split('.')[0]}")
|
|
||||||
print(f" ✅ {total_procesados} procesados | ❌ {total_errores} errores")
|
|
||||||
|
|
||||||
transcurrido = duracion_ciclo.total_seconds()
|
else:
|
||||||
modo_ahora = "rapido" if es_hora_pico(datetime.now()) else "lento"
|
|
||||||
intervalo = 10 if modo_ahora == "rapido" else 1800
|
dormir = segundos_hasta_proximo_inicio(inicio_ciclo)
|
||||||
dormir = max(0, intervalo - transcurrido)
|
|
||||||
|
despertar = inicio_ciclo + timedelta(seconds=dormir)
|
||||||
|
|
||||||
|
print(
|
||||||
|
f"\n[{inicio_ciclo:%Y-%m-%d %H:%M:%S}] "
|
||||||
|
f"Fuera del horario.\n"
|
||||||
|
f"Próxima ejecución: {despertar:%Y-%m-%d %H:%M:%S}"
|
||||||
|
)
|
||||||
|
|
||||||
print(f"💤 Próximo ciclo [{modo_ahora}] en {dormir:.0f}s...")
|
|
||||||
time.sleep(dormir)
|
time.sleep(dormir)
|
||||||
|
|
||||||
# ============================================================================
|
# ============================================================================
|
||||||
|
|||||||
Reference in new issue
Block a user