// Reports.jsx (function () { function fmtVal(v) { if (v >= 1000000) return (v/1000000).toFixed(1).replace('.',',') + ' M zł'; if (v >= 1000) return Math.round(v/1000) + ' k zł'; return v + ' zł'; } function GlassTooltip({ active, payload, label, unit }) { if (!active || !payload?.length) return null; return (
{label}
{payload.map((p, i) => (
{unit === 'zł' ? fmtVal(p.value) : unit === '%' ? p.value + '%' : p.value}
))}
); } function SectionCard({ title, subtitle, children, action }) { return (
{title}
{subtitle &&
{subtitle}
}
{action}
{children}
); } window.Reports = function Reports() { const { BarChart, Bar, AreaChart, Area, PieChart, Pie, Cell, XAxis, YAxis, CartesianGrid, Tooltip, ResponsiveContainer, LabelList } = window.Recharts || {}; const S = window.SEED; const months = S.salesData['12m']; const { useState } = React; const [periodMode, setPeriodMode] = useState('month'); // 'month' | 'range' const [monthIdx, setMonthIdx] = useState(months.length - 1); const [rangeFrom, setRangeFrom] = useState(0); const [rangeTo, setRangeTo] = useState(months.length - 1); const from = Math.min(rangeFrom, rangeTo); const to = Math.max(rangeFrom, rangeTo); const chartData = periodMode === 'month' ? months.slice(Math.max(0, monthIdx - 1), monthIdx + 1) : months.slice(from, to + 1); const periodLabel = periodMode === 'month' ? months[monthIdx].date : `${months[from].date} – ${months[to].date}`; const handleExport = () => { const csv = [ ['Miesiąc','Przychód','Poprzedni okres'], ...chartData.map(r => [r.date, r.value, r.prev]) ].map(r => r.join(',')).join('\n'); const blob = new Blob([csv], { type:'text/csv;charset=utf-8;' }); const url = URL.createObjectURL(blob); const a = document.createElement('a'); a.href = url; a.download = 'raport_demo_crm.csv'; a.click(); URL.revokeObjectURL(url); }; return (
{/* Header */}
Raporty sprzedaży
Lipiec 2026 · dane mockowe
{/* Row 1: Bar + Area */}
{/* Conversion by stage */} v+'%'} /> } cursor={{ fill:'rgba(124,92,255,.08)' }} /> v+'%'} /> {/* Monthly revenue */}
{[{v:'month',l:'Miesiąc'},{v:'range',l:'Zakres'}].map(o => ( ))}
{periodMode==='month' ? (
setMonthIdx(Number(v))} options={months.map((m,i)=>({value:i,label:m.date}))} />
) : ( <>
setRangeFrom(Number(v))} options={months.map((m,i)=>({value:i,label:m.date}))} />
setRangeTo(Number(v))} options={months.map((m,i)=>({value:i,label:m.date}))} />
)}
} > v>=1000?v/1000+'k':v} width={38} /> } cursor={{ stroke:'rgba(124,92,255,.25)', strokeWidth:1 }} />
{/* Row 2: Donut + summary stats */}
{/* Source donut */} {S.leadsBySource.map((d,i) => )} { if (!active || !payload?.length) return null; const p = payload[0].payload; return
{p.name}: {p.value}%
; }} />
{S.leadsBySource.map((d,i) => (
{d.name} {d.value}%
))}
{/* Summary KPI grid */}
{[ { label:'Łączny przychód', val:'892 k zł', sub:'↑ 15.8% r/r', up:true, color:'#22C55E' }, { label:'Nowe kontrakty', val:'14', sub:'↑ 4 vs kwiecień', up:true, color:'#7C5CFF' }, { label:'Śr. wartość dealu', val:'63.7 k zł', sub:'↑ 8.2%', up:true, color:'#4DA3FF' }, { label:'Czas do zamknięcia', val:'18 dni', sub:'↓ 3 dni', up:true, color:'#00D9FF' }, { label:'Churn rate', val:'2.1%', sub:'↓ 0.4pp', up:true, color:'#22C55E' }, { label:'NPS klientów', val:'72', sub:'↑ 5 pkt', up:true, color:'#F59E0B' }, ].map((s,i) => (
{s.label}
{s.val}
{s.sub}
))}
); }; })();