| 1 | == Тригери |
| 2 | |
| 3 | ===Бришење на возила |
| 4 | |
| 5 | Проверува дали е возилото веќе продадено пред да се избрише од оглас, т.е. дали е означено како продадено. Доколку е и онака е тргнато од оглас за јавноста меѓутоа мора да остани видливо во датабазата за претставништвото кое го огласило со цел за извештаи. |
| 6 | |
| 7 | {{{ |
| 8 | CREATE OR REPLACE FUNCTION prevent_sold_vehicle_deletion() |
| 9 | RETURNS TRIGGER AS $$ |
| 10 | BEGIN |
| 11 | IF OLD.status = false THEN |
| 12 | RAISE EXCEPTION 'Cannot delete sold vehicles. Vehicle with VIN % is already sold.', OLD.vin; |
| 13 | END IF; |
| 14 | RETURN OLD; |
| 15 | END; |
| 16 | $$ LANGUAGE plpgsql; |
| 17 | }}} |
| 18 | |
| 19 | ===Дупликат договори |
| 20 | |
| 21 | Спречува креирање на дупликат договор за едно возило, бидејќи доколку веќе има договор или е продадено или е во постапка на продавање и се чека уплата од клиентот. |
| 22 | {{{ |
| 23 | CREATE OR REPLACE FUNCTION prevent_duplicate_agreements() |
| 24 | RETURNS TRIGGER AS $$ |
| 25 | BEGIN |
| 26 | IF EXISTS ( |
| 27 | SELECT 1 FROM agreement |
| 28 | WHERE vin = NEW.vin AND a_id != NEW.a_id |
| 29 | ) THEN |
| 30 | RAISE EXCEPTION 'Vehicle with VIN % already has an agreement. Cannot create duplicate agreement.', NEW.vin; |
| 31 | END IF; |
| 32 | RETURN NEW; |
| 33 | END; |
| 34 | $$ LANGUAGE plpgsql; |
| 35 | |
| 36 | CREATE TRIGGER trg_prevent_duplicate_agreements |
| 37 | BEFORE INSERT ON agreement |
| 38 | FOR EACH ROW |
| 39 | EXECUTE FUNCTION prevent_duplicate_agreements(); |
| 40 | }}} |
| 41 | |
| 42 | ===Валидација на година на возилото |
| 43 | |
| 44 | Иако на frontend веќе имаме валидација за полињата (како и за година на возило), добро е да се има тригер и во самата база за да не се внесат несакани или погрешни информации. Овој тригер спречува внесување на невалидна година на возило. |
| 45 | {{{ |
| 46 | CREATE OR REPLACE FUNCTION validate_vehicle_year() |
| 47 | RETURNS TRIGGER AS $$ |
| 48 | BEGIN |
| 49 | IF NEW.p_year < 1900 OR NEW.p_year > EXTRACT(YEAR FROM NOW()) + 1 THEN |
| 50 | RAISE EXCEPTION 'Invalid production year: %. Year must be between 1900 and %', |
| 51 | NEW.p_year, EXTRACT(YEAR FROM NOW()) + 1; |
| 52 | END IF; |
| 53 | RETURN NEW; |
| 54 | END; |
| 55 | $$ LANGUAGE plpgsql; |
| 56 | |
| 57 | CREATE TRIGGER trg_validate_vehicle_year |
| 58 | BEFORE INSERT OR UPDATE ON vehicle |
| 59 | FOR EACH ROW |
| 60 | EXECUTE FUNCTION validate_vehicle_year(); |
| 61 | }}} |
| 62 | |
| 63 | ===Генерирање на договор |
| 64 | |
| 65 | Доколку не е внесен број на договор, овој тригер автоматски ќе внесе. |
| 66 | {{{ |
| 67 | CREATE OR REPLACE FUNCTION generate_agreement_id() |
| 68 | RETURNS TRIGGER AS $$ |
| 69 | BEGIN |
| 70 | IF NEW.a_id IS NULL OR NEW.a_id = '' THEN |
| 71 | NEW.a_id := 'AG' || LPAD(nextval('agreement_id_seq')::TEXT, 6, '0'); |
| 72 | END IF; |
| 73 | RETURN NEW; |
| 74 | END; |
| 75 | $$ LANGUAGE plpgsql; |
| 76 | }}} |