diff --git a/src/dashboards/MasterCorporate/MasterStatistical.tsx b/src/dashboards/MasterCorporate/MasterStatistical.tsx index fb4c559b..8978395a 100644 --- a/src/dashboards/MasterCorporate/MasterStatistical.tsx +++ b/src/dashboards/MasterCorporate/MasterStatistical.tsx @@ -14,6 +14,7 @@ import {useListSearch} from "@/hooks/useListSearch"; import axios from "axios"; import {toast} from "react-toastify"; import Button from "@/components/Low/Button"; +import {getUserName} from "@/utils/users"; interface GroupedCorporateUsers { // list of user Ids @@ -71,44 +72,44 @@ const MasterStatistical = (props: Props) => { const tableResults = React.useMemo( () => - assignments - .reduce((accmA: TableData[], a: AssignmentWithCorporateId) => { - const userResults = a.assignees.map((assignee) => { - const userStats = a.results.find((r) => r.user === assignee)?.stats || []; - const userData = users.find((u) => u.id === assignee); - const corporate = users.find((u) => u.id === a.assigner)?.name || ""; - const commonData = { - user: userData?.name || "N/A", - email: userData?.email || "N/A", - userId: assignee, - corporateId: a.corporateId, - exams: a.exams.map((x) => x.id).join(", "), - corporate, - assignment: a.name, - }; - if (userStats.length === 0) { - return { - ...commonData, - correct: 0, - submitted: false, - date: null, - }; - } - + assignments.reduce((accmA: TableData[], a: AssignmentWithCorporateId) => { + const userResults = a.assignees.map((assignee) => { + const userStats = a.results.find((r) => r.user === assignee)?.stats || []; + const userData = users.find((u) => u.id === assignee); + const corporate = getUserName(users.find((u) => u.id === a.assigner)); + const commonData = { + user: userData?.name || "N/A", + email: userData?.email || "N/A", + userId: assignee, + corporateId: a.corporateId, + exams: a.exams.map((x) => x.id).join(", "), + corporate, + assignment: a.name, + }; + if (userStats.length === 0) { return { ...commonData, - correct: userStats.reduce((n, e) => n + e.score.correct, 0), - submitted: true, - date: moment.max(userStats.map((e) => moment(e.date))), + correct: 0, + submitted: false, + date: null, }; - }) as TableData[]; + } - return [...accmA, ...userResults]; - }, []) - .filter((x) => x.user !== "N/A"), + return { + ...commonData, + correct: userStats.reduce((n, e) => n + e.score.correct, 0), + submitted: true, + date: moment.max(userStats.map((e) => moment(e.date))), + }; + }) as TableData[]; + + return [...accmA, ...userResults]; + }, []), [assignments, users], ); + useEffect(() => console.log(assignments), [assignments]); + const getCorporateScores = (corporateId: string): UserCount => { const corporateAssignmentsUsers = assignments.filter((a) => a.corporateId === corporateId).reduce((acc, a) => acc + a.assignees.length, 0); @@ -171,13 +172,6 @@ const MasterStatistical = (props: Props) => { }), ] : []), - columnHelper.accessor("corporate", { - header: "Corporate", - id: "corporate", - cell: (info) => { - return {info.getValue()}; - }, - }), columnHelper.accessor("assignment", { header: "Assignment", id: "assignment", @@ -197,7 +191,7 @@ const MasterStatistical = (props: Props) => { }, }), columnHelper.accessor("correct", { - header: "Correct", + header: "Score", id: "correct", cell: (info) => { return {info.getValue()}; diff --git a/src/dashboards/MasterCorporate/index.tsx b/src/dashboards/MasterCorporate/index.tsx index 49d7236f..efa958e0 100644 --- a/src/dashboards/MasterCorporate/index.tsx +++ b/src/dashboards/MasterCorporate/index.tsx @@ -83,18 +83,6 @@ export default function MasterCorporateDashboard({user}: Props) { const {assignments, isLoading: isAssignmentsLoading, reload: reloadAssignments} = useAssignments({corporate: user.id}); const assignmentsGroups = useMemo(() => groups.filter((x) => x.admin === user.id || x.participants.includes(user.id)), [groups, user.id]); - const assignmentsUsers = useMemo( - () => - [...students, ...teachers].filter((x) => - !!selectedUser - ? groups - .filter((g) => g.admin === selectedUser.id) - .flatMap((g) => g.participants) - .includes(x.id) || false - : groups.flatMap((g) => g.participants).includes(x.id), - ), - [groups, selectedUser, teachers, students], - ); const appendUserFilters = useFilterStore((state) => state.appendUserFilter); const router = useRouter(); diff --git a/src/utils/assignments.be.ts b/src/utils/assignments.be.ts index e3e9ff45..e2341020 100644 --- a/src/utils/assignments.be.ts +++ b/src/utils/assignments.be.ts @@ -1,18 +1,18 @@ import client from "@/lib/mongodb"; -import { Assignment } from "@/interfaces/results"; -import { getAllAssignersByCorporate } from "@/utils/groups.be"; +import {Assignment} from "@/interfaces/results"; +import {getAllAssignersByCorporate} from "@/utils/groups.be"; const db = client.db(process.env.MONGODB_DB); export const getAssignmentsByAssigner = async (id: string, startDate?: Date, endDate?: Date) => { - let query: any = { assigner: id }; + let query: any = {assigner: id}; if (startDate) { - query.startDate = { $gte: startDate.toISOString() }; + query.startDate = {$gte: startDate.toISOString()}; } if (endDate) { - query.endDate = { $lte: endDate.toISOString() }; + query.endDate = {$lte: endDate.toISOString()}; } return await db.collection("assignments").find(query).toArray(); @@ -26,7 +26,14 @@ export const getAssignmentsByAssignerBetweenDates = async (id: string, startDate }; export const getAssignmentsByAssigners = async (ids: string[], startDate?: Date, endDate?: Date) => { - return (await Promise.all(ids.map((id) => getAssignmentsByAssigner(id, startDate, endDate)))).flat(); + return await db + .collection("assignments") + .find({ + assigner: {$in: ids}, + ...(!!startDate ? {startDate: {$gte: startDate.toISOString()}} : {}), + ...(!!endDate ? {endDate: {$lte: endDate.toISOString()}} : {}), + }) + .toArray(); }; export const getAssignmentsForCorporates = async (idsList: string[], startDate?: Date, endDate?: Date) => { @@ -57,4 +64,4 @@ export const getAssignmentsForCorporates = async (idsList: string[], startDate?: ); return assignments.flat(); -} \ No newline at end of file +}; diff --git a/src/utils/groups.be.ts b/src/utils/groups.be.ts index 42fe68f9..7757ecd8 100644 --- a/src/utils/groups.be.ts +++ b/src/utils/groups.be.ts @@ -1,8 +1,9 @@ import {app} from "@/firebase"; +import {Assignment} from "@/interfaces/results"; import {CorporateUser, Group, MasterCorporateUser, StudentUser, TeacherUser, User} from "@/interfaces/user"; import client from "@/lib/mongodb"; import moment from "moment"; -import {getUser} from "./users.be"; +import {getLinkedUsers, getUser} from "./users.be"; import {getSpecificUsers} from "./users.be"; const db = client.db(process.env.MONGODB_DB); @@ -71,17 +72,10 @@ export const getUsersGroups = async (ids: string[]) => { }; export const getAllAssignersByCorporate = async (corporateID: string): Promise => { - const groups = await getUserGroups(corporateID); - const groupUsers = (await Promise.all(groups.map(async (g) => await Promise.all(g.participants.map(getUser))))) - .flat() - .filter((x) => !!x) as User[]; - const teacherPromises = await Promise.all( - groupUsers.map(async (u) => - u.type === "teacher" ? u.id : u.type === "corporate" ? [...(await getAllAssignersByCorporate(u.id)), u.id] : undefined, - ), - ); + const linkedTeachers = await getLinkedUsers(corporateID, "mastercorporate", "teacher"); + const linkedCorporates = await getLinkedUsers(corporateID, "mastercorporate", "corporate"); - return teacherPromises.filter((x) => !!x).flat() as string[]; + return [...linkedTeachers.users.map((x) => x.id), ...linkedCorporates.users.map((x) => x.id)]; }; export const getGroupsForUser = async (admin?: string, participant?: string) => {