// profit-report.jsx — Фінансовий результат (P&L) для ТОВ // Загальна система оподаткування, платник ПДВ. Період — рік. window.TAX_RATES = { profit: 0.18, // податок на прибуток pdv: 0.20, // ПДВ esv: 0.22, // ЄСВ (нарахування роботодавця) pdfo: 0.18, // ПДФО (утримання) vz: 0.05, // військовий збір (утримання) }; // Річний P&L — рахується наживо з даних договорів, ЗП, витрат і амортизації window.computeAnnualPL = (year = "2026") => { const T = window.TAX_RATES; // 1) Дохід — нараховані етапи договорів за рік (з ПДВ), переводимо в «без ПДВ» let revenueGross = 0; window.DATA.CONTRACTS.forEach(c => { c.schedule.forEach(s => { if ((s.dueDate || "").startsWith(year)) revenueGross += s.amount; }); }); const revenueNet = Math.round(revenueGross / (1 + T.pdv)); const vatOutput = revenueGross - revenueNet; // 2) Фонд оплати праці (штатні + часткові) та ЄСВ const payrollMonthly = window.DATA.TEAM .filter(p => p.employment !== "contractor") .reduce((s, p) => { const pay = window.computePayroll(p.id, p.partRate ? 88 : 176, 176); return s + (pay ? pay.gross : 0); }, 0); const payroll = payrollMonthly * 12; const esv = Math.round(payroll * T.esv); // 3) Витрати за категоріями (річні): recurring × 12 + разові цього року const annualForCats = (catIds) => window.DATA.EXPENSES.filter(e => catIds.includes(e.cat)).reduce((s, e) => { if (e.periodicity === "once") { const d = e.paidDate || e.nextDate || ""; return s + (d.startsWith(year) ? e.amount : 0); } return s + (e.monthlyAmount || 0) * 12; }, 0); const admCats = window.EXPENSE_CATEGORIES.filter(c => c.type === "adm").map(c => c.id); const subExp = annualForCats(["subcontract", "expertise"]); const zvvOther = annualForCats(["delivery", "fuel", "training"]); const adm = annualForCats(admCats); // 4) Амортизація майна (зі Складу) const amort = window.DATA.ASSETS .filter(a => a.status !== "written_off") .reduce((s, a) => s + window.computeDepreciation(a).monthly, 0) * 12; const expenses = payroll + esv + subExp + amort + adm + zvvOther; const operating = revenueNet - expenses; const profitTax = Math.max(0, Math.round(operating * T.profit)); const netProfit = operating - profitTax; const margin = revenueNet ? (netProfit / revenueNet) * 100 : 0; // 5) ПДВ: зобов'язання − вхідний кредит (фактичний — із податкових накладних по витратах) const vatInput = window.inputVatAnnual ? window.inputVatAnnual() : Math.round((adm + zvvOther + subExp) / 6); const vatPayable = vatOutput - vatInput; return { year, revenueGross, revenueNet, vatOutput, vatInput, vatPayable, payroll, esv, subExp, amort, adm, zvvOther, expenses, operating, profitTax, netProfit, margin, }; }; // ============ СТОРІНКА P&L ============ function FinancialReportPage({ onBack, role }) { const pl = window.computeAnnualPL("2026"); const m = window.formatMoney; const showCash = window.useCashVisible() && window.canSeeCash(role); const cashAnnual = window.totalCashMonthly() * 12; const mgmtProfit = pl.netProfit - cashAnnual; // Склад витрат для смуги const segs = [ { label: "Оплата праці", val: pl.payroll, color: "#015B76" }, { label: "ЄСВ 22%", val: pl.esv, color: "#3c6287" }, { label: "Адміністративні", val: pl.adm, color: "#5FB3CA" }, { label: "Амортизація", val: pl.amort, color: "#1F7553" }, { label: "Субпідряд/експертиза",val: pl.subExp, color: "#8ec975" }, { label: "Інші ЗВВ", val: pl.zvvOther,color: "#d4a373" }, ]; return (