DatabaseProgramming: faza4.sql

File faza4.sql, 5.0 KB (added by 231088, 14 hours ago)
Line 
1CREATE OR REPLACE FUNCTION fn_artist_average_rating(
2 p_bookable_id INT
3)
4RETURNS NUMERIC(3,2)
5AS
6$$
7DECLARE
8 v_average_rating NUMERIC(3,2);
9BEGIN
10
11 SELECT
12 ROUND(AVG(r.rating), 2)
13 INTO v_average_rating
14 FROM Review r
15 JOIN Booking bk
16 ON r.booking_id = bk.booking_id
17 JOIN Offer o
18 ON bk.offer_id = o.offer_id
19 WHERE o.bookable_id = p_bookable_id;
20
21 RETURN COALESCE(v_average_rating, 0);
22
23END;
24$$
25LANGUAGE plpgsql;
26
27
28CREATE OR REPLACE FUNCTION fn_artist_total_earnings(
29 p_bookable_id INT
30)
31RETURNS NUMERIC(10,2)
32AS
33$$
34DECLARE
35 v_total NUMERIC(10,2);
36BEGIN
37
38 SELECT
39 SUM(p.amount)
40 INTO v_total
41 FROM Payment p
42 JOIN Booking bk
43 ON p.booking_id = bk.booking_id
44 JOIN Offer o
45 ON bk.offer_id = o.offer_id
46 WHERE o.bookable_id = p_bookable_id
47 AND p.payment_status = 'PAID';
48
49 RETURN COALESCE(v_total, 0);
50
51END;
52$$
53LANGUAGE plpgsql;
54
55
56CREATE OR REPLACE FUNCTION fn_check_artist_availability(
57 p_bookable_id INT,
58 p_date DATE
59)
60RETURNS BOOLEAN
61AS
62$$
63DECLARE
64 v_exists INT;
65BEGIN
66
67 SELECT COUNT(*)
68 INTO v_exists
69 FROM AvailabilitySlot
70 WHERE bookable_id = p_bookable_id
71 AND DATE(start_datetime) = p_date
72 AND status = 'AVAILABLE';
73
74 RETURN v_exists > 0;
75
76END;
77$$
78LANGUAGE plpgsql;
79
80
81CREATE OR REPLACE FUNCTION fn_total_client_bookings(
82 p_client_id INT
83)
84RETURNS INT
85AS
86$$
87DECLARE
88 v_total INT;
89BEGIN
90
91 SELECT COUNT(*)
92 INTO v_total
93 FROM BookingRequest br
94 JOIN Offer o
95 ON br.request_id = o.request_id
96 JOIN Booking bk
97 ON bk.offer_id = o.offer_id
98 WHERE br.client_id = p_client_id;
99
100 RETURN v_total;
101
102END;
103$$
104LANGUAGE plpgsql;
105
106
107CREATE OR REPLACE PROCEDURE sp_create_booking_request(
108 p_client_id INT,
109 p_duration_id INT,
110 p_event_type VARCHAR,
111 p_event_date DATE,
112 p_location_id INT
113)
114LANGUAGE plpgsql
115AS
116$$
117BEGIN
118
119 INSERT INTO BookingRequest(
120 client_id,
121 duration_id,
122 event_type,
123 event_date,
124 location_id
125 )
126 VALUES (
127 p_client_id,
128 p_duration_id,
129 p_event_type,
130 p_event_date,
131 p_location_id
132 );
133
134END;
135$$;
136
137
138CREATE OR REPLACE PROCEDURE sp_cancel_booking(
139 p_booking_id INT
140)
141LANGUAGE plpgsql
142AS
143$$
144BEGIN
145
146 UPDATE Booking
147 SET booking_status = 'CANCELLED'
148 WHERE booking_id = p_booking_id;
149
150END;
151$$;
152
153
154CREATE OR REPLACE PROCEDURE sp_create_payment(
155 p_booking_id INT,
156 p_amount NUMERIC(10,2)
157)
158LANGUAGE plpgsql
159AS
160$$
161BEGIN
162
163 INSERT INTO Payment(
164 booking_id,
165 amount,
166 payment_status
167 )
168 VALUES (
169 p_booking_id,
170 p_amount,
171 'PAID'
172 );
173
174END;
175$$;
176
177
178CREATE OR REPLACE FUNCTION fn_update_slot_status()
179RETURNS TRIGGER
180AS
181$$
182BEGIN
183
184 UPDATE AvailabilitySlot s
185 SET status = 'BOOKED'
186 WHERE s.bookable_id = (
187 SELECT o.bookable_id
188 FROM Offer o
189 WHERE o.offer_id = NEW.offer_id
190 )
191 AND DATE(s.start_datetime) = (
192 SELECT br.event_date
193 FROM BookingRequest br
194 JOIN Offer o2 ON o2.request_id = br.request_id
195 WHERE o2.offer_id = NEW.offer_id
196 );
197
198 RETURN NEW;
199
200END;
201$$
202LANGUAGE plpgsql;
203
204
205CREATE OR REPLACE TRIGGER trg_update_slot_status
206AFTER INSERT ON Booking
207FOR EACH ROW
208EXECUTE FUNCTION fn_update_slot_status();
209
210
211CREATE OR REPLACE FUNCTION fn_prevent_double_booking()
212RETURNS TRIGGER
213AS
214$$
215DECLARE
216 v_count INT;
217BEGIN
218
219 SELECT COUNT(*)
220 INTO v_count
221 FROM Booking b
222 JOIN Offer o
223 ON b.offer_id = o.offer_id
224 JOIN BookingRequest br
225 ON br.request_id = o.request_id
226 WHERE o.bookable_id = (
227 SELECT bookable_id
228 FROM Offer
229 WHERE offer_id = NEW.offer_id
230 )
231 AND br.event_date = (
232 SELECT br2.event_date
233 FROM BookingRequest br2
234 JOIN Offer o2 ON o2.request_id = br2.request_id
235 WHERE o2.offer_id = NEW.offer_id
236 )
237 AND b.booking_status = 'CONFIRMED';
238
239 IF v_count > 0 THEN
240 RAISE EXCEPTION 'Artist already booked on that date!';
241 END IF;
242
243 RETURN NEW;
244
245END;
246$$
247LANGUAGE plpgsql;
248
249
250CREATE OR REPLACE TRIGGER trg_prevent_double_booking
251BEFORE INSERT ON Booking
252FOR EACH ROW
253EXECUTE FUNCTION fn_prevent_double_booking();
254
255
256CREATE OR REPLACE FUNCTION fn_booking_status_history()
257RETURNS TRIGGER
258AS
259$$
260BEGIN
261
262 INSERT INTO BookingStatusHistory(
263 booking_id,
264 new_status,
265 changed_at
266 )
267 VALUES (
268 NEW.booking_id,
269 NEW.booking_status,
270 NOW()
271 );
272
273 RETURN NEW;
274
275END;
276$$
277LANGUAGE plpgsql;
278
279
280CREATE OR REPLACE TRIGGER trg_booking_status_history
281AFTER UPDATE ON Booking
282FOR EACH ROW
283WHEN (OLD.booking_status IS DISTINCT FROM NEW.booking_status)
284EXECUTE FUNCTION fn_booking_status_history();