DatabaseProgramming: phase04.sql

File phase04.sql, 11.8 KB (added by 231018, 6 hours ago)
Line 
1CREATE OR REPLACE FUNCTION fn_status_kazna(p_kazna_id INTEGER)
2RETURNS VARCHAR
3AS $$
4DECLARE
5 v_status VARCHAR;
6BEGIN
7 SELECT sk.ime
8 INTO v_status
9 FROM Kazna k
10 JOIN StatusKazna sk ON sk.status_kazna_id = k.status_kazna_id
11 WHERE k.kazna_id = p_kazna_id;
12
13 IF v_status IS NULL THEN
14 RETURN 'Kaznata ne postoi';
15 ELSIF LOWER(v_status) = 'platena' THEN
16 RETURN 'Kaznata e platena';
17 ELSIF LOWER(v_status) = 'neplatena' THEN
18 RETURN 'Kaznata ne e platena';
19 ELSIF LOWER(v_status) = 'ponishtena' THEN
20 RETURN 'Kaznata e ponishtena';
21 ELSE
22 RETURN 'Nepoznat status na kazna';
23 END IF;
24END;
25$$
26LANGUAGE plpgsql;
27
28
29
30CREATE OR REPLACE FUNCTION fn_presmetaj_iznos_kazna(p_tip_prekrsok_id INTEGER)
31RETURNS INTEGER
32AS $$
33DECLARE
34 v_iznos INTEGER;
35BEGIN
36 SELECT iznos
37 INTO v_iznos
38 FROM TipPrekrsok
39 WHERE tip_prekrsok_id = p_tip_prekrsok_id;
40
41 IF v_iznos IS NULL THEN
42 RAISE EXCEPTION 'Ne postoi tip na prekrsok so id %', p_tip_prekrsok_id;
43 ELSIF v_iznos <= 0 THEN
44 RAISE EXCEPTION 'Iznosot na kaznata mora da bide pogolem od 0';
45 ELSE
46 RETURN v_iznos;
47 END IF;
48END;
49$$
50LANGUAGE plpgsql;
51
52
53
54CREATE OR REPLACE PROCEDURE sp_evidentiraj_plakanje(
55 p_kazna_id INTEGER,
56 p_metod_plakanje_id INTEGER
57)
58AS $$
59DECLARE
60 v_postoi_kazna INTEGER;
61 v_postoi_metod INTEGER;
62 v_status VARCHAR;
63BEGIN
64 SELECT COUNT(*)
65 INTO v_postoi_kazna
66 FROM Kazna
67 WHERE kazna_id = p_kazna_id;
68
69 IF v_postoi_kazna = 0 THEN
70 RAISE EXCEPTION 'Ne postoi kazna so id %', p_kazna_id;
71 END IF;
72
73
74 SELECT COUNT(*)
75 INTO v_postoi_metod
76 FROM MetodPlakanje
77 WHERE metod_plakanje_id = p_metod_plakanje_id;
78
79 IF v_postoi_metod = 0 THEN
80 RAISE EXCEPTION 'Ne postoi metod na plakanje so id %', p_metod_plakanje_id;
81 END IF;
82
83
84 SELECT sk.ime
85 INTO v_status
86 FROM Kazna k
87 JOIN StatusKazna sk ON sk.status_kazna_id = k.status_kazna_id
88 WHERE k.kazna_id = p_kazna_id;
89
90
91 IF LOWER(v_status) = 'platena' THEN
92 RAISE EXCEPTION 'Kaznata e vekje platena';
93 ELSIF LOWER(v_status) = 'ponishtena' THEN
94 RAISE EXCEPTION 'Ponisthena kazna ne moze da se plati';
95 ELSE
96 INSERT INTO Plakanje(
97 metod_plakanje_id,
98 datum,
99 kazna_id
100 )
101 VALUES(
102 p_metod_plakanje_id,
103 CURRENT_DATE,
104 p_kazna_id
105 );
106 END IF;
107END;
108$$
109LANGUAGE plpgsql;
110
111
112
113
114CREATE OR REPLACE PROCEDURE sp_podnesi_zalba(
115 p_sodrzina VARCHAR,
116 p_korisnik_id INTEGER,
117 p_prekrsok_id INTEGER
118)
119AS $$
120DECLARE
121 v_status_podnesena INTEGER;
122 v_postoi_korisnik INTEGER;
123 v_postoi_prekrsok INTEGER;
124BEGIN
125 IF p_sodrzina IS NULL OR LENGTH(TRIM(p_sodrzina)) = 0 THEN
126 RAISE EXCEPTION 'Zalbata mora da ima sodrzina';
127 END IF;
128
129
130 SELECT COUNT(*)
131 INTO v_postoi_korisnik
132 FROM Korisnik
133 WHERE korisnik_id = p_korisnik_id;
134
135 IF v_postoi_korisnik = 0 THEN
136 RAISE EXCEPTION 'Ne postoi korisnik so id %', p_korisnik_id;
137 END IF;
138
139
140 SELECT COUNT(*)
141 INTO v_postoi_prekrsok
142 FROM Prekrsok
143 WHERE prekrsok_id = p_prekrsok_id;
144
145 IF v_postoi_prekrsok = 0 THEN
146 RAISE EXCEPTION 'Ne postoi prekrsok so id %', p_prekrsok_id;
147 END IF;
148
149
150 SELECT status_zalba_id
151 INTO v_status_podnesena
152 FROM StatusZalba
153 WHERE LOWER(ime) = 'podnesena';
154
155 IF v_status_podnesena IS NULL THEN
156 RAISE EXCEPTION 'Vo StatusZalba ne postoi status podnesena';
157 ELSE
158 INSERT INTO Zalba(
159 sodrzina,
160 datum_na_podnesuvanje,
161 status_zalba_id,
162 korisnik_id,
163 prekrsok_id
164 )
165 VALUES(
166 p_sodrzina,
167 CURRENT_DATE,
168 v_status_podnesena,
169 p_korisnik_id,
170 p_prekrsok_id
171 );
172 END IF;
173END;
174$$
175LANGUAGE plpgsql;
176
177
178
179
180
181CREATE OR REPLACE PROCEDURE sp_razgledaj_zalba(
182 p_zalba_id INTEGER,
183 p_administrator_id INTEGER,
184 p_nov_status VARCHAR
185)
186AS $$
187DECLARE
188 v_status_id INTEGER;
189 v_postoi_zalba INTEGER;
190 v_postoi_admin INTEGER;
191BEGIN
192 SELECT COUNT(*)
193 INTO v_postoi_zalba
194 FROM Zalba
195 WHERE zalba_id = p_zalba_id;
196
197 IF v_postoi_zalba = 0 THEN
198 RAISE EXCEPTION 'Ne postoi zalba so id %', p_zalba_id;
199 END IF;
200
201
202 SELECT COUNT(*)
203 INTO v_postoi_admin
204 FROM Administrator
205 WHERE administrator_id = p_administrator_id;
206
207 IF v_postoi_admin = 0 THEN
208 RAISE EXCEPTION 'Ne postoi administrator so id %', p_administrator_id;
209 END IF;
210
211
212 SELECT status_zalba_id
213 INTO v_status_id
214 FROM StatusZalba
215 WHERE LOWER(ime) = LOWER(p_nov_status);
216
217 IF v_status_id IS NULL THEN
218 RAISE EXCEPTION 'Ne postoi status na zalba so ime %', p_nov_status;
219 ELSE
220 UPDATE Zalba
221 SET administrator_id = p_administrator_id,
222 status_zalba_id = v_status_id
223 WHERE zalba_id = p_zalba_id;
224 END IF;
225END;
226$$
227LANGUAGE plpgsql;
228
229
230
231CREATE OR REPLACE PROCEDURE sp_arhiviraj_stari_snimki()
232AS $$
233DECLARE
234 v_broj_snimki INTEGER;
235BEGIN
236 SELECT COUNT(*)
237 INTO v_broj_snimki
238 FROM Snimka
239 WHERE datum < CURRENT_DATE - INTERVAL '365 days'
240 AND arhivirana = FALSE;
241
242 IF v_broj_snimki = 0 THEN
243 RAISE NOTICE 'Nema snimki za arhiviranje';
244 ELSE
245 UPDATE Snimka
246 SET arhivirana = TRUE,
247 datum_arhiviranje = CURRENT_DATE
248 WHERE datum < CURRENT_DATE - INTERVAL '365 days'
249 AND arhivirana = FALSE;
250
251 RAISE NOTICE 'Arhivirani se % snimki', v_broj_snimki;
252 END IF;
253END;
254$$
255LANGUAGE plpgsql;
256
257
258
259
260
261CREATE OR REPLACE PROCEDURE sp_kreiraj_prekrsok_so_kazna(
262 p_opis VARCHAR,
263 p_vreme TIME,
264 p_datum DATE,
265 p_detektirana_brzina INTEGER,
266 p_tip_prekrsok_id INTEGER,
267 p_kamera_id INTEGER,
268 p_storitel_embg VARCHAR
269)
270AS $$
271DECLARE
272 v_kazna_id INTEGER;
273 v_prekrsok_id INTEGER;
274 v_iznos INTEGER;
275 v_status_kazna_id INTEGER;
276 v_status_prekrsok_id INTEGER;
277 v_postoi_tip INTEGER;
278 v_postoi_kamera INTEGER;
279 v_postoi_gragjanin INTEGER;
280BEGIN
281 IF p_opis IS NULL OR LENGTH(TRIM(p_opis)) = 0 THEN
282 RAISE EXCEPTION 'Opisot na prekrsokot ne smee da bide prazen';
283 END IF;
284
285
286 IF p_datum IS NULL THEN
287 p_datum := CURRENT_DATE;
288 END IF;
289
290
291 IF p_detektirana_brzina IS NULL OR p_detektirana_brzina <= 0 THEN
292 RAISE EXCEPTION 'Detektiranata brzina mora da bide pogolema od 0';
293 END IF;
294
295
296 IF p_storitel_embg IS NULL OR LENGTH(TRIM(p_storitel_embg)) <> 13 THEN
297 RAISE EXCEPTION 'EMBG na storitelot mora da ima 13 karakteri';
298 END IF;
299
300
301 SELECT COUNT(*)
302 INTO v_postoi_gragjanin
303 FROM Gragjanin
304 WHERE embg = p_storitel_embg;
305
306 IF v_postoi_gragjanin = 0 THEN
307 RAISE EXCEPTION 'Ne postoi gragjanin so EMBG %', p_storitel_embg;
308 END IF;
309
310
311 SELECT COUNT(*)
312 INTO v_postoi_tip
313 FROM TipPrekrsok
314 WHERE tip_prekrsok_id = p_tip_prekrsok_id;
315
316 IF v_postoi_tip = 0 THEN
317 RAISE EXCEPTION 'Ne postoi tip prekrsok so id %', p_tip_prekrsok_id;
318 END IF;
319
320
321 SELECT COUNT(*)
322 INTO v_postoi_kamera
323 FROM Kamera
324 WHERE kamera_id = p_kamera_id;
325
326 IF v_postoi_kamera = 0 THEN
327 RAISE EXCEPTION 'Ne postoi kamera so id %', p_kamera_id;
328 END IF;
329
330
331 SELECT status_kazna_id
332 INTO v_status_kazna_id
333 FROM StatusKazna
334 WHERE LOWER(ime) = 'neplatena';
335
336 IF v_status_kazna_id IS NULL THEN
337 RAISE EXCEPTION 'Vo StatusKazna ne postoi status neplatena';
338 END IF;
339
340
341 SELECT status_prekrsok_id
342 INTO v_status_prekrsok_id
343 FROM StatusPrekrsok
344 WHERE LOWER(ime) = 'aktiven';
345
346 IF v_status_prekrsok_id IS NULL THEN
347 RAISE EXCEPTION 'Vo StatusPrekrsok ne postoi status aktiven';
348 END IF;
349
350
351 v_iznos := fn_presmetaj_iznos_kazna(p_tip_prekrsok_id);
352
353
354 INSERT INTO Kazna(
355 datum,
356 status_kazna_id,
357 iznos_za_plakanje
358 )
359 VALUES(
360 CURRENT_DATE,
361 v_status_kazna_id,
362 v_iznos
363 )
364 RETURNING kazna_id INTO v_kazna_id;
365
366
367 INSERT INTO Prekrsok(
368 opis,
369 vreme,
370 status_prekrsok_id,
371 datum,
372 detektirana_brzina,
373 tip_prekrsok_id,
374 kamera_id,
375 kazna_id
376 )
377 VALUES(
378 p_opis,
379 p_vreme,
380 v_status_prekrsok_id,
381 p_datum,
382 p_detektirana_brzina,
383 p_tip_prekrsok_id,
384 p_kamera_id,
385 v_kazna_id
386 )
387 RETURNING prekrsok_id INTO v_prekrsok_id;
388
389
390 INSERT INTO Prekrsok_Storitel(
391 prekrsok_id,
392 storitel_embg
393 )
394 VALUES(
395 v_prekrsok_id,
396 p_storitel_embg
397 );
398END;
399$$
400LANGUAGE plpgsql;
401
402
403
404CREATE OR REPLACE FUNCTION trg_fn_auto_rok_kazna()
405RETURNS TRIGGER
406AS $$
407BEGIN
408 IF NEW.datum IS NULL THEN
409 NEW.datum := CURRENT_DATE;
410 END IF;
411
412
413 IF NEW.rok_na_plakanje IS NULL THEN
414 NEW.rok_na_plakanje := NEW.datum + INTERVAL '30 days';
415 ELSIF NEW.rok_na_plakanje < NEW.datum THEN
416 RAISE EXCEPTION 'Rokot za plakanje ne moze da bide pred datumot na kaznata';
417 ELSE
418 RETURN NEW;
419 END IF;
420
421 RETURN NEW;
422END;
423$$
424LANGUAGE plpgsql;
425
426
427DROP TRIGGER IF EXISTS trg_auto_rok_kazna ON Kazna;
428
429CREATE TRIGGER trg_auto_rok_kazna
430BEFORE INSERT ON Kazna
431FOR EACH ROW
432EXECUTE FUNCTION trg_fn_auto_rok_kazna();
433
434
435
436
437CREATE OR REPLACE FUNCTION trg_fn_kazna_platena()
438RETURNS TRIGGER
439AS $$
440DECLARE
441 v_status_platena_id INTEGER;
442 v_status_momentalen VARCHAR;
443BEGIN
444 SELECT sk.ime
445 INTO v_status_momentalen
446 FROM Kazna k
447 JOIN StatusKazna sk ON sk.status_kazna_id = k.status_kazna_id
448 WHERE k.kazna_id = NEW.kazna_id;
449
450
451 IF v_status_momentalen IS NULL THEN
452 RAISE EXCEPTION 'Kaznata ne postoi';
453 ELSIF LOWER(v_status_momentalen) = 'ponishtena' THEN
454 RAISE EXCEPTION 'Ponisthena kazna ne moze da se oznaci kako platena';
455 ELSE
456 SELECT status_kazna_id
457 INTO v_status_platena_id
458 FROM StatusKazna
459 WHERE LOWER(ime) = 'platena';
460
461 IF v_status_platena_id IS NULL THEN
462 RAISE EXCEPTION 'Vo StatusKazna ne postoi status platena';
463 ELSE
464 UPDATE Kazna
465 SET status_kazna_id = v_status_platena_id
466 WHERE kazna_id = NEW.kazna_id;
467 END IF;
468 END IF;
469
470 RETURN NEW;
471END;
472$$
473LANGUAGE plpgsql;
474
475
476DROP TRIGGER IF EXISTS trg_kazna_platena ON Plakanje;
477
478CREATE TRIGGER trg_kazna_platena
479AFTER INSERT ON Plakanje
480FOR EACH ROW
481EXECUTE FUNCTION trg_fn_kazna_platena();
482
483
484
485
486
487CREATE OR REPLACE FUNCTION trg_fn_validacija_zalba()
488RETURNS TRIGGER
489AS $$
490DECLARE
491 v_status_prekrsok VARCHAR;
492BEGIN
493 IF NEW.sodrzina IS NULL OR LENGTH(TRIM(NEW.sodrzina)) = 0 THEN
494 RAISE EXCEPTION 'Zalbata mora da ima sodrzina';
495 END IF;
496
497
498 IF NEW.datum_na_podnesuvanje IS NULL THEN
499 NEW.datum_na_podnesuvanje := CURRENT_DATE;
500 END IF;
501
502
503 SELECT sp.ime
504 INTO v_status_prekrsok
505 FROM Prekrsok p
506 JOIN StatusPrekrsok sp ON sp.status_prekrsok_id = p.status_prekrsok_id
507 WHERE p.prekrsok_id = NEW.prekrsok_id;
508
509
510 IF v_status_prekrsok IS NULL THEN
511 RAISE EXCEPTION 'Ne postoi prekrsok za koj se podnesuva zalbata';
512 ELSIF LOWER(v_status_prekrsok) = 'ponishten' THEN
513 RAISE EXCEPTION 'Ne moze da se podnese zalba za ponishten prekrsok';
514 ELSE
515 RETURN NEW;
516 END IF;
517END;
518$$
519LANGUAGE plpgsql;
520
521
522DROP TRIGGER IF EXISTS trg_validacija_zalba ON Zalba;
523
524CREATE TRIGGER trg_validacija_zalba
525BEFORE INSERT ON Zalba
526FOR EACH ROW
527EXECUTE FUNCTION trg_fn_validacija_zalba();
528