Ролі й доступ
- admin: повний доступ, керує конфігураціями геозон, бачить усі хаби.
- logist: створює/редагує маршрути в межах дозволених хабів, надсилає на погодження.
- security: перегляд/погодження, може лишати пропозицію маршруту.
- user: read‑only.
- Доступ до даних фільтрується за “hub” (один або перелік).
Ключові функції
- Карта:
- Відображення векторних геозон (шари/tilesets) з фільтром за хабами.
- Тумблер “Показати/Приховати геозони”, підписи (центроїди) та попап з паспортом поля.
- Україномовні підписи базових шарів.
- Пошук населених пунктів, перемикач стилів карти.
- Тонка “сітка доріг” як окремий шар.
- Маршрут:
- Клік‑на‑карті додає точки; траса прокладається по дорогах; розбиття на частини.
- Дві “лінійки” (старт/фініш) для ручних ділянок, їх відстань додається до загальної.
- Редагування: вставити після, видалити точку, очистити маршрут/лінійки.
- Підрахунок км у реальному часі.
- Імпорт/експорт JSON і KML.
- База маршрутів:
- Збереження/оновлення, запобігання дублікатам.
- Пошук: префіксний + “містить” (n‑грами), пагінація/догрузка.
- Відображення вибраного маршруту на карті, попередній перегляд.
- Погодження:
- Статуси draft/pending/approved/rejected, коментар, ревізії.
- Пропозиція маршруту від служби безпеки (окремий оверлей), прийняти/відхилити.
- Сповіщення в інтерфейсі (локальні), опційно зовнішній канал нотифікацій.
- Адмін‑утиліти:
- Редактор конфігурації tilesets (key, url, source‑layer, hubs, enabled).
- GeoJSON‑Builder: малювання/редагування полігонів, експорт; перегляд tilesets як на головній.
Дані та моделі (узагальнено)
- БД (документоорієнтована або SQL зі схожими сутностями):
- routes: { name, fromCode, toCode, fromLabel, toLabel, fromName, toName, routeType, purpose, hub, points[], startRuler[], endRuler[], distance_km, routeKey, approval{}, proposal{}, updatedAt, createdBy…; індексні поля: nameLower, fromLabelLower, toLabelLower, fromNameLower, toNameLower, …Ngrams, searchNgrams }.
- users: { role, allowedHubs[] | all }.
- config/tilesets: масив елементів { key, url, layer, hubs[], enabled }.
- logists: { id, name, active, sort }.
- route_logs: { routeId, type, ts, actor, summary }.
- routeKeys (опційно): { routeId, … } для унікальних кодів маршрутів.
- Об’єктне сховище (опційно): geozones/all.geojson (як альтернатива tilesets).
Інтеграції (виконавець обирає постачальників)
- Карта: векторні тайли, стилі, геокодинг, побудова маршрутів по дорогах.
- Ідентифікація: email/пароль або інший стандартний провайдер.
- База даних: документи/таблиці з можливістю індексів і пошуку префіксом.
- Хостинг статики та CDN.
- Легкий бекенд/API або serverless функції для:
- збереження маршруту з перевіркою токена,
- відправки зовнішніх сповіщень (наприклад, у месенджер).
- Об’єктне сховище (якщо потрібні GeoJSON‑файли).
Нефункціональні вимоги
- Розмежування доступу за ролями та хабами (читання/запис/видалення).
- Кеш/офлайн‑стійкість для довідників та списків (за можливості).
- Безпека: захист від XSS, захищені заголовки, rate‑limit на API, перевірка ID токена.
- Продуктивність: карта плавна на десктопі й мобільних, запити ліниві, debounce.
- Журналювання змін маршрутів (короткий і детальний підсумок змін).
UI/екрани
- Головна з картою: панель створення, панель бази, панель погодження, доки зверху/знизу.
- Адмін: редактор tilesets.
- Адмін: GeoJSON‑Builder.
- Експорт/Імпорт.
- Сторінка перегляду маршруту (review) за посиланням.
Пошук і індекси (узагальнено)
- Префіксні індекси: nameLower, fromLabelLower, toLabelLower.
- Додатково n‑грами (nameNgrams, fromNgrams, toNgrams, searchNgrams) для contains.
- Фільтр за hub у запитах.
- Потрібно описати необхідні індекси для обраної БД.
Безпека (узагальнено)
- Жодних секретів у клієнтському коді/репозиторії.
- Токен карти — публічний, але обмежений доменами.
- Правила доступу в БД: читання/запис за ролями й allowedHubs.
- API: перевірка ID токена, CORS, Helmet/заголовки, ліміти.
- CSP/Referrer‑Policy/HSTS на проді.
Deliverables
- Готовий веб‑додаток (статичні файли + мінімальний API/функції).
- Документація:
- Схеми даних і перелік індексів.
- Інструкції з розгортання (локально/прод).
- Опис конфігів (env), токенів і обмежень.
- Набір тестових даних (кілька маршрутів, tilesets‑конфіг).
- Коротке відео або скрінкаст флоу: створення → збереження → пошук → погодження.
Критерії приймання
- Користувач з роллю logist створює маршрут, зберігає, подає на погодження; бачить лише свої хаби.
- admin змінює конфіг tilesets, одразу бачить оновлені шари на карті та в Builder.
- Працює пошук (префікс + contains), перегляд і попередній перегляд маршруту.
- Пропозиція від security відображається та може бути прийнята/відхилена.
- Геозони приховані за замовчуванням; підписи й попапи працюють під фільтром хабів.
Що має визначити/запропонувати виконавець
- Конкретних постачальників: мапи (векторні тайли/маршрути/геокодинг), автентифікація, БД, хостинг статики, серверless/API, об’єктне сховище, канал нотифікацій.
- План і кошторис інфраструктури (безкоштовні/платні ліміти).
- Схему деплою/CI і моніторинг.
- Деталі авторизації (сесії, ротація ключів, політика паролів).
Додатково (опційно)
- Розширений аудит безпеки.
- Міграція даних GeoJSON → tilesets.
- Резервування унікальних кодів маршрутів через транзакції/черги.
- Темізація UI, локалізації.