Example #1
0
 public function getArrayDevolutiveReturn($questionnaireId, $userId, $programaId, $blockId = null)
 {
     $this->Questionnaire = new Model_Questionnaire();
     $this->Alternative = new Model_Alternative();
     $this->Question = new Model_Question();
     try {
         $arrDevolutiveRAA = array();
         $arrCriteria = array();
         $arrBlocks = array();
         $arrQuestionnaire = array();
         $arrRadarData = array();
         // Definições do Questionário
         //@TODO - por em cache
         $questionnaireDefs = $this->Questionnaire->getQuestionnaireById($questionnaireId);
         $arrQuestionnaire['title'] = $questionnaireDefs->getTitle();
         $arrQuestionnaire['description'] = $questionnaireDefs->getDescription();
         $arrQuestionnaire['long_description'] = $questionnaireDefs->getLongDescription();
         $arrQuestionnaire['operation_beginning'] = Vtx_Util_Date::format_dma($questionnaireDefs->getOperationBeginning());
         $arrQuestionnaire['operation_ending'] = Vtx_Util_Date::format_dma($questionnaireDefs->getOperationEnding());
         // Definições da Questão
         $questionsDefs = $this->Question->getAllByQuestionnaireIdBlockId($questionnaireId, $blockId);
         $cacheQuestion = new Vtx_Cache_MPE_QuestionarioCache();
         /**
          * - metodo criado para refatorar 2 metodos que faziam a mesma coisa e estavam dentro do foreach
          * - metodo que retorna todas alternativas de todas as questoes de um bloco que um Usuario respondeu
          * - a utilizacao deste metodo reduziu media de 25% a qtd de queries chamadas pelo BD.
          * - no meu exemplo reduziu de 320 para 235.
          * - chamada: $isAnswered = $this->Question->setaQuestionResp($QuestionRespDbTable, $questionId);
          * @author esilva
          */
         $QuestionRespDbTable = $this->Question->getAnswerByBlockId($blockId, $userId, $programaId);
         //var_dump ($QuestionRespDbTable); exit;
         /**
          * 
          * Recupera dados de cada questao de um Bloco:
          * - enunciado questao 
          * - alternativas
          * - resposta
          * - resultado anual
          * 
          */
         foreach ($questionsDefs as $question_def) {
             $idBlock = "";
             $idCriterion = "";
             $questionId = $question_def->getId();
             $question_value = $question_def->getQuestao();
             // Grava a questão no array de devolutiva
             $arrDevolutiveRAA[$questionId]['designation'] = $question_def->getDesignacao();
             $arrDevolutiveRAA[$questionId]['value'] = $question_value;
             $arrDevolutiveRAA[$questionId]['text'] = $question_def->getTexto();
             // Verifica se existe Bloco válido e grava nos arrays de blocos e devolutiva
             $idBlock = $question_def->getBloco();
             if ($idBlock != "" && $idBlock != 0) {
                 $arrBlocks[$idBlock] = $question_def->getBlocoTitulo();
                 $arrDevolutiveRAA[$questionId]['block'] = $question_def->getBloco();
             }
             // Verifica se existe Critério válido e grava nos arrays de critérios e devolutiva
             $idCriterion = $question_def->getCriterio();
             if ($idCriterion != "" && $idCriterion != 0) {
                 $arrCriteria[$idCriterion] = $idCriterion . ". " . $question_def->getCriterioTitulo();
                 $arrDevolutiveRAA[$questionId]['criterion'] = $question_def->getCriterio();
             }
             $isAnswered['answerResult'] = null;
             //se empresa respondeu a questao
             //$isAnswered = $this->Question->isAnsweredByEnterprise($questionId,$userId, true);
             $isAnswered = $this->Question->setaQuestionResp($QuestionRespDbTable, $questionId);
             //var_dump('isAnswered',$isAnswered);
             if ($isAnswered['status']) {
                 // Recupera a resposta
                 //$answer = $this->Question->getQuestionAnswer($questionId,$userId);
                 //refatorado para otimizar queries executadas
                 $answer = $isAnswered['answerResult'];
                 $alternative_id = $answer['alternative_id'];
                 $arrDevolutiveRAA[$questionId]['alternative_id'] = $alternative_id;
                 $arrDevolutiveRAA[$questionId]['write_answer'] = isset($answer['answer_value']) ? $answer['answer_value'] : "";
                 if (count($answer['annual_result']) > 0) {
                     $arrDevolutiveRAA[$questionId]['annual_result'] = $answer['annual_result'];
                     $arrDevolutiveRAA[$questionId]['annual_result_unit'] = $answer['annual_result_unit'];
                 } else {
                     $arrDevolutiveRAA[$questionId]['annual_result'] = "";
                     $arrDevolutiveRAA[$questionId]['annual_result_unit'] = "";
                 }
                 // Recupera o feedback da alternativa escolhida
                 #$alternative =  $this->Alternative->getAlternativeById($alternative_id);
                 //recupera do cache
                 $alternative = $cacheQuestion->alternative($alternative_id, $this->Alternative);
                 $arrDevolutiveRAA[$questionId]['alternative_designation'] = $alternative->getDesignation();
                 $arrDevolutiveRAA[$questionId]['alternative_feedback'] = $alternative->getFeedbackDefault();
                 // Recupera os comentarios 1 do avaliador da resolução da questão
                 //REFACTORING
                 //$arrDevolutiveRAA[$questionId]['answer_feedback'] = $this->Question->getAnswerFeedback( $isAnswered['objAnswered']['AnswerIdValue'] );//$isAnswered['objAnswered']->getAnswerId());
                 $arrDevolutiveRAA[$questionId]['answer_feedback'] = $answer['AnswerFeedback'];
                 // Recupera os comentarios 2 do avaliador da resolução da questão
                 //REFACTORING
                 //$arrDevolutiveRAA[$questionId]['answer_feedback_improve'] = $this->Question->getAnswerFeedbackImprove($isAnswered['objAnswered']['AnswerIdValue']);
                 $arrDevolutiveRAA[$questionId]['answer_feedback_improve'] = $answer['AnswerFeedbackImprove'];
                 //AdditionalInfo
                 $arrDevolutiveRAA[$questionId]['additional_info'] = $answer['AdditionalInfo'];
             }
             // Recupera as alternativas da questão
             //$alternativesDefs =  $this->Alternative->getAllByQuestionId($questionId);
             //recupera do cache
             $alternativesDefs = $cacheQuestion->alternativasEQuestoes($questionId, $this->Alternative);
             //var_dump ('alternativesDefs: ', $alternativesDefs);
             //echo "<br><Br>";
             foreach ($alternativesDefs as $alternative_def) {
                 if (is_object($alternative_def)) {
                     $arr_alternative[$alternative_def->getDesignation()] = $alternative_def->getValue();
                 } else {
                     $arr_alternative[$alternative_def['Designation']] = $alternative_def['Value'];
                 }
             }
             $arrDevolutiveRAA[$questionId]['alternatives'] = $arr_alternative;
         }
         return array($arrDevolutiveRAA, $arrBlocks, $arrCriteria, $arrQuestionnaire);
     } catch (Vtx_UserException $e) {
         DbTable_Questionnaire::getInstance()->getAdapter()->rollBack();
         return array('status' => false, 'messageError' => $e->getMessage());
     } catch (Exception $e) {
         DbTable_Questionnaire::getInstance()->getAdapter()->rollBack();
         throw new Exception($e);
     }
 }