// 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 (
{onBack && }

Фінансовий результат · P&L

рік {pl.year} ТОВ · загальна система платник ПДВ метод нарахування
Дохід (без ПДВ)
{m(pl.revenueNet)}
з ПДВ: {m(pl.revenueGross)} ₴
Витрати разом
{m(pl.expenses)}
{Math.round(pl.expenses / pl.revenueNet * 100)}% доходу
Чистий прибуток
= 0 ? "var(--c-green-deep)" : "var(--late)"}}>{m(pl.netProfit)}
після податку на прибуток
Рентабельність
= 0 ? "var(--c-green-deep)" : "var(--late)"}}>{pl.margin.toFixed(1)}%
чистий прибуток / дохід
{/* Звіт P&L */}

Звіт про фінансові результати

за {pl.year} рік
Доходи
Дохід від реалізації проєктних робіт без ПДВ · нараховано за етапами договорів {m(pl.revenueNet)} ₴
Собівартість і прямі витрати
Оплата праці (виробничий персонал) нарахована ЗП штатних і часткових · ×12 − {m(pl.payroll)} ₴
ЄСВ {Math.round(window.TAX_RATES.esv*100)}% (нарахування роботодавця) ПДФО 18% і ВЗ 5% утримуються із ЗП − {m(pl.esv)} ₴
Субпідряд і експертиза залучені організації · по об'єктах − {m(pl.subExp)} ₴
Амортизація майна прямолінійна · зі Складу − {m(pl.amort)} ₴
Операційні витрати
Адміністративні (АДМ) оренда, ПЗ, зв'язок, реклама, банк − {m(pl.adm)} ₴
Загальновиробничі інші (ЗВВ) пальне, виїзди, навчання − {m(pl.zvvOther)} ₴
Усього витрат − {m(pl.expenses)} ₴
Прибуток до оподаткування {m(pl.operating)} ₴
Податок на прибуток {Math.round(window.TAX_RATES.profit*100)}% загальна система − {m(pl.profitTax)} ₴
= 0 ? "is-good" : "is-bad"}`}> Чистий прибуток рентабельність {pl.margin.toFixed(1)}% {m(pl.netProfit)} ₴
{showCash && cashAnnual > 0 && <>
Управлінські коригування · конфіденційно
Готівкові виплати (в конверті) поза офіційним обліком · {m(window.totalCashMonthly())} ₴/міс − {m(cashAnnual)} ₴
= 0 ? "is-good" : "is-bad"}`}> Реальний результат (управлінський) після готівкових виплат {m(mgmtProfit)} ₴
}
{/* Структура витрат */}

Структура витрат

{m(pl.expenses)} ₴ разом
{segs.filter(s => s.val > 0).map((s, i) => (
))}
{segs.map((s, i) => (
{s.label} {m(s.val)} ₴ {Math.round(s.val / pl.expenses * 100)}%
))}
{/* ПДВ */}

Податок на додану вартість

не входить у прибуток — окреме зобов'язання
ПДВ зобов'язання (з реалізації) {Math.round(window.TAX_RATES.pdv*100)}% від доходу {m(pl.vatOutput)} ₴
ПДВ кредит (вхідний) фактичний · з податкових накладних по витратах − {m(pl.vatInput)} ₴
ПДВ до сплати {m(pl.vatPayable)} ₴
Методика: метод нарахування — дохід визнається за здачею етапів договорів, незалежно від оплати. Дохід показано без ПДВ. ЄСВ 22% — нарахування роботодавця понад ЗП; ПДФО 18% і ВЗ 5% утримуються із ЗП і вже враховані у фонді. Амортизація береться з модуля «Склад». Податок на прибуток 18%, ПДВ 20%. Вхідний ПДВ рахується з фактичних витрат — лише за позиціями із зареєстрованою податковою накладною (модуль «Витрати»). Це управлінський розрахунок, не заміняє декларацію.
); } window.FinancialReportPage = FinancialReportPage;