| | 220 | |
| | 221 | == Create a booking |
| | 222 | {{{ |
| | 223 | CREATE OR REPLACE PROCEDURE book_room( |
| | 224 | p_room_id BIGINT, |
| | 225 | p_guest_id BIGINT, |
| | 226 | p_check_in_date DATE, |
| | 227 | p_check_out_date DATE, |
| | 228 | p_guests_count INT, |
| | 229 | p_total_price NUMERIC |
| | 230 | ) |
| | 231 | LANGUAGE plpgsql |
| | 232 | AS $$ |
| | 233 | BEGIN |
| | 234 | IF p_check_out_date <= p_check_in_date THEN |
| | 235 | RAISE EXCEPTION 'Check-out date must be after check-in date'; |
| | 236 | END IF; |
| | 237 | |
| | 238 | IF EXISTS ( |
| | 239 | SELECT 1 |
| | 240 | FROM bookings b |
| | 241 | WHERE b.room_id = p_room_id |
| | 242 | AND b.booking_status IN ('PENDING', 'CONFIRMED') |
| | 243 | AND daterange(b.check_in_date, b.check_out_date, '[)') |
| | 244 | && daterange(p_check_in_date, p_check_out_date, '[)') |
| | 245 | ) THEN |
| | 246 | RAISE EXCEPTION 'Room % is already booked for selected dates', p_room_id; |
| | 247 | END IF; |
| | 248 | |
| | 249 | INSERT INTO bookings ( |
| | 250 | room_id, |
| | 251 | guest_id, |
| | 252 | check_in_date, |
| | 253 | check_out_date, |
| | 254 | guests_count, |
| | 255 | total_price, |
| | 256 | booking_status |
| | 257 | ) |
| | 258 | VALUES ( |
| | 259 | p_room_id, |
| | 260 | p_guest_id, |
| | 261 | p_check_in_date, |
| | 262 | p_check_out_date, |
| | 263 | p_guests_count, |
| | 264 | p_total_price, |
| | 265 | 'PENDING' |
| | 266 | ); |
| | 267 | |
| | 268 | RAISE NOTICE 'Booking created successfully'; |
| | 269 | END; |
| | 270 | $$; |
| | 271 | }}} |