Changes between Version 6 and Version 7 of DatabaseProgramming


Ignore:
Timestamp:
06/16/26 20:53:26 (8 hours ago)
Author:
231069
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • DatabaseProgramming

    v6 v7  
    6060{{{#!sql
    6161CREATE 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;
    80     END IF;
    81 END IF;
    82 
    83 RETURN NEW;
     62    RETURNS TRIGGER
     63    LANGUAGE plpgsql
     64AS $$
     65BEGIN
     66    IF NOT EXISTS (SELECT 1 FROM Policaec WHERE EMBG_P = NEW.EMBG_P) THEN
     67        RAISE EXCEPTION 'Policaecot so EMBG % ne postoi vo sistemot!', NEW.EMBG_P;
     68    END IF;
     69 
     70    IF NEW.datum_od IS NULL THEN
     71        RAISE EXCEPTION 'Pocetokot na rabotniot odnos (datum_od) mora da bide definiran!';
     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 'Policaecot so EMBG % vekje ima aktiven angazhman vo druga stanica!', NEW.EMBG_P;
     80        END IF;
     81    END IF;
     82 
     83    RETURN NEW;
    8484END;
    8585$$;
    8686
    8787CREATE 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();
     88    BEFORE INSERT OR UPDATE ON Raboti_vo
     89    FOR EACH ROW
     90    EXECUTE FUNCTION proverka_raboti_vo_integritet();
    9191}}}
    9292
    9393=== Тригер 3: trigger_proverka_registracija===
    9494
    95 Овој тригер е задолжен за проверка на интегритетот на податоците пред да се изврши вметнување или ажурирање во табелата `Registracija`. По новата шема, `Registracija` повеќе не ги содржи директно граѓанинот и возилото-таа референцира `Sopstvenost` (преку `id_sopstvenost`) и `Registerska_tablica` (преку `id_tablica`). Затоа тригерот прави валидација дека сопственоста постои и дека, доколку е доделена табличка, таа табличка постои. Како клучен дел од валидацијата, тригерот користи регуларен израз (REGEX) врз составениот запис на табличката (регион-број-код) за да осигура дека таа го следи официјалниот македонски стандард (на пр. SK-1234-AA или BT-888-ZZ).
     95Овој тригер е задолжен за проверка на интегритетот на податоците пред да се изврши вметнување или ажурирање во табелата `Registracija`.`Registracija`таа референцира `Sopstvenost` (преку `id_sopstvenost`) и `Registerska_tablica` (преку `id_tablica`). Затоа тригерот прави валидација дека сопственоста постои и дека, доколку е доделена табличка, таа табличка постои. Како клучен дел од валидацијата, тригерот користи регуларен израз (REGEX) врз составениот запис на табличката (регион-број-код) за да осигура дека таа го следи официјалниот македонски стандард (на пр.SK-1234-AA).
    9696
    9797{{{#!sql
     
    104104BEGIN
    105105IF NOT EXISTS (SELECT 1 FROM Sopstvenost WHERE id_sopstvenost = NEW.id_sopstvenost) THEN
    106 RAISE EXCEPTION 'Сопственоста со id % не постои во системот!', NEW.id_sopstvenost;
     106RAISE EXCEPTION 'Sopstvenosta so id % ne postoi vo sistemot!', NEW.id_sopstvenost;
    107107END IF;
    108108
     
    114114
    115115    IF v_tablica IS NULL THEN
    116         RAISE EXCEPTION 'Регистарската табличка со id % не постои!', NEW.id_tablica;
     116        RAISE EXCEPTION 'Registerska tablica so id % ne postoi!', NEW.id_tablica;
    117117    END IF;
    118118
    119119    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;
     120        RAISE EXCEPTION 'Registerskara tablica "%" ne e vo validen format! Очекуван формат: ZZ-0000-ZZ', v_tablica;
    121121    END IF;
    122122END IF;
     
    140140{{{#!sql
    141141CREATE OR REPLACE PROCEDURE kreiraj_zapisnik_so_prekrsok(
    142 p_embg_prekrsuvac char(13),
    143 p_broj_sasija     varchar(17),
    144 p_embg_policaec   char(13),
    145 p_lokacija        varchar(100),
    146 p_id_slucaj       int,
    147 p_id_prekrsok     int,
    148 p_vreme           time    DEFAULT CURRENT_TIME,
    149 p_datum           date    DEFAULT CURRENT_DATE,
    150 p_potpis          boolean DEFAULT false
     142    p_embg_prekrsuvac char(13),
     143    p_broj_sasija     varchar(17),
     144    p_embg_policaec   char(13),
     145    p_lokacija        varchar(100),
     146    p_id_slucaj       int,
     147    p_id_prekrsok     int,
     148    p_vreme           time    DEFAULT CURRENT_TIME,
     149    p_datum           date    DEFAULT CURRENT_DATE,
     150    p_potpis          boolean DEFAULT false
    151151)
    152 LANGUAGE plpgsql
    153 AS $$
    154 DECLARE
    155 v_id_zapisnik int;
    156 BEGIN
    157 IF NOT EXISTS (SELECT 1 FROM Gragjanin WHERE EMBG = p_embg_prekrsuvac) THEN
    158 RAISE EXCEPTION 'Gragjaninot so EMBG % ne postoi!', p_embg_prekrsuvac;
    159 END IF;
    160 IF NOT EXISTS (SELECT 1 FROM Policaec WHERE EMBG_P = p_embg_policaec) THEN
    161 RAISE EXCEPTION 'Policaecot so EMBG % ne postoi!', p_embg_policaec;
    162 END IF;
    163 IF NOT EXISTS (SELECT 1 FROM Vozilo WHERE broj_na_sasija = p_broj_sasija) THEN
    164 RAISE EXCEPTION 'Voziloto so broj na sasija % ne postoi!', p_broj_sasija;
    165 END IF;
    166 IF NOT EXISTS (SELECT 1 FROM Prekrsok WHERE id_prekrsok = p_id_prekrsok) THEN
    167 RAISE EXCEPTION 'Prekrsokot so id % ne postoi!', p_id_prekrsok;
    168 END IF;
    169 IF NOT EXISTS (SELECT 1 FROM Slucaj WHERE id_slucaj = p_id_slucaj) THEN
    170 RAISE EXCEPTION 'Slucajot so id % ne postoi!', p_id_slucaj;
    171 END IF;
    172 
    173 INSERT INTO Zapisnik (vreme, datum, lokacija, Potpis,
    174     id_slucaj, EMBG_Prekrsuvach, Vozilo_Broj_Sasija, EMBG_Policaec)
    175 VALUES (p_vreme, p_datum, p_lokacija, p_potpis,
    176     p_id_slucaj, p_embg_prekrsuvac, p_broj_sasija, p_embg_policaec)
    177 RETURNING id_na_zapisnik INTO v_id_zapisnik;
    178 
    179 INSERT INTO Uplata (iznos, status, Uplatil_Gragjanin, id_zapisnik)
    180 VALUES (0, 'Neplateno', p_embg_prekrsuvac, v_id_zapisnik);
    181 
    182 INSERT INTO Stavka_Zapisnik (reden_broj, id_na_zapisnik, id_na_prekrsok)
    183 VALUES (1, v_id_zapisnik, p_id_prekrsok);
    184 
    185 RAISE NOTICE 'Kreiran zapisnik so id % so prv prekrsok %.', v_id_zapisnik, p_id_prekrsok;
    186 END;
     152    LANGUAGE plpgsql
     153AS $$
     154DECLARE
     155    v_id_zapisnik int;
     156BEGIN
     157 
     158    IF NOT EXISTS (SELECT 1 FROM Gragjanin WHERE EMBG = p_embg_prekrsuvac) THEN
     159        RAISE EXCEPTION 'Gragjaninot so EMBG % ne postoi!', p_embg_prekrsuvac;
     160    END IF;
     161 
     162    IF NOT EXISTS (SELECT 1 FROM Policaec WHERE EMBG_P = p_embg_policaec) THEN
     163        RAISE EXCEPTION 'Policaecot so EMBG % ne postoi!', p_embg_policaec;
     164    END IF;
     165 
     166    IF NOT EXISTS (SELECT 1 FROM Vozilo WHERE broj_na_sasija = p_broj_sasija) THEN
     167        RAISE EXCEPTION 'Voziloto so broj na sasija % ne postoi!', p_broj_sasija;
     168    END IF;
     169 
     170    IF NOT EXISTS (SELECT 1 FROM Prekrsok WHERE id_prekrsok = p_id_prekrsok) THEN
     171        RAISE EXCEPTION 'Prekrsokot so id % ne postoi!', p_id_prekrsok;
     172    END IF;
     173 
     174    IF NOT EXISTS (SELECT 1 FROM Slucaj WHERE id_slucaj = p_id_slucaj) THEN
     175        RAISE EXCEPTION 'Slucajot so id % ne postoi!', p_id_slucaj;
     176    END IF;
     177 
     178 
     179    INSERT INTO Zapisnik (
     180        vreme, datum, lokacija, Potpis,
     181        id_slucaj, EMBG_Prekrsuvach, Vozilo_Broj_Sasija, EMBG_Policaec
     182    )
     183    VALUES (
     184        p_vreme, p_datum, p_lokacija, p_potpis,
     185        p_id_slucaj, p_embg_prekrsuvac, p_broj_sasija, p_embg_policaec
     186    )
     187    RETURNING id_na_zapisnik INTO v_id_zapisnik;
     188 
     189 
     190    INSERT INTO Uplata (iznos, status, Uplatil_Gragjanin, id_zapisnik)
     191    VALUES (0, 'Neplateno', p_embg_prekrsuvac, v_id_zapisnik);
     192 
     193 
     194    INSERT INTO Stavka_Zapisnik (reden_broj, id_na_zapisnik, id_na_prekrsok)
     195    VALUES (1, v_id_zapisnik, p_id_prekrsok);
     196 
     197    RAISE NOTICE 'Kreiran zapisnik so id % so prv prekrsok %.', v_id_zapisnik, p_id_prekrsok;
     198END;
     199$$;
     200
    187201$$;
    188202}}}
     
    245259{{{#!sql
    246260CREATE OR REPLACE PROCEDURE plati_kazna(
    247 p_id_zapisnik    int,
    248 p_nacin_plakanje varchar(30)
     261    p_id_zapisnik    int,
     262    p_nacin_plakanje varchar(30)
    249263)
    250 LANGUAGE plpgsql
    251 AS $$
    252 DECLARE
    253 v_status varchar(30);
    254 v_iznos  numeric(10,2);
    255 BEGIN
    256 SELECT status, iznos INTO v_status, v_iznos
    257 FROM Uplata WHERE id_zapisnik = p_id_zapisnik;
    258 
    259 IF v_status IS NULL THEN
    260     RAISE EXCEPTION 'Ne postoi uplata za zapisnik %!', p_id_zapisnik;
    261 END IF;
    262 IF v_status = 'Plateno' THEN
    263     RAISE EXCEPTION 'Kaznata za zapisnik % e vekje platena!', p_id_zapisnik;
    264 END IF;
    265 IF v_iznos <= 0 THEN
    266     RAISE EXCEPTION 'Zapisnikot % nema stavki/kazni za naplata!', p_id_zapisnik;
    267 END IF;
    268 IF p_nacin_plakanje NOT IN ('E-bankarstvo', 'Platezna karticka', 'Gotovo/Uplatnica') THEN
    269     RAISE EXCEPTION 'Nepoznat nacin na plakanje: %.', p_nacin_plakanje;
    270 END IF;
    271 
    272 UPDATE Uplata
    273 SET status         = 'Plateno',
    274     datum_uplata   = CURRENT_DATE,
    275     nacin_plakanje = p_nacin_plakanje
    276 WHERE id_zapisnik = p_id_zapisnik;
    277 
    278 RAISE NOTICE 'Uspesno naplatena kazna od % za zapisnik % (%).', v_iznos, p_id_zapisnik, p_nacin_plakanje;
     264    LANGUAGE plpgsql
     265AS $$
     266DECLARE
     267    v_status varchar(30);
     268    v_iznos  numeric(10,2);
     269BEGIN
     270 
     271    SELECT status, iznos INTO v_status, v_iznos
     272    FROM Uplata
     273    WHERE id_zapisnik = p_id_zapisnik;
     274 
     275    IF v_status IS NULL THEN
     276        RAISE EXCEPTION 'Ne postoi uplata za zapisnik %!', p_id_zapisnik;
     277    END IF;
     278 
     279    IF v_status = 'Plateno' THEN
     280        RAISE EXCEPTION 'Kaznata za zapisnik % e vekje platena!', p_id_zapisnik;
     281    END IF;
     282 
     283    IF v_iznos <= 0 THEN
     284        RAISE EXCEPTION 'Zapisnikot % nema stavki/kazni za naplata!', p_id_zapisnik;
     285    END IF;
     286 
     287    IF p_nacin_plakanje NOT IN ('E-bankarstvo', 'Platezna karticka', 'Gotovo/Uplatnica') THEN
     288        RAISE EXCEPTION 'Nepoznat nacin na plakanje: %. Dozvoleni: E-bankarstvo, Platezna karticka, Gotovo/Uplatnica.', p_nacin_plakanje;
     289    END IF;
     290 
     291 
     292    UPDATE Uplata
     293    SET status         = 'Plateno',
     294        datum_uplata   = CURRENT_DATE,
     295        nacin_plakanje = p_nacin_plakanje
     296    WHERE id_zapisnik = p_id_zapisnik;
     297 
     298    RAISE NOTICE 'Uspesno naplatena kazna od % za zapisnik % (%).', v_iznos, p_id_zapisnik, p_nacin_plakanje;
    279299END;
    280300$$;
     
    290310
    291311{{{#!sql
    292 CREATE OR REPLACE PROCEDURE dodadi_kategorija_na_vozacka(
    293 p_broj_dozvola    varchar(30),
    294 p_id_kategorija   int,
    295 p_datum_polaganje date DEFAULT CURRENT_DATE
     312REATE OR REPLACE PROCEDURE dodadi_kategorija_na_vozacka(
     313    p_broj_dozvola    varchar(30),
     314    p_id_kategorija   int,
     315    p_datum_polaganje date DEFAULT CURRENT_DATE
    296316)
    297 LANGUAGE plpgsql
    298 AS $$
    299 DECLARE
    300 v_datum_vaznost_do date;
    301 v_datum_izdavanje  date;
    302 v_kod_kategorija   varchar(3);
    303 BEGIN
    304 SELECT datum_vaznost_do, datum_izdavanje
    305 INTO v_datum_vaznost_do, v_datum_izdavanje
    306 FROM Vozacka_dozvola WHERE broj_dozvola = p_broj_dozvola;
    307 
    308 IF v_datum_vaznost_do IS NULL THEN
    309     RAISE EXCEPTION 'Vozackata dozvola so broj % ne postoi!', p_broj_dozvola;
    310 END IF;
    311 IF v_datum_vaznost_do < CURRENT_DATE THEN
    312     RAISE EXCEPTION 'Vozackata dozvola % e istechena (vaznost do %)!', p_broj_dozvola, v_datum_vaznost_do;
    313 END IF;
    314 
    315 SELECT kod INTO v_kod_kategorija
    316 FROM Kategorija WHERE id_kategorija = p_id_kategorija;
    317 
    318 IF v_kod_kategorija IS NULL THEN
    319     RAISE EXCEPTION 'Kategorijata so id % ne postoi!', p_id_kategorija;
    320 END IF;
    321 
    322 IF EXISTS (
    323     SELECT 1 FROM Kategorija_Vozacka_dozvola
    324     WHERE broj_dozvola = p_broj_dozvola AND id_kategorija = p_id_kategorija
    325 ) THEN
    326     RAISE EXCEPTION 'Kategorijata % vekje e dodadena na vozackata %!', v_kod_kategorija, p_broj_dozvola;
    327 END IF;
    328 
    329 IF p_datum_polaganje > CURRENT_DATE THEN
    330     RAISE EXCEPTION 'Datumot na polaganje % ne moze da bide vo idnina!', p_datum_polaganje;
    331 END IF;
    332 IF p_datum_polaganje < v_datum_izdavanje THEN
    333     RAISE EXCEPTION 'Datumot na polaganje % ne moze da bide pred izdavanjeto na vozackata (%).',
    334         p_datum_polaganje, v_datum_izdavanje;
    335 END IF;
    336 
    337 INSERT INTO Kategorija_Vozacka_dozvola (id_kategorija, broj_dozvola, datum_polaganje)
    338 VALUES (p_id_kategorija, p_broj_dozvola, p_datum_polaganje);
    339 
    340 RAISE NOTICE 'Uspesno dodadena kategorija % na vozackata %.', v_kod_kategorija, p_broj_dozvola;
     317    LANGUAGE plpgsql
     318AS $$
     319DECLARE
     320    v_datum_vaznost_do date;
     321    v_datum_izdavanje  date;
     322    v_kod_kategorija   varchar(3);
     323BEGIN
     324 
     325    SELECT datum_vaznost_do, datum_izdavanje
     326    INTO v_datum_vaznost_do, v_datum_izdavanje
     327    FROM Vozacka_dozvola
     328    WHERE broj_dozvola = p_broj_dozvola;
     329 
     330    IF v_datum_vaznost_do IS NULL THEN
     331        RAISE EXCEPTION 'Vozackata dozvola so broj % ne postoi!', p_broj_dozvola;
     332    END IF;
     333 
     334 
     335    IF v_datum_vaznost_do < CURRENT_DATE THEN
     336        RAISE EXCEPTION 'Vozackata dozvola % e istechena (vaznost do %)! Mora prvo da se obnovi.',
     337            p_broj_dozvola, v_datum_vaznost_do;
     338    END IF;
     339 
     340 
     341    SELECT kod INTO v_kod_kategorija
     342    FROM Kategorija
     343    WHERE id_kategorija = p_id_kategorija;
     344 
     345    IF v_kod_kategorija IS NULL THEN
     346        RAISE EXCEPTION 'Kategorijata so id % ne postoi!', p_id_kategorija;
     347    END IF;
     348 
     349 
     350    IF EXISTS (
     351        SELECT 1 FROM Kategorija_Vozacka_dozvola
     352        WHERE broj_dozvola = p_broj_dozvola
     353          AND id_kategorija = p_id_kategorija
     354    ) THEN
     355        RAISE EXCEPTION 'Kategorijata % vekje e dodadena na vozackata %!',
     356            v_kod_kategorija, p_broj_dozvola;
     357    END IF;
     358 
     359 
     360    IF p_datum_polaganje > CURRENT_DATE THEN
     361        RAISE EXCEPTION 'Datumot na polaganje % ne moze da bide vo idnina!', p_datum_polaganje;
     362    END IF;
     363 
     364    IF p_datum_polaganje < v_datum_izdavanje THEN
     365        RAISE EXCEPTION 'Datumot na polaganje % ne moze da bide pred izdavanjeto na vozackata (%).',
     366            p_datum_polaganje, v_datum_izdavanje;
     367    END IF;
     368 
     369 
     370    INSERT INTO Kategorija_Vozacka_dozvola (id_kategorija, broj_dozvola, datum_polaganje)
     371    VALUES (p_id_kategorija, p_broj_dozvola, p_datum_polaganje);
     372 
     373    RAISE NOTICE 'Uspesno dodadena kategorija % na vozackata % (polagano na %).',
     374        v_kod_kategorija, p_broj_dozvola, p_datum_polaganje;
    341375END;
    342376$$;
     
    354388{{{#!sql
    355389CREATE OR REPLACE PROCEDURE zatvori_zapisnik_po_uplata(
    356 p_id_zapisnik int
     390    p_id_zapisnik int
    357391)
    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    LANGUAGE plpgsql
     393AS $$
     394DECLARE
     395    v_status_uplata    varchar(30);
     396    v_status_zapisnik  varchar(20);
     397BEGIN
     398 
     399    SELECT status_zapisnik INTO v_status_zapisnik
     400    FROM Zapisnik
     401    WHERE id_na_zapisnik = p_id_zapisnik;
     402 
     403    IF v_status_zapisnik IS NULL THEN
     404        RAISE EXCEPTION 'Zapisnikot so id % ne postoi!', p_id_zapisnik;
     405    END IF;
     406 
     407    IF v_status_zapisnik = 'Zatvoren' THEN
     408        RAISE EXCEPTION 'Zapisnikot % e vekje zatvoren!', p_id_zapisnik;
     409    END IF;
     410 
     411 
     412    SELECT status INTO v_status_uplata
     413    FROM Uplata
     414    WHERE id_zapisnik = p_id_zapisnik;
     415 
     416    IF v_status_uplata IS NULL THEN
     417        RAISE EXCEPTION 'Ne postoi uplata za zapisnik %!', p_id_zapisnik;
     418    END IF;
     419 
     420    IF v_status_uplata <> 'Plateno' THEN
     421        RAISE EXCEPTION 'Zapisnikot % ne moze da se zatvori bidejki uplatata e so status "%" (mora da bide Plateno)!',
     422            p_id_zapisnik, v_status_uplata;
     423    END IF;
     424 
     425 
     426    UPDATE Zapisnik
     427    SET status_zapisnik = 'Zatvoren'
     428    WHERE id_na_zapisnik = p_id_zapisnik;
     429 
     430    RAISE NOTICE 'Zapisnik % e zatvoren po izvrshena uplata.', p_id_zapisnik;
     431END;
     432$$;
     433
    392434}}}
    393435
     
    402444Функција што ги обработува задоцнетите неплатени казни: на неплатените постари од 8 дена им го зголемува износот за 50% (само ако сè уште не се зголемени), а на тие постари од 2 месеци им го менува статусот во 'Sudska_postapka'. Враќа порака дека постапката е успешно извршена.
    403445
    404 Статусот 'Sudska_postapka' и колоната `kazna_zgolemena` веќе се дел од најновата DDL (Фаза 2). Подолу се повторени `ALTER` наредбите поради идемпотентност (`IF NOT EXISTS` / `DROP ... IF EXISTS`), за функцијата да се изврши и врз постара верзија на базата:
    405 {{{#!sql
    406 ALTER TABLE Uplata DROP CONSTRAINT IF EXISTS uplata_status_check;
    407 ALTER TABLE Uplata ADD CONSTRAINT uplata_status_check
    408 CHECK (status IN ('Plateno', 'Neplateno', 'Sudska_postapka'));
    409 
    410 ALTER TABLE Uplata ADD COLUMN IF NOT EXISTS kazna_zgolemena boolean DEFAULT false;
    411 }}}
    412 
     446Kолоната `kazna_zgolemena`ни е од корист кога ја зголемуваме казната затоа што со неа знаеме дали одредената казна е зголемена веќе и дали треба нејзино зголемување.
    413447{{{#!sql
    414448CREATE OR REPLACE FUNCTION azuriraj_kazna_plakanja()