public function down()
 {
     $this->auth();
     try {
         $instance = new InstanceModel(array('questionnaireName' => 'CSI SIG', 'questionnaireVersion' => '4.0', 'revision' => '2', 'instanceName' => 'Sample SIG Instance'));
         $questionnaire = $instance->parent;
         $instance->delete();
         $questionnaire->delete();
     } catch (Exception $e) {
     }
 }
 public function up()
 {
     // add the column
     $this->addColumn('instance', 'hidden', 'boolean', array('default' => 0));
     // reset db metadata cache
     QFrame_Db_Table::scanDb();
     QFrame_Db_Table::resetAll();
     // make sure that existing questionnaires have a default instance (and create one if not)
     $this->auth();
     foreach (QuestionnaireModel::getAllQuestionnaires('instance') as $questionnaire) {
         $default = $questionnaire->getDefaultInstance();
         if ($default === null) {
             $xml = $questionnaire->fetchQuestionnaireDefinition();
             InstanceModel::importXML($xml, '_default_', array('hidden' => 1));
         }
     }
 }
Example #3
0
 public function testEncryptedZipArchiveExportCanBeImported()
 {
     $this->auth();
     $crypto = CryptoModel::importRijndael256Key('testdupe', 'BqPwhnSskTFzxPUlljXG1zgG8cfgTSaGj8UyRWsKanA=');
     $instance = new InstanceModel(array('instanceID' => 1));
     $zip = new ZipArchiveModel($instance, array('new' => '1'));
     $zip->addInstanceFullResponsesXMLDocument();
     $zip->close();
     $encrypted = $crypto->encrypt($zip->getZipFileContents());
     $zip->deleteZipFile();
     $decrypted = $crypto->decrypt($encrypted);
     $tempfile = tempnam(PROJECT_PATH . DIRECTORY_SEPARATOR . 'tmp', 'zip');
     unlink($tempfile);
     file_put_contents($tempfile, $decrypted);
     $zip = new ZipArchiveModel(null, array('filename' => $tempfile));
     InstanceModel::importXML($zip, 'test encryption import');
     $zip->deleteZipFile();
 }
Example #4
0
 public function approveSaveAction()
 {
     try {
         if ($this->_hasParam('approvals')) {
             $page = new PageModel(array('pageID' => $this->_getParam('id'), 'depth' => 'response'));
             $comments = $this->_getParam('comments');
             foreach ($this->_getParam('approvals') as $questionID => $state) {
                 $question = $page->getQuestion(intval($questionID));
                 if ($question === null) {
                     throw new Exception('Invalid attempt to approve a non-existent question or question on another page');
                 }
                 $response = $question->getResponse();
                 if ($response->requiresAdditionalInfo() && !$response->hasAdditionalInfo()) {
                     throw new Exception('Invalid attempt to approve a response that requires additional information with none provided');
                 }
                 $response->state = intval($state);
                 if (array_key_exists($questionID, $comments)) {
                     if ($comments[$questionID] === '') {
                         $response->approverComments = null;
                     } else {
                         $response->approverComments = $comments[$questionID];
                     }
                 }
                 $response->save();
                 foreach ($question->children as $child) {
                     $response = $child->getResponse();
                     $response->state = intval($state);
                     $response->save();
                 }
             }
             $page->save();
             $instance = new InstanceModel(array('instanceID' => $page->instanceID, 'depth' => 'page'));
             $instance->save();
         }
     } catch (Exception $e) {
         $this->view->error = $e->getMessage();
     }
     $this->view->setRenderLayout(false);
 }
Example #5
0
 /**
  * Generates a signature for an questionnaire definition
  * 
  * @param questionnaire definition xml dom object
  * @return string md5 hash
  */
 public static function generateSignature($dom)
 {
     $questionnaireID = QuestionnaireModel::importXML($dom, array('SkipQuestionnaireExistCheck' => 1, 'SkipFileAttachments' => 1));
     $instanceID = InstanceModel::importXML($dom, '_generateSignature', array('questionnaireID' => $questionnaireID));
     $instance = new InstanceModel(array('instanceID' => $instanceID, 'depth' => 'instance'));
     $questionnaire = new QuestionnaireModel(array('questionnaireID' => $questionnaireID, 'depth' => 'questionnaire'));
     $signature = md5($instance->toXML(1));
     $instance->delete();
     $questionnaire->delete();
     return $signature;
 }
