示例#1
0
 /**
  * Does all the checks necessary to assign a student and makes the assignment
  *
  * The $room_id and $bed_id fields are optional, but one or the other must be specificed
  *
  * @param Student $student
  * @param Integer $term
  * @param Integer $room_id
  * @param Integer $bed_id
  * @param Integer $meal_plan
  * @param String $notes
  * @param boolean $lottery
  * @param string $reason
  * @throws InvalidArgumentException
  * @throws AssignmentException
  * @throws DatabaseException
  * @throws Exception
  */
 public static function assignStudent(Student $student, $term, $room_id = NULL, $bed_id = NULL, $meal_plan, $notes = "", $lottery = FALSE, $reason)
 {
     /**
      * Can't check permissions here because there are some student-facing commands that needs to make assignments (e.g.
      * the lottery/re-application code)
      *
      * if(!UserStatus::isAdmin() || !Current_User::allow('hms', 'assignment_maintenance')) {
      * PHPWS_Core::initModClass('hms', 'exception/PermissionException.php');
      * throw new PermissionException('You are not allowed to edit student assignments.');
      * }
      */
     PHPWS_Core::initModClass('hms', 'HMS_Residence_Hall.php');
     PHPWS_Core::initModClass('hms', 'HMS_Floor.php');
     PHPWS_Core::initModClass('hms', 'HMS_Room.php');
     PHPWS_Core::initModClass('hms', 'HMS_Bed.php');
     PHPWS_Core::initModClass('hms', 'HMS_Activity_Log.php');
     PHPWS_Core::initModClass('hms', 'BannerQueue.php');
     PHPWS_Core::initModClass('hms', 'AssignmentHistory.php');
     PHPWS_Core::initModClass('hms', 'exception/AssignmentException.php');
     $username = $student->getUsername();
     // Make sure a username was entered
     if (!isset($username) || $username == '') {
         throw new InvalidArgumentException('Bad username.');
     }
     $username = strtolower($username);
     if ($student->getType() == TYPE_WITHDRAWN) {
         throw new AssignmentException('Invalid student type. Student is withdrawn.');
     }
     if (HMS_Assignment::checkForAssignment($username, $term)) {
         throw new AssignmentException('The student is already assigned.');
     }
     if (isset($bed_id)) {
         // A bed_id was given, so create that bed object
         $vacant_bed = new HMS_Bed($bed_id);
         if (!$vacant_bed) {
             throw new AssignmentException('Null bed object.');
         }
         // Get the room that this bed is in
         $room = $vacant_bed->get_parent();
     } else {
         if (isset($room_id)) {
             // A room_id was given, so create that room object
             $room = new HMS_Room($room_id);
             // And find a vacant bed in that room
             $beds = $room->getBedsWithVacancies();
             $vacant_bed = $beds[0];
         } else {
             // Both the bed and room IDs were null, so return an error
             throw new AssignmentException('No room nor bed specified.');
         }
     }
     if (!$room) {
         throw new AssignmentException('Null room object.');
     }
     // Make sure the room has a vacancy
     if (!$room->has_vacancy()) {
         throw new AssignmentException('The room is full.');
     }
     // Make sure the room is not offline
     if ($room->offline) {
         throw new AssignmentException('The room is offline');
     }
     // Double check that the bed is in the same term as we're being requested to assign for
     if ($vacant_bed->getTerm() != $term) {
         throw new AssignmentException('The bed\'s term and the assignment term do not match.');
     }
     // Double check that the resulting bed is empty
     if ($vacant_bed->get_number_of_assignees() > 0) {
         throw new AssignmentException('The bed is not empty.');
     }
     // Issue a warning if the bed was reserved for room change
     //TODO Move this to the room change view
     /*
     if ($vacant_bed->room_change_reserved != 0) {
         NQ::simple('hms', hms\NotificationView::WARNING, 'Room was reserved for room change');
     }
     */
     // Check that the room's gender and the student's gender match
     $student_gender = $student->getGender();
     if (is_null($student_gender)) {
         throw new AssignmentException('Student gender is null.');
     }
     // Genders must match unless the room is COED
     if ($room->getGender() != $student_gender && $room->getGender() != COED) {
         throw new AssignmentException('Room gender does not match the student\'s gender.');
     }
     // We probably shouldn't check permissions inside this method, since sometimes this can be
     // called from student-facing interfaces.. But, since I want to be really careful with co-ed rooms,
     // I'm going to take the extra step of making sure no students are putting themselves in co-ed rooms.
     if ($room->getGender() == COED && !Current_User::allow('hms', 'coed_assignment')) {
         throw new AssignmentException('You do not have permission to make assignments for Co-ed rooms.');
     }
     // Create the floor object
     $floor = $room->get_parent();
     if (!$floor) {
         throw new AssignmentException('Null floor object.');
     }
     // Create the hall object
     $hall = $floor->get_parent();
     if (!$hall) {
         throw new AssignmentException('Null hall object.');
     }
     if ($meal_plan == BANNER_MEAL_NONE) {
         $meal_plan = NULL;
     }
     // Determine which meal plan to use
     // If this is a freshmen student and they've somehow selected none or low, give them standard
     if ($student->getType() == TYPE_FRESHMEN && ($meal_plan == BANNER_MEAL_NONE || $meal_plan == BANNER_MEAL_LOW)) {
         $meal_plan = BANNER_MEAL_STD;
         // If a student is living in a dorm which requires a meal plan and they've selected none, give them low
     } else {
         if ($hall->meal_plan_required == 1 && $meal_plan == BANNER_MEAL_NONE) {
             $meal_plan = BANNER_MEAL_LOW;
         }
     }
     /**
      * ***************************
      * Temporary Assignment HACK *
      * ***************************
      */
     // Check for an assignment in the temp assignment table
     $db = new PHPWS_DB('hms_temp_assignment');
     $db->addWhere('banner_id', $student->getBannerId());
     $result = $db->select();
     if (PHPWS_Error::logIfError($result)) {
         throw new DatabaseException($result->toString());
     }
     if (sizeof($result) > 0) {
         // Queue an unassign for this student
         $soap = SOAP::getInstance(UserStatus::getUsername(), UserStatus::isAdmin() ? SOAP::ADMIN_USER : SOAP::STUDENT_USER);
         try {
             $soap->removeRoomAssignment($student->getBannerId(), $term, 'TMPR', $result[0]['room_number'], 100);
             // Hard-code to 100% refund
         } catch (Exception $e) {
             throw $e;
         }
         $db = new PHPWS_DB('hms_temp_assignment');
         $db->addValue('banner_id', null);
         $db->addWhere('room_number', $result[0]['room_number']);
         $db->update();
         if (PHPWS_Error::logIfError($result)) {
             throw new DatabaseException($result->toString());
         }
         NQ::simple('hms', hms\NotificationView::WARNING, 'Temporary assignment was removed.');
     }
     // Send this off to the queue for assignment in banner
     $banner_success = BannerQueue::queueAssignment($student, $term, $hall, $vacant_bed, 'HOME', $meal_plan);
     if ($banner_success !== TRUE) {
         throw new AssignmentException('Error while adding the assignment to the Banner queue.');
     }
     // Make the assignment in HMS
     $assignment = new HMS_Assignment();
     $assignment->setBannerId($student->getBannerId());
     $assignment->asu_username = $username;
     $assignment->bed_id = $vacant_bed->id;
     $assignment->term = $term;
     $assignment->letter_printed = 0;
     $assignment->email_sent = 0;
     $assignment->meal_option = $meal_plan;
     $assignment->reason = $reason;
     $assignment->application_term = $student->getApplicationTerm();
     $assignment->class = $student->getComputedClass($term);
     // If this was a lottery assignment, flag it as such
     if ($lottery) {
         $assignment->lottery = 1;
         if (!isset($reason)) {
             // Automatically tag reason as lottery
             $assignment->reason = ASSIGN_LOTTERY;
         }
     } else {
         $assignment->lottery = 0;
     }
     $result = $assignment->save();
     if (!$result || PHPWS_Error::logIfError($result)) {
         throw new DatabaseException($result->toString());
     }
     // Log the assignment
     HMS_Activity_Log::log_activity($username, ACTIVITY_ASSIGNED, UserStatus::getUsername(), $term . ' ' . $hall->hall_name . ' ' . $room->room_number . ' ' . $notes);
     // Insert assignment into History table
     AssignmentHistory::makeAssignmentHistory($assignment);
     // Look for roommates and flag their assignments as needing a new letter
     $room_id = $assignment->get_room_id();
     $room = new HMS_Room($room_id);
     // Go to the room level to get all the roommates
     $assignees = $room->get_assignees();
     // get an array of student objects for those assigned to this room
     if (sizeof($assignees) > 1) {
         foreach ($assignees as $roommate) {
             // Skip this student
             if ($roommate->getUsername() == $username) {
                 continue;
             }
             $roommate_assign = HMS_Assignment::getAssignment($roommate->getUsername(), $term);
             $roommate_assign->letter_printed = 0;
             $roommate_assign->email_sent = 0;
             $roommate_assign->save();
         }
     }
     // Return Sucess
     return true;
 }