Skip to content

System rezerwacji sali / sprzętu

This content is not available in your language yet.

Stworzycie System rezerwacji sali / sprzętu - aplikację webową, która pozwala użytkownikom rezerwować zasoby (sale konferencyjne, pracownie komputerowe, projektory, laptopy itp.) na określony termin. System rozwiązuje problem chaotycznego zarządzania zasobami w szkole lub firmie - zamiast kartek i ustnych ustaleń, wszystko jest w jednym miejscu. Użytkownikami są pracownicy szkoły, uczniowie lub pracownicy firmy, którzy potrzebują zarezerwować zasób na konkretny dzień i godziny.

Czego się nauczycie?

  • Projektowania formularzy z polami daty i czasu
  • Walidacji zakresów czasowych (godzina od < godzina do)
  • Wykrywania konfliktów między rezerwacjami
  • Pracy z datami w formacie ISO (YYYY-MM-DD)
  • Praca zespołowa - podział zadań, współpraca, integracja kodu

W prawdziwej firmie...

Systemy rezerwacji zasobów to codzienność w każdej organizacji. Microsoft Outlook, Google Calendar, systemy hotelowe - wszystkie działają na podobnej zasadzie. Umiejętność projektowania takich systemów jest fundamentem dla każdego programisty aplikacji biznesowych.

Umiejętności rynkowe

Nauczycie się obsługi dat i czasu - jednego z najtrudniejszych aspektów programowania. Zrozumiecie logikę wykrywania konfliktów czasowych, która jest używana w systemach rezerwacji lotów, hoteli, gabinetów lekarskich i wielu innych.

  1. Formularz rezerwacji Użytkownik wypełnia formularz z danymi: wybiera zasób (sala/sprzęt), datę, godzinę rozpoczęcia i zakończenia, podaje swoje dane oraz cel rezerwacji. Formularz musi być intuicyjny i zawierać odpowiednie typy pól (date, time, select).

  2. Walidacja danych System sprawdza poprawność wprowadzonych danych - czy wszystkie pola są wypełnione, czy godzina zakończenia jest późniejsza niż rozpoczęcia, czy data nie jest z przeszłości. Błędne dane skutkują czytelnym komunikatem.

  3. Zapis do pliku JSON Poprawne rezerwacje są zapisywane do pliku JSON z unikalnym identyfikatorem i znacznikiem czasu utworzenia. Dane są strukturyzowane i łatwe do odczytu.

  4. Lista rezerwacji Użytkownik może przeglądać wszystkie rezerwacje w formie tabeli lub listy. Widoczne są najważniejsze informacje: zasób, data, godziny, osoba rezerwująca.

Strona główna / Formularz

  • Formularz dodawania rezerwacji
  • Wybór zasobu z listy rozwijanej
  • Pola daty i czasu (od-do)
  • Dane osoby rezerwującej
  • Przycisk “Zarezerwuj”

Lista rezerwacji

  • Tabela wszystkich rezerwacji
  • Sortowanie po dacie (domyślnie)
  • Podstawowe filtry (wariant B+)
  • Przycisk szczegółów wpisu

Szczegóły rezerwacji

  • Pełne dane rezerwacji
  • Data utworzenia wpisu
  • Przyciski akcji (wariant C)

Panel admina (wariant C)

  • Zarządzanie rezerwacjami
  • Usuwanie wpisów
  • Widok konfliktów

Przykładowa struktura pliku JSON:

{
"reservations": [
{
"id": 1,
"resource": "Sala konferencyjna A",
"date": "2026-03-15",
"time_from": "09:00",
"time_to": "11:30",
"person": "Jan Kowalski",
"email": "jan.kowalski@szkola.pl",
"purpose": "Spotkanie zespołu projektowego",
"created_at": "2026-02-13 10:30:00"
},
{
"id": 2,
"resource": "Projektor mobilny",
"date": "2026-03-15",
"time_from": "12:00",
"time_to": "14:00",
"person": "Anna Nowak",
"email": "anna.nowak@szkola.pl",
"purpose": "Prezentacja dla klasy 3B",
"created_at": "2026-02-13 11:45:00"
}
]
}

Wymagane funkcjonalności:

  • Formularz rezerwacji z polami: zasób, data, godzina od-do, osoba, email, cel
  • Walidacja PHP wszystkich pól (wymagane, formaty)
  • Minimum 1 walidacja JavaScript (np. czy godzina_do > godzina_od)
  • Zapis rezerwacji do pliku JSON
  • Generowanie unikalnego ID dla każdego wpisu
  • Lista wszystkich rezerwacji z odczytem z JSON
  • Wyświetlanie komunikatów o błędach
  • Potwierdzenie dodania rezerwacji

