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 (
Анализ маржинальности, выручки по каналам, структуры чеков, LTV и Food Cost
Доля в общем обороте заведений
Классификация позиций по выручке и маржинальности (Группа A формирует 80% выручки)
| Блюдо / Позиция | Класс | Продано порций | Выручка | Маржинальность |
|---|---|---|---|---|
| {it.name} |
|
{it.qty} шт | {formatCurrency(it.revenue)} | {it.margin} |