PageRenderTime 58ms CodeModel.GetById 16ms RepoModel.GetById 1ms app.codeStats 0ms

/modules/Reports/ReportRun.php

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

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