/* 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 }) => (
);
const Legend = ({ rows, total }) => (
);
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 (
{tagline}
{children}
{footer && (
{footer}
)}
);
}
window.PLWaterfall = PLWaterfall;
window.BalanceMini = BalanceMini;
window.DDSMini = DDSMini;
window.ReportCard = ReportCard;