/**
  * Formulário de entrevista para candidatos ao psa.
  * 
  * Faz/edita a entrevista do candidato. Se o candidato estiver em um dos
  * status abaixo ele avançará para o status 
  * RecruitmentStatus::STATUSTYPE_INTERVIEWED:
  * 
  *  - RecruitmentStatus::STATUSTYPE_CALLEDFOR_INTERVIEW
  *  - RecruitmentStatus::STATUSTYPE_CALLEDFOR_PREINTERVIEW
  *  - RecruitmentStatus::STATUSTYPE_PREINTERVIEW_COMPLETE
  * 
  * @todo Fazer o cálculo da nota no critério socioeconômico.
  * 
  * @return ViewModel
  */
 public function studentFormAction()
 {
     try {
         $rid = $this->params()->fromRoute('id', null);
         $em = $this->getEntityManager();
         $registration = $em->find('Recruitment\\Entity\\Registration', $rid);
         $interview = $registration->getStudentInterview();
         $person = $registration->getPerson();
         $request = $this->getRequest();
         if ($rid) {
             $studentInterviewForm = new StudentInterviewForm($em);
             if ($interview === null) {
                 $interview = new StudentInterview();
                 $registration->setStudentInterview($interview);
             }
             $studentInterviewForm->bind($interview);
             if ($request->isPost()) {
                 $data = $request->getPost();
                 $studentInterviewForm->setData($data);
                 if ($studentInterviewForm->isValid()) {
                     $status = (int) $registration->getCurrentRegistrationStatus()->getRecruitmentStatus()->getNumericStatusType();
                     /* Em qualquer um desses status o candidato avança para
                      * entrevistado. Fora desses status não há modificações
                      * de status, o candidato apenas tem sua entrevista atualizada.
                      */
                     if (in_array($status, [RecruitmentStatus::STATUSTYPE_CALLEDFOR_INTERVIEW, RecruitmentStatus::STATUSTYPE_CALLEDFOR_PREINTERVIEW, RecruitmentStatus::STATUSTYPE_PREINTERVIEW_COMPLETE])) {
                         $this->updateRegistrationStatus($registration, RecruitmentStatus::STATUSTYPE_INTERVIEWED);
                     }
                     $iti = $interview->getInterviewTotalIncome();
                     $inofm = $interview->getInterviewNumberOfFamilyMembers();
                     $ims = $interview->getInterviewMaxScholarity();
                     $iht = $interview->getInterviewHomeType();
                     $ihs = $interview->getInterviewHomeSituation();
                     $imp = $interview->getInterviewMaxPosition();
                     $grade = StudentInterview::calculateSocioeconomicGrade($iti, $inofm, $ims, $iht, $ihs, $imp);
                     $interview->setInterviewSocioeconomicGrade($grade);
                     $em->merge($registration);
                     $em->flush();
                     return new ViewModel(['form' => $studentInterviewForm, 'message' => 'Entrevista realizada com sucesso.', 'person' => $person, 'regId' => $rid]);
                 }
             }
             return new ViewModel(['form' => $studentInterviewForm, 'message' => null, 'person' => $person]);
         }
         return new ViewModel(['form' => null, 'message' => 'Nenhum candidato foi escolhido']);
     } catch (\Exception $ex) {
         return new ViewModel(['form' => null, 'message' => $ex->getMessage()]);
     }
 }