Struktura plików:

  • Directoryprojekt/
    • index.php (formularz + logika)
    • list.php (lista rezerwacji)
    • README.md
    • Directorydata/
      • reservations.json
    • Directorycss/
      • style.css
    • Directoryjs/
      • validation.js
Ocena: 3.0
  1. Użytkownik otwiera stronę główną z formularzem
  2. Wybiera z listy “Sala konferencyjna A”
  3. Ustawia datę na przyszły tydzień
  4. Podaje godziny 10:00 - 12:00
  5. Wpisuje swoje dane i cel rezerwacji
  6. Klika “Zarezerwuj”
  7. System waliduje dane i zapisuje do JSON
  8. Użytkownik widzi komunikat “Rezerwacja dodana pomyślnie”
  9. Na liście rezerwacji pojawia się nowy wpis
  1. Użytkownik wypełnia formularz, ale podaje godzinę zakończenia wcześniejszą niż rozpoczęcia (np. od 14:00 do 10:00)
  2. JavaScript natychmiast wyświetla ostrzeżenie
  3. Jeśli JS jest wyłączony, PHP blokuje zapis i wyświetla błąd
  4. Użytkownik poprawia godziny i wysyła ponownie
  1. Użytkownik próbuje zarezerwować salę A na 10:00-12:00
  2. System sprawdza istniejące rezerwacje
  3. Wykrywa, że sala A jest już zarezerwowana na 09:30-11:00
  4. Wyświetla komunikat o konflikcie z informacją o kolidującej rezerwacji
  5. Użytkownik zmienia godziny lub wybiera inny zasób

Walidacja godzin w PHP:

<?php
function validateTimeRange(string $from, string $to): bool {
// Konwertuj stringi na timestamp do porównania
$timeFrom = strtotime($from);
$timeTo = strtotime($to);
return $timeTo > $timeFrom;
}
// Użycie:
if (!validateTimeRange($_POST['time_from'], $_POST['time_to'])) {
$errors[] = 'Godzina zakończenia musi być późniejsza niż rozpoczęcia';
}

Sprawdzanie konfliktu rezerwacji (wariant C):

<?php
function hasConflict(array $newReservation, array $existingReservations): ?array {
foreach ($existingReservations as $existing) {
// Ten sam zasób i ta sama data
if ($existing['resource'] === $newReservation['resource']
&& $existing['date'] === $newReservation['date']) {
// Sprawdź nakładanie się godzin
$newFrom = strtotime($newReservation['time_from']);
$newTo = strtotime($newReservation['time_to']);
$existFrom = strtotime($existing['time_from']);
$existTo = strtotime($existing['time_to']);
// Konflikt: nowa rezerwacja zaczyna się przed końcem istniejącej
// i kończy się po rozpoczęciu istniejącej
if ($newFrom < $existTo && $newTo > $existFrom) {
return $existing; // Zwróć kolidującą rezerwację
}
}
}
return null; // Brak konfliktu
}

Walidacja godzin w JavaScript:

document.getElementById('reservationForm').addEventListener('submit', function(e) {
const timeFrom = document.getElementById('time_from').value;
const timeTo = document.getElementById('time_to').value;
if (timeFrom >= timeTo) {
e.preventDefault();
alert('Godzina zakończenia musi być późniejsza niż rozpoczęcia!');
return false;
}
// Sprawdź czy data nie jest z przeszłości
const selectedDate = new Date(document.getElementById('date').value);
const today = new Date();
today.setHours(0, 0, 0, 0);
if (selectedDate < today) {
e.preventDefault();
alert('Nie można rezerwować na datę z przeszłości!');
return false;
}
});

Generowanie unikalnego ID:

<?php
function generateId(array $reservations): int {
if (empty($reservations)) {
return 1;
}
$maxId = max(array_column($reservations, 'id'));
return $maxId + 1;
}

To prawdziwy projekt zespołowy!

Ten projekt to symulacja pracy w firmie IT. Nauczycie się nie tylko programować, ale też współpracować w zespole - dzielić zadania, łączyć kod, rozwiązywać konflikty.

Pracujcie iteracyjnie - lepiej mieć działający wariant A niż niedziałający C! Zacznijcie od najprostszej wersji, a potem stopniowo dodawajcie funkcje.