Skip to main content

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 baneraZnaczenieDziałanie
🔵 NiebieskiEdytujesz konfigurację domyślną (wszystkie miasta i lokalizacje).Zapisanie aktualizuje ustawienia domyślne.
🟡 ŻółtyWybrane miasto/lokalizacja korzysta z ustawień nadrzędnych.Edytuj i zapisz, aby utworzyć osobną konfigurację.
🟢 ZielonyWybrane 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 typu booking) – cena/cennik i parametry aktywności wynajmu.
  • booking_settings – pozostałe parametry rezerwacji.

Poziomy zakresu:

  • Globalny: city IS NULL (oraz street 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): updateActivityType i updateBookingSettings zapisują rekord city = 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 faktycznym city/street rekordu, 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).