industry-food-crm
Система заказа еды через Max Bot + веб-CRM
Мини-приложение внутри мессенджера Max для заказа еды + веб-панель CRM для управления заказами, меню и арендаторами. Мультитенантная архитектура для фудкортов.
# Контекст
«У нас фудкорт с несколькими точками питания. Хотим, чтобы клиенты могли заказывать еду прямо в мессенджере — без скачивания приложений. А нам нужна единая панель для управления всеми заказами и меню каждого ресторана.»
# Задача
- ✓ Мини-приложение внутри мессенджера Max
- ✓ Каталог меню с категориями и позициями
- ✓ Оформление заказа без выхода из чата
- ✓ Уведомления о статусе заказа в бот
- ✓ Веб-CRM для операторов и администраторов
- ✓ Мультитенантность: каждый ресторан — отдельный тенант
# Архитектура
┌─────────────────────────────────────────────────────────────┐
│ MAX MESSENGER │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ MINIAPP (React + Vite) │ │
│ │ ┌───────────┐ ┌───────────┐ ┌───────────────┐ │ │
│ │ │ Menu │ │ Cart │ │ Checkout │ │ │
│ │ │ Browser │ │ Manager │ │ + Payment │ │ │
│ │ └───────────┘ └───────────┘ └───────────────┘ │ │
│ └─────────────────────────────────────────────────────┘ │
└──────────────────────────┬──────────────────────────────────┘
│ REST API + Init Data Validation
┌──────────────────────────▼──────────────────────────────────┐
│ EXPRESS.JS SERVER │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────────────┐ │
│ │ Max Bot │ │ Orders │ │ Notifications │ │
│ │ Webhook │ │ API │ │ (to user chat) │ │
│ └─────────────┘ └─────────────┘ └─────────────────────┘ │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────────────┐ │
│ │ Tenants │ │ Menu │ │ Web CRM Panel │ │
│ │ (multi) │ │ Management │ │ (admin/operator) │ │
│ └─────────────┘ └─────────────┘ └─────────────────────┘ │
└──────────────────────────┬──────────────────────────────────┘
│
┌──────────────────────────▼──────────────────────────────────┐
│ SQLite DATABASE │
│ tenants │ users │ categories │ menu_items │ orders │
└─────────────────────────────────────────────────────────────┘
# Компоненты системы
📱 MiniApp в мессенджере
Категории, фото, описания, цены, модификаторы
Добавление, удаление, изменение количества
Комментарий, способ получения, подтверждение
🖥 Веб-CRM панель
Список заказов, статусы, фильтрация, поиск
Категории, позиции, цены, фото, drag-n-drop сортировка
Операторы, администраторы, супер-админ для всех тенантов
# Технические особенности
Внутри система ближе к продукту, чем к "скрипту для фудкорта". Несколько деталей, которые делают жизнь проще операторам и разработчикам:
- ✓ Корректная валидация initData MiniApp. Реализована проверка подписи по документации MAX с поддержкой обоих вариантов secret key (HMAC(botToken, "WebAppData") и HMAC("WebAppData", botToken)), чтобы мини‑приложение проходило валидацию в любых окружениях.
- ✓ Мультироли и права доступа. Отдельные роли для операторов, админов и супер‑админа, который управляет всеми ресторанами. Навигация и разделы CRM автоматически подстраиваются под роль пользователя.
- ✓ Умный выбор ресторана. Для супер‑админа есть селектор тенанта с запоминанием последнего выбора в sessionStorage и поддержкой фильтрации отчётов и заказов по ресторану.
- ✓ Гибкие статусы заказов. Базовый набор статусов (Новый, Принят, Готовится, В пути и т.д.) можно переопределить в настройках конкретного ресторана — CRM подтягивает подписи динамически.
- ✓ Kanban на SortableJS. Доска заказов с перетаскиванием заказов между колонками, загрузка SortableJS по CDN только когда это реально нужно.
- ✓ Рабочие часы ресторана. На стороне сервера реализована функция проверки заказов на попадание в рабочее время, с поддержкой ночных смен "через полночь".
# Технологии
# Галерея интерфейса
# Результат
Заказ еды без выхода из мессенджера
Единая система для всех точек фудкорта
Мгновенные уведомления о статусе в чат
Меню редактируется в реальном времени