| | 119 | |
| | 120 | === `trg_buy_age` |
| | 121 | |
| | 122 | Овој тригер се активира при секој обид за купување билет за да ја заштити старосната граница на настанот. Спречува малолетни лица да купуваат билети за настани за кои не ја исполнуваат минималната возраст пропишана од организаторот. |
| | 123 | |
| | 124 | {{{ |
| | 125 | |
| | 126 | CREATE OR REPLACE FUNCTION func_age_gate() RETURNS TRIGGER AS $$ |
| | 127 | BEGIN |
| | 128 | IF (SELECT EXTRACT(YEAR FROM AGE(date_of_birth)) FROM "User" WHERE user_id = NEW.user_id) < |
| | 129 | (SELECT e.min_age FROM "Event" e JOIN "Event_Happening" eh ON e.event_id = eh.event_id JOIN "Ticket" t ON eh.event_happening_id = t.event_happening_id WHERE t.ticket_id = NEW.ticket_id) |
| | 130 | THEN RAISE EXCEPTION 'Access Denied: User age is below the minimum required for this event'; END IF; |
| | 131 | RETURN NEW; |
| | 132 | END; $$ LANGUAGE plpgsql; |
| | 133 | CREATE TRIGGER trg_buy_age BEFORE INSERT ON "Ticket_Purchase" FOR EACH ROW EXECUTE FUNCTION func_age_gate(); |
| | 134 | |
| | 135 | }}} |
| | 136 | |
| | 137 | === `trg_rate_check` |
| | 138 | |
| | 139 | Овој тригер обезбедува кредибилитет на рејтингот на настаните преку строга контрола на корисниците. Дозволува оставање на оценка само доколку корисникот има купено билет и истиот не е рефундиран. |
| | 140 | |
| | 141 | {{{ |
| | 142 | |
| | 143 | CREATE OR REPLACE FUNCTION func_rating_logic() RETURNS TRIGGER AS $$ |
| | 144 | BEGIN |
| | 145 | IF NOT EXISTS (SELECT 1 FROM "Ticket_Purchase" tp JOIN "Ticket" t ON tp.ticket_id = t.ticket_id |
| | 146 | WHERE tp.user_id = NEW.user_id AND t.event_happening_id = NEW.event_happening_id |
| | 147 | AND NOT EXISTS (SELECT 1 FROM "Ticket_Refund" tr WHERE tr.purchase_id = tp.purchase_id)) |
| | 148 | THEN RAISE EXCEPTION 'You must have a valid ticket and have attended the event to rate it'; END IF; |
| | 149 | RETURN NEW; |
| | 150 | END; $$ LANGUAGE plpgsql; |
| | 151 | CREATE TRIGGER trg_rate_check BEFORE INSERT ON "Event_Happening_Rating" FOR EACH ROW EXECUTE FUNCTION func_rating_logic(); |
| | 152 | |
| | 153 | }}} |
| | 154 | |
| | 155 | === `trg_period_check` |
| | 156 | |
| | 157 | Овој тригер спречува логички грешки при дефинирањето на промотивните периоди. Оневозможува поставување на датуми за попуст кои траат откако самиот настан веќе завршил. |
| | 158 | |
| | 159 | {{{ |
| | 160 | |
| | 161 | CREATE OR REPLACE FUNCTION func_period_val() RETURNS TRIGGER AS $$ |
| | 162 | BEGIN |
| | 163 | IF NEW.end_date > (SELECT event_time::DATE FROM "Event_Happening" WHERE event_happening_id = NEW.event_happening_id) |
| | 164 | THEN RAISE EXCEPTION 'Invalid Period: End date cannot be after the event occurrence date'; END IF; |
| | 165 | RETURN NEW; |
| | 166 | END; $$ LANGUAGE plpgsql; |
| | 167 | CREATE TRIGGER trg_period_check BEFORE INSERT OR UPDATE ON "Event_Period" FOR EACH ROW EXECUTE FUNCTION func_period_val(); |
| | 168 | |
| | 169 | }}} |
| | 170 | |
| | 171 | === `trg_venue_sync` |
| | 172 | |
| | 173 | Овој тригер ја одржува синхронизацијата на капацитетите преку повикување на хиерархиската функција. Ги блокира обидите за создавање секции кои би го надминале вкупниот број на седишта планиран за целиот објект. |
| | 174 | |
| | 175 | {{{ |
| | 176 | |
| | 177 | CREATE OR REPLACE FUNCTION func_sync_cap() RETURNS TRIGGER AS $$ |
| | 178 | BEGIN |
| | 179 | IF NOT fn_validate_hierarchy_capacity(NEW.venue_id, NEW.number_of_seats, 'VENUE_LIMIT') |
| | 180 | THEN RAISE EXCEPTION 'Capacity Error: New section exceeds total venue seat limit'; END IF; |
| | 181 | RETURN NEW; |
| | 182 | END; $$ LANGUAGE plpgsql; |
| | 183 | CREATE TRIGGER trg_venue_sync BEFORE INSERT OR UPDATE ON "Section" FOR EACH ROW EXECUTE FUNCTION func_sync_cap(); |
| | 184 | |
| | 185 | }}} |
| | 186 | |
| | 187 | === `trg_ticket_gate` |
| | 188 | |
| | 189 | Ова е тригер кој претставува бариера која спречува „overbooking“ на настаните. Оневозможува генерирање на повеќе билети од вкупниот физички капацитет на салата за секој поединечен термин. |
| | 190 | |
| | 191 | {{{ |
| | 192 | |
| | 193 | CREATE OR REPLACE FUNCTION func_ticket_cap() RETURNS TRIGGER AS $$ |
| | 194 | BEGIN |
| | 195 | IF (SELECT COUNT(*) FROM "Ticket" WHERE event_happening_id = NEW.event_happening_id) >= |
| | 196 | (SELECT number_of_seats FROM "Venue" v JOIN "Event_Happening" eh ON v.venue_id = eh.venue_id WHERE eh.event_happening_id = NEW.event_happening_id) |
| | 197 | THEN RAISE EXCEPTION 'Sold Out: Number of tickets cannot exceed the venue seat capacity'; END IF; |
| | 198 | RETURN NEW; |
| | 199 | END; $$ LANGUAGE plpgsql; |
| | 200 | CREATE TRIGGER trg_ticket_gate BEFORE INSERT ON "Ticket" FOR EACH ROW EXECUTE FUNCTION func_ticket_cap(); |
| | 201 | |
| | 202 | }}} |