Merged in ENCOA-183_MasterCorporateGrouping (pull request #96)

ENCOA-183 MasterCorporateGrouping

Approved-by: Tiago Ribeiro
This commit is contained in:
João Ramos
2024-09-07 11:41:29 +00:00
committed by Tiago Ribeiro
2 changed files with 66 additions and 32 deletions

View File

@@ -55,6 +55,7 @@ import MasterStatistical from "./MasterStatistical";
import {futureAssignmentFilter, pastAssignmentFilter, archivedAssignmentFilter, activeAssignmentFilter} from "@/utils/assignments"; import {futureAssignmentFilter, pastAssignmentFilter, archivedAssignmentFilter, activeAssignmentFilter} from "@/utils/assignments";
import useUserBalance from "@/hooks/useUserBalance"; import useUserBalance from "@/hooks/useUserBalance";
import AssignmentsPage from "./views/AssignmentsPage"; import AssignmentsPage from "./views/AssignmentsPage";
import { group } from "console";
interface Props { interface Props {
user: MasterCorporateUser; user: MasterCorporateUser;
@@ -360,8 +361,14 @@ export default function MasterCorporateDashboard({user}: Props) {
</div> </div>
); );
const corporateUserFilter = (x: User) => x.type === "corporate"; const groupedByNameCorporates = groupBy(corporates, (x: CorporateUser) => x.corporateInformation?.companyInformation?.name || 'N/A');
const groupedByNameCorporatesKeys = Object.keys(groupedByNameCorporates);
const groupedByNameCorporateIds = groupedByNameCorporatesKeys.reduce((accm, x) => {
const corporateUserIds = (groupedByNameCorporates[x] as CorporateUser[]).map((y) => y.id);
return { ...accm, [x]: corporateUserIds };
}, {});
console.log("groupedByNameCorporates", groupedByNameCorporates, groupedByNameCorporateIds);
const GroupsList = () => { const GroupsList = () => {
return ( return (
<> <>
@@ -414,7 +421,7 @@ export default function MasterCorporateDashboard({user}: Props) {
</div> </div>
<h2 className="text-2xl font-semibold">Master Statistical</h2> <h2 className="text-2xl font-semibold">Master Statistical</h2>
</div> </div>
<MasterStatistical users={users} corporateUsers={corporates} /> <MasterStatistical users={users} corporateUsers={groupedByNameCorporateIds} />
</> </>
); );
}; };
@@ -468,12 +475,20 @@ export default function MasterCorporateDashboard({user}: Props) {
/> />
<IconCard <IconCard
Icon={BsBank} Icon={BsBank}
label="Corporate" label="Corporate Accounts"
value={corporates.length} value={corporates.length}
isLoading={isCorporatesLoading} isLoading={isCorporatesLoading}
color="purple" color="purple"
onClick={() => router.push("/#corporate")} onClick={() => router.push("/#corporate")}
/> />
<IconCard
Icon={BsBank}
label="Corporate"
value={groupedByNameCorporatesKeys.length}
isLoading={isCorporatesLoading}
color="purple"
// onClick={() => router.push("/#corporate")}
/>
<IconCard <IconCard
Icon={BsPersonFillGear} Icon={BsPersonFillGear}
isLoading={isStudentsLoading} isLoading={isStudentsLoading}

View File

@@ -19,8 +19,14 @@ import { useListSearch } from "@/hooks/useListSearch";
import axios from "axios"; import axios from "axios";
import { toast } from "react-toastify"; import { toast } from "react-toastify";
import Button from "@/components/Low/Button"; import Button from "@/components/Low/Button";
interface GroupedCorporateUsers {
// list of user Ids
[key: string]: string[];
}
interface Props { interface Props {
corporateUsers: User[]; corporateUsers: GroupedCorporateUsers;
users: User[]; users: User[];
} }
@@ -45,14 +51,14 @@ const searchFilters = [["email"], ["user"], ["userId"]];
const MasterStatistical = (props: Props) => { const MasterStatistical = (props: Props) => {
const { users, corporateUsers } = props; const { users, corporateUsers } = props;
const corporateRelevantUsers = React.useMemo( // const corporateRelevantUsers = React.useMemo(
() => corporateUsers.filter((x) => x.type !== "student") as CorporateUser[], // () => corporateUsers.filter((x) => x.type !== "student") as CorporateUser[],
[corporateUsers] // [corporateUsers]
); // );
const corporates = React.useMemo( const corporates = React.useMemo(
() => corporateRelevantUsers.map((x) => x.id), () => Object.values(corporateUsers).flat(),
[corporateRelevantUsers] [corporateUsers]
); );
const [selectedCorporates, setSelectedCorporates] = const [selectedCorporates, setSelectedCorporates] =
@@ -126,7 +132,8 @@ const MasterStatistical = (props: Props) => {
}; };
}; };
const corporateScores = corporates.reduce( const getCorporatesScoresHash = (data: string[]) =>
data.reduce(
(accm, id) => ({ (accm, id) => ({
...accm, ...accm,
[id]: getCorporateScores(id), [id]: getCorporateScores(id),
@@ -134,7 +141,8 @@ const MasterStatistical = (props: Props) => {
{} {}
) as Record<string, UserCount>; ) as Record<string, UserCount>;
const consolidateScore = Object.values(corporateScores).reduce( const getConsolidateScore = (data: Record<string, UserCount>) =>
Object.values(data).reduce(
(acc: UserCount, { userCount, maxUserCount }: UserCount) => ({ (acc: UserCount, { userCount, maxUserCount }: UserCount) => ({
userCount: acc.userCount + userCount, userCount: acc.userCount + userCount,
maxUserCount: acc.maxUserCount + maxUserCount, maxUserCount: acc.maxUserCount + maxUserCount,
@@ -142,6 +150,9 @@ const MasterStatistical = (props: Props) => {
{ userCount: 0, maxUserCount: 0 } { userCount: 0, maxUserCount: 0 }
); );
const corporateScores = getCorporatesScoresHash(corporates);
const consolidateScore = getConsolidateScore(corporateScores);
const getConsolidateScoreStr = (data: UserCount) => const getConsolidateScoreStr = (data: UserCount) =>
`${data.userCount}/${data.maxUserCount}`; `${data.userCount}/${data.maxUserCount}`;
@@ -286,23 +297,31 @@ const MasterStatistical = (props: Props) => {
}} }}
isSelected={areAllSelected} isSelected={areAllSelected}
/> />
{corporateRelevantUsers.map((group) => { {Object.keys(corporateUsers).map((corporateName) => {
const isSelected = selectedCorporates.includes(group.id); const group = corporateUsers[corporateName];
const isSelected = group.every((id) =>
selectedCorporates.includes(id)
);
const valueHash = getCorporatesScoresHash(group);
const value = getConsolidateScoreStr(getConsolidateScore(valueHash));
return ( return (
<IconCard <IconCard
key={group.id} key={corporateName}
Icon={BsBank} Icon={BsBank}
label={group.corporateInformation?.companyInformation?.name} label={corporateName}
value={getConsolidateScoreStr(corporateScores[group.id])} value={value}
color="purple" color="purple"
onClick={() => { onClick={() => {
if (isSelected) { if (isSelected) {
setSelectedCorporates( setSelectedCorporates((prev) =>
selectedCorporates.filter((x) => x !== group.id) prev.filter((x) => !group.includes(x))
); );
return; return;
} }
setSelectedCorporates([...selectedCorporates, group.id]); setSelectedCorporates((prev) => [
...new Set([...prev, ...group]),
]);
}} }}
isSelected={isSelected} isSelected={isSelected}
/> />