Розробка мобільного додатка для запису до лікаря
Пацієнт записався на прием на наступний вівторок та забув. Лікар чекає, слот займаний — фактично втрачений. За статистикою клінік, 15–25% записів — no-show без нагадувань. Мобільний додаток з правильно налаштованими нагадуваннями скорочує цей показник до 5–8%.
Система напоминань як ключова функціональність
Три обов'язкових нагадування для кожного запису:
- За 24 години — «Нагадуємо про прием до лікаря [ПІБ] завтра о 14:30»
- За 2 години — «Через 2 години прием в [клініці], кабінет 215»
- У момент, коли потрібно виходити — розраховується на основі геолокації користувача та адреси клініки через Google Maps Distance Matrix API або 2GIS API
Третій тип найцінніший та найрідший у реалізації. Логіка: ночі перед приемом серверний планувальник запитує поточну локацію користувача (якщо дозвіл PERMISSION_BACKGROUND_LOCATION отримано) або останню відому, розраховує час в дорозі, ставить завдання відправки push на appointment_time - travel_time - 15 min.
На iOS потрібен опис використання Background Location в Info.plist та NSLocationAlwaysAndWhenInUseUsageDescription. Apple ретельно перевіряє обґрунтування при ревью — потрібно чітко пояснити користь.
Підтвердження та скасування прямо з push-сповіщення — через UNNotificationAction:
let confirmAction = UNNotificationAction(
identifier: "CONFIRM_ACTION",
title: "Підтвердити ✓",
options: []
)
let cancelAction = UNNotificationAction(
identifier: "CANCEL_ACTION",
title: "Скасувати запис",
options: [.destructive]
)
Натиск «Скасувати» без відкриття додатка викликає API, звільняє слот та сповіщає клініку.
Розклад лікарів: технічна реалізація
Сітка розкладу — найскладніший компонент на backend. Кожен лікар має:
- Базовий розклад (понеділок 9:00–13:00, середа 14:00–18:00)
- Виключення (відпустки, лікарняні, заміни)
- Тривалість слота (15, 20, 30 хвилин — залежить від спеціалізації)
- Кількість записів на один слот (звичайно 1, але бувають групові заняття)
Генерація доступних слотів для конкретного лікаря на діапазон дат: беремо базовий розклад, віднімаємо виключення та вже займані слоти. Запит до PostgreSQL з JOIN на таблиці appointments та exceptions, результат кешується в Redis на 5 хвилин.
При одночасному записі двох користувачів на один слот (race condition) — транзакція з SELECT FOR UPDATE на рядок слота. Перший отримує підтвердження, другий — «цей слот вже займаний, виберіть інший час».
Клієнтська частина: вибір часу
Календар з доступними днями (TableCalendar на Flutter) → вибір слота (горизонтальний список кнопок часу). Недоступні слоти показуємо сірими, не приховуємо — користувач розуміє заповненість розкладу.
Відразу показуємо найближчий доступний час вгорі — скорочує час до першого тапу.
Медична карта та історія
Історія відвідувань, виписки, результати аналізів — потребують особливої уваги до безпеки даних. В Україні — вимоги до захисту персональних даних та охорони здоров'я.
Документи зберігаються в зашифрованому S3 (AES-256), доступ тільки через backend з перевіркою прав, presigned посилання з TTL 15 хвилин. На клієнтах документи не кешуються на диску.
Сповіщення для лікаря та реєстратури
Лікар отримує push на планшет/телефон:
- «Новий запис на [час]» — з коротким анамнезом якщо пацієнт заповнив
- «Пацієнт підтвердив запис»
- «Пацієнт скасував за 2 години до приема» — звільняє слот
Реєстратура видить загальний список записів на день у веб-кабінеті (React + WebSocket для live-оновлень).
Стек та терміни
| Компонент | Технологія |
|---|---|
| Mobile | Flutter (iOS + Android) |
| Backend | Node.js/Go + PostgreSQL |
| Push | FCM + APNs |
| Карти | Yandex Maps SDK / Google Maps |
| Документи | S3-сумісне + зашифроване |
| Масштаб | Термін |
|---|---|
| MVP: запис, нагадування, історія | 8–12 тижнів |
| + Телемедицина (відеоконсультації) | +6–8 тижнів |
| + Інтеграція з МІС (1С:Медицина тощо) | +4–8 тижнів |







