| 1 | -- автоматски означи билет за EXPIRED
|
|---|
| 2 | CREATE OR REPLACE FUNCTION trg_expire_ticket()
|
|---|
| 3 | RETURNS TRIGGER AS $$
|
|---|
| 4 | BEGIN
|
|---|
| 5 | IF NEW.STATUS = 'VALID' AND NEW.PURCHASE_DATE < CURRENT_DATE - INTERVAL '1 day' THEN
|
|---|
| 6 | NEW.STATUS := 'EXPIRED';
|
|---|
| 7 | END IF;
|
|---|
| 8 | RETURN NEW;
|
|---|
| 9 | END;
|
|---|
| 10 | $$ LANGUAGE plpgsql;
|
|---|
| 11 |
|
|---|
| 12 | CREATE TRIGGER trg_ticket_expire
|
|---|
| 13 | BEFORE INSERT OR UPDATE ON TICKET
|
|---|
| 14 | FOR EACH ROW EXECUTE FUNCTION trg_expire_ticket();
|
|---|
| 15 |
|
|---|
| 16 |
|
|---|
| 17 | --спречи бришење на активно возење
|
|---|
| 18 | CREATE OR REPLACE FUNCTION trg_prevent_vehicle_delete()
|
|---|
| 19 | RETURNS TRIGGER AS $$
|
|---|
| 20 | BEGIN
|
|---|
| 21 | IF EXISTS (
|
|---|
| 22 | SELECT 1 FROM TRIP
|
|---|
| 23 | WHERE VEHICLE_ID = OLD.VEHICLE_ID
|
|---|
| 24 | AND STATUS IN ('SCHEDULED', 'IN_PROGRESS')
|
|---|
| 25 | ) THEN
|
|---|
| 26 | RAISE EXCEPTION 'Не може да се избрише возило % — има активни возења.', OLD.VEHICLE_ID;
|
|---|
| 27 | END IF;
|
|---|
| 28 | RETURN OLD;
|
|---|
| 29 | END;
|
|---|
| 30 | $$ LANGUAGE plpgsql;
|
|---|
| 31 |
|
|---|
| 32 | CREATE TRIGGER trg_vehicle_delete
|
|---|
| 33 | BEFORE DELETE ON VEHICLE
|
|---|
| 34 | FOR EACH ROW EXECUTE FUNCTION trg_prevent_vehicle_delete();
|
|---|
| 35 |
|
|---|
| 36 |
|
|---|
| 37 | --автоматски постави статус на pass на EXPIRED
|
|---|
| 38 | CREATE OR REPLACE FUNCTION trg_expire_pass()
|
|---|
| 39 | RETURNS TRIGGER AS $$
|
|---|
| 40 | BEGIN
|
|---|
| 41 | IF NEW.END_DATE < CURRENT_DATE AND NEW.STATUS = 'ACTIVE' THEN
|
|---|
| 42 | NEW.STATUS := 'EXPIRED';
|
|---|
| 43 | END IF;
|
|---|
| 44 | RETURN NEW;
|
|---|
| 45 | END;
|
|---|
| 46 | $$ LANGUAGE plpgsql;
|
|---|
| 47 |
|
|---|
| 48 | CREATE TRIGGER trg_pass_expire
|
|---|
| 49 | BEFORE INSERT OR UPDATE ON SUBSCRIPTION_PASS
|
|---|
| 50 | FOR EACH ROW EXECUTE FUNCTION trg_expire_pass();
|
|---|
| 51 |
|
|---|
| 52 |
|
|---|
| 53 | --спречи двојно закажување на возач
|
|---|
| 54 | CREATE OR REPLACE FUNCTION trg_prevent_driver_double_schedule()
|
|---|
| 55 | RETURNS TRIGGER AS $$
|
|---|
| 56 | BEGIN
|
|---|
| 57 | IF EXISTS (
|
|---|
| 58 | SELECT 1 FROM DRIVER_SCHEDULE
|
|---|
| 59 | WHERE DRIVER_ID = NEW.DRIVER_ID
|
|---|
| 60 | AND SCHEDULE_DATE = NEW.SCHEDULE_DATE
|
|---|
| 61 | AND DRIVER_SCHEDULE_ID != COALESCE(NEW.DRIVER_SCHEDULE_ID, -1)
|
|---|
| 62 | ) THEN
|
|---|
| 63 | RAISE EXCEPTION 'Возачот % веќе е закажан за %.', NEW.DRIVER_ID, NEW.SCHEDULE_DATE;
|
|---|
| 64 | END IF;
|
|---|
| 65 | RETURN NEW;
|
|---|
| 66 | END;
|
|---|
| 67 | $$ LANGUAGE plpgsql;
|
|---|
| 68 |
|
|---|
| 69 | CREATE TRIGGER trg_driver_double_schedule
|
|---|
| 70 | BEFORE INSERT OR UPDATE ON DRIVER_SCHEDULE
|
|---|
| 71 | FOR EACH ROW EXECUTE FUNCTION trg_prevent_driver_double_schedule();
|
|---|
| 72 |
|
|---|
| 73 |
|
|---|
| 74 | --автоматска нотификација при ново доцнење
|
|---|
| 75 | CREATE OR REPLACE FUNCTION trg_notify_on_delay()
|
|---|
| 76 | RETURNS TRIGGER AS $$
|
|---|
| 77 | BEGIN
|
|---|
| 78 | INSERT INTO NOTIFICATION (PASSENGER_ID, TRIP_ID, DELAY_LOG_ID, MESSAGE, NOTIFICATION_TYPE, STATUS)
|
|---|
| 79 | SELECT DISTINCT
|
|---|
| 80 | tk.PASSENGER_ID,
|
|---|
| 81 | NEW.TRIP_ID,
|
|---|
| 82 | NEW.DELAY_ID,
|
|---|
| 83 | 'Возењето доцни ' || NEW.DELAY_MINUTES || ' мин. Причина: ' || NEW.DELAY_REASON,
|
|---|
| 84 | 'DELAY',
|
|---|
| 85 | 'PENDING'
|
|---|
| 86 | FROM TICKET tk
|
|---|
| 87 | WHERE tk.TRIP_ID = NEW.TRIP_ID
|
|---|
| 88 | AND tk.STATUS = 'VALID';
|
|---|
| 89 |
|
|---|
| 90 | RETURN NEW;
|
|---|
| 91 | END;
|
|---|
| 92 | $$ LANGUAGE plpgsql;
|
|---|
| 93 |
|
|---|
| 94 | CREATE TRIGGER trg_delay_notification
|
|---|
| 95 | AFTER INSERT ON DELAY_LOG
|
|---|
| 96 | FOR EACH ROW EXECUTE FUNCTION trg_notify_on_delay();
|
|---|
| 97 |
|
|---|
| 98 |
|
|---|
| 99 | --провери дали возилото е активно пред да се закаже ново возење
|
|---|
| 100 | CREATE OR REPLACE FUNCTION trg_check_vehicle_active()
|
|---|
| 101 | RETURNS TRIGGER AS $$
|
|---|
| 102 | DECLARE
|
|---|
| 103 | v_status VARCHAR;
|
|---|
| 104 | BEGIN
|
|---|
| 105 | SELECT STATUS INTO v_status
|
|---|
| 106 | FROM VEHICLE
|
|---|
| 107 | WHERE VEHICLE_ID = NEW.VEHICLE_ID;
|
|---|
| 108 |
|
|---|
| 109 | IF v_status != 'ACTIVE' THEN
|
|---|
| 110 | RAISE EXCEPTION 'Возилото % не е активно (статус: %).', NEW.VEHICLE_ID, v_status;
|
|---|
| 111 | END IF;
|
|---|
| 112 |
|
|---|
| 113 | RETURN NEW;
|
|---|
| 114 | END;
|
|---|
| 115 | $$ LANGUAGE plpgsql;
|
|---|
| 116 |
|
|---|
| 117 | CREATE TRIGGER trg_trip_vehicle_active
|
|---|
| 118 | BEFORE INSERT ON TRIP
|
|---|
| 119 | FOR EACH ROW EXECUTE FUNCTION trg_check_vehicle_active(); |
|---|