diff --git a/src/exams/pdf/group.test.report.tsx b/src/exams/pdf/group.test.report.tsx index 31a6aaed..10535510 100644 --- a/src/exams/pdf/group.test.report.tsx +++ b/src/exams/pdf/group.test.report.tsx @@ -11,7 +11,7 @@ import { } from "@react-pdf/renderer"; import { styles } from "./styles"; import TestReportFooter from "./test.report.footer"; -import { ModuleScore } from "@/interfaces/module.scores"; +import { ModuleScore, StudentData } from "@/interfaces/module.scores"; import ProgressBar from "./progress.bar"; Font.registerHyphenationCallback((word) => [word]); @@ -30,7 +30,8 @@ interface Props { title: string; numberOfStudents: number; institution: string; - studentsData: any[]; + studentsData: StudentData[]; + showLevel: boolean; } const customStyles = StyleSheet.create({ @@ -78,6 +79,7 @@ const GroupTestReport = ({ numberOfStudents, institution, studentsData, + showLevel, }: Props) => { const defaultTextStyle = [styles.textFont, { fontSize: 8 }]; const defaultSkillsTextStyle = [styles.textFont, { fontSize: 8 }]; @@ -213,12 +215,20 @@ const GroupTestReport = ({ customStyles.tableCellHighlight, ]} > - Sr + + Sr + Candidate Name Email ID - Gender - Date of test - Result + + Gender + + + Date of test + + + Result + Level {studentsData.map( @@ -228,15 +238,22 @@ const GroupTestReport = ({ style={[ customStyles.tableCell, customStyles.tableCellHighlight, + { maxWidth: "24px" }, ]} > {index + 1} {name} {email} - {gender} - {date} - {result} + + {gender} + + + {date} + + + {result} + {level} ) diff --git a/src/interfaces/module.scores.ts b/src/interfaces/module.scores.ts index cc109420..07d6c65e 100644 --- a/src/interfaces/module.scores.ts +++ b/src/interfaces/module.scores.ts @@ -8,4 +8,14 @@ export interface ModuleScore { png?: string, evaluation?: string, suggestions?: string, + } + + export interface StudentData { + id: string; + name: string; + email: string; + gender: string; + date: string; + result: string; + level?: string; } \ No newline at end of file diff --git a/src/pages/api/assignments/[id]/export.tsx b/src/pages/api/assignments/[id]/export.tsx index e913425d..7e4e0867 100644 --- a/src/pages/api/assignments/[id]/export.tsx +++ b/src/pages/api/assignments/[id]/export.tsx @@ -19,11 +19,11 @@ import { ref, uploadBytes } from "firebase/storage"; import { Stat } from "@/interfaces/user"; import { User } from "@/interfaces/user"; import { Module } from "@/interfaces"; -import { ModuleScore } from "@/interfaces/module.scores"; +import { ModuleScore, StudentData } from "@/interfaces/module.scores"; import qrcode from "qrcode"; import { SkillExamDetails } from "@/exams/pdf/details/skill.exam"; import { LevelExamDetails } from "@/exams/pdf/details/level.exam"; -import { calculateBandScore } from "@/utils/score"; +import { calculateBandScore, getLevelScore } from "@/utils/score"; import axios from "axios"; import { moduleLabels } from "@/utils/moduleUtils"; import { @@ -99,6 +99,17 @@ const getScoreAndTotal = (stats: Stat[]) => { ); }; +const getLevelScoreForUserExams = ( + correct: number, + total: number, + module: Module, + focus: "academic" | "general" +) => { + const bandScore = calculateBandScore(correct, total, module, focus); + const [level] = getLevelScore(bandScore); + return level; +}; + async function post(req: NextApiRequest, res: NextApiResponse) { // verify if it's a logged user that is trying to export if (req.session.user) { @@ -189,9 +200,11 @@ async function post(req: NextApiRequest, res: NextApiResponse) { overallResult ); + const showLevel = baseStat.module === "level"; + // level exams have a different report structure than the skill exams const getCustomData = () => { - if (baseStat.module === "level") { + if (showLevel) { return { title: "GROUP ENGLISH LEVEL TEST RESULT REPORT ", details: , @@ -208,7 +221,7 @@ async function post(req: NextApiRequest, res: NextApiResponse) { const numberOfStudents = data.assignees.length; - const getStudentsData = async () => { + const getStudentsData = async (): Promise => { // const usersCol = collection(db, "users"); const docsSnap = await getDocs( query( @@ -232,10 +245,10 @@ async function post(req: NextApiRequest, res: NextApiResponse) { month: "numeric", day: "numeric", }); - const result = - exams.length === 0 - ? "N/A" - : `${exams[0].score.correct}/${exams[0].score.total}`; + + const { correct, total } = getScoreAndTotal(exams); + + const result = exams.length === 0 ? "N/A" : `${correct}/${total}`; return { id, @@ -244,6 +257,14 @@ async function post(req: NextApiRequest, res: NextApiResponse) { gender: user?.demographicInformation?.gender || "N/A", date, result, + level: showLevel + ? getLevelScoreForUserExams( + correct, + total, + baseStat.module, + user?.focus || "academic" + ) + : "", }; }); }; @@ -266,6 +287,7 @@ async function post(req: NextApiRequest, res: NextApiResponse) { numberOfStudents={numberOfStudents} institution="TODO: PLACEHOLDER" studentsData={studentsData} + showLevel={showLevel} /> ); @@ -290,6 +312,7 @@ async function post(req: NextApiRequest, res: NextApiResponse) { res.status(401).json({ ok: false }); return; } catch (err) { + console.error(err); res.status(500).json({ ok: false }); return; }