public function getResultsAction()
 {
     $viewId = (int) $this->_getParam('viewId');
     $params = $this->_getAllParams();
     $filterParams = array();
     foreach ($params as $key => $value) {
         if (substr($key, 0, 7) != 'filter_') {
             continue;
         }
         $index = substr($key, 7);
         $x = explode('_', $index);
         if (!isset($x[1])) {
             continue;
         }
         $index = str_replace('_', '.', $index);
         $filterParams[$index] = $value;
     }
     $reportView = new ReportView();
     $reportView->reportViewId = $viewId;
     $reportView->populate();
     $reportBase = $reportView->reportBase;
     $filterBase = $reportView->reportBase->unserializedFilters;
     $filters = array();
     if ($filterBase !== null) {
         foreach ($filterBase as $key => $filter) {
             $value = $filter->defaultValue;
             if (isset($filterParams[$key]) && strlen($filterParams[$key]) > 0) {
                 $value = $filterParams[$key];
             }
             $filters[$key] = $value;
         }
     }
     $data = $reportBase->executeQueries($filters, $reportView);
     if (strlen($reportView->showResultsIn) <= 0 || $reportView->showResultsIn != 'grid') {
         $showResultsOptions = $reportView->unserializedShowResultsOptions;
         switch ($reportView->showResultsIn) {
             case 'file':
                 $separator = $showResultsOptions['separator'];
                 $lineEndings = $showResultsOptions['lineEndings'];
                 $resultsSeparator = $showResultsOptions['resultsSeparator'];
                 $includeHeaderRow = isset($showResultsOptions['includeHeaderRow']) && $showResultsOptions['includeHeaderRow'] ? true : false;
                 $queriesData = array();
                 $sep = "";
                 foreach ($data as $queryData) {
                     $contents = array();
                     if ($includeHeaderRow) {
                         foreach ($queryData['rows'] as $row) {
                             $headers = array();
                             foreach ($row as $key => $value) {
                                 $headers[] = $key;
                             }
                             $contents[] = implode($separator, $headers);
                             break;
                         }
                     }
                     foreach ($queryData['rows'] as $row) {
                         $rows = array();
                         foreach ($row as $key => $value) {
                             $rows[] = $value;
                         }
                         $contents[] = implode($separator, $rows);
                     }
                     switch ($lineEndings) {
                         case 'windows':
                             $sep = "\r\n";
                             break;
                         case 'mac':
                             $sep = "\r";
                             break;
                         case 'linux':
                             $sep = "\n";
                             break;
                         default:
                             $sep = "";
                             break;
                     }
                     $queriesData[] = implode($sep, $contents);
                 }
                 $flatfile = implode($sep . $resultsSeparator . $sep, $queriesData);
                 $this->_forward('flat', 'files', null, array('data' => $flatfile));
                 return;
             case 'xml':
                 $xml = $this->_generateResultsXML($data);
                 $this->_forward('xml', 'files', null, array('data' => $xml->asXML()));
                 return;
             case 'pdf':
                 $xml = $this->_generateResultsXML($data);
                 //PdfController::toXML($data,'Report',null);
                 $xmlData = $xml->asXML();
                 $xmlData = preg_replace('/dataNode=/', 'xfa:dataNode=', $xmlData);
                 $xmlData = preg_replace('/<\\?.*\\?>/', '', $xmlData);
                 $this->_forward('pdf-merge-attachment', 'pdf', null, array('attachmentReferenceId' => $reportView->reportViewId, 'xmlData' => $xmlData));
                 return;
             case 'graph':
                 // to be implemented
                 break;
         }
     }
     //trigger_error(print_r($data,true),E_USER_NOTICE);
     $json = Zend_Controller_Action_HelperBroker::getStaticHelper('json');
     $json->suppressExit = true;
     $json->direct($data);
 }
