WikiStart: Validate preorder price trigger.txt

File Validate preorder price trigger.txt, 1.9 KB (added by 213209, 37 hours ago)
Line 
1DROP TRIGGER IF EXISTS validate_preorder_price_trigger ON reservation_preordered_items;
2
3CREATE OR REPLACE FUNCTION trg_validate_preorder_price()
4RETURNS TRIGGER AS $$
5DECLARE
6 v_menu_price NUMERIC;
7 v_restaurant_id INTEGER;
8BEGIN
9 SELECT restaurantid INTO v_restaurant_id
10 FROM reservations
11 WHERE reservationid = NEW.reservation_id;
12
13 IF NOT FOUND THEN
14 RAISE EXCEPTION 'Reservation ID % not found', NEW.reservation_id;
15 END IF;
16
17 SELECT price INTO v_menu_price
18 FROM menus
19 WHERE item_name = NEW.preordered_item_name AND restaurant_id = v_restaurant_id;
20
21 IF NOT FOUND THEN
22 RAISE EXCEPTION 'Menu item "%" not found for restaurant ID %', NEW.preordered_item_name, v_restaurant_id;
23 END IF;
24
25 IF NEW.quantity <= 0 THEN
26 RAISE EXCEPTION 'Invalid quantity for item "%": must be greater than 0', NEW.preordered_item_name;
27 END IF;
28
29 IF NEW.price_at_order <> v_menu_price THEN
30 RAISE EXCEPTION 'Price mismatch for item "%": expected %, got %',
31 NEW.preordered_item_name, v_menu_price, NEW.price_at_order;
32 END IF;
33
34 RETURN NEW;
35END;
36$$ LANGUAGE plpgsql;
37
38CREATE TRIGGER validate_preorder_price_trigger
39BEFORE INSERT OR UPDATE ON reservation_preordered_items
40FOR EACH ROW
41EXECUTE FUNCTION trg_validate_preorder_price();
42
43--Test cases
44
45INSERT INTO reservation_preordered_items (reservation_id, preordered_item_name, quantity, price_at_order)
46VALUES (22, 'California Roll', 1, 5.99);
47
48INSERT INTO reservation_preordered_items (reservation_id, preordered_item_name, quantity, price_at_order)
49VALUES (14, 'California Roll', 1, 5.99);
50
51INSERT INTO reservation_preordered_items (reservation_id, preordered_item_name, quantity, price_at_order)
52VALUES (14, 'Roll', 1, 8.99);
53
54INSERT INTO reservation_preordered_items (reservation_id, preordered_item_name, quantity, price_at_order)
55VALUES (14, 'California Roll', 0, 8.99);