import type { Campaign } from "@b2bcall/database"; /** * Janela de funcionamento da campanha (agente.md secao 63-64: timezone, * days_of_week, start/end_date, start/end_time — status vira * WAITING_SCHEDULE quando fora da janela). Usa `Intl.DateTimeFormat` com * `timeZone` em vez de trazer uma lib de datas só pra isso — o Node já sabe * converter pra qualquer timezone IANA nativamente. */ export function isWithinSchedule(campaign: Campaign, now: Date = new Date()): boolean { const parts = new Intl.DateTimeFormat("en-US", { timeZone: campaign.timezone, year: "numeric", month: "2-digit", day: "2-digit", hour: "2-digit", minute: "2-digit", hour12: false, weekday: "short", }).formatToParts(now); const get = (type: string) => parts.find((p) => p.type === type)?.value ?? ""; const dateStr = `${get("year")}-${get("month")}-${get("day")}`; const timeStr = `${get("hour")}:${get("minute")}`; const weekdayMap: Record = { Mon: 1, Tue: 2, Wed: 3, Thu: 4, Fri: 5, Sat: 6, Sun: 7 }; const isoWeekday = weekdayMap[get("weekday")]; if (campaign.startDate) { const startStr = campaign.startDate.toISOString().slice(0, 10); if (dateStr < startStr) return false; } if (campaign.endDate) { const endStr = campaign.endDate.toISOString().slice(0, 10); if (dateStr > endStr) return false; } if (campaign.daysOfWeek.length > 0 && !campaign.daysOfWeek.includes(isoWeekday)) { return false; } if (campaign.startTime && timeStr < campaign.startTime) return false; if (campaign.endTime && timeStr > campaign.endTime) return false; return true; }