public function execute()
 {
     PHPWS_Core::initModClass('hms', 'HMS_Lottery.php');
     PHPWS_Core::initModClass('hms', 'LotteryProcess.php');
     $lotteryTerm = PHPWS_Settings::get('hms', 'lottery_term');
     /*******************************
      * Gross number of application *
      *******************************/
     $this->data['LOTTERY_APPS'] = LotteryProcess::countGrossApplicationsByClassGender($lotteryTerm);
     $this->data['SOPH_APPS'] = LotteryProcess::countGrossApplicationsByClassGender($lotteryTerm, CLASS_SOPHOMORE);
     $this->data['SOPH_M_APPS'] = LotteryProcess::countGrossApplicationsByClassGender($lotteryTerm, CLASS_SOPHOMORE, MALE);
     $this->data['SOPH_F_APPS'] = LotteryProcess::countGrossApplicationsByClassGender($lotteryTerm, CLASS_SOPHOMORE, FEMALE);
     $this->data['JR_APPS'] = LotteryProcess::countGrossApplicationsByClassGender($lotteryTerm, CLASS_JUNIOR);
     $this->data['JR_M_APPS'] = LotteryProcess::countGrossApplicationsByClassGender($lotteryTerm, CLASS_JUNIOR, MALE);
     $this->data['JR_F_APPS'] = LotteryProcess::countGrossApplicationsByClassGender($lotteryTerm, CLASS_JUNIOR, FEMALE);
     $this->data['SR_APPS'] = LotteryProcess::countGrossApplicationsByClassGender($lotteryTerm, CLASS_SENIOR);
     $this->data['SR_M_APPS'] = LotteryProcess::countGrossApplicationsByClassGender($lotteryTerm, CLASS_SENIOR, MALE);
     $this->data['SR_F_APPS'] = LotteryProcess::countGrossApplicationsByClassGender($lotteryTerm, CLASS_SENIOR, FEMALE);
     $this->data['M_APPS'] = LotteryProcess::countGrossApplicationsByClassGender($lotteryTerm, null, MALE);
     $this->data['F_APPS'] = LotteryProcess::countGrossApplicationsByClassGender($lotteryTerm, null, FEMALE);
     /********************
      * Net Applications *
      ********************/
     $this->data['NET_APPS'] = LotteryProcess::countNetAppsByClassGender($lotteryTerm, null, null);
     $this->data['NET_SO_APPS'] = LotteryProcess::countNetAppsByClassGender($lotteryTerm, CLASS_SOPHOMORE);
     $this->data['NET_SO_M_APPS'] = LotteryProcess::countNetAppsByClassGender($lotteryTerm, CLASS_SOPHOMORE, MALE);
     $this->data['NET_SO_F_APPS'] = LotteryProcess::countNetAppsByClassGender($lotteryTerm, CLASS_SOPHOMORE, FEMALE);
     $this->data['NET_JR_APPS'] = LotteryProcess::countNetAppsByClassGender($lotteryTerm, CLASS_JUNIOR);
     $this->data['NET_JR_M_APPS'] = LotteryProcess::countNetAppsByClassGender($lotteryTerm, CLASS_JUNIOR, MALE);
     $this->data['NET_JR_F_APPS'] = LotteryProcess::countNetAppsByClassGender($lotteryTerm, CLASS_JUNIOR, FEMALE);
     $this->data['NET_SR_APPS'] = LotteryProcess::countNetAppsByClassGender($lotteryTerm, CLASS_SENIOR);
     $this->data['NET_SR_M_APPS'] = LotteryProcess::countNetAppsByClassGender($lotteryTerm, CLASS_SENIOR, MALE);
     $this->data['NET_SR_F_APPS'] = LotteryProcess::countNetAppsByClassGender($lotteryTerm, CLASS_SENIOR, FEMALE);
     $this->data['NET_M_APPS'] = LotteryProcess::countNetAppsByClassGender($lotteryTerm, null, MALE);
     $this->data['NET_F_APPS'] = LotteryProcess::countNetAppsByClassGender($lotteryTerm, null, FEMALE);
     /****************
      * Invites Sent *
      ****************/
     $this->data['SO_INVITES'] = LotteryProcess::countInvitesByClassGender($lotteryTerm, CLASS_SOPHOMORE);
     $this->data['SO_M_INVITES'] = LotteryProcess::countInvitesByClassGender($lotteryTerm, CLASS_SOPHOMORE, MALE);
     $this->data['SO_F_INVITES'] = LotteryProcess::countInvitesByClassGender($lotteryTerm, CLASS_SOPHOMORE, FEMALE);
     $this->data['JR_INVITES'] = LotteryProcess::countInvitesByClassGender($lotteryTerm, CLASS_JUNIOR);
     $this->data['JR_M_INVITES'] = LotteryProcess::countInvitesByClassGender($lotteryTerm, CLASS_JUNIOR, MALE);
     $this->data['JR_F_INVITES'] = LotteryProcess::countInvitesByClassGender($lotteryTerm, CLASS_JUNIOR, FEMALE);
     $this->data['SR_INVITES'] = LotteryProcess::countInvitesByClassGender($lotteryTerm, CLASS_SENIOR);
     $this->data['SR_M_INVITES'] = LotteryProcess::countInvitesByClassGender($lotteryTerm, CLASS_SENIOR, MALE);
     $this->data['SR_F_INVITES'] = LotteryProcess::countInvitesByClassGender($lotteryTerm, CLASS_SENIOR, FEMALE);
     //TODO make this based on lottery assignment reason
     $db = new PHPWS_DB('hms_assignment');
     $db->addWhere('term', $lotteryTerm);
     $db->addWhere('reason', 'lottery');
     $numLotteryAssigned = $db->select('count');
     /***********************
      * Outstanding Invites *
      */
     $this->data['ROOMMATE_INVITES'] = LotteryProcess::countOutstandingRoommateInvites($lotteryTerm);
     $this->data['PENDING_SOPH_INVITES'] = LotteryProcess::countOutstandingInvites($lotteryTerm, CLASS_SOPHOMORE);
     $this->data['PENDING_JR_INVITES'] = LotteryProcess::countOutstandingInvites($lotteryTerm, CLASS_JUNIOR);
     $this->data['PENDING_SR_INVITES'] = LotteryProcess::countOutstandingInvites($lotteryTerm, CLASS_SENIOR);
     // Assignments
     $this->data['LOTTERY_ASSIGNED'] = $numLotteryAssigned;
     // Assignments by class
     $this->data['SOPH_ASSIGNED'] = LotteryProcess::countLotteryAssignedByClassGender($lotteryTerm, CLASS_SOPHOMORE);
     $this->data['SOPH_MALE_ASSIGNED'] = LotteryProcess::countLotteryAssignedByClassGender($lotteryTerm, CLASS_SOPHOMORE, MALE);
     $this->data['SOPH_FEMALE_ASSIGNED'] = LotteryProcess::countLotteryAssignedByClassGender($lotteryTerm, CLASS_SOPHOMORE, FEMALE);
     $this->data['JR_ASSIGNED'] = LotteryProcess::countLotteryAssignedByClassGender($lotteryTerm, CLASS_JUNIOR);
     $this->data['JR_MALE_ASSIGNED'] = LotteryProcess::countLotteryAssignedByClassGender($lotteryTerm, CLASS_JUNIOR, MALE);
     $this->data['JR_FEMALE_ASSIGNED'] = LotteryProcess::countLotteryAssignedByClassGender($lotteryTerm, CLASS_JUNIOR, FEMALE);
     $this->data['SR_ASSIGNED'] = LotteryProcess::countLotteryAssignedByClassGender($lotteryTerm, CLASS_SENIOR);
     $this->data['SR_MALE_ASSIGNED'] = LotteryProcess::countLotteryAssignedByClassGender($lotteryTerm, CLASS_SENIOR, MALE);
     $this->data['SR_FEMALE_ASSIGNED'] = LotteryProcess::countLotteryAssignedByClassGender($lotteryTerm, CLASS_SENIOR, FEMALE);
     /***************************************
      * Remaining unaffiliated applications *
      ***************************************/
     $this->data['SO_M_ENTRIES_REMAIN'] = LotteryProcess::countRemainingApplicationsByClassGender($lotteryTerm, CLASS_SOPHOMORE, MALE);
     $this->data['SO_F_ENTRIES_REMAIN'] = LotteryProcess::countRemainingApplicationsByClassGender($lotteryTerm, CLASS_SOPHOMORE, FEMALE);
     $this->data['SO_ENTRIES_REMAIN'] = $this->data['SO_M_ENTRIES_REMAIN'] + $this->data['SO_F_ENTRIES_REMAIN'];
     $this->data['JR_M_ENTRIES_REMAIN'] = LotteryProcess::countRemainingApplicationsByClassGender($lotteryTerm, CLASS_JUNIOR, MALE);
     $this->data['JR_F_ENTRIES_REMAIN'] = LotteryProcess::countRemainingApplicationsByClassGender($lotteryTerm, CLASS_JUNIOR, FEMALE);
     $this->data['JR_ENTRIES_REMAIN'] = $this->data['JR_M_ENTRIES_REMAIN'] + $this->data['JR_F_ENTRIES_REMAIN'];
     $this->data['SR_M_ENTRIES_REMAIN'] = LotteryProcess::countRemainingApplicationsByClassGender($lotteryTerm, CLASS_SENIOR, MALE);
     $this->data['SR_F_ENTRIES_REMAIN'] = LotteryProcess::countRemainingApplicationsByClassGender($lotteryTerm, CLASS_SENIOR, FEMALE);
     $this->data['SR_ENTRIES_REMAIN'] = $this->data['SR_M_ENTRIES_REMAIN'] + $this->data['SR_F_ENTRIES_REMAIN'];
     $this->data['REMAINING_ENTRIES'] = LotteryProcess::countRemainingApplications($lotteryTerm);
 }
