| 1 | ------------------------------------------------------------------
|
|---|
| 2 | -- auto_set_reservation_status Marija
|
|---|
| 3 |
|
|---|
| 4 | CREATE FUNCTION auto_set_reservation_status()
|
|---|
| 5 | RETURNS TRIGGER AS $$
|
|---|
| 6 | BEGIN
|
|---|
| 7 | IF NEW.expiry_time < CURRENT_DATE THEN
|
|---|
| 8 | NEW.status := 'Expired';
|
|---|
| 9 | ELSE
|
|---|
| 10 | NEW.status := 'Active';
|
|---|
| 11 | END IF;
|
|---|
| 12 |
|
|---|
| 13 | RETURN NEW;
|
|---|
| 14 | END;
|
|---|
| 15 | $$ LANGUAGE plpgsql;
|
|---|
| 16 |
|
|---|
| 17 | CREATE TRIGGER trg_auto_set_reservation_status
|
|---|
| 18 | BEFORE INSERT OR UPDATE ON Reservation
|
|---|
| 19 | FOR EACH ROW
|
|---|
| 20 | EXECUTE FUNCTION auto_set_reservation_status();
|
|---|
| 21 |
|
|---|
| 22 | -------------------------------------------------------------
|
|---|
| 23 | --prevent_duplicate_seat_booking Nina
|
|---|
| 24 |
|
|---|
| 25 | CREATE FUNCTION prevent_duplicate_seat_booking()
|
|---|
| 26 | RETURNS TRIGGER AS $$
|
|---|
| 27 | DECLARE
|
|---|
| 28 | seat_exists INT;
|
|---|
| 29 | BEGIN
|
|---|
| 30 | SELECT COUNT(*)
|
|---|
| 31 | INTO seat_exists
|
|---|
| 32 | FROM Ticket
|
|---|
| 33 | WHERE seat_number = NEW.seat_number
|
|---|
| 34 | AND carriage_number = NEW.carriage_number
|
|---|
| 35 | AND "Train Triptrip_id" = NEW."Train Triptrip_id";
|
|---|
| 36 |
|
|---|
| 37 | IF seat_exists > 0 THEN
|
|---|
| 38 | RAISE EXCEPTION 'Seat already booked for this train trip!';
|
|---|
| 39 | END IF;
|
|---|
| 40 |
|
|---|
| 41 | RETURN NEW;
|
|---|
| 42 | END;
|
|---|
| 43 | $$ LANGUAGE plpgsql;
|
|---|
| 44 |
|
|---|
| 45 | CREATE TRIGGER trg_prevent_duplicate_seat_booking
|
|---|
| 46 | BEFORE INSERT ON Ticket
|
|---|
| 47 | FOR EACH ROW
|
|---|
| 48 | EXECUTE FUNCTION prevent_duplicate_seat_booking();
|
|---|
| 49 |
|
|---|
| 50 | ----------------------------------------------------------------------
|
|---|
| 51 | --update_trip_status_based_on_delay Nina
|
|---|
| 52 |
|
|---|
| 53 | CREATE FUNCTION update_trip_status_based_on_delay()
|
|---|
| 54 | RETURNS TRIGGER AS $$
|
|---|
| 55 | BEGIN
|
|---|
| 56 | IF NEW.delay_minutes > 0 THEN
|
|---|
| 57 | NEW.trip_status := 'Delayed';
|
|---|
| 58 | ELSE
|
|---|
| 59 | NEW.trip_status := 'On Time';
|
|---|
| 60 | END IF;
|
|---|
| 61 |
|
|---|
| 62 | RETURN NEW;
|
|---|
| 63 | END;
|
|---|
| 64 | $$ LANGUAGE plpgsql;
|
|---|
| 65 |
|
|---|
| 66 | CREATE TRIGGER trg_update_trip_status
|
|---|
| 67 | BEFORE INSERT OR UPDATE ON "Train Trip"
|
|---|
| 68 | FOR EACH ROW
|
|---|
| 69 | EXECUTE FUNCTION update_trip_status_based_on_delay();
|
|---|
| 70 |
|
|---|
| 71 | ----------------------------------------------------------------------------
|
|---|
| 72 | --auto_set_transaction_date Marija
|
|---|
| 73 |
|
|---|
| 74 | CREATE FUNCTION auto_set_transaction_date()
|
|---|
| 75 | RETURNS TRIGGER AS $$
|
|---|
| 76 | BEGIN
|
|---|
| 77 | IF NEW.transaction_date IS NULL THEN
|
|---|
| 78 | NEW.transaction_date := CURRENT_DATE;
|
|---|
| 79 | END IF;
|
|---|
| 80 |
|
|---|
| 81 | RETURN NEW;
|
|---|
| 82 | END;
|
|---|
| 83 | $$ LANGUAGE plpgsql;
|
|---|
| 84 |
|
|---|
| 85 | CREATE TRIGGER trg_auto_set_transaction_date
|
|---|
| 86 | BEFORE INSERT ON Payment
|
|---|
| 87 | FOR EACH ROW
|
|---|
| 88 | EXECUTE FUNCTION auto_set_transaction_date();
|
|---|
| 89 |
|
|---|
| 90 | ----------------------------------------------------------------------------------
|
|---|
| 91 | -- prevent_employee_trip_overlap Ana
|
|---|
| 92 |
|
|---|
| 93 | CREATE FUNCTION prevent_employee_trip_overlap()
|
|---|
| 94 | RETURNS TRIGGER AS $$
|
|---|
| 95 | DECLARE
|
|---|
| 96 | overlap_count INT;
|
|---|
| 97 | BEGIN
|
|---|
| 98 | SELECT COUNT(*)
|
|---|
| 99 | INTO overlap_count
|
|---|
| 100 | FROM "Train Trip"
|
|---|
| 101 | WHERE Employeeemployee_id = NEW.Employeeemployee_id
|
|---|
| 102 | AND EmployeePersonEMBG2 = NEW.EmployeePersonEMBG2
|
|---|
| 103 | AND departure_time = NEW.departure_time;
|
|---|
| 104 |
|
|---|
| 105 | IF overlap_count > 0 THEN
|
|---|
| 106 | RAISE EXCEPTION
|
|---|
| 107 | 'Employee already assigned to another trip at this time!';
|
|---|
| 108 | END IF;
|
|---|
| 109 |
|
|---|
| 110 | RETURN NEW;
|
|---|
| 111 | END;
|
|---|
| 112 | $$ LANGUAGE plpgsql;
|
|---|
| 113 |
|
|---|
| 114 | CREATE TRIGGER trg_prevent_employee_trip_overlap
|
|---|
| 115 | BEFORE INSERT ON "Train Trip"
|
|---|
| 116 | FOR EACH ROW
|
|---|
| 117 | EXECUTE FUNCTION prevent_employee_trip_overlap();
|
|---|
| 118 |
|
|---|
| 119 | ------------------------------------------------------------------------------
|
|---|
| 120 | -- prevent_station_delete_active_trip Ana
|
|---|
| 121 |
|
|---|
| 122 | CREATE FUNCTION prevent_station_delete_active_trip()
|
|---|
| 123 | RETURNS TRIGGER AS $$
|
|---|
| 124 | DECLARE
|
|---|
| 125 | trip_count INT;
|
|---|
| 126 | BEGIN
|
|---|
| 127 | SELECT COUNT(*)
|
|---|
| 128 | INTO trip_count
|
|---|
| 129 | FROM Ticket
|
|---|
| 130 | WHERE Stationstation_id = OLD.station_id
|
|---|
| 131 | OR Stationstation_id2 = OLD.station_id;
|
|---|
| 132 |
|
|---|
| 133 | IF trip_count > 0 THEN
|
|---|
| 134 | RAISE EXCEPTION
|
|---|
| 135 | 'Cannot delete station because tickets/trips reference it!';
|
|---|
| 136 | END IF;
|
|---|
| 137 |
|
|---|
| 138 | RETURN OLD;
|
|---|
| 139 | END;
|
|---|
| 140 | $$ LANGUAGE plpgsql;
|
|---|
| 141 |
|
|---|
| 142 | CREATE TRIGGER trg_prevent_station_delete_active_trip
|
|---|
| 143 | BEFORE DELETE ON Station
|
|---|
| 144 | FOR EACH ROW
|
|---|
| 145 | EXECUTE FUNCTION prevent_station_delete_active_trip();
|
|---|
| 146 |
|
|---|
| 147 | ---------------------------------------------------------------------------
|
|---|
| 148 | -- Ana
|
|---|
| 149 | CREATE OR REPLACE FUNCTION check_and_mark_overbooked()
|
|---|
| 150 | RETURNS TRIGGER
|
|---|
| 151 | LANGUAGE plpgsql
|
|---|
| 152 | AS $$
|
|---|
| 153 | DECLARE
|
|---|
| 154 | v_capacity INT;
|
|---|
| 155 | v_sold_tickets INT;
|
|---|
| 156 | BEGIN
|
|---|
| 157 | SELECT t.capacity
|
|---|
| 158 | INTO v_capacity
|
|---|
| 159 | FROM "Train Trip" tt
|
|---|
| 160 | JOIN Train t ON tt.Traintrain_id = t.train_id
|
|---|
| 161 | WHERE tt.trip_id = NEW."Train Triptrip_id";
|
|---|
| 162 |
|
|---|
| 163 | SELECT COUNT(*)
|
|---|
| 164 | INTO v_sold_tickets
|
|---|
| 165 | FROM Ticket
|
|---|
| 166 | WHERE "Train Triptrip_id" = NEW."Train Triptrip_id"
|
|---|
| 167 | AND ticket_status = 'Active';
|
|---|
| 168 |
|
|---|
| 169 | IF v_sold_tickets > v_capacity THEN
|
|---|
| 170 | UPDATE "Train Trip"
|
|---|
| 171 | SET trip_status = 'Overbooked'
|
|---|
| 172 | WHERE trip_id = NEW."Train Triptrip_id";
|
|---|
| 173 |
|
|---|
| 174 | RAISE NOTICE 'Trip % is OVERBOOKED automatically via Trigger. Capacity: %, Sold: %.',
|
|---|
| 175 | NEW."Train Triptrip_id", v_capacity, v_sold_tickets;
|
|---|
| 176 | END IF;
|
|---|
| 177 |
|
|---|
| 178 | RETURN NEW;
|
|---|
| 179 | END;
|
|---|
| 180 | $$; |
|---|