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 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 | 44x 37x 37x 37x 6x 6x 33x 31x 31x 31x 31x 33x 33x 31x 182x 31x 31x 31x | import { unique } from "remeda";
import { logger } from "server/utils/logger";
import { runRandomAssignment } from "server/features/assignment/random/utils/runRandomAssignment";
import { User } from "shared/types/models/user";
import { ProgramItem } from "shared/types/models/programItem";
import {
AssignmentResultStatus,
AssignmentResult,
} from "server/types/resultTypes";
import { getRandomAndPadgInput } from "server/features/assignment/utils/getRandomAndPadgInput";
import { DirectSignupsForProgramItem } from "server/features/direct-signup/directSignupTypes";
import { Result, makeSuccessResult } from "shared/utils/result";
import { AssignmentError } from "shared/types/api/errors";
import { AssignmentAlgorithm } from "shared/config/eventConfigTypes";
export const randomAssignment = (
users: readonly User[],
startingProgramItems: readonly ProgramItem[],
assignmentTime: string,
lotteryParticipantDirectSignups: readonly DirectSignupsForProgramItem[],
): Result<AssignmentResult, AssignmentError> => {
logger.debug(`***** Run Random Assignment for ${assignmentTime}`);
const {
lotterySignupProgramItems,
attendeeGroups,
allAttendees,
numberOfIndividuals,
numberOfGroups,
} = getRandomAndPadgInput(users, startingProgramItems);
if (lotterySignupProgramItems.length === 0) {
logger.debug("No lottery signups, stop!");
return makeSuccessResult({
results: [],
message: "Random Assignment Result - No lottery signups",
algorithm: AssignmentAlgorithm.RANDOM,
status: AssignmentResultStatus.NO_LOTTERY_SIGNUPS,
});
}
logger.debug(
`Program items with lottery signups: ${lotterySignupProgramItems.length}`,
);
logger.debug(
`Selected attendees: ${allAttendees.length} (${numberOfIndividuals} individual, ${numberOfGroups} groups)`,
);
logger.debug("Random assignment: start");
const assignmentResultResult = runRandomAssignment(
lotterySignupProgramItems,
attendeeGroups,
assignmentTime,
lotteryParticipantDirectSignups,
);
logger.debug("Random assignment: completed");
Iif (!assignmentResultResult.ok) {
return assignmentResultResult;
}
const assignmentResult = assignmentResultResult.value;
const selectedUniqueProgramItems = unique(
assignmentResult.results.map(
(result) => result.assignmentSignup.programItemId,
),
);
const message = `Random Assignment Result - Attendees: ${
assignmentResult.results.length
}/${allAttendees.length} (${Math.round(
(assignmentResult.results.length / allAttendees.length) * 100,
)}%), Program items: ${selectedUniqueProgramItems.length}/${
lotterySignupProgramItems.length
} (${Math.round((selectedUniqueProgramItems.length / lotterySignupProgramItems.length) * 100)}%)`;
logger.debug(message);
return makeSuccessResult(
Object.assign({
...assignmentResult,
message,
algorithm: AssignmentAlgorithm.RANDOM,
status: AssignmentResultStatus.SUCCESS,
}),
);
};
|