PageRenderTime 68ms CodeModel.GetById 27ms RepoModel.GetById 12ms app.codeStats 0ms

/vtiger6/modules/Reports/models/Record.php

https://bitbucket.org/thomashii/vtigercrm-6-for-postgresql
PHP | 897 lines | 560 code | 128 blank | 209 comment | 104 complexity | 54627fe2e6c676a7f172d51a8e50f462 MD5 | raw file
Possible License(s): Apache-2.0, LGPL-3.0, LGPL-2.1, GPL-2.0, GPL-3.0
  1. <?php
  2. /* +***********************************************************************************
  3. * The contents of this file are subject to the vtiger CRM Public License Version 1.0
  4. * ("License"); You may not use this file except in compliance with the License
  5. * The Original Code is: vtiger CRM Open Source
  6. * The Initial Developer of the Original Code is vtiger.
  7. * Portions created by vtiger are Copyright (C) vtiger.
  8. * All Rights Reserved.
  9. * *********************************************************************************** */
  10. vimport('~~/modules/Reports/Reports.php');
  11. vimport('~~/modules/Reports/ReportRun.php');
  12. vimport('~~/modules/Reports/CustomReportUtils.php');
  13. require_once('Report.php');
  14. class Reports_Record_Model extends Vtiger_Record_Model {
  15. /**
  16. * Function to get the id of the Report
  17. * @return <Number> - Report Id
  18. */
  19. public function getId() {
  20. return $this->get('reportid');
  21. }
  22. /**
  23. * Function to set the id of the Report
  24. * @param <type> $value - id value
  25. * @return <Object> - current instance
  26. */
  27. public function setId($value) {
  28. return $this->set('reportid', $value);
  29. }
  30. /**
  31. * Fuction to get the Name of the Report
  32. * @return <String>
  33. */
  34. function getName() {
  35. return $this->get('reportname');
  36. }
  37. /**
  38. * Function deletes the Report
  39. * @return Boolean
  40. */
  41. function delete() {
  42. return $this->getModule()->deleteRecord($this);
  43. }
  44. /**
  45. * Function returns the url that generates Report in Excel format
  46. * @return <String>
  47. */
  48. function getReportExcelURL() {
  49. return 'index.php?module='.$this->getModuleName().'&view=ExportReport&mode=GetXLS&record='. $this->getId();
  50. }
  51. /**
  52. * Function returns the url that generates Report in CSV format
  53. * @return <String>
  54. */
  55. function getReportCSVURL() {
  56. return 'index.php?module='.$this->getModuleName().'&view=ExportReport&mode=GetCSV&record='. $this->getId();
  57. }
  58. /**
  59. * Function returns the url that generates Report in printable format
  60. * @return <String>
  61. */
  62. function getReportPrintURL() {
  63. return 'index.php?module='.$this->getModuleName().'&view=ExportReport&mode=GetPrintReport&record='. $this->getId();
  64. }
  65. /**
  66. * Function returns the Reports Model instance
  67. * @param <Number> $recordId
  68. * @param <String> $module
  69. * @return <Reports_Record_Model>
  70. */
  71. public static function getInstanceById($recordId) {
  72. $db = PearDatabase::getInstance();
  73. $self = new self();
  74. $reportResult = $db->pquery('SELECT * FROM vtiger_report WHERE reportid = ?', array($recordId));
  75. if($db->num_rows($reportResult)) {
  76. $values = $db->query_result_rowdata($reportResult, 0);
  77. $module = Vtiger_Module_Model::getInstance('Reports');
  78. $self->setData($values)->setId($values['reportid'])->setModuleFromInstance($module);
  79. $self->initialize();
  80. }
  81. return $self;
  82. }
  83. /**
  84. * Function creates Reports_Record_Model
  85. * @param <Number> $recordId
  86. * @return <Reports_Record_Model>
  87. */
  88. public static function getCleanInstance($recordId = null) {
  89. if(empty($recordId)) {
  90. $self = new Reports_Record_Model();
  91. } else {
  92. $self = self::getInstanceById($recordId);
  93. }
  94. $self->initialize();
  95. $module = Vtiger_Module_Model::getInstance('Reports');
  96. $self->setModuleFromInstance($module);
  97. return $self;
  98. }
  99. /**
  100. * Function initializes Report
  101. */
  102. function initialize() {
  103. $reportId = $this->getId();
  104. $this->report = Vtiger_Report_Model::getInstance($reportId);
  105. }
  106. /**
  107. * Function returns Primary Module of the Report
  108. * @return <String>
  109. */
  110. function getPrimaryModule() {
  111. return $this->report->primodule;
  112. }
  113. /**
  114. * Function returns Secondary Module of the Report
  115. * @return <String>
  116. */
  117. function getSecondaryModules() {
  118. return $this->report->secmodule;
  119. }
  120. /**
  121. * Function sets the Primary Module of the Report
  122. * @param <String> $module
  123. */
  124. function setPrimaryModule($module) {
  125. $this->report->primodule = $module;
  126. }
  127. /**
  128. * Function sets the Secondary Modules for the Report
  129. * @param <String> $modules, modules separated with colon(:)
  130. */
  131. function setSecondaryModule($modules) {
  132. $this->report->secmodule = $modules;
  133. }
  134. /**
  135. * Function returns Report Type(Summary/Tabular)
  136. * @return <String>
  137. */
  138. function getReportType() {
  139. $reportType = $this->get('reporttype');
  140. if(!empty($reportType)) {
  141. return $reportType;
  142. }
  143. return $this->report->reporttype;
  144. }
  145. /**
  146. * Returns the Reports Owner
  147. * @return <Number>
  148. */
  149. function getOwner() {
  150. return $this->get('owner');
  151. }
  152. /**
  153. * Function checks if the Report is editable
  154. * @return boolean
  155. */
  156. function isEditable() {
  157. return ($this->report->isEditable());
  158. }
  159. /**
  160. * Function returns Report enabled Modules
  161. * @return type
  162. */
  163. function getReportRelatedModules() {
  164. $report = $this->report;
  165. return $report->related_modules;
  166. }
  167. /**
  168. * Function returns Primary Module Fields
  169. * @return <Array>
  170. */
  171. function getPrimaryModuleFields() {
  172. $report = $this->report;
  173. $primaryModule = $this->getPrimaryModule();
  174. $report->getPriModuleColumnsList($primaryModule);
  175. //need to add this vtiger_crmentity:crmid:".$module."_ID:crmid:I
  176. return $report->pri_module_columnslist;
  177. }
  178. /**
  179. * Function returns Secondary Module fields
  180. * @return <Array>
  181. */
  182. function getSecondaryModuleFields() {
  183. $report = $this->report;
  184. $secondaryModule = $this->getSecondaryModules();
  185. $report->getSecModuleColumnsList($secondaryModule);
  186. return $report->sec_module_columnslist;
  187. }
  188. /**
  189. * Function returns Report Selected Fields
  190. * @return <Array>
  191. */
  192. function getSelectedFields() {
  193. $db = PearDatabase::getInstance();
  194. $result = $db->pquery("SELECT vtiger_selectcolumn.columnname FROM vtiger_report
  195. INNER JOIN vtiger_selectquery ON vtiger_selectquery.queryid = vtiger_report.queryid
  196. INNER JOIN vtiger_selectcolumn ON vtiger_selectcolumn.queryid = vtiger_selectquery.queryid
  197. WHERE vtiger_report.reportid = ? ORDER BY vtiger_selectcolumn.columnindex", array($this->getId()));
  198. $selectedColumns = array();
  199. for($i=0; $i<$db->num_rows($result); $i++) {
  200. $column = $db->query_result($result, $i, 'columnname');
  201. list($tableName, $columnName, $moduleFieldLabel, $fieldName, $type) = split(':', $column);
  202. $fieldLabel = explode('_', $moduleFieldLabel);
  203. $module = $fieldLabel[0];
  204. $dbFieldLabel = trim(str_replace(array($module, '_'), " ", $moduleFieldLabel));
  205. $translatedFieldLabel = vtranslate($dbFieldLabel, $module);
  206. if(CheckFieldPermission($fieldName, $module) == 'true' && $columnName != 'crmid') {
  207. $selectedColumns[$translatedFieldLabel] = $column;
  208. }
  209. }
  210. return $selectedColumns;
  211. }
  212. /**
  213. * Function returns Report Calculation Fields
  214. * @return type
  215. */
  216. function getSelectedCalculationFields() {
  217. $db = PearDatabase::getInstance();
  218. $result = $db->pquery('SELECT vtiger_reportsummary.columnname FROM vtiger_reportsummary
  219. INNER JOIN vtiger_report ON vtiger_report.reportid = vtiger_reportsummary.reportsummaryid
  220. WHERE vtiger_report.reportid=?', array($this->getId()));
  221. $columns = array();
  222. for($i=0; $i<$db->num_rows($result); $i++) {
  223. $columns[] = $db->query_result($result, $i, 'columnname');
  224. }
  225. return $columns;
  226. }
  227. /**
  228. * Function returns Report Sort Fields
  229. * @return type
  230. */
  231. function getSelectedSortFields() {
  232. $db = PearDatabase::getInstance();
  233. //TODO : handle date fields with group criteria
  234. $result = $db->pquery('SELECT vtiger_reportsortcol.* FROM vtiger_report
  235. INNER JOIN vtiger_reportsortcol ON vtiger_report.reportid = vtiger_reportsortcol.reportid
  236. WHERE vtiger_report.reportid = ? ORDER BY vtiger_reportsortcol.sortcolid',array($this->getId()));
  237. $sortColumns = array();
  238. for($i=0; $i<$db->num_rows($result); $i++) {
  239. $column = $db->query_result($result, $i, 'columnname');
  240. $order = $db->query_result($result, $i, 'sortorder');
  241. $sortColumns[$column] = $order;
  242. }
  243. return $sortColumns;
  244. }
  245. /**
  246. * Function returns Reports Standard Filters
  247. * @return type
  248. */
  249. function getSelectedStandardFilter() {
  250. $db = PearDatabase::getInstance();
  251. $result = $db->pquery('SELECT * FROM vtiger_reportdatefilter WHERE datefilterid = ?', array($this->getId()));
  252. $standardFieldInfo = array();
  253. if($db->num_rows($result)) {
  254. $standardFieldInfo['columnname'] = $db->query_result($result, 0, 'datecolumnname');
  255. $standardFieldInfo['type'] = $db->query_result($result, 0, 'datefilter');
  256. $standardFieldInfo['startdate'] = $db->query_result($result, 0, 'startdate');
  257. $standardFieldInfo['enddate'] = $db->query_result($result, 0, 'enddate');
  258. if ($standardFieldInfo['type'] == "custom" || $standardFieldInfo['type'] == "") {
  259. if ($standardFieldInfo["startdate"] != "0000-00-00" && $standardFieldInfo["startdate"] != "") {
  260. $startDateTime = new DateTimeField($standardFieldInfo["startdate"] . ' ' . date('H:i:s'));
  261. $standardFieldInfo["startdate"] = $startDateTime->getDisplayDate();
  262. }
  263. if ($standardFieldInfo["enddate"] != "0000-00-00" && $standardFieldInfo["enddate"] != "") {
  264. $endDateTime = new DateTimeField($standardFieldInfo["enddate"] . ' ' . date('H:i:s'));
  265. $standardFieldInfo["enddate"] = $endDateTime->getDisplayDate();
  266. }
  267. } else {
  268. $startDateTime = new DateTimeField($standardFieldInfo["startdate"] . ' ' . date('H:i:s'));
  269. $standardFieldInfo["startdate"] = $startDateTime->getDisplayDate();
  270. $endDateTime = new DateTimeField($standardFieldInfo["enddate"] . ' ' . date('H:i:s'));
  271. $standardFieldInfo["enddate"] = $endDateTime->getDisplayDate();
  272. }
  273. }
  274. return $standardFieldInfo;
  275. }
  276. /**
  277. * Function returns Reports Advanced Filters
  278. * @return type
  279. */
  280. function getSelectedAdvancedFilter() {
  281. $report = $this->report;
  282. $report->getAdvancedFilterList($this->getId());
  283. return $report->advft_criteria;
  284. }
  285. /**
  286. * Function saves a Report
  287. */
  288. function save() {
  289. $db = PearDatabase::getInstance();
  290. $currentUser = Users_Record_Model::getCurrentUserModel();
  291. $reportId = $this->getId();
  292. if(empty($reportId)) {
  293. $reportId = $db->getUniqueID("vtiger_selectquery");
  294. $this->setId($reportId);
  295. $db->pquery('INSERT INTO vtiger_selectquery(queryid, startindex, numofobjects) VALUES(?,?,?)',
  296. array($reportId, 0, 0));
  297. $reportParams = array($reportId, $this->get('folderid'), $this->get('reportname'), $this->get('description'),
  298. 'summary', $reportId, 'CUSTOM', $currentUser->id, 'Public');
  299. $db->pquery('INSERT INTO vtiger_report(reportid, folderid, reportname, description,
  300. reporttype, queryid, state, owner, sharingtype) VALUES(?,?,?,?,?,?,?,?,?)', $reportParams);
  301. $secondaryModule = $this->getSecondaryModules();
  302. $db->pquery('INSERT INTO vtiger_reportmodules(reportmodulesid, primarymodule, secondarymodules) VALUES(?,?,?)',
  303. array($reportId, $this->getPrimaryModule(), $secondaryModule));
  304. $this->saveSelectedFields();
  305. $this->saveSortFields();
  306. $this->saveCalculationFields();
  307. $this->saveStandardFilter();
  308. $this->saveAdvancedFilters();
  309. $this->saveSharingInformation();
  310. } else {
  311. $reportId = $this->getId();
  312. $db->pquery('DELETE FROM vtiger_selectcolumn WHERE queryid = ?', array($reportId));
  313. $this->saveSelectedFields();
  314. $db->pquery("DELETE FROM vtiger_reportsharing WHERE reportid = ?", array($reportId));
  315. $this->saveSharingInformation();
  316. $db->pquery('UPDATE vtiger_reportmodules SET primarymodule = ?,secondarymodules = ? WHERE reportmodulesid = ?',
  317. array($this->getPrimaryModule(), $this->getSecondaryModules(), $reportId));
  318. $db->pquery('UPDATE vtiger_report SET reportname = ?, description = ?, reporttype = ? WHERE
  319. reportid = ?', array($this->get('reportname'), $this->get('description'), 'summary', $reportId));
  320. $db->pquery('DELETE FROM vtiger_reportsortcol WHERE reportid = ?', array($reportId));
  321. $db->pquery('DELETE FROM vtiger_reportgroupbycolumn WHERE reportid = ?',array($reportId));
  322. $this->saveSortFields();
  323. $db->pquery('DELETE FROM vtiger_reportsummary WHERE reportsummaryid = ?', array($reportId));
  324. $this->saveCalculationFields();
  325. $db->pquery('DELETE FROM vtiger_reportdatefilter WHERE datefilterid = ?', array($reportId));
  326. $this->saveStandardFilter();
  327. $this->saveAdvancedFilters();
  328. }
  329. }
  330. /**
  331. * Function saves Reports Sorting Fields
  332. */
  333. function saveSortFields() {
  334. $db = PearDatabase::getInstance();
  335. $sortFields = $this->get('sortFields');
  336. $i = 0;
  337. foreach($sortFields as $fieldInfo) {
  338. $db->pquery('INSERT INTO vtiger_reportsortcol(sortcolid, reportid, columnname, sortorder) VALUES (?,?,?,?)',
  339. array($i, $this->getId(), $fieldInfo[0], $fieldInfo[1]));
  340. if(CustomReportUtils::IsDateField($fieldInfo[0])) {
  341. $db->pquery("INSERT INTO vtiger_reportgroupbycolumn(reportid, sortid, sortcolname, dategroupbycriteria)
  342. VALUES(?,?,?,?)", array($this->getId(), $i, $fieldInfo[0], $fieldInfo[2]));
  343. }
  344. $i++;
  345. }
  346. }
  347. /**
  348. * Function saves Reports Calculation Fields information
  349. */
  350. function saveCalculationFields() {
  351. $db = PearDatabase::getInstance();
  352. $calculationFields = $this->get('calculationFields');
  353. for ($i=0; $i<count($calculationFields); $i++) {
  354. $db->pquery('INSERT INTO vtiger_reportsummary (reportsummaryid, summarytype, columnname) VALUES (?,?,?)',
  355. array($this->getId(), $i, $calculationFields[$i]));
  356. }
  357. }
  358. /**
  359. * Function saves Reports Standard Filter information
  360. */
  361. function saveStandardFilter() {
  362. $db = PearDatabase::getInstance();
  363. $standardFilter = $this->get('standardFilter');
  364. if(!empty($standardFilter)) {
  365. $db->pquery('INSERT INTO vtiger_reportdatefilter (datefilterid, datecolumnname, datefilter, startdate, enddate)
  366. VALUES (?,?,?,?,?)', array($this->getId(), $standardFilter['field'], $standardFilter['type'],
  367. $standardFilter['start'], $standardFilter['end']));
  368. }
  369. }
  370. /**
  371. * Function saves Reports Sharing information
  372. */
  373. function saveSharingInformation() {
  374. $db = PearDatabase::getInstance();
  375. $sharingInfo = $this->get('sharingInfo');
  376. for($i=0; $i<count($sharingInfo); $i++) {
  377. $db->pquery('INSERT INTO vtiger_reportsharing(reportid, shareid, setype) VALUES (?,?,?)',
  378. array($this->getId(), $sharingInfo[$i]['id'], $sharingInfo[$i]['type']));
  379. }
  380. }
  381. /**
  382. * Functions saves Reports selected fields
  383. */
  384. function saveSelectedFields() {
  385. $db = PearDatabase::getInstance();
  386. $selectedFields = $this->get('selectedFields');
  387. for($i=0 ;$i<count($selectedFields);$i++) {
  388. if(!empty($selectedFields[$i])) {
  389. $db->pquery("INSERT INTO vtiger_selectcolumn(queryid, columnindex, columnname) VALUES (?,?,?)",
  390. array($this->getId(), $i, decode_html($selectedFields[$i])));
  391. }
  392. }
  393. }
  394. /**
  395. * Function saves Reports Filter information
  396. */
  397. function saveAdvancedFilters() {
  398. $db = PearDatabase::getInstance();
  399. $reportId = $this->getId();
  400. $advancedFilter = $this->get('advancedFilter');
  401. if(!empty($advancedFilter)) {
  402. $db->pquery('DELETE FROM vtiger_relcriteria WHERE queryid = ?', array($reportId));
  403. $db->pquery('DELETE FROM vtiger_relcriteria_grouping WHERE queryid = ?', array($reportId));
  404. foreach($advancedFilter as $groupIndex => $groupInfo) {
  405. if(empty($groupInfo)) continue;
  406. $groupColumns = $groupInfo['columns'];
  407. $groupCondition = $groupInfo['condition'];
  408. foreach($groupColumns as $columnIndex => $columnCondition) {
  409. if(empty($columnCondition)) continue;
  410. $advFilterColumn = $columnCondition["columnname"];
  411. $advFilterComparator = $columnCondition["comparator"];
  412. $advFilterValue = $columnCondition["value"];
  413. $advFilterColumnCondition = $columnCondition["column_condition"];
  414. $columnInfo = explode(":",$advFilterColumn);
  415. $moduleFieldLabel = $columnInfo[2];
  416. list($module, $fieldLabel) = explode('_', $moduleFieldLabel, 2);
  417. $fieldInfo = getFieldByReportLabel($module, $fieldLabel);
  418. $fieldType = null;
  419. if(!empty($fieldInfo)) {
  420. $field = WebserviceField::fromArray($db, $fieldInfo);
  421. $fieldType = $field->getFieldDataType();
  422. }
  423. if($fieldType == 'currency') {
  424. if($field->getUIType() == '71') {
  425. $advFilterValue = Vtiger_Currency_UIType::convertToDBFormat($advFilterValue, null, true);
  426. } else {
  427. $advFilterValue = Vtiger_Currency_UIType::convertToDBFormat($advFilterValue);
  428. }
  429. }
  430. $tempVal = explode(",",$advFilterValue);
  431. if(($columnInfo[4] == 'D' || ($columnInfo[4] == 'T' && $columnInfo[1] != 'time_start' && $columnInfo[1] != 'time_end') ||
  432. ($columnInfo[4] == 'DT')) && ($columnInfo[4] != '' && $advFilterValue != '' )) {
  433. $val = Array();
  434. for($i=0; $i<count($tempVal); $i++) {
  435. if(trim($tempVal[$i]) != '') {
  436. $date = new DateTimeField(trim($tempVal[$i]));
  437. if($columnInfo[4] == 'D') {
  438. $val[$i] = DateTimeField::convertToDBFormat(trim($tempVal[$i]));
  439. } elseif($columnInfo[4] == 'DT') {
  440. $val[$i] = $date->getDBInsertDateTimeValue();
  441. } else {
  442. $val[$i] = $date->getDBInsertTimeValue();
  443. }
  444. }
  445. }
  446. $advFilterValue = implode(",", $val);
  447. }
  448. $db->pquery('INSERT INTO vtiger_relcriteria (queryid, columnindex, columnname, comparator, value,
  449. groupid, column_condition) VALUES (?,?,?,?,?,?,?)', array($reportId, $columnIndex, $advFilterColumn,
  450. $advFilterComparator, $advFilterValue, $groupIndex, $advFilterColumnCondition));
  451. // Update the condition expression for the group to which the condition column belongs
  452. $groupConditionExpression = '';
  453. if(!empty($advancedFilter[$groupIndex]["conditionexpression"])) {
  454. $groupConditionExpression = $advancedFilter[$groupIndex]["conditionexpression"];
  455. }
  456. $groupConditionExpression = $groupConditionExpression .' '. $columnIndex .' '. $advFilterColumnCondition;
  457. $advancedFilter[$groupIndex]["conditionexpression"] = $groupConditionExpression;
  458. }
  459. $groupConditionExpression = $advancedFilter[$groupIndex]["conditionexpression"];
  460. if(empty($groupConditionExpression)) continue; // Case when the group doesn't have any column criteria
  461. $db->pquery("INSERT INTO vtiger_relcriteria_grouping(groupid, queryid, group_condition, condition_expression) VALUES (?,?,?,?)",
  462. array($groupIndex, $reportId, $groupCondition, $groupConditionExpression));
  463. }
  464. }
  465. }
  466. /**
  467. * Function saves Reports Scheduling information
  468. */
  469. function saveScheduleInformation() {
  470. $db = PearDatabase::getInstance();
  471. $selectedRecipients = $this->get('selectedRecipients');
  472. $scheduledInterval = $this->get('scheduledInterval');
  473. $scheduledFormat = $this->get('scheduledFormat');
  474. $db->pquery('INSERT INTO vtiger_scheduled_reports(reportid, recipients, schedule, format, next_trigger_time) VALUES
  475. (?,?,?,?,?)', array($this->getId(), $selectedRecipients, $scheduledInterval, $scheduledFormat, date("Y-m-d H:i:s")));
  476. }
  477. /**
  478. * Function deletes report scheduling information
  479. */
  480. function deleteScheduling() {
  481. $db = PearDatabase::getInstance();
  482. $db->pquery('DELETE FROM vtiger_scheduled_reports WHERE reportid = ?', array($this->getId()));
  483. }
  484. /**
  485. * Function returns sql for the report
  486. * @param <String> $advancedFilterSQL
  487. * @param <String> $format
  488. * @return <String>
  489. */
  490. function getReportSQL($advancedFilterSQL=false, $format=false) {
  491. $reportRun = ReportRun::getInstance($this->getId());
  492. $sql = $reportRun->sGetSQLforReport($this->getId(), $advancedFilterSQL, $format);
  493. return $sql;
  494. }
  495. /**
  496. * Function returns report's data
  497. * @param <Vtiger_Paging_Model> $pagingModel
  498. * @param <String> $filterQuery
  499. * @return <Array>
  500. */
  501. function getReportData($pagingModel = false, $filterQuery = false) {
  502. $reportRun = ReportRun::getInstance($this->getId());
  503. $data = $reportRun->GenerateReport('PDF', $filterQuery, true, $pagingModel->getStartIndex(), $pagingModel->getPageLimit());
  504. return $data;
  505. }
  506. function getReportCalulationData() {
  507. $reportRun = ReportRun::getInstance($this->getId());
  508. $data = $reportRun->GenerateReport('TOTALXLS', false, true);
  509. return $data;
  510. }
  511. /**
  512. * Function exports reports data into a Excel file
  513. */
  514. function getReportXLS() {
  515. $reportRun = ReportRun::getInstance($this->getId());
  516. $rootDirectory = vglobal('root_directory');
  517. $tmpDir = vglobal('tmp_dir');
  518. $tempFileName = tempnam($rootDirectory.$tmpDir, 'xls');
  519. $fileName = $this->getName().'.xls';
  520. $reportRun->writeReportToExcelFile($tempFileName, false);
  521. if(isset($_SERVER['HTTP_USER_AGENT']) && strpos($_SERVER['HTTP_USER_AGENT'], 'MSIE')) {
  522. header('Pragma: public');
  523. header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
  524. }
  525. header('Content-Type: application/x-msexcel');
  526. header('Content-Length: '.@filesize($tempFileName));
  527. header('Content-disposition: attachment; filename="'.$fileName.'"');
  528. $fp = fopen($tempFileName, 'rb');
  529. fpassthru($fp);
  530. //unlink($tempFileName);
  531. }
  532. /**
  533. * Function exports reports data into a csv file
  534. */
  535. function getReportCSV() {
  536. $reportRun = ReportRun::getInstance($this->getId());
  537. $rootDirectory = vglobal('root_directory');
  538. $tmpDir = vglobal('tmp_dir');
  539. $tempFileName = tempnam($rootDirectory.$tmpDir, 'csv');
  540. $reportRun->writeReportToCSVFile($tempFileName, false);
  541. $fileName = $this->getName().'.csv';
  542. if(isset($_SERVER['HTTP_USER_AGENT']) && strpos($_SERVER['HTTP_USER_AGENT'],'MSIE')) {
  543. header('Pragma: public');
  544. header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
  545. }
  546. header('Content-Type: application/csv');
  547. header('Content-Length: '.@filesize($tempFileName));
  548. header('Content-disposition: attachment; filename="'.$fileName.'"');
  549. $fp = fopen($tempFileName, 'rb');
  550. fpassthru($fp);
  551. }
  552. /**
  553. * Function returns data in printable format
  554. * @return <Array>
  555. */
  556. function getReportPrint() {
  557. $reportRun = ReportRun::getInstance($this->getId());
  558. $data = array();
  559. $data['data'] = $reportRun->GenerateReport('PRINT', false);
  560. $data['total'] = $reportRun->GenerateReport('PRINT_TOTAL', false);
  561. return $data;
  562. }
  563. /**
  564. * Function returns reports is default or not
  565. * @return <boolean>
  566. */
  567. function isDefault() {
  568. $db = PearDatabase::getInstance();
  569. $result = $db->pquery("SELECT 1 FROM vtiger_report WHERE state = 'SAVED' AND reportid = ?", array($this->getId()));
  570. if ($db->num_rows($result) > 0) {
  571. return true;
  572. }
  573. return false;
  574. }
  575. /**
  576. * Function move report to another specified folder
  577. * @param folderid
  578. */
  579. function move($folderId) {
  580. $db = PearDatabase::getInstance();
  581. $db->pquery("UPDATE vtiger_report SET folderid = ? WHERE reportid = ?", array($folderId, $this->getId()));
  582. }
  583. /**
  584. * Function to get Calculation fields for Primary module
  585. * @return <Array> Primary module calculation fields
  586. */
  587. function getPrimaryModuleCalculationFields() {
  588. $primaryModule = $this->getPrimaryModule();
  589. $primaryModuleFields = $this->getPrimaryModuleFields();
  590. $calculationFields = array();
  591. foreach ($primaryModuleFields[$primaryModule] as $blocks) {
  592. if (!empty ($blocks)) {
  593. foreach ($blocks as $fieldType => $fieldName) {
  594. $fieldDetails = explode(':', $fieldType);
  595. if ($fieldDetails[4] === "I" || $fieldDetails[4] === "N") {
  596. $calculationFields[$fieldType] = $fieldName;
  597. }
  598. }
  599. }
  600. }
  601. $primaryModuleCalculationFields[$primaryModule] = $calculationFields;
  602. return $primaryModuleCalculationFields;
  603. }
  604. /**
  605. * Function to get Calculation fields for Secondary modules
  606. * @return <Array> Secondary modules calculation fields
  607. */
  608. function getSecondaryModuleCalculationFields() {
  609. $secondaryModuleCalculationFields = array();
  610. $secondaryModules = $this->getSecondaryModules();
  611. if (!empty ($secondaryModules)) {
  612. $secondaryModulesList = explode(':', $secondaryModules);
  613. $count = count($secondaryModulesList);
  614. $secondaryModuleFields = $this->getSecondaryModuleFields();
  615. for ($i=0; $i<$count; $i++) {
  616. $calculationFields = array();
  617. $secondaryModule = $secondaryModulesList[$i];
  618. foreach ($secondaryModuleFields[$secondaryModule] as $blocks) {
  619. if (!empty ($blocks)) {
  620. foreach ($blocks as $fieldType => $fieldName) {
  621. $fieldDetails = explode(':', $fieldType);
  622. if ($fieldDetails[4] === "I" || $fieldDetails[4] === "N") {
  623. $calculationFields[$fieldType] = $fieldName;
  624. }
  625. }
  626. }
  627. }
  628. $secondaryModuleCalculationFields[$secondaryModule] = $calculationFields;
  629. }
  630. }
  631. return $secondaryModuleCalculationFields;
  632. }
  633. /**
  634. * Function to get Calculation fields for entire Report
  635. * @return <Array> report calculation fields
  636. */
  637. function getCalculationFields() {
  638. $primaryModuleCalculationFields = $this->getPrimaryModuleCalculationFields();
  639. $secondaryModuleCalculationFields = $this->getSecondaryModuleCalculationFields();
  640. return array_merge($primaryModuleCalculationFields, $secondaryModuleCalculationFields);
  641. }
  642. /**
  643. * Function returns the Primary Module Record Structure
  644. * @return <Vtiger_RecordStructure_Model>
  645. */
  646. function getPrimaryModuleRecordStructure() {
  647. $primaryModule = $this->getPrimaryModule();
  648. $primaryModuleModel = Vtiger_Module_Model::getInstance($primaryModule);
  649. $recordStructureInstance = Vtiger_RecordStructure_Model::getInstanceForModule($primaryModuleModel);
  650. return $recordStructureInstance;
  651. }
  652. /**
  653. * Function returns the Secondary Modules Record Structure
  654. * @return <Array of Vtiger_RecordSructure_Models>
  655. */
  656. function getSecondaryModuleRecordStructure() {
  657. $recordStructureInstances = array();
  658. $secondaryModule = $this->getSecondaryModules();
  659. if(!empty($secondaryModule)) {
  660. $moduleList = explode(':', $secondaryModule);
  661. foreach($moduleList as $module) {
  662. if(!empty($module)) {
  663. $moduleModel = Vtiger_Module_Model::getInstance($module);
  664. $recordStructureInstances[$module] = Vtiger_RecordStructure_Model::getInstanceForModule($moduleModel);
  665. }
  666. }
  667. }
  668. return $recordStructureInstances;
  669. }
  670. /**
  671. * Function used to transform the older filter condition to suit newer filters.
  672. * The newer filters have only two groups one with ALL(AND) condition between each
  673. * filter and other with ANY(OR) condition, this functions tranforms the older
  674. * filter with 'AND' condition between filters of a group and will be placed under
  675. * match ALL conditions group and the rest of it will be placed under match Any group.
  676. * @return <Array>
  677. */
  678. function transformToNewAdvancedFilter() {
  679. $standardFilter = $this->transformStandardFilter();
  680. $advancedFilter = $this->getSelectedAdvancedFilter();
  681. $allGroupColumns = $anyGroupColumns = array();
  682. foreach($advancedFilter as $index=>$group) {
  683. $columns = $group['columns'];
  684. $and = $or = 0;
  685. if(!empty($group['condition'])){
  686. $block = $group['condition'];
  687. }
  688. if(count($columns) != 1) {
  689. foreach($columns as $column) {
  690. if($column['column_condition'] == 'and') {
  691. ++$and;
  692. } else {
  693. ++$or;
  694. }
  695. }
  696. if($and == count($columns)-1 && count($columns) != 1) {
  697. $allGroupColumns = array_merge($allGroupColumns, $group['columns']);
  698. } else {
  699. $anyGroupColumns = array_merge($anyGroupColumns, $group['columns']);
  700. }
  701. }else if($block == 'and'){
  702. $allGroupColumns = array_merge($allGroupColumns, $group['columns']);
  703. }else {
  704. $anyGroupColumns = array_merge($anyGroupColumns, $group['columns']);
  705. }
  706. }
  707. if($standardFilter){
  708. $allGroupColumns = array_merge($allGroupColumns,$standardFilter);
  709. }
  710. $transformedAdvancedCondition = array();
  711. $transformedAdvancedCondition[1] = array('columns' => $allGroupColumns, 'condition' => 'and');
  712. $transformedAdvancedCondition[2] = array('columns' => $anyGroupColumns, 'condition' => '');
  713. return $transformedAdvancedCondition;
  714. }
  715. /*
  716. * Function used to tranform the standard filter as like as advanced filter format
  717. * @returns array of tranformed standard filter
  718. */
  719. public function transformStandardFilter(){
  720. $standardFilter = $this->getSelectedStandardFilter();
  721. if(!empty($standardFilter)){
  722. $tranformedStandardFilter = array();
  723. $tranformedStandardFilter['comparator'] = 'bw';
  724. $fields = explode(':',$standardFilter['columnname']);
  725. if($fields[1] == 'createdtime' || $fields[1] == 'modifiedtime' ||($fields[0] == 'vtiger_activity' && $fields[1] == 'date_start')){
  726. $tranformedStandardFilter['columnname'] = "$fields[0]:$fields[1]:$fields[3]:$fields[2]:DT";
  727. $date[] = $standardFilter['startdate'].' 00:00:00';
  728. $date[] = $standardFilter['enddate'].' 00:00:00';
  729. $tranformedStandardFilter['value'] = implode(',',$date);
  730. } else{
  731. $tranformedStandardFilter['columnname'] = "$fields[0]:$fields[1]:$fields[3]:$fields[2]:D";
  732. $tranformedStandardFilter['value'] = $standardFilter['startdate'].','.$standardFilter['enddate'];
  733. }
  734. return array($tranformedStandardFilter);
  735. } else{
  736. return false;
  737. }
  738. }
  739. /**
  740. * Function to generate data for advanced filter conditions
  741. * @param Vtiger_Paging_Model $pagingModel
  742. * @return <Array>
  743. */
  744. public function generateData($pagingModel = false) {
  745. $advancedFilter = $this->get('advancedFilter');
  746. $advancedFilterCriteria = array();
  747. $advancedFilterCriteriaGroup = array();
  748. foreach($advancedFilter as $groupIndex => $groupInfo) {
  749. $groupColumns = $groupInfo['columns'];
  750. $groupCondition = $groupInfo['condition'];
  751. if (empty ($groupColumns)) {
  752. unset($advancedFilter[1]['condition']);
  753. } else {
  754. if(!empty($groupCondition)){
  755. $advancedFilterCriteriaGroup[$groupIndex] = array('groupcondition'=>$groupCondition);
  756. }
  757. }
  758. foreach($groupColumns as $groupColumn){
  759. $groupColumn['groupid'] = $groupIndex;
  760. $groupColumn['columncondition'] = $groupColumn['column_condition'];
  761. unset($groupColumn['column_condition']);
  762. $advancedFilterCriteria[] = $groupColumn;
  763. }
  764. }
  765. $reportRun = ReportRun::getInstance($this->getId());
  766. $filterQuery = $reportRun->RunTimeAdvFilter($advancedFilterCriteria,$advancedFilterCriteriaGroup);
  767. return $this->getReportData($pagingModel, $filterQuery);
  768. }
  769. }