import React, { useState } from 'react'; import { StatCard, Badge, MaturityBadge } from '../../shared/ui'; import { formatCurrency, formatNumber } from '../../shared/utils/formatters'; import { XAxis, YAxis, CartesianGrid, Tooltip, ResponsiveContainer, PieChart, Pie, Cell, AreaChart, Area, } from 'recharts'; import { BarChart3, TrendingUp, DollarSign, Users } from 'lucide-react'; const PERIOD_METRICS = { today: { revenue: 184500, revChange: '+12.4%', orders: 58, ordersChange: '+6', avgCheck: 3180, avgCheckChange: '+180 ₽', retention: '68.4%', retentionChange: '+2.1%', salesTrend: [ { label: '10:00', revenue: 14200, orders: 4 }, { label: '12:00', revenue: 38400, orders: 12 }, { label: '14:00', revenue: 76000, orders: 24 }, { label: '16:00', revenue: 104500, orders: 32 }, { label: '18:00', revenue: 149000, orders: 45 }, { label: '20:00', revenue: 184500, orders: 58 }, ], }, week: { revenue: 1428000, revChange: '+15.8%', orders: 432, ordersChange: '+42', avgCheck: 3305, avgCheckChange: '+210 ₽', retention: '70.2%', retentionChange: '+3.5%', salesTrend: [ { label: 'Пн', revenue: 142000, orders: 48 }, { label: 'Вт', revenue: 156000, orders: 52 }, { label: 'Ср', revenue: 168000, orders: 56 }, { label: 'Чт', revenue: 174000, orders: 59 }, { label: 'Пт', revenue: 245000, orders: 84 }, { label: 'Сб', revenue: 290000, orders: 98 }, { label: 'Вс', revenue: 260000, orders: 89 }, ], }, month: { revenue: 4850000, revChange: '+18.5%', orders: 1490, ordersChange: '+180', avgCheck: 3255, avgCheckChange: '+315 ₽', retention: '72.4%', retentionChange: '+4.0%', salesTrend: [ { label: '1-я нед', revenue: 1120000, orders: 340 }, { label: '2-я нед', revenue: 1240000, orders: 380 }, { label: '3-я нед', revenue: 1390000, orders: 420 }, { label: '4-я нед', revenue: 1428000, orders: 432 }, ], }, year: { revenue: 52400000, revChange: '+34.2%', orders: 16800, ordersChange: '+2400', avgCheck: 3120, avgCheckChange: '+420 ₽', retention: '75.8%', retentionChange: '+6.2%', salesTrend: [ { label: 'Q1', revenue: 11200000, orders: 3600 }, { label: 'Q2', revenue: 12800000, orders: 4100 }, { label: 'Q3', revenue: 14100000, orders: 4600 }, { label: 'Q4 (прогноз)', revenue: 14300000, orders: 4500 }, ], }, }; const SALES_CHANNEL_DATA = [ { name: 'Зал ресторана', value: 48, color: '#2F684C' }, { name: 'Собственная доставка', value: 26, color: '#B78335' }, { name: 'Telegram-бот', value: 14, color: '#527286' }, { name: 'Яндекс Еда / Агрегаторы', value: 12, color: '#B16D50' }, ]; const ABC_ITEMS_DATA = [ { name: 'Филадельфия Премиум', revenue: 420000, qty: 442, margin: '71.2%', category: 'A' }, { name: 'Том Ям с морепродуктами', revenue: 310000, qty: 455, margin: '68.5%', category: 'A' }, { name: 'Калифорния краб', revenue: 265000, qty: 335, margin: '69.0%', category: 'A' }, { name: 'Рамен Тонкоцу', revenue: 195000, qty: 330, margin: '64.5%', category: 'B' }, { name: 'Гёдза со свининой', revenue: 160000, qty: 380, margin: '74.0%', category: 'B' }, { name: 'Эби Темпура', revenue: 84000, qty: 155, margin: '58.0%', category: 'C' }, ]; export const AnalyticsModule: React.FC = () => { const [selectedPeriod, setSelectedPeriod] = useState<'today' | 'week' | 'month' | 'year'>('month'); const currentData = PERIOD_METRICS[selectedPeriod]; return (
{/* Header with MaturityBadge and Period Switcher */}

Сквозная бизнес-аналитика, ABC-матрица & BI

Анализ маржинальности, выручки по каналам, структуры чеков, LTV и Food Cost

{/* Date range selector */}
{[ { id: 'today', label: 'Сегодня' }, { id: 'week', label: '7 дней' }, { id: 'month', label: '30 дней' }, { id: 'year', label: 'Год' }, ].map((p) => ( ))}
{/* KPI Cards */}
} /> } /> } /> } />
{/* Main Charts Grid */}
{/* Revenue Trend Area Chart */}

Динамика выручки за выбранный период

План выполнен на 106%
`${val / 1000}k`} /> [formatCurrency(val), 'Выручка']} contentStyle={{ backgroundColor: '#FCFAF5', borderColor: '#DDDAD1', borderRadius: '8px', fontSize: '11px' }} />
{/* Sales by channel pie chart */}

Структура выручки по каналам продаж

Доля в общем обороте заведений

{SALES_CHANNEL_DATA.map((entry, index) => ( ))} [`${val}%`, 'Доля']} />
{SALES_CHANNEL_DATA.map((ch) => (
{ch.name}
{ch.value}%
))}
{/* ABC Menu Matrix Table */}

ABC-анализ меню и блюд

Классификация позиций по выручке и маржинальности (Группа A формирует 80% выручки)

ABC Matrix v2.1
{ABC_ITEMS_DATA.map((it) => ( ))}
Блюдо / Позиция Класс Продано порций Выручка Маржинальность
{it.name} Группа {it.category} {it.qty} шт {formatCurrency(it.revenue)} {it.margin}
); };