| | 1 | = Use-case 0002 - Create reservation request = |
| | 2 | |
| | 3 | '''Initiating actor:''' |
| | 4 | |
| | 5 | Room Requester |
| | 6 | |
| | 7 | '''Other actors:''' |
| | 8 | |
| | 9 | Reservation Approver |
| | 10 | |
| | 11 | '''Description of the use-case goals:''' |
| | 12 | |
| | 13 | The goal of this use case is to allow a room requester to create a new reservation request. The reservation may include only a room, only equipment, or both a room and equipment. The system first checks whether the selected room is available for the requested date and time interval. If the requested equipment is not permanently assigned to the room, the system can use equipment from the general stock. The database is modified by inserting a new record into the reservations table and, when equipment is requested, inserting records into the reservation_equipment table. |
| | 14 | |
| | 15 | '''Scenario:''' |
| | 16 | |
| | 17 | The Room Requester selects a room, date, start time, and end time. |
| | 18 | The system checks whether the selected room is available in the requested time interval. |
| | 19 | The Room Requester optionally selects equipment items and quantities. |
| | 20 | The system checks whether the requested equipment exists and whether the requested quantities are valid. |
| | 21 | The system creates a reservation with status pending. |
| | 22 | The system stores the requested equipment for the reservation. |
| | 23 | The system displays the created reservation request and its pending status. |
| | 24 | |
| | 25 | '''SQL commands used by the system:''' |
| | 26 | |
| | 27 | Check whether the selected room is available: |
| | 28 | |
| | 29 | {{{ |
| | 30 | SELECT |
| | 31 | r.room_id, |
| | 32 | r.room_code, |
| | 33 | r.capacity, |
| | 34 | r.type |
| | 35 | FROM project.rooms r |
| | 36 | WHERE r.room_code = 'B1-101' |
| | 37 | AND NOT EXISTS ( |
| | 38 | SELECT 1 |
| | 39 | FROM project.reservations res |
| | 40 | WHERE res.room_id = r.room_id |
| | 41 | AND res.reservation_date = DATE '2026-02-15' |
| | 42 | AND res.status IN ('pending', 'approved') |
| | 43 | AND TIME '10:00' < res.end_time |
| | 44 | AND TIME '12:00' > res.start_time |
| | 45 | ); |
| | 46 | }}} |
| | 47 | |
| | 48 | Check available equipment stock: |
| | 49 | |
| | 50 | {{{ |
| | 51 | SELECT |
| | 52 | equipment_id, |
| | 53 | name, |
| | 54 | stock_quantity |
| | 55 | FROM project.equipment |
| | 56 | WHERE name IN ('HDMI Cable', 'Extension Cable'); |
| | 57 | }}} |
| | 58 | |
| | 59 | Create a reservation request for a room and additional equipment: |
| | 60 | |
| | 61 | {{{ |
| | 62 | WITH new_reservation AS ( |
| | 63 | INSERT INTO project.reservations ( |
| | 64 | room_id, |
| | 65 | user_id, |
| | 66 | reservation_date, |
| | 67 | start_time, |
| | 68 | end_time, |
| | 69 | status |
| | 70 | ) |
| | 71 | SELECT |
| | 72 | r.room_id, |
| | 73 | u.user_id, |
| | 74 | DATE '2026-02-15', |
| | 75 | TIME '10:00', |
| | 76 | TIME '12:00', |
| | 77 | 'pending' |
| | 78 | FROM project.rooms r |
| | 79 | JOIN project.users u |
| | 80 | ON u.username = 'nikola' |
| | 81 | WHERE r.room_code = 'B1-101' |
| | 82 | AND NOT EXISTS ( |
| | 83 | SELECT 1 |
| | 84 | FROM project.reservations res |
| | 85 | WHERE res.room_id = r.room_id |
| | 86 | AND res.reservation_date = DATE '2026-02-15' |
| | 87 | AND res.status IN ('pending', 'approved') |
| | 88 | AND TIME '10:00' < res.end_time |
| | 89 | AND TIME '12:00' > res.start_time |
| | 90 | ) |
| | 91 | RETURNING reservation_id |
| | 92 | ) |
| | 93 | INSERT INTO project.reservation_equipment ( |
| | 94 | reservation_id, |
| | 95 | equipment_id, |
| | 96 | requested_quantity |
| | 97 | ) |
| | 98 | SELECT |
| | 99 | nr.reservation_id, |
| | 100 | e.equipment_id, |
| | 101 | requested_items.requested_quantity |
| | 102 | FROM new_reservation nr |
| | 103 | JOIN ( |
| | 104 | VALUES |
| | 105 | ('HDMI Cable', 2), |
| | 106 | ('Extension Cable', 1) |
| | 107 | ) AS requested_items(equipment_name, requested_quantity) |
| | 108 | ON TRUE |
| | 109 | JOIN project.equipment e |
| | 110 | ON e.name = requested_items.equipment_name |
| | 111 | RETURNING reservation_id, equipment_id, requested_quantity; |
| | 112 | }}} |
| | 113 | |
| | 114 | Show the created reservation with requested equipment: |
| | 115 | |
| | 116 | {{{ |
| | 117 | SELECT |
| | 118 | res.reservation_id, |
| | 119 | res.reservation_date, |
| | 120 | res.start_time, |
| | 121 | res.end_time, |
| | 122 | res.status, |
| | 123 | r.room_code, |
| | 124 | u.full_name AS requester_name, |
| | 125 | e.name AS requested_equipment, |
| | 126 | req.requested_quantity |
| | 127 | FROM project.reservations res |
| | 128 | JOIN project.users u |
| | 129 | ON u.user_id = res.user_id |
| | 130 | LEFT JOIN project.rooms r |
| | 131 | ON r.room_id = res.room_id |
| | 132 | LEFT JOIN project.reservation_equipment req |
| | 133 | ON req.reservation_id = res.reservation_id |
| | 134 | LEFT JOIN project.equipment e |
| | 135 | ON e.equipment_id = req.equipment_id |
| | 136 | WHERE res.reservation_date = DATE '2026-02-15' |
| | 137 | AND res.start_time = TIME '10:00' |
| | 138 | AND res.end_time = TIME '12:00' |
| | 139 | AND u.username = 'nikola' |
| | 140 | ORDER BY res.reservation_id, e.name; |
| | 141 | }}} |