Гостевое меню


Адреса страницы

  • Просмотр: /{ресторан} (и /{ресторан}/{язык}), где первый сегмент — числовой id или uniqid ресторана.
  • Заказ со стола: /{ресторан}/t/{стол}/{язык?} — только на этом URL доступно оформление заказа (нужен идентификатор стола).

Гостевое меню

Как рендерятся модификаторы

При нажатии на карточку открывается лист с модификаторами:

  • replace-группа (Размер) — чипы выбора одного варианта; вариант «по умолчанию» предвыбран.
  • add-группа (Добавки) — мультиселект; у каждой опции показывается +дельта.

Лист блюда

Рядом с названием блюда может стоять листочек — блюдо помечено как вегетарианское или веганское; в листе блюда точная пометка написана словом. В шапке меню появляется чип-фильтр, который оставляет на экране только такие блюда; выбор запоминается на устройстве и переживает перезагрузку и смену языка.

Обе поверхности живут по одному правилу: они показываются, только когда пометка что-то разделяет. Если подходящих блюд нет вообще или подходит всё меню — не будет ни листочка, ни фильтра. Отдельных порогов у фильтра нет: одно веганское блюдо среди шестидесяти как раз и есть то, что скроллом не находят.

Чип фильтрует ту метку, под которую подпадает больше блюд, — обычно это «вегетарианское». Веганские блюда входят в эту выборку и остаются отличимы по своему листочку и по бейджу в листе блюда.

Предпросмотр цены и кнопка

Цена в кнопке пересчитывается на каждое касание: берётся цена блюда — или цена выбранного размера — и к ней прибавляются выбранные добавки. Если вы задали разную доплату для разных размеров, гость увидит именно ту, что относится к его выбору.

Кнопка «Добавить» не сработает, пока гость не выбрал обязательное: например, группа «Соус» требует хотя бы один вариант. Размер выбирать не нужно — один вариант всегда предвыбран. У блюда из стоп-листа кнопки нет вовсе: гость его видит, но заказать не может.

Заказ и снимки

На заказном URL добавьте позиции в корзину и оформите заказ.

{primary} Сумму заказа всегда пересчитывает сервер по текущему меню — телефон гостя не может «предложить свою цену». Если набор добавок нарушает правила блюда, заказ не примется, а гость увидит, что нужно поправить.

{success} История заказа неизменна. В момент заказа сохраняются снимки имени и цены. Если потом изменить или удалить блюдо в админке — меню обновится, но строка заказа в истории сохранит старые имя и цену.

Корзина и отправка заказа

Гость собирает корзину на своём языке: выбирает блюдо, размер и добавки, ставит количество и при желании пишет комментарий — к отдельной позиции («без лука») и ко всему заказу. Корзина живёт на его телефоне и переживает перезагрузку страницы: позиции, добавки и комментарии возвращаются сами.

Отправка доступна только на заказном адресе (с номером стола) и только когда включён полный режим приёма заказов (режимы).

Если заведение спрашивает имя или номер комнаты (настройка), под позициями корзины появляется блок «Ваши данные». Необязательное поле можно пропустить. Обязательное держит отправку: кнопка «Отправить заказ» бледнеет, а нажатие на неё подсвечивает пустое поле и подсказывает «Чтобы отправить, укажите имя» (или номер комнаты). Телефон запоминает введённое на 30 дней, поэтому на следующем заказе поля уже заполнены.

Экран статуса: что видит гость

Сразу после отправки открывается экран статуса: цветная шапка, номер заказа и рельса из трёх шагов Отправлен → Подтверждён → Подано, по которой заливка перетекает к следующему шагу, когда заказ продвигается.

