| 5 | | Во оваа фаза се надоградуваме со функции и процедури што ќе помогнат дел од честите операции во базата-отворање записник, додавање прекршок, наплата на казна, додавање категорија на возачка-да се извршуваат преку еден повик, со сите потребни проверки веќе вградени во нив. Исто така искористивме и тригери за работите што треба да се случуваат автоматски, како пресметката на вкупниот износ во уплатата и строга контрола на интегритетот, без рачно ажурирање.[[BR]] |
| | 5 | Во оваа фаза се надоградуваме со функции и процедури што ќе помогнат дел од честите операции во базата-отворање записник, додавање прекршок, наплата на казна, затворање записник по платена казна, додавање категорија на возачка-да се извршуваат преку еден повик, со сите потребни проверки веќе вградени во нив. Исто така искористивме и тригери за работите што треба да се случуваат автоматски, како пресметката на вкупниот износ во уплатата и строга контрола на интегритетот, без рачно ажурирање.[[BR]] |
| 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; |
| | 102 | DECLARE |
| | 103 | v_tablica text; |
| | 104 | BEGIN |
| | 105 | IF NOT EXISTS (SELECT 1 FROM Sopstvenost WHERE id_sopstvenost = NEW.id_sopstvenost) THEN |
| | 106 | RAISE EXCEPTION 'Сопственоста со id % не постои во системот!', NEW.id_sopstvenost; |
| | 107 | END IF; |
| | 108 | |
| | 109 | IF NEW.id_tablica IS NOT NULL THEN |
| | 110 | SELECT region || '-' || broj || '-' || kod |
| | 111 | INTO v_tablica |
| | 112 | FROM Registerska_tablica |
| | 113 | WHERE id_tablica = NEW.id_tablica; |
| | 114 | |
| | 115 | IF v_tablica IS NULL THEN |
| | 116 | RAISE EXCEPTION 'Регистарската табличка со id % не постои!', NEW.id_tablica; |
| | 117 | END IF; |
| | 118 | |
| | 119 | IF NOT (UPPER(v_tablica) ~ '^[A-Z]{2,3}-[0-9]{3,4}-[A-Z]{2}$') THEN |
| | 120 | RAISE EXCEPTION 'Регистарската табличка "%" не е во валиден формат! Очекуван формат: ZZ-0000-ZZ (напр. SK-1234-AA)', v_tablica; |
| | 121 | END IF; |
| | 351 | === Процедура 5: zatvori_zapisnik_po_uplata === |
| | 352 | Го затвора записникот (`status_zapisnik` → 'Zatvoren') откако казната за него е платена. Дозволува затворање само ако постои уплата за записникот и нејзиниот статус е 'Plateno'; не дозволува повторно затворање на веќе затворен записник. Вообичаено се повикува веднаш по `plati_kazna`. |
| | 353 | |
| | 354 | {{{#!sql |
| | 355 | CREATE OR REPLACE PROCEDURE zatvori_zapisnik_po_uplata( |
| | 356 | p_id_zapisnik int |
| | 357 | ) |
| | 358 | LANGUAGE plpgsql |
| | 359 | AS $$ |
| | 360 | DECLARE |
| | 361 | v_status_uplata varchar(30); |
| | 362 | v_status_zapisnik varchar(20); |
| | 363 | BEGIN |
| | 364 | SELECT status_zapisnik INTO v_status_zapisnik |
| | 365 | FROM Zapisnik WHERE id_na_zapisnik = p_id_zapisnik; |
| | 366 | |
| | 367 | IF v_status_zapisnik IS NULL THEN |
| | 368 | RAISE EXCEPTION 'Zapisnikot so id % ne postoi!', p_id_zapisnik; |
| | 369 | END IF; |
| | 370 | IF v_status_zapisnik = 'Zatvoren' THEN |
| | 371 | RAISE EXCEPTION 'Zapisnikot % e vekje zatvoren!', p_id_zapisnik; |
| | 372 | END IF; |
| | 373 | |
| | 374 | SELECT status INTO v_status_uplata |
| | 375 | FROM Uplata WHERE id_zapisnik = p_id_zapisnik; |
| | 376 | |
| | 377 | IF v_status_uplata IS NULL THEN |
| | 378 | RAISE EXCEPTION 'Ne postoi uplata za zapisnik %!', p_id_zapisnik; |
| | 379 | END IF; |
| | 380 | IF v_status_uplata <> 'Plateno' THEN |
| | 381 | RAISE EXCEPTION 'Zapisnikot % ne moze da se zatvori bidejki uplatata e so status "%" (mora da bide Plateno)!', |
| | 382 | p_id_zapisnik, v_status_uplata; |
| | 383 | END IF; |
| | 384 | |
| | 385 | UPDATE Zapisnik |
| | 386 | SET status_zapisnik = 'Zatvoren' |
| | 387 | WHERE id_na_zapisnik = p_id_zapisnik; |
| | 388 | |
| | 389 | RAISE NOTICE 'Zapisnik % e zatvoren po izvrshena uplata.', p_id_zapisnik; |
| | 390 | END; |
| | 391 | $$; |
| | 392 | }}} |
| | 393 | |
| | 394 | Повик: |
| | 395 | {{{#!sql |
| | 396 | CALL plati_kazna(30000005, 'E-bankarstvo'); |
| | 397 | CALL zatvori_zapisnik_po_uplata(30000005); |
| | 398 | }}} |
| | 399 | |