All files / server/src/features/assignment/utils prepareAssignmentParams.ts

96% Statements 24/25
75% Branches 3/4
100% Functions 12/12
96% Lines 24/25

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,
  };
};