| 33 | | [[Image(Validate preorder price trigger.txt)]] |
| | 33 | {{{ |
| | 34 | CREATE OR REPLACE FUNCTION trg_validate_preorder_price() |
| | 35 | RETURNS TRIGGER AS $$ |
| | 36 | DECLARE |
| | 37 | v_menu_price NUMERIC; |
| | 38 | v_restaurant_id INTEGER; |
| | 39 | BEGIN |
| | 40 | SELECT restaurantid INTO v_restaurant_id |
| | 41 | FROM reservations |
| | 42 | WHERE reservationid = NEW.reservation_id; |
| | 43 | |
| | 44 | IF NOT FOUND THEN |
| | 45 | RAISE EXCEPTION 'Reservation ID % not found', NEW.reservation_id; |
| | 46 | END IF; |
| | 47 | |
| | 48 | SELECT price INTO v_menu_price |
| | 49 | FROM menus |
| | 50 | WHERE item_name = NEW.preordered_item_name AND restaurant_id = v_restaurant_id; |
| | 51 | |
| | 52 | IF NOT FOUND THEN |
| | 53 | RAISE EXCEPTION 'Menu item "%" not found for restaurant ID %', NEW.preordered_item_name, v_restaurant_id; |
| | 54 | END IF; |
| | 55 | |
| | 56 | IF NEW.quantity <= 0 THEN |
| | 57 | RAISE EXCEPTION 'Invalid quantity for item "%": must be greater than 0', NEW.preordered_item_name; |
| | 58 | END IF; |
| | 59 | |
| | 60 | IF NEW.price_at_order <> v_menu_price THEN |
| | 61 | RAISE EXCEPTION 'Price mismatch for item "%": expected %, got %', |
| | 62 | NEW.preordered_item_name, v_menu_price, NEW.price_at_order; |
| | 63 | END IF; |
| | 64 | |
| | 65 | RETURN NEW; |
| | 66 | END; |
| | 67 | $$ LANGUAGE plpgsql; |
| | 68 | |
| | 69 | CREATE TRIGGER validate_preorder_price_trigger |
| | 70 | BEFORE INSERT OR UPDATE ON reservation_preordered_items |
| | 71 | FOR EACH ROW |
| | 72 | EXECUTE FUNCTION trg_validate_preorder_price(); |
| | 73 | |
| | 74 | --Test cases |
| | 75 | |
| | 76 | INSERT INTO reservation_preordered_items (reservation_id, preordered_item_name, quantity, price_at_order) |
| | 77 | VALUES (22, 'California Roll', 1, 5.99); |
| | 78 | |
| | 79 | INSERT INTO reservation_preordered_items (reservation_id, preordered_item_name, quantity, price_at_order) |
| | 80 | VALUES (14, 'California Roll', 1, 5.99); |
| | 81 | |
| | 82 | INSERT INTO reservation_preordered_items (reservation_id, preordered_item_name, quantity, price_at_order) |
| | 83 | VALUES (14, 'Roll', 1, 8.99); |
| | 84 | |
| | 85 | INSERT INTO reservation_preordered_items (reservation_id, preordered_item_name, quantity, price_at_order) |
| | 86 | VALUES (14, 'California Roll', 0, 8.99); |
| | 87 | }}} |