Material assignment system with room-specific validation for reservations
Apartado de Salas includes a comprehensive material management system that allows users to request equipment and resources when making room reservations. Materials are associated with specific rooms and validated during the booking process.
// From app/models/Material.php:18-25public function getAll(): array{ $sql = "SELECT id, name, description FROM materials ORDER BY name"; return $stmt->fetchAll(PDO::FETCH_ASSOC);}
This method returns the complete catalog of materials, useful for administrative views.
// From app/models/Material.php:30-49public function getByRoom(int $roomId): array{ $sql = "SELECT m.id, m.name, m.description, 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->bindParam(':room_id', $roomId, PDO::PARAM_INT); $stmt->execute(); return $stmt->fetchAll(PDO::FETCH_ASSOC);}
This method is crucial for displaying available materials in the reservation form based on the selected room.
When a reservation is created, materials are attached through the attachMaterials() method:
// From app/models/Reservation.php:125-153public function attachMaterials(int $reservationId, array $materialIds): void{ // 1. Delete any previous assignments $this->db->prepare( "DELETE FROM reservation_materials WHERE reservation_id = :id" )->execute([':id' => $reservationId]); // 2. Normalize material IDs $materialIds = array_unique( array_filter( array_map('intval', $materialIds), fn($id) => $id > 0 ) ); // 3. Insert each material $stmt = $this->db->prepare( "INSERT INTO reservation_materials (reservation_id, material_id) VALUES (:reservation_id, :material_id)" ); foreach ($materialIds as $materialId) { $stmt->execute([ ':reservation_id' => $reservationId, ':material_id' => $materialId ]); }}
Always call validateForRoom() before attachMaterials() to ensure materials are valid:
// From app/controllers/ReservationController.php:94-98if (!$materialModel->validateForRoom($materials, (int)$roomId)) { throw new Exception('Materiales no válidos para la sala.');}$reservationModel->attachMaterials($reservationId, $materials);
// From app/models/Reservation.php:159-174public function getMaterials(int $reservationId): array{ $sql = "SELECT m.id, m.name FROM reservation_materials rm JOIN materials m ON m.id = rm.material_id WHERE rm.reservation_id = :reservation_id ORDER BY m.name"; $stmt->bindParam(':reservation_id', $reservationId, PDO::PARAM_INT); $stmt->execute(); return $stmt->fetchAll(PDO::FETCH_ASSOC);}
Returns: Array of materials with id and name fields.
Usage in Controller
Example Output
// From app/controllers/ReservationController.php:279$materials = $reservationModel->getMaterials((int)$id);
The Room model provides a method to retrieve materials for a specific room:
// 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->bindParam(':room_id', $roomId, PDO::PARAM_INT); $stmt->execute(); return $stmt->fetchAll(PDO::FETCH_ASSOC);}
This method is functionally equivalent to Material::getByRoom() but accessed through the Room model.