Press n or j to go to the next uncovered block, b, p or k for the previous block.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 | 46x 70x 334x 334x 334x 2874x 43072x 2874x 334x 850x 850x 540x 334x 850x 70x | import { first, groupBy, shuffle } from "remeda";
import { Group } from "server/types/assignmentTypes";
import { isStartTimeMatch } from "server/utils/isStartTimeMatch";
import { logger } from "server/utils/logger";
import { ProgramItem } from "shared/types/models/programItem";
import { User } from "shared/types/models/user";
export const getGroups = (
attendeeGroups: readonly User[][],
assignmentTime: string,
lotterySignupProgramItems: readonly ProgramItem[],
): Group[] => {
const results = attendeeGroups.flatMap((attendeeGroup) => {
const firstMember = first(attendeeGroup);
Iif (!firstMember) {
logger.error(
new Error("Assignment getGroups: error getting first member"),
);
return [];
}
const lotterySignupsForStartTime = firstMember.lotterySignups.filter(
(lotterySignup) => {
const programItem = lotterySignupProgramItems.find(
(lotterySignupProgramItem) =>
lotterySignupProgramItem.programItemId ===
lotterySignup.programItemId,
);
return isStartTimeMatch(
lotterySignup.signedToStartTime,
assignmentTime,
programItem?.parentId,
);
},
);
// Sort by priority, randomize between same priority values
const sortedLotterySignups = Object.values(
groupBy(lotterySignupsForStartTime, (item) => item.priority),
) // Group by priority
.map((group) => shuffle(group)) // Shuffle each group
.toSorted((a, b) => a[0].priority - b[0].priority) // Sort groups by priority, ascending
.flat();
return {
id:
firstMember.groupCode === "0"
? firstMember.serial
: firstMember.groupCode,
size: attendeeGroup.length,
pref: sortedLotterySignups.map(
(lotterySignup) => lotterySignup.programItemId,
),
};
});
return results;
};
|