Пример #2
0
 /**
  * Constructor
  *
  * @param Report $report The report this view is based on.
  */
 public function __construct(Report $report)
 {
     parent::__construct($report);
 }
 public function processReorderMappingTransformAction()
 {
     $viewId = (int) $this->_getParam('viewId');
     $mappingId = $this->_getParam('mappingId');
     $from = $this->_getParam('from');
     $to = $this->_getParam('to');
     $reportView = new ReportView();
     $reportView->reportViewId = $viewId;
     $reportView->populate();
     $columnDefinitions = $reportView->unserializedColumnDefinitions;
     if ($columnDefinitions !== null && isset($columnDefinitions[$mappingId])) {
         $row = $columnDefinitions[$mappingId];
         if (isset($row->transforms[$from])) {
             $fromTransform = $row->transforms[$from];
             unset($columnDefinitions[$mappingId]->transforms[$from]);
             $tmpTransforms = array();
             foreach ($row->transforms as $id => $transform) {
                 $tmpTransforms[$id] = $transform;
                 if ($to == $id) {
                     $tmpTransforms[$from] = $fromTransform;
                 }
             }
             $columnDefinitions[$mappingId]->transforms = $tmpTransforms;
             $reportView->serializedColumnDefinitions = $columnDefinitions;
             $reportView->persist();
         }
     }
     $rows = array();
     foreach ($columnDefinitions[$mappingId]->transforms as $id => $transform) {
         $rows[] = $this->_generateTransformGridRowData($transform);
     }
     $json = Zend_Controller_Action_HelperBroker::getStaticHelper('json');
     $json->suppressExit = true;
     $json->direct(array('rows' => $rows));
 }