Example #2
0
 public function sendInvites()
 {
     HMS_Activity_Log::log_activity('hms', ACTIVITY_LOTTERY_EXECUTED, 'hms');
     $this->output[] = "Lottery system invoked on " . date("d M, Y @ g:i:s", $this->now) . " ({$this->now})";
     /**
      * **
      * Check the hard cap.
      * Don't do anything if it's been reached.
      */
     if (LotteryProcess::hardCapReached($this->term)) {
         $this->output[] = 'Hard cap reached. Done!';
         return;
     }
     /**
      * *****************
      * Reminder Emails *
      * *****************
      */
     $output = array();
     if ($this->sendReminders) {
         $this->output[] = "Sending invite reminder emails...";
         $this->sendWinningReminderEmails();
         $output[] = "Sending roommate invite reminder emails...";
         $this->sendRoommateReminderEmails();
     }
     // check the jr/sr soft caps
     if (LotteryProcess::jrSoftCapReached($this->term)) {
         $this->inviteCounts[CLASS_JUNIOR][MALE] = 0;
         $this->inviteCounts[CLASS_JUNIOR][FEMALE] = 0;
     }
     if (LotteryProcess::srSoftCapReached($this->term)) {
         $this->inviteCounts[CLASS_SENIOR][MALE] = 0;
         $this->inviteCounts[CLASS_SENIOR][FEMALE] = 0;
     }
     /**
      * ****
      * Count the number of remaining entries
      * *******
      */
     try {
         // Count remaining applications by class and gender
         $this->applicationsRemaining = array();
         foreach ($this->classes as $c) {
             foreach ($this->genders as $g) {
                 $this->applicationsRemaining[$c][$g] = LotteryProcess::countRemainingApplicationsByClassGender($this->term, $c, $g);
             }
         }
     } catch (Exception $e) {
         $this->output[] = 'Error counting outstanding lottery entires, quitting. Exception: ' . $e->getMessage();
         return;
     }
     $this->output[] = "{$this->applicationsRemaining[CLASS_SENIOR][MALE]} senior male lottery entries remaining";
     $this->output[] = "{$this->applicationsRemaining[CLASS_SENIOR][FEMALE]} senior female lottery entries remaining";
     $this->output[] = "{$this->applicationsRemaining[CLASS_JUNIOR][MALE]} junior male lottery entries remaining";
     $this->output[] = "{$this->applicationsRemaining[CLASS_JUNIOR][FEMALE]} junior female lottery entries remaining";
     $this->output[] = "{$this->applicationsRemaining[CLASS_SOPHOMORE][MALE]} sophomore male lottery entries remaining";
     $this->output[] = "{$this->applicationsRemaining[CLASS_SOPHOMORE][FEMALE]} sophomore female lottery entries remaining";
     /**
      * ****************
      * Send magic winner invites
      */
     if ($this->sendMagicWinners) {
         $this->output[] = "Sending magic winner invites...";
         while (($magicWinner = $this->getMagicWinner()) != null) {
             $student = StudentFactory::getStudentByBannerId($magicWinner['banner_id'], $this->term);
             $this->sendInvite($student);
         }
     }
     /**
      * ****************
      * Send Invites
      */
     foreach ($this->classes as $c) {
         foreach ($this->genders as $g) {
             $this->output[] = "Sending {$this->inviteCounts[$c][$g]} invites for class: {$c}, gender: {$g}";
             $this->output[] = "There are {$this->applicationsRemaining[$c][$g]} remaining applicants of that class and gender.";
             // While we need to send an invite and there is an applicant remaining
             // And we haven't exceeded our batch size
             while ($this->inviteCounts[$c][$g] > $this->numInvitesSent[$c][$g] && $this->applicationsRemaining[$c][$g] >= 1 && $this->numInvitesSent['TOTAL'] <= MAX_INVITES_PER_BATCH) {
                 // Send an invite to the proper class & gender
                 $winningRow = $this->chooseWinner($c, $g);
                 $student = StudentFactory::getStudentByBannerId($winningRow['banner_id'], $this->term);
                 $this->sendInvite($student);
                 // Update counts
                 $this->numInvitesSent[$c][$g]++;
                 $this->applicationsRemaining[$c][$g]--;
             }
         }
     }
     $this->output[] = "Done. Sent {$this->numInvitesSent['TOTAL']} invites total.";
 }