diff --git a/graphql/statistics/fields.ts b/graphql/statistics/fields.ts index c4104d563..fe8bd6dc1 100644 --- a/graphql/statistics/fields.ts +++ b/graphql/statistics/fields.ts @@ -49,7 +49,7 @@ class Statistics { } @ObjectType() -class MedianTimeToMatch { +class MedianTimePupilStudent { @Field((type) => Float) median_days_pupil: number; @@ -1022,7 +1022,7 @@ export class StatisticsResolver { return await prisma.secret.count({ where: { lastUsed: { gte: beginingOfTheDay } } }); } - @FieldResolver(() => MedianTimeToMatch) + @FieldResolver(() => MedianTimePupilStudent) @Authorized(Role.ADMIN, Role.USER) async medianTimeToMatch() { return ( @@ -1042,6 +1042,33 @@ export class StatisticsResolver { )[0]; } + @FieldResolver(() => MedianTimePupilStudent) + @Authorized(Role.ADMIN, Role.USER) + async medianTimeSinceLastSuccessfulScreening() { + return ( + await prisma.$queryRaw` + SELECT ( + SELECT + PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY (EXTRACT(EPOCH FROM (now() - "updatedAt"))/86400)::int) + FROM + screening + WHERE + "updatedAt" >= now() - INTERVAL '1 month' + AND "status" = '1'::student_screening_status_enum + ) as median_days_student, + ( + SELECT + PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY (EXTRACT(EPOCH FROM (now() - "updatedAt"))/86400)::int) + FROM + pupil_screening + WHERE + "updatedAt" >= now() - INTERVAL '1 month' + AND "status" = '1'::pupil_screening_status_enum + AND "invalidated" = FALSE + ) AS median_days_pupil;` + )[0]; + } + @FieldResolver(() => [ByMonth]) @Authorized(Role.ADMIN) async deactivationReasons(@Root() statistics: Statistics, @Arg('type') type: 'pupil' | 'student') { @@ -1070,7 +1097,7 @@ export class StatisticsResolver { EXTRACT(YEAR FROM l."start")::int AS year, EXTRACT(MONTH FROM l."start")::int AS month, SUM( - l."duration" * CASE + l."duration" * CASE WHEN l."appointmentType" = 'match' THEN 1 ELSE COALESCE(array_length(l."participantIds", 1), 0) END @@ -1114,7 +1141,7 @@ export class StatisticsResolver { COUNT(CASE WHEN l_count >= ${minCompletedLectures} THEN m.id END) AS successful_matches FROM match m LEFT JOIN ( - SELECT + SELECT l."matchId", COUNT(*) AS l_count FROM lecture l @@ -1151,7 +1178,7 @@ export class StatisticsResolver { EXTRACT(MONTH FROM l."start")::int AS month, COUNT(DISTINCT m."id")::int AS value FROM match m - JOIN lecture l + JOIN lecture l ON l."matchId" = m."id" WHERE l."start" >= ${statistics.from}::timestamp AND l."start" <= ${statistics.to}::timestamp AND l."isCanceled" = FALSE @@ -1168,7 +1195,7 @@ export class StatisticsResolver { SELECT COUNT(DISTINCT m."id")::int AS value FROM match m - JOIN lecture l + JOIN lecture l ON l."matchId" = m."id" WHERE l."start" >= ${statistics.from}::timestamp AND l."start" <= ${statistics.to}::timestamp AND l."isCanceled" = FALSE @@ -1186,13 +1213,13 @@ export class StatisticsResolver { EXTRACT(MONTH FROM l."start")::int AS month, COUNT(DISTINCT p_id)::int AS value FROM lecture l - LEFT JOIN subcourse sc + LEFT JOIN subcourse sc ON sc."id" = l."subcourseId" - LEFT JOIN course c + LEFT JOIN course c ON c."id" = sc."courseId" CROSS JOIN LATERAL UNNEST( - CASE - WHEN c."name" LIKE '%Hausaufgabenhilfe%' + CASE + WHEN c."name" LIKE '%Hausaufgabenhilfe%' THEN l."joinedBy" ELSE l."participantIds" END @@ -1226,8 +1253,8 @@ export class StatisticsResolver { LEFT JOIN subcourse sc ON sc."id" = l."subcourseId" LEFT JOIN course c ON c."id" = sc."courseId" CROSS JOIN LATERAL UNNEST( - CASE - WHEN c."name" LIKE '%Hausaufgabenhilfe%' + CASE + WHEN c."name" LIKE '%Hausaufgabenhilfe%' THEN l."joinedBy" ELSE l."organizerIds" END @@ -1256,12 +1283,12 @@ export class StatisticsResolver { SELECT COUNT(DISTINCT p_id)::int AS value FROM lecture l - LEFT JOIN subcourse sc + LEFT JOIN subcourse sc ON sc."id" = l."subcourseId" - LEFT JOIN course c + LEFT JOIN course c ON c."id" = sc."courseId" CROSS JOIN LATERAL UNNEST( - CASE + CASE WHEN c."name" LIKE '%Hausaufgabenhilfe%' THEN l."joinedBy" ELSE l."participantIds" @@ -1290,13 +1317,13 @@ export class StatisticsResolver { SELECT COUNT(DISTINCT s_id)::int AS value FROM lecture l - LEFT JOIN subcourse sc + LEFT JOIN subcourse sc ON sc."id" = l."subcourseId" - LEFT JOIN course c + LEFT JOIN course c ON c."id" = sc."courseId" CROSS JOIN LATERAL UNNEST( - CASE - WHEN c."name" LIKE '%Hausaufgabenhilfe%' + CASE + WHEN c."name" LIKE '%Hausaufgabenhilfe%' THEN l."joinedBy" ELSE l."organizerIds" END