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

85.71% Statements 18/21
80% Branches 8/10
100% Functions 4/4
85.71% Lines 18/21

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                                              51x             149x         149x   149x 390x 390x         390x         390x 5x         385x           385x 859x                       149x     51x 859x   372x   249x   238x            
import { first } from "remeda";
import { ProgramItem } from "shared/types/models/programItem";
import { LotterySignup, User } from "shared/types/models/user";
import {
  getAssignmentBonus,
  getAssignmentBonusContext,
} from "server/features/assignment/utils/getAssignmentBonus";
import {
  getLotterySignupsInRun,
  indexProgramItemsById,
} from "server/features/assignment/utils/getLotterySignupsInRun";
import { DirectSignupsForProgramItem } from "server/features/direct-signup/directSignupTypes";
import { ListItem } from "server/types/assignmentTypes";
import { logger } from "server/utils/logger";
 
interface GetListParams {
  attendeeGroups: readonly User[][];
  assignmentTime: string;
  lotteryParticipantDirectSignups: readonly DirectSignupsForProgramItem[];
  lotterySignupProgramItems: readonly ProgramItem[];
  allProgramItems: readonly ProgramItem[];
}
 
export const getList = ({
  attendeeGroups,
  assignmentTime,
  lotteryParticipantDirectSignups,
  lotterySignupProgramItems,
  allProgramItems,
}: GetListParams): ListItem[] => {
  const bonusContext = getAssignmentBonusContext(
    allProgramItems,
    assignmentTime,
  );
 
  const programItemsById = indexProgramItemsById(lotterySignupProgramItems);
 
  const results = attendeeGroups.flatMap((attendeeGroup) => {
    const firstMember = first(attendeeGroup);
    Iif (!firstMember) {
      logger.error(new Error("Assignment getList: error getting first member"));
      return [];
    }
 
    const lotterySignupsInThisRun = getLotterySignupsInRun(
      firstMember.lotterySignups,
      programItemsById,
      assignmentTime,
    );
    if (lotterySignupsInThisRun.length === 0) {
      return [];
    }
 
    // A property of the group rather than of the preference being scored, so it is asked once
    // rather than once per preference
    const bonus = getAssignmentBonus(
      attendeeGroup,
      lotteryParticipantDirectSignups,
      bonusContext,
    );
 
    return lotterySignupsInThisRun.map((lotterySignup) => {
      return {
        id:
          firstMember.groupCode === "0"
            ? firstMember.serial
            : firstMember.groupCode,
        size: attendeeGroup.length,
        event: lotterySignup.programItemId,
        gain: getGain(lotterySignup, bonus),
      };
    });
  });
 
  return results;
};
 
const getGain = (lotterySignup: LotterySignup, bonus: number): number => {
  switch (lotterySignup.priority) {
    case 1:
      return 1 + bonus;
    case 2:
      return 0.5 + bonus;
    case 3:
      return 0.33 + bonus;
    default:
      // Invalid priority
      return 0;
  }
};