Example #6
0
 /**
  * Imports an XML Document and creates an instance
  *
  * @param mixed $import maybe a string xml document, DOMDocument object, or ZipArchiveModel object
  * @param string $instanceName is the name of the new instance
  * @param array $options contains a mix of options for import sources and validation 
  * @return integer instanceID
  */
 public static function importXML(&$import, $instanceName, $options = array())
 {
     $options = array_merge(array('pageClones' => 0, 'sectionClones' => 0, 'questionClones' => 0, 'pageResponses' => array('all' => 0), 'hidden' => 0), $options);
     if (!isset($instanceName) || strlen($instanceName) == 0) {
         throw new InvalidArgumentException('Missing instanceName argument');
     }
     libxml_use_internal_errors(true);
     if (is_a($import, 'ZipArchiveModel')) {
         $zip =& $import;
         $xml = $import->getInstanceFullResponsesXMLDocument();
         if ($xml === NULL) {
             $xml = $import->getQuestionnaireDefinitionXMLDocument();
         }
         if ($xml === NULL) {
             throw new Exception('Questionnaire definition not found in zip archive');
         }
         $dom = new DOMDocument();
         $dom->loadXML($xml);
     } elseif (is_a($import, 'DOMDocument')) {
         $dom =& $import;
         $xml = $dom->saveXML();
     } else {
         $xml =& $import;
         $dom = new DOMDocument();
         $dom->loadXML($xml);
     }
     $errors = libxml_get_errors();
     try {
         $logger = Zend_Registry::get('logger');
     } catch (Zend_Exception $e) {
     }
     foreach ($errors as $error) {
         $message = rtrim("XML error on line {$error->line} of {$error->file}: {$error->message}");
         if (isset($logger) && $logger) {
             $logger->log($message, Zend_Log::ERR);
         }
         error_log($message);
     }
     if (count($errors) > 0) {
         throw new Exception('XML Exception');
     }
     if (!isset(self::$questionReferenceTable)) {
         self::$questionReferenceTable = QFrame_Db_Table::getTable('question_reference');
     }
     if (!isset(self::$sectionReferenceTable)) {
         self::$sectionReferenceTable = QFrame_Db_Table::getTable('section_reference');
     }
     if (!isset(self::$pageReferenceTable)) {
         self::$pageReferenceTable = QFrame_Db_Table::getTable('page_reference');
     }
     if (!isset(self::$referenceTable)) {
         self::$referenceTable = QFrame_Db_Table::getTable('reference');
     }
     if (!isset(self::$referenceDetailTable)) {
         self::$referenceDetailTable = QFrame_Db_Table::getTable('reference_detail');
     }
     if (!isset(self::$ruleTable)) {
         self::$ruleTable = QFrame_Db_Table::getTable('rule');
     }
     if (!isset(self::$questionTypeTable)) {
         self::$questionTypeTable = QFrame_Db_Table::getTable('question_type');
     }
     if (!isset(self::$questionPromptTable)) {
         self::$questionPromptTable = QFrame_Db_Table::getTable('question_prompt');
     }
     if (!isset(self::$pageTable)) {
         self::$pageTable = QFrame_Db_Table::getTable('page');
     }
     if (!isset(self::$sectionTable)) {
         self::$sectionTable = QFrame_Db_Table::getTable('section');
     }
     if (!isset(self::$questionTable)) {
         self::$questionTable = QFrame_Db_Table::getTable('question');
     }
     if (!isset(self::$questionnaireTable)) {
         self::$questionnaireTable = QFrame_Db_Table::getTable('questionnaire');
     }
     if (!isset(self::$instanceTable)) {
         self::$instanceTable = QFrame_Db_Table::getTable('instance');
     }
     $transactionNumber = self::startSerializableTransaction();
     $questionTypeIDCache = array();
     // Stores questionTypes that have already been inserted
     $rulesMap = array();
     // Stores sourceID to questionGUID
     $pageGuidMap = array();
     // Stores pageGUID to pageID
     $sectionGuidMap = array();
     // Stores sectionGUID to sectionID
     $questionGuidMap = array();
     // Stores questionGUID to questionID
     $responseObjs = array();
     // Stores response objects so that they may be saved at the end
     // to ensure all rules and rule targets have been inserted
     $fileAttachments = array();
     // Stores information for attachments so that attachments may be inserted
     // at the end, after the question bulk load is complete
     $processedReferences = array();
     // Stores references (shortNames) that have already been inserted
     // into the reference table
     $questionPromptsMap = array();
     // Stores question prompts.  First key is questionTypeID, second key is
     // prompt value, and the value is the promptID.
     $questionnaire = $dom->getElementsByTagName('questionnaire')->item(0);
     $questionnaireName = $questionnaire->getAttribute('questionnaireName');
     $questionnaireVersion = $questionnaire->getAttribute('questionnaireVersion');
     $revision = $questionnaire->getAttribute('revision');
     // If questionnaireID is already known and passed an argument, use it instead of looking it up
     if (isset($options['questionnaireID'])) {
         $questionnaireID = $options['questionnaireID'];
     } else {
         $questionnaireID = self::$questionnaireTable->getQuestionnaireID($questionnaireName, $questionnaireVersion, $revision);
     }
     if (isset($questionnaireID)) {
         $instanceID = self::$instanceTable->getInstanceID($questionnaireID, $instanceName);
         if (isset($instanceID)) {
             throw new Exception('Instance name already exists for this questionnaire');
         }
     } else {
         throw new Exception('Questionnaire was not found');
     }
     if (isset($options['instanceID'])) {
         $importResponsesInstance = new InstanceModel(array('instanceID' => $options['instanceID']));
         $importDom = new DOMDocument();
         $importDom->loadXML($importResponsesInstance->toXML());
         $importInstanceQuestionsDom = $importDom->getElementsByTagName('question');
         for ($q = 0; $q < $importInstanceQuestionsDom->length; $q++) {
             $question = $importInstanceQuestionsDom->item($q);
             if ($question->getElementsByTagName('questionType') === 'V') {
                 continue;
             }
             $responses = $question->getElementsByTagName('responses');
             if ($responses->length) {
                 $resps = $responses->item(0)->getElementsByTagName('response');
                 for ($r = 0; $r < $resps->length; $r++) {
                     $response = $resps->item($r);
                     $additionalInfo = isset($responses->item(0)->getElementsByTagName('additionalInfo')->item(0)->nodeValue) ? $responses->item(0)->getElementsByTagName('additionalInfo')->item(0)->nodeValue : '';
                     $approverComments = isset($responses->item(0)->getElementsByTagName('approverComments')->item(0)->nodeValue) ? $responses->item(0)->getElementsByTagName('approverComments')->item(0)->nodeValue : '';
                     $importInstanceResponses[$question->getElementsByTagName('questionGUID')->item(0)->nodeValue][] = array('responseText' => $response->getElementsByTagName('responseText')->item(0)->nodeValue, 'additionalInfo' => $additionalInfo, 'approverComments' => $approverComments);
                 }
             }
         }
     }
     $instanceID = self::$instanceTable->insert(array('questionnaireID' => $questionnaireID, 'instanceName' => $instanceName, 'hidden' => $options['hidden']));
     $pages = $questionnaire->getElementsByTagName('page');
     for ($t = 0; $t < $pages->length; $t++) {
         $page = $pages->item($t);
         $pageIDs = self::importXMLPage($page, $questionnaireID, $instanceID, $pageGuidMap);
         $pageID = $pageIDs[0];
         $pageGUID = $pageIDs[1];
         $pageReferences = $page->getElementsByTagName('pageReferences');
         self::importXMLReferences('page', $pageReferences, $instanceID, $pageID, null, null, $processedReferences);
         $sections = $page->getElementsByTagName('section');
         for ($s = 0; $s < $sections->length; $s++) {
             $section = $sections->item($s);
             $sectionIDs = self::importXMLSection($section, $instanceID, $pageID, $sectionGuidMap);
             $sectionID = $sectionIDs[0];
             $sectionGUID = $sectionIDs[1];
             $sectionReferences = $section->getElementsByTagName('sectionReferences');
             self::importXMLReferences('section', $sectionReferences, $instanceID, $pageID, $sectionID, null, $processedReferences);
             foreach ($section->getElementsByTagName('questions')->item(0)->childNodes as $question) {
                 if ($question->nodeName === 'csi:question') {
                     $questionIDs = self::importXMLQuestion(false, null, $question, $questionnaireID, $instanceID, $pageID, $pageGUID, $sectionID, $sectionGUID, $questionGuidMap, $questionTypeIDCache, $rulesMap, $questionPromptsMap);
                     $questionID = $questionIDs[0];
                     $questionGUID = $questionIDs[1];
                     $questionTypeID = $questionIDs[2];
                     $questionPrompts = $question->getElementsByTagName('questionPrompt');
                     $questionReferences = $question->getElementsByTagName('questionReferences');
                     self::importXMLReferences('question', $questionReferences, $instanceID, $pageID, $sectionID, $questionID, $processedReferences);
                     $responses = $question->getElementsByTagName('responses');
                     self::importXMLResponses($responses, $question, $instanceID, $pageID, $sectionID, $questionID, $questionGUID, $questionTypeID, $importInstanceResponses, $questionPrompts, $questionPromptsMap, $responseObjs, $fileAttachments, $options);
                 } elseif ($question->nodeName === 'csi:questionGroup') {
                     $questionIDs = self::importXMLQuestion(true, null, $question, $questionnaireID, $instanceID, $pageID, $pageGUID, $sectionID, $sectionGUID, $questionGuidMap, $questionTypeIDCache, $rulesMap, $questionPromptsMap);
                     $parentQuestionID = $questionIDs[0];
                     $questionReferences = $question->getElementsByTagName('groupQuestionReferences');
                     self::importXMLReferences('question', $questionReferences, $instanceID, $pageID, $sectionID, $parentQuestionID, $processedReferences);
                     if ($options['pageResponses']['all'] || isset($options['pageResponses'][$pageID]) && $options['pageResponses'][$pageID]) {
                         $attachments = $question->getElementsByTagName('attachment');
                         $fileAttachments[$parentQuestionID] = $attachments;
                     }
                     $childQuestions = $question->getElementsByTagName('question');
                     for ($cq = 0; $cq < $childQuestions->length; $cq++) {
                         $question = $childQuestions->item($cq);
                         $questionIDs = self::importXMLQuestion(false, $parentQuestionID, $question, $questionnaireID, $instanceID, $pageID, $pageGUID, $sectionID, $sectionGUID, $questionGuidMap, $questionTypeIDCache, $rulesMap, $questionPromptsMap);
                         $questionID = $questionIDs[0];
                         $questionGUID = $questionIDs[1];
                         $questionTypeID = $questionIDs[2];
                         $questionPrompts = $question->getElementsByTagName('questionPrompt');
                         $questionReferences = $question->getElementsByTagName('questionReferences');
                         self::importXMLReferences('question', $questionReferences, $instanceID, $pageID, $sectionID, $questionID, $processedReferences);
                         $responses = $question->getElementsByTagName('responses');
                         self::importXMLResponses($responses, $question, $instanceID, $pageID, $sectionID, $questionID, $questionGUID, $questionTypeID, $importInstanceResponses, $questionPrompts, $questionPromptsMap, $responseObjs, $fileAttachments, $options);
                     }
                 }
             }
         }
     }
     self::importXMLRules($questionnaireID, $instanceID, $rulesMap, $pageGuidMap, $sectionGuidMap, $questionGuidMap);
     self::$questionTable->processBulk();
     self::$sectionTable->processBulk();
     self::$pageTable->processBulk();
     self::$questionPromptTable->processBulk();
     self::$questionTypeTable->processBulk();
     self::$ruleTable->processBulk();
     self::$referenceTable->processBulk();
     self::$referenceDetailTable->processBulk();
     self::$questionReferenceTable->processBulk();
     self::$sectionReferenceTable->processBulk();
     self::$pageReferenceTable->processBulk();
     foreach ($responseObjs as $response) {
         $response->save();
     }
     foreach ($fileAttachments as $questionID => $attachments) {
         $questionModel = new QuestionModel(array('questionID' => $questionID, 'depth' => 'question'));
         self::importXMLAttachments($attachments, $questionModel, $import);
     }
     $instance = new InstanceModel(array('instanceID' => $instanceID, 'depth' => 'page'));
     $instance->save();
     self::dbCommit($transactionNumber);
     return $instance->instanceID;
 }
