fix: format scheduler times in Colombia UTC-5 server-side
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Sonnet 4.6
parent
12f5f1388d
commit
83c8b2aa0b
@@ -196,13 +196,11 @@ async function pollSchedulerStatus() {
|
|||||||
}
|
}
|
||||||
const parts = [];
|
const parts = [];
|
||||||
if (d.next_run) {
|
if (d.next_run) {
|
||||||
const nx = new Date(d.next_run);
|
parts.push(`<span><i class="fas fa-clock mr-1 text-blue-400"></i>Próxima ejecución: <strong>${d.next_run}</strong></span>`);
|
||||||
parts.push(`<span><i class="fas fa-clock mr-1 text-blue-400"></i>Próxima ejecución: <strong>${nx.toLocaleTimeString('es-CO')}</strong></span>`);
|
|
||||||
}
|
}
|
||||||
if (d.ultimo_log) {
|
if (d.ultimo_log) {
|
||||||
const ul = d.ultimo_log;
|
const ul = d.ultimo_log;
|
||||||
const ts = new Date(ul.created_at).toLocaleTimeString('es-CO');
|
parts.push(`<span><i class="fas fa-history mr-1 text-purple-400"></i>Último sync scheduler: <strong>${ul.hora}</strong> · ${ul.total ?? 0} procesados, ${ul.errores ?? 0} errores</span>`);
|
||||||
parts.push(`<span><i class="fas fa-history mr-1 text-purple-400"></i>Último sync scheduler: <strong>${ts}</strong> · ${ul.total ?? 0} procesados, ${ul.errores ?? 0} errores</span>`);
|
|
||||||
}
|
}
|
||||||
live.innerHTML = parts.join('');
|
live.innerHTML = parts.join('');
|
||||||
} catch(_) {}
|
} catch(_) {}
|
||||||
|
|||||||
@@ -77,19 +77,36 @@ async def shutdown():
|
|||||||
async def scheduler_status():
|
async def scheduler_status():
|
||||||
from fastapi.responses import JSONResponse
|
from fastapi.responses import JSONResponse
|
||||||
from app.database import get_connection
|
from app.database import get_connection
|
||||||
|
from datetime import timezone, timedelta
|
||||||
|
COL = timezone(timedelta(hours=-5))
|
||||||
|
|
||||||
job = _scheduler.get_job("wa_sync_recientes")
|
job = _scheduler.get_job("wa_sync_recientes")
|
||||||
next_run = job.next_run_time.isoformat() if job and job.next_run_time else None
|
next_run_str = None
|
||||||
|
if job and job.next_run_time:
|
||||||
|
next_run_str = job.next_run_time.astimezone(COL).strftime("%H:%M:%S")
|
||||||
|
|
||||||
conn = get_connection()
|
conn = get_connection()
|
||||||
row = conn.execute(
|
row = conn.execute(
|
||||||
"SELECT created_at, total, errores, origen "
|
"SELECT created_at, total, errores FROM sync_wa_log "
|
||||||
"FROM sync_wa_log WHERE origen='scheduler' ORDER BY id DESC LIMIT 1"
|
"WHERE origen='scheduler' ORDER BY id DESC LIMIT 1"
|
||||||
).fetchone()
|
).fetchone()
|
||||||
conn.close()
|
conn.close()
|
||||||
|
|
||||||
|
ultimo = None
|
||||||
|
if row:
|
||||||
|
from datetime import datetime
|
||||||
|
ts_utc = datetime.fromisoformat(row["created_at"].replace(" ", "T") + "+00:00")
|
||||||
|
ultimo = {
|
||||||
|
"hora": ts_utc.astimezone(COL).strftime("%H:%M:%S"),
|
||||||
|
"total": row["total"],
|
||||||
|
"errores": row["errores"],
|
||||||
|
}
|
||||||
|
|
||||||
return JSONResponse({
|
return JSONResponse({
|
||||||
"running": _scheduler.running,
|
"running": _scheduler.running,
|
||||||
"job_exists": job is not None,
|
"job_exists": job is not None,
|
||||||
"next_run": next_run,
|
"next_run": next_run_str,
|
||||||
"ultimo_log": dict(row) if row else None,
|
"ultimo_log": ultimo,
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user