Пример #4
0
 public function getReportAction()
 {
     $baseId = (int) $this->_getParam('baseId');
     $data = array('filters' => array(), 'views' => array());
     $reportBase = new ReportBase();
     $reportBase->reportBaseId = $baseId;
     $reportBase->populate();
     foreach ($reportBase->reportFilters as $reportFilter) {
         $filter = array();
         $filter['id'] = $reportFilter->id;
         $filter['name'] = $reportFilter->name;
         $filter['defaultValue'] = $reportFilter->defaultValue;
         $filter['type'] = $reportFilter->type;
         $filter['options'] = $reportFilter->options;
         $list = null;
         if ($reportFilter->type == ReportBase::FILTER_TYPE_ENUM) {
             $enumerationClosure = new EnumerationClosure();
             $filter['enums'] = array();
             $paths = $enumerationClosure->generatePaths($reportFilter->enumName['id']);
             foreach ($paths as $id => $name) {
                 $filter['enums'][] = array('id' => $id, 'name' => $name);
             }
         } else {
             if ($reportFilter->type == ReportBase::FILTER_TYPE_QUERY) {
                 $reportQuery = new ReportQuery();
                 $reportQuery->reportQueryId = (int) $reportFilter->query;
                 $reportQuery->populate();
                 $filter['queries'] = $reportQuery->executeQuery();
                 if ($reportFilter->includeBlank) {
                     array_unshift($filter['queries'], array('id' => '', 'name' => '&amp;nbsp;'));
                 }
             } else {
                 if ($reportFilter->type == ReportBase::FILTER_TYPE_LIST_BUILDING) {
                     $orm = new Building();
                     $list = array('ormIterator' => $orm->getIterator(), 'id' => 'buildingId', 'name' => 'displayName');
                 } else {
                     if ($reportFilter->type == ReportBase::FILTER_TYPE_LIST_PRACTICE) {
                         $orm = new Practice();
                         $list = array('ormIterator' => $orm->getIterator(), 'id' => 'practiceId', 'name' => 'name');
                     } else {
                         if ($reportFilter->type == ReportBase::FILTER_TYPE_LIST_PROVIDER) {
                             $orm = new Provider();
                             $list = array('ormIterator' => $orm->getIter(), 'id' => 'personId', 'name' => 'displayName');
                         } else {
                             if ($reportFilter->type == ReportBase::FILTER_TYPE_LIST_ROOM) {
                                 $orm = new Room();
                                 $list = array('ormIterator' => $orm->getIterator(), 'id' => 'roomId', 'name' => 'displayName');
                             } else {
                                 if ($reportFilter->type == ReportBase::FILTER_TYPE_LIST_BUILDING_PREF || $reportFilter->type == ReportBase::FILTER_TYPE_LIST_ROOM_PREF || $reportFilter->type == ReportBase::FILTER_TYPE_LIST_PROVIDER_PREF) {
                                     $room = User::myPreferencesLocation();
                                     $practiceId = (int) $room->building->practiceId;
                                     $buildingId = (int) $room->buildingId;
                                     if ($reportFilter->type == ReportBase::FILTER_TYPE_LIST_BUILDING_PREF) {
                                         $orm = new Building();
                                         $orm->practiceId = $practiceId;
                                         $list = array('ormIterator' => $orm->getIteratorByPracticeId(), 'id' => 'buildingId', 'name' => 'displayName');
                                     } else {
                                         if ($reportFilter->type == ReportBase::FILTER_TYPE_LIST_ROOM_PREF) {
                                             $orm = new Room();
                                             $orm->buildingId = $buildingId;
                                             $list = array('ormIterator' => $orm->getIteratorByBuildingId(), 'id' => 'roomId', 'name' => 'displayName');
                                         } else {
                                             $orm = new Provider();
                                             $list = array('ormIterator' => $orm->getIteratorByPracticeId($practiceId), 'id' => 'personId', 'name' => 'displayName');
                                         }
                                     }
                                 }
                             }
                         }
                     }
                 }
             }
         }
         if ($list !== null) {
             $filter['lists'] = array();
             foreach ($list['ormIterator'] as $row) {
                 $filter['lists'][] = array('id' => $row->{$list['id']}, 'name' => htmlspecialchars($row->{$list['name']}));
             }
         }
         $data['filters'][] = $filter;
     }
     $reportView = new ReportView();
     $filters = array('reportBaseId' => $reportBase->reportBaseId, 'active' => 1);
     $reportViewIterator = $reportView->getIteratorByFilters($filters);
     foreach ($reportViewIterator as $view) {
         $row = array();
         $row['id'] = $view->reportViewId;
         $row['data'] = array();
         $row['data'][] = $view->displayName;
         $row['data'][] = $view->runQueriesImmediately;
         $row['data'][] = strlen($view->showResultsIn) > 0 ? $view->showResultsIn : 'grid';
         $data['views'][] = $row;
     }
     $this->view->filterTypes = ReportBase::getFilterTypes();
     $json = Zend_Controller_Action_HelperBroker::getStaticHelper('json');
     $json->suppressExit = true;
     $json->direct($data);
 }
