Мультитенантная облачная ERP-платформа для управления ресторанным и розничным бизнесом
Современная архитектура, DDD подход, полный цикл управления: от закупок до лояльности
Invelio — мультитенантная облачная ERP-система нового поколения для управления ресторанным и розничным бизнесом. Платформа построена на принципах Domain-Driven Design (DDD) и обеспечивает полный цикл операционного управления: от каталогизации продукции и управления запасами до POS-терминалов, программ лояльности и аналитики.
Единая кодовая база с изоляцией данных на уровне tenant_id. Разрешение арендатора по субдомену (X-Tenant-Slug) через TenantResolverSubscriber.
OpenAPI-спецификации для каждого модуля. Автогенерация TypeScript-типов. Три API-клиента (tenant, admin, superadmin).
RabbitMQ + Symfony Messenger. 27 async-сообщений в 10 пакетах. Аудит в MongoDB. QueueStatsMiddleware.
Stateless JWT с access/refresh. Ролевая иерархия: SUPER_ADMIN → OWNER → ADMIN → MANAGER → USER. 2FA (OTPHP). Cloudflare ACM + Total TLS.
UUID v7 ключи, bcmath для денег, PHPStan level 8, Soft-delete, PSR-6 кэш, автоматический бэкап через pg_dump + S3.
PHP 8.4 / Symfony 8, Doctrine 3, PostgreSQL 16 (UUID v7, bcmath). Мультитенантность на уровне приложения (TenantAwareTrait), резолвинг арендатора по X-Tenant-Slug. Async — RabbitMQ + Symfony Messenger, аудит в MongoDB. PHPStan level 8.
Современный технологический стек и архитектурные решения для масштабируемого ERP-решения
Единая кодовая база с изоляцией данных на уровне tenant_id.
Stateless JWT с access/refresh. Роли: SUPER_ADMIN → OWNER → ADMIN → MANAGER → USER.
Symfony Messenger + RabbitMQ. 27 async-сообщений в 10 пакетах. Аудит в MongoDB.
26 доменных пакетов. Интерфейсы сервисов, DTO, Repository паттерн.
Flutter: white-label приложение лояльности и приложение курьера. Riverpod, go_router.
Спецификации для каждого модуля. Автогенерация TypeScript-типов.
PostgreSQL 16 с UUID v7. MongoDB 7 для асинхронного аудита.
Двухфакторная аутентификация через OTPHP. Валидация номеров.
Строгая типизация, атрибуты. PHPStan level 8.
Docker Compose с 10 сервисами. GitHub Actions CI/CD.
Vite, Tailwind CSS, Radix UI, TanStack Query, Zustand.
Разделение команд и запросов через Symfony Messenger.
Flysystem для единого S3-интерфейса.
Профили, сегментация, мультивалютные кошельки лояльности.
Заказы, платежи, смены. Интеграция с фискальными регистраторами.
Дашборды с Recharts/ApexCharts. Экспорт PDF через Dompdf.
Цифровые меню с промо. Rate-limited public API.
Печать чеков и этикеток. Станции фулфилмента.
Кастомный бот для уведомлений и управления.
Полнотекстовый поиск по товарам, заказам, клиентам.
Движок импорта: iiko, Excel, CSV. Парсер + applier для миграции данных.
Трекер задач с SLA. Система эскалации.
react-i18next + Symfony Translator. Из коробки az, ru, en — локализация на любой язык.
DDD-пакеты в packages/ с контролем слоёв (deptrac). UUID v7, bcmath для денег, soft-delete, DTO-граница, интерфейс у каждого сервиса. OpenAPI-спецификации → генерация TypeScript-типов.
Касса прямо в браузере — принимает заказы и оплаты и работает даже без интернета.



