1 | DROP TRIGGER IF EXISTS validate_preorder_price_trigger ON reservation_preordered_items;
|
---|
2 |
|
---|
3 | CREATE OR REPLACE FUNCTION trg_validate_preorder_price()
|
---|
4 | RETURNS TRIGGER AS $$
|
---|
5 | DECLARE
|
---|
6 | v_menu_price NUMERIC;
|
---|
7 | v_restaurant_id INTEGER;
|
---|
8 | BEGIN
|
---|
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;
|
---|
35 | END;
|
---|
36 | $$ LANGUAGE plpgsql;
|
---|
37 |
|
---|
38 | CREATE TRIGGER validate_preorder_price_trigger
|
---|
39 | BEFORE INSERT OR UPDATE ON reservation_preordered_items
|
---|
40 | FOR EACH ROW
|
---|
41 | EXECUTE FUNCTION trg_validate_preorder_price();
|
---|
42 |
|
---|
43 | --Test cases
|
---|
44 |
|
---|
45 | INSERT INTO reservation_preordered_items (reservation_id, preordered_item_name, quantity, price_at_order)
|
---|
46 | VALUES (22, 'California Roll', 1, 5.99);
|
---|
47 |
|
---|
48 | INSERT INTO reservation_preordered_items (reservation_id, preordered_item_name, quantity, price_at_order)
|
---|
49 | VALUES (14, 'California Roll', 1, 5.99);
|
---|
50 |
|
---|
51 | INSERT INTO reservation_preordered_items (reservation_id, preordered_item_name, quantity, price_at_order)
|
---|
52 | VALUES (14, 'Roll', 1, 8.99);
|
---|
53 |
|
---|
54 | INSERT INTO reservation_preordered_items (reservation_id, preordered_item_name, quantity, price_at_order)
|
---|
55 | VALUES (14, 'California Roll', 0, 8.99); |
---|