Пример #5
0
 public static function generateResults($viewId, $filterParams)
 {
     $reportView = new ReportView();
     $reportView->reportViewId = $viewId;
     $reportView->populate();
     $reportBase = $reportView->reportBase;
     $filterBase = $reportView->reportBase->unserializedFilters;
     $filters = array();
     if ($filterBase !== null) {
         foreach ($filterBase as $key => $filter) {
             $value = $filter->defaultValue;
             if (isset($filterParams[$key]) && strlen($filterParams[$key]) > 0) {
                 $value = $filterParams[$key];
             }
             $filters[$key] = $value;
         }
     }
     $data = $reportBase->executeQueries($filters, $reportView);
     $ret = array('data' => $data, 'type' => $reportView->showResultsIn, 'customizeColumnNames' => $reportView->customizeColumnNames);
     if (strlen($reportView->showResultsIn) <= 0 || $reportView->showResultsIn != 'grid') {
         $showResultsOptions = $reportView->unserializedShowResultsOptions;
         switch ($reportView->showResultsIn) {
             case 'file':
                 $separator = $showResultsOptions['separator'];
                 $lineEndings = $showResultsOptions['lineEndings'];
                 $resultsSeparator = $showResultsOptions['resultsSeparator'];
                 $includeHeaderRow = isset($showResultsOptions['includeHeaderRow']) && $showResultsOptions['includeHeaderRow'] ? true : false;
                 $queriesData = array();
                 $sep = "";
                 foreach ($data as $queryData) {
                     $contents = array();
                     if ($includeHeaderRow) {
                         $contents[] = implode($separator, $queryData['headers']);
                     }
                     foreach ($queryData['rows'] as $row) {
                         $contents[] = implode($separator, $row['data']);
                     }
                     switch ($lineEndings) {
                         case 'windows':
                             $sep = "\r\n";
                             break;
                         case 'mac':
                             $sep = "\r";
                             break;
                         case 'linux':
                             $sep = "\n";
                             break;
                         default:
                             $sep = "";
                             break;
                     }
                     $queriesData[] = implode($sep, $contents);
                 }
                 $flatfile = implode($sep . $resultsSeparator . $sep, $queriesData);
                 $ret['value'] = $flatfile;
                 return $ret;
             case 'xml':
                 $xml = self::_generateResultsXML($data);
                 $ret['value'] = $xml->asXML();
                 return $ret;
             case 'pdf':
                 $xml = self::_generateResultsXML($data);
                 //PdfController::toXML($data,'Report',null);
                 $xmlData = $xml->asXML();
                 $xmlData = preg_replace('/dataNode=/', 'xfa:dataNode=', $xmlData);
                 $xmlData = preg_replace('/<\\?.*\\?>/', '', $xmlData);
                 $ret['value'] = array('attachmentReferenceId' => $reportView->reportViewId, 'xmlData' => $xmlData);
                 return $ret;
             case 'graph':
                 // to be implemented
                 break;
             case 'pqri':
                 $ret['value'] = NQFPQRIReport::generatePQRIXML($data);
                 return $ret;
         }
     }
     return $ret;
 }
