public static function run()
 {
     $class = get_called_class();
     TEST($class, "{$class}.student.saveEditSubmitAndDelete", function ($class) {
         // Create job
         global $MJob;
         $jobId = new MongoId($MJob->save([], false));
         $studentId = new MongoId();
         // make sure saving an application for a job with no application
         // fails
         EQ(null, ApplicationStudent::save($jobId, $studentId, []));
         // create application for job
         $questionId = new MongoId();
         $questions = [$questionId];
         ApplicationJob::createOrUpdate($jobId, $questions);
         $answers = [['_id' => $questionId, 'answer' => 'swag']];
         $firstApplication = ApplicationStudent::save($jobId, $studentId, $answers);
         NEQ(null, $firstApplication);
         $applicationId = $firstApplication->getId();
         NEQ(null, $firstApplication->getQuestions());
         EQ('swag', $firstApplication->getQuestions()[0]['answer']);
         // edit application
         ApplicationStudent::edit($applicationId, [['_id' => $questionId, 'answer' => 'qswag']]);
         $editedApplication = ApplicationModel::getSavedForJob($jobId)[0];
         EQ('qswag', $editedApplication['questions'][0]['answer']);
         // submit application
         TRUE(ApplicationStudent::submitSaved($applicationId));
         TRUE(ApplicationModel::checkSubmitted($applicationId));
         // submit new application
         $secondStudent = new MongoId();
         $secondApplication = ApplicationStudent::submitNew($jobId, $secondStudent, $answers);
         TRUE(ApplicationModel::checkSubmitted($secondApplication->getId()));
         // create, save, and delete application
         $thirdStudent = new MongoId();
         $applicationToDelete = ApplicationStudent::save($jobId, $thirdStudent, $answers)->getId();
         TRUE(ApplicationModel::applicationExists($jobId, $thirdStudent));
         TRUE(ApplicationStudent::deleteSaved($applicationToDelete));
     });
     TEST($class, "{$class}.student.getUnclaimedAndClaimed", function ($class) {
         TRUE(false, 'TODO: Write test');
     });
     TEST($class, "{$class}.job.createOrUpdate", function ($class) {
         // Try to create/update application for nonexistent job
         FALSE(ApplicationJob::createOrUpdate(new MongoId(), []));
         // Create job
         global $MJob;
         $jobId = new MongoId($MJob->save([], false));
         // Try to create application for job
         $oldQuestionId = new MongoId();
         $oldQuestions = [$oldQuestionId];
         TRUE(ApplicationJob::createOrUpdate($jobId, $oldQuestions));
         EQ($MJob::getApplicationQuestionIds($jobId), $oldQuestions);
         // Try to change one question in application for job
         $newQuestionId = new MongoId();
         $newQuestions = [$newQuestionId];
         TRUE(ApplicationJob::createOrUpdate($jobId, $newQuestions));
         EQ($MJob::getApplicationQuestionIds($jobId), $newQuestions);
         TRUE(false, 'TODO: Check to make sure student applications are updated right.');
     });
 }
 public static function manage()
 {
     self::requireLogin();
     $studentId = $_SESSION['_id'];
     $applications = ApplicationStudent::getByStudent($studentId);
     $data = [];
     foreach ($applications as $application) {
         $jobId = $application->getJobId();
         $job = JobModel::getByIdMinimal($jobId);
         if (is_null($job)) {
             continue;
         }
         $companyId = $job['company'];
         $companyName = CompanyModel::getName($companyId);
         $data[] = ['title' => $job['title'], 'location' => $job['location'], 'company' => $companyName, 'jobId' => $application->getJobId(), 'submitted' => $application->isSubmitted()];
     }
     self::render('jobs/student/home', ['applications' => $data]);
 }
 private static function submit(MongoId $jobId, MongoId $studentId, array $questions)
 {
     $answers = array();
     foreach ($questions as $_id => $answer) {
         $answers[] = ['_id' => $_id, 'answer' => $answer];
     }
     $application = ApplicationStudent::save($jobId, $studentId, $answers);
     $applicationId = $application->getId();
     $submitted = ApplicationStudent::submit($applicationId);
     if ($submitted) {
         $job = JobModel::getByIdMinimal($jobId);
         $jobTitle = $job['title'];
         $linkApplicants = "http://sublite.net/employers/viewapplicants/{$jobId}";
         $linkManage = "http://sublite.net/employers/home";
         $recruiterId = $job['recruiter'];
         $recruiter = RecruiterModel::getByIdMinimal($recruiterId);
         $recruiterFirstname = $recruiter['firstname'];
         $recruiterEmail = $recruiter['email'];
         $message = "\n          Hi {$recruiterFirstname},\n          <br /><br />\n          You have received a new applicant for your job: <b>{$jobTitle}</b>!\n          <br /><br />\n          To unlock and view this application, go to\n          <a href='{$linkApplicants}'>View Applicants</a>.\n          <br />\n          To manage your jobs, go to <a href='{$linkManage}'>Manage</a>.\n          <br /><br />\n          View Applicants: <a href='{$linkApplicants}'>{$linkApplicants}</a><br />\n          Manage Jobs: <a href='{$linkManage}'>{$linkManage}</a><br />\n          <br /><br />\n          -------------------<br />\n          Team SubLite\n          <br /><br />\n          Please let us know if you have any questions. We hope you find the\n          right candidate for your job.\n        ";
         sendgmail([$recruiterEmail], "*****@*****.**", "New Applicant for '{$jobTitle}' | SubLite", $message);
         //send an email to the student
         $companyId = $job['company'];
         $company = CompanyModel::getById($companyId);
         $companyName = $company['name'];
         $student = StudentModel::getByIdMinimal($studentId);
         $studentFirstName = $student['name'];
         $studentEmail = $student['email'];
         $linkApplication = "http://sublite.net/jobs/application/{$applicationId}";
         $linkJob = "http://sublite.net/job?id={$jobId}";
         $linkJobSearch = "http://sublite.net/jobs/search";
         $linkJobsByCompany = "http://sublite.net/jobs/search?byrecruiter={$recruiterId}";
         $message = "\n          Hi {$studentFirstName},\n          <br />\n          <br />{$companyName} has successfully received your <a href='{$linkApplication}'>application</a> for <b>{$jobTitle}</b>!<br />\n          <br />View your application: {$linkApplication}\n          <br />View the job you applied to {$linkJob}\n          <br />View more jobs by {$linkJobsByCompany}<br />\n          <br />You are now one step closer to finding your perfect summer experience! Take more steps by applying to more jobs: {$linkJobSearch}<br />\n          -------------------<br />\n          Good luck!\n          <br />\n          Team SubLite\n        ";
         sendgmail([$studentEmail], "*****@*****.**", "Confirmation for Job Application", $message);
         self::redirect("../application/{$applicationId}");
     }
     self::error("You must attach a resume to your profile in order to submit " . "an application.");
 }
 private static function getSchoolsForUnclaimed(MongoId $jobId)
 {
     global $S;
     $schools = [];
     $unclaimed = ApplicationStudent::getUnclaimedByJob($jobId);
     foreach ($unclaimed as $application) {
         $studentId = $application->getStudentId();
         $student = StudentModel::getById($studentId, ['email' => 1]);
         $email = $student['email'];
         $school = $S->nameOf($email);
         $schools[] = $school;
     }
     return $schools;
 }
 /**
  * Creates a student application to be inserted into the 'applications'
  * collection.
  * Need to make sure student has not already saved an application for the
  * job.
  */
 private static function create(MongoId $jobId, MongoId $studentId, array $questions, $submitted)
 {
     // Retrieve application list from $jobId.
     $applicationQuestions = JobModel::getApplicationQuestionIds($jobId);
     // Build question-answer pairs.
     $savedQuestions = self::pruneQuestionsByIdSet($questions, $applicationQuestions);
     // Save the application.
     $application = new ApplicationStudent(['jobid' => $jobId, 'studentid' => $studentId, 'questions' => $savedQuestions, 'submitted' => $submitted]);
     $id = ApplicationModel::insert($application->getData());
     $application->setId($id);
     // Return created application.
     return $application;
 }