Заказы
В зале / навынос / доставка
Платежи
Наличные, карта, QR, split
Смены и касса
Сверка, Z-отчёты, PIN кассира
План зала
Дизайнер зон, столы, элементы
Работает прямо в браузере — без установки. Открыл вкладку и начал продавать. Мгновенные обновления для всех точек.
Десктоп-приложение для Linux, macOS и Windows. Продолжает работать без интернета и синхронизируется после восстановления связи.
Онлайн-касса в кармане официанта или курьера. Приём заказов и оплат прямо со смартфона — у стола или на выезде.
packages/pos на Symfony/Doctrine: конечный автомат заказа DRAFT→…→COMPLETED, split-платежи, смены и кассы, FloorPlan/Zone/FloorElement, PIN-аутентификация кассира. Онлайн — React SPA; оффлайн — десктоп-приложение с локальным хранилищем и синхронизацией после восстановления связи.
Сенсорный киоск, на котором гость сам собирает заказ, оплачивает и получает номер.
Самостоятельный заказ
Блюда, модификаторы, комбо
В зале / навынос
Выбор способа получения
Оплата на месте
Карта, QR — и номер заказа
Прямо на кухню
Заказ уходит на KDS
Клиент-витрина в полноэкранном kiosk-режиме, разворачивается self-hosted в зале. Меню и заказы — через API (модули Menu и POS), позиции уходят на кухню через Realtime (Mercure SSE). Поддомен kiosk.{tenant}.
Заказы на доставку приходят в систему, курьер получает адрес, а статус виден в реальном времени.
Тип заказа DELIVERY, вклад в тоталы через DeliveryContributor / FreeDeliveryContributor. Гео-адреса в модуле Customer (район, подъезд, координаты). Идентификация курьера — модуль Courier (ROLE_COURIER, OTP). Статусы транслируются через Realtime (Mercure SSE).

Приложение ресторана в телефоне гостя — со своим меню, бонусами и акциями.
Карта лояльности
QR, бонусы, кошелёк, уровни
Меню и каталог
Категории, блюда, филиалы
Геймификация
Колесо фортуны, штампы, стрики
Купоны и Stories
Промо, истории, уведомления
Flutter 3.27 / Dart. Riverpod + go_router + freezed, easy_localization (az/ru/en). White-label через build-flavors и assets/config/<tenant>.json (тема, бренд, данные). Источник данных — API Customer и публичный Menu.
Приложение для курьера: видит назначенные заказы, ведёт доставку и отмечает выполнение.
Поток доставки
Входящий заказ
Таймер, авто-отклонение 15с
Заработок
Графики по периодам, архив

Новый заказ · 00:12
Flutter (Riverpod, go_router, fl_chart). Чистый конечный автомат доставки: pickup → delivered → PIN клиента → сверка наличных, покрыт unit-тестами. Обновления в реальном времени через REST + Mercure SSE.

