Files
classroomio/supabase/migrations/20241231154543_dashboard_stats.sql
T
2025-04-21 01:01:23 +01:00

81 lines
2.6 KiB
PL/PgSQL

set check_function_bodies = off;
create or replace view "public"."dash_org_stats" as SELECT gp.organization_id AS org_id,
count(DISTINCT course.id) AS no_of_courses,
count(DISTINCT gm.profile_id) AS enrolled_students
FROM ((course
JOIN "group" gp ON ((gp.id = course.group_id)))
LEFT JOIN groupmember gm ON (((gm.group_id = gp.id) AND (gm.role_id = 3))))
WHERE (course.status = 'ACTIVE'::text)
GROUP BY gp.organization_id;
CREATE OR REPLACE FUNCTION public.get_dash_org_recent_enrollments(org_id_arg uuid)
RETURNS TABLE(profile_id uuid, avatar_url text, fullname text, course_id uuid, course_title character varying, enrolled_at timestamp with time zone)
LANGUAGE plpgsql
AS $function$
BEGIN
RETURN QUERY
SELECT
p.id,
p.avatar_url,
p.fullname,
course.id,
course.title,
gm.created_at as enrolled_at
FROM
course
JOIN "group" as gp ON gp.id = course.group_id
LEFT JOIN groupmember as gm ON gm.group_id = gp.id AND gm.role_id = 3
JOIN profile as p ON p.id = gm.profile_id
WHERE
course.status = 'ACTIVE'
AND gp.organization_id = org_id_arg
GROUP BY
p.id,
course.id,
course.title,
enrolled_at
ORDER BY
enrolled_at DESC
LIMIT 5;
END;
$function$
;
CREATE OR REPLACE FUNCTION public.get_dash_org_top_courses(org_id_arg uuid)
RETURNS TABLE(course_id uuid, course_title character varying, total_students integer, completion_percentage integer)
LANGUAGE plpgsql
AS $function$
BEGIN
RETURN QUERY
SELECT
course_stats.course_id,
course_stats.course_title,
course_stats.total_students::integer,
CASE
WHEN course_stats.total_students * course_stats.total_lessons = 0 THEN 0
ELSE ROUND((course_stats.completed_lessons::numeric / (course_stats.total_students * course_stats.total_lessons)) * 100)::integer
END as completion_percentage
FROM (
SELECT
c.id as course_id,
c.title as course_title,
COUNT(DISTINCT gm.id) as total_students,
COUNT(DISTINCT l.id) as total_lessons,
COUNT(DISTINCT lc.id) FILTER (WHERE lc.is_complete = true) as completed_lessons
FROM course c
JOIN "group" g ON g.id = c.group_id
LEFT JOIN groupmember gm ON gm.group_id = g.id and gm.role_id = 3
LEFT JOIN lesson l ON l.course_id = c.id
LEFT JOIN lesson_completion lc ON lc.lesson_id = l.id
AND lc.profile_id = gm.profile_id
WHERE c.status = 'ACTIVE' AND g.organization_id = org_id_arg
GROUP BY c.id, c.title
ORDER BY completed_lessons DESC
) as course_stats
LIMIT 5;
END;
$function$
;