Розробка мобільної програми для бронювання послуг
Програма для запису—це двосторонній планувальник. Клієнти бачать вільні слоти та бронюють їх. Майстри бачать свій день та керують розписанням. Конфлікти при бронюванні, двійні записи, скасування в останню хвилину—це не граничні випадки, це щоденна реальність. Архітектура має справлятися з ними.
Розписання: найскладніше місце
Умова гонки при бронюванні. Двоє клієнтів одночасно бачать вільний слот о 14:00 у одного майстра й натискають «Записатися». Хто отримає слот? Без оптимістичного блокування—обидва. Правильне рішення на сервері: оптимістичне блокування з полем version або SELECT FOR UPDATE при створенні запису. Мобільний клієнт отримує 409 Conflict—показуємо «Вибачте, слот щойно заняли. Виберіть інший час» та оновлюємо календар.
Відображення розписання. Горизонтальний скрол дат + вертикальний список слотів—стандартний інтерфейс. На iOS—кастомний UICollectionViewCompositionalLayout, на Android—RecyclerView з вложеним горизонтальним скролом. На Flutter—пакет TableCalendar або кастомне рішення.
Слоти розраховуються з урахуванням: робочих годин майстра, тривалості послуги, уже заповнених слотів, перерв між записами (наприклад, 15 хвилин на підготовку після кожного клієнта). Логіка розрахунку—на сервері, клієнт отримує готовий список доступних часових інтервалів.
Мультимайстер і мультипослуга
Якщо запис до конкретного майстра—всё просто. Якщо клієнт вибирає послугу, а система призначає першого вільного майстра—потрібен алгоритм підбору: знайти майстрів з потрібною спеціалізацією, у яких є вільний час. Round-robin або пріоритизація за рейтингом.
Комплексні послуги (наприклад, стрижка + фарбування = 3 години)—один слот на всю тривалість, майстер зайнятий безперервно.
Push-нагадування
Нагадування за 24 години та за 2 години до запису. На сервері—scheduled job (cron, Sidekiq, Celery), який знаходить записи в потрібному часовому вікні й відправляє push через FCM/APNs. Клієнт не керує цим—тільки отримує сповіщення.
Скасування з нагадування—UNNotificationAction (iOS) / actionButton у FCM notification (Android). Користувач скасовує прямо з pull-down сповіщення, не відкриваючи програму.
Оплата при бронюванні
Три варіанти: без передоплати, часткова передоплата, повна онлайн-оплата. Часткова передоплата (наприклад, 20%)—депозит проти no-show. При скасуванні менш ніж за X годин—депозит не повертається. Логіка повернення через API платіжного шлюзу (refund / capture).
Холдування суми—продвинутий варіант: гроші замораживаються на картці в момент запису, списуються після візиту. PaymentIntent з capture_method: manual у Stripe. Потребує підтвердження з боку бізнесу (confirmPaymentIntent).
Програма майстра
Календар на день/тиждень із кольоровим кодуванням за статусом запису. Карточка клієнта: історія візитів, переваги, нотатки. Зміна статусу запису: підтверджена → клієнт прийшов → завершена. Push майстру на нове бронювання—високоприоритетна (priority: high у FCM).
Блокування часу вручну: майстер відмічає «недоступен 15:00–17:00»—слоти зникають із видачі для клієнтів у реальному часі.
Відгуки
Після завершеного запису—push із проханням оцінити послугу. Проста форма: зірки + текст опціонально. Відгук прив'язаний до конкретного запису—не до майстра абстрактно. Рейтинг майстра = середнє по всім відгукам, показуємо на карточці.
Стек
React Native або Flutter—обидва підходять. Ключовий вибір не фреймворк, а правильне управління станом для розписання: Riverpod (Flutter) або Zustand (React Native) з правильною інвалідацією при оновленні слотів. WebSocket-з'єднання для real-time оновлення занятості слотів—якщо майстер веде кілька каналів бронювання.
Орієнтири за часом
MVP (запис до майстра, базове розписання, оплата, нагадування): 4–6 тижнів. Повнофункціональна платформа з мультимайстром, аналітикою занятості, мобільною програмою майстра й програмою лояльності: 2–3 місяці. Вартість—після аналізу вимог.