Алина Воронцова
Gold · 37 визитов2 450
баллов
5
уровень
↑ 550
до уровня
Любимые блюда
Аллергия на арахис · предпочитает столик у окна
Купон: десерт в подарок к дню рождения
Официант принимает заказ прямо у стола и сразу узнаёт гостя — с телефона в руке.
Приём заказа
Заказ за столом, отправка на кухню (KDS)
Скан гостя
По коду лояльности из приложения или карты
Профиль и история
Уровень, баллы, визиты, сумма заказов
Предпочтения и заметки
Любимые блюда, аллергии, пожелания
Купоны, бонусы, скидки
Подарки, поздравления, действия к счёту
Счёт и оплата
Пречек, разделение счёта, оплата
Flutter-терминал. Скан кода лояльности → профиль гостя через CustomerLoyaltyController (модуль Customer). Приём заказа → POS API /api/v1/pos, отправка на кухню через Realtime/KDS. Купоны и скидки — модули Customer и Pricing.
Экран на кухне вместо бумажных чеков — заказы приходят к повару мгновенно.
Очередь-канбан
Группировка по станциям кухни
Таймеры
Цветовая индикация ожидания
Отметка готовности
Тап по позиции, звук-алерт
Wall-mount
Полноэкранный настенный режим
Модуль Realtime (Mercure SSE / WebSocket) транслирует статусы заказов и кухонных станций. Маршрутизация позиций — Fulfillment stations. Клиент — веб на поддомене kds.{tenant} с потоковым обновлением.
Экраны с меню и рекламой прямо в зале заведения.
Меню-борды
Цены и позиции из каталога
Промо-экраны
Акции, баннеры, расписание
Управление контентом
Плейлисты, привязка к экранам
Авто-синхронизация
Стоп-лист и цены в реальном времени
Концепт меню-борда
Контент собирается из каталога и меню; цены и стоп-лист синхронизируются в реальном времени через модуль Realtime. Экраны привязаны к поддомену signage.{tenant}.
Заказ создан
Тип заказа = доставка
Отправить в Telegram
Палитра
Настраивайте автоматические сценарии для своего бизнеса — без программистов и без кода.
Пример
Триггеры на события
Заказ, оплата, остаток, смена…
Действия
Telegram, email, webhook, скрипт
Визуальный редактор
Сценарии без кода, drag-and-drop
Изоляция по тенанту
Свои сценарии у каждого бизнеса
Триггеры подключаются к 27 async-сообщениям системы (RabbitMQ + Symfony Messenger). Действия: Telegram (модуль Notifications), email, webhook, HTTP, пользовательский скрипт. Сценарии изолированы по tenant_id.
26 доменных пакетов с Doctrine ORM, разделённых по функциональным областям
| Пакет | Описание |
|---|---|
| Core | Мультитенантность, общие трейты, feature-флаги, настройки |
| Auth | JWT, TenantMembership, роли на тенант |
| Tenant | Жизненный цикл тенантов, планы, DNS-провижининг |
| SuperAdmin | Платформенное администрирование, RBAC, аудит |
| Reference | Глобальные и тенант-справочники (валюты, налоги, UoM) |
| Storage | S3-хранилище (MinIO) через Flysystem |
| Catalog | Товары, категории, бренды, атрибуты, штрихкоды |
| Inventory | Склад: остатки, партии (FIFO/FEFO), BOM, перемещения |
| Pricing | Динамическое ценообразование, прайс-листы, налоги |
| Kitchen | Модификаторы, комбо, тех-карты, стоп-лист, food cost |
| POS | Заказы, оплаты, смены, кассы, план зала |
| Customer | CRM, сегменты, адреса, кошельки лояльности |
| Menu | Публичное QR-меню, промо, отзывы |
| Purchasing | Поставщики, заказы закупки, приёмка на склад |
| Billing | Инвойсы, шаблоны документов (Twig→PDF), e-invoicing |
| Fiscal | Фискализация чеков, Z-отчёты, провайдеры (AZ, TR) |
| Printing | Станции печати: чеки, кухонные тикеты, пре-биллы |
| Notifications | Мультиканальные уведомления: inbox, email, Telegram |
| Credential | Зашифрованный реестр секретов интеграций |
| AI | Мультипровайдерная интеграция LLM, конфиг моделей |
| Task | Внутренний трекер: баги, тикеты, SLA-автоматизация |
| Backup | Дампы PostgreSQL по требованию, async через Messenger |
| Reporting | Отчёты, снапшоты, экспорт (CSV/XLSX/PDF) |
| Courier | Аутентификация и сессии курьеров (OTP по телефону) |
| Exchange | Движок импорта данных (iiko, Excel, CSV) |
| Realtime | Mercure SSE / WebSocket: статусы заказов, KDS, POS-sync |
Слоистость пакетов — строгий DAG, проверяется deptrac (baseline для исключения menu ⇄ pos). Стандартная entity: TenantAwareTrait + TimestampableTrait + SoftDeletableTrait, ключи UUID v7.
Данные под защитой, система под наблюдением, команда на связи
Ежедневные резервные копии базы данных в S3-хранилище. Быстрое восстановление на любую точку.
Полная история действий пользователей и системных событий. Неизменяемый аудит-журнал.
Метрики, аптайм и очереди под постоянным наблюдением. Алерты об инцидентах в реальном времени.
Реакция на инциденты, помощь в настройке и обновления. Каналы связи с командой.
Бэкап — модуль Backup: pg_dump по расписанию → S3 (MinIO), async через Symfony Messenger. Аудит — асинхронно в MongoDB. Метрики — Prometheus + Grafana (аптайм, p95, очереди); QueueStatsMiddleware отслеживает RabbitMQ. Логи структурированные.
Монолитная кодовая база с доменной архитектурой и CQRS подходом
Symfony 8 фреймворк
Единый монолит с доменным разделением в 26 пакетах
API Layer
REST API с OpenAPI-спецификациями для каждого модуля
Domain Layer
DDD: Интерфейсы сервисов, DTO, Enum, Repository, Doctrine ORM
Infrastructure Layer
PostgreSQL, MongoDB, RabbitMQ, Redis, Elasticsearch, MinIO
Async Layer
Symfony Messenger + RabbitMQ (27 async-сообщений)
Manager App
Управление заведением: каталог, склад, цены, POS, кухня, меню.
Admin Panel
Суперадмин: тенанты, планы, RBAC, справочники, мониторинг.
QR Menu / POS-терминал
Публичное гостевое меню и сенсорный кассовый терминал.
Мобильные (Flutter)
Приложение лояльности + приложение курьера. Riverpod, go_router.
Shared Packages
@snap/api-client, @snap/ui, @snap/shared · типы из OpenAPI
Современный стек технологий для enterprise-решения
RESTful API с мультитенантной аутентификацией
Ролевая иерархия:
+ ROLE_COURIER, ROLE_CUSTOMER · RBAC через TenantPermissionVoter
TenantResolverSubscriber {
Событие: kernel.request (до firewall)
Резолвит tenant по X-Tenant-Slug (nginx) → Host
Проверяет статус (active / trial) → иначе 404
Устанавливает в TenantContext
Изоляция: TenantAwareTrait → WHERE tenant_id = :tenant
}
27 async-сообщений в 10 публикующих пакетах через RabbitMQ + Symfony Messenger
Inventory (5)
StockUpdated, снапшоты остатков
POS / Order (6)
OrderCompleted → лояльность + фискализация
Tenant (4)
TenantProvisioned, DNS-провижининг
Fiscal / Reporting (3+2)
Отправка чеков, генерация отчётов
Middleware цепочка:
Аудит: MongoDB для истории событий
Мониторинг очередей в реальном времени. Метрики по каждому типу сообщений: количество, скорость обработки, ошибки.
React 18 monorepo с Vite, Tailwind CSS и TypeScript
Vite-сборка и dev-сервер под каждое приложение. Общие пакеты, HMR, типы из OpenAPI.
Radix UI primitives + Tailwind. 30+ компонентов: DataTable, Modal, Form, Chart, Timeline.
Axios-based клиент с интерцепторами для JWT, рефреша токенов.
TanStack Query (React Query) для:
Zustand для:
PostgreSQL 16 с доменной изоляцией
Многоуровневая система защиты данных
Ролевая иерархия с descending permissions:
RBAC: TenantPermissionVoter · PERMISSION_<domain>.<resource>.<verb>
Cloud-native архитектура с Docker-оркестрацией
Гибкая платформа для интеграции с внешними сервисами
Движок импорта (модуль Exchange): перенос каталога, заказов и клиентов из iiko, Excel и CSV. Парсер + applier для миграции данных.
Кастомный Telegram бот для уведомлений о заказах, отчётов и управления. Webhook интеграция.
Поддержка фискальных регистраторов. Чекопечать, Z-отчёты, фискальные накопления.
Flysystem для единого S3-интерфейса. Изображения, документы, бэкапы.
Полнотекстовый поиск по товарам, заказам, клиентам. Синонимы и автодополнение.
Модуль AI: мультипровайдерная интеграция LLM, конфигурация моделей по фичам, зашифрованные ключи, учёт использования.
/start → Register (user → tenant binding)
/report → GetDailyReportQuery → PDF
/order N → GetOrderDetailQuery
Webhook → TelegramWebhookController → MessageHandler
Полная наблюдаемость системы в реальном времени
Визуализация метрик. Дашборды для бизнеса и технические. CPU, RAM, RPS, Latency p95.
Сбор метрик: очередь сообщений, запросы к БД, HTTP статусы, бизнес-метрики.
Структурированные логи. MongoDB для аудита событий. QueueStatsMiddleware.
Многоуровневая стратегия обеспечения качества
Максимальный уровень статического анализа
Юнит-тесты для каждого модуля
Автоматическое форматирование кода
Полная типизация фронтенда
Миссия, ценности и команда Invelio
Сделать управление ресторанным и розничным бизнесом простым, прозрачным и эффективным с помощью современных облачных технологий.
Распределённая команда с экспертизой в PHP, React, DevOps и управлении продуктами. Активно используем AI-агентов в работе.
Quality first: PHPStan level 8, строгая типизация. Enterprise ready: мультитенантность, безопасность, масштабируемость.