| 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); |
|---|