const { Card, Button, Icon, Tabs, Badge, PriorityBadge, StatusPill, SectorTag, DeadlineIndicator, Select } = window.ACRFlowDesignSystem_ba1e9c; const WEEK = ["Seg", "Ter", "Qua", "Qui", "Sex", "Sáb", "Dom"]; const MESES = ["Janeiro", "Fevereiro", "Março", "Abril", "Maio", "Junho", "Julho", "Agosto", "Setembro", "Outubro", "Novembro", "Dezembro"]; const parseBR = (s) => { if (!s) return null; const [d, m, y] = String(s).split("/").map(Number); return d && m && y ? new Date(y, m - 1, d) : null; }; function CalendarScreen({ onOpenDemand }) { const [view, setView] = React.useState("mes"); const [setor, setSetor] = React.useState("Todos os setores"); const hoje = new Date(); const [ref, setRef] = React.useState(new Date(hoje.getFullYear(), hoje.getMonth(), 1)); const D = window.ACRData; const setores = ["Todos os setores"].concat((D.sectorsCfg || []).map((s) => s.name)); const nomeSetor = (id) => { const s = (D.sectorsCfg || []).find((x) => x.id === id); return s ? s.name : ""; }; // eventos do mês exibido, derivados das demandas reais const events = {}; let atrasadosMes = 0; (D.demands || []).forEach((d) => { if (setor !== "Todos os setores" && nomeSetor(d.sector) !== setor) return; const dt = parseBR(d.due); if (!dt || dt.getMonth() !== ref.getMonth() || dt.getFullYear() !== ref.getFullYear()) return; const late = d.status !== "encerrada" && typeof d.daysLeft === "number" && d.daysLeft < 0; if (late) atrasadosMes += 1; const recur = !!d.recurrence && d.recurrence !== "nao"; const tone = d.status === "encerrada" ? "neutral" : late ? "danger" : d.daysLeft <= 1 ? "warning" : recur ? "flow" : "info"; (events[dt.getDate()] = events[dt.getDate()] || []).push({ id: d.id, t: d.title, tone, late, recur }); }); const totalMes = Object.values(events).reduce((a, v) => a + v.length, 0); const primeiro = new Date(ref.getFullYear(), ref.getMonth(), 1); const diasNoMes = new Date(ref.getFullYear(), ref.getMonth() + 1, 0).getDate(); const offset = (primeiro.getDay() + 6) % 7; // semana começa na segunda const diasMesAnterior = new Date(ref.getFullYear(), ref.getMonth(), 0).getDate(); const total = Math.ceil((offset + diasNoMes) / 7) * 7; const days = Array.from({ length: total }, (_, i) => { const n = i - offset + 1; const out = n < 1 || n > diasNoMes; return { key: i, n: n < 1 ? diasMesAnterior + n : n > diasNoMes ? n - diasNoMes : n, out }; }); const mesAnterior = MESES[(ref.getMonth() + 11) % 12]; const mesSeguinte = MESES[(ref.getMonth() + 1) % 12]; const irPara = (delta) => setRef(new Date(ref.getFullYear(), ref.getMonth() + delta, 1)); return (