Розроблення мобільного додатку для бронювання столиків у ресторані
Бронювання столика в ресторані — завдання з часовими слотами, вмістимістю, депозитами та правилами скасування. На перший погляд здається простішим за доставку. Насправді — кілька нетривіальних технічних вузлів, які визначають, працює система чи розчаровує.
Модель даних для резервування
Типова помилка при проектуванні — зберігати бронювання просто як строки в таблиці з datetime. Працює до першого "столик на 4 займаний частково" або "гість хоче столик біля вікна чи у бара".
Правильна модель: Table (номер, вмістимість, зона, особливості) → Reservation (столик, datetime start, datetime end, кількість гостей, статус, статус депозиту) → Guest (профіль, історія візитів, переваги).
Перевірка доступності: при виборі дати та кількості гостей запит до бекенду повертає доступні часові слоти. Сервер перевіряє: немає перекриттів за часом (із врахуванням середнього часу повороту столика — налаштовуваний параметр, наприклад 90 хвилин), є столики потрібної вмістимості. Це серверна логіка, не клієнтська — щоб исключить race condition при одночасних бронях.
Депозит та політика скасування
Ресторан хоче застраховуватися від no-show. Депозит при бронюванні через YooKassa — холдирування суми на карті (метод hold), списання при підтвердженні візиту або повернення при скасуванні в установлені строки. Це не авторизація та не повна оплата — саме холдирування, яке YooKassa підтримує.
Політика скасування: безплатно за 24 години, 50% депозиту за 4 години, 100% при no-show. Логіка на бекенді — Laravel scheduled jobs перевіряють бронювання за годину до дедлайнів.
Сповіщення
Push через FCM: підтвердження брони одразу, нагадування за 24 години та за 2 години. Якщо ресторан приймає бронювання вручну (не автоматично) — push "Ваш столик підтвердив" після схвалення менеджером.
SMS через СМСЦентр як резервний канал — не всі користувачі дозволяють push.
Адміністративна панель
Менеджер ресторану бачить план залу на сьогодні з візуалізацією зайнятих/вільних столиків, може змінити бронювання, додати нотатки ("алергія на горіхи", "день народження"), відмітити no-show. Веб-інтерфейс на React — зручніше для десктопа в залі ресторану.
Стек
Flutter 3.x (клієнтський додаток), Laravel 10 + PostgreSQL, FCM, YooKassa з hold-платежами, React для панелі ресторану.
Додаток з бронюванням, депозитами, сповіщеннями та адміністративною панеллю — від 12 до 16 тижнів. Вартість розраховується індивідуально після аналізу вимог.







