Розроблення мобільного додатку для аренди гарячих робочих місць
Hot desking — коли працівники не закріплені за конкретними столами, а бронюють місця на день. Здається простою задачею, поки не зіткнешся з реальними сценаріями: два людини забронювали один стіл одночасно, працівник прийшов і не може зрозуміти де «його» місце, HR не бачить реальну навантаження простору. Додаток розв'язує все це — через інтерактивну карту офісу, бронювання з race condition protection та QR-чекін.
Інтерактивна карта офісу
Схема поверху — SVG, не растр. SVG дозволяє підсвічувати конкретні робочі місця, показувати статус (вільно/заброньовано/займаючно), масштабувати без втрати якості.
На iOS: WKWebView з SVG — найшвидший шлях, але втрачаємо нативні жести. Правильніше: парсимо SVG у набір CGPath об'єктів і рендеримо через CAShapeLayer у нативному UIView. Жести — UIPinchGestureRecognizer (масштаб) + UIPanGestureRecognizer (панорама) через CGAffineTransform. Натиск на місце — hitTest через CGPath.contains(point).
Android: Canvas + Matrix для трансформацій. Більш низькорівнево, але повний контроль. Або бібліотека AndroidSVG + TouchImageView для жестів.
Flutter: CustomPainter з Path об'єктами — добре працює, кросс-платформенно.
Дані карти: JSON з описом кожного робочого місця — id, desk_code (A-12), floor, zone, amenities (monitor/standing/phone), svg_path_id для прив'язки до елемента SVG. Завантажуються при старті та кешуються локально.
Статус місць у реальному часі: WebSocket-подія desk.status_changed з desk_id та новим статусом. Клієнт оновлює колір конкретного місця без перезавантаження всієї схеми. Polling як fallback — кожні 30 секунд, якщо WS недоступний.
Бронювання без конфліктів
Race condition при бронюванні — класична проблема. Два користувачі одночасно бачать місце вільним і натискають «забронювати».
Захист на сервері: optimistic locking через version поле в записі desk_reservation або SELECT FOR UPDATE при створенні. Унікальний constraint (desk_id, date, time_slot) в PostgreSQL — остаточна страховка. Якщо місце вже займаючно — API повертає 409 Conflict, клієнт показує «місце тільки що забронювали» та оновлює карту.
Структура брони: desk_id, user_id, date, start_time, end_time, status (confirmed/checked_in/cancelled/no_show). Підтримка повторюючихся броней (рекуррентні события через rrule).
Тайм-слоти: гнучко — повний день або блоки (9-13, 13-18). Конфігурується в адміністративній частині. Для коворкингів — почасова аренда.
QR-чекін
Прийти на роботу → відкрити додаток → сканувати QR на столі → чекін зафіксований.
QR на кожному робочому місці: містить desk_id + підпис (HMAC-SHA256) для захисту від ручної генерації. Термін дії QR — нескінчен (він фізичний), але чекін через нього працює тільки якщо у користувача є активна бронь на цей стіл сьогодні.
Сканування: AVCaptureMetadataOutput (iOS) / ML Kit Barcode (Android). Після успішного чекіну — haptic feedback + анімація підтвердження + зміна статусу місця на карті (займаючно).
No-show detection: якщо бронь почалась 30 хвилин назад, а чекіну немає — статус змінюється на no_show, місце звільняється для інших. Конфігурований поріг.
Аналітика навантаження
Для HR та офіс-менеджера: відсоток навантаження по зонам та поверхам, пікові години, no-show rate, найпопулярніші місця. Експорт в Excel/CSV.
Heatmap на схемі офісу: кольорова шкала від зеленого (рідко використовується) до червоного (завжди займаючно) за історичними даними за період. Допомагає прийняти рішення про оптимізацію розсадки.
Тривалість проекту
Базовий додаток (карта офісу, бронювання, QR-чекін) — 4-6 тижнів. З багатоповерховістю, аналітикою, інтеграцією з СКУД/Active Directory та рекуррентними бронями — 2-3 місяці. Вартість розраховується індивідуально.







