Inżynieria Oprogramowania: System Rezerwacji Fryzjera
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
- 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.
- 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).
- 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_timew tabeliappointmentsjest potrzebny, czy wyliczysz go dynamicznie zservices.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:
- Pobierz
durationusługi (np. 45 min). - Pobierz godziny pracy wybranego pracownika w tym dniu (np. 10:00 - 18:00).
- Pobierz istniejące rezerwacje (zajęte przedziały) tego pracownika.
- Generuj potencjalne sloty co X minut (np. co 15 min): 10:00, 10:15, 10:30...
- 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"?
- Czy
- Zwróć listę pasujących godzin.
3. Makiety UI (Opis widoków)
- Wizzard Rezerwacji (Klient):
- Kafelki ze zdjęciami pracowników.
- Lista usług (z cenami i czasem).
- Kalendarz (klikasz dzień -> rozwijają się godziny).
- 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?