Example #7
0
 public function testNoResponsesInstanceWithMergedResponsesExportEqualsResponsesInstanceExport()
 {
     $this->auth();
     $xml = file_get_contents(PROJECT_PATH . "/test/data/xml/responses-questionnaire-definition.xml");
     QuestionnaireModel::importXML($xml);
     InstanceModel::importXML($xml, 'Test1 Resp. Company', array('pageResponses' => array('all' => 1)));
     $instance1 = new InstanceModel(array('questionnaireName' => 'Test1 Questionnaire', 'questionnaireVersion' => '3.00', 'revision' => 1, 'instanceName' => 'Test1 Resp. Company'));
     $xml = file_get_contents(PROJECT_PATH . "/test/data/xml/no-responses-questionnaire-definition.xml");
     InstanceModel::importXML($xml, 'Test1 Company', array('instanceID' => $instance1->instanceID));
     $instance2 = new InstanceModel(array('questionnaireName' => 'Test1 Questionnaire', 'questionnaireVersion' => '3.00', 'revision' => 1, 'instanceName' => 'Test1 Company'));
     $xml1 = $instance1->toXML(1);
     $xml2 = $instance2->toXML(1);
     $xml1 = preg_replace("/Test1 Resp. Company/", "Test1 Company", $xml1);
     $xml1 = preg_replace("/<csi:responseDate>.+<\\/csi:responseDate>/", "", $xml1);
     $xml2 = preg_replace("/<csi:responseDate>.+<\\/csi:responseDate>/", "", $xml2);
     $this->assertEquals($xml1, $xml2);
 }