Пример #6
0
 public function executeQueries(array $filters, ReportView $view)
 {
     $config = Zend_Registry::get('config');
     $dbName = $config->database->params->dbname;
     $db = Zend_Registry::get('dbAdapter');
     $ret = array();
     $reportFilters = array();
     foreach ($this->reportFilters as $key => $filter) {
         $reportFilters['{{' . $filter->name . '}}'] = $filter;
     }
     //trigger_error(print_r($reportFilters,true),E_USER_NOTICE);
     $reportQuery = new ReportQuery();
     $reportQueryIterator = $reportQuery->getIteratorByBaseId($this->reportBaseId);
     foreach ($reportQueryIterator as $query) {
         $row = array();
         $row['reportQuery'] = $query->toArray();
         $queryValue = $query->query;
         $tokens = $this->_extractTokens($queryValue);
         if (isset($tokens[0])) {
             // tokens defined
             // check for undefined/orphaned filter
             $undefinedTokens = array();
             foreach ($tokens as $token) {
                 if (!isset($reportFilters[$token])) {
                     $undefinedTokens[] = $token;
                 }
             }
             if (isset($undefinedTokens[0])) {
                 $error = 'Query "' . $query->displayName . '" contains undefined tokens: ' . implode(', ', $undefinedTokens);
                 $row['error'] = $error;
                 trigger_error($error, E_USER_NOTICE);
                 $ret[] = $row;
                 continue;
             }
             $queryValue = $this->_applyFilters($filters, $queryValue, $tokens);
         }
         $columnDefinitions = $view->unserializedColumnDefinitions;
         switch ($query->type) {
             case ReportQuery::TYPE_SQL:
                 trigger_error($queryValue, E_USER_NOTICE);
                 try {
                     if ($view->customizeColumnNames) {
                         $results = array();
                         $stmt = $db->query($queryValue, array(), Zend_Db::FETCH_NUM);
                         $columnInfo = array();
                         $rowCount = $stmt->rowCount();
                         for ($i = 0; $i < $rowCount; $i++) {
                             $fetchRow = $stmt->fetch(Zend_Db::FETCH_NUM, null, $i);
                             if ($i == 0) {
                                 for ($ctr = 0, $rowLen = count($fetchRow); $ctr < $rowLen; $ctr++) {
                                     $columnMeta = $stmt->getColumnMeta($ctr);
                                     $resultSetName = $dbName . '.' . $columnMeta['table'] . '.' . $columnMeta['name'];
                                     foreach ($columnDefinitions as $id => $mapping) {
                                         // id, queryId, queryName, resultSetName, displayName, transform
                                         if ($mapping->resultSetName == $resultSetName) {
                                             $columnInfo[$ctr] = $mapping;
                                             break;
                                         }
                                     }
                                 }
                             }
                             $tmp = array();
                             foreach ($columnInfo as $index => $mapping) {
                                 $tmp[$mapping->displayName] = $this->_applyTransforms($mapping->transforms, $fetchRow[$index]);
                             }
                             $tmpResult = array();
                             foreach ($columnDefinitions as $id => $mapping) {
                                 // id, queryId, queryName, resultSetName, displayName, transform
                                 $tmpResult[$mapping->displayName] = $tmp[$mapping->displayName];
                             }
                             $results[] = $tmpResult;
                         }
                     } else {
                         $results = $db->fetchAll($queryValue);
                     }
                     $row['rows'] = $results;
                 } catch (Exception $e) {
                     $uniqErrCode = uniqid();
                     $row['error'] = 'There was a problem executing query: ' . $query->displayName . '. Contact your administrator with error code: ' . $uniqErrCode;
                     trigger_error('Exception error (' . $uniqErrCode . '): ' . $e->getMessage(), E_USER_NOTICE);
                     trigger_error('SQL Query (' . $uniqErrCode . '): ' . $queryValue, E_USER_NOTICE);
                 }
                 $ret[] = $row;
                 break;
             case ReportQuery::TYPE_NSDR:
                 $nsdr = explode("\n", $queryValue);
                 $results = array();
                 foreach ($nsdr as $key => $value) {
                     $tokens = $this->_extractTokens($queryValue);
                     if (isset($tokens[0])) {
                         $value = $this->_applyFilters($filters, $value);
                     }
                     $resultSetName = ReportView::extractNamespace($value);
                     $displayName = ReportView::metaDataPrettyName($resultSetName);
                     $nsdrResult = NSDR::populate($value);
                     $tmp = array('Name' => $displayName, 'Value' => '');
                     $tmp['Value'] = $nsdrResult[$value];
                     $results[] = $tmp;
                 }
                 if ($view->customizeColumnNames) {
                     $tmpResults = $results;
                     $results = array();
                     foreach ($columnDefinitions as $id => $mapping) {
                         // id, queryId, queryName, resultSetName, displayName, transform
                         if ($mapping->queryId != $query->reportQueryId && $mapping->queryName != $query->displayName) {
                             continue;
                         }
                         $displayName = ReportView::metaDataPrettyName($mapping->resultSetName);
                         $tmp = array('Name' => $displayName, 'Value' => '');
                         if (isset($tmpResults[$displayName])) {
                             $tmp['Value'] = $this->_applyTransforms($mapping->transforms, $tmpResults[$displayName]);
                         }
                         $results[] = $tmp;
                     }
                 }
                 $row['rows'] = $results;
                 $ret[] = $row;
                 break;
         }
     }
     return $ret;
 }
Пример #7
0
 /**
  * Constructor
  * 
  * Saves the report and initializes local storage.
  * 
  * @param Report $report
  */
 public function __construct(Report $report)
 {
     parent::__construct($report);
     $this->tpl = array();
     $this->output = null;
 }