wiki:AdvancedReports

Напредни извештаи од базата (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
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;
$$;

Откако ќе се внесат неколку присуства, може да ја повикаме процедурата:

  CALL generate_attendance_report( '2026-01-01', '2026-12-31' ); --datum od, datum do odnosno cela godina

Потоа може Direktor_Admin да кликне на статистика" од Navbar и да ги извлече резултатите со следниов 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:

Last modified 11 days ago Last modified on 09/15/26 17:10:44

Attachments (1)

Download all attachments as: .zip

Note: See TracWiki for help on using the wiki.