P7: advanced_functions.sql

File advanced_functions.sql, 5.0 KB (added by 193284, 8 days ago)
Line 
1CREATE OR REPLACE FUNCTION calculate_wedding_total_cost(p_wedding_id INTEGER)
2RETURNS NUMERIC AS $$
3DECLARE
4 venue_cost NUMERIC := 0;
5 photographer_cost NUMERIC := 0;
6 band_cost NUMERIC := 0;
7BEGIN
8 SELECT COALESCE(SUM(price), 0)
9 INTO venue_cost
10 FROM venue_booking
11 WHERE wedding_id = p_wedding_id
12 AND status = 'confirmed';
13
14 SELECT COALESCE(SUM(
15 EXTRACT(EPOCH FROM (pb.end_time - pb.start_time)) / 3600
16 * p.price_per_hour
17 ), 0)
18 INTO photographer_cost
19 FROM photographer_booking pb
20 JOIN photographer p ON pb.photographer_id = p.photographer_id
21 WHERE pb.wedding_id = p_wedding_id
22 AND pb.status = 'confirmed';
23
24 SELECT COALESCE(SUM(
25 EXTRACT(EPOCH FROM (bb.end_time - bb.start_time)) / 3600
26 * b.price_per_hour
27 ), 0)
28 INTO band_cost
29 FROM band_booking bb
30 JOIN band b ON bb.band_id = b.band_id
31 WHERE bb.wedding_id = p_wedding_id
32 AND bb.status = 'confirmed';
33
34 RETURN venue_cost + photographer_cost + band_cost;
35END;
36$$ LANGUAGE plpgsql;
37
38
39CREATE OR REPLACE FUNCTION is_venue_available(
40 p_venue_id INTEGER,
41 p_date DATE,
42 p_start TIME,
43 p_end TIME
44)
45RETURNS BOOLEAN AS $$
46BEGIN
47 IF p_end <= p_start THEN
48 RAISE EXCEPTION 'Invalid interval: end time must be after start time.';
49 END IF;
50
51 RETURN NOT EXISTS (
52 SELECT 1
53 FROM venue_booking vb
54 WHERE vb.venue_id = p_venue_id
55 AND vb.status <> 'cancelled'
56 AND (
57 ((p_date + p_start) >= (vb."date" + vb.start_time)
58 AND (p_date + p_start) < (vb."date" + vb.end_time))
59
60 OR
61
62 ((p_date + p_end) > (vb."date" + vb.start_time)
63 AND (p_date + p_end) <= (vb."date" + vb.end_time))
64
65 OR
66
67 ((p_date + p_start) <= (vb."date" + vb.start_time)
68 AND (p_date + p_end) >= (vb."date" + vb.end_time))
69
70 OR
71
72 ((p_date + p_start) >= (vb."date" + vb.start_time)
73 AND (p_date + p_end) <= (vb."date" + vb.end_time))
74 )
75 );
76END;
77$$ LANGUAGE plpgsql;
78
79
80CREATE OR REPLACE FUNCTION is_photographer_available(
81 p_photographer_id INTEGER,
82 p_date DATE,
83 p_start TIME,
84 p_end TIME
85)
86RETURNS BOOLEAN AS $$
87BEGIN
88 IF p_end <= p_start THEN
89 RAISE EXCEPTION 'Invalid interval: end time must be after start time.';
90 END IF;
91
92 RETURN NOT EXISTS (
93 SELECT 1
94 FROM photographer_booking pb
95 WHERE pb.photographer_id = p_photographer_id
96 AND pb.status <> 'cancelled'
97 AND (
98 ((p_date + p_start) >= (pb."date" + pb.start_time)
99 AND (p_date + p_start) < (pb."date" + pb.end_time))
100
101 OR
102
103 ((p_date + p_end) > (pb."date" + pb.start_time)
104 AND (p_date + p_end) <= (pb."date" + pb.end_time))
105
106 OR
107
108 ((p_date + p_start) <= (pb."date" + pb.start_time)
109 AND (p_date + p_end) >= (pb."date" + pb.end_time))
110
111 OR
112
113 ((p_date + p_start) >= (pb."date" + pb.start_time)
114 AND (p_date + p_end) <= (pb."date" + pb.end_time))
115 )
116 );
117END;
118$$ LANGUAGE plpgsql;
119
120
121CREATE OR REPLACE FUNCTION is_band_available(
122 p_band_id INTEGER,
123 p_date DATE,
124 p_start TIME,
125 p_end TIME
126)
127RETURNS BOOLEAN AS $$
128BEGIN
129 IF p_end <= p_start THEN
130 RAISE EXCEPTION 'Invalid interval: end time must be after start time.';
131 END IF;
132
133 RETURN NOT EXISTS (
134 SELECT 1
135 FROM band_booking bb
136 WHERE bb.band_id = p_band_id
137 AND bb.status <> 'cancelled'
138 AND (
139 ((p_date + p_start) >= (bb."date" + bb.start_time)
140 AND (p_date + p_start) < (bb."date" + bb.end_time))
141
142 OR
143
144 ((p_date + p_end) > (bb."date" + bb.start_time)
145 AND (p_date + p_end) <= (bb."date" + bb.end_time))
146
147 OR
148
149 ((p_date + p_start) <= (bb."date" + bb.start_time)
150 AND (p_date + p_end) >= (bb."date" + bb.end_time))
151
152 OR
153
154 ((p_date + p_start) >= (bb."date" + bb.start_time)
155 AND (p_date + p_end) <= (bb."date" + bb.end_time))
156 )
157 );
158END;
159$$ LANGUAGE plpgsql;
160
161
162CREATE OR REPLACE PROCEDURE generate_rsvp_summary(p_event_id INTEGER)
163LANGUAGE plpgsql
164AS $$
165BEGIN
166 RAISE NOTICE 'Accepted: %',
167 (
168 SELECT COUNT(*)
169 FROM event_rsvp
170 WHERE event_id = p_event_id
171 AND status = 'accepted'
172 );
173
174 RAISE NOTICE 'Declined: %',
175 (
176 SELECT COUNT(*)
177 FROM event_rsvp
178 WHERE event_id = p_event_id
179 AND status = 'declined'
180 );
181
182 RAISE NOTICE 'Pending: %',
183 (
184 SELECT COUNT(*)
185 FROM event_rsvp
186 WHERE event_id = p_event_id
187 AND status = 'pending'
188 );
189END;
190$$;