Все кейсы
FrontendFrontend разработчик

Кофемания: оплата и заказ за столом

Веб-приложение по QR-коду на столе: гость видит счёт, оплачивает его через СБП в приложении своего банка, списывает баллы и оставляет чаевые — а с 2024 года ещё и сам заказывает из меню прямо к столу.

Проект под NDA — детали архитектуры и код готов разобрать голосом.

Кофемания: оплата и заказ за столом

Результат

28
дней от первого коммита до продакшен-окружения в июле 2022
93
задачи закрыты в трекере, большая часть — за месяц QA перед запуском заказа к столу
2,5
года развития в продакшене — с июля 2022 по февраль 2025

Задача бизнеса

В ресторане гость ждёт официанта дважды: чтобы заказать и чтобы расплатиться. Нужен был сервис без установки приложения — открыл камеру, навёл на QR-код стола и сразу видишь свой счёт из кассы. Оплата — через Систему быстрых платежей в любом банке, с начислением или списанием баллов программы лояльности и чаевыми официанту. Всё это на телефоне гостя, в любом браузере, включая Safari со своими особенностями, и без ошибок в суммах: речь о деньгах.

Моя роль

Фронтенд-разработчик продукта от первого коммита до 2025 года: MVP собран за четыре недели — в июле 2022 года от инициализации до продакшен-окружения. Дальше развивал продукт два с половиной года: авторизация в программе лояльности, чаевые, запоминание банка, переезд с Preact CLI на Vite и в 2024 году — самостоятельный заказ к столу с меню, корзиной и модификаторами. Закрыл 93 задачи из трекера, большую часть — за месяц QA-прохода перед запуском заказа к столу.

Решение

React, TypeScript и Vite, состояние разложено по доменным моделям Effector — стол, счёт, корзина, меню, оплата, банки, пользователь, — а гейты привязывают загрузку данных к экранам. QR-код открывает ссылку с номером стола; идентификаторы стола и корзины синхронизируются с адресной строкой через effector-storage, поэтому перезагрузка или переданная ссылка не теряют состояние, а через 40 минут бездействия сессия стола сбрасывается. Для оплаты бэкенд выдаёт платёжную ссылку СБП, список банков берётся из справочника НСПК, а выбранный банк открывается диплинком сразу в своём приложении; последний банк запоминается и показывается первым. Экран статуса опрашивает бэкенд, пока банк не подтвердит платёж, показывает таймер на оплату и после успеха открывает виджет чаевых CloudTips. Вход в программу лояльности — по SMS-коду или звонку с последними цифрами номера; таймер повторной отправки переживает перезагрузку страницы, а повторная проверка авторизации подписывает телефон HMAC-SHA512 с солью, чтобы не передавать номер в открытом виде. Ползунок баллов сразу пересчитывает итог. В заказе к столу меню с лентой категорий, которая следит за прокруткой, карточки блюд в нижних шторках с фото, модификаторами, вариантами приготовления, КБЖУ, аллергенами и описанием в Markdown; корзина собирает одинаковые позиции в одну, выносит блюда из стоп-листа в отдельный блок и очищает его одним нажатием. Цели в Яндекс Метрике отмечают авторизацию, списание баллов и чаевые.

Стек

  • React
  • TypeScript
  • Effector
  • Patronum
  • Vite
  • SCSS Modules
  • SBP (NSPK)
  • Vaul
  • Swiper
  • CloudTips