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]Канон QROpaque token: меню + счёт только этого стола, call waiter, pay
/[slug]/t/[n]Demo shortcutПо номеру стола (для показа, не для печати)
/[slug]/reserveРезервацияДата/время/гости/зона; waitlist при занятости
/[slug]/galleryГалереяЕда, интерьер, атмосфера
/[slug]/eventsСобытияPrivate dining / корпоративы + lead form
/[slug]/giftGift 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]/ordersLive лента заказов + вызовы официанта (polling)+ WAITER
/admin/[slug]/kitchenKDS: New / In progress / Ready / ServedPLATFORM_ADMIN, OWNER, MANAGER, KITCHEN
/admin/[slug]/reservationsКалендарь дня + waitlist+ WAITER
/admin/[slug]/menuCRUD категорий/блюд (OWNER/platform); MANAGER — только sold outPLATFORM_ADMIN, OWNER, MANAGER
/admin/[slug]/tablesСтолы, QR-токены, статусы, ack вызовов+ WAITER
/admin/[slug]/tables/printПечать / PDF QR-листов для столовчерез Столы
/admin/[slug]/floorLive карта зала (статусы + calling)+ WAITER
/admin/[slug]/contentCMS-lite: about, policy, opening hoursPLATFORM_ADMIN, OWNER, MANAGER
/admin/[slug]/analyticsАналитика: дни, топ блюд, peakPLATFORM_ADMIN, OWNER, MANAGER
/admin/[slug]/staffПерсонал + гости CRM, роли, create userPLATFORM_ADMIN, OWNER

Платформа и прочее

URLНазначение
/Маркетинг Sofra + демо-карточки ролей + ссылки на документацию
/platformТенанты, subscription status, пользователи, audit log, «impersonate» = open-admin (без session swap)
/loginStaff-only credentials
/pay/[externalId]Счёт: Apple/Google/карта (mock), split, tip %, отзыв
/docsЭта страница — обзор
/docs/rolesРоли и доступы
/docs/contentКонтент без кода
/developersCheterin Group / Nanda

Как работают основные потоки

1. Резервация

  1. 1Гость открывает /communalco/reserve → дата, слот, число гостей, зона, пожелания.
  2. 2Создаётся Reservation (или WaitlistEntry, если посадка полная).
  3. 3Staff видит день на /admin/communalco/reservations и меняет статус (pending → confirmed → seated …).
  4. 4Напоминания SMS/email — stub: пишутся в консоль (не реальная доставка).

2. QR → заказ на стол

  1. 1Канон: гость сканирует /communalco/q/<opaqueToken> (токен в seed / админка Столы).
  2. 2Альтернативы: /communalco/order (выбор стола) или demo /communalco/t/1.
  3. 3Открывается TableSession: меню + живой счёт только этого стола (изоляция).
  4. 4Модификаторы блюд, раунды заказа, shared cart по сессии.
  5. 5Кухня: /admin/communalco/kitchen (LiveRefresh). Официант: заказы / карта зала / вызовы.
  6. 6«Позвать официанта» → WaiterCall, бейдж в админке (orders / tables / floor).

3. Оплата · tip · отзыв

  1. 1Счёт со стола или /pay/[externalId].
  2. 2Гостевой UI: LeoShöt Pay / Epoint (продакшен-тон). Staff docs: оба — MOCK в демо (MOCK_LEOSHOT QR-сессия vs MOCK_EPOINT redirect-стиль).
  3. 3Методы: Apple Pay / Google Pay / карта (UI).
  4. 4Split bill: поровну / своя сумма.
  5. 5Tip 0/5/10/15 → PAID → отзыв 1–5 · loyalty stamp если гость залогинен.
  6. 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 в БД

Как открыть демо

  1. 1npm install → npx prisma migrate dev → npm run db:seed → npm run dev
  2. 2Открыть http://localhost:3000 — лендинг Sofra
  3. 3Гостевой сайт: /communalco (или /duman)
  4. 4Staff: /login с демо-email (пароль demo1234) — детали на /docs/roles
  5. 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