Ustawienia rezerwacji (miasto i lokalizacja)
Przewodnik po konfiguracji wynajmu kortów: zasad rezerwacji, czasu trwania, płatności oraz rezerwacji online. Ustawienia mogą być definiowane na trzech poziomach: globalnym, miasta oraz konkretnej lokalizacji (ulicy).
👤 Instrukcja dla pracownika (Administrator)
Ścieżka: Dashboard ➔ Ustawienia rezerwacji
Punkt odniesienia (konfiguracja domyślna)
W bazie istnieje jeden zestaw ustawień bez przypisanego miasta i lokalizacji — to punkt odniesienia (restore point), który obowiązuje wszędzie tam, gdzie nie utworzono wyjątku. Dopóki recepcja/administrator nie utworzą osobnej konfiguracji dla miasta lub lokalizacji, brana jest pod uwagę właśnie ta konfiguracja domyślna.
Wybór zakresu (miasto / ulica)
Na górnym pasku aplikacji (po prawej stronie, tak jak na innych ekranach, np. w grafiku) znajdują się te same dwa standardowe selektory:
- Miasto – domyślnie wybrane jest miasto domyślne aplikacji. Na górze listy jest też opcja „Wszystkie miasta", która pozwala edytować sam punkt odniesienia.
- Lokalizacja (ulica) – pojawia się po wybraniu miasta, które ma więcej niż jedną lokalizację; domyślnie wskazuje ulicę domyślną. Zawiera opcję „Wszystkie lokalizacje" (= poziom miasta) oraz poszczególne ulice.
Po wejściu na stronę masz więc od razu wybrane realne miasto i lokalizację. Jeśli nie mają one jeszcze własnej konfiguracji, formularz pokazuje wartości dziedziczone z punktu odniesienia, a zapisanie tworzy nową konfigurację dla wybranego miasta i ulicy.
System rozwiązuje ustawienia „od najbardziej szczegółowego": ulica → miasto → domyślne.
Tworzenie wyjątku i powrót do wartości domyślnych
Nad formularzem widnieje baner informujący o aktualnym poziomie:
| Kolor banera | Znaczenie | Działanie |
|---|---|---|
| 🔵 Niebieski | Edytujesz konfigurację domyślną (wszystkie miasta i lokalizacje). | Zapisanie aktualizuje ustawienia domyślne. |
| 🟡 Żółty | Wybrane miasto/lokalizacja korzysta z ustawień nadrzędnych. | Edytuj i zapisz, aby utworzyć osobną konfigurację. |
| 🟢 Zielony | Wybrane miasto/lokalizacja ma własną konfigurację. | Przywróć ustawienia poziomu nadrzędnego. |
- Aby zmienić ustawienia domyślne: zostaw selektor na „Domyślna (wszystkie miasta)", edytuj pola i zapisz.
- Aby utworzyć wyjątek dla miasta lub lokalizacji: wybierz je w selektorze, zmień wartości i Zapisz — system automatycznie utworzy osobną konfigurację dla tego zakresu, nie naruszając konfiguracji domyślnej.
- Przywróć – usuwa konfigurację wybranego zakresu; od tej chwili ponownie obowiązują ustawienia poziomu nadrzędnego (miasta lub domyślne).
Co można skonfigurować
Formularz obejmuje m.in.: cenę i cennik zaawansowany wynajmu, minimalny/maksymalny czas trwania i krok, wyprzedzenie rezerwacji, blokadę rezerwacji przed startem, zasady anulowania przez pracownika, rezerwację online (w tym cykliczną), wymóg numeru telefonu oraz limity czasu na płatność online i przez pracownika.
🛠️ Dokumentacja techniczna
Model danych
Ustawienia przechowywane są w dwóch tabelach, każda z kolumnami city oraz street (obie NULL = poziom globalny):
activity_types(rekord typubooking) – cena/cennik i parametry aktywności wynajmu.booking_settings– pozostałe parametry rezerwacji.
Poziomy zakresu:
- Globalny:
city IS NULL(orazstreet IS NULL). - Miasto:
city = ? AND street IS NULL. - Lokalizacja:
city = ? AND street = ?.
Migracja: migrations/0166_add_street_to_reservation_settings.sql dodaje kolumnę street do obu tabel oraz unikalne indeksy uwzględniające IFNULL(street, '').
Rozwiązywanie ustawień (fallback)
getBookingSettingsWithInfo(city, street) oraz getActivityTypesWithInfo(city, street) zwracają najbardziej szczegółowy istniejący rekord wraz z polem level ('global' | 'city' | 'street'). Kolejność: ulica → miasto → globalne. getBookingActivityTypes(city, street) stosuje tę samą kolejność przy wyborze typu wynajmu.
Funkcje są wstecznie kompatybilne — wywołanie bez street zachowuje dotychczasowe zachowanie na poziomie miasta. Parametr street jest przekazywany w przepływach grafiku, rezerwacji, historii oraz w logice anulowania/dzielenia rezerwacji (lib/actions/booking.ts), dzięki czemu konfiguracja lokalizacji faktycznie obowiązuje.
Operacje zapisu
Formularz wyznacza zakres docelowy z wybranych city/street:
- Zakres domyślny (brak miasta):
updateActivityTypeiupdateBookingSettingszapisują rekordcity = NULL, street = NULL(punkt odniesienia pozostaje czysty). - Zakres miasta/lokalizacji, gdy nie ma jeszcze własnej konfiguracji: zapisanie najpierw tworzy rekordy dla tego zakresu (
createCitySpecificActivityType(sourceId, city, street?)z poziomu nadrzędnego jako źródła), a następnie zapisuje w nich wartości. Dzięki temu konfiguracja domyślna nigdy nie jest modyfikowana przy edycji wyjątku. Decyzja „twórz vs. aktualizuj" dla rekordu aktywności opiera się na faktycznymcity/streetrekordu, a nie na poziomie scalonym — co jest odporne na niespójne dane. deleteCitySpecificBookingSettings(city, street?)– usuwa rekord danego poziomu (przy poziomie miasta i braku globalnego konwertuje rekord na globalny). „Przywróć" archiwizuje rekord aktywności i usuwa rekord ustawień danego zakresu.updateBookingSettings({ city, street, ... })– upsert: aktualizuje istniejący rekord zakresu lub wstawia nowy.
Selektor zakresu
Strona używa standardowego selektora miasta + ulicy w górnym pasku aplikacji (components/layout/global-city-select-client.tsx), tak samo jak grafik i inne widoki dla pracowników — /dashboard/reservations-settings jest w employeeStreetPaths (pokazuje selektor ulicy) i nie jest w limitedCityPaths (dzięki czemu dostępna jest opcja „Wszystkie miasta"). Mapowanie na zakres w page.tsx: ?city=ALL → city = null (punkt odniesienia / konfiguracja domyślna), ?street=ALL → street = null (poziom miasta). Bez parametrów strona domyślnie wybiera DEFAULT_CITY oraz ulicę domyślną (getDefaultStreetForCity).