Inżynieria Oprogramowania: System Rezerwacji Fryzjera

Oprogramowanie
Priorytet: Normalny Szkic

Zadanie 2: System Rezerwacji "e-Fryzjer"

Wstęp

Umawianie wizyt przez telefon to przeszłość. Klienci chcą widzieć wolne terminy o 2 w nocy i rezerwować je jednym kliknięciem. Dla salonu to wyzwanie: każda usługa trwa tyle samo? Nie. Czy każdy fryzjer potrafi to samo? Niekoniecznie. Zaprojektuj system, który to ogarnie.

Cel zadania

Stworzenie projektu systemu rezerwacji (Baza Danych + Logika Biznesowa), który obsługuje usługi o różnym czasie trwania i wymaga potwierdzenia przez pracownika.

Wymagania biznesowe

  1. Klient:
    • Wybiera pracownika (fryzjera).
    • Wybiera usługę (np. "Strzyżenie męskie" - 30min, "Koloryzacja" - 120min).
    • Widzi tylko dostępne terminy, w których zmieści się wybrana usługa.
    • Rezerwuje podając dane (Imię, Tel, Email). Status: Oczekująca.
  2. Pracownik/Admin:
    • Panel zarządzania rezerwacjami (Kalendarz).
    • Dodawanie/Edycja/Usuwanie wizyt "z palca" (np. telefon od klienta).
    • Potwierdzanie wizyt online: Zmiana statusu na Potwierdzona -> wysyłka e-maila do klienta.
    • Zarządzanie usługami (Nazwa, Cena, Czas trwania).
  3. Logika:
    • Termin jest dostępny tylko wtedy, gdy pracownik pracuje w tych godzinach ORAZ nie ma w tym czasie innej wizyty.

Kroki do wykonania

1. Projekt Bazy Danych (ERD)

To serce systemu. Musisz połączyć Pracowników, Usługi i Terminy.

Kluczowe tabele:

  • services (id, name, duration_minutes, price)
  • employees (id, name, email, ...)
  • schedule_availability (employee_id, day_of_week, start_time, end_time) - kiedy kogoś widać w pracy.
  • appointments (id, employee_id, service_id, client_name, client_email, start_time, status)

[!TIP] Pytanie projektowe: Czy end_time w tabeli appointments jest potrzebny, czy wyliczysz go dynamicznie z services.duration_minutes? Zapisanie go może ułatwić szukanie "kolizji" w SQL.

2. Algorytm: "Znajdź wolny termin"

To najtrudniejsza część. Klient wybiera usługę trwającą 45 minut. Jak pokazać mu wolne sloty?

Pseudokod algorytmu dla API GET /slots?date=2023-10-27&service_id=5:

  1. Pobierz duration usługi (np. 45 min).
  2. Pobierz godziny pracy wybranego pracownika w tym dniu (np. 10:00 - 18:00).
  3. Pobierz istniejące rezerwacje (zajęte przedziały) tego pracownika.
  4. Generuj potencjalne sloty co X minut (np. co 15 min): 10:00, 10:15, 10:30...
  5. Dla każdego slotu sprawdź WARUNEK DOSTĘPNOŚCI:
    • Czy start + duration <= koniec_pracy?
    • Czy przedział [start, start + duration] nie nakłada się na żaden z "zajętych przedziałów"?
  6. Zwróć listę pasujących godzin.

3. Makiety UI (Opis widoków)

  • Wizzard Rezerwacji (Klient):
    1. Kafelki ze zdjęciami pracowników.
    2. Lista usług (z cenami i czasem).
    3. Kalendarz (klikasz dzień -> rozwijają się godziny).
    4. Formularz danych osobowych.
  • Panel Admina:
    • Widok dnia/tygodnia (Siatka godzin).
    • Odróżnienie wizyt Potwierdzonych (Zielone) od Oczekujących (Żółte).
    • Modal edycji wizyty z przyciskiem "Wyślij potwierdzenie".

Zadanie dla chętnych

Rozważ sytuację, w której usługa "Koloryzacja" (120 min) wymaga 30 min nakładania farby (fryzjer zajęty), 60 min czekania (fryzjer wolny!) i 30 min zmywania. Jak zapisać to w bazie, aby w trakcie "czekania" fryzjer mógł przyjąć kogoś na szybkie strzyżenie?