/* Three report mockups: P&L waterfall, Balance stacked, DDS line chart. */ const RC = window.Recharts; /* P&L waterfall — built on stacked bars with invisible base */ function PLWaterfall() { const steps = [ { name: "Выручка", v: 6480 }, { name: "Себестоимость",v: -2720 }, { name: "Валовая", v: 3760, total: true }, { name: "Маркетинг", v: -380 }, { name: "ФОТ и аренда", v: -2010 }, { name: "Налоги", v: -388 }, { name: "Чистая", v: 982, total: true }, ]; // build cumulative for waterfall let cum = 0; const data = steps.map((s) => { if (s.total) { const row = { name: s.name, base: 0, up: s.v > 0 ? s.v : 0, down: s.v < 0 ? -s.v : 0, total: s.v }; cum = s.v; return row; } const base = s.v >= 0 ? cum : cum + s.v; const up = s.v > 0 ? s.v : 0; const down = s.v < 0 ? -s.v : 0; cum += s.v; return { name: s.name, base, up, down }; }); return ( v + "к"} axisLine={false} tickLine={false} /> [fmt(v*1000) + " ₽", ""]} /> ); } /* Balance — stacked horizontal */ function BalanceMini() { const assets = [ { label: "Деньги на счетах", v: 1820, c: "#0F766E" }, { label: "Дебиторка", v: 2240, c: "#4A7A7D" }, { label: "Запасы", v: 1480, c: "#8AABAD" }, { label: "Основные средства", v: 3360, c: "#B3C7C8" }, ]; const liab = [ { label: "Кредиторка", v: 1640, c: "#C9A961" }, { label: "Налоги к уплате", v: 410, c: "#B89146" }, { label: "Займы", v: 1200, c: "#8C6A30" }, { label: "Собственный капитал", v: 5650, c: "#2E4D4F" }, ]; const totA = assets.reduce((a,r) => a+r.v, 0); const totL = liab.reduce((a,r) => a+r.v, 0); const Bar = ({ rows, total }) => (
{rows.map((r,i) => (
))}
); const Legend = ({ rows, total }) => (
{rows.map((r,i) => (
{r.label}
{r.v}к
))}
); return (
Активы {totA.toLocaleString('ru')} тыс ₽
Пассивы {totL.toLocaleString('ru')} тыс ₽
); } /* DDS — line chart in/out */ function DDSMini() { const data = [ { m:"Янв", in: 5.1, out: 4.6 }, { m:"Фев", in: 4.7, out: 4.5 }, { m:"Мар", in: 5.6, out: 4.9 }, { m:"Апр", in: 6.1, out: 5.3 }, { m:"Май", in: 6.4, out: 5.5 }, { m:"Июн", in: 6.8, out: 5.7 }, { m:"Июл", in: 5.9, out: 5.4 }, { m:"Авг", in: 5.6, out: 5.2 }, { m:"Сен", in: 6.5, out: 5.6 }, ]; return ( v + "м"} axisLine={false} tickLine={false} /> v + " млн ₽"} /> ); } function ReportCard({ title, abbr, tagline, footer, children, h = 150 }) { return (
{abbr}

{title}

янв–сен 2026

{tagline}

{children}
{footer && (
{footer}
)}
); } window.PLWaterfall = PLWaterfall; window.BalanceMini = BalanceMini; window.DDSMini = DDSMini; window.ReportCard = ReportCard;