/{ресторан} (и /{ресторан}/{язык}), где первый сегмент —
числовой id или uniqid ресторана./{ресторан}/t/{стол}/{язык?} — только на этом URL
доступно оформление заказа (нужен идентификатор стола).
При нажатии на карточку открывается лист с модификаторами:
replace-группа (Размер) — чипы выбора одного варианта; вариант «по
умолчанию» предвыбран.add-группа (Добавки) — мультиселект; у каждой опции показывается +дельта.
Рядом с названием блюда может стоять листочек — блюдо помечено как вегетарианское или веганское; в листе блюда точная пометка написана словом. В шапке меню появляется чип-фильтр, который оставляет на экране только такие блюда; выбор запоминается на устройстве и переживает перезагрузку и смену языка.
Обе поверхности живут по одному правилу: они показываются, только когда пометка что-то разделяет. Если подходящих блюд нет вообще или подходит всё меню — не будет ни листочка, ни фильтра. Отдельных порогов у фильтра нет: одно веганское блюдо среди шестидесяти как раз и есть то, что скроллом не находят.
Чип фильтрует ту метку, под которую подпадает больше блюд, — обычно это «вегетарианское». Веганские блюда входят в эту выборку и остаются отличимы по своему листочку и по бейджу в листе блюда.
Цена в кнопке пересчитывается на каждое касание: берётся цена блюда — или цена выбранного размера — и к ней прибавляются выбранные добавки. Если вы задали разную доплату для разных размеров, гость увидит именно ту, что относится к его выбору.
Кнопка «Добавить» не сработает, пока гость не выбрал обязательное: например, группа «Соус» требует хотя бы один вариант. Размер выбирать не нужно — один вариант всегда предвыбран. У блюда из стоп-листа кнопки нет вовсе: гость его видит, но заказать не может.
На заказном URL добавьте позиции в корзину и оформите заказ.
{primary} Сумму заказа всегда пересчитывает сервер по текущему меню — телефон гостя не может «предложить свою цену». Если набор добавок нарушает правила блюда, заказ не примется, а гость увидит, что нужно поправить.
{success} История заказа неизменна. В момент заказа сохраняются снимки имени и цены. Если потом изменить или удалить блюдо в админке — меню обновится, но строка заказа в истории сохранит старые имя и цену.
Гость собирает корзину на своём языке: выбирает блюдо, размер и добавки, ставит количество и при желании пишет комментарий — к отдельной позиции («без лука») и ко всему заказу. Корзина живёт на его телефоне и переживает перезагрузку страницы: позиции, добавки и комментарии возвращаются сами.
Отправка доступна только на заказном адресе (с номером стола) и только когда включён полный режим приёма заказов (режимы).
Если заведение спрашивает имя или номер комнаты (настройка), под позициями корзины появляется блок «Ваши данные». Необязательное поле можно пропустить. Обязательное держит отправку: кнопка «Отправить заказ» бледнеет, а нажатие на неё подсвечивает пустое поле и подсказывает «Чтобы отправить, укажите имя» (или номер комнаты). Телефон запоминает введённое на 30 дней, поэтому на следующем заказе поля уже заполнены.
Сразу после отправки открывается экран статуса: цветная шапка, номер заказа и рельса из трёх шагов Отправлен → Подтверждён → Подано, по которой заливка перетекает к следующему шагу, когда заказ продвигается.
Номер заказа — например, «№ 12» (в английском меню «#12») — тот же, что у персонала на карточке заказа, на кухонном тикете и в чеке: по нему гость и официант легко сверяются. Номер свой у заведения и каждый день начинается с 1 (номер заказа); заказ, который касса приняла без интернета, называется по-кассовому — «1-7». Рядом — чип стола, а если гость указал комнату или имя, ещё чип «Комната 214 · Анна».
Экран обновляется в реальном времени: гостю не нужно ничего нажимать, чтобы увидеть, что заказ приняли.
Телефон может просто лежать на столе. Пока заказ ждёт подтверждения, страница не даёт экрану погаснуть — не дольше десяти минут. Когда заведение принимает или отклоняет заказ, раздаётся короткий звонок, а телефон на Android вибрирует.
{info} Сигнал доходит, только пока страница открыта на экране. Если гость заблокировал телефон или ушёл в другое приложение, он узнает о подтверждении, когда вернётся на страницу. Телефон в беззвучном режиме не звонит — страница этот режим не обходит.
Чтобы узнать об ответе и при закрытой странице, гость нажимает «Сообщить, когда заведение ответит» — кнопка стоит на экране заказа, пока тот ждёт подтверждения. Браузер спросит разрешение на уведомления; после согласия уведомление «Заказ № 12 принят» или «отклонён» придёт на телефон, даже если меню закрыто. Нажатие на уведомление открывает меню с этим заказом.
{info} Кнопка видна только там, где браузер умеет доставлять уведомления закрытой странице: Chrome на Android и браузеры на компьютере. На iPhone её нет — там уведомления доступны лишь сайту, добавленному на домашний экран. Пока гость просто читает меню, страница ничего не спрашивает.
Когда заведение отклоняет или отменяет заказ, гость видит:
Если гость отменил заказ сам, в шапке написано «Вы отменили этот заказ», и карточки причины нет. Если персонал убрал из заказа все позиции по одной, гость увидит «Заказ отменён» с пояснением, что заведение убрало все позиции, — тоже без карточки причины.
{info} Язык причины — тот, на котором гость открыл меню в момент отправки заказа. Переключил язык позже — перевод всё равно придёт на прежний.
Кнопка «Добавить ещё» на подтверждённом или поданном заказе возвращает гостя в меню: следующая отправка станет новым заказом того же визита. Заказы нумеруются по порядку и складываются в один счёт стола.
В правом нижнем углу появляется плавающая пилюля «Мой заказ» со счётчиком заказов. Она окрашена по состоянию: жёлтая — заказ ждёт подтверждения, зелёная — принят. Если в корзине уже есть блюда, пилюля встаёт над полосой корзины. Один заказ — она открывает его статус; два и больше — открывается список с карточками («Заказ 1», «Заказ 2»), их стадиями, составом и общим итогом внизу.
{info} «Мой заказ» — история этого телефона на этом столе: заказы соседей по столу, сделанные с их устройств, туда не попадают, а после закрытия счёта персоналом список исчезает.
Пока заказ не подтверждён, гость может отменить его или изменить состав — под кнопками так и написано, что это доступно, пока ресторан не подтвердил заказ. После подтверждения кнопки пропадают, и остаётся подпись «Заказ принят — изменения через официанта».
«Изменить состав» устроено просто: заказ отменяется, а его позиции возвращаются в корзину — дальше гость правит и отправляет заново, уже новым заказом.
Свою отмену гость видит как «Вы отменили этот заказ» — без карточки причины: причина нужна, только когда решение приняло заведение (экран статуса).
{warning} Отменённый заказ остаётся в истории с пометкой «Отменён» — это нормально. Если за это время блюдо убрали из меню, в корзину оно не вернётся, а цены пересчитаются по актуальному меню.
{success} Если гость нажал «Отменить» ровно в тот момент, когда официант принял заказ, ничего не сломается: гость увидит «Официант уже принял этот заказ», а экран переключится на настоящий статус.
На подтверждённом заказе есть кнопка «Позвать официанта», а на поданном и внизу списка «Мой заказ» — «Попросить счёт». После нажатия гость видит подтверждение («Официант уведомлён», «Просьба передана — счёт скоро принесут»), кнопка на минуту блокируется.
Минута отсчитывается и после того, как вызов приняли: иначе «Иду» само по себе открывало бы кнопку — персонал отмечает вызов, идёт к столу, а гость уже зовёт снова. Если гость всё же нажмёт (например, с другого устройства), сервер ответит «К вам уже идут — подождите немного» и вызов не создастся.
У персонала на экранах «Зал» и «Заказы» появляется карточка вызова — отдельная для «зовут официанта» и отдельная для «просят счёт», плюс push (в первую очередь официанту, закреплённому за столом). Кухня вызовы не видит. Когда сотрудник нажимает «Принять вызов», гость сразу видит «Официант идёт к вам» или «Счёт уже несут».
{info} «Попросить счёт» есть на экране поданного заказа и внизу списка «Мой заказ» (он открывается со второго заказа). Гость с одним заказом, открывший его пилюлей «Мой заказ», видит кнопку на экране статуса и раньше. А на экране, который открылся сразу после отправки, её нет, пока заказ не подан, — это ожидаемо, а не сбой.
{warning} Вызов не «сгорает» при перезагрузке: сервер помнит непринятые вызовы, и гость увидит «Официант вызван» снова. Поэтому непринятые карточки в зале нужно закрывать — иначе гость будет считать, что его не услышали.
Если персонал правит заказ (снимает позицию, меняет количество, что-то добавляет), гость получает короткое сообщение, а экран сам обновляет состав и сумму. Снятая позиция не исчезает: она остаётся зачёркнутой с подписью «Не в счёте».
Гость может перезагрузить страницу, свернуть браузер или заблокировать телефон — заказы никуда не денутся: страница сама подтягивает историю, снова показывает пилюлю «Мой заказ» и восстанавливает живое обновление статуса.
Если гость закрыл вкладку и открыл меню заново, пока заказ ждёт подтверждения или готовится, экран этого заказа откроется сам. Гость закрыл его — при перезагрузке он не вернётся, путь к заказу остаётся через пилюлю.
{info} Память о заказах привязана к устройству и браузеру: с другого телефона или в режиме инкогнито гость своих заказов не увидит. Если связь совсем плохая, нажатие на пилюлю «Мой заказ» принудительно обновляет данные.
Гость попадает в меню по QR. Коды бывают двух видов:

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