// vat-data.jsx — облік ПДВ: реєстр податкових накладних, зобов'язання vs кредит. // ТОВ на загальній системі, платник ПДВ 20%. Дані по місяцях (звітний період). const VAT_RATE = (window.TAX_RATES && window.TAX_RATES.pdv) || 0.20; window.VAT_RATE = VAT_RATE; const vatOf = (base) => Math.round(base * VAT_RATE); window.vatOf = vatOf; // Звітні періоди ПДВ (місячний платник) window.VAT_PERIODS = [ { id: "2026-05", label: "Травень 2026", status: "open", payDue: "2026-06-30", paidAt: null }, { id: "2026-04", label: "Квітень 2026", status: "paid", payDue: "2026-05-30", paidAt: "2026-05-28" }, ]; // Статуси податкових накладних window.VAT_INV_STATUS = { // вихідні (зобов'язання) registered: { label: "Зареєстрована", tone: "live" }, pending: { label: "Очікує реєстрації", tone: "amber" }, overdue: { label: "Прострочена реєстрація", tone: "late" }, // вхідні (кредит) credit: { label: "У кредит", tone: "live" }, awaiting: { label: "Очікує постачальника", tone: "amber" }, no_vat: { label: "Без ПДВ (ЄП)", tone: "neutral" }, blocked: { label: "Заблокована ДПС", tone: "late" }, }; // Реєстр податкових накладних. kind: out (вихідна, зобов'язання) | in (вхідна, кредит) const TAX_INVOICES = [ // ——— ТРАВЕНЬ 2026 (звітний період відкритий) ——— // вихідні { id: "o-05-1", period: "2026-05", kind: "out", date: "2026-05-06", number: "12", party: "ТОВ «Подільський Девелопмент»", edrpou: "41835672", base: 850000, status: "registered", regDate: "2026-05-08", basis: "Рахунок №47 · етап «Робоча документація»", obj: "ЖК-Поділ" }, { id: "o-05-2", period: "2026-05", kind: "out", date: "2026-05-19", number: "13", party: "Управління освіти м. Києва", edrpou: "02147853", base: 420000, status: "pending", regDate: null, basis: "Рахунок №48 · етап «Стадія П»", obj: "Школа-23" }, { id: "o-05-3", period: "2026-05", kind: "out", date: "2026-05-27", number: "14", party: "ПП «Лісове»", edrpou: "39184562", base: 145000, status: "registered", regDate: "2026-05-29", basis: "Рахунок №49 · авторський нагляд", obj: "КОТ-Лісники" }, // вхідні { id: "i-05-1", period: "2026-05", kind: "in", date: "2026-05-12", number: "СФ-310", party: "ТОВ «Київекспертиза»", edrpou: "00012543", base: 96000, status: "credit", regDate: "2026-05-14", basis: "Експертиза проєкту «Школа-23»", obj: "Школа-23" }, { id: "i-05-2", period: "2026-05", kind: "in", date: "2026-05-15", number: "АР-88", party: "ТОВ «Архітектурні рішення»", edrpou: "41789632", base: 180000, status: "awaiting", regDate: null, basis: "Субпідряд · розділ АР", obj: "ЖК-Поділ" }, { id: "i-05-3", period: "2026-05", kind: "in", date: "2026-05-20", number: "ЕП-145", party: "ТОВ «ЕнергоПроект»", edrpou: "39875421", base: 72000, status: "credit", regDate: "2026-05-22", basis: "Субпідряд · зовнішні мережі", obj: "КОТ-Лісники" }, { id: "i-05-4", period: "2026-05", kind: "in", date: "2026-05-02", number: "ОР-05", party: "ТОВ «Бізнес-Центр Хорива»", edrpou: "38217604", base: 38000, status: "credit", regDate: "2026-05-05", basis: "Оренда офісу за травень", obj: null }, { id: "i-05-5", period: "2026-05", kind: "in", date: "2026-05-18", number: "12", party: "ФОП Іваненко О.І.", edrpou: "2987654321", base: 60000, status: "no_vat", regDate: null, basis: "Геодезичні роботи (єдиний податок)", obj: "КОТ-Лісники" }, { id: "i-05-6", period: "2026-05", kind: "in", date: "2026-05-23", number: "INT-552",party: "ТОВ «Датагруп»", edrpou: "31720394", base: 12000, status: "credit", regDate: "2026-05-24", basis: "Інтернет, хостинг, ПЗ", obj: null }, // ——— КВІТЕНЬ 2026 (період подано і сплачено) ——— { id: "o-04-1", period: "2026-04", kind: "out", date: "2026-04-09", number: "09", party: "ТОВ «Подільський Девелопмент»", edrpou: "41835672", base: 760000, status: "registered", regDate: "2026-04-11", basis: "Рахунок №42 · етап «Стадія П»", obj: "ЖК-Поділ" }, { id: "o-04-2", period: "2026-04", kind: "out", date: "2026-04-21", number: "10", party: "Міністерство юстиції України", edrpou: "00015622", base: 300000, status: "registered", regDate: "2026-04-23", basis: "Рахунок №43 · обстеження", obj: "Мінюст-СС2" }, { id: "o-04-3", period: "2026-04", kind: "out", date: "2026-04-28", number: "11", party: "Управління освіти м. Києва", edrpou: "02147853", base: 180000, status: "registered", regDate: "2026-04-30", basis: "Рахунок №44 · етап «ЕП»", obj: "Школа-23" }, { id: "i-04-1", period: "2026-04", kind: "in", date: "2026-04-10", number: "СФ-298", party: "ТОВ «Київекспертиза»", edrpou: "00012543", base: 80000, status: "credit", regDate: "2026-04-12", basis: "Експертиза «Мінюст»", obj: "Мінюст-СС2" }, { id: "i-04-2", period: "2026-04", kind: "in", date: "2026-04-15", number: "АР-81", party: "ТОВ «Архітектурні рішення»", edrpou: "41789632", base: 120000, status: "credit", regDate: "2026-04-17", basis: "Субпідряд · розділ АР", obj: "ЖК-Поділ" }, { id: "i-04-3", period: "2026-04", kind: "in", date: "2026-04-03", number: "ОР-04", party: "ТОВ «Бізнес-Центр Хорива»", edrpou: "38217604", base: 38000, status: "credit", regDate: "2026-04-05", basis: "Оренда офісу за квітень", obj: null }, { id: "i-04-4", period: "2026-04", kind: "in", date: "2026-04-18", number: "ІГ-77", party: "ТОВ «Інженерна геологія»", edrpou: "32147589", base: 90000, status: "credit", regDate: "2026-04-20", basis: "Інженерно-геологічні вишукування", obj: "КОТ-Лісники" }, { id: "i-04-5", period: "2026-04", kind: "in", date: "2026-04-25", number: "INT-540",party: "ТОВ «Датагруп»", edrpou: "31720394", base: 9000, status: "credit", regDate: "2026-04-26", basis: "Інтернет, хостинг", obj: null }, ]; window.TAX_INVOICES = TAX_INVOICES; // Підсумок ПДВ за період — рахується з реєстру (плюс додані вручну рядки extra) window.vatSummary = function (periodId, extra) { const rows = TAX_INVOICES.concat(extra || []).filter(r => r.period === periodId); let output = 0, outputUnreg = 0, input = 0, inputStuck = 0; let cntUnreg = 0, cntStuck = 0; rows.forEach(r => { const v = vatOf(r.base); if (r.kind === "out") { output += v; // зобов'язання виникає за датою першої події if (r.status !== "registered") { outputUnreg += v; cntUnreg++; } } else { if (r.status === "credit") input += v; // у кредит лише зареєстровані else if (r.status === "awaiting" || r.status === "blocked") { inputStuck += v; cntStuck++; } } }); return { rows, output, input, payable: output - input, outputUnreg, inputStuck, cntUnreg, cntStuck }; }; // Міст у P&L: фактичний вхідний ПДВ із зареєстрованих вхідних накладних (за рік) window.inputVatAnnual = function (year) { const y = String(year || "2026"); return TAX_INVOICES .filter(r => r.kind === "in" && r.status === "credit" && r.period.startsWith(y)) .reduce((s, r) => s + vatOf(r.base), 0); };