Example #8
0
 /**
  * Adds all attachments associated with the instance to the zip archive
  */
 public function addAttachments()
 {
     $attachmentQuestions = FileModel::fetchObjectIdsByInstance($this->instance->instanceID);
     $instance = new InstanceModel(array('instanceID' => $this->instance->instanceID, 'depth' => 'question'));
     while ($page = $instance->nextPage()) {
         while ($section = $page->nextSection()) {
             while ($question = $section->nextQuestion()) {
                 if (isset($attachmentQuestions['QuestionModel'][$question->questionID])) {
                     $fileObj = new FileModel($question);
                     $ids = $fileObj->fetchAll();
                     if ($ids === NULL) {
                         continue;
                     }
                     foreach ($ids as $id) {
                         $file = $fileObj->fetchWithProperties($id);
                         $this->addFromString("files/{$id}", $file['contents']);
                     }
                 }
             }
         }
     }
 }
 public function PdfDownloadAction()
 {
     $session = new Zend_Session_Namespace('login');
     $cryptoID = $this->_hasParam('cryptoID') ? $this->_getParam('cryptoID') : null;
     $pageHeadersAll = $this->_hasParam('pageHeader') ? $this->_getParam('pageHeader') : array();
     $pageHeaders = array();
     while (list($key, $val) = each($pageHeadersAll)) {
         if (isset($val[pdf]) && $val[pdf] == 1) {
             $pageHeaders[] = $key;
         }
     }
     if ($this->_hasParam('download') && isset($session->tempFile)) {
         if (isset($cryptoID) && $cryptoID != 0) {
             $this->view->cryptoID = $cryptoID;
         }
         $this->view->pdf = file_get_contents($session->tempFile);
         unlink($session->tempFile);
         unset($session->tempFile);
     } else {
         $instance = new InstanceModel(array('instanceID' => $session->dataInstanceID, 'depth' => 'instance'));
         $html = $instance->xml2html($pageHeaders);
         $dompdf = new DOMPDF();
         $dompdf->load_html($html);
         $dompdf->render();
         $pdf = $dompdf->output();
         if (isset($cryptoID) && $cryptoID != 0) {
             $crypto = new CryptoModel(array('cryptoID' => $cryptoID));
             $pdf = $crypto->encrypt($pdf);
             $this->view->cryptoID = $cryptoID;
         }
         $tempFile = tempnam(PROJECT_PATH . DIRECTORY_SEPARATOR . 'tmp', 'exp');
         file_put_contents($tempFile, $pdf);
         $session->tempFile = $tempFile;
     }
     $this->view->setRenderLayout(false);
 }
Example #10
0
$core_path = _path(dirname(__FILE__), '..', 'core');
/*
 * Set up a bunch of path constants that the application will use to refer
 * to various application directories
 */
include _path(dirname(__FILE__), '..', 'core', 'paths.php');
/*
 * Deal with environment stuff including determining the current environment
 * and loading the configuration stuff for that environment
 */
include _path(CORE_PATH, 'env.php');
/*
 * Include file that contains pure configuration (used for testing)
 * as well as routing.  Also include the file that sets up database
 * "stuff".
 */
include _path(CORE_PATH, 'database.php');
/*
 * Set up any dynamic properties (properties that rely on current environment configuration)
 */
include _path($core_path, 'dynamic.php');
// perform mock authentication
$auth_adapter = new QFrame_Auth_Adapter('', '', true);
$auth = Zend_Auth::getInstance();
$auth->authenticate($auth_adapter);
$content = file_get_contents(_path(PROJECT_PATH, 'xml', 'sig-4-0-questionnaire-definition.xml'));
QuestionnaireModel::importXML($content);
$options['pageResponses']['all'] = 1;
// import all responses
InstanceModel::importXML($content, 'Acme Vendor', $options);