| | 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 | }}} |