Room catalog and availability system for managing bookable spaces
The room management system provides the foundation for the reservation system, maintaining the catalog of available rooms and their associated materials.
// From app/models/Room.php:17-24public function getAll(): array{ $sql = "SELECT id, name FROM rooms ORDER BY name"; $stmt = $this->db->prepare($sql); $stmt->execute(); return $stmt->fetchAll(PDO::FETCH_ASSOC);}
Returns: Array of all rooms sorted alphabetically by name.
Usage
Example Output
$roomModel = new Room();$rooms = $roomModel->getAll();foreach ($rooms as $room) { echo $room['name'];}
Rooms are associated with materials through the room_materials join table. Each room can have multiple materials, and each material can belong to multiple rooms.
// From app/models/Room.php:45-63public function getMaterials(int $roomId): array{ $sql = "SELECT m.id, m.name, rm.quantity FROM room_materials rm JOIN materials m ON m.id = rm.material_id WHERE rm.room_id = :room_id ORDER BY m.name"; $stmt = $this->db->prepare($sql); $stmt->bindParam(':room_id', $roomId, PDO::PARAM_INT); $stmt->execute(); return $stmt->fetchAll(PDO::FETCH_ASSOC);}
Returns: Array of materials available in the specified room, including quantity information.
Usage
Example Output
$roomModel = new Room();$materials = $roomModel->getMaterials(2);foreach ($materials as $material) { echo "{$material['name']} (Qty: {$material['quantity']})";}
// From app/models/ReservationSlot.php:59-85public function hasConflict( int $roomId, string $date, string $startTime, string $endTime): bool { $sql = "SELECT 1 FROM reservation_slots rs JOIN reservations r ON r.id = rs.reservation_id WHERE r.room_id = :room_id AND rs.date = :date AND (rs.start_time < :end_time AND rs.end_time > :start_time) LIMIT 1"; return (bool) $stmt->fetchColumn();}
Always check for conflicts before creating a reservation to prevent double-booking:
// From app/controllers/ReservationController.php:86-90if ($slotModel->hasConflict((int)$roomId, $date, $start, $end)) { throw new Exception("Conflicto de horario el $date de $start a $end.");}$slotModel->create($reservationId, $date, $start, $end);
// From app/models/ReservationSlot.php:91-108public function getOccupiedSlots(int $roomId, string $date): array{ $sql = "SELECT rs.start_time, rs.end_time FROM reservation_slots rs JOIN reservations r ON r.id = rs.reservation_id WHERE r.room_id = :room_id AND rs.date = :date ORDER BY rs.start_time"; return $stmt->fetchAll(PDO::FETCH_ASSOC);}
Returns: List of all occupied time slots for a specific room and date.
Usage
Example Output
$slotModel = new ReservationSlot();$occupied = $slotModel->getOccupiedSlots(2, '2026-03-15');// Display availability calendarforeach ($occupied as $slot) { echo "Occupied: {$slot['start_time']} - {$slot['end_time']}";}
Room information is included in reservation queries through SQL joins:
// From app/models/Reservation.php:45-60$sql = "SELECT r.id, r.user_id, r.room_id, r.event_name, r.status, r.notes, r.created_at, u.username, rm.name AS room_name -- Room name joined FROM reservations r JOIN users u ON u.id = r.user_id JOIN rooms rm ON rm.id = r.room_id WHERE r.id = :id LIMIT 1";
This ensures reservation objects always include the room name for display purposes.
Rooms are frequently queried in the context of reservations:
Reservation List with Room Names
// From app/models/Reservation.php:78-90$sql = "SELECT r.id, r.event_name, r.status, r.created_at, rm.name AS room_name, u.username FROM reservations r JOIN rooms rm ON rm.id = r.room_id JOIN users u ON u.id = r.user_id ORDER BY r.created_at DESC";
Room names are joined to provide context in reservation listings.
User's Reservations with Rooms
// From app/models/Reservation.php:214-224$sql = "SELECT r.id, r.event_name, r.status, r.created_at, rm.name AS room_name FROM reservations r JOIN rooms rm ON rm.id = r.room_id WHERE r.user_id = :user_id ORDER BY r.created_at DESC";
Users see which rooms they’ve reserved in their dashboard.
$slotModel = new ReservationSlot();$occupied = $slotModel->getOccupiedSlots($roomId, $date);// Calculate free slots based on occupied$freeSlots = calculateFreeSlots($occupied);