// correspondence-page.jsx — Журнал кореспонденції (вхідна / вихідна). // Ведеться електронно, друкується в кінці року. Колонки за зразком + посилання на гугл-диск. function CorrespondencePage({ role }) { const SYS = window.SYS_DATE || "2026-06-21"; const curYear = parseInt(SYS.slice(0, 4), 10); const [direction, setDirection] = React.useState("in"); const [year, setYear] = React.useState(curYear); const [items, setItems] = React.useState([]); const [editing, setEditing] = React.useState(null); const canEdit = role === "director" || role === "accountant"; const dots = (iso) => (window.dateDots ? window.dateDots(iso) : (iso || "")); const reload = React.useCallback(() => { if (!(window.API && window.API.list)) return; // Рік фільтруємо на клієнті: колонка year — int, а у фільтрі бекенда значення йде рядком → 500. window.API.list("correspondence", { direction }) .then((r) => setItems((r || []).filter((x) => x.year === year).slice().sort((a, b) => (a.seq || 0) - (b.seq || 0)))) .catch(() => {}); }, [direction, year]); React.useEffect(() => { reload(); }, [reload]); const years = []; for (let y = curYear; y >= 2022; y--) years.push(y); const isIn = direction === "in"; const startNew = () => { const nextSeq = items.reduce((m, x) => Math.max(m, x.seq || 0), 0) + 1; setEditing({ direction, year, seq: nextSeq, regDate: SYS.slice(0, 10), regIndex: "", docDate: "", docNo: "", counterparty: "", summary: "", notes: "", driveUrl: "" }); }; const save = () => { const e = editing; window.API.save("correspondence", e.id || null, { ...e, direction, year }) .then(() => { setEditing(null); reload(); }) .catch(() => alert("Не вдалося зберегти запис.")); }; const remove = (id) => { if (!window.confirm("Видалити цей запис журналу?")) return; window.API.del("/correspondence/" + id).then(reload).catch(() => {}); }; const set = (k, v) => setEditing((e) => ({ ...e, [k]: v })); return (

Журнал кореспонденції

{isIn ? "Вхідна документація" : "Вихідна документація"}{year} рік{items.length} записів
{/* Тулбар */}
{canEdit && }
{/* Форма запису */} {editing && (
{editing.id ? "Редагувати запис" : `Новий запис № ${editing.seq}`}