PageRenderTime 51ms CodeModel.GetById 13ms RepoModel.GetById 0ms app.codeStats 1ms

/modules/Reports/ReportRun.php

https://bitbucket.org/thomashii/vtigercrm-6-for-postgresql
PHP | 4148 lines | 3424 code | 463 blank | 261 comment | 1207 complexity | d0e1602f47650ef9bcdbac9c00ebc173 MD5 | raw file
Possible License(s): Apache-2.0, LGPL-3.0, LGPL-2.1, GPL-2.0, GPL-3.0

Large files files are truncated, but you can click here to view the full file

  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. global $calpath;
  11. global $app_strings,$mod_strings;
  12. global $theme;
  13. global $log;
  14. $theme_path="themes/".$theme."/";
  15. $image_path=$theme_path."images/";
  16. require_once('include/database/PearDatabase.php');
  17. require_once('data/CRMEntity.php');
  18. require_once("modules/Reports/Reports.php");
  19. require_once 'modules/Reports/ReportUtils.php';
  20. require_once("vtlib/Vtiger/Module.php");
  21. require_once(VTIGER6_REL_DIR . 'modules/Vtiger/helpers/Util.php');
  22. /*
  23. * Helper class to determine the associative dependency between tables.
  24. */
  25. class ReportRunQueryDependencyMatrix {
  26. protected $matrix = array();
  27. protected $computedMatrix = null;
  28. function setDependency($table, array $dependents) {
  29. $this->matrix[$table] = $dependents;
  30. }
  31. function addDependency($table, $dependent) {
  32. if (isset($this->matrix[$table]) && !in_array($dependent, $this->matrix[$table])) {
  33. $this->matrix[$table][] = $dependent;
  34. } else {
  35. $this->setDependency($table, array($dependent));
  36. }
  37. }
  38. function getDependents($table) {
  39. $this->computeDependencies();
  40. return isset($this->computedMatrix[$table])? $this->computedMatrix[$table] : array();
  41. }
  42. protected function computeDependencies() {
  43. if ($this->computedMatrix !== null) return;
  44. $this->computedMatrix = array();
  45. foreach ($this->matrix as $key => $values) {
  46. $this->computedMatrix[$key] =
  47. $this->computeDependencyForKey($key, $values);
  48. }
  49. }
  50. protected function computeDependencyForKey($key, $values) {
  51. $merged = array();
  52. foreach ($values as $value) {
  53. $merged[] = $value;
  54. if (isset($this->matrix[$value])) {
  55. $merged = array_merge($merged, $this->matrix[$value]);
  56. }
  57. }
  58. return $merged;
  59. }
  60. }
  61. class ReportRunQueryPlanner {
  62. // Turn-off the query planning to revert back - backward compatiblity
  63. protected $disablePlanner = false;
  64. protected $tables = array();
  65. protected $tempTables = array();
  66. protected $tempTablesInitialized = false;
  67. // Turn-off in case the query result turns-out to be wrong.
  68. protected $allowTempTables = true;
  69. protected $tempTablePrefix = 'vtiger_reptmptbl_';
  70. protected static $tempTableCounter = 0;
  71. protected $registeredCleanup = false;
  72. function addTable($table) {
  73. $this->tables[$table] = $table;
  74. }
  75. function requireTable($table, $dependencies=null) {
  76. if ($this->disablePlanner) {
  77. return true;
  78. }
  79. if (isset($this->tables[$table])) {
  80. return true;
  81. }
  82. if (is_array($dependencies)) {
  83. foreach ($dependencies as $dependentTable) {
  84. if (isset($this->tables[$dependentTable])) {
  85. return true;
  86. }
  87. }
  88. } else if ($dependencies instanceof ReportRunQueryDependencyMatrix) {
  89. $dependents = $dependencies->getDependents($table);
  90. if ($dependents) {
  91. return count(array_intersect($this->tables, $dependents)) > 0;
  92. }
  93. }
  94. return false;
  95. }
  96. function getTables() {
  97. return $this->tables;
  98. }
  99. function newDependencyMatrix() {
  100. return new ReportRunQueryDependencyMatrix();
  101. }
  102. function registerTempTable($query, $keyColumns) {
  103. if ($this->allowTempTables && !$this->disablePlanner) {
  104. global $current_user;
  105. $keyColumns = is_array($keyColumns)? array_unique($keyColumns) : array($keyColumns);
  106. // Minor optimization to avoid re-creating similar temporary table.
  107. $uniqueName = NULL;
  108. foreach ($this->tempTables as $tmpUniqueName => $tmpTableInfo) {
  109. if (strcasecmp($query, $tmpTableInfo['query']) === 0) {
  110. // Capture any additional key columns
  111. $tmpTableInfo['keycolumns'] = array_unique(array_merge($tmpTableInfo['keycolumns'], $keyColumns));
  112. $uniqueName = $tmpUniqueName;
  113. break;
  114. }
  115. }
  116. // Nothing found?
  117. if ($uniqueName === NULL) {
  118. // TODO Adding randomness in name to avoid concurrency
  119. // even when same-user opens the report multiple instances at same-time.
  120. $uniqueName = $this->tempTablePrefix .
  121. str_replace('.', '', uniqid($current_user->id , true)) . (self::$tempTableCounter++);
  122. $this->tempTables[$uniqueName] = array(
  123. 'query' => $query,
  124. 'keycolumns' => is_array($keyColumns)? array_unique($keyColumns) : array($keyColumns),
  125. );
  126. }
  127. return $uniqueName;
  128. }
  129. return "($query)";
  130. }
  131. function initializeTempTables() {
  132. global $adb;
  133. $oldDieOnError = $adb->dieOnError;
  134. $adb->dieOnError = false; // If query planner is re-used there could be attempt for temp table...
  135. foreach ($this->tempTables as $uniqueName => $tempTableInfo) {
  136. $query1 = sprintf('CREATE TEMPORARY TABLE %s AS %s', $uniqueName, $tempTableInfo['query']);
  137. $adb->pquery($query1, array());
  138. $keyColumns = $tempTableInfo['keycolumns'];
  139. foreach ($keyColumns as $keyColumn) {
  140. $query2 = sprintf('ALTER TABLE %s ADD INDEX (%s)', $uniqueName, $keyColumn);
  141. $adb->pquery($query2, array());
  142. }
  143. }
  144. $adb->dieOnError = $oldDieOnError;
  145. // Trigger cleanup of temporary tables when the execution of the request ends.
  146. // NOTE: This works better than having in __destruct
  147. // (as the reference to this object might end pre-maturely even before query is executed)
  148. if (!$this->registeredCleanup) {
  149. register_shutdown_function(array($this, 'cleanup'));
  150. // To avoid duplicate registration on this instance.
  151. $this->registeredCleanup = true;
  152. }
  153. }
  154. function cleanup() {
  155. global $adb;
  156. $oldDieOnError = $adb->dieOnError;
  157. $adb->dieOnError = false; // To avoid abnormal termination during shutdown...
  158. foreach ($this->tempTables as $uniqueName => $tempTableInfo) {
  159. $adb->pquery('DROP TABLE ' . $uniqueName, array());
  160. }
  161. $adb->dieOnError = $oldDieOnError;
  162. $this->tempTables = array();
  163. }
  164. }
  165. class ReportRun extends CRMEntity
  166. {
  167. // Maximum rows that should be emitted in HTML view.
  168. static $HTMLVIEW_MAX_ROWS = 1000;
  169. var $reportid;
  170. var $primarymodule;
  171. var $secondarymodule;
  172. var $orderbylistsql;
  173. var $orderbylistcolumns;
  174. var $selectcolumns;
  175. var $groupbylist;
  176. var $reporttype;
  177. var $reportname;
  178. var $totallist;
  179. var $_groupinglist = false;
  180. var $_columnslist = false;
  181. var $_stdfilterlist = false;
  182. var $_columnstotallist = false;
  183. var $_advfiltersql = false;
  184. // All UItype 72 fields are added here so that in reports the values are append currencyId::value
  185. var $append_currency_symbol_to_value = array('Products_Unit_Price','Services_Price',
  186. 'Invoice_Total', 'Invoice_Sub_Total', 'Invoice_S&H_Amount', 'Invoice_Discount_Amount', 'Invoice_Adjustment',
  187. 'Quotes_Total', 'Quotes_Sub_Total', 'Quotes_S&H_Amount', 'Quotes_Discount_Amount', 'Quotes_Adjustment',
  188. 'SalesOrder_Total', 'SalesOrder_Sub_Total', 'SalesOrder_S&H_Amount', 'SalesOrder_Discount_Amount', 'SalesOrder_Adjustment',
  189. 'PurchaseOrder_Total', 'PurchaseOrder_Sub_Total', 'PurchaseOrder_S&H_Amount', 'PurchaseOrder_Discount_Amount', 'PurchaseOrder_Adjustment',
  190. 'Invoice_Received','PurchaseOrder_Paid','Invoice_Balance','PurchaseOrder_Balance'
  191. );
  192. var $ui10_fields = array();
  193. var $ui101_fields = array();
  194. var $groupByTimeParent = array( 'Quarter'=>array('Year'),
  195. 'Month'=>array('Year')
  196. );
  197. var $queryPlanner = null;
  198. protected static $instances = false;
  199. // Added to support line item fields calculation, if line item fields
  200. // are selected then module fields cannot be selected and vice versa
  201. var $lineItemFieldsInCalculation = false;
  202. /** Function to set reportid,primarymodule,secondarymodule,reporttype,reportname, for given reportid
  203. * This function accepts the $reportid as argument
  204. * It sets reportid,primarymodule,secondarymodule,reporttype,reportname for the given reportid
  205. * To ensure single-instance is present for $reportid
  206. * as we optimize using ReportRunPlanner and setup temporary tables.
  207. */
  208. function ReportRun($reportid)
  209. {
  210. $oReport = new Reports($reportid);
  211. $this->reportid = $reportid;
  212. $this->primarymodule = $oReport->primodule;
  213. $this->secondarymodule = $oReport->secmodule;
  214. $this->reporttype = $oReport->reporttype;
  215. $this->reportname = $oReport->reportname;
  216. $this->queryPlanner = new ReportRunQueryPlanner();
  217. }
  218. public static function getInstance($reportid) {
  219. if (!isset(self::$instances[$reportid])) {
  220. self::$instances[$reportid] = new ReportRun($reportid);
  221. }
  222. return self::$instances[$reportid];
  223. }
  224. /** Function to get the columns for the reportid
  225. * This function accepts the $reportid and $outputformat (optional)
  226. * This function returns $columnslist Array($tablename:$columnname:$fieldlabel:$fieldname:$typeofdata=>$tablename.$columnname As Header value,
  227. * $tablename1:$columnname1:$fieldlabel1:$fieldname1:$typeofdata1=>$tablename1.$columnname1 As Header value,
  228. * |
  229. * $tablenamen:$columnnamen:$fieldlabeln:$fieldnamen:$typeofdatan=>$tablenamen.$columnnamen As Header value
  230. * )
  231. *
  232. */
  233. function getQueryColumnsList($reportid,$outputformat='')
  234. {
  235. // Have we initialized information already?
  236. if($this->_columnslist !== false) {
  237. return $this->_columnslist;
  238. }
  239. global $adb;
  240. global $modules;
  241. global $log,$current_user,$current_language;
  242. $ssql = "select vtiger_selectcolumn.* from vtiger_report inner join vtiger_selectquery on vtiger_selectquery.queryid = vtiger_report.queryid";
  243. $ssql .= " left join vtiger_selectcolumn on vtiger_selectcolumn.queryid = vtiger_selectquery.queryid";
  244. $ssql .= " where vtiger_report.reportid = ?";
  245. $ssql .= " order by vtiger_selectcolumn.columnindex";
  246. $result = $adb->pquery($ssql, array($reportid));
  247. $permitted_fields = Array();
  248. while($columnslistrow = $adb->fetch_array($result))
  249. {
  250. $fieldname ="";
  251. $fieldcolname = $columnslistrow["columnname"];
  252. list($tablename,$colname,$module_field,$fieldname,$single) = split(":",$fieldcolname);
  253. list($module,$field) = split("_",$module_field,2);
  254. $inventory_fields = array('serviceid');
  255. $inventory_modules = getInventoryModules();
  256. require('user_privileges/user_privileges_'.$current_user->id.'.php');
  257. if(sizeof($permitted_fields[$module]) == 0 && $is_admin == false && $profileGlobalPermission[1] == 1 && $profileGlobalPermission[2] == 1)
  258. {
  259. $permitted_fields[$module] = $this->getaccesfield($module);
  260. }
  261. if(in_array($module,$inventory_modules)){
  262. if (!empty ($permitted_fields)) {
  263. foreach ($inventory_fields as $value) {
  264. array_push($permitted_fields[$module], $value);
  265. }
  266. }
  267. }
  268. $selectedfields = explode(":",$fieldcolname);
  269. if($is_admin == false && $profileGlobalPermission[1] == 1 && $profileGlobalPermission[2] == 1
  270. && !in_array($selectedfields[3], $permitted_fields[$module])) {
  271. //user has no access to this field, skip it.
  272. continue;
  273. }
  274. $concatSql = getSqlForNameInDisplayFormat(array('first_name'=>$selectedfields[0].".first_name",'last_name'=>$selectedfields[0].".last_name"), 'Users');
  275. $querycolumns = $this->getEscapedColumns($selectedfields);
  276. if(isset($module) && $module!="") {
  277. $mod_strings = return_module_language($current_language,$module);
  278. }
  279. $targetTableName = $tablename;
  280. $fieldlabel = trim(preg_replace("/$module/"," ",$selectedfields[2],1));
  281. $mod_arr=explode('_',$fieldlabel);
  282. $fieldlabel = trim(str_replace("_"," ",$fieldlabel));
  283. //modified code to support i18n issue
  284. $fld_arr = explode(" ",$fieldlabel);
  285. if(($mod_arr[0] == '')) {
  286. $mod = $module;
  287. $mod_lbl = getTranslatedString($module,$module); //module
  288. } else {
  289. $mod = $mod_arr[0];
  290. array_shift($fld_arr);
  291. $mod_lbl = getTranslatedString($fld_arr[0],$mod); //module
  292. }
  293. $fld_lbl_str = implode(" ",$fld_arr);
  294. $fld_lbl = getTranslatedString($fld_lbl_str,$module); //fieldlabel
  295. $fieldlabel = $mod_lbl." ".$fld_lbl;
  296. if(($selectedfields[0] == "vtiger_usersRel1") && ($selectedfields[1] == 'user_name') && ($selectedfields[2] == 'Quotes_Inventory_Manager')){
  297. $columnslist[$fieldcolname] = "trim( $concatSql ) as ".$module."_Inventory_Manager";
  298. $this->queryPlanner->addTable($selectedfields[0]);
  299. continue;
  300. }
  301. if((CheckFieldPermission($fieldname,$mod) != 'true' && $colname!="crmid" && (!in_array($fieldname,$inventory_fields) && in_array($module,$inventory_modules))) || empty($fieldname))
  302. {
  303. continue;
  304. }
  305. else
  306. {
  307. $this->labelMapping[$selectedfields[2]] = str_replace(" ","_",$fieldlabel);
  308. $header_label = $selectedfields[2]; // Header label to be displayed in the reports table
  309. // To check if the field in the report is a custom field
  310. // and if yes, get the label of this custom field freshly from the vtiger_field as it would have been changed.
  311. // Asha - Reference ticket : #4906
  312. if($querycolumns == "")
  313. {
  314. if($selectedfields[4] == 'C')
  315. {
  316. $field_label_data = split("_",$selectedfields[2]);
  317. $module= $field_label_data[0];
  318. if($module!=$this->primarymodule){
  319. $columnslist[$fieldcolname] = "case when (".$selectedfields[0].".".$selectedfields[1]."='1')then 'yes' else case when (vtiger_crmentity$module.crmid !='') then 'no' else '-' end end as '$selectedfields[2]'";
  320. $this->queryPlanner->addTable("vtiger_crmentity$module");
  321. }
  322. else{
  323. $columnslist[$fieldcolname] = "case when (".$selectedfields[0].".".$selectedfields[1]."='1')then 'yes' else case when (vtiger_crmentity.crmid !='') then 'no' else '-' end end as '$selectedfields[2]'";
  324. $this->queryPlanner->addTable("vtiger_crmentity$module");
  325. }
  326. }
  327. elseif($selectedfields[0] == 'vtiger_activity' && $selectedfields[1] == 'status')
  328. {
  329. $columnslist[$fieldcolname] = " case when (vtiger_activity.status not like '') then vtiger_activity.status else vtiger_activity.eventstatus end as Calendar_Status";
  330. }
  331. elseif($selectedfields[0] == 'vtiger_activity' && $selectedfields[1] == 'date_start') {
  332. if($module == 'Emails') {
  333. $columnslist[$fieldcolname] = "cast(concat(vtiger_activity.date_start,' ',vtiger_activity.time_start) as DATE) as Emails_Date_Sent";
  334. } else {
  335. $columnslist[$fieldcolname] = "cast(concat(vtiger_activity.date_start,' ',vtiger_activity.time_start) as DATETIME) as Calendar_Start_Date_and_Time";
  336. }
  337. }
  338. elseif(stristr($selectedfields[0],"vtiger_users") && ($selectedfields[1] == 'user_name'))
  339. {
  340. $temp_module_from_tablename = str_replace("vtiger_users","",$selectedfields[0]);
  341. if($module!=$this->primarymodule){
  342. $condition = "and vtiger_crmentity".$module.".crmid!=''";
  343. $this->queryPlanner->addTable("vtiger_crmentity$module");
  344. } else {
  345. $condition = "and vtiger_crmentity.crmid!=''";
  346. }
  347. if($temp_module_from_tablename == $module) {
  348. $columnslist[$fieldcolname] = " case when(".$selectedfields[0].".last_name NOT LIKE '' $condition ) THEN ".$concatSql." else vtiger_groups".$module.".groupname end as '".$module."_$field'";
  349. $this->queryPlanner->addTable('vtiger_groups'.$module); // Auto-include the dependent module table.
  350. }
  351. else//Some Fields can't assigned to groups so case avoided (fields like inventory manager)
  352. $columnslist[$fieldcolname] = $selectedfields[0].".user_name as '".$header_label."'";
  353. }
  354. elseif(stristr($selectedfields[0],"vtiger_crmentity") && ($selectedfields[1] == 'modifiedby')) {
  355. $targetTableName = 'vtiger_lastModifiedBy'.$module;
  356. $concatSql = getSqlForNameInDisplayFormat(array('last_name'=>$targetTableName.'.last_name', 'first_name'=>$targetTableName.'.first_name'), 'Users');
  357. $columnslist[$fieldcolname] = "trim($concatSql) as $header_label";
  358. $this->queryPlanner->addTable("vtiger_crmentity$module");
  359. $this->queryPlanner->addTable($targetTableName);
  360. }
  361. elseif($selectedfields[0] == "vtiger_crmentity".$this->primarymodule)
  362. {
  363. $columnslist[$fieldcolname] = "vtiger_crmentity.".$selectedfields[1]." AS '".$header_label."'";
  364. }
  365. elseif($selectedfields[0] == 'vtiger_products' && $selectedfields[1] == 'unit_price')//handled for product fields in Campaigns Module Reports
  366. {
  367. $columnslist[$fieldcolname] = "concat(".$selectedfields[0].".currency_id,'::',innerProduct.actual_unit_price) as '". $header_label ."'";
  368. $this->queryPlanner->addTable("innerProduct");
  369. }
  370. elseif(in_array($selectedfields[2], $this->append_currency_symbol_to_value)) {
  371. if($selectedfields[1] == 'discount_amount') {
  372. $columnslist[$fieldcolname] = "CONCAT(".$selectedfields[0].".currency_id,'::', IF(".$selectedfields[0].".discount_amount != '',".$selectedfields[0].".discount_amount, (".$selectedfields[0].".discount_percent/100) * ".$selectedfields[0].".subtotal)) AS ".$header_label;
  373. } else {
  374. $columnslist[$fieldcolname] = "concat(".$selectedfields[0].".currency_id,'::',".$selectedfields[0].".".$selectedfields[1].") as '" . $header_label ."'";
  375. }
  376. }
  377. elseif($selectedfields[0] == 'vtiger_notes' && ($selectedfields[1] == 'filelocationtype' || $selectedfields[1] == 'filesize' || $selectedfields[1] == 'folderid' || $selectedfields[1]=='filestatus'))//handled for product fields in Campaigns Module Reports
  378. {
  379. if($selectedfields[1] == 'filelocationtype'){
  380. $columnslist[$fieldcolname] = "case ".$selectedfields[0].".".$selectedfields[1]." when 'I' then 'Internal' when 'E' then 'External' else '-' end as '$selectedfields[2]'";
  381. } else if($selectedfields[1] == 'folderid'){
  382. $columnslist[$fieldcolname] = "vtiger_attachmentsfolder.foldername as '$selectedfields[2]'";
  383. } elseif($selectedfields[1] == 'filestatus'){
  384. $columnslist[$fieldcolname] = "case ".$selectedfields[0].".".$selectedfields[1]." when '1' then 'yes' when '0' then 'no' else '-' end as '$selectedfields[2]'";
  385. } elseif($selectedfields[1] == 'filesize'){
  386. $columnslist[$fieldcolname] = "case ".$selectedfields[0].".".$selectedfields[1]." when '' then '-' else concat(".$selectedfields[0].".".$selectedfields[1]."/1024,' ','KB') end as '$selectedfields[2]'";
  387. }
  388. }
  389. elseif($selectedfields[0] == 'vtiger_inventoryproductrel')//handled for product fields in Campaigns Module Reports
  390. {
  391. if($selectedfields[1] == 'discount_amount'){
  392. $columnslist[$fieldcolname] = " case when (vtiger_inventoryproductrel{$module}.discount_amount != '') then vtiger_inventoryproductrel{$module}.discount_amount else ROUND((vtiger_inventoryproductrel{$module}.listprice * vtiger_inventoryproductrel{$module}.quantity * (vtiger_inventoryproductrel{$module}.discount_percent/100)),3) end as '" . $header_label ."'";
  393. $this->queryPlanner->addTable($selectedfields[0].$module);
  394. } else if($selectedfields[1] == 'productid'){
  395. $columnslist[$fieldcolname] = "vtiger_products{$module}.productname as '" . $header_label ."'";
  396. $this->queryPlanner->addTable("vtiger_products{$module}");
  397. } else if($selectedfields[1] == 'serviceid'){
  398. $columnslist[$fieldcolname] = "vtiger_service{$module}.servicename as '" . $header_label ."'";
  399. $this->queryPlanner->addTable("vtiger_service{$module}");
  400. } else if($selectedfields[1] == 'listprice') {
  401. $primaryModuleInstance = CRMEntity::getInstance($this->primarymodule);
  402. $columnslist[$fieldcolname] = $selectedfields[0].$module.".".$selectedfields[1]."/".$primaryModuleInstance->table_name.".conversion_rate as '".$header_label."'";
  403. $this->queryPlanner->addTable($selectedfields[0].$module);
  404. } else {
  405. $columnslist[$fieldcolname] = $selectedfields[0].$module.".".$selectedfields[1]." as '".$header_label."'";
  406. $this->queryPlanner->addTable($selectedfields[0].$module);
  407. }
  408. }
  409. elseif(stristr($selectedfields[1],'cf_')==true && stripos($selectedfields[1],'cf_')==0)
  410. {
  411. $columnslist[$fieldcolname] = $selectedfields[0].".".$selectedfields[1]." AS '".$adb->sql_escape_string(decode_html($header_label))."'";
  412. }
  413. else
  414. {
  415. $columnslist[$fieldcolname] = $selectedfields[0].".".$selectedfields[1]." AS '".$header_label."'";
  416. }
  417. }
  418. else
  419. {
  420. $columnslist[$fieldcolname] = $querycolumns;
  421. }
  422. $this->queryPlanner->addTable($targetTableName);
  423. }
  424. }
  425. if ($outputformat == "HTML" || $outputformat == "PDF") {
  426. $columnslist['vtiger_crmentity:crmid:LBL_ACTION:crmid:I'] = 'vtiger_crmentity.crmid AS "'.$this->primarymodule.'_LBL_ACTION"' ;
  427. }
  428. // Save the information
  429. $this->_columnslist = $columnslist;
  430. $log->info("ReportRun :: Successfully returned getQueryColumnsList".$reportid);
  431. return $columnslist;
  432. }
  433. /** Function to get field columns based on profile
  434. * @ param $module : Type string
  435. * returns permitted fields in array format
  436. */
  437. function getaccesfield($module) {
  438. global $current_user;
  439. global $adb;
  440. $access_fields = Array();
  441. $profileList = getCurrentUserProfileList();
  442. $query = "select vtiger_field.fieldname from vtiger_field inner join vtiger_profile2field on vtiger_profile2field.fieldid=vtiger_field.fieldid inner join vtiger_def_org_field on vtiger_def_org_field.fieldid=vtiger_field.fieldid where";
  443. $params = array();
  444. if($module == "Calendar")
  445. {
  446. if (count($profileList) > 0) {
  447. $query .= " vtiger_field.tabid in (9,16) and vtiger_field.displaytype in (1,2,3) and vtiger_profile2field.visible=0 and vtiger_def_org_field.visible=0
  448. and vtiger_field.presence IN (0,2) and vtiger_profile2field.profileid in (". generateQuestionMarks($profileList) .") group by vtiger_field.fieldid order by block,sequence";
  449. array_push($params, $profileList);
  450. } else {
  451. $query .= " vtiger_field.tabid in (9,16) and vtiger_field.displaytype in (1,2,3) and vtiger_profile2field.visible=0 and vtiger_def_org_field.visible=0
  452. and vtiger_field.presence IN (0,2) group by vtiger_field.fieldid order by block,sequence";
  453. }
  454. }
  455. else
  456. {
  457. array_push($params, $module);
  458. if (count($profileList) > 0) {
  459. $query .= " vtiger_field.tabid in (select tabid from vtiger_tab where vtiger_tab.name in (?)) and vtiger_field.displaytype in (1,2,3,5) and vtiger_profile2field.visible=0
  460. and vtiger_field.presence IN (0,2) and vtiger_def_org_field.visible=0 and vtiger_profile2field.profileid in (". generateQuestionMarks($profileList) .") group by vtiger_field.fieldid order by block,sequence";
  461. array_push($params, $profileList);
  462. } else {
  463. $query .= " vtiger_field.tabid in (select tabid from vtiger_tab where vtiger_tab.name in (?)) and vtiger_field.displaytype in (1,2,3,5) and vtiger_profile2field.visible=0
  464. and vtiger_field.presence IN (0,2) and vtiger_def_org_field.visible=0 group by vtiger_field.fieldid order by block,sequence";
  465. }
  466. }
  467. $result = $adb->pquery($query, $params);
  468. while($collistrow = $adb->fetch_array($result))
  469. {
  470. $access_fields[] = $collistrow["fieldname"];
  471. }
  472. //added to include ticketid for Reports module in select columnlist for all users
  473. if($module == "HelpDesk")
  474. $access_fields[] = "ticketid";
  475. return $access_fields;
  476. }
  477. /** Function to get Escapedcolumns for the field in case of multiple parents
  478. * @ param $selectedfields : Type Array
  479. * returns the case query for the escaped columns
  480. */
  481. function getEscapedColumns($selectedfields) {
  482. $tableName = $selectedfields[0];
  483. $columnName = $selectedfields[1];
  484. $moduleFieldLabel = $selectedfields[2];
  485. $fieldName = $selectedfields[3];
  486. list($moduleName, $fieldLabel) = explode('_', $moduleFieldLabel, 2);
  487. $fieldInfo = getFieldByReportLabel($moduleName, $fieldLabel);
  488. if($moduleName == 'ModComments' && $fieldName == 'creator') {
  489. $concatSql = getSqlForNameInDisplayFormat(array('first_name' => 'vtiger_usersModComments.first_name',
  490. 'last_name' => 'vtiger_usersModComments.last_name'), 'Users');
  491. $queryColumn = "trim(case when (vtiger_usersModComments.user_name not like '' and vtiger_crmentity.crmid!='') then $concatSql end) as 'ModComments_Creator'";
  492. } elseif(($fieldInfo['uitype'] == '10' || isReferenceUIType($fieldInfo['uitype']))
  493. && $fieldInfo['uitype'] != '52' && $fieldInfo['uitype'] != '53') {
  494. $fieldSqlColumns = $this->getReferenceFieldColumnList($moduleName, $fieldInfo);
  495. if(count($fieldSqlColumns) > 0) {
  496. $queryColumn = "(CASE WHEN $tableName.$columnName NOT LIKE '' THEN (CASE";
  497. foreach($fieldSqlColumns as $columnSql) {
  498. $queryColumn .= " WHEN $columnSql NOT LIKE '' THEN $columnSql";
  499. }
  500. $queryColumn .= " ELSE '' END) ELSE '' END) AS $moduleFieldLabel";
  501. $this->queryPlanner->addTable($tableName);
  502. }
  503. }
  504. return $queryColumn;
  505. }
  506. /** Function to get selectedcolumns for the given reportid
  507. * @ param $reportid : Type Integer
  508. * returns the query of columnlist for the selected columns
  509. */
  510. function getSelectedColumnsList($reportid)
  511. {
  512. global $adb;
  513. global $modules;
  514. global $log;
  515. $ssql = "select vtiger_selectcolumn.* from vtiger_report inner join vtiger_selectquery on vtiger_selectquery.queryid = vtiger_report.queryid";
  516. $ssql .= " left join vtiger_selectcolumn on vtiger_selectcolumn.queryid = vtiger_selectquery.queryid where vtiger_report.reportid = ? ";
  517. $ssql .= " order by vtiger_selectcolumn.columnindex";
  518. $result = $adb->pquery($ssql, array($reportid));
  519. $noofrows = $adb->num_rows($result);
  520. if ($this->orderbylistsql != "")
  521. {
  522. $sSQL .= $this->orderbylistsql.", ";
  523. }
  524. for($i=0; $i<$noofrows; $i++)
  525. {
  526. $fieldcolname = $adb->query_result($result,$i,"columnname");
  527. $ordercolumnsequal = true;
  528. if($fieldcolname != "")
  529. {
  530. for($j=0;$j<count($this->orderbylistcolumns);$j++)
  531. {
  532. if($this->orderbylistcolumns[$j] == $fieldcolname)
  533. {
  534. $ordercolumnsequal = false;
  535. break;
  536. }else
  537. {
  538. $ordercolumnsequal = true;
  539. }
  540. }
  541. if($ordercolumnsequal)
  542. {
  543. $selectedfields = explode(":",$fieldcolname);
  544. if($selectedfields[0] == "vtiger_crmentity".$this->primarymodule)
  545. $selectedfields[0] = "vtiger_crmentity";
  546. $sSQLList[] = $selectedfields[0].".".$selectedfields[1]." '".$selectedfields[2]."'";
  547. }
  548. }
  549. }
  550. $sSQL .= implode(",",$sSQLList);
  551. $log->info("ReportRun :: Successfully returned getSelectedColumnsList".$reportid);
  552. return $sSQL;
  553. }
  554. /** Function to get advanced comparator in query form for the given Comparator and value
  555. * @ param $comparator : Type String
  556. * @ param $value : Type String
  557. * returns the check query for the comparator
  558. */
  559. function getAdvComparator($comparator,$value,$datatype="")
  560. {
  561. global $log,$adb,$default_charset,$ogReport;
  562. $value=html_entity_decode(trim($value),ENT_QUOTES,$default_charset);
  563. $value_len = strlen($value);
  564. $is_field = false;
  565. if($value_len > 1 && $value[0]=='$' && $value[$value_len-1]=='$'){
  566. $temp = str_replace('$','',$value);
  567. $is_field = true;
  568. }
  569. if($datatype=='C'){
  570. $value = str_replace("yes","1",str_replace("no","0",$value));
  571. }
  572. if($is_field==true){
  573. $value = $this->getFilterComparedField($temp);
  574. }
  575. if($comparator == "e")
  576. {
  577. if(trim($value) == "NULL")
  578. {
  579. $rtvalue = " is NULL";
  580. }elseif(trim($value) != "")
  581. {
  582. $rtvalue = " = ".$adb->quote($value);
  583. }elseif(trim($value) == "" && $datatype == "V")
  584. {
  585. $rtvalue = " = ".$adb->quote($value);
  586. }else
  587. {
  588. $rtvalue = " is NULL";
  589. }
  590. }
  591. if($comparator == "n")
  592. {
  593. if(trim($value) == "NULL")
  594. {
  595. $rtvalue = " is NOT NULL";
  596. }elseif(trim($value) != "")
  597. {
  598. $rtvalue = " <> ".$adb->quote($value);
  599. }elseif(trim($value) == "" && $datatype == "V")
  600. {
  601. $rtvalue = " <> ".$adb->quote($value);
  602. }else
  603. {
  604. $rtvalue = " is NOT NULL";
  605. }
  606. }
  607. if($comparator == "s")
  608. {
  609. $rtvalue = " like '". formatForSqlLike($value, 2,$is_field) ."'";
  610. }
  611. if($comparator == "ew")
  612. {
  613. $rtvalue = " like '". formatForSqlLike($value, 1,$is_field) ."'";
  614. }
  615. if($comparator == "c")
  616. {
  617. $rtvalue = " like '". formatForSqlLike($value,0,$is_field) ."'";
  618. }
  619. if($comparator == "k")
  620. {
  621. $rtvalue = " not like '". formatForSqlLike($value,0,$is_field) ."'";
  622. }
  623. if($comparator == "l")
  624. {
  625. $rtvalue = " < ".$adb->quote($value);
  626. }
  627. if($comparator == "g")
  628. {
  629. $rtvalue = " > ".$adb->quote($value);
  630. }
  631. if($comparator == "m")
  632. {
  633. $rtvalue = " <= ".$adb->quote($value);
  634. }
  635. if($comparator == "h")
  636. {
  637. $rtvalue = " >= ".$adb->quote($value);
  638. }
  639. if($comparator == "b") {
  640. $rtvalue = " < ".$adb->quote($value);
  641. }
  642. if($comparator == "a") {
  643. $rtvalue = " > ".$adb->quote($value);
  644. }
  645. if($is_field==true){
  646. $rtvalue = str_replace("'","",$rtvalue);
  647. $rtvalue = str_replace("\\","",$rtvalue);
  648. }
  649. $log->info("ReportRun :: Successfully returned getAdvComparator");
  650. return $rtvalue;
  651. }
  652. /** Function to get field that is to be compared in query form for the given Comparator and field
  653. * @ param $field : field
  654. * returns the value for the comparator
  655. */
  656. function getFilterComparedField($field){
  657. global $adb,$ogReport;
  658. if(!empty ($this->secondarymodule)){
  659. $secModules = explode(':',$this->secondarymodule);
  660. foreach ($secModules as $secModule){
  661. $secondary = CRMEntity::getInstance($secModule);
  662. $this->queryPlanner->addTable($secondary->table_name);
  663. }
  664. }
  665. $field = split('#',$field);
  666. $module = $field[0];
  667. $fieldname = trim($field[1]);
  668. $tabid = getTabId($module);
  669. $field_query = $adb->pquery("SELECT tablename,columnname,typeofdata,fieldname,uitype FROM vtiger_field WHERE tabid = ? AND fieldname= ?",array($tabid,$fieldname));
  670. $fieldtablename = $adb->query_result($field_query,0,'tablename');
  671. $fieldcolname = $adb->query_result($field_query,0,'columnname');
  672. $typeofdata = $adb->query_result($field_query,0,'typeofdata');
  673. $fieldtypeofdata=ChangeTypeOfData_Filter($fieldtablename,$fieldcolname,$typeofdata[0]);
  674. $uitype = $adb->query_result($field_query,0,'uitype');
  675. /*if($tr[0]==$ogReport->primodule)
  676. $value = $adb->query_result($field_query,0,'tablename').".".$adb->query_result($field_query,0,'columnname');
  677. else
  678. $value = $adb->query_result($field_query,0,'tablename').$tr[0].".".$adb->query_result($field_query,0,'columnname');
  679. */
  680. if($uitype == 68 || $uitype == 59)
  681. {
  682. $fieldtypeofdata = 'V';
  683. }
  684. if($fieldtablename == "vtiger_crmentity" && $module != $this->primarymodule)
  685. {
  686. $fieldtablename = $fieldtablename.$module;
  687. }
  688. if($fieldname == "assigned_user_id")
  689. {
  690. $fieldtablename = "vtiger_users".$module;
  691. $fieldcolname = "user_name";
  692. }
  693. if($fieldtablename == "vtiger_crmentity" && $fieldname == "modifiedby")
  694. {
  695. $fieldtablename = "vtiger_lastModifiedBy".$module;
  696. $fieldcolname = "user_name";
  697. }
  698. if($fieldname == "assigned_user_id1")
  699. {
  700. $fieldtablename = "vtiger_usersRel1";
  701. $fieldcolname = "user_name";
  702. }
  703. $value = $fieldtablename.".".$fieldcolname;
  704. $this->queryPlanner->addTable($fieldtablename);
  705. return $value;
  706. }
  707. /** Function to get the advanced filter columns for the reportid
  708. * This function accepts the $reportid
  709. * This function returns $columnslist Array($columnname => $tablename:$columnname:$fieldlabel:$fieldname:$typeofdata=>$tablename.$columnname filtercriteria,
  710. * $tablename1:$columnname1:$fieldlabel1:$fieldname1:$typeofdata1=>$tablename1.$columnname1 filtercriteria,
  711. * |
  712. * $tablenamen:$columnnamen:$fieldlabeln:$fieldnamen:$typeofdatan=>$tablenamen.$columnnamen filtercriteria
  713. * )
  714. *
  715. */
  716. function getAdvFilterList($reportid) {
  717. global $adb, $log;
  718. $advft_criteria = array();
  719. $sql = 'SELECT * FROM vtiger_relcriteria_grouping WHERE queryid = ? ORDER BY groupid';
  720. $groupsresult = $adb->pquery($sql, array($reportid));
  721. $i = 1;
  722. $j = 0;
  723. while($relcriteriagroup = $adb->fetch_array($groupsresult)) {
  724. $groupId = $relcriteriagroup["groupid"];
  725. $groupCondition = $relcriteriagroup["group_condition"];
  726. $ssql = 'select vtiger_relcriteria.* from vtiger_report
  727. inner join vtiger_relcriteria on vtiger_relcriteria.queryid = vtiger_report.queryid
  728. left join vtiger_relcriteria_grouping on vtiger_relcriteria.queryid = vtiger_relcriteria_grouping.queryid
  729. and vtiger_relcriteria.groupid = vtiger_relcriteria_grouping.groupid';
  730. $ssql.= " where vtiger_report.reportid = ? AND vtiger_relcriteria.groupid = ? order by vtiger_relcriteria.columnindex";
  731. $result = $adb->pquery($ssql, array($reportid, $groupId));
  732. $noOfColumns = $adb->num_rows($result);
  733. if($noOfColumns <= 0) continue;
  734. while($relcriteriarow = $adb->fetch_array($result)) {
  735. $columnIndex = $relcriteriarow["columnindex"];
  736. $criteria = array();
  737. $criteria['columnname'] = html_entity_decode($relcriteriarow["columnname"]);
  738. $criteria['comparator'] = $relcriteriarow["comparator"];
  739. $advfilterval = $relcriteriarow["value"];
  740. $col = explode(":",$relcriteriarow["columnname"]);
  741. $criteria['value'] = $advfilterval;
  742. $criteria['column_condition'] = $relcriteriarow["column_condition"];
  743. $advft_criteria[$i]['columns'][$j] = $criteria;
  744. $advft_criteria[$i]['condition'] = $groupCondition;
  745. $j++;
  746. $this->queryPlanner->addTable($col[0]);
  747. }
  748. if(!empty($advft_criteria[$i]['columns'][$j-1]['column_condition'])) {
  749. $advft_criteria[$i]['columns'][$j-1]['column_condition'] = '';
  750. }
  751. $i++;
  752. }
  753. // Clear the condition (and/or) for last group, if any.
  754. if(!empty($advft_criteria[$i-1]['condition'])) $advft_criteria[$i-1]['condition'] = '';
  755. return $advft_criteria;
  756. }
  757. function generateAdvFilterSql($advfilterlist) {
  758. global $adb;
  759. $advfiltersql = "";
  760. $customView = new CustomView();
  761. $dateSpecificConditions = $customView->getStdFilterConditions();
  762. foreach($advfilterlist as $groupindex => $groupinfo) {
  763. $groupcondition = $groupinfo['condition'];
  764. $groupcolumns = $groupinfo['columns'];
  765. if(count($groupcolumns) > 0) {
  766. $advfiltergroupsql = "";
  767. foreach($groupcolumns as $columnindex => $columninfo) {
  768. $fieldcolname = $columninfo["columnname"];
  769. $comparator = $columninfo["comparator"];
  770. $value = $columninfo["value"];
  771. $columncondition = $columninfo["column_condition"];
  772. if($fieldcolname != "" && $comparator != "") {
  773. $selectedfields = explode(":",$fieldcolname);
  774. $moduleFieldLabel = $selectedfields[2];
  775. list($moduleName, $fieldLabel) = explode('_', $moduleFieldLabel, 2);
  776. $fieldInfo = getFieldByReportLabel($moduleName, $fieldLabel);
  777. $concatSql = getSqlForNameInDisplayFormat(array('first_name'=>$selectedfields[0].".first_name",'last_name'=>$selectedfields[0].".last_name"), 'Users');
  778. // Added to handle the crmentity table name for Primary module
  779. if($selectedfields[0] == "vtiger_crmentity".$this->primarymodule) {
  780. $selectedfields[0] = "vtiger_crmentity";
  781. }
  782. //Added to handle yes or no for checkbox field in reports advance filters. -shahul
  783. if($selectedfields[4] == 'C') {
  784. if(strcasecmp(trim($value),"yes")==0)
  785. $value="1";
  786. if(strcasecmp(trim($value),"no")==0)
  787. $value="0";
  788. }
  789. if(in_array($comparator,$dateSpecificConditions)) {
  790. $customView = new CustomView($moduleName);
  791. $columninfo['stdfilter'] = $columninfo['comparator'];
  792. $valueComponents = explode(',',$columninfo['value']);
  793. if($comparator == 'custom') {
  794. if($selectedfields[4] == 'DT') {
  795. $startDateTimeComponents = explode(' ',$valueComponents[0]);
  796. $endDateTimeComponents = explode(' ',$valueComponents[1]);
  797. $columninfo['startdate'] = DateTimeField::convertToDBFormat($startDateTimeComponents[0]);
  798. $columninfo['enddate'] = DateTimeField::convertToDBFormat($endDateTimeComponents[0]);
  799. } else {
  800. $columninfo['startdate'] = DateTimeField::convertToDBFormat($valueComponents[0]);
  801. $columninfo['enddate'] = DateTimeField::convertToDBFormat($valueComponents[1]);
  802. }
  803. }
  804. $dateFilterResolvedList = $customView->resolveDateFilterValue($columninfo);
  805. $startDate = DateTimeField::convertToDBFormat($dateFilterResolvedList['startdate']);
  806. $endDate = DateTimeField::convertToDBFormat($dateFilterResolvedList['enddate']);
  807. $columninfo['value'] = $value = implode(',', array($startDate,$endDate));
  808. $comparator = 'bw';
  809. }
  810. $valuearray = explode(",",trim($value));
  811. $datatype = (isset($selectedfields[4])) ? $selectedfields[4] : "";
  812. if(isset($valuearray) && count($valuearray) > 1 && $comparator != 'bw') {
  813. $advcolumnsql = "";
  814. for($n=0;$n<count($valuearray);$n++) {
  815. if(($selectedfields[0] == "vtiger_users".$this->primarymodule || $selectedfields[0] == "vtiger_users".$this->secondarymodule) && $selectedfields[1] == 'user_name') {
  816. $module_from_tablename = str_replace("vtiger_users","",$selectedfields[0]);
  817. $advcolsql[] = " trim($concatSql)".$this->getAdvComparator($comparator,trim($valuearray[$n]),$datatype)." or vtiger_groups".$module_from_tablename.".groupname ".$this->getAdvComparator($comparator,trim($valuearray[$n]),$datatype);
  818. $this->queryPlanner->addTable("vtiger_groups".$module_from_tablename);
  819. } elseif($selectedfields[1] == 'status') {//when you use comma seperated values.
  820. if($selectedfields[2] == 'Calendar_Status')
  821. $advcolsql[] = "(case when (vtiger_activity.status not like '') then vtiger_activity.status else vtiger_activity.eventstatus end)".$this->getAdvComparator($comparator,trim($valuearray[$n]),$datatype);
  822. elseif($selectedfields[2] == 'HelpDesk_Status')
  823. $advcolsql[] = "vtiger_troubletickets.status".$this->getAdvComparator($comparator,trim($valuearray[$n]),$datatype);
  824. } elseif($selectedfields[1] == 'description') {//when you use comma seperated values.
  825. if($selectedfields[0]=='vtiger_crmentity'.$this->primarymodule)
  826. $advcolsql[] = "vtiger_crmentity.description".$this->getAdvComparator($comparator,trim($valuearray[$n]),$datatype);
  827. else
  828. $advcolsql[] = $selectedfields[0].".".$selectedfields[1].$this->getAdvComparator($comparator,trim($valuearray[$n]),$datatype);
  829. } elseif($selectedfields[2] == 'Quotes_Inventory_Manager'){
  830. $advcolsql[] = ("trim($concatSql)".$this->getAdvComparator($comparator,trim($valuearray[$n]),$datatype));
  831. } else {
  832. $advcolsql[] = $selectedfields[0].".".$selectedfields[1].$this->getAdvComparator($comparator,trim($valuearray[$n]),$datatype);
  833. }
  834. }
  835. //If negative logic filter ('not equal to', 'does not contain') is used, 'and' condition should be applied instead of 'or'
  836. if($comparator == 'n' || $comparator == 'k')
  837. $advcolumnsql = implode(" and ",$advcolsql);
  838. else
  839. $advcolumnsql = implode(" or ",$advcolsql);
  840. $fieldvalue = " (".$advcolumnsql.") ";
  841. } elseif($selectedfields[1] == 'user_name') {
  842. if($selectedfields[0] == "vtiger_users".$this->primarymodule) {
  843. $module_from_tablename = str_replace("vtiger_users","",$selectedfields[0]);
  844. $fieldvalue = " trim(case when (".$selectedfields[0].".last_name NOT LIKE '') then ".$concatSql." else vtiger_groups".$module_from_tablename.".groupname end) ".$this->getAdvComparator($comparator,trim($value),$datatype);
  845. $this->queryPlanner->addTable("vtiger_groups".$module_from_tablename);
  846. } else {
  847. $secondaryModules = explode(':', $this->secondarymodule);
  848. $firstSecondaryModule = "vtiger_users".$secondaryModules[0];
  849. $secondSecondaryModule = "vtiger_users".$secondaryModules[1];
  850. if(($firstSecondaryModule && $firstSecondaryModule == $selectedfields[0]) || ($secondSecondaryModule && $secondSecondaryModule == $selectedfields[0])) {
  851. $module_from_tablename = str_replace("vtiger_users","",$selectedfields[0]);
  852. $moduleInstance = CRMEntity::getInstance($module_from_tablename);
  853. $fieldvalue = " trim(case when (".$selectedfields[0].".last_name NOT LIKE '') then ".$concatSql." else vtiger_groups".$module_from_tablename.".groupname end) ".$this->getAdvComparator($comparator,trim($value),$datatype);
  854. $this->queryPlanner->addTable("vtiger_groups".$module_from_tablename);
  855. $this->queryPlanner->addTable($moduleInstance->table_name);
  856. }
  857. }
  858. } elseif($comparator == 'bw' && count($valuearray) == 2) {
  859. if($selectedfields[0] == "vtiger_crmentity".$this->primarymodule) {
  860. $fieldvalue = "("."vtiger_crmentity.".$selectedfields[1]." between '".trim($valuearray[0])."' and '".trim($valuearray[1])."')";
  861. } else {
  862. $fieldvalue = "(".$selectedfields[0].".".$selectedfields[1]." between '".trim($valuearray[0])."' and '".trim($valuearray[1])."')";
  863. }
  864. } elseif($selectedfields[0] == "vtiger_crmentity".$this->primarymodule) {
  865. $fieldvalue = "vtiger_crmentity.".$selectedfields[1]." ".$this->getAdvComparator($comparator,trim($value),$datatype);
  866. } elseif($selectedfields[2] == 'Quotes_Inventory_Manager'){
  867. $fieldvalue = ("trim($concatSql)" . $this->getAdvComparator($comparator,trim($value),$datatype));
  868. } elseif($selectedfields[1]=='modifiedby') {
  869. $module_from_tablename = str_replace("vtiger_crmentity","",$selectedfields[0]);
  870. if($module_from_tablename != '') {
  871. $tableName = 'vtiger_lastModifiedBy'.$module_from_tablename;
  872. } else {
  873. $tableName = 'vtiger_lastModifiedBy'.$this->primarymodule;
  874. }
  875. $this->queryPlanner->addTable($tableName);
  876. $fieldvalue = getSqlForNameInDisplayFormat(array('last_name'=>"$tableName.last_name",'first_name'=>"$tableName.first_name"), 'Users').
  877. $this->getAdvComparator($comparator,trim($value),$datatype);
  878. } elseif($selectedfields[0] == "vtiger_activity" && $selectedfields[1] == 'status') {
  879. $fieldvalue = "(case when (vtiger_activity.status not like '') then vtiger_activity.status else vtiger_activity.eventstatus end)".$this->getAdvComparator($comparator,trim($value),$datatype);
  880. } elseif($comparator == 'y' || ($comparator == 'e' && (trim($value) == "NULL" || trim($value) == ''))) {
  881. if($selectedfields[0] == 'vtiger_inventoryproductrel') {
  882. $selectedfields[0]='vtiger_inventoryproductrel'.$this->primarymodule;
  883. }
  884. $fieldvalue = "(".$selectedfields[0].".".$selectedfields[1]." IS NULL OR ".$selectedfields[0].".".$selectedfields[1]." = '')";
  885. } elseif($selectedfields[0] == 'vtiger_inventoryproductrel' ) {
  886. if($selectedfields[1] == 'productid'){
  887. $fieldvalue = "vtiger_products{$this->primarymodule}.productname ".$this->getAdvComparator($comparator,trim($value),$datatype);
  888. $this->queryPlanner->addTable("vtiger_products{$this->primarymodule}");
  889. } else if($selectedfields[1] == 'serviceid'){
  890. $fieldvalue = "vtiger_service{$this->primarymodule}.servicename ".$this->getAdvComparator($comparator,trim($value),$datatype);
  891. $this->queryPlanner->addTable("vtiger_service{$this->primarymodule}");
  892. }
  893. else{
  894. //for inventory module table should be follwed by the module name
  895. $selectedfields[0]='vtiger_inventoryproductrel'.$this->primarymodule;
  896. $fieldvalue = $selectedfields[0].".".$selectedfields[1].$this->getAdvComparator($comparator, $value, $datatype);
  897. }
  898. } elseif($fieldInfo['uitype'] == '10' || isReferenceUIType($fieldInfo['uitype'])) {
  899. $comparatorValue = $this->getAdvComparator($comparator,trim($value),$datatype);
  900. $fieldSqls = array();
  901. $fieldSqlColumns = $this->getReferenceFieldColumnList($moduleName, $fieldInfo);
  902. foreach($fieldSqlColumns as $columnSql) {
  903. $fieldSqls[] = $columnSql.$comparatorValue;
  904. }
  905. $fieldvalue = ' ('. implode(' OR ', $fieldSqls).') ';
  906. } else {
  907. $fieldvalue = $selectedfields[0].".".$selectedfields[1].$this->getAdvComparator($comparator,trim($value),$datatype);
  908. }
  909. $advfiltergroupsql .= $fieldvalue;
  910. if(!empty($columncondition)) {
  911. $advfiltergroupsql .= ' '.$columncondition.' ';
  912. }
  913. $this->queryPlanner->addTable($selectedfields[0]);
  914. }
  915. }
  916. if (trim($advfiltergroupsql) != "") {
  917. $advfiltergroupsql = "( $advfiltergroupsql ) ";
  918. if(!empty($groupcondition)) {
  919. $advfiltergroupsql .= ' '. $groupcondition . ' ';
  920. }
  921. $advfiltersql .= $advfiltergroupsql;
  922. }
  923. }
  924. }
  925. if (trim($advfiltersql) != "") $advfiltersql = '('.$advfiltersql.')';
  926. return $advfiltersql;
  927. }
  928. function getAdvFilterSql($reportid) {
  929. // Have we initialized information already?
  930. if($this->_advfiltersql !== false) {
  931. return $this->_advfiltersql;
  932. }
  933. global $log;
  934. $advfilterlist = $this->getAdvFilterList($reportid);
  935. $advfiltersql = $this->generateAdvFilterSql($advfilterlist);
  936. // Save the information
  937. $this->_advfiltersql = $advfiltersql;
  938. $log->info("ReportRun :: Successfully returned getAdvFilterSql".$reportid);
  939. return $advfiltersql;
  940. }
  941. /** Function to get the Standard filter columns for the reportid
  942. * This function accepts the $reportid datatype Integer
  943. * This function returns $stdfilterlist Array($columnname => $tablename:$columnname:$fieldlabel:$fieldname:$typeofdata=>$tablename.$columnname filtercriteria,
  944. * $tablename1:$columnname1:$fieldlabel1:$fieldname1:$typeofdata1=>$tablename1.$columnname1 filtercriteria,
  945. * )
  946. *
  947. */
  948. function getStdFilterList($reportid)
  949. {
  950. // Have we initialized information already?
  951. if($this->_stdfilterlist !== false) {
  952. return $this->_stdfilterlist;
  953. }
  954. global $adb, $log;
  955. $stdfilterlist = array();
  956. $stdfiltersql = "select vtiger_reportdatefilter.* from vtiger_report";
  957. $stdfiltersql .= " inner join vtiger_reportdatefilter on vtiger_report.reportid = vtiger_reportdatefilter.datefilterid";
  958. $stdfiltersql .= " where vtiger_report.reportid = ?";
  959. $result = $adb->pquery($stdfiltersql, array($reportid));
  960. $stdfilterrow = $adb->fetch_array($result);
  961. if(isset($stdfilterrow)) {
  962. $fieldcolname = $stdfilterrow["datecolumnname"];
  963. $datefilter = $stdfilterrow["datefilter"];
  964. $startdate = $stdfilterrow["startdate"];
  965. $enddate = $stdfilterrow["enddate"];
  966. if($fieldcolname != "none") {
  967. $selectedfields = explode(":",$fieldcolname);
  968. if($selectedfields[0] == "vtiger_crmentity".$this->primarymodule)
  969. $selectedfields[0] = "vtiger_crmentity";
  970. $moduleFieldLabel = $selectedfields[3];
  971. list($moduleName, $fieldLabel) = explode('_', $moduleFieldLabel, 2);
  972. $fieldInfo = getFieldByReportLabel($moduleName, $fieldLabel);
  973. $typeOfData = $fieldInfo['typeofdata'];
  974. list($type, $typeOtherInfo) = explode('~', $typeOfData, 2);
  975. if($datefilter != "custom") {
  976. $startenddate = $this->getStandarFiltersStartAndEndDate($datefilter);
  977. $startdate = $startenddate[0];
  978. $enddate = $startenddate[1];
  979. }
  980. if($startdate != "0000-00-00" && $enddate != "0000-00-00" && $startdate != "" && $enddate != ""
  981. && $selectedfields[0] != "" && $selectedfields[1] != "") {
  982. $startDateTime = new DateTimeField($startdate.' '. date('H:i:s'));
  983. $userStartDate = $startDateTime->getDisplayDate();
  984. if($type == 'DT') {
  985. $userStartDate = $userStartDate.' 00:00:00';
  986. }
  987. $startDateTime = getValidDBInsertDateTimeValue($userStartDate);
  988. $endDateTime = new DateTimeField($enddate.' '. date('H:i:s'));
  989. $userEndDate = $endDateTime->getDisplayDate();
  990. if($type == 'DT') {
  991. $userEndDate = $userEndDate.' 23:59:00';
  992. }
  993. $endDateTime = getValidDBInsertDateTimeValue($userEndDate);
  994. if ($selectedfields[1] == 'birthday') {
  995. $tableColumnSql = "to_char(".$selectedfields[0].".".$selectedfields[1].", '%m%d')";
  996. $startDateTime = "to_char('$startDateTime', '%m%d')";
  997. $endDateTime = "to_char('$endDateTime', '%m%d')";
  998. } else {
  999. if($selectedfields[0] == 'vtiger_activity' && ($selectedfields[1] == 'date_start')) {
  1000. $tableColumnSql = '';
  1001. $tableColumnSql = "to_timestamp(date_start || ' ' || time_start AS DATETIME,'YYYY-MM-DD HH24:MI:SS')";
  1002. } else {
  1003. $tableColumnSql = $selectedfields[0].".".$selectedfields[1];
  1004. }
  1005. $startDateTime = "'$startDateTime'";
  1006. $endDateTime = "'$endDateTime'";
  1007. }
  1008. $stdfilterlist[$fieldcolname] = $tableColumnSql." between ".$startDateTime." and ".$endDateTime;
  1009. $this->queryPlanner->addTable($selectedfields[0]);
  1010. }
  1011. }
  1012. }
  1013. // Save the information
  1014. $this->_stdfilterlist = $stdfilterlist;
  1015. $log->info("ReportRun :: Successfully returned getStdFilterList".$reportid);
  1016. return $stdfilterlist;
  1017. }
  1018. /** Function to get the RunTime filter columns for the given $filtercolumn,$filter,$startdate,$enddate
  1019. * @ param $filtercolumn : Type String
  1020. * @ param $filter : Type String
  1021. * @ param $startdate: Type String
  1022. * @ param $enddate : Type String
  1023. * This function returns $stdfilterlist Array($columnname => $tablename:$columnname:$fieldlabel=>$tablename.$columnname 'between' $startdate 'and' $enddate)
  1024. *
  1025. */
  1026. function RunTimeFilter($filtercolumn,$filter,$startdate,$enddate)
  1027. {
  1028. if($filtercolumn != "none")
  1029. {
  1030. $selectedfields = explode(":",$filtercolumn);
  1031. if($selectedfields[0] == "vtiger_crmentity".$this->primarymodu

Large files files are truncated, but you can click here to view the full file