Role i dostęp
- admin: pełny dostęp, zarządza konfiguracjami geozon, widzi wszystkie huby.
- logist: tworzy/edytuje trasy w ramach dozwolonych hubów, wysyła do zatwierdzenia.
- security: przegląd/zatwierdzenie, może zostawiać propozycję trasy.
- user: tylko do odczytu.
- Dostęp do danych jest filtrowany według “hub” (jeden lub lista).
Kluczowe funkcje
- Mapa:
- Wyświetlanie wektorowych geozon (warstwy/tilesets) z filtrem według hubów.
- Przełącznik “Pokaż/Ukryj geozony”, podpisy (centroidy) oraz popup z paszportem pola.
- Polskojęzyczne podpisy podstawowych warstw.
- Wyszukiwanie miejscowości, przełącznik stylów mapy.
- Cienka “siatka dróg” jako osobna warstwa.
- Trasa:
- Kliknięcie na mapie dodaje punkty; trasa jest wytyczana po drogach; podział na części.
- Dwie “linijki” (start/koniec) dla ręcznych odcinków, ich odległość jest dodawana do całości.
- Edytowanie: wstaw po, usuń punkt, wyczyść trasę/linijki.
- Liczenie km w czasie rzeczywistym.
- Import/eksport JSON i KML.
- Baza tras:
- Zapis/aktualizacja, zapobieganie duplikatom.
- Wyszukiwanie: prefiksowy + “zawiera” (n-gramy), paginacja/dodawanie.
- Wyświetlanie wybranej trasy na mapie, podgląd.
- Zatwierdzenie:
- Statusy draft/pending/approved/rejected, komentarz, rewizje.
- Propozycja trasy od służby bezpieczeństwa (osobny overlay), zaakceptuj/odrzuć.
- Powiadomienia w interfejsie (lokalne), opcjonalnie zewnętrzny kanał powiadomień.
- Admin‑narzędzia:
- Edytor konfiguracji tilesets (key, url, source‑layer, hubs, enabled).
- GeoJSON‑Builder: rysowanie/edycja poligonów, eksport; przegląd tilesets jak na głównej.
Dane i modele (ogólnie)
- Baza danych (dokumentowo-orientowana lub SQL z podobnymi encjami):
- routes: { name, fromCode, toCode, fromLabel, toLabel, fromName, toName, routeType, purpose, hub, points[], startRuler[], endRuler[], distance_km, routeKey, approval{}, proposal{}, updatedAt, createdBy…; pola indeksowe: nameLower, fromLabelLower, toLabelLower, fromNameLower, toNameLower, …Ngrams, searchNgrams }.
- users: { role, allowedHubs[] | all }.
- config/tilesets: tablica elementów { key, url, layer, hubs[], enabled }.
- logists: { id, name, active, sort }.
- route_logs: { routeId, type, ts, actor, summary }.
- routeKeys (opcjonalnie): { routeId, … } dla unikalnych kodów tras.
- Obiektowe repozytorium (opcjonalnie): geozones/all.geojson (jako alternatywa dla tilesets).
Integracje (wykonawca wybiera dostawców)
- Mapa: wektorowe kafelki, style, geokodowanie, budowanie tras po drogach.
- Identyfikacja: email/hasło lub inny standardowy dostawca.
- Baza danych: dokumenty/tabele z możliwością indeksów i wyszukiwania prefiksem.
- Hosting statyczny i CDN.
- Lekki backend/API lub funkcje serverless dla:
- zapisywania trasy z weryfikacją tokena,
- wysyłania zewnętrznych powiadomień (np. do messengera).
- Obiektowe repozytorium (jeśli potrzebne pliki GeoJSON).
Wymagania niefunkcjonalne
- Rozgraniczenie dostępu według ról i hubów (odczyt/zapis/usunięcie).
- Cache/odporność offline dla słowników i list (jeśli to możliwe).
- Bezpieczeństwo: ochrona przed XSS, zabezpieczone nagłówki, limit szybkości na API, weryfikacja ID tokena.
- Wydajność: mapa płynna na desktopie i urządzeniach mobilnych, zapytania leniwe, debounce.
- Logowanie zmian tras (krótkie i szczegółowe podsumowanie zmian).
UI/ekrany
- Główna z mapą: panel tworzenia, panel bazy, panel zatwierdzenia, doki na górze/dole.
- Admin: edytor tilesets.
- Admin: GeoJSON‑Builder.
- Eksport/Import.
- Strona przeglądania trasy (review) pod linkiem.
Wyszukiwanie i indeksy (ogólnie)
- Indeksy prefiksowe: nameLower, fromLabelLower, toLabelLower.
- Dodatkowo n-gramy (nameNgrams, fromNgrams, toNgrams, searchNgrams) dla contains.
- Filtrowanie według hub w zapytaniach.
- Należy opisać wymagane indeksy dla wybranej bazy danych.
Bezpieczeństwo (ogólnie)
- Żadne sekrety w kodzie klienta/repozytorium.
- Token mapy — publiczny, ale ograniczony do domen.
- Zasady dostępu w bazie danych: odczyt/zapis według ról i allowedHubs.
- API: weryfikacja ID tokena, CORS, Helmet/nagłówki, limity.
- CSP/Referrer‑Policy/HSTS na produkcji.
Deliverables
- Gotowa aplikacja webowa (pliki statyczne + minimalne API/funkcje).
- Dokumentacja:
- Schematy danych i lista indeksów.
- Instrukcje wdrożenia (lokalnie/produkcja).
- Opis konfiguracji (env), tokenów i ograniczeń.
- Zestaw danych testowych (kilka tras, konfiguracja tilesets).
- Krótkie wideo lub screencast flow: tworzenie → zapisywanie → wyszukiwanie → zatwierdzanie.
Kryteria akceptacji
- Użytkownik z rolą logistyk tworzy trasę, zapisuje, składa do zatwierdzenia; widzi tylko swoje huby.
- admin zmienia konfigurację tilesets, od razu widzi zaktualizowane warstwy na mapie i w Builderze.
- Działa wyszukiwanie (prefiks + contains), przegląd i podgląd trasy.
- Propozycja od security jest wyświetlana i może być zaakceptowana/odrzucona.
- Geozony są domyślnie ukryte; podpisy i popupy działają pod filtrem hubów.
Co ma określić/zaproponować wykonawca
- Konkretni dostawcy: mapy (wektorowe kafelki/trasy/geokodowanie), autoryzacja, baza danych, hosting statyczny, serverless/API, obiektowe repozytorium, kanał powiadomień.
- Plan i kosztorys infrastruktury (bezpłatne/płatne limity).
- Schemat wdrożenia/CI i monitorowanie.
- Szczegóły autoryzacji (sesje, rotacja kluczy, polityka haseł).
Dodatkowo (opcjonalnie)
- Rozszerzony audyt bezpieczeństwa.
- Migracja danych GeoJSON → tilesets.
- Rezerwacja unikalnych kodów tras przez transakcje/kolejki.
- Tematyzacja UI, lokalizacje.