DatabaseProgramming: Functions.sql

File Functions.sql, 2.7 KB (added by 231151, 3 weeks ago)
Line 
1-- следни возења за постојка
2CREATE OR REPLACE FUNCTION get_upcoming_trips_for_stop(p_stop_id VARCHAR)
3RETURNS TABLE (
4 route_name VARCHAR,
5 departure_time TIME,
6 headsign VARCHAR,
7 status VARCHAR
8) AS $$
9BEGIN
10 RETURN QUERY
11 SELECT
12 r.ROUTE_NAME,
13 st.DEPARTURE_TIME,
14 t.TRIP_HEADSIGN,
15 t.STATUS
16 FROM STOP_TIME st
17 JOIN TRIP t ON st.TRIP_ID = t.TRIP_ID
18 JOIN ROUTE r ON t.ROUTE_ID = r.ROUTE_ID
19 WHERE st.STOP_ID = p_stop_id
20 AND t.TRIP_DATE = CURRENT_DATE
21 AND st.DEPARTURE_TIME >= LOCALTIME
22 AND t.STATUS IN ('SCHEDULED', 'IN_PROGRESS')
23 ORDER BY st.DEPARTURE_TIME;
24END;
25$$ LANGUAGE plpgsql;
26
27SELECT * FROM get_upcoming_trips_for_stop('STOP_5');
28
29
30-- дали патник има активна претплата
31CREATE OR REPLACE FUNCTION passenger_has_active_pass(p_passenger_id VARCHAR)
32RETURNS BOOLEAN AS $$
33DECLARE
34 v_count INT;
35BEGIN
36 SELECT COUNT(*)
37 INTO v_count
38 FROM SUBSCRIPTION_PASS
39 WHERE PASSENGER_ID = p_passenger_id
40 AND STATUS = 'ACTIVE'
41 AND END_DATE >= CURRENT_DATE;
42
43 RETURN v_count > 0;
44END;
45$$ LANGUAGE plpgsql;
46
47SELECT passenger_has_active_pass('PASS_42');
48
49
50-- откажи возење и извести патници
51CREATE OR REPLACE FUNCTION cancel_trip(p_trip_id VARCHAR, p_reason TEXT)
52RETURNS VOID AS $$
53BEGIN
54 UPDATE TRIP
55 SET STATUS = 'CANCELLED'
56 WHERE TRIP_ID = p_trip_id;
57
58 INSERT INTO NOTIFICATION (PASSENGER_ID, TRIP_ID, MESSAGE, NOTIFICATION_TYPE, STATUS)
59 SELECT DISTINCT
60 tk.PASSENGER_ID,
61 p_trip_id,
62 'Your trip has been cancelled. Reason: ' || p_reason,
63 'CANCELLATION',
64 'PENDING'
65 FROM TICKET tk
66 WHERE tk.TRIP_ID = p_trip_id
67 AND tk.STATUS = 'VALID';
68END;
69$$ LANGUAGE plpgsql;
70
71SELECT cancel_trip('TRIP_10', 'Technical issue with the vehicle');
72
73
74-- пресметај цена со попуст
75CREATE OR REPLACE FUNCTION calculate_ticket_price(
76 p_fare_rule_id INT,
77 p_discount_id INT DEFAULT NULL
78)
79RETURNS NUMERIC AS $$
80DECLARE
81 v_base_price NUMERIC;
82 v_discount_pct NUMERIC := 0;
83 v_final_price NUMERIC;
84BEGIN
85 SELECT PRICE
86 INTO v_base_price
87 FROM FARE_RULE
88 WHERE FARE_RULE_ID = p_fare_rule_id;
89
90 IF p_discount_id IS NOT NULL THEN
91 SELECT DISCOUNT_PERCENTAGE
92 INTO v_discount_pct
93 FROM DISCOUNT
94 WHERE DISCOUNT_ID = p_discount_id
95 AND (VALID_TO IS NULL OR VALID_TO >= CURRENT_DATE);
96 END IF;
97
98 v_final_price := v_base_price - (v_base_price * v_discount_pct / 100);
99
100 RETURN ROUND(v_final_price, 2);
101END;
102$$ LANGUAGE plpgsql;
103
104SELECT calculate_ticket_price(1);
105SELECT calculate_ticket_price(1, 3);