== Напредни извештаи од базата (SQL и складирани процедури) == === Проценка на присуство за одреден студент === Прво креираме табела каде што ќе ги чуваме податоците од повикување на процедурата {{{ #!sql CREATE TABLE Attendance_Report ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), student_id UUID NOT NULL, start_date DATE NOT NULL, end_date DATE NOT NULL, present_count INTEGER NOT NULL, absent_count INTEGER NOT NULL, late_count INTEGER NOT NULL, attendance_status VARCHAR(30) NOT NULL, generated_at TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP, FOREIGN KEY (student_id) REFERENCES Ucenik(id) ); }}} Следно креираме процедура за броење на * бројот на "ZADOCNET" * бројот на "PRISUTEN" * бројот на "OTSUTEN" И потоа пресметуваме според одредена логика за просечна вредност која што може да биде * REDOVEN * POVREMENO_OTSUTEN * NEREDOVEN {{{ #!sql CREATE OR REPLACE PROCEDURE generate_attendance_report( p_start_date DATE, p_end_date DATE ) LANGUAGE plpgsql AS $$ DECLARE r RECORD; v_status VARCHAR(30); BEGIN DELETE FROM Attendance_Report -- go briseme prethodniot zapis WHERE start_date = p_start_date AND end_date = p_end_date; FOR r IN SELECT p.seOdnesuvaNaUcenikot_Id AS student_id, COUNT(*) FILTER ( WHERE p.status = 'PRISUTEN' )::INTEGER AS present_count, COUNT(*) FILTER ( WHERE p.status = 'OTSUTEN' )::INTEGER AS absent_count, COUNT(*) FILTER ( WHERE p.status = 'ZADOCNET' )::INTEGER AS late_count FROM Prisustvo p WHERE p.datum BETWEEN p_start_date AND p_end_date GROUP BY p.seOdnesuvaNaUcenikot_Id LOOP IF r.absent_count = 0 AND r.late_count <= 2 THEN v_status := 'REDOVEN'; ELSIF r.absent_count <= 3 AND r.late_count <= 5 THEN v_status := 'POVREMENO_OTSUTEN'; ELSE v_status := 'NEREDOVEN'; END IF; INSERT INTO Attendance_Report ( student_id, start_date, end_date, present_count, absent_count, late_count, attendance_status ) VALUES ( r.student_id, p_start_date, p_end_date, r.present_count, r.absent_count, r.late_count, v_status ); END LOOP; END; $$; }}} Откако ќе се внесат неколку присуства, може да ја повикаме процедурата: {{{ #!sql CALL generate_attendance_report( '2026-01-01', '2026-12-31' ); --datum od, datum do odnosno cela godina }}} Потоа може Direktor_Admin да кликне на ,,статистика" од Navbar и да ги извлече резултатите со следниов SQL: {{{ #!sql SELECT student_id, start_date, end_date, present_count, absent_count, late_count, attendance_status, generated_at, k.ime, k.prezime FROM Attendance_Report JOIN Korisnik k ON k.id = student_id ORDER BY attendance_status, student_id }}} На frontend: [[Image(procedure.jpg, width=1500)]]