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 88 89 90 91 92 | 51x 9142x 51x 155x 4712x 51x 142x 7001x 4430x 212907x 4430x 4430x 7001x 51x 206x 7040x 1906x 206x 7030x 206x 51x 142x 142x 142x | import { ProgramItem, State } from "shared/types/models/programItem";
import { User } from "shared/types/models/user";
import { isLotterySignupProgramItem } from "shared/utils/isLotterySignupProgramItem";
import { DirectSignupsForProgramItem } from "server/features/direct-signup/directSignupTypes";
// A cancelled program item keeps its place in the programme so attendees can see it was
// cancelled, and the programme import strips its lottery sign-ups as soon as it sees the
// cancellation - so there is normally nothing here to exclude. Ruled out anyway: the lottery
// must never place anyone in one, whatever sign-ups it is somehow still carrying.
const isAssignableProgramItem = (programItem: ProgramItem): boolean =>
programItem.state === State.ACCEPTED &&
isLotterySignupProgramItem(programItem);
export const getValidLotterySignupProgramItems = (
programItems: readonly ProgramItem[],
): ProgramItem[] => {
return programItems.filter((programItem) =>
isAssignableProgramItem(programItem),
);
};
const getValidLotterySignupsUsers = (
users: User[],
programItems: ProgramItem[],
): User[] => {
return users.map((user) => {
const matchingLotterySignups = user.lotterySignups.filter(
(lotterySignup) => {
const foundProgramItem = programItems.find(
(programItem) =>
programItem.programItemId === lotterySignup.programItemId,
);
Iif (!foundProgramItem) {
return false;
}
return isAssignableProgramItem(foundProgramItem);
},
);
return { ...user, lotterySignups: matchingLotterySignups };
});
};
// "Lottery participant" means program item took part in lottery and direct sign-up is either from lottery or after lottery
export const getLotteryParticipantDirectSignups = (
directSignups: readonly DirectSignupsForProgramItem[],
programItems: readonly ProgramItem[],
): readonly DirectSignupsForProgramItem[] => {
// Take program items with "twoPhaseSignupProgramTypes" which are not in "directSignupAlwaysOpenIds"
const lotteryValidProgramItemsIds = new Set(
programItems
.filter((programItem) => isLotterySignupProgramItem(programItem))
.map((programItem) => programItem.programItemId),
);
const lotteryParticipantDirectSignups = directSignups.filter(
(directSignup) => {
return lotteryValidProgramItemsIds.has(directSignup.programItemId);
},
);
return lotteryParticipantDirectSignups;
};
interface AssignmentParams {
validLotterySignupsUsers: User[];
lotteryParticipantDirectSignups: readonly DirectSignupsForProgramItem[];
}
export const prepareAssignmentParams = (
users: User[],
programItems: ProgramItem[],
directSignups: DirectSignupsForProgramItem[],
): AssignmentParams => {
// Take lottery sign-ups with "twoPhaseSignupProgramTypes" which are not in "directSignupAlwaysOpenIds"
const validLotterySignupsUsers = getValidLotterySignupsUsers(
users,
programItems,
);
// Take direct sign-ups with "twoPhaseSignupProgramTypes" which are not in "directSignupAlwaysOpenIds"
const lotteryParticipantDirectSignups = getLotteryParticipantDirectSignups(
directSignups,
programItems,
);
return {
validLotterySignupsUsers,
lotteryParticipantDirectSignups,
};
};
|