Sofra · İcmal / Məhsul
Обзор / Продукт
Sofra — multi-tenant платформа для ресторанов Азербайджана: гостевой сайт, заказ на стол по QR, кухня, резервации, mock LeoShöt-оплата. Демо-бренд Communalco; второй тенант — Duman.
Что такое Sofra
Sofra — продукт для персонала и владельцев (логин /login, админка /admin/[slug], платформа /platform). Гости живут на сайте ресторана /[slug]/* — бренд Communalco в демо.
- Communalco — основной демо-ресторан (современная азербайджанская кухня, Баку), slug
communalco - Duman — второй сид-тенант (гриль), slug
duman→ /duman - Стек: Next.js App Router, Prisma (SQLite локально / Postgres через
DATABASE_URL), Auth.js credentials, Tailwind, next-intl
Архитектура · multi-tenant
| Слой | URL | Кто |
|---|---|---|
| Гостевой сайт | /[slug]/* | Гости (аноним + GUEST) |
| Админка ресторана | /admin/[slug]/* | Staff (роль ограничивает nav) |
| Платформа Sofra | /platform | Только PLATFORM_ADMIN |
| Staff login | /login | Персонал Sofra |
| Guest login | /[slug]/login | Только роль GUEST |
| Оплата | /pay/[externalId] | Mock LeoShöt checkout |
| API | /api/* | Auth, guest register и т.д. |
Каждая сущность привязана к Restaurant.id. Новый тенант создаётся на /platform (имя, slug, city, owner email) без смены кода.
Полный инвентарь страниц
Гостевой сайт (Communalco / любой slug)
| URL | Назначение | Что на странице |
|---|---|---|
/[slug] | Главная | Full-bleed hero бренда, CTA бронь/меню, краткая история |
/[slug]/about | О ресторане | CMS about + story/ownersBio, timeline, зоны/вместимость |
/[slug]/menu | Меню | Категории, фильтры, аллергены; избранное для залогиненного гостя |
/[slug]/order | Выбор стола | Список столов → вход в заказ без QR |
/[slug]/q/[qrCode] | Канон QR | Opaque token: меню + счёт только этого стола, call waiter, pay |
/[slug]/t/[n] | Demo shortcut | По номеру стола (для показа, не для печати) |
/[slug]/reserve | Резервация | Дата/время/гости/зона; waitlist при занятости |
/[slug]/gallery | Галерея | Еда, интерьер, атмосфера |
/[slug]/events | События | Private dining / корпоративы + lead form |
/[slug]/gift | Gift card | Демо-заказ сертификата (статус DEMO_PAID, без реального charge) |
/[slug]/jobs | Вакансии | Лёгкая форма отклика |
/[slug]/reviews | Отзывы | Публичные отзывы после оплаты / с сайта |
/[slug]/policy | Политика | CMS policy: аллергены, tip, правила |
/[slug]/contact | Контакты | Адрес, часы, Instagram, карта |
/[slug]/login | Вход гостя | Только audience=guest |
/[slug]/register | Регистрация | Создание GUEST + rate limit |
/[slug]/account | Кабинет | Недавние заказы (TableSession), брони, избранное |
Админка ресторана
| URL | Назначение | Роли (nav) |
|---|---|---|
/admin/[slug] | Dashboard: выручка сегодня, столы, брони, заказы, отзывы | PLATFORM_ADMIN, OWNER, MANAGER, WAITER |
/admin/[slug]/orders | Live лента заказов + вызовы официанта (polling) | + WAITER |
/admin/[slug]/kitchen | KDS: New / In progress / Ready / Served | PLATFORM_ADMIN, OWNER, MANAGER, KITCHEN |
/admin/[slug]/reservations | Календарь дня + waitlist | + WAITER |
/admin/[slug]/menu | CRUD категорий/блюд (OWNER/platform); MANAGER — только sold out | PLATFORM_ADMIN, OWNER, MANAGER |
/admin/[slug]/tables | Столы, QR-токены, статусы, ack вызовов | + WAITER |
/admin/[slug]/tables/print | Печать / PDF QR-листов для столов | через Столы |
/admin/[slug]/floor | Live карта зала (статусы + calling) | + WAITER |
/admin/[slug]/content | CMS-lite: about, policy, opening hours | PLATFORM_ADMIN, OWNER, MANAGER |
/admin/[slug]/analytics | Аналитика: дни, топ блюд, peak | PLATFORM_ADMIN, OWNER, MANAGER |
/admin/[slug]/staff | Персонал + гости CRM, роли, create user | PLATFORM_ADMIN, OWNER |
Платформа и прочее
| URL | Назначение |
|---|---|
/ | Маркетинг Sofra + демо-карточки ролей + ссылки на документацию |
/platform | Тенанты, subscription status, пользователи, audit log, «impersonate» = open-admin (без session swap) |
/login | Staff-only credentials |
/pay/[externalId] | Счёт: Apple/Google/карта (mock), split, tip %, отзыв |
/docs | Эта страница — обзор |
/docs/roles | Роли и доступы |
/docs/content | Контент без кода |
/developers | Cheterin Group / Nanda |
Как работают основные потоки
1. Резервация
- 1Гость открывает /communalco/reserve → дата, слот, число гостей, зона, пожелания.
- 2Создаётся Reservation (или WaitlistEntry, если посадка полная).
- 3Staff видит день на /admin/communalco/reservations и меняет статус (pending → confirmed → seated …).
- 4Напоминания SMS/email — stub: пишутся в консоль (не реальная доставка).
2. QR → заказ на стол
- 1Канон: гость сканирует /communalco/q/<opaqueToken> (токен в seed / админка Столы).
- 2Альтернативы: /communalco/order (выбор стола) или demo /communalco/t/1.
- 3Открывается TableSession: меню + живой счёт только этого стола (изоляция).
- 4Модификаторы блюд, раунды заказа, shared cart по сессии.
- 5Кухня: /admin/communalco/kitchen (LiveRefresh). Официант: заказы / карта зала / вызовы.
- 6«Позвать официанта» → WaiterCall, бейдж в админке (orders / tables / floor).
3. Оплата · tip · отзыв
- 1Счёт со стола или /pay/[externalId].
- 2Гостевой UI: LeoShöt Pay / Epoint (продакшен-тон). Staff docs: оба — MOCK в демо (MOCK_LEOSHOT QR-сессия vs MOCK_EPOINT redirect-стиль).
- 3Методы: Apple Pay / Google Pay / карта (UI).
- 4Split bill: поровну / своя сумма.
- 5Tip 0/5/10/15 → PAID → отзыв 1–5 · loyalty stamp если гость залогинен.
- 6Реальный Epoint/LeoShöt — адаптеры + env; демо падает на mock.
4. Гость и история
Заказ без логина ок. После /communalco/login сессии/заказы привязываются к гостю: кабинет /communalco/account показывает недавние заказы, брони и избранное.
Языки · i18n
- Локали: az (default), ru, tr, en
- Cookie
NEXT_LOCALE; переключатель в header гостевого сайта и админки - URL без префикса локали: всегда
/communalco/... - UI-строки — next-intl; меню и copy ресторана — поля AZ/RU/EN/TR в БД
Как открыть демо
- 1npm install → npx prisma migrate dev → npm run db:seed → npm run dev
- 2Открыть http://localhost:3000 — лендинг Sofra
- 3Гостевой сайт: /communalco (или /duman)
- 4Staff: /login с демо-email (пароль demo1234) — детали на /docs/roles
- 5Docker / Compose и GitHub Actions CI (lint, typecheck, build) — в репозитории
Демо-аккаунты
Полная таблица ролей, deep links и создание staff — на странице Роли и доступы. Карточки на лендинге
/ тоже копируют email/пароль.Что заглушено (честно)
- Epoint / LeoShöt API — stub + mock UX; без банковских ключей демо работает на MockLeoShot
- Email / SMS — log providers (console), не провайдер доставки
- Impersonate — platform открывает
/admin/[slug]той же сессией PLATFORM_ADMIN (без смены identity) - Gift card — DEMO_PAID без реального списания
- Rate limits — на auth и guest register
- Audit log — действия admin/platform пишутся и видны на
/platform