| 15 | | RETURNS TRIGGER |
| 16 | | LANGUAGE plpgsql |
| 17 | | AS $$ |
| 18 | | DECLARE |
| 19 | | v_id_zapisnik int; |
| 20 | | v_nov_iznos numeric(10,2); |
| 21 | | BEGIN |
| 22 | | IF TG_OP = 'DELETE' THEN |
| 23 | | v_id_zapisnik := OLD.id_na_zapisnik; |
| 24 | | ELSE |
| 25 | | v_id_zapisnik := NEW.id_na_zapisnik; |
| | 17 | RETURNS TRIGGER |
| | 18 | LANGUAGE plpgsql |
| | 19 | AS $$ |
| | 20 | DECLARE |
| | 21 | v_id_zapisnik int; |
| | 22 | v_nov_iznos numeric(10,2); |
| | 23 | BEGIN |
| | 24 | IF TG_OP = 'DELETE' THEN |
| | 25 | v_id_zapisnik := OLD.id_na_zapisnik; |
| | 26 | ELSE |
| | 27 | v_id_zapisnik := NEW.id_na_zapisnik; |
| | 28 | END IF; |
| | 29 | |
| | 30 | SELECT COALESCE(SUM(k.iznos_kazna), 0) |
| | 31 | INTO v_nov_iznos |
| | 32 | FROM Stavka_Zapisnik sz |
| | 33 | JOIN Prekrsok p ON sz.id_na_prekrsok = p.id_prekrsok |
| | 34 | JOIN Kazna k ON p.id_kazna = k.id_kazna |
| | 35 | WHERE sz.id_na_zapisnik = v_id_zapisnik; |
| | 36 | |
| | 37 | UPDATE Uplata |
| | 38 | SET iznos = v_nov_iznos |
| | 39 | WHERE id_zapisnik = v_id_zapisnik |
| | 40 | AND status = 'Neplateno'; |
| | 41 | |
| | 42 | IF TG_OP = 'DELETE' THEN |
| | 43 | RETURN OLD; |
| | 44 | ELSE |
| | 45 | RETURN NEW; |
| | 46 | END IF; |
| | 47 | END; |
| | 48 | $$; |
| | 49 | |
| | 50 | CREATE OR REPLACE TRIGGER trigger_azuriraj_iznos_uplata |
| | 51 | AFTER INSERT OR UPDATE OR DELETE ON Stavka_Zapisnik |
| | 52 | FOR EACH ROW |
| | 53 | EXECUTE FUNCTION azuriraj_iznos_uplata(); |
| | 54 | }}} |
| | 55 | |
| | 56 | === Тригер 2: === |
| | 57 | |
| | 58 | Овој тригер се извршува пред секое вметнување или измена на податоците во табелата `Raboti_vo` со цел да се зачува бизнис логиката на системот. Тој гарантира дека полицаецот кој се доделува навистина постои во базата и дека датумот на започнување со работа не е празен. Дополнително, тригерот спречува еден полициски службеник да има активен работен однос (каде `datum_do IS NULL`) во повеќе од една полициска станица истовремено. |
| | 59 | |
| | 60 | {{{#!sql |
| | 61 | CREATE OR REPLACE FUNCTION proverka_raboti_vo_integritet() |
| | 62 | RETURNS TRIGGER |
| | 63 | LANGUAGE plpgsql |
| | 64 | AS $$ |
| | 65 | BEGIN |
| | 66 | IF NOT EXISTS (SELECT 1 FROM Policaec WHERE EMBG_P = NEW.EMBG_P) THEN |
| | 67 | RAISE EXCEPTION 'Полицаецот со ЕМБГ % не постои во системот!', NEW.EMBG_P; |
| | 68 | END IF; |
| | 69 | |
| | 70 | IF NEW.datum_od IS NULL THEN |
| | 71 | RAISE EXCEPTION 'Почетокот на работниот однос (datum_od) мора да биде дефиниран!'; |
| | 72 | END IF; |
| | 73 | |
| | 74 | IF NEW.datum_do IS NULL THEN |
| | 75 | IF EXISTS ( |
| | 76 | SELECT 1 FROM Raboti_vo |
| | 77 | WHERE EMBG_P = NEW.EMBG_P AND datum_do IS NULL AND id_stanica <> NEW.id_stanica |
| | 78 | ) THEN |
| | 79 | RAISE EXCEPTION 'Полицаецот со ЕМБГ % веќе има активен работен ангажман во друга полициска станица!', NEW.EMBG_P; |
| 27 | | |
| 28 | | SELECT COALESCE(SUM(k.iznos_kazna), 0) |
| 29 | | INTO v_nov_iznos |
| 30 | | FROM Stavka_Zapisnik sz |
| 31 | | JOIN Prekrsok p ON sz.id_na_prekrsok = p.id_prekrsok |
| 32 | | JOIN Kazna k ON p.id_kazna = k.id_kazna |
| 33 | | WHERE sz.id_na_zapisnik = v_id_zapisnik; |
| 34 | | |
| 35 | | UPDATE Uplata |
| 36 | | SET iznos = v_nov_iznos |
| 37 | | WHERE id_zapisnik = v_id_zapisnik |
| 38 | | AND status = 'Neplateno'; |
| 39 | | |
| 40 | | IF TG_OP = 'DELETE' THEN |
| 41 | | RETURN OLD; |
| 42 | | ELSE |
| 43 | | RETURN NEW; |
| 44 | | END IF; |
| 45 | | END; |
| 46 | | $$; |
| 47 | | |
| 48 | | CREATE OR REPLACE TRIGGER trigger_azuriraj_iznos_uplata |
| 49 | | AFTER INSERT OR UPDATE OR DELETE ON Stavka_Zapisnik |
| 50 | | FOR EACH ROW |
| 51 | | EXECUTE FUNCTION azuriraj_iznos_uplata(); |
| 52 | | }}} |
| 53 | | |
| | 81 | END IF; |
| | 82 | |
| | 83 | RETURN NEW; |
| | 84 | END; |
| | 85 | $$; |
| | 86 | |
| | 87 | CREATE OR REPLACE TRIGGER trigger_proverka_raboti_vo |
| | 88 | BEFORE INSERT OR UPDATE ON Raboti_vo |
| | 89 | FOR EACH ROW |
| | 90 | EXECUTE FUNCTION proverka_raboti_vo_integritet(); |
| | 91 | }}} |
| | 92 | |
| | 93 | === Тригер 3: === |
| | 94 | |
| | 95 | Овој тригер е задолжен за проверка на интегритетот на податоците пред да се изврши вметнување или ажурирање во табелата `Registracija`. Тој прави соодветна валидација за постоење на сопственикот (граѓанинот) и самото возило преку нивните примарни клучеви. Како клучен дел од валидацијата, тригерот користи регуларен израз (REGEX) за да осигура дека регистарската табличка го следи официјалниот македонски стандард (на пр. SK-1234-AA или BT-888-ZZ). |
| | 96 | |
| | 97 | {{{#!sql |
| | 98 | CREATE OR REPLACE FUNCTION proverka_registracija_integritet() |
| | 99 | RETURNS TRIGGER |
| | 100 | LANGUAGE plpgsql |
| | 101 | AS $$ |
| | 102 | BEGIN |
| | 103 | IF NOT EXISTS (SELECT 1 FROM Gragjanin WHERE EMBG = NEW.EMBG) THEN |
| | 104 | RAISE EXCEPTION 'Граѓанинот со ЕМБГ % не постои во системот!', NEW.EMBG; |
| | 105 | END IF; |
| | 106 | |
| | 107 | IF NOT EXISTS (SELECT 1 FROM Vozilo WHERE broj_na_sasija = NEW.broj_na_sasija) THEN |
| | 108 | RAISE EXCEPTION 'Возилото со број на шасија % не постои во системот!', NEW.broj_na_sasija; |
| | 109 | END IF; |
| | 110 | |
| | 111 | IF NEW.registerska_tablica IS NOT NULL AND NOT (UPPER(NEW.registerska_tablica) ~ '^[A-Z]{2}-[0-9]{3,4}-[A-Z]{2}$') THEN |
| | 112 | RAISE EXCEPTION 'Регистарската табличка "%" не е во валиден формат! Очекуван формат: ZZ-0000-ZZ (напр. SK-1234-AA)', NEW.registerska_tablica; |
| | 113 | END IF; |
| | 114 | |
| | 115 | RETURN NEW; |
| | 116 | END; |
| | 117 | $$; |
| | 118 | |
| | 119 | CREATE OR REPLACE TRIGGER trigger_proverka_registracija |
| | 120 | BEFORE INSERT OR UPDATE ON Registracija |
| | 121 | FOR EACH ROW |
| | 122 | EXECUTE FUNCTION proverka_registracija_integritet(); |
| | 123 | }}} |
| 63 | | p_embg_prekrsuvac char(13), |
| 64 | | p_broj_sasija varchar(17), |
| 65 | | p_embg_policaec char(13), |
| 66 | | p_lokacija varchar(100), |
| 67 | | p_id_slucaj int, |
| 68 | | p_id_prekrsok int, |
| 69 | | p_vreme time DEFAULT CURRENT_TIME, |
| 70 | | p_datum date DEFAULT CURRENT_DATE, |
| 71 | | p_potpis boolean DEFAULT false |
| | 133 | p_embg_prekrsuvac char(13), |
| | 134 | p_broj_sasija varchar(17), |
| | 135 | p_embg_policaec char(13), |
| | 136 | p_lokacija varchar(100), |
| | 137 | p_id_slucaj int, |
| | 138 | p_id_prekrsok int, |
| | 139 | p_vreme time DEFAULT CURRENT_TIME, |
| | 140 | p_datum date DEFAULT CURRENT_DATE, |
| | 141 | p_potpis boolean DEFAULT false |
| 73 | | LANGUAGE plpgsql |
| 74 | | AS $$ |
| 75 | | DECLARE |
| 76 | | v_id_zapisnik int; |
| 77 | | BEGIN |
| 78 | | IF NOT EXISTS (SELECT 1 FROM Gragjanin WHERE EMBG = p_embg_prekrsuvac) THEN |
| 79 | | RAISE EXCEPTION 'Gragjaninot so EMBG % ne postoi!', p_embg_prekrsuvac; |
| 80 | | END IF; |
| 81 | | IF NOT EXISTS (SELECT 1 FROM Policaec WHERE EMBG_P = p_embg_policaec) THEN |
| 82 | | RAISE EXCEPTION 'Policaecot so EMBG % ne postoi!', p_embg_policaec; |
| 83 | | END IF; |
| 84 | | IF NOT EXISTS (SELECT 1 FROM Vozilo WHERE broj_na_sasija = p_broj_sasija) THEN |
| 85 | | RAISE EXCEPTION 'Voziloto so broj na sasija % ne postoi!', p_broj_sasija; |
| 86 | | END IF; |
| 87 | | IF NOT EXISTS (SELECT 1 FROM Prekrsok WHERE id_prekrsok = p_id_prekrsok) THEN |
| 88 | | RAISE EXCEPTION 'Prekrsokot so id % ne postoi!', p_id_prekrsok; |
| 89 | | END IF; |
| 90 | | IF NOT EXISTS (SELECT 1 FROM Slucaj WHERE id_slucaj = p_id_slucaj) THEN |
| 91 | | RAISE EXCEPTION 'Slucajot so id % ne postoi!', p_id_slucaj; |
| 92 | | END IF; |
| 93 | | |
| 94 | | INSERT INTO Zapisnik (vreme, datum, lokacija, Potpis, |
| 95 | | id_slucaj, EMBG_Prekrsuvach, Vozilo_Broj_Sasija, EMBG_Policaec) |
| 96 | | VALUES (p_vreme, p_datum, p_lokacija, p_potpis, |
| 97 | | p_id_slucaj, p_embg_prekrsuvac, p_broj_sasija, p_embg_policaec) |
| 98 | | RETURNING id_na_zapisnik INTO v_id_zapisnik; |
| 99 | | |
| 100 | | INSERT INTO Uplata (iznos, status, Uplatil_Gragjanin, id_zapisnik) |
| 101 | | VALUES (0, 'Neplateno', p_embg_prekrsuvac, v_id_zapisnik); |
| 102 | | |
| 103 | | INSERT INTO Stavka_Zapisnik (reden_broj, id_na_zapisnik, id_na_prekrsok) |
| 104 | | VALUES (1, v_id_zapisnik, p_id_prekrsok); |
| 105 | | |
| 106 | | RAISE NOTICE 'Kreiran zapisnik so id % so prv prekrsok %.', v_id_zapisnik, p_id_prekrsok; |
| | 143 | LANGUAGE plpgsql |
| | 144 | AS $$ |
| | 145 | DECLARE |
| | 146 | v_id_zapisnik int; |
| | 147 | BEGIN |
| | 148 | IF NOT EXISTS (SELECT 1 FROM Gragjanin WHERE EMBG = p_embg_prekrsuvac) THEN |
| | 149 | RAISE EXCEPTION 'Gragjaninot so EMBG % ne postoi!', p_embg_prekrsuvac; |
| | 150 | END IF; |
| | 151 | IF NOT EXISTS (SELECT 1 FROM Policaec WHERE EMBG_P = p_embg_policaec) THEN |
| | 152 | RAISE EXCEPTION 'Policaecot so EMBG % ne postoi!', p_embg_policaec; |
| | 153 | END IF; |
| | 154 | IF NOT EXISTS (SELECT 1 FROM Vozilo WHERE broj_na_sasija = p_broj_sasija) THEN |
| | 155 | RAISE EXCEPTION 'Voziloto so broj na sasija % ne postoi!', p_broj_sasija; |
| | 156 | END IF; |
| | 157 | IF NOT EXISTS (SELECT 1 FROM Prekrsok WHERE id_prekrsok = p_id_prekrsok) THEN |
| | 158 | RAISE EXCEPTION 'Prekrsokot so id % ne postoi!', p_id_prekrsok; |
| | 159 | END IF; |
| | 160 | IF NOT EXISTS (SELECT 1 FROM Slucaj WHERE id_slucaj = p_id_slucaj) THEN |
| | 161 | RAISE EXCEPTION 'Slucajot so id % ne postoi!', p_id_slucaj; |
| | 162 | END IF; |
| | 163 | |
| | 164 | INSERT INTO Zapisnik (vreme, datum, lokacija, Potpis, |
| | 165 | id_slucaj, EMBG_Prekrsuvach, Vozilo_Broj_Sasija, EMBG_Policaec) |
| | 166 | VALUES (p_vreme, p_datum, p_lokacija, p_potpis, |
| | 167 | p_id_slucaj, p_embg_prekrsuvac, p_broj_sasija, p_embg_policaec) |
| | 168 | RETURNING id_na_zapisnik INTO v_id_zapisnik; |
| | 169 | |
| | 170 | INSERT INTO Uplata (iznos, status, Uplatil_Gragjanin, id_zapisnik) |
| | 171 | VALUES (0, 'Neplateno', p_embg_prekrsuvac, v_id_zapisnik); |
| | 172 | |
| | 173 | INSERT INTO Stavka_Zapisnik (reden_broj, id_na_zapisnik, id_na_prekrsok) |
| | 174 | VALUES (1, v_id_zapisnik, p_id_prekrsok); |
| | 175 | |
| | 176 | RAISE NOTICE 'Kreiran zapisnik so id % so prv prekrsok %.', v_id_zapisnik, p_id_prekrsok; |
| 128 | | LANGUAGE plpgsql |
| 129 | | AS $$ |
| 130 | | DECLARE |
| 131 | | v_reden_broj int; |
| 132 | | v_status_uplata varchar(30); |
| 133 | | BEGIN |
| 134 | | IF NOT EXISTS (SELECT 1 FROM Zapisnik WHERE id_na_zapisnik = p_id_zapisnik) THEN |
| 135 | | RAISE EXCEPTION 'Zapisnikot so id % ne postoi!', p_id_zapisnik; |
| 136 | | END IF; |
| 137 | | IF NOT EXISTS (SELECT 1 FROM Prekrsok WHERE id_prekrsok = p_id_prekrsok) THEN |
| 138 | | RAISE EXCEPTION 'Prekrsokot so id % ne postoi!', p_id_prekrsok; |
| 139 | | END IF; |
| 140 | | |
| 141 | | SELECT status INTO v_status_uplata |
| 142 | | FROM Uplata WHERE id_zapisnik = p_id_zapisnik; |
| 143 | | |
| 144 | | IF v_status_uplata = 'Plateno' THEN |
| 145 | | RAISE EXCEPTION 'Zapisnik % e vekje platen, ne moze da se dodavaat novi stavki!', p_id_zapisnik; |
| 146 | | END IF; |
| 147 | | |
| 148 | | SELECT COALESCE(MAX(reden_broj), 0) + 1 INTO v_reden_broj |
| 149 | | FROM Stavka_Zapisnik WHERE id_na_zapisnik = p_id_zapisnik; |
| 150 | | |
| 151 | | INSERT INTO Stavka_Zapisnik (reden_broj, id_na_zapisnik, id_na_prekrsok) |
| 152 | | VALUES (v_reden_broj, p_id_zapisnik, p_id_prekrsok); |
| 153 | | |
| 154 | | RAISE NOTICE 'Dodadena stavka so reden_broj % vo zapisnik %.', v_reden_broj, p_id_zapisnik; |
| | 197 | LANGUAGE plpgsql |
| | 198 | AS $$ |
| | 199 | DECLARE |
| | 200 | v_reden_broj int; |
| | 201 | v_status_uplata varchar(30); |
| | 202 | BEGIN |
| | 203 | IF NOT EXISTS (SELECT 1 FROM Zapisnik WHERE id_na_zapisnik = p_id_zapisnik) THEN |
| | 204 | RAISE EXCEPTION 'Zapisnikot so id % ne postoi!', p_id_zapisnik; |
| | 205 | END IF; |
| | 206 | IF NOT EXISTS (SELECT 1 FROM Prekrsok WHERE id_prekrsok = p_id_prekrsok) THEN |
| | 207 | RAISE EXCEPTION 'Prekrsokot so id % ne postoi!', p_id_prekrsok; |
| | 208 | END IF; |
| | 209 | |
| | 210 | SELECT status INTO v_status_uplata |
| | 211 | FROM Uplata WHERE id_zapisnik = p_id_zapisnik; |
| | 212 | |
| | 213 | IF v_status_uplata = 'Plateno' THEN |
| | 214 | RAISE EXCEPTION 'Zapisnik % e vekje platen, ne moze da se dodavaat novi stavki!', p_id_zapisnik; |
| | 215 | END IF; |
| | 216 | |
| | 217 | SELECT COALESCE(MAX(reden_broj), 0) + 1 INTO v_reden_broj |
| | 218 | FROM Stavka_Zapisnik WHERE id_na_zapisnik = p_id_zapisnik; |
| | 219 | |
| | 220 | INSERT INTO Stavka_Zapisnik (reden_broj, id_na_zapisnik, id_na_prekrsok) |
| | 221 | VALUES (v_reden_broj, p_id_zapisnik, p_id_prekrsok); |
| | 222 | |
| | 223 | RAISE NOTICE 'Dodadena stavka so reden_broj % vo zapisnik %.', v_reden_broj, p_id_zapisnik; |
| 173 | | LANGUAGE plpgsql |
| 174 | | AS $$ |
| 175 | | DECLARE |
| 176 | | v_status varchar(30); |
| 177 | | v_iznos numeric(10,2); |
| 178 | | BEGIN |
| 179 | | SELECT status, iznos INTO v_status, v_iznos |
| 180 | | FROM Uplata WHERE id_zapisnik = p_id_zapisnik; |
| 181 | | |
| 182 | | IF v_status IS NULL THEN |
| 183 | | RAISE EXCEPTION 'Ne postoi uplata za zapisnik %!', p_id_zapisnik; |
| 184 | | END IF; |
| 185 | | IF v_status = 'Plateno' THEN |
| 186 | | RAISE EXCEPTION 'Kaznata za zapisnik % e vekje platena!', p_id_zapisnik; |
| 187 | | END IF; |
| 188 | | IF v_iznos <= 0 THEN |
| 189 | | RAISE EXCEPTION 'Zapisnikot % nema stavki/kazni za naplata!', p_id_zapisnik; |
| 190 | | END IF; |
| 191 | | IF p_nacin_plakanje NOT IN ('E-bankarstvo', 'Platezna karticka', 'Gotovo/Uplatnica') THEN |
| 192 | | RAISE EXCEPTION 'Nepoznat nacin na plakanje: %.', p_nacin_plakanje; |
| 193 | | END IF; |
| 194 | | |
| 195 | | UPDATE Uplata |
| 196 | | SET status = 'Plateno', |
| 197 | | datum_uplata = CURRENT_DATE, |
| 198 | | nacin_plakanje = p_nacin_plakanje |
| 199 | | WHERE id_zapisnik = p_id_zapisnik; |
| 200 | | |
| 201 | | RAISE NOTICE 'Uspesno naplatena kazna od % za zapisnik % (%).', v_iznos, p_id_zapisnik, p_nacin_plakanje; |
| | 241 | LANGUAGE plpgsql |
| | 242 | AS $$ |
| | 243 | DECLARE |
| | 244 | v_status varchar(30); |
| | 245 | v_iznos numeric(10,2); |
| | 246 | BEGIN |
| | 247 | SELECT status, iznos INTO v_status, v_iznos |
| | 248 | FROM Uplata WHERE id_zapisnik = p_id_zapisnik; |
| | 249 | |
| | 250 | IF v_status IS NULL THEN |
| | 251 | RAISE EXCEPTION 'Ne postoi uplata za zapisnik %!', p_id_zapisnik; |
| | 252 | END IF; |
| | 253 | IF v_status = 'Plateno' THEN |
| | 254 | RAISE EXCEPTION 'Kaznata za zapisnik % e vekje platena!', p_id_zapisnik; |
| | 255 | END IF; |
| | 256 | IF v_iznos <= 0 THEN |
| | 257 | RAISE EXCEPTION 'Zapisnikot % nema stavki/kazni za naplata!', p_id_zapisnik; |
| | 258 | END IF; |
| | 259 | IF p_nacin_plakanje NOT IN ('E-bankarstvo', 'Platezna karticka', 'Gotovo/Uplatnica') THEN |
| | 260 | RAISE EXCEPTION 'Nepoznat nacin na plakanje: %.', p_nacin_plakanje; |
| | 261 | END IF; |
| | 262 | |
| | 263 | UPDATE Uplata |
| | 264 | SET status = 'Plateno', |
| | 265 | datum_uplata = CURRENT_DATE, |
| | 266 | nacin_plakanje = p_nacin_plakanje |
| | 267 | WHERE id_zapisnik = p_id_zapisnik; |
| | 268 | |
| | 269 | RAISE NOTICE 'Uspesno naplatena kazna od % za zapisnik % (%).', v_iznos, p_id_zapisnik, p_nacin_plakanje; |
| 221 | | LANGUAGE plpgsql |
| 222 | | AS $$ |
| 223 | | DECLARE |
| 224 | | v_datum_vaznost_do date; |
| 225 | | v_datum_izdavanje date; |
| 226 | | v_kod_kategorija varchar(3); |
| 227 | | BEGIN |
| 228 | | SELECT datum_vaznost_do, datum_izdavanje |
| 229 | | INTO v_datum_vaznost_do, v_datum_izdavanje |
| 230 | | FROM Vozacka_dozvola WHERE broj_dozvola = p_broj_dozvola; |
| 231 | | |
| 232 | | IF v_datum_vaznost_do IS NULL THEN |
| 233 | | RAISE EXCEPTION 'Vozackata dozvola so broj % ne postoi!', p_broj_dozvola; |
| 234 | | END IF; |
| 235 | | IF v_datum_vaznost_do < CURRENT_DATE THEN |
| 236 | | RAISE EXCEPTION 'Vozackata dozvola % e istechena (vaznost do %)!', p_broj_dozvola, v_datum_vaznost_do; |
| 237 | | END IF; |
| 238 | | |
| 239 | | SELECT kod INTO v_kod_kategorija |
| 240 | | FROM Kategorija WHERE id_kategorija = p_id_kategorija; |
| 241 | | |
| 242 | | IF v_kod_kategorija IS NULL THEN |
| 243 | | RAISE EXCEPTION 'Kategorijata so id % ne postoi!', p_id_kategorija; |
| 244 | | END IF; |
| 245 | | |
| 246 | | IF EXISTS ( |
| 247 | | SELECT 1 FROM Kategorija_Vozacka_dozvola |
| 248 | | WHERE broj_dozvola = p_broj_dozvola AND id_kategorija = p_id_kategorija |
| 249 | | ) THEN |
| 250 | | RAISE EXCEPTION 'Kategorijata % vekje e dodadena na vozackata %!', v_kod_kategorija, p_broj_dozvola; |
| 251 | | END IF; |
| 252 | | |
| 253 | | IF p_datum_polaganje > CURRENT_DATE THEN |
| 254 | | RAISE EXCEPTION 'Datumot na polaganje % ne moze da bide vo idnina!', p_datum_polaganje; |
| 255 | | END IF; |
| 256 | | IF p_datum_polaganje < v_datum_izdavanje THEN |
| 257 | | RAISE EXCEPTION 'Datumot na polaganje % ne moze da bide pred izdavanjeto na vozackata (%).', |
| 258 | | p_datum_polaganje, v_datum_izdavanje; |
| 259 | | END IF; |
| 260 | | |
| 261 | | INSERT INTO Kategorija_Vozacka_dozvola (id_kategorija, broj_dozvola, datum_polaganje) |
| 262 | | VALUES (p_id_kategorija, p_broj_dozvola, p_datum_polaganje); |
| 263 | | |
| 264 | | RAISE NOTICE 'Uspesno dodadena kategorija % na vozackata %.', v_kod_kategorija, p_broj_dozvola; |
| | 288 | LANGUAGE plpgsql |
| | 289 | AS $$ |
| | 290 | DECLARE |
| | 291 | v_datum_vaznost_do date; |
| | 292 | v_datum_izdavanje date; |
| | 293 | v_kod_kategorija varchar(3); |
| | 294 | BEGIN |
| | 295 | SELECT datum_vaznost_do, datum_izdavanje |
| | 296 | INTO v_datum_vaznost_do, v_datum_izdavanje |
| | 297 | FROM Vozacka_dozvola WHERE broj_dozvola = p_broj_dozvola; |
| | 298 | |
| | 299 | IF v_datum_vaznost_do IS NULL THEN |
| | 300 | RAISE EXCEPTION 'Vozackata dozvola so broj % ne postoi!', p_broj_dozvola; |
| | 301 | END IF; |
| | 302 | IF v_datum_vaznost_do < CURRENT_DATE THEN |
| | 303 | RAISE EXCEPTION 'Vozackata dozvola % e istechena (vaznost do %)!', p_broj_dozvola, v_datum_vaznost_do; |
| | 304 | END IF; |
| | 305 | |
| | 306 | SELECT kod INTO v_kod_kategorija |
| | 307 | FROM Kategorija WHERE id_kategorija = p_id_kategorija; |
| | 308 | |
| | 309 | IF v_kod_kategorija IS NULL THEN |
| | 310 | RAISE EXCEPTION 'Kategorijata so id % ne postoi!', p_id_kategorija; |
| | 311 | END IF; |
| | 312 | |
| | 313 | IF EXISTS ( |
| | 314 | SELECT 1 FROM Kategorija_Vozacka_dozvola |
| | 315 | WHERE broj_dozvola = p_broj_dozvola AND id_kategorija = p_id_kategorija |
| | 316 | ) THEN |
| | 317 | RAISE EXCEPTION 'Kategorijata % vekje e dodadena na vozackata %!', v_kod_kategorija, p_broj_dozvola; |
| | 318 | END IF; |
| | 319 | |
| | 320 | IF p_datum_polaganje > CURRENT_DATE THEN |
| | 321 | RAISE EXCEPTION 'Datumot na polaganje % ne moze da bide vo idnina!', p_datum_polaganje; |
| | 322 | END IF; |
| | 323 | IF p_datum_polaganje < v_datum_izdavanje THEN |
| | 324 | RAISE EXCEPTION 'Datumot na polaganje % ne moze da bide pred izdavanjeto na vozackata (%).', |
| | 325 | p_datum_polaganje, v_datum_izdavanje; |
| | 326 | END IF; |
| | 327 | |
| | 328 | INSERT INTO Kategorija_Vozacka_dozvola (id_kategorija, broj_dozvola, datum_polaganje) |
| | 329 | VALUES (p_id_kategorija, p_broj_dozvola, p_datum_polaganje); |
| | 330 | |
| | 331 | RAISE NOTICE 'Uspesno dodadena kategorija % na vozackata %.', v_kod_kategorija, p_broj_dozvola; |
| 291 | | RETURNS text |
| 292 | | LANGUAGE plpgsql |
| 293 | | AS $$ |
| 294 | | BEGIN |
| 295 | | UPDATE Uplata u |
| 296 | | SET iznos = u.iznos + (u.iznos * 0.50), |
| 297 | | kazna_zgolemena = true |
| 298 | | FROM Zapisnik z |
| 299 | | WHERE u.id_zapisnik = z.id_na_zapisnik |
| 300 | | AND u.status = 'Neplateno' |
| 301 | | AND u.kazna_zgolemena = false |
| 302 | | AND z.datum < CURRENT_DATE - INTERVAL '8 days'; |
| 303 | | |
| 304 | | UPDATE Uplata u |
| 305 | | SET status = 'Sudska_postapka' |
| 306 | | FROM Zapisnik z |
| 307 | | WHERE u.id_zapisnik = z.id_na_zapisnik |
| 308 | | AND u.status = 'Neplateno' |
| 309 | | AND z.datum < CURRENT_DATE - INTERVAL '2 months'; |
| 310 | | |
| 311 | | RETURN 'Постапката за автоматско ажурирање на неплатените казни е успешно извршена.'; |
| | 357 | RETURNS text |
| | 358 | LANGUAGE plpgsql |
| | 359 | AS $$ |
| | 360 | BEGIN |
| | 361 | UPDATE Uplata u |
| | 362 | SET iznos = u.iznos + (u.iznos * 0.50), |
| | 363 | kazna_zgolemena = true |
| | 364 | FROM Zapisnik z |
| | 365 | WHERE u.id_zapisnik = z.id_na_zapisnik |
| | 366 | AND u.status = 'Neplateno' |
| | 367 | AND u.kazna_zgolemena = false |
| | 368 | AND z.datum < CURRENT_DATE - INTERVAL '8 days'; |
| | 369 | |
| | 370 | UPDATE Uplata u |
| | 371 | SET status = 'Sudska_postapka' |
| | 372 | FROM Zapisnik z |
| | 373 | WHERE u.id_zapisnik = z.id_na_zapisnik |
| | 374 | AND u.status = 'Neplateno' |
| | 375 | AND z.datum < CURRENT_DATE - INTERVAL '2 months'; |
| | 376 | |
| | 377 | RETURN 'Постапката за автоматско ажурирање на неплатените казни е успешно извршена.'; |