/** * ¿Hay citas en los calendarios de la subcuenta? Solo lectura. * * El sondeo anterior miró únicamente el PRIMER calendario, que resultó ser uno * personal, y concluir «no hay citas» a partir de eso habría sido un error: el * que importa es «Servicio Spa». Aquí se recorren los SIETE, y se prueban las * dos formas de acotar que admite la API (por calendario y por usuario). * * node scripts/run-tsx.mjs platform/scripts/crm-spike-calendarios.ts */ import { crmRequest, CrmError, VERSION_CALENDARS } from "../crm/client.ts"; import { ctxDesdeEnv } from "../crm/ctx.ts"; import { requireEnv } from "../lib/env.ts"; const LOC = requireEnv("CRM_LOCATION_ID"); const CTX = ctxDesdeEnv(); const DIA = 86400000; async function eventos(query: Record): Promise { try { const r = await crmRequest("GET", "/calendars/events", { token: CTX.token, query, version: VERSION_CALENDARS, }); return r?.events ?? []; } catch (e: any) { if (e instanceof CrmError) { const cuerpo = typeof e.body === "string" ? e.body : JSON.stringify(e.body); return `${e.status}: ${String(e.message).slice(0, 120)}${cuerpo ? ` | ${cuerpo.slice(0, 160)}` : ""}`; } return String(e?.message ?? e); } } async function main() { const r = await crmRequest("GET", "/calendars/", { token: CTX.token, query: { locationId: LOC }, version: VERSION_CALENDARS, }); const cals: any[] = r?.calendars ?? []; console.log(`${cals.length} calendarios en la subcuenta ${LOC}\n`); const ahora = Date.now(); // Ventana amplia: dos años hacia atrás y uno hacia adelante. const desde = String(ahora - 730 * DIA); const hasta = String(ahora + 365 * DIA); let totalEventos = 0; for (const c of cals) { const res = await eventos({ locationId: LOC, calendarId: c.id, startTime: desde, endTime: hasta, }); const activo = c.isActive === false ? " (inactivo)" : ""; if (typeof res === "string") { console.log(` ✖ ${String(c.name).padEnd(42)}${activo} → ${res}`); } else { totalEventos += res.length; const marca = res.length ? "✔" : "·"; console.log(` ${marca} ${String(c.name).padEnd(42)}${activo} → ${res.length} citas`); if (res.length) { const e = res[0]; console.log(` ejemplo: ${JSON.stringify(e).slice(0, 300)}`); } } } console.log(`\nTotal de citas en los 7 calendarios (2 años atrás → 1 adelante): ${totalEventos}`); // La otra forma de acotar que documenta la API: por usuario en vez de por // calendario. Si por calendario no sale nada, conviene descartar que las // citas cuelguen de un usuario y no de un calendario. console.log("\n── Prueba alterna: acotar por usuario en vez de por calendario"); const porUsuario = await eventos({ locationId: LOC, userId: "x", startTime: desde, endTime: hasta, }); console.log( typeof porUsuario === "string" ? ` respuesta: ${porUsuario}` : ` ${porUsuario.length} citas` ); console.log("\n── ¿Y sin acotar por calendario ni usuario?"); const sinFiltro = await eventos({ locationId: LOC, startTime: desde, endTime: hasta }); console.log( typeof sinFiltro === "string" ? ` respuesta: ${sinFiltro}` : ` ${sinFiltro.length} citas` ); } main().catch((e) => { console.error("Se detuvo:", e?.message ?? e); process.exit(1); });