Номер заказа — например, «№ 12» (в английском меню «#12») — тот же, что у персонала на карточке заказа, на кухонном тикете и в чеке: по нему гость и официант легко сверяются. Номер свой у заведения и каждый день начинается с 1 (номер заказа); заказ, который касса приняла без интернета, называется по-кассовому — «1-7». Рядом — чип стола, а если гость указал комнату или имя, ещё чип «Комната 214 · Анна».

  • Ждём подтверждения — заказ виден персоналу, но ещё не принят. Подсказка сообщает, что экран обновится сам, перезагружать не нужно. Пока заказ не подтверждён, гость может его отменить или изменить (ниже).
  • Заказ подтверждён — если известно, кто принял, гость видит имя сотрудника и что заказ готовится. Внизу — «Позвать официанта» и «Добавить ещё».
  • Подано — «Приятного аппетита!». Внизу — «Попросить счёт» и «Добавить ещё».
  • Отклонён / Отменён — шапка красная, рельсы нет; подробности ниже.

Экран обновляется в реальном времени: гостю не нужно ничего нажимать, чтобы увидеть, что заказ приняли.

Телефон может просто лежать на столе. Пока заказ ждёт подтверждения, страница не даёт экрану погаснуть — не дольше десяти минут. Когда заведение принимает или отклоняет заказ, раздаётся короткий звонок, а телефон на Android вибрирует.

{info} Сигнал доходит, только пока страница открыта на экране. Если гость заблокировал телефон или ушёл в другое приложение, он узнает о подтверждении, когда вернётся на страницу. Телефон в беззвучном режиме не звонит — страница этот режим не обходит.

Чтобы узнать об ответе и при закрытой странице, гость нажимает «Сообщить, когда заведение ответит» — кнопка стоит на экране заказа, пока тот ждёт подтверждения. Браузер спросит разрешение на уведомления; после согласия уведомление «Заказ № 12 принят» или «отклонён» придёт на телефон, даже если меню закрыто. Нажатие на уведомление открывает меню с этим заказом.

{info} Кнопка видна только там, где браузер умеет доставлять уведомления закрытой странице: Chrome на Android и браузеры на компьютере. На iPhone её нет — там уведомления доступны лишь сайту, добавленному на домашний экран. Пока гость просто читает меню, страница ничего не спрашивает.

Когда заведение отклоняет или отменяет заказ, гость видит:

  • в шапке — номер заказа, стол и «ничего не списано»;
  • причину крупной карточкой «Причина от заведения», если персонал её указал. Причина сама переводится на язык, на котором гость открыл меню, а оригинал показан под ней мельче. Перевод приходит через несколько секунд: сначала гость видит причину так, как её написали, потом текст сменяется сам. Если гость читает меню на языке персонала, переводить нечего; если заведение за день исчерпало предел автоматических AI-операций, причина так и останется без перевода;
  • состав под заголовком «Было в заказе» — приглушённо, с зачёркнутыми ценами;
  • кнопки «Позвать официанта» и «Заказать снова». Вторая возвращает позиции заказа в корзину: если отказали из-за одного блюда из стоп-листа, гость убирает его и отправляет остальное. Блюда, которых уже нет в меню, в корзину не вернутся.

Если гость отменил заказ сам, в шапке написано «Вы отменили этот заказ», и карточки причины нет. Если персонал убрал из заказа все позиции по одной, гость увидит «Заказ отменён» с пояснением, что заведение убрало все позиции, — тоже без карточки причины.

{info} Язык причины — тот, на котором гость открыл меню в момент отправки заказа. Переключил язык позже — перевод всё равно придёт на прежний.

Дозаказ и «Мой заказ»

Кнопка «Добавить ещё» на подтверждённом или поданном заказе возвращает гостя в меню: следующая отправка станет новым заказом того же визита. Заказы нумеруются по порядку и складываются в один счёт стола.

В правом нижнем углу появляется плавающая пилюля «Мой заказ» со счётчиком заказов. Она окрашена по состоянию: жёлтая — заказ ждёт подтверждения, зелёная — принят. Если в корзине уже есть блюда, пилюля встаёт над полосой корзины. Один заказ — она открывает его статус; два и больше — открывается список с карточками («Заказ 1», «Заказ 2»), их стадиями, составом и общим итогом внизу.

{info} «Мой заказ» — история этого телефона на этом столе: заказы соседей по столу, сделанные с их устройств, туда не попадают, а после закрытия счёта персоналом список исчезает.

Отмена и правка до подтверждения

Пока заказ не подтверждён, гость может отменить его или изменить состав — под кнопками так и написано, что это доступно, пока ресторан не подтвердил заказ. После подтверждения кнопки пропадают, и остаётся подпись «Заказ принят — изменения через официанта».

«Изменить состав» устроено просто: заказ отменяется, а его позиции возвращаются в корзину — дальше гость правит и отправляет заново, уже новым заказом.

Свою отмену гость видит как «Вы отменили этот заказ» — без карточки причины: причина нужна, только когда решение приняло заведение (экран статуса).

{warning} Отменённый заказ остаётся в истории с пометкой «Отменён» — это нормально. Если за это время блюдо убрали из меню, в корзину оно не вернётся, а цены пересчитаются по актуальному меню.

{success} Если гость нажал «Отменить» ровно в тот момент, когда официант принял заказ, ничего не сломается: гость увидит «Официант уже принял этот заказ», а экран переключится на настоящий статус.

«Позвать официанта» и «Попросить счёт»

На подтверждённом заказе есть кнопка «Позвать официанта», а на поданном и внизу списка «Мой заказ» — «Попросить счёт». После нажатия гость видит подтверждение («Официант уведомлён», «Просьба передана — счёт скоро принесут»), кнопка на минуту блокируется.

Минута отсчитывается и после того, как вызов приняли: иначе «Иду» само по себе открывало бы кнопку — персонал отмечает вызов, идёт к столу, а гость уже зовёт снова. Если гость всё же нажмёт (например, с другого устройства), сервер ответит «К вам уже идут — подождите немного» и вызов не создастся.

У персонала на экранах «Зал» и «Заказы» появляется карточка вызова — отдельная для «зовут официанта» и отдельная для «просят счёт», плюс push (в первую очередь официанту, закреплённому за столом). Кухня вызовы не видит. Когда сотрудник нажимает «Принять вызов», гость сразу видит «Официант идёт к вам» или «Счёт уже несут».

{info} «Попросить счёт» есть на экране поданного заказа и внизу списка «Мой заказ» (он открывается со второго заказа). Гость с одним заказом, открывший его пилюлей «Мой заказ», видит кнопку на экране статуса и раньше. А на экране, который открылся сразу после отправки, её нет, пока заказ не подан, — это ожидаемо, а не сбой.

{warning} Вызов не «сгорает» при перезагрузке: сервер помнит непринятые вызовы, и гость увидит «Официант вызван» снова. Поэтому непринятые карточки в зале нужно закрывать — иначе гость будет считать, что его не услышали.

Если персонал правит заказ (снимает позицию, меняет количество, что-то добавляет), гость получает короткое сообщение, а экран сам обновляет состав и сумму. Снятая позиция не исчезает: она остаётся зачёркнутой с подписью «Не в счёте».

Перезагрузка и потеря связи

Гость может перезагрузить страницу, свернуть браузер или заблокировать телефон — заказы никуда не денутся: страница сама подтягивает историю, снова показывает пилюлю «Мой заказ» и восстанавливает живое обновление статуса.

Если гость закрыл вкладку и открыл меню заново, пока заказ ждёт подтверждения или готовится, экран этого заказа откроется сам. Гость закрыл его — при перезагрузке он не вернётся, путь к заказу остаётся через пилюлю.

{info} Память о заказах привязана к устройству и браузеру: с другого телефона или в режиме инкогнито гость своих заказов не увидит. Если связь совсем плохая, нажатие на пилюлю «Мой заказ» принудительно обновляет данные.

QR-коды для столов

Гость попадает в меню по QR. Коды бывают двух видов:

  • QR стола — ведёт на заказный адрес: заведение и стол уже определены, заказ придёт с номером стола. Печатается из раздела «Зал и столы».
  • QR заведения — общий код без привязки к столу, для стойки, витрины или соцсетей. Живёт в Настройках и показывается на экране успеха после создания меню. Заказать по нему нельзя — гость увидит просьбу отсканировать код на столе.

QR-листы

Печатные листы, плотности карточек, номер и зона на карточке, выгрузка архивом для типографии и все ограничения — на странице Зал, зоны и столы.