PageRenderTime 44ms CodeModel.GetById 11ms RepoModel.GetById 1ms app.codeStats 0ms

/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
  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->primarymodule)
  1032. $selectedfields[0] = "vtiger_crmentity";
  1033. if($filter == "custom")
  1034. {
  1035. if($startdate != "0000-00-00" && $enddate != "0000-00-00" && $startdate != "" &&
  1036. $enddate != "" && $selectedfields[0] != "" && $selectedfields[1] != "") {
  1037. $stdfilterlist[$filtercolumn] = $selectedfields[0].".".$selectedfields[1]." between '".$startdate." 00:00:00' and '".$enddate." 23:59:00'";
  1038. }
  1039. }else
  1040. {
  1041. if($startdate != "" && $enddate != "")
  1042. {
  1043. $startenddate = $this->getStandarFiltersStartAndEndDate($filter);
  1044. if($startenddate[0] != "" && $startenddate[1] != "" && $selectedfields[0] != "" && $selectedfields[1] != "")
  1045. {
  1046. $stdfilterlist[$filtercolumn] = $selectedfields[0].".".$selectedfields[1]." between '".$startenddate[0]." 00:00:00' and '".$startenddate[1]." 23:59:00'";
  1047. }
  1048. }
  1049. }
  1050. }
  1051. return $stdfilterlist;
  1052. }
  1053. /** Function to get the RunTime Advanced filter conditions
  1054. * @ param $advft_criteria : Type Array
  1055. * @ param $advft_criteria_groups : Type Array
  1056. * This function returns $advfiltersql
  1057. *
  1058. */
  1059. function RunTimeAdvFilter($advft_criteria,$advft_criteria_groups) {
  1060. $adb = PearDatabase::getInstance();
  1061. $advfilterlist = array();
  1062. if(!empty($advft_criteria)) {
  1063. foreach($advft_criteria as $column_index => $column_condition) {
  1064. if(empty($column_condition)) continue;
  1065. $adv_filter_column = $column_condition["columnname"];
  1066. $adv_filter_comparator = $column_condition["comparator"];
  1067. $adv_filter_value = $column_condition["value"];
  1068. $adv_filter_column_condition = $column_condition["columncondition"];
  1069. $adv_filter_groupid = $column_condition["groupid"];
  1070. $column_info = explode(":",$adv_filter_column);
  1071. $moduleFieldLabel = $column_info[2];
  1072. $fieldName = $column_info[3];
  1073. list($module, $fieldLabel) = explode('_', $moduleFieldLabel, 2);
  1074. $fieldInfo = getFieldByReportLabel($module, $fieldLabel);
  1075. $fieldType = null;
  1076. if(!empty($fieldInfo)) {
  1077. $field = WebserviceField::fromArray($adb, $fieldInfo);
  1078. $fieldType = $field->getFieldDataType();
  1079. }
  1080. if($fieldType == 'currency') {
  1081. // Some of the currency fields like Unit Price, Total, Sub-total etc of Inventory modules, do not need currency conversion
  1082. if($field->getUIType() == '72') {
  1083. $adv_filter_value = CurrencyField::convertToDBFormat($adv_filter_value, null, true);
  1084. } else {
  1085. $adv_filter_value = CurrencyField::convertToDBFormat($adv_filter_value);
  1086. }
  1087. }
  1088. $temp_val = explode(",",$adv_filter_value);
  1089. if(($column_info[4] == 'D' || ($column_info[4] == 'T' && $column_info[1] != 'time_start' && $column_info[1] != 'time_end')
  1090. || ($column_info[4] == 'DT'))
  1091. && ($column_info[4] != '' && $adv_filter_value != '' )) {
  1092. $val = Array();
  1093. for($x=0;$x<count($temp_val);$x++) {
  1094. if($column_info[4] == 'D') {
  1095. $date = new DateTimeField(trim($temp_val[$x]));
  1096. $val[$x] = $date->getDBInsertDateValue();
  1097. } elseif($column_info[4] == 'DT') {
  1098. $date = new DateTimeField(trim($temp_val[$x]));
  1099. $val[$x] = $date->getDBInsertDateTimeValue();
  1100. } else {
  1101. $date = new DateTimeField(trim($temp_val[$x]));
  1102. $val[$x] = $date->getDBInsertTimeValue();
  1103. }
  1104. }
  1105. $adv_filter_value = implode(",",$val);
  1106. }
  1107. $criteria = array();
  1108. $criteria['columnname'] = $adv_filter_column;
  1109. $criteria['comparator'] = $adv_filter_comparator;
  1110. $criteria['value'] = $adv_filter_value;
  1111. $criteria['column_condition'] = $adv_filter_column_condition;
  1112. $advfilterlist[$adv_filter_groupid]['columns'][] = $criteria;
  1113. }
  1114. foreach($advft_criteria_groups as $group_index => $group_condition_info) {
  1115. if(empty($group_condition_info)) continue;
  1116. if(empty($advfilterlist[$group_index])) continue;
  1117. $advfilterlist[$group_index]['condition'] = $group_condition_info["groupcondition"];
  1118. $noOfGroupColumns = count($advfilterlist[$group_index]['columns']);
  1119. if(!empty($advfilterlist[$group_index]['columns'][$noOfGroupColumns-1]['column_condition'])) {
  1120. $advfilterlist[$group_index]['columns'][$noOfGroupColumns-1]['column_condition'] = '';
  1121. }
  1122. }
  1123. $noOfGroups = count($advfilterlist);
  1124. if(!empty($advfilterlist[$noOfGroups]['condition'])) {
  1125. $advfilterlist[$noOfGroups]['condition'] = '';
  1126. }
  1127. $advfiltersql = $this->generateAdvFilterSql($advfilterlist);
  1128. }
  1129. return $advfiltersql;
  1130. }
  1131. /** Function to get standardfilter for the given reportid
  1132. * @ param $reportid : Type Integer
  1133. * returns the query of columnlist for the selected columns
  1134. */
  1135. function getStandardCriterialSql($reportid)
  1136. {
  1137. global $adb;
  1138. global $modules;
  1139. global $log;
  1140. $sreportstdfiltersql = "select vtiger_reportdatefilter.* from vtiger_report";
  1141. $sreportstdfiltersql .= " inner join vtiger_reportdatefilter on vtiger_report.reportid = vtiger_reportdatefilter.datefilterid";
  1142. $sreportstdfiltersql .= " where vtiger_report.reportid = ?";
  1143. $result = $adb->pquery($sreportstdfiltersql, array($reportid));
  1144. $noofrows = $adb->num_rows($result);
  1145. for($i=0; $i<$noofrows; $i++) {
  1146. $fieldcolname = $adb->query_result($result,$i,"datecolumnname");
  1147. $datefilter = $adb->query_result($result,$i,"datefilter");
  1148. $startdate = $adb->query_result($result,$i,"startdate");
  1149. $enddate = $adb->query_result($result,$i,"enddate");
  1150. if($fieldcolname != "none") {
  1151. $selectedfields = explode(":",$fieldcolname);
  1152. if($selectedfields[0] == "vtiger_crmentity".$this->primarymodule)
  1153. $selectedfields[0] = "vtiger_crmentity";
  1154. if($datefilter == "custom") {
  1155. if($startdate != "0000-00-00" && $enddate != "0000-00-00" && $selectedfields[0] != "" && $selectedfields[1] != ""
  1156. && $startdate != '' && $enddate != '') {
  1157. $startDateTime = new DateTimeField($startdate.' '. date('H:i:s'));
  1158. $startdate = $startDateTime->getDisplayDate();
  1159. $endDateTime = new DateTimeField($enddate.' '. date('H:i:s'));
  1160. $enddate = $endDateTime->getDisplayDate();
  1161. $sSQL .= $selectedfields[0].".".$selectedfields[1]." between '".$startdate."' and '".$enddate."'";
  1162. }
  1163. } else {
  1164. $startenddate = $this->getStandarFiltersStartAndEndDate($datefilter);
  1165. $startDateTime = new DateTimeField($startenddate[0].' '. date('H:i:s'));
  1166. $startdate = $startDateTime->getDisplayDate();
  1167. $endDateTime = new DateTimeField($startenddate[1].' '. date('H:i:s'));
  1168. $enddate = $endDateTime->getDisplayDate();
  1169. if($startenddate[0] != "" && $startenddate[1] != "" && $selectedfields[0] != "" && $selectedfields[1] != "") {
  1170. $sSQL .= $selectedfields[0].".".$selectedfields[1]." between '".$startdate."' and '".$enddate."'";
  1171. }
  1172. }
  1173. }
  1174. }
  1175. $log->info("ReportRun :: Successfully returned getStandardCriterialSql".$reportid);
  1176. return $sSQL;
  1177. }
  1178. /** Function to get standardfilter startdate and enddate for the given type
  1179. * @ param $type : Type String
  1180. * returns the $datevalue Array in the given format
  1181. * $datevalue = Array(0=>$startdate,1=>$enddate)
  1182. */
  1183. function getStandarFiltersStartAndEndDate($type)
  1184. {
  1185. $today = date("Y-m-d",mktime(0, 0, 0, date("m") , date("d"), date("Y")));
  1186. $tomorrow = date("Y-m-d",mktime(0, 0, 0, date("m") , date("d")+1, date("Y")));
  1187. $yesterday = date("Y-m-d",mktime(0, 0, 0, date("m") , date("d")-1, date("Y")));
  1188. $currentmonth0 = date("Y-m-d",mktime(0, 0, 0, date("m"), "01", date("Y")));
  1189. $currentmonth1 = date("Y-m-t");
  1190. $lastmonth0 = date("Y-m-d",mktime(0, 0, 0, date("m")-1, "01", date("Y")));
  1191. $lastmonth1 = date("Y-m-t", strtotime("-1 Month"));
  1192. $nextmonth0 = date("Y-m-d",mktime(0, 0, 0, date("m")+1, "01", date("Y")));
  1193. $nextmonth1 = date("Y-m-t", strtotime("+1 Month"));
  1194. $lastweek0 = date("Y-m-d",strtotime("-2 week Monday"));
  1195. $lastweek1 = date("Y-m-d",strtotime("-1 week Sunday"));
  1196. $thisweek0 = date("Y-m-d",strtotime("-1 week Monday"));
  1197. $thisweek1 = date("Y-m-d",strtotime("this Sunday"));
  1198. $nextweek0 = date("Y-m-d",strtotime("this Monday"));
  1199. $nextweek1 = date("Y-m-d",strtotime("+1 week Sunday"));
  1200. $next7days = date("Y-m-d",mktime(0, 0, 0, date("m") , date("d")+6, date("Y")));
  1201. $next30days = date("Y-m-d",mktime(0, 0, 0, date("m") , date("d")+29, date("Y")));
  1202. $next60days = date("Y-m-d",mktime(0, 0, 0, date("m") , date("d")+59, date("Y")));
  1203. $next90days = date("Y-m-d",mktime(0, 0, 0, date("m") , date("d")+89, date("Y")));
  1204. $next120days = date("Y-m-d",mktime(0, 0, 0, date("m") , date("d")+119, date("Y")));
  1205. $last7days = date("Y-m-d",mktime(0, 0, 0, date("m") , date("d")-6, date("Y")));
  1206. $last30days = date("Y-m-d",mktime(0, 0, 0, date("m") , date("d")-29, date("Y")));
  1207. $last60days = date("Y-m-d",mktime(0, 0, 0, date("m") , date("d")-59, date("Y")));
  1208. $last90days = date("Y-m-d",mktime(0, 0, 0, date("m") , date("d")-89, date("Y")));
  1209. $last120days = date("Y-m-d",mktime(0, 0, 0, date("m") , date("d")-119, date("Y")));
  1210. $currentFY0 = date("Y-m-d",mktime(0, 0, 0, "01", "01", date("Y")));
  1211. $currentFY1 = date("Y-m-t",mktime(0, 0, 0, "12", date("d"), date("Y")));
  1212. $lastFY0 = date("Y-m-d",mktime(0, 0, 0, "01", "01", date("Y")-1));
  1213. $lastFY1 = date("Y-m-t", mktime(0, 0, 0, "12", date("d"), date("Y")-1));
  1214. $nextFY0 = date("Y-m-d",mktime(0, 0, 0, "01", "01", date("Y")+1));
  1215. $nextFY1 = date("Y-m-t", mktime(0, 0, 0, "12", date("d"), date("Y")+1));
  1216. if(date("m") <= 3)
  1217. {
  1218. $cFq = date("Y-m-d",mktime(0, 0, 0, "01","01",date("Y")));
  1219. $cFq1 = date("Y-m-d",mktime(0, 0, 0, "03","31",date("Y")));
  1220. $nFq = date("Y-m-d",mktime(0, 0, 0, "04","01",date("Y")));
  1221. $nFq1 = date("Y-m-d",mktime(0, 0, 0, "06","30",date("Y")));
  1222. $pFq = date("Y-m-d",mktime(0, 0, 0, "10","01",date("Y")-1));
  1223. $pFq1 = date("Y-m-d",mktime(0, 0, 0, "12","31",date("Y")-1));
  1224. }else if(date("m") > 3 and date("m") <= 6)
  1225. {
  1226. $pFq = date("Y-m-d",mktime(0, 0, 0, "01","01",date("Y")));
  1227. $pFq1 = date("Y-m-d",mktime(0, 0, 0, "03","31",date("Y")));
  1228. $cFq = date("Y-m-d",mktime(0, 0, 0, "04","01",date("Y")));
  1229. $cFq1 = date("Y-m-d",mktime(0, 0, 0, "06","30",date("Y")));
  1230. $nFq = date("Y-m-d",mktime(0, 0, 0, "07","01",date("Y")));
  1231. $nFq1 = date("Y-m-d",mktime(0, 0, 0, "09","30",date("Y")));
  1232. }else if(date("m") > 6 and date("m") <= 9)
  1233. {
  1234. $nFq = date("Y-m-d",mktime(0, 0, 0, "10","01",date("Y")));
  1235. $nFq1 = date("Y-m-d",mktime(0, 0, 0, "12","31",date("Y")));
  1236. $pFq = date("Y-m-d",mktime(0, 0, 0, "04","01",date("Y")));
  1237. $pFq1 = date("Y-m-d",mktime(0, 0, 0, "06","30",date("Y")));
  1238. $cFq = date("Y-m-d",mktime(0, 0, 0, "07","01",date("Y")));
  1239. $cFq1 = date("Y-m-d",mktime(0, 0, 0, "09","30",date("Y")));
  1240. }
  1241. else if(date("m") > 9 and date("m") <= 12)
  1242. {
  1243. $nFq = date("Y-m-d",mktime(0, 0, 0, "01","01",date("Y")+1));
  1244. $nFq1 = date("Y-m-d",mktime(0, 0, 0, "03","31",date("Y")+1));
  1245. $pFq = date("Y-m-d",mktime(0, 0, 0, "07","01",date("Y")));
  1246. $pFq1 = date("Y-m-d",mktime(0, 0, 0, "09","30",date("Y")));
  1247. $cFq = date("Y-m-d",mktime(0, 0, 0, "10","01",date("Y")));
  1248. $cFq1 = date("Y-m-d",mktime(0, 0, 0, "12","31",date("Y")));
  1249. }
  1250. if($type == "today" )
  1251. {
  1252. $datevalue[0] = $today;
  1253. $datevalue[1] = $today;
  1254. }
  1255. elseif($type == "yesterday" )
  1256. {
  1257. $datevalue[0] = $yesterday;
  1258. $datevalue[1] = $yesterday;
  1259. }
  1260. elseif($type == "tomorrow" )
  1261. {
  1262. $datevalue[0] = $tomorrow;
  1263. $datevalue[1] = $tomorrow;
  1264. }
  1265. elseif($type == "thisweek" )
  1266. {
  1267. $datevalue[0] = $thisweek0;
  1268. $datevalue[1] = $thisweek1;
  1269. }
  1270. elseif($type == "lastweek" )
  1271. {
  1272. $datevalue[0] = $lastweek0;
  1273. $datevalue[1] = $lastweek1;
  1274. }
  1275. elseif($type == "nextweek" )
  1276. {
  1277. $datevalue[0] = $nextweek0;
  1278. $datevalue[1] = $nextweek1;
  1279. }
  1280. elseif($type == "thismonth" )
  1281. {
  1282. $datevalue[0] =$currentmonth0;
  1283. $datevalue[1] = $currentmonth1;
  1284. }
  1285. elseif($type == "lastmonth" )
  1286. {
  1287. $datevalue[0] = $lastmonth0;
  1288. $datevalue[1] = $lastmonth1;
  1289. }
  1290. elseif($type == "nextmonth" )
  1291. {
  1292. $datevalue[0] = $nextmonth0;
  1293. $datevalue[1] = $nextmonth1;
  1294. }
  1295. elseif($type == "next7days" )
  1296. {
  1297. $datevalue[0] = $today;
  1298. $datevalue[1] = $next7days;
  1299. }
  1300. elseif($type == "next30days" )
  1301. {
  1302. $datevalue[0] =$today;
  1303. $datevalue[1] =$next30days;
  1304. }
  1305. elseif($type == "next60days" )
  1306. {
  1307. $datevalue[0] = $today;
  1308. $datevalue[1] = $next60days;
  1309. }
  1310. elseif($type == "next90days" )
  1311. {
  1312. $datevalue[0] = $today;
  1313. $datevalue[1] = $next90days;
  1314. }
  1315. elseif($type == "next120days" )
  1316. {
  1317. $datevalue[0] = $today;
  1318. $datevalue[1] = $next120days;
  1319. }
  1320. elseif($type == "last7days" )
  1321. {
  1322. $datevalue[0] = $last7days;
  1323. $datevalue[1] = $today;
  1324. }
  1325. elseif($type == "last30days" )
  1326. {
  1327. $datevalue[0] = $last30days;
  1328. $datevalue[1] = $today;
  1329. }
  1330. elseif($type == "last60days" )
  1331. {
  1332. $datevalue[0] = $last60days;
  1333. $datevalue[1] = $today;
  1334. }
  1335. else if($type == "last90days" )
  1336. {
  1337. $datevalue[0] = $last90days;
  1338. $datevalue[1] = $today;
  1339. }
  1340. elseif($type == "last120days" )
  1341. {
  1342. $datevalue[0] = $last120days;
  1343. $datevalue[1] = $today;
  1344. }
  1345. elseif($type == "thisfy" )
  1346. {
  1347. $datevalue[0] = $currentFY0;
  1348. $datevalue[1] = $currentFY1;
  1349. }
  1350. elseif($type == "prevfy" )
  1351. {
  1352. $datevalue[0] = $lastFY0;
  1353. $datevalue[1] = $lastFY1;
  1354. }
  1355. elseif($type == "nextfy" )
  1356. {
  1357. $datevalue[0] = $nextFY0;
  1358. $datevalue[1] = $nextFY1;
  1359. }
  1360. elseif($type == "nextfq" )
  1361. {
  1362. $datevalue[0] = $nFq;
  1363. $datevalue[1] = $nFq1;
  1364. }
  1365. elseif($type == "prevfq" )
  1366. {
  1367. $datevalue[0] = $pFq;
  1368. $datevalue[1] = $pFq1;
  1369. }
  1370. elseif($type == "thisfq" )
  1371. {
  1372. $datevalue[0] = $cFq;
  1373. $datevalue[1] = $cFq1;
  1374. }
  1375. else
  1376. {
  1377. $datevalue[0] = "";
  1378. $datevalue[1] = "";
  1379. }
  1380. return $datevalue;
  1381. }
  1382. function hasGroupingList() {
  1383. global $adb;
  1384. $result = $adb->pquery('SELECT 1 FROM vtiger_reportsortcol WHERE reportid=? and columnname <> "none"', array($this->reportid));
  1385. return ($result && $adb->num_rows($result))? true : false;
  1386. }
  1387. /** Function to get getGroupingList for the given reportid
  1388. * @ param $reportid : Type Integer
  1389. * returns the $grouplist Array in the following format
  1390. * $grouplist = Array($tablename:$columnname:$fieldlabel:fieldname:typeofdata=>$tablename:$columnname $sorder,
  1391. * $tablename1:$columnname1:$fieldlabel1:fieldname1:typeofdata1=>$tablename1:$columnname1 $sorder,
  1392. * $tablename2:$columnname2:$fieldlabel2:fieldname2:typeofdata2=>$tablename2:$columnname2 $sorder)
  1393. * This function also sets the return value in the class variable $this->groupbylist
  1394. */
  1395. function getGroupingList($reportid)
  1396. {
  1397. global $adb;
  1398. global $modules;
  1399. global $log;
  1400. // Have we initialized information already?
  1401. if($this->_groupinglist !== false) {
  1402. return $this->_groupinglist;
  1403. }
  1404. $sreportsortsql = " SELECT vtiger_reportsortcol.*, vtiger_reportgroupbycolumn.* FROM vtiger_report";
  1405. $sreportsortsql .= " inner join vtiger_reportsortcol on vtiger_report.reportid = vtiger_reportsortcol.reportid";
  1406. $sreportsortsql .= " LEFT JOIN vtiger_reportgroupbycolumn ON (vtiger_report.reportid = vtiger_reportgroupbycolumn.reportid AND vtiger_reportsortcol.sortcolid = vtiger_reportgroupbycolumn.sortid)";
  1407. $sreportsortsql .= " where vtiger_report.reportid =? AND vtiger_reportsortcol.columnname IN (SELECT columnname from vtiger_selectcolumn WHERE queryid=?) order by vtiger_reportsortcol.sortcolid";
  1408. $result = $adb->pquery($sreportsortsql, array($reportid,$reportid));
  1409. $grouplist = array();
  1410. $inventoryModules = getInventoryModules();
  1411. while($reportsortrow = $adb->fetch_array($result))
  1412. {
  1413. $fieldcolname = $reportsortrow["columnname"];
  1414. list($tablename,$colname,$module_field,$fieldname,$single) = split(":",$fieldcolname);
  1415. $sortorder = $reportsortrow["sortorder"];
  1416. if($sortorder == "Ascending")
  1417. {
  1418. $sortorder = "ASC";
  1419. }elseif($sortorder == "Descending")
  1420. {
  1421. $sortorder = "DESC";
  1422. }
  1423. if($fieldcolname != "none")
  1424. {
  1425. $selectedfields = explode(":",$fieldcolname);
  1426. if($selectedfields[0] == "vtiger_crmentity".$this->primarymodule)
  1427. $selectedfields[0] = "vtiger_crmentity";
  1428. if(stripos($selectedfields[1],'cf_')==0 && stristr($selectedfields[1],'cf_')==true){
  1429. $sqlvalue = "".$adb->sql_escape_string(decode_html($selectedfields[2]))." ".$sortorder;
  1430. } else {
  1431. $sqlvalue = "".self::replaceSpecialChar($selectedfields[2])." ".$sortorder;
  1432. }
  1433. /************** MONOLITHIC phase 6 customization********************************/
  1434. if($selectedfields[4]=="D" && strtolower($reportsortrow["dategroupbycriteria"])!="none"){
  1435. $groupField = $module_field;
  1436. $groupCriteria = $reportsortrow["dategroupbycriteria"];
  1437. if(in_array($groupCriteria,array_keys($this->groupByTimeParent))){
  1438. $parentCriteria = $this->groupByTimeParent[$groupCriteria];
  1439. foreach($parentCriteria as $criteria){
  1440. $groupByCondition[]=$this->GetTimeCriteriaCondition($criteria, $groupField)." ".$sortorder;
  1441. }
  1442. }
  1443. $groupByCondition[] =$this->GetTimeCriteriaCondition($groupCriteria, $groupField)." ".$sortorder;
  1444. $sqlvalue = implode(", ",$groupByCondition);
  1445. }
  1446. $grouplist[$fieldcolname] = $sqlvalue;
  1447. $temp = split("_",$selectedfields[2],2);
  1448. $module = $temp[0];
  1449. if (in_array($module, $inventoryModules) && $fieldname == 'serviceid') {
  1450. $grouplist[$fieldcolname] = $sqlvalue;
  1451. } else if(CheckFieldPermission($fieldname,$module) == 'true') {
  1452. $grouplist[$fieldcolname] = $sqlvalue;
  1453. } else {
  1454. $grouplist[$fieldcolname] = $selectedfields[0].".".$selectedfields[1];
  1455. }
  1456. $this->queryPlanner->addTable($tablename);
  1457. }
  1458. }
  1459. // Save the information
  1460. $this->_groupinglist = $grouplist;
  1461. $log->info("ReportRun :: Successfully returned getGroupingList".$reportid);
  1462. return $grouplist;
  1463. }
  1464. /** function to replace special characters
  1465. * @ param $selectedfield : type string
  1466. * this returns the string for grouplist
  1467. */
  1468. function replaceSpecialChar($selectedfield){
  1469. $selectedfield = decode_html(decode_html($selectedfield));
  1470. preg_match('/&/', $selectedfield, $matches);
  1471. if(!empty($matches)){
  1472. $selectedfield = str_replace('&', 'and',($selectedfield));
  1473. }
  1474. return $selectedfield;
  1475. }
  1476. /** function to get the selectedorderbylist for the given reportid
  1477. * @ param $reportid : type integer
  1478. * this returns the columns query for the sortorder columns
  1479. * this function also sets the return value in the class variable $this->orderbylistsql
  1480. */
  1481. function getSelectedOrderbyList($reportid)
  1482. {
  1483. global $adb;
  1484. global $modules;
  1485. global $log;
  1486. $sreportsortsql = "select vtiger_reportsortcol.* from vtiger_report";
  1487. $sreportsortsql .= " inner join vtiger_reportsortcol on vtiger_report.reportid = vtiger_reportsortcol.reportid";
  1488. $sreportsortsql .= " where vtiger_report.reportid =? order by vtiger_reportsortcol.sortcolid";
  1489. $result = $adb->pquery($sreportsortsql, array($reportid));
  1490. $noofrows = $adb->num_rows($result);
  1491. for($i=0; $i<$noofrows; $i++)
  1492. {
  1493. $fieldcolname = $adb->query_result($result,$i,"columnname");
  1494. $sortorder = $adb->query_result($result,$i,"sortorder");
  1495. if($sortorder == "Ascending")
  1496. {
  1497. $sortorder = "ASC";
  1498. }
  1499. elseif($sortorder == "Descending")
  1500. {
  1501. $sortorder = "DESC";
  1502. }
  1503. if($fieldcolname != "none")
  1504. {
  1505. $this->orderbylistcolumns[] = $fieldcolname;
  1506. $n = $n + 1;
  1507. $selectedfields = explode(":",$fieldcolname);
  1508. if($n > 1)
  1509. {
  1510. $sSQL .= ", ";
  1511. $this->orderbylistsql .= ", ";
  1512. }
  1513. if($selectedfields[0] == "vtiger_crmentity".$this->primarymodule)
  1514. $selectedfields[0] = "vtiger_crmentity";
  1515. $sSQL .= $selectedfields[0].".".$selectedfields[1]." ".$sortorder;
  1516. $this->orderbylistsql .= $selectedfields[0].".".$selectedfields[1]." ".$selectedfields[2];
  1517. }
  1518. }
  1519. $log->info("ReportRun :: Successfully returned getSelectedOrderbyList".$reportid);
  1520. return $sSQL;
  1521. }
  1522. /** function to get secondary Module for the given Primary module and secondary module
  1523. * @ param $module : type String
  1524. * @ param $secmodule : type String
  1525. * this returns join query for the given secondary module
  1526. */
  1527. function getRelatedModulesQuery($module,$secmodule)
  1528. {
  1529. global $log,$current_user;
  1530. $query = '';
  1531. if($secmodule!=''){
  1532. $secondarymodule = explode(":",$secmodule);
  1533. foreach($secondarymodule as $key=>$value) {
  1534. $foc = CRMEntity::getInstance($value);
  1535. // Case handling: Force table requirement ahead of time.
  1536. $this->queryPlanner->addTable('vtiger_crmentity'. $value);
  1537. $focQuery = $foc->generateReportsSecQuery($module,$value, $this->queryPlanner);
  1538. if ($focQuery) {
  1539. $query .= $focQuery . getNonAdminAccessControlQuery($value,$current_user,$value);
  1540. }
  1541. }
  1542. }
  1543. $log->info("ReportRun :: Successfully returned getRelatedModulesQuery".$secmodule);
  1544. return $query;
  1545. }
  1546. /** function to get report query for the given module
  1547. * @ param $module : type String
  1548. * this returns join query for the given module
  1549. */
  1550. function getReportsQuery($module, $type='')
  1551. {
  1552. global $log, $current_user;
  1553. $secondary_module ="'";
  1554. $secondary_module .= str_replace(":","','",$this->secondarymodule);
  1555. $secondary_module .="'";
  1556. if($module == "Leads")
  1557. {
  1558. $query = "from vtiger_leaddetails
  1559. inner join vtiger_crmentity on vtiger_crmentity.crmid=vtiger_leaddetails.leadid";
  1560. if ($this->queryPlanner->requireTable('vtiger_leadsubdetails')) {
  1561. $query .= " inner join vtiger_leadsubdetails on vtiger_leadsubdetails.leadsubscriptionid=vtiger_leaddetails.leadid";
  1562. }
  1563. if ($this->queryPlanner->requireTable('vtiger_leadaddress')) {
  1564. $query .= " inner join vtiger_leadaddress on vtiger_leadaddress.leadaddressid=vtiger_leaddetails.leadid";
  1565. }
  1566. if ($this->queryPlanner->requireTable('vtiger_leadscf')) {
  1567. $query .= " inner join vtiger_leadscf on vtiger_leaddetails.leadid = vtiger_leadscf.leadid";
  1568. }
  1569. if ($this->queryPlanner->requireTable('vtiger_groupsLeads')) {
  1570. $query .= " left join vtiger_groups as vtiger_groupsLeads on vtiger_groupsLeads.groupid = vtiger_crmentity.smownerid";
  1571. }
  1572. if ($this->queryPlanner->requireTable('vtiger_usersLeads')) {
  1573. $query .= " left join vtiger_users as vtiger_usersLeads on vtiger_usersLeads.id = vtiger_crmentity.smownerid";
  1574. }
  1575. $query .= " left join vtiger_groups on vtiger_groups.groupid = vtiger_crmentity.smownerid
  1576. left join vtiger_users on vtiger_users.id = vtiger_crmentity.smownerid";
  1577. if ($this->queryPlanner->requireTable('vtiger_lastModifiedByLeads')) {
  1578. $query .= " left join vtiger_users as vtiger_lastModifiedByLeads on vtiger_lastModifiedByLeads.id = vtiger_crmentity.modifiedby";
  1579. }
  1580. $query .= " " . $this->getRelatedModulesQuery($module,$this->secondarymodule).
  1581. getNonAdminAccessControlQuery($this->primarymodule,$current_user).
  1582. " where vtiger_crmentity.deleted=0 and vtiger_leaddetails.converted=0";
  1583. }
  1584. else if($module == "Accounts")
  1585. {
  1586. $query = "from vtiger_account
  1587. inner join vtiger_crmentity on vtiger_crmentity.crmid=vtiger_account.accountid";
  1588. if ($this->queryPlanner->requireTable('vtiger_accountbillads')) {
  1589. $query .= " inner join vtiger_accountbillads on vtiger_account.accountid=vtiger_accountbillads.accountaddressid";
  1590. }
  1591. if ($this->queryPlanner->requireTable('vtiger_accountshipads')) {
  1592. $query .= " inner join vtiger_accountshipads on vtiger_account.accountid=vtiger_accountshipads.accountaddressid";
  1593. }
  1594. if ($this->queryPlanner->requireTable('vtiger_accountscf')) {
  1595. $query .= " inner join vtiger_accountscf on vtiger_account.accountid = vtiger_accountscf.accountid";
  1596. }
  1597. if ($this->queryPlanner->requireTable('vtiger_groupsAccounts')) {
  1598. $query .= " left join vtiger_groups as vtiger_groupsAccounts on vtiger_groupsAccounts.groupid = vtiger_crmentity.smownerid";
  1599. }
  1600. if ($this->queryPlanner->requireTable('vtiger_accountAccounts')) {
  1601. $query .= " left join vtiger_account as vtiger_accountAccounts on vtiger_accountAccounts.accountid = vtiger_account.parentid";
  1602. }
  1603. if ($this->queryPlanner->requireTable('vtiger_usersAccounts')) {
  1604. $query .= " left join vtiger_users as vtiger_usersAccounts on vtiger_usersAccounts.id = vtiger_crmentity.smownerid";
  1605. }
  1606. $query .= " left join vtiger_groups on vtiger_groups.groupid = vtiger_crmentity.smownerid
  1607. left join vtiger_users on vtiger_users.id = vtiger_crmentity.smownerid";
  1608. if ($this->queryPlanner->requireTable('vtiger_lastModifiedByAccounts')) {
  1609. $query.= " left join vtiger_users as vtiger_lastModifiedByAccounts on vtiger_lastModifiedByAccounts.id = vtiger_crmentity.modifiedby";
  1610. }
  1611. $query .= " ".$this->getRelatedModulesQuery($module,$this->secondarymodule).
  1612. getNonAdminAccessControlQuery($this->primarymodule,$current_user).
  1613. " where vtiger_crmentity.deleted=0 ";
  1614. }
  1615. else if($module == "Contacts")
  1616. {
  1617. $query = "from vtiger_contactdetails
  1618. inner join vtiger_crmentity on vtiger_crmentity.crmid = vtiger_contactdetails.contactid";
  1619. if ($this->queryPlanner->requireTable('vtiger_contactaddress')) {
  1620. $query .= " inner join vtiger_contactaddress on vtiger_contactdetails.contactid = vtiger_contactaddress.contactaddressid";
  1621. }
  1622. if ($this->queryPlanner->requireTable('vtiger_customerdetails')) {
  1623. $query .= " inner join vtiger_customerdetails on vtiger_customerdetails.customerid = vtiger_contactdetails.contactid";
  1624. }
  1625. if ($this->queryPlanner->requireTable('vtiger_contactsubdetails')) {
  1626. $query .= " inner join vtiger_contactsubdetails on vtiger_contactdetails.contactid = vtiger_contactsubdetails.contactsubscriptionid";
  1627. }
  1628. if ($this->queryPlanner->requireTable('vtiger_contactscf')) {
  1629. $query .= " inner join vtiger_contactscf on vtiger_contactdetails.contactid = vtiger_contactscf.contactid";
  1630. }
  1631. if ($this->queryPlanner->requireTable('vtiger_groupsContacts')) {
  1632. $query .= " left join vtiger_groups vtiger_groupsContacts on vtiger_groupsContacts.groupid = vtiger_crmentity.smownerid";
  1633. }
  1634. if ($this->queryPlanner->requireTable('vtiger_contactdetailsContacts')) {
  1635. $query .= " left join vtiger_contactdetails as vtiger_contactdetailsContacts on vtiger_contactdetailsContacts.contactid = vtiger_contactdetails.reportsto";
  1636. }
  1637. if ($this->queryPlanner->requireTable('vtiger_accountContacts')) {
  1638. $query .= " left join vtiger_account as vtiger_accountContacts on vtiger_accountContacts.accountid = vtiger_contactdetails.accountid";
  1639. }
  1640. if ($this->queryPlanner->requireTable('vtiger_usersContacts')) {
  1641. $query .= " left join vtiger_users as vtiger_usersContacts on vtiger_usersContacts.id = vtiger_crmentity.smownerid";
  1642. }
  1643. $query .= " left join vtiger_users on vtiger_users.id = vtiger_crmentity.smownerid
  1644. left join vtiger_groups on vtiger_groups.groupid = vtiger_crmentity.smownerid";
  1645. if ($this->queryPlanner->requireTable('vtiger_lastModifiedByContacts')) {
  1646. $query .= " left join vtiger_users as vtiger_lastModifiedByContacts on vtiger_lastModifiedByContacts.id = vtiger_crmentity.modifiedby";
  1647. }
  1648. $query .= " ".$this->getRelatedModulesQuery($module,$this->secondarymodule).
  1649. getNonAdminAccessControlQuery($this->primarymodule,$current_user).
  1650. " where vtiger_crmentity.deleted=0";
  1651. }
  1652. else if($module == "Potentials")
  1653. {
  1654. $query = "from vtiger_potential
  1655. inner join vtiger_crmentity on vtiger_crmentity.crmid=vtiger_potential.potentialid";
  1656. if ($this->queryPlanner->requireTable('vtiger_potentialscf')) {
  1657. $query .= " inner join vtiger_potentialscf on vtiger_potentialscf.potentialid = vtiger_potential.potentialid";
  1658. }
  1659. if ($this->queryPlanner->requireTable('vtiger_accountPotentials')) {
  1660. $query .= " left join vtiger_account as vtiger_accountPotentials on vtiger_potential.related_to = vtiger_accountPotentials.accountid";
  1661. }
  1662. if ($this->queryPlanner->requireTable('vtiger_contactdetailsPotentials')) {
  1663. $query .= " left join vtiger_contactdetails as vtiger_contactdetailsPotentials on vtiger_potential.related_to = vtiger_contactdetailsPotentials.contactid";
  1664. }
  1665. if ($this->queryPlanner->requireTable('vtiger_campaignPotentials')) {
  1666. $query .= " left join vtiger_campaign as vtiger_campaignPotentials on vtiger_potential.campaignid = vtiger_campaignPotentials.campaignid";
  1667. }
  1668. if ($this->queryPlanner->requireTable('vtiger_groupsPotentials')) {
  1669. $query .= " left join vtiger_groups vtiger_groupsPotentials on vtiger_groupsPotentials.groupid = vtiger_crmentity.smownerid";
  1670. }
  1671. if ($this->queryPlanner->requireTable('vtiger_usersPotentials')) {
  1672. $query .= " left join vtiger_users as vtiger_usersPotentials on vtiger_usersPotentials.id = vtiger_crmentity.smownerid";
  1673. }
  1674. // TODO optimize inclusion of these tables
  1675. $query .= " left join vtiger_groups on vtiger_groups.groupid = vtiger_crmentity.smownerid";
  1676. $query .= " left join vtiger_users on vtiger_users.id = vtiger_crmentity.smownerid";
  1677. if ($this->queryPlanner->requireTable('vtiger_lastModifiedByPotentials')) {
  1678. $query .= " left join vtiger_users as vtiger_lastModifiedByPotentials on vtiger_lastModifiedByPotentials.id = vtiger_crmentity.modifiedby";
  1679. }
  1680. $query .= " ".$this->getRelatedModulesQuery($module,$this->secondarymodule).
  1681. getNonAdminAccessControlQuery($this->primarymodule,$current_user).
  1682. " where vtiger_crmentity.deleted=0 ";
  1683. }
  1684. //For this Product - we can related Accounts, Contacts (Also Leads, Potentials)
  1685. else if($module == "Products")
  1686. {
  1687. $query .= " from vtiger_products";
  1688. $query .= " inner join vtiger_crmentity on vtiger_crmentity.crmid=vtiger_products.productid";
  1689. if ($this->queryPlanner->requireTable("vtiger_productcf")){
  1690. $query .= " left join vtiger_productcf on vtiger_products.productid = vtiger_productcf.productid";
  1691. }
  1692. if ($this->queryPlanner->requireTable("vtiger_lastModifiedByProducts")){
  1693. $query .= " left join vtiger_users as vtiger_lastModifiedByProducts on vtiger_lastModifiedByProducts.id = vtiger_crmentity.modifiedby";
  1694. }
  1695. if ($this->queryPlanner->requireTable("vtiger_usersProducts")){
  1696. $query .= " left join vtiger_users as vtiger_usersProducts on vtiger_usersProducts.id = vtiger_crmentity.smownerid";
  1697. }
  1698. if ($this->queryPlanner->requireTable("vtiger_groupsProducts")){
  1699. $query .= " left join vtiger_groups as vtiger_groupsProducts on vtiger_groupsProducts.groupid = vtiger_crmentity.smownerid";
  1700. }
  1701. if ($this->queryPlanner->requireTable("vtiger_vendorRelProducts")){
  1702. $query .= " left join vtiger_vendor as vtiger_vendorRelProducts on vtiger_vendorRelProducts.vendorid = vtiger_products.vendor_id";
  1703. }
  1704. if ($this->queryPlanner->requireTable("innerProduct")){
  1705. $query .= " LEFT JOIN (
  1706. SELECT vtiger_products.productid,
  1707. (CASE WHEN (vtiger_products.currency_id = 1 ) THEN vtiger_products.unit_price
  1708. ELSE (vtiger_products.unit_price / vtiger_currency_info.conversion_rate) END
  1709. ) AS actual_unit_price
  1710. FROM vtiger_products
  1711. LEFT JOIN vtiger_currency_info ON vtiger_products.currency_id = vtiger_currency_info.id
  1712. LEFT JOIN vtiger_productcurrencyrel ON vtiger_products.productid = vtiger_productcurrencyrel.productid
  1713. AND vtiger_productcurrencyrel.currencyid = ". $current_user->currency_id . "
  1714. ) AS innerProduct ON innerProduct.productid = vtiger_products.productid";
  1715. }
  1716. $query .= " ".$this->getRelatedModulesQuery($module,$this->secondarymodule).
  1717. getNonAdminAccessControlQuery($this->primarymodule,$current_user)."
  1718. where vtiger_crmentity.deleted=0";
  1719. }
  1720. else if($module == "HelpDesk")
  1721. {
  1722. $matrix = $this->queryPlanner->newDependencyMatrix();
  1723. $matrix->setDependency('vtiger_crmentityRelHelpDesk',array('vtiger_accountRelHelpDesk','vtiger_contactdetailsRelHelpDesk'));
  1724. $query = "from vtiger_troubletickets inner join vtiger_crmentity on vtiger_crmentity.crmid=vtiger_troubletickets.ticketid";
  1725. if ($this->queryPlanner->requireTable('vtiger_ticketcf')) {
  1726. $query .= " inner join vtiger_ticketcf on vtiger_ticketcf.ticketid = vtiger_troubletickets.ticketid";
  1727. }
  1728. if ($this->queryPlanner->requireTable('vtiger_crmentityRelHelpDesk', $matrix)) {
  1729. $query .= " left join vtiger_crmentity as vtiger_crmentityRelHelpDesk on vtiger_crmentityRelHelpDesk.crmid = vtiger_troubletickets.parent_id";
  1730. }
  1731. if ($this->queryPlanner->requireTable('vtiger_accountRelHelpDesk')) {
  1732. $query .= " left join vtiger_account as vtiger_accountRelHelpDesk on vtiger_accountRelHelpDesk.accountid=vtiger_crmentityRelHelpDesk.crmid";
  1733. }
  1734. if ($this->queryPlanner->requireTable('vtiger_contactdetailsRelHelpDesk')) {
  1735. $query .= " left join vtiger_contactdetails as vtiger_contactdetailsRelHelpDesk on vtiger_contactdetailsRelHelpDesk.contactid= vtiger_crmentityRelHelpDesk.crmid";
  1736. }
  1737. if ($this->queryPlanner->requireTable('vtiger_productsRel')) {
  1738. $query .= " left join vtiger_products as vtiger_productsRel on vtiger_productsRel.productid = vtiger_troubletickets.product_id";
  1739. }
  1740. if ($this->queryPlanner->requireTable('vtiger_groupsHelpDesk')) {
  1741. $query .= " left join vtiger_groups as vtiger_groupsHelpDesk on vtiger_groupsHelpDesk.groupid = vtiger_crmentity.smownerid";
  1742. }
  1743. if ($this->queryPlanner->requireTable('vtiger_usersHelpDesk')) {
  1744. $query .= " left join vtiger_users as vtiger_usersHelpDesk on vtiger_crmentity.smownerid=vtiger_usersHelpDesk.id";
  1745. }
  1746. // TODO optimize inclusion of these tables
  1747. $query .= " left join vtiger_groups on vtiger_groups.groupid = vtiger_crmentity.smownerid";
  1748. $query .= " left join vtiger_users on vtiger_crmentity.smownerid=vtiger_users.id";
  1749. if ($this->queryPlanner->requireTable('vtiger_lastModifiedByHelpDesk')) {
  1750. $query .= " left join vtiger_users as vtiger_lastModifiedByHelpDesk on vtiger_lastModifiedByHelpDesk.id = vtiger_crmentity.modifiedby";
  1751. }
  1752. $query .= " ".$this->getRelatedModulesQuery($module,$this->secondarymodule).
  1753. getNonAdminAccessControlQuery($this->primarymodule,$current_user).
  1754. " where vtiger_crmentity.deleted=0 ";
  1755. }
  1756. else if($module == "Calendar")
  1757. {
  1758. $matrix = $this->queryPlanner->newDependencyMatrix();
  1759. $matrix->setDependency('vtiger_cntactivityrel', array('vtiger_contactdetailsCalendar'));
  1760. $matrix->setDependency('vtiger_seactivityrel', array('vtiger_crmentityRelCalendar'));
  1761. $matrix->setDependency('vtiger_crmentityRelCalendar', array('vtiger_accountRelCalendar',
  1762. 'vtiger_leaddetailsRelCalendar','vtiger_potentialRelCalendar','vtiger_quotesRelCalendar',
  1763. 'vtiger_purchaseorderRelCalendar', 'vtiger_invoiceRelCalendar', 'vtiger_salesorderRelCalendar',
  1764. 'vtiger_troubleticketsRelCalendar', 'vtiger_campaignRelCalendar'
  1765. ));
  1766. $query = "from vtiger_activity
  1767. inner join vtiger_crmentity on vtiger_crmentity.crmid=vtiger_activity.activityid";
  1768. if ($this->queryPlanner->requireTable('vtiger_activitycf')) {
  1769. $query .= " left join vtiger_activitycf on vtiger_activitycf.activityid = vtiger_crmentity.crmid";
  1770. }
  1771. if ($this->queryPlanner->requireTable('vtiger_cntactivityrel', $matrix)) {
  1772. $query .= " left join vtiger_cntactivityrel on vtiger_cntactivityrel.activityid= vtiger_activity.activityid";
  1773. }
  1774. if ($this->queryPlanner->requireTable('vtiger_contactdetailsCalendar')) {
  1775. $query .= " left join vtiger_contactdetails as vtiger_contactdetailsCalendar on vtiger_contactdetailsCalendar.contactid= vtiger_cntactivityrel.contactid";
  1776. }
  1777. if ($this->queryPlanner->requireTable('vtiger_groupsCalendar')) {
  1778. $query .= " left join vtiger_groups as vtiger_groupsCalendar on vtiger_groupsCalendar.groupid = vtiger_crmentity.smownerid";
  1779. }
  1780. if ($this->queryPlanner->requireTable('vtiger_usersCalendar')) {
  1781. $query .= " left join vtiger_users as vtiger_usersCalendar on vtiger_usersCalendar.id = vtiger_crmentity.smownerid";
  1782. }
  1783. // TODO optimize inclusion of these tables
  1784. $query .= " left join vtiger_groups on vtiger_groups.groupid = vtiger_crmentity.smownerid";
  1785. $query .= " left join vtiger_users on vtiger_users.id = vtiger_crmentity.smownerid";
  1786. if ($this->queryPlanner->requireTable('vtiger_seactivityrel', $matrix)) {
  1787. $query .= " left join vtiger_seactivityrel on vtiger_seactivityrel.activityid = vtiger_activity.activityid";
  1788. }
  1789. if ($this->queryPlanner->requireTable('vtiger_activity_reminder')) {
  1790. $query .= " left join vtiger_activity_reminder on vtiger_activity_reminder.activity_id = vtiger_activity.activityid";
  1791. }
  1792. if ($this->queryPlanner->requireTable('vtiger_recurringevents')) {
  1793. $query .= " left join vtiger_recurringevents on vtiger_recurringevents.activityid = vtiger_activity.activityid";
  1794. }
  1795. if ($this->queryPlanner->requireTable('vtiger_crmentityRelCalendar', $matrix)) {
  1796. $query .= " left join vtiger_crmentity as vtiger_crmentityRelCalendar on vtiger_crmentityRelCalendar.crmid = vtiger_seactivityrel.crmid";
  1797. }
  1798. if ($this->queryPlanner->requireTable('vtiger_accountRelCalendar')) {
  1799. $query .= " left join vtiger_account as vtiger_accountRelCalendar on vtiger_accountRelCalendar.accountid=vtiger_crmentityRelCalendar.crmid";
  1800. }
  1801. if ($this->queryPlanner->requireTable('vtiger_leaddetailsRelCalendar')) {
  1802. $query .= " left join vtiger_leaddetails as vtiger_leaddetailsRelCalendar on vtiger_leaddetailsRelCalendar.leadid = vtiger_crmentityRelCalendar.crmid";
  1803. }
  1804. if ($this->queryPlanner->requireTable('vtiger_potentialRelCalendar')) {
  1805. $query .= " left join vtiger_potential as vtiger_potentialRelCalendar on vtiger_potentialRelCalendar.potentialid = vtiger_crmentityRelCalendar.crmid";
  1806. }
  1807. if ($this->queryPlanner->requireTable('vtiger_quotesRelCalendar')) {
  1808. $query .= " left join vtiger_quotes as vtiger_quotesRelCalendar on vtiger_quotesRelCalendar.quoteid = vtiger_crmentityRelCalendar.crmid";
  1809. }
  1810. if ($this->queryPlanner->requireTable('vtiger_purchaseorderRelCalendar')) {
  1811. $query .= " left join vtiger_purchaseorder as vtiger_purchaseorderRelCalendar on vtiger_purchaseorderRelCalendar.purchaseorderid = vtiger_crmentityRelCalendar.crmid";
  1812. }
  1813. if ($this->queryPlanner->requireTable('vtiger_invoiceRelCalendar')) {
  1814. $query .= " left join vtiger_invoice as vtiger_invoiceRelCalendar on vtiger_invoiceRelCalendar.invoiceid = vtiger_crmentityRelCalendar.crmid";
  1815. }
  1816. if ($this->queryPlanner->requireTable('vtiger_salesorderRelCalendar')) {
  1817. $query .= " left join vtiger_salesorder as vtiger_salesorderRelCalendar on vtiger_salesorderRelCalendar.salesorderid = vtiger_crmentityRelCalendar.crmid";
  1818. }
  1819. if ($this->queryPlanner->requireTable('vtiger_troubleticketsRelCalendar')) {
  1820. $query .= " left join vtiger_troubletickets as vtiger_troubleticketsRelCalendar on vtiger_troubleticketsRelCalendar.ticketid = vtiger_crmentityRelCalendar.crmid";
  1821. }
  1822. if ($this->queryPlanner->requireTable('vtiger_campaignRelCalendar')) {
  1823. $query .= " left join vtiger_campaign as vtiger_campaignRelCalendar on vtiger_campaignRelCalendar.campaignid = vtiger_crmentityRelCalendar.crmid";
  1824. }
  1825. if ($this->queryPlanner->requireTable('vtiger_lastModifiedByCalendar')) {
  1826. $query .= " left join vtiger_users as vtiger_lastModifiedByCalendar on vtiger_lastModifiedByCalendar.id = vtiger_crmentity.modifiedby";
  1827. }
  1828. $query .= " ".$this->getRelatedModulesQuery($module,$this->secondarymodule).
  1829. getNonAdminAccessControlQuery($this->primarymodule,$current_user).
  1830. " WHERE vtiger_crmentity.deleted=0 and (vtiger_activity.activitytype != 'Emails')";
  1831. }
  1832. else if($module == "Quotes")
  1833. {
  1834. $matrix = $this->queryPlanner->newDependencyMatrix();
  1835. $matrix->setDependency('vtiger_inventoryproductrelQuotes',array('vtiger_productsQuotes','vtiger_serviceQuotes'));
  1836. $query = "from vtiger_quotes
  1837. inner join vtiger_crmentity on vtiger_crmentity.crmid=vtiger_quotes.quoteid";
  1838. if ($this->queryPlanner->requireTable('vtiger_quotesbillads')){
  1839. $query .= " inner join vtiger_quotesbillads on vtiger_quotes.quoteid=vtiger_quotesbillads.quotebilladdressid";
  1840. }
  1841. if ($this->queryPlanner->requireTable('vtiger_quotesshipads')){
  1842. $query .= " inner join vtiger_quotesshipads on vtiger_quotes.quoteid=vtiger_quotesshipads.quoteshipaddressid";
  1843. }
  1844. if ($this->queryPlanner->requireTable("vtiger_currency_info$module")){
  1845. $query .= " left join vtiger_currency_info as vtiger_currency_info$module on vtiger_currency_info$module.id = vtiger_quotes.currency_id";
  1846. }
  1847. if($type !== 'COLUMNSTOTOTAL' || $this->lineItemFieldsInCalculation == true) {
  1848. if ($this->queryPlanner->requireTable("vtiger_inventoryproductrelQuotes", $matrix)){
  1849. $query .= " left join vtiger_inventoryproductrel as vtiger_inventoryproductrelQuotes on vtiger_quotes.quoteid = vtiger_inventoryproductrelQuotes.id";
  1850. }
  1851. if ($this->queryPlanner->requireTable("vtiger_productsQuotes")){
  1852. $query .= " left join vtiger_products as vtiger_productsQuotes on vtiger_productsQuotes.productid = vtiger_inventoryproductrelQuotes.productid";
  1853. }
  1854. if ($this->queryPlanner->requireTable("vtiger_serviceQuotes")){
  1855. $query .= " left join vtiger_service as vtiger_serviceQuotes on vtiger_serviceQuotes.serviceid = vtiger_inventoryproductrelQuotes.productid";
  1856. }
  1857. }
  1858. if ($this->queryPlanner->requireTable("vtiger_quotescf")){
  1859. $query .= " left join vtiger_quotescf on vtiger_quotes.quoteid = vtiger_quotescf.quoteid";
  1860. }
  1861. if ($this->queryPlanner->requireTable("vtiger_groupsQuotes")){
  1862. $query .= " left join vtiger_groups as vtiger_groupsQuotes on vtiger_groupsQuotes.groupid = vtiger_crmentity.smownerid";
  1863. }
  1864. if ($this->queryPlanner->requireTable("vtiger_usersQuotes")){
  1865. $query .= " left join vtiger_users as vtiger_usersQuotes on vtiger_usersQuotes.id = vtiger_crmentity.smownerid";
  1866. }
  1867. // TODO optimize inclusion of these tables
  1868. $query .= " left join vtiger_groups on vtiger_groups.groupid = vtiger_crmentity.smownerid";
  1869. $query .= " left join vtiger_users on vtiger_users.id = vtiger_crmentity.smownerid";
  1870. if ($this->queryPlanner->requireTable("vtiger_lastModifiedByQuotes")){
  1871. $query .= " left join vtiger_users as vtiger_lastModifiedByQuotes on vtiger_lastModifiedByQuotes.id = vtiger_crmentity.modifiedby";
  1872. }
  1873. if ($this->queryPlanner->requireTable("vtiger_usersRel1")){
  1874. $query .= " left join vtiger_users as vtiger_usersRel1 on vtiger_usersRel1.id = vtiger_quotes.inventorymanager";
  1875. }
  1876. if ($this->queryPlanner->requireTable("vtiger_potentialRelQuotes")){
  1877. $query .= " left join vtiger_potential as vtiger_potentialRelQuotes on vtiger_potentialRelQuotes.potentialid = vtiger_quotes.potentialid";
  1878. }
  1879. if ($this->queryPlanner->requireTable("vtiger_contactdetailsQuotes")){
  1880. $query .= " left join vtiger_contactdetails as vtiger_contactdetailsQuotes on vtiger_contactdetailsQuotes.contactid = vtiger_quotes.contactid";
  1881. }
  1882. if ($this->queryPlanner->requireTable("vtiger_accountQuotes")){
  1883. $query .= " left join vtiger_account as vtiger_accountQuotes on vtiger_accountQuotes.accountid = vtiger_quotes.accountid";
  1884. }
  1885. $query .= " ".$this->getRelatedModulesQuery($module,$this->secondarymodule).
  1886. getNonAdminAccessControlQuery($this->primarymodule,$current_user).
  1887. " where vtiger_crmentity.deleted=0";
  1888. }
  1889. else if($module == "PurchaseOrder")
  1890. {
  1891. $matrix = $this->queryPlanner->newDependencyMatrix();
  1892. $matrix->setDependency('vtiger_inventoryproductrelPurchaseOrder',array('vtiger_productsPurchaseOrder','vtiger_servicePurchaseOrder'));
  1893. $query = "from vtiger_purchaseorder
  1894. inner join vtiger_crmentity on vtiger_crmentity.crmid=vtiger_purchaseorder.purchaseorderid";
  1895. if ($this->queryPlanner->requireTable("vtiger_pobillads")){
  1896. $query .= " inner join vtiger_pobillads on vtiger_purchaseorder.purchaseorderid=vtiger_pobillads.pobilladdressid";
  1897. }
  1898. if ($this->queryPlanner->requireTable("vtiger_poshipads")){
  1899. $query .= " inner join vtiger_poshipads on vtiger_purchaseorder.purchaseorderid=vtiger_poshipads.poshipaddressid";
  1900. }
  1901. if ($this->queryPlanner->requireTable("vtiger_currency_info$module")){
  1902. $query .= " left join vtiger_currency_info as vtiger_currency_info$module on vtiger_currency_info$module.id = vtiger_purchaseorder.currency_id";
  1903. }
  1904. if($type !== 'COLUMNSTOTOTAL' || $this->lineItemFieldsInCalculation == true) {
  1905. if ($this->queryPlanner->requireTable("vtiger_inventoryproductrelPurchaseOrder",$matrix)){
  1906. $query .= " left join vtiger_inventoryproductrel as vtiger_inventoryproductrelPurchaseOrder on vtiger_purchaseorder.purchaseorderid = vtiger_inventoryproductrelPurchaseOrder.id";
  1907. }
  1908. if ($this->queryPlanner->requireTable("vtiger_productsPurchaseOrder")){
  1909. $query .= " left join vtiger_products as vtiger_productsPurchaseOrder on vtiger_productsPurchaseOrder.productid = vtiger_inventoryproductrelPurchaseOrder.productid";
  1910. }
  1911. if ($this->queryPlanner->requireTable("vtiger_servicePurchaseOrder")){
  1912. $query .= " left join vtiger_service as vtiger_servicePurchaseOrder on vtiger_servicePurchaseOrder.serviceid = vtiger_inventoryproductrelPurchaseOrder.productid";
  1913. }
  1914. }
  1915. if ($this->queryPlanner->requireTable("vtiger_purchaseordercf")){
  1916. $query .= " left join vtiger_purchaseordercf on vtiger_purchaseorder.purchaseorderid = vtiger_purchaseordercf.purchaseorderid";
  1917. }
  1918. if ($this->queryPlanner->requireTable("vtiger_groupsPurchaseOrder")){
  1919. $query .= " left join vtiger_groups as vtiger_groupsPurchaseOrder on vtiger_groupsPurchaseOrder.groupid = vtiger_crmentity.smownerid";
  1920. }
  1921. if ($this->queryPlanner->requireTable("vtiger_usersPurchaseOrder")){
  1922. $query .= " left join vtiger_users as vtiger_usersPurchaseOrder on vtiger_usersPurchaseOrder.id = vtiger_crmentity.smownerid";
  1923. }
  1924. // TODO optimize inclusion of these tables
  1925. $query .= " left join vtiger_groups on vtiger_groups.groupid = vtiger_crmentity.smownerid";
  1926. $query .= " left join vtiger_users on vtiger_users.id = vtiger_crmentity.smownerid";
  1927. if ($this->queryPlanner->requireTable("vtiger_lastModifiedByPurchaseOrder")){
  1928. $query .= " left join vtiger_users as vtiger_lastModifiedByPurchaseOrder on vtiger_lastModifiedByPurchaseOrder.id = vtiger_crmentity.modifiedby";
  1929. }
  1930. if ($this->queryPlanner->requireTable("vtiger_vendorRelPurchaseOrder")){
  1931. $query .= " left join vtiger_vendor as vtiger_vendorRelPurchaseOrder on vtiger_vendorRelPurchaseOrder.vendorid = vtiger_purchaseorder.vendorid";
  1932. }
  1933. if ($this->queryPlanner->requireTable("vtiger_contactdetailsPurchaseOrder")){
  1934. $query .= " left join vtiger_contactdetails as vtiger_contactdetailsPurchaseOrder on vtiger_contactdetailsPurchaseOrder.contactid = vtiger_purchaseorder.contactid";
  1935. }
  1936. $query .= " ".$this->getRelatedModulesQuery($module,$this->secondarymodule).
  1937. getNonAdminAccessControlQuery($this->primarymodule,$current_user).
  1938. " where vtiger_crmentity.deleted=0";
  1939. }
  1940. else if($module == "Invoice")
  1941. {
  1942. $matrix = $this->queryPlanner->newDependencyMatrix();
  1943. $matrix->setDependency('vtiger_inventoryproductrelInvoice',array('vtiger_productsInvoice','vtiger_serviceInvoice'));
  1944. $query = "from vtiger_invoice
  1945. inner join vtiger_crmentity on vtiger_crmentity.crmid=vtiger_invoice.invoiceid";
  1946. if ($this->queryPlanner->requireTable("vtiger_invoicebillads")){
  1947. $query .=" inner join vtiger_invoicebillads on vtiger_invoice.invoiceid=vtiger_invoicebillads.invoicebilladdressid";
  1948. }
  1949. if ($this->queryPlanner->requireTable("vtiger_invoiceshipads")){
  1950. $query .=" inner join vtiger_invoiceshipads on vtiger_invoice.invoiceid=vtiger_invoiceshipads.invoiceshipaddressid";
  1951. }
  1952. if ($this->queryPlanner->requireTable("vtiger_currency_info$module")){
  1953. $query .=" left join vtiger_currency_info as vtiger_currency_info$module on vtiger_currency_info$module.id = vtiger_invoice.currency_id";
  1954. }
  1955. // lineItemFieldsInCalculation - is used to when line item fields are used in calculations
  1956. if($type !== 'COLUMNSTOTOTAL' || $this->lineItemFieldsInCalculation == true) {
  1957. // should be present on when line item fields are selected for calculation
  1958. if ($this->queryPlanner->requireTable("vtiger_inventoryproductrelInvoice",$matrix)){
  1959. $query .=" left join vtiger_inventoryproductrel as vtiger_inventoryproductrelInvoice on vtiger_invoice.invoiceid = vtiger_inventoryproductrelInvoice.id";
  1960. }
  1961. if ($this->queryPlanner->requireTable("vtiger_productsInvoice")){
  1962. $query .=" left join vtiger_products as vtiger_productsInvoice on vtiger_productsInvoice.productid = vtiger_inventoryproductrelInvoice.productid";
  1963. }
  1964. if ($this->queryPlanner->requireTable("vtiger_serviceInvoice")){
  1965. $query .=" left join vtiger_service as vtiger_serviceInvoice on vtiger_serviceInvoice.serviceid = vtiger_inventoryproductrelInvoice.productid";
  1966. }
  1967. }
  1968. if ($this->queryPlanner->requireTable("vtiger_salesorderInvoice")){
  1969. $query .= " left join vtiger_salesorder as vtiger_salesorderInvoice on vtiger_salesorderInvoice.salesorderid=vtiger_invoice.salesorderid";
  1970. }
  1971. if ($this->queryPlanner->requireTable("vtiger_invoicecf")){
  1972. $query .= " left join vtiger_invoicecf on vtiger_invoice.invoiceid = vtiger_invoicecf.invoiceid";
  1973. }
  1974. if ($this->queryPlanner->requireTable("vtiger_groupsInvoice")){
  1975. $query .= " left join vtiger_groups as vtiger_groupsInvoice on vtiger_groupsInvoice.groupid = vtiger_crmentity.smownerid";
  1976. }
  1977. if ($this->queryPlanner->requireTable("vtiger_usersInvoice")){
  1978. $query .= " left join vtiger_users as vtiger_usersInvoice on vtiger_usersInvoice.id = vtiger_crmentity.smownerid";
  1979. }
  1980. // TODO optimize inclusion of these tables
  1981. $query .= " left join vtiger_groups on vtiger_groups.groupid = vtiger_crmentity.smownerid";
  1982. $query .= " left join vtiger_users on vtiger_users.id = vtiger_crmentity.smownerid";
  1983. if ($this->queryPlanner->requireTable("vtiger_lastModifiedByInvoice")){
  1984. $query .= " left join vtiger_users as vtiger_lastModifiedByInvoice on vtiger_lastModifiedByInvoice.id = vtiger_crmentity.modifiedby";
  1985. }
  1986. if ($this->queryPlanner->requireTable("vtiger_accountInvoice")){
  1987. $query .= " left join vtiger_account as vtiger_accountInvoice on vtiger_accountInvoice.accountid = vtiger_invoice.accountid";
  1988. }
  1989. if ($this->queryPlanner->requireTable("vtiger_contactdetailsInvoice")){
  1990. $query .= " left join vtiger_contactdetails as vtiger_contactdetailsInvoice on vtiger_contactdetailsInvoice.contactid = vtiger_invoice.contactid";
  1991. }
  1992. $query .= " ".$this->getRelatedModulesQuery($module,$this->secondarymodule).
  1993. getNonAdminAccessControlQuery($this->primarymodule,$current_user).
  1994. " where vtiger_crmentity.deleted=0";
  1995. }
  1996. else if($module == "SalesOrder")
  1997. {
  1998. $matrix = $this->queryPlanner->newDependencyMatrix();
  1999. $matrix->setDependency('vtiger_inventoryproductrelSalesOrder',array('vtiger_productsSalesOrder','vtiger_serviceSalesOrder'));
  2000. $query = "from vtiger_salesorder
  2001. inner join vtiger_crmentity on vtiger_crmentity.crmid=vtiger_salesorder.salesorderid";
  2002. if ($this->queryPlanner->requireTable("vtiger_sobillads")){
  2003. $query .= " inner join vtiger_sobillads on vtiger_salesorder.salesorderid=vtiger_sobillads.sobilladdressid";
  2004. }
  2005. if ($this->queryPlanner->requireTable("vtiger_soshipads")){
  2006. $query .= " inner join vtiger_soshipads on vtiger_salesorder.salesorderid=vtiger_soshipads.soshipaddressid";
  2007. }
  2008. if ($this->queryPlanner->requireTable("vtiger_currency_info$module")){
  2009. $query .= " left join vtiger_currency_info as vtiger_currency_info$module on vtiger_currency_info$module.id = vtiger_salesorder.currency_id";
  2010. }
  2011. if($type !== 'COLUMNSTOTOTAL' || $this->lineItemFieldsInCalculation == true) {
  2012. if ($this->queryPlanner->requireTable("vtiger_inventoryproductrelSalesOrder",$matrix)){
  2013. $query .= " left join vtiger_inventoryproductrel as vtiger_inventoryproductrelSalesOrder on vtiger_salesorder.salesorderid = vtiger_inventoryproductrelSalesOrder.id";
  2014. }
  2015. if ($this->queryPlanner->requireTable("vtiger_productsSalesOrder")){
  2016. $query .= " left join vtiger_products as vtiger_productsSalesOrder on vtiger_productsSalesOrder.productid = vtiger_inventoryproductrelSalesOrder.productid";
  2017. }
  2018. if ($this->queryPlanner->requireTable("vtiger_serviceSalesOrder")){
  2019. $query .= " left join vtiger_service as vtiger_serviceSalesOrder on vtiger_serviceSalesOrder.serviceid = vtiger_inventoryproductrelSalesOrder.productid";
  2020. }
  2021. }
  2022. if ($this->queryPlanner->requireTable("vtiger_salesordercf")){
  2023. $query .=" left join vtiger_salesordercf on vtiger_salesorder.salesorderid = vtiger_salesordercf.salesorderid";
  2024. }
  2025. if ($this->queryPlanner->requireTable("vtiger_contactdetailsSalesOrder")){
  2026. $query .= " left join vtiger_contactdetails as vtiger_contactdetailsSalesOrder on vtiger_contactdetailsSalesOrder.contactid = vtiger_salesorder.contactid";
  2027. }
  2028. if ($this->queryPlanner->requireTable("vtiger_quotesSalesOrder")){
  2029. $query .= " left join vtiger_quotes as vtiger_quotesSalesOrder on vtiger_quotesSalesOrder.quoteid = vtiger_salesorder.quoteid";
  2030. }
  2031. if ($this->queryPlanner->requireTable("vtiger_accountSalesOrder")){
  2032. $query .= " left join vtiger_account as vtiger_accountSalesOrder on vtiger_accountSalesOrder.accountid = vtiger_salesorder.accountid";
  2033. }
  2034. if ($this->queryPlanner->requireTable("vtiger_potentialRelSalesOrder")){
  2035. $query .= " left join vtiger_potential as vtiger_potentialRelSalesOrder on vtiger_potentialRelSalesOrder.potentialid = vtiger_salesorder.potentialid";
  2036. }
  2037. if ($this->queryPlanner->requireTable("vtiger_invoice_recurring_info")){
  2038. $query .= " left join vtiger_invoice_recurring_info on vtiger_invoice_recurring_info.salesorderid = vtiger_salesorder.salesorderid";
  2039. }
  2040. if ($this->queryPlanner->requireTable("vtiger_groupsSalesOrder")){
  2041. $query .= " left join vtiger_groups as vtiger_groupsSalesOrder on vtiger_groupsSalesOrder.groupid = vtiger_crmentity.smownerid";
  2042. }
  2043. if ($this->queryPlanner->requireTable("vtiger_usersSalesOrder")){
  2044. $query .= " left join vtiger_users as vtiger_usersSalesOrder on vtiger_usersSalesOrder.id = vtiger_crmentity.smownerid";
  2045. }
  2046. // TODO optimize inclusion of these tables
  2047. $query .= " left join vtiger_groups on vtiger_groups.groupid = vtiger_crmentity.smownerid";
  2048. $query .= " left join vtiger_users on vtiger_users.id = vtiger_crmentity.smownerid";
  2049. if ($this->queryPlanner->requireTable("vtiger_lastModifiedBySalesOrder")){
  2050. $query .= " left join vtiger_users as vtiger_lastModifiedBySalesOrder on vtiger_lastModifiedBySalesOrder.id = vtiger_crmentity.modifiedby";
  2051. }
  2052. $query .= " ".$this->getRelatedModulesQuery($module,$this->secondarymodule).
  2053. getNonAdminAccessControlQuery($this->primarymodule,$current_user).
  2054. " where vtiger_crmentity.deleted=0";
  2055. }
  2056. else if($module == "Campaigns")
  2057. {
  2058. $query = "from vtiger_campaign
  2059. inner join vtiger_crmentity on vtiger_crmentity.crmid=vtiger_campaign.campaignid";
  2060. if ($this->queryPlanner->requireTable("vtiger_campaignscf")){
  2061. $query .= " inner join vtiger_campaignscf as vtiger_campaignscf on vtiger_campaignscf.campaignid=vtiger_campaign.campaignid";
  2062. }
  2063. if ($this->queryPlanner->requireTable("vtiger_productsCampaigns")){
  2064. $query .= " left join vtiger_products as vtiger_productsCampaigns on vtiger_productsCampaigns.productid = vtiger_campaign.product_id";
  2065. }
  2066. if ($this->queryPlanner->requireTable("vtiger_groupsCampaigns")){
  2067. $query .= " left join vtiger_groups as vtiger_groupsCampaigns on vtiger_groupsCampaigns.groupid = vtiger_crmentity.smownerid";
  2068. }
  2069. if ($this->queryPlanner->requireTable("vtiger_usersCampaigns")){
  2070. $query .= " left join vtiger_users as vtiger_usersCampaigns on vtiger_usersCampaigns.id = vtiger_crmentity.smownerid";
  2071. }
  2072. // TODO optimize inclusion of these tables
  2073. $query .= " left join vtiger_groups on vtiger_groups.groupid = vtiger_crmentity.smownerid";
  2074. $query .= " left join vtiger_users on vtiger_users.id = vtiger_crmentity.smownerid";
  2075. if ($this->queryPlanner->requireTable("vtiger_lastModifiedBy$module")){
  2076. $query .= " left join vtiger_users as vtiger_lastModifiedBy".$module." on vtiger_lastModifiedBy".$module.".id = vtiger_crmentity.modifiedby";
  2077. }
  2078. $query .= " ".$this->getRelatedModulesQuery($module,$this->secondarymodule).
  2079. getNonAdminAccessControlQuery($this->primarymodule,$current_user).
  2080. " where vtiger_crmentity.deleted=0";
  2081. }
  2082. else if($module == "Emails") {
  2083. $query = "FROM vtiger_activity
  2084. INNER JOIN vtiger_crmentity ON vtiger_crmentity.crmid = vtiger_activity.activityid AND vtiger_activity.activitytype = 'Emails'";
  2085. if ($this->queryPlanner->requireTable("vtiger_email_track")){
  2086. $query .= " LEFT JOIN vtiger_email_track ON vtiger_email_track.mailid = vtiger_activity.activityid";
  2087. }
  2088. if ($this->queryPlanner->requireTable("vtiger_groupsEmails")){
  2089. $query .= " LEFT JOIN vtiger_groups AS vtiger_groupsEmails ON vtiger_groupsEmails.groupid = vtiger_crmentity.smownerid";
  2090. }
  2091. if ($this->queryPlanner->requireTable("vtiger_usersEmails")){
  2092. $query .= " LEFT JOIN vtiger_users AS vtiger_usersEmails ON vtiger_usersEmails.id = vtiger_crmentity.smownerid";
  2093. }
  2094. // TODO optimize inclusion of these tables
  2095. $query .= " LEFT JOIN vtiger_groups ON vtiger_groups.groupid = vtiger_crmentity.smownerid";
  2096. $query .= " LEFT JOIN vtiger_users ON vtiger_users.id = vtiger_crmentity.smownerid";
  2097. if ($this->queryPlanner->requireTable("vtiger_lastModifiedBy$module")){
  2098. $query .= " LEFT JOIN vtiger_users AS vtiger_lastModifiedBy".$module." ON vtiger_lastModifiedBy".$module.".id = vtiger_crmentity.modifiedby";
  2099. }
  2100. $query .= " ".$this->getRelatedModulesQuery($module,$this->secondarymodule).
  2101. getNonAdminAccessControlQuery($this->primarymodule,$current_user).
  2102. " WHERE vtiger_crmentity.deleted = 0";
  2103. }
  2104. else {
  2105. if($module!=''){
  2106. $focus = CRMEntity::getInstance($module);
  2107. $query = $focus->generateReportsQuery($module, $this->queryPlanner).
  2108. $this->getRelatedModulesQuery($module,$this->secondarymodule).
  2109. getNonAdminAccessControlQuery($this->primarymodule,$current_user).
  2110. " WHERE vtiger_crmentity.deleted=0";
  2111. }
  2112. }
  2113. $log->info("ReportRun :: Successfully returned getReportsQuery".$module);
  2114. return $query;
  2115. }
  2116. /** function to get query for the given reportid,filterlist,type
  2117. * @ param $reportid : Type integer
  2118. * @ param $filtersql : Type Array
  2119. * @ param $module : Type String
  2120. * this returns join query for the report
  2121. */
  2122. function sGetSQLforReport($reportid,$filtersql,$type='',$chartReport=false,$startLimit=false,$endLimit=false)
  2123. {
  2124. global $log;
  2125. $columnlist = $this->getQueryColumnsList($reportid,$type);
  2126. $groupslist = $this->getGroupingList($reportid);
  2127. $groupTimeList = $this->getGroupByTimeList($reportid);
  2128. $stdfilterlist = $this->getStdFilterList($reportid);
  2129. $columnstotallist = $this->getColumnsTotal($reportid);
  2130. $advfiltersql = $this->getAdvFilterSql($reportid);
  2131. $this->totallist = $columnstotallist;
  2132. global $current_user;
  2133. $tab_id = getTabid($this->primarymodule);
  2134. //Fix for ticket #4915.
  2135. $selectlist = $columnlist;
  2136. //columns list
  2137. if(isset($selectlist))
  2138. {
  2139. $selectedcolumns = implode(", ",$selectlist);
  2140. if($chartReport == true){
  2141. $selectedcolumns .= ", count(*) AS 'groupby_count'";
  2142. }
  2143. }
  2144. //groups list
  2145. if(isset($groupslist))
  2146. {
  2147. $groupsquery = implode(", ",$groupslist);
  2148. }
  2149. if(isset($groupTimeList)){
  2150. $groupTimeQuery = implode(", ",$groupTimeList);
  2151. }
  2152. //standard list
  2153. if(isset($stdfilterlist))
  2154. {
  2155. $stdfiltersql = implode(", ",$stdfilterlist);
  2156. }
  2157. //columns to total list
  2158. if(isset($columnstotallist))
  2159. {
  2160. $columnstotalsql = implode(", ",$columnstotallist);
  2161. }
  2162. if($stdfiltersql != "")
  2163. {
  2164. $wheresql = " and ".$stdfiltersql;
  2165. }
  2166. if(isset($filtersql) && $filtersql !== false) {
  2167. $advfiltersql = $filtersql;
  2168. }
  2169. if($advfiltersql != "") {
  2170. $wheresql .= " and ".$advfiltersql;
  2171. }
  2172. $reportquery = $this->getReportsQuery($this->primarymodule, $type);
  2173. // If we don't have access to any columns, let us select one column and limit result to shown we have not results
  2174. // Fix for: http://trac.vtiger.com/cgi-bin/trac.cgi/ticket/4758 - Prasad
  2175. $allColumnsRestricted = false;
  2176. if($type == 'COLUMNSTOTOTAL')
  2177. {
  2178. if($columnstotalsql != '')
  2179. {
  2180. $reportquery = "select ".$columnstotalsql." ".$reportquery." ".$wheresql;
  2181. }
  2182. }else
  2183. {
  2184. if($selectedcolumns == '') {
  2185. // Fix for: http://trac.vtiger.com/cgi-bin/trac.cgi/ticket/4758 - Prasad
  2186. $selectedcolumns = "''"; // "''" to get blank column name
  2187. $allColumnsRestricted = true;
  2188. }
  2189. $reportquery = "select DISTINCT ".$selectedcolumns." ".$reportquery." ".$wheresql;
  2190. }
  2191. $reportquery = listQueryNonAdminChange($reportquery, $this->primarymodule);
  2192. if(trim($groupsquery) != "" && $type !== 'COLUMNSTOTOTAL')
  2193. {
  2194. if($chartReport == true){
  2195. $reportquery .= "group by ".$this->GetFirstSortByField($reportid);
  2196. }else{
  2197. $reportquery .= " order by ".$groupsquery;
  2198. }
  2199. }
  2200. // Prasad: No columns selected so limit the number of rows directly.
  2201. if($allColumnsRestricted) {
  2202. $reportquery .= " limit 0";
  2203. } else if($startLimit !== false && $endLimit !== false) {
  2204. $reportquery .= " LIMIT $startLimit, $endLimit";
  2205. }
  2206. preg_match('/&amp;/', $reportquery, $matches);
  2207. if(!empty($matches)){
  2208. $report=str_replace('&amp;', '&', $reportquery);
  2209. $reportquery = $this->replaceSpecialChar($report);
  2210. }
  2211. $log->info("ReportRun :: Successfully returned sGetSQLforReport".$reportid);
  2212. $this->queryPlanner->initializeTempTables();
  2213. return $reportquery;
  2214. }
  2215. /** function to get the report output in HTML,PDF,TOTAL,PRINT,PRINTTOTAL formats depends on the argument $outputformat
  2216. * @ param $outputformat : Type String (valid parameters HTML,PDF,TOTAL,PRINT,PRINT_TOTAL)
  2217. * @ param $filtersql : Type String
  2218. * This returns HTML Report if $outputformat is HTML
  2219. * Array for PDF if $outputformat is PDF
  2220. * HTML strings for TOTAL if $outputformat is TOTAL
  2221. * Array for PRINT if $outputformat is PRINT
  2222. * HTML strings for TOTAL fields if $outputformat is PRINTTOTAL
  2223. * HTML strings for
  2224. */
  2225. // Performance Optimization: Added parameter directOutput to avoid building big-string!
  2226. function GenerateReport($outputformat,$filtersql, $directOutput=false, $startLimit=false, $endLimit=false)
  2227. {
  2228. global $adb,$current_user,$php_max_execution_time;
  2229. global $modules,$app_strings;
  2230. global $mod_strings,$current_language;
  2231. require('user_privileges/user_privileges_'.$current_user->id.'.php');
  2232. $modules_selected = array();
  2233. $modules_selected[] = $this->primarymodule;
  2234. if(!empty($this->secondarymodule)){
  2235. $sec_modules = split(":",$this->secondarymodule);
  2236. for($i=0;$i<count($sec_modules);$i++){
  2237. $modules_selected[] = $sec_modules[$i];
  2238. }
  2239. }
  2240. // Update Reference fields list list
  2241. $referencefieldres = $adb->pquery("SELECT tabid, fieldlabel, uitype from vtiger_field WHERE uitype in (10,101)", array());
  2242. if($referencefieldres) {
  2243. foreach($referencefieldres as $referencefieldrow) {
  2244. $uiType = $referencefieldrow['uitype'];
  2245. $modprefixedlabel = getTabModuleName($referencefieldrow['tabid']).' '.$referencefieldrow['fieldlabel'];
  2246. $modprefixedlabel = str_replace(' ','_',$modprefixedlabel);
  2247. if($uiType == 10 && !in_array($modprefixedlabel, $this->ui10_fields)) {
  2248. $this->ui10_fields[] = $modprefixedlabel;
  2249. } elseif($uiType == 101 && !in_array($modprefixedlabel, $this->ui101_fields)) {
  2250. $this->ui101_fields[] = $modprefixedlabel;
  2251. }
  2252. }
  2253. }
  2254. if($outputformat == "HTML")
  2255. {
  2256. $sSQL = $this->sGetSQLforReport($this->reportid,$filtersql,$outputformat,false,$startLimit,$endLimit);
  2257. $sSQL .= " LIMIT 0, " . (self::$HTMLVIEW_MAX_ROWS+1); // Pull a record more than limit
  2258. $result = $adb->query($sSQL);
  2259. $error_msg = $adb->database->ErrorMsg();
  2260. if(!$result && $error_msg!=''){
  2261. // Performance Optimization: If direct output is requried
  2262. if($directOutput) {
  2263. echo getTranslatedString('LBL_REPORT_GENERATION_FAILED', $currentModule) . "<br>" . $error_msg;
  2264. $error_msg = false;
  2265. }
  2266. // END
  2267. return $error_msg;
  2268. }
  2269. // Performance Optimization: If direct output is required
  2270. if($directOutput) {
  2271. echo '<table cellpadding="5" cellspacing="0" align="center" class="rptTable"><tr>';
  2272. }
  2273. // END
  2274. if($is_admin==false && $profileGlobalPermission[1] == 1 && $profileGlobalPermission[2] == 1)
  2275. $picklistarray = $this->getAccessPickListValues();
  2276. if($result)
  2277. {
  2278. $y=$adb->num_fields($result);
  2279. $arrayHeaders = Array();
  2280. for ($x=0; $x<$y; $x++)
  2281. {
  2282. $fld = $adb->field_name($result, $x);
  2283. if(in_array($this->getLstringforReportHeaders($fld->name), $arrayHeaders))
  2284. {
  2285. $headerLabel = str_replace("_"," ",$fld->name);
  2286. $arrayHeaders[] = $headerLabel;
  2287. }
  2288. else
  2289. {
  2290. $headerLabel = str_replace($modules," ",$this->getLstringforReportHeaders($fld->name));
  2291. $headerLabel = str_replace("_"," ",$this->getLstringforReportHeaders($fld->name));
  2292. $arrayHeaders[] = $headerLabel;
  2293. }
  2294. /*STRING TRANSLATION starts */
  2295. $mod_name = split(' ',$headerLabel,2);
  2296. $moduleLabel ='';
  2297. if(in_array($mod_name[0],$modules_selected)){
  2298. $moduleLabel = getTranslatedString($mod_name[0],$mod_name[0]);
  2299. }
  2300. if(!empty($this->secondarymodule)){
  2301. if($moduleLabel!=''){
  2302. $headerLabel_tmp = $moduleLabel." ".getTranslatedString($mod_name[1],$mod_name[0]);
  2303. } else {
  2304. $headerLabel_tmp = getTranslatedString($mod_name[0]." ".$mod_name[1]);
  2305. }
  2306. } else {
  2307. if($moduleLabel!=''){
  2308. $headerLabel_tmp = getTranslatedString($mod_name[1],$mod_name[0]);
  2309. } else {
  2310. $headerLabel_tmp = getTranslatedString($mod_name[0]." ".$mod_name[1]);
  2311. }
  2312. }
  2313. if($headerLabel == $headerLabel_tmp) $headerLabel = getTranslatedString($headerLabel_tmp);
  2314. else $headerLabel = $headerLabel_tmp;
  2315. /*STRING TRANSLATION ends */
  2316. $header .= "<td class='rptCellLabel'>".$headerLabel."</td>";
  2317. // Performance Optimization: If direct output is required
  2318. if($directOutput) {
  2319. echo $header;
  2320. $header = '';
  2321. }
  2322. // END
  2323. }
  2324. // Performance Optimization: If direct output is required
  2325. if($directOutput) {
  2326. echo '</tr><tr>';
  2327. }
  2328. // END
  2329. $noofrows = $adb->num_rows($result);
  2330. $custom_field_values = $adb->fetch_array($result);
  2331. $groupslist = $this->getGroupingList($this->reportid);
  2332. $column_definitions = $adb->getFieldsDefinition($result);
  2333. do
  2334. {
  2335. $arraylists = Array();
  2336. if(count($groupslist) == 1)
  2337. {
  2338. $newvalue = $custom_field_values[0];
  2339. }elseif(count($groupslist) == 2)
  2340. {
  2341. $newvalue = $custom_field_values[0];
  2342. $snewvalue = $custom_field_values[1];
  2343. }elseif(count($groupslist) == 3)
  2344. {
  2345. $newvalue = $custom_field_values[0];
  2346. $snewvalue = $custom_field_values[1];
  2347. $tnewvalue = $custom_field_values[2];
  2348. }
  2349. if($newvalue == "") $newvalue = "-";
  2350. if($snewvalue == "") $snewvalue = "-";
  2351. if($tnewvalue == "") $tnewvalue = "-";
  2352. $valtemplate .= "<tr>";
  2353. // Performance Optimization
  2354. if($directOutput) {
  2355. echo $valtemplate;
  2356. $valtemplate = '';
  2357. }
  2358. // END
  2359. for ($i=0; $i<$y; $i++)
  2360. {
  2361. $fld = $adb->field_name($result, $i);
  2362. $fld_type = $column_definitions[$i]->type;
  2363. $fieldvalue = getReportFieldValue($this, $picklistarray, $fld,
  2364. $custom_field_values, $i);
  2365. //check for Roll based pick list
  2366. $temp_val= $fld->name;
  2367. if($fieldvalue == "" )
  2368. {
  2369. $fieldvalue = "-";
  2370. }
  2371. else if($fld->name == $this->primarymodule.'_LBL_ACTION' && $fieldvalue != '-')
  2372. {
  2373. $fieldvalue = "<a href='index.php?module={$this->primarymodule}&action=DetailView&record={$fieldvalue}' target='_blank'>".getTranslatedString('LBL_VIEW_DETAILS')."</a>";
  2374. }
  2375. if(($lastvalue == $fieldvalue) && $this->reporttype == "summary")
  2376. {
  2377. if($this->reporttype == "summary")
  2378. {
  2379. $valtemplate .= "<td class='rptEmptyGrp'>&nbsp;</td>";
  2380. }else
  2381. {
  2382. $valtemplate .= "<td class='rptData'>".$fieldvalue."</td>";
  2383. }
  2384. }else if(($secondvalue === $fieldvalue) && $this->reporttype == "summary")
  2385. {
  2386. if($lastvalue === $newvalue)
  2387. {
  2388. $valtemplate .= "<td class='rptEmptyGrp'>&nbsp;</td>";
  2389. }else
  2390. {
  2391. $valtemplate .= "<td class='rptGrpHead'>".$fieldvalue."</td>";
  2392. }
  2393. }
  2394. else if(($thirdvalue === $fieldvalue) && $this->reporttype == "summary")
  2395. {
  2396. if($secondvalue === $snewvalue)
  2397. {
  2398. $valtemplate .= "<td class='rptEmptyGrp'>&nbsp;</td>";
  2399. }else
  2400. {
  2401. $valtemplate .= "<td class='rptGrpHead'>".$fieldvalue."</td>";
  2402. }
  2403. }
  2404. else
  2405. {
  2406. if($this->reporttype == "tabular")
  2407. {
  2408. $valtemplate .= "<td class='rptData'>".$fieldvalue."</td>";
  2409. }else
  2410. {
  2411. $valtemplate .= "<td class='rptGrpHead'>".$fieldvalue."</td>";
  2412. }
  2413. }
  2414. // Performance Optimization: If direct output is required
  2415. if($directOutput) {
  2416. echo $valtemplate;
  2417. $valtemplate = '';
  2418. }
  2419. // END
  2420. }
  2421. $valtemplate .= "</tr>";
  2422. // Performance Optimization: If direct output is required
  2423. if($directOutput) {
  2424. echo $valtemplate;
  2425. $valtemplate = '';
  2426. }
  2427. // END
  2428. $lastvalue = $newvalue;
  2429. $secondvalue = $snewvalue;
  2430. $thirdvalue = $tnewvalue;
  2431. $arr_val[] = $arraylists;
  2432. set_time_limit($php_max_execution_time);
  2433. }while($custom_field_values = $adb->fetch_array($result));
  2434. // Performance Optimization: Provide feedback on export option if required
  2435. // NOTE: We should make sure to pull at-least 1 row more than max-limit for this to work.
  2436. if ($noofrows > self::$HTMLVIEW_MAX_ROWS) {
  2437. // Performance Optimization: Output directly
  2438. if ($directOutput) {
  2439. echo '</tr></table><br><table width="100%" cellpading="0" cellspacing="0"><tr>';
  2440. echo sprintf('<td colspan="%s" align="right"><span class="genHeaderGray">%s</span></td>',
  2441. $y, getTranslatedString('Only')." ".self::$HTMLVIEW_MAX_ROWS .
  2442. "+ " . getTranslatedString('records found') . ". " . getTranslatedString('Export to') . " <a href=\"javascript:;\" onclick=\"goToURL(CrearEnlace('ReportsAjax&file=CreateCSV',{$this->reportid}));\"><img style='vertical-align:text-top' src='themes/images/csv-file.png'></a> /" .
  2443. " <a href=\"javascript:;\" onclick=\"goToURL(CrearEnlace('CreateXL',{$this->reportid}));\"><img style='vertical-align:text-top' src='themes/images/xls-file.jpg'></a>"
  2444. );
  2445. } else {
  2446. $valtemplate .= '</tr></table><br><table width="100%" cellpading="0" cellspacing="0"><tr>';
  2447. $valtemplate .= sprintf('<td colspan="%s" align="right"><span class="genHeaderGray">%s</span></td>',
  2448. $y, getTranslatedString('Only')." ".self::$HTMLVIEW_MAX_ROWS .
  2449. " " . getTranslatedString('records found') . ". " . getTranslatedString('Export to') . " <a href=\"javascript:;\" onclick=\"goToURL(CrearEnlace('ReportsAjax&file=CreateCSV',{$this->reportid}));\"><img style='vertical-align:text-top' src='themes/images/csv-file.png'></a> /" .
  2450. " <a href=\"javascript:;\" onclick=\"goToURL(CrearEnlace('CreateXL',{$this->reportid}));\"><img style='vertical-align:text-top' src='themes/images/xls-file.jpg'></a>"
  2451. );
  2452. }
  2453. }
  2454. // Performance Optimization
  2455. if($directOutput) {
  2456. $totalDisplayString = $noofrows;
  2457. if ($noofrows > self::$HTMLVIEW_MAX_ROWS) {
  2458. $totalDisplayString = self::$HTMLVIEW_MAX_ROWS . "+";
  2459. }
  2460. echo "</tr></table>";
  2461. echo "<script type='text/javascript' id='__reportrun_directoutput_recordcount_script'>
  2462. if($('_reportrun_total')) $('_reportrun_total').innerHTML='$totalDisplayString';</script>";
  2463. } else {
  2464. $sHTML ='<table cellpadding="5" cellspacing="0" align="center" class="rptTable">
  2465. <tr>'.
  2466. $header
  2467. .'<!-- BEGIN values -->
  2468. <tr>'.
  2469. $valtemplate
  2470. .'</tr>
  2471. </table>';
  2472. }
  2473. //<<<<<<<<construct HTML>>>>>>>>>>>>
  2474. $return_data[] = $sHTML;
  2475. $return_data[] = $noofrows;
  2476. $return_data[] = $sSQL;
  2477. return $return_data;
  2478. }
  2479. }elseif($outputformat == "PDF")
  2480. {
  2481. $sSQL = $this->sGetSQLforReport($this->reportid,$filtersql,$outputformat,false,$startLimit,$endLimit);
  2482. $result = $adb->query($sSQL);
  2483. if($is_admin==false && $profileGlobalPermission[1] == 1 && $profileGlobalPermission[2] == 1)
  2484. $picklistarray = $this->getAccessPickListValues();
  2485. if($result)
  2486. {
  2487. $y=$adb->num_fields($result);
  2488. $noofrows = $adb->num_rows($result);
  2489. $custom_field_values = $adb->fetch_array($result);
  2490. $column_definitions = $adb->getFieldsDefinition($result);
  2491. do
  2492. {
  2493. $arraylists = Array();
  2494. for ($i=0; $i<$y; $i++)
  2495. {
  2496. $fld = $adb->field_name($result, $i);
  2497. $fld_type = $column_definitions[$i]->type;
  2498. list($module, $fieldLabel) = explode('_', $fld->name, 2);
  2499. $fieldInfo = getFieldByReportLabel($module, $fieldLabel);
  2500. $fieldType = null;
  2501. if(!empty($fieldInfo)) {
  2502. $field = WebserviceField::fromArray($adb, $fieldInfo);
  2503. $fieldType = $field->getFieldDataType();
  2504. }
  2505. if(!empty($fieldInfo)) {
  2506. $translatedLabel = getTranslatedString($field->getFieldLabelKey(),
  2507. $module);
  2508. } else {
  2509. $translatedLabel = getTranslatedString(str_replace('_', " ",
  2510. $fieldLabel), $module);
  2511. }
  2512. /*STRING TRANSLATION starts */
  2513. $moduleLabel ='';
  2514. if(in_array($module,$modules_selected))
  2515. $moduleLabel = getTranslatedString($module,$module);
  2516. if(empty($translatedLabel)) {
  2517. $translatedLabel = getTranslatedString(str_replace('_', " ",
  2518. $fld->name));
  2519. }
  2520. $headerLabel = $translatedLabel;
  2521. if(!empty($this->secondarymodule)) {
  2522. if($moduleLabel != '') {
  2523. $headerLabel = $moduleLabel." ". $translatedLabel;
  2524. }
  2525. }
  2526. // Check for role based pick list
  2527. $temp_val= $fld->name;
  2528. $fieldvalue = getReportFieldValue($this, $picklistarray, $fld,
  2529. $custom_field_values, $i);
  2530. //used for vtiger6
  2531. if($_COOKIE['vtigerui'] == '6') {
  2532. if($fld->name == $this->primarymodule.'_LBL_ACTION' && $fieldvalue != '-') {
  2533. $fieldvalue = "<a href='index.php?module={$this->primarymodule}&view=Detail&record={$fieldvalue}' target='_blank'>".getTranslatedString('LBL_VIEW_DETAILS')."</a>";
  2534. }
  2535. }
  2536. $arraylists[$headerLabel] = $fieldvalue;
  2537. }
  2538. $arr_val[] = $arraylists;
  2539. set_time_limit($php_max_execution_time);
  2540. }while($custom_field_values = $adb->fetch_array($result));
  2541. return $arr_val;
  2542. }
  2543. }elseif($outputformat == "TOTALXLS")
  2544. {
  2545. $escapedchars = Array('_SUM','_AVG','_MIN','_MAX');
  2546. $totalpdf=array();
  2547. $sSQL = $this->sGetSQLforReport($this->reportid,$filtersql,"COLUMNSTOTOTAL");
  2548. if(isset($this->totallist))
  2549. {
  2550. if($sSQL != "")
  2551. {
  2552. $result = $adb->query($sSQL);
  2553. $y=$adb->num_fields($result);
  2554. $custom_field_values = $adb->fetch_array($result);
  2555. foreach($this->totallist as $key=>$value)
  2556. {
  2557. $fieldlist = explode(":",$key);
  2558. $mod_query = $adb->pquery("SELECT distinct(tabid) as tabid, uitype as uitype from vtiger_field where tablename = ? and columnname=?",array($fieldlist[1],$fieldlist[2]));
  2559. if($adb->num_rows($mod_query)>0){
  2560. $module_name = getTabModuleName($adb->query_result($mod_query,0,'tabid'));
  2561. $fieldlabel = trim(str_replace($escapedchars," ",$fieldlist[3]));
  2562. $fieldlabel = str_replace("_", " ", $fieldlabel);
  2563. if($module_name){
  2564. $field = getTranslatedString($module_name,$module_name)." ".getTranslatedString($fieldlabel,$module_name);
  2565. } else {
  2566. $field = getTranslatedString($fieldlabel);
  2567. }
  2568. }
  2569. // Since there are duplicate entries for this table
  2570. if($fieldlist[1] == 'vtiger_inventoryproductrel') {
  2571. $module_name = $this->primarymodule;
  2572. }
  2573. $uitype_arr[str_replace($escapedchars," ",$module_name."_".$fieldlist[3])] = $adb->query_result($mod_query,0,"uitype");
  2574. $totclmnflds[str_replace($escapedchars," ",$module_name."_".$fieldlist[3])] = $field;
  2575. }
  2576. for($i =0;$i<$y;$i++)
  2577. {
  2578. $fld = $adb->field_name($result, $i);
  2579. $keyhdr[$fld->name] = $custom_field_values[$i];
  2580. }
  2581. $rowcount=0;
  2582. foreach($totclmnflds as $key=>$value)
  2583. {
  2584. $col_header = trim(str_replace($modules," ",$value));
  2585. $fld_name_1 = $this->primarymodule . "_" . trim($value);
  2586. $fld_name_2 = $this->secondarymodule . "_" . trim($value);
  2587. if($uitype_arr[$key] == 71 || $uitype_arr[$key] == 72 ||
  2588. in_array($fld_name_1,$this->append_currency_symbol_to_value) || in_array($fld_name_2,$this->append_currency_symbol_to_value)) {
  2589. $col_header .= " (".$app_strings['LBL_IN']." ".$current_user->currency_symbol.")";
  2590. $convert_price = true;
  2591. } else{
  2592. $convert_price = false;
  2593. }
  2594. $value = trim($key);
  2595. $arraykey = $value.'_SUM';
  2596. if(isset($keyhdr[$arraykey]))
  2597. {
  2598. if($convert_price)
  2599. $conv_value = CurrencyField::convertToUserFormat ($keyhdr[$arraykey]);
  2600. else
  2601. $conv_value = CurrencyField::convertToUserFormat ($keyhdr[$arraykey], null, true);
  2602. $totalpdf[$rowcount][$arraykey] = $conv_value;
  2603. }else
  2604. {
  2605. $totalpdf[$rowcount][$arraykey] = '';
  2606. }
  2607. $arraykey = $value.'_AVG';
  2608. if(isset($keyhdr[$arraykey]))
  2609. {
  2610. if($convert_price)
  2611. $conv_value = CurrencyField::convertToUserFormat ($keyhdr[$arraykey]);
  2612. else
  2613. $conv_value = CurrencyField::convertToUserFormat ($keyhdr[$arraykey], null, true);
  2614. $totalpdf[$rowcount][$arraykey] = $conv_value;
  2615. }else
  2616. {
  2617. $totalpdf[$rowcount][$arraykey] = '';
  2618. }
  2619. $arraykey = $value.'_MIN';
  2620. if(isset($keyhdr[$arraykey]))
  2621. {
  2622. if($convert_price)
  2623. $conv_value = CurrencyField::convertToUserFormat ($keyhdr[$arraykey]);
  2624. else
  2625. $conv_value = CurrencyField::convertToUserFormat ($keyhdr[$arraykey], null, true);
  2626. $totalpdf[$rowcount][$arraykey] = $conv_value;
  2627. }else
  2628. {
  2629. $totalpdf[$rowcount][$arraykey] = '';
  2630. }
  2631. $arraykey = $value.'_MAX';
  2632. if(isset($keyhdr[$arraykey]))
  2633. {
  2634. if($convert_price)
  2635. $conv_value = CurrencyField::convertToUserFormat ($keyhdr[$arraykey]);
  2636. else
  2637. $conv_value = CurrencyField::convertToUserFormat ($keyhdr[$arraykey], null, true);
  2638. $totalpdf[$rowcount][$arraykey] = $conv_value;
  2639. }else
  2640. {
  2641. $totalpdf[$rowcount][$arraykey] = '';
  2642. }
  2643. $rowcount++;
  2644. }
  2645. }
  2646. }
  2647. return $totalpdf;
  2648. }elseif($outputformat == "TOTALHTML")
  2649. {
  2650. $escapedchars = Array('_SUM','_AVG','_MIN','_MAX');
  2651. $sSQL = $this->sGetSQLforReport($this->reportid,$filtersql,"COLUMNSTOTOTAL");
  2652. static $modulename_cache = array();
  2653. if(isset($this->totallist))
  2654. {
  2655. if($sSQL != "")
  2656. {
  2657. $result = $adb->query($sSQL);
  2658. $y=$adb->num_fields($result);
  2659. $custom_field_values = $adb->fetch_array($result);
  2660. $coltotalhtml .= "<table align='center' width='60%' cellpadding='3' cellspacing='0' border='0' class='rptTable'><tr><td class='rptCellLabel'>".$mod_strings[Totals]."</td><td class='rptCellLabel'>".$mod_strings[SUM]."</td><td class='rptCellLabel'>".$mod_strings[AVG]."</td><td class='rptCellLabel'>".$mod_strings[MIN]."</td><td class='rptCellLabel'>".$mod_strings[MAX]."</td></tr>";
  2661. // Performation Optimization: If Direct output is desired
  2662. if($directOutput) {
  2663. echo $coltotalhtml;
  2664. $coltotalhtml = '';
  2665. }
  2666. // END
  2667. foreach($this->totallist as $key=>$value)
  2668. {
  2669. $fieldlist = explode(":",$key);
  2670. $module_name = NULL;
  2671. $cachekey = $fieldlist[1] . ":" . $fieldlist[2];
  2672. if (!isset($modulename_cache[$cachekey])) {
  2673. $mod_query = $adb->pquery("SELECT distinct(tabid) as tabid, uitype as uitype from vtiger_field where tablename = ? and columnname=?",array($fieldlist[1],$fieldlist[2]));
  2674. if($adb->num_rows($mod_query)>0){
  2675. $module_name = getTabModuleName($adb->query_result($mod_query,0,'tabid'));
  2676. $modulename_cache[$cachekey] = $module_name;
  2677. }
  2678. } else {
  2679. $module_name = $modulename_cache[$cachekey];
  2680. }
  2681. if ($module_name) {
  2682. $fieldlabel = trim(str_replace($escapedchars," ",$fieldlist[3]));
  2683. $fieldlabel = str_replace("_", " ", $fieldlabel);
  2684. $field = getTranslatedString($module_name, $module_name)." ".getTranslatedString($fieldlabel,$module_name);
  2685. } else {
  2686. $field = getTranslatedString($fieldlabel);
  2687. }
  2688. $uitype_arr[str_replace($escapedchars," ",$module_name."_".$fieldlist[3])] = $adb->query_result($mod_query,0,"uitype");
  2689. $totclmnflds[str_replace($escapedchars," ",$module_name."_".$fieldlist[3])] = $field;
  2690. }
  2691. for($i =0;$i<$y;$i++)
  2692. {
  2693. $fld = $adb->field_name($result, $i);
  2694. $keyhdr[$fld->name] = $custom_field_values[$i];
  2695. }
  2696. foreach($totclmnflds as $key=>$value)
  2697. {
  2698. $coltotalhtml .= '<tr class="rptGrpHead" valign=top>';
  2699. $col_header = trim(str_replace($modules," ",$value));
  2700. $fld_name_1 = $this->primarymodule . "_" . trim($value);
  2701. $fld_name_2 = $this->secondarymodule . "_" . trim($value);
  2702. if($uitype_arr[$key]==71 || $uitype_arr[$key] == 72 ||
  2703. in_array($fld_name_1,$this->append_currency_symbol_to_value) || in_array($fld_name_2,$this->append_currency_symbol_to_value)) {
  2704. $col_header .= " (".$app_strings['LBL_IN']." ".$current_user->currency_symbol.")";
  2705. $convert_price = true;
  2706. } else{
  2707. $convert_price = false;
  2708. }
  2709. $coltotalhtml .= '<td class="rptData">'. $col_header .'</td>';
  2710. $value = trim($key);
  2711. $arraykey = $value.'_SUM';
  2712. if(isset($keyhdr[$arraykey]))
  2713. {
  2714. if($convert_price)
  2715. $conv_value = CurrencyField::convertToUserFormat ($keyhdr[$arraykey]);
  2716. else
  2717. $conv_value = CurrencyField::convertToUserFormat ($keyhdr[$arraykey], null, true);
  2718. $coltotalhtml .= '<td class="rptTotal">'.$conv_value.'</td>';
  2719. }else
  2720. {
  2721. $coltotalhtml .= '<td class="rptTotal">&nbsp;</td>';
  2722. }
  2723. $arraykey = $value.'_AVG';
  2724. if(isset($keyhdr[$arraykey]))
  2725. {
  2726. if($convert_price)
  2727. $conv_value = CurrencyField::convertToUserFormat ($keyhdr[$arraykey]);
  2728. else
  2729. $conv_value = CurrencyField::convertToUserFormat ($keyhdr[$arraykey], null, true);
  2730. $coltotalhtml .= '<td class="rptTotal">'.$conv_value.'</td>';
  2731. }else
  2732. {
  2733. $coltotalhtml .= '<td class="rptTotal">&nbsp;</td>';
  2734. }
  2735. $arraykey = $value.'_MIN';
  2736. if(isset($keyhdr[$arraykey]))
  2737. {
  2738. if($convert_price)
  2739. $conv_value = CurrencyField::convertToUserFormat ($keyhdr[$arraykey]);
  2740. else
  2741. $conv_value = CurrencyField::convertToUserFormat ($keyhdr[$arraykey], null, true);
  2742. $coltotalhtml .= '<td class="rptTotal">'.$conv_value.'</td>';
  2743. }else
  2744. {
  2745. $coltotalhtml .= '<td class="rptTotal">&nbsp;</td>';
  2746. }
  2747. $arraykey = $value.'_MAX';
  2748. if(isset($keyhdr[$arraykey]))
  2749. {
  2750. if($convert_price)
  2751. $conv_value = CurrencyField::convertToUserFormat ($keyhdr[$arraykey]);
  2752. else
  2753. $conv_value = CurrencyField::convertToUserFormat ($keyhdr[$arraykey], null, true);
  2754. $coltotalhtml .= '<td class="rptTotal">'.$conv_value.'</td>';
  2755. }else
  2756. {
  2757. $coltotalhtml .= '<td class="rptTotal">&nbsp;</td>';
  2758. }
  2759. $coltotalhtml .= '<tr>';
  2760. // Performation Optimization: If Direct output is desired
  2761. if($directOutput) {
  2762. echo $coltotalhtml;
  2763. $coltotalhtml = '';
  2764. }
  2765. // END
  2766. }
  2767. $coltotalhtml .= "</table>";
  2768. // Performation Optimization: If Direct output is desired
  2769. if($directOutput) {
  2770. echo $coltotalhtml;
  2771. $coltotalhtml = '';
  2772. }
  2773. // END
  2774. }
  2775. }
  2776. return $coltotalhtml;
  2777. }elseif($outputformat == "PRINT")
  2778. {
  2779. $sSQL = $this->sGetSQLforReport($this->reportid,$filtersql);
  2780. $result = $adb->query($sSQL);
  2781. if($is_admin==false && $profileGlobalPermission[1] == 1 && $profileGlobalPermission[2] == 1)
  2782. $picklistarray = $this->getAccessPickListValues();
  2783. if($result)
  2784. {
  2785. $y=$adb->num_fields($result);
  2786. $arrayHeaders = Array();
  2787. for ($x=0; $x<$y; $x++)
  2788. {
  2789. $fld = $adb->field_name($result, $x);
  2790. if(in_array($this->getLstringforReportHeaders($fld->name), $arrayHeaders))
  2791. {
  2792. $headerLabel = str_replace("_"," ",$fld->name);
  2793. $arrayHeaders[] = $headerLabel;
  2794. }
  2795. else
  2796. {
  2797. $headerLabel = str_replace($modules," ",$this->getLstringforReportHeaders($fld->name));
  2798. $arrayHeaders[] = $headerLabel;
  2799. }
  2800. /*STRING TRANSLATION starts */
  2801. $mod_name = split(' ',$headerLabel,2);
  2802. $moduleLabel ='';
  2803. if(in_array($mod_name[0],$modules_selected)){
  2804. $moduleLabel = getTranslatedString($mod_name[0],$mod_name[0]);
  2805. }
  2806. if(!empty($this->secondarymodule)){
  2807. if($moduleLabel!=''){
  2808. $headerLabel_tmp = $moduleLabel." ".getTranslatedString($mod_name[1],$mod_name[0]);
  2809. } else {
  2810. $headerLabel_tmp = getTranslatedString($mod_name[0]." ".$mod_name[1]);
  2811. }
  2812. } else {
  2813. if($moduleLabel!=''){
  2814. $headerLabel_tmp = getTranslatedString($mod_name[1],$mod_name[0]);
  2815. } else {
  2816. $headerLabel_tmp = getTranslatedString($mod_name[0]." ".$mod_name[1]);
  2817. }
  2818. }
  2819. if($headerLabel == $headerLabel_tmp) $headerLabel = getTranslatedString($headerLabel_tmp);
  2820. else $headerLabel = $headerLabel_tmp;
  2821. /*STRING TRANSLATION ends */
  2822. $header .= "<th>".$headerLabel."</th>";
  2823. }
  2824. $noofrows = $adb->num_rows($result);
  2825. $custom_field_values = $adb->fetch_array($result);
  2826. $groupslist = $this->getGroupingList($this->reportid);
  2827. $column_definitions = $adb->getFieldsDefinition($result);
  2828. do
  2829. {
  2830. $arraylists = Array();
  2831. if(count($groupslist) == 1)
  2832. {
  2833. $newvalue = $custom_field_values[0];
  2834. }elseif(count($groupslist) == 2)
  2835. {
  2836. $newvalue = $custom_field_values[0];
  2837. $snewvalue = $custom_field_values[1];
  2838. }elseif(count($groupslist) == 3)
  2839. {
  2840. $newvalue = $custom_field_values[0];
  2841. $snewvalue = $custom_field_values[1];
  2842. $tnewvalue = $custom_field_values[2];
  2843. }
  2844. if($newvalue == "") $newvalue = "-";
  2845. if($snewvalue == "") $snewvalue = "-";
  2846. if($tnewvalue == "") $tnewvalue = "-";
  2847. $valtemplate .= "<tr>";
  2848. for ($i=0; $i<$y; $i++)
  2849. {
  2850. $fld = $adb->field_name($result, $i);
  2851. $fld_type = $column_definitions[$i]->type;
  2852. $fieldvalue = getReportFieldValue($this, $picklistarray, $fld,
  2853. $custom_field_values, $i);
  2854. if(($lastvalue == $fieldvalue) && $this->reporttype == "summary")
  2855. {
  2856. if($this->reporttype == "summary")
  2857. {
  2858. $valtemplate .= "<td style='border-top:1px dotted #FFFFFF;'>&nbsp;</td>";
  2859. }else
  2860. {
  2861. $valtemplate .= "<td>".$fieldvalue."</td>";
  2862. }
  2863. }else if(($secondvalue == $fieldvalue) && $this->reporttype == "summary")
  2864. {
  2865. if($lastvalue == $newvalue)
  2866. {
  2867. $valtemplate .= "<td style='border-top:1px dotted #FFFFFF;'>&nbsp;</td>";
  2868. }else
  2869. {
  2870. $valtemplate .= "<td>".$fieldvalue."</td>";
  2871. }
  2872. }
  2873. else if(($thirdvalue == $fieldvalue) && $this->reporttype == "summary")
  2874. {
  2875. if($secondvalue == $snewvalue)
  2876. {
  2877. $valtemplate .= "<td style='border-top:1px dotted #FFFFFF;'>&nbsp;</td>";
  2878. }else
  2879. {
  2880. $valtemplate .= "<td>".$fieldvalue."</td>";
  2881. }
  2882. }
  2883. else
  2884. {
  2885. if($this->reporttype == "tabular")
  2886. {
  2887. $valtemplate .= "<td>".$fieldvalue."</td>";
  2888. }else
  2889. {
  2890. $valtemplate .= "<td>".$fieldvalue."</td>";
  2891. }
  2892. }
  2893. }
  2894. $valtemplate .= "</tr>";
  2895. $lastvalue = $newvalue;
  2896. $secondvalue = $snewvalue;
  2897. $thirdvalue = $tnewvalue;
  2898. $arr_val[] = $arraylists;
  2899. set_time_limit($php_max_execution_time);
  2900. }while($custom_field_values = $adb->fetch_array($result));
  2901. $sHTML = '<tr>'.$header.'</tr>'.$valtemplate;
  2902. $return_data[] = $sHTML;
  2903. $return_data[] = $noofrows;
  2904. return $return_data;
  2905. }
  2906. }elseif($outputformat == "PRINT_TOTAL")
  2907. {
  2908. $escapedchars = Array('_SUM','_AVG','_MIN','_MAX');
  2909. $sSQL = $this->sGetSQLforReport($this->reportid,$filtersql,"COLUMNSTOTOTAL");
  2910. if(isset($this->totallist))
  2911. {
  2912. if($sSQL != "")
  2913. {
  2914. $result = $adb->query($sSQL);
  2915. $y=$adb->num_fields($result);
  2916. $custom_field_values = $adb->fetch_array($result);
  2917. $coltotalhtml .= "<br /><table align='center' width='60%' cellpadding='3' cellspacing='0' border='1' class='printReport'><tr><td class='rptCellLabel'>".$mod_strings['Totals']."</td><td><b>".$mod_strings['SUM']."</b></td><td><b>".$mod_strings['AVG']."</b></td><td><b>".$mod_strings['MIN']."</b></td><td><b>".$mod_strings['MAX']."</b></td></tr>";
  2918. // Performation Optimization: If Direct output is desired
  2919. if($directOutput) {
  2920. echo $coltotalhtml;
  2921. $coltotalhtml = '';
  2922. }
  2923. // END
  2924. foreach($this->totallist as $key=>$value)
  2925. {
  2926. $fieldlist = explode(":",$key);
  2927. $mod_query = $adb->pquery("SELECT distinct(tabid) as tabid, uitype as uitype from vtiger_field where tablename = ? and columnname=?",array($fieldlist[1],$fieldlist[2]));
  2928. if($adb->num_rows($mod_query)>0){
  2929. $module_name = getTabModuleName($adb->query_result($mod_query,0,'tabid'));
  2930. $fieldlabel = trim(str_replace($escapedchars," ",$fieldlist[3]));
  2931. $fieldlabel = str_replace("_", " ", $fieldlabel);
  2932. if($module_name){
  2933. $field = getTranslatedString($module_name, $module_name)." ".getTranslatedString($fieldlabel,$module_name);
  2934. } else {
  2935. $field = getTranslatedString($fieldlabel);
  2936. }
  2937. }
  2938. $uitype_arr[str_replace($escapedchars," ",$module_name."_".$fieldlist[3])] = $adb->query_result($mod_query,0,"uitype");
  2939. $totclmnflds[str_replace($escapedchars," ",$module_name."_".$fieldlist[3])] = $field;
  2940. }
  2941. for($i =0;$i<$y;$i++)
  2942. {
  2943. $fld = $adb->field_name($result, $i);
  2944. $keyhdr[$fld->name] = $custom_field_values[$i];
  2945. }
  2946. foreach($totclmnflds as $key=>$value)
  2947. {
  2948. $coltotalhtml .= '<tr class="rptGrpHead">';
  2949. $col_header = getTranslatedString(trim(str_replace($modules," ",$value)));
  2950. $fld_name_1 = $this->primarymodule . "_" . trim($value);
  2951. $fld_name_2 = $this->secondarymodule . "_" . trim($value);
  2952. if($uitype_arr[$key]==71 || $uitype_arr[$key] == 72 ||
  2953. in_array($fld_name_1,$this->append_currency_symbol_to_value) || in_array($fld_name_2,$this->append_currency_symbol_to_value)) {
  2954. $col_header .= " (".$app_strings['LBL_IN']." ".$current_user->currency_symbol.")";
  2955. $convert_price = true;
  2956. } else{
  2957. $convert_price = false;
  2958. }
  2959. $coltotalhtml .= '<td class="rptData">'. $col_header .'</td>';
  2960. $value = trim($key);
  2961. $arraykey = $value.'_SUM';
  2962. if(isset($keyhdr[$arraykey]))
  2963. {
  2964. if($convert_price)
  2965. $conv_value = CurrencyField::convertToUserFormat ($keyhdr[$arraykey]);
  2966. else
  2967. $conv_value = CurrencyField::convertToUserFormat ($keyhdr[$arraykey], null, true);
  2968. $coltotalhtml .= "<td class='rptTotal'>".$conv_value.'</td>';
  2969. }else
  2970. {
  2971. $coltotalhtml .= "<td class='rptTotal'>&nbsp;</td>";
  2972. }
  2973. $arraykey = $value.'_AVG';
  2974. if(isset($keyhdr[$arraykey]))
  2975. {
  2976. if($convert_price)
  2977. $conv_value = CurrencyField::convertToUserFormat ($keyhdr[$arraykey]);
  2978. else
  2979. $conv_value = CurrencyField::convertToUserFormat ($keyhdr[$arraykey], null, true);
  2980. $coltotalhtml .= "<td class='rptTotal'>".$conv_value.'</td>';
  2981. }else
  2982. {
  2983. $coltotalhtml .= "<td class='rptTotal'>&nbsp;</td>";
  2984. }
  2985. $arraykey = $value.'_MIN';
  2986. if(isset($keyhdr[$arraykey]))
  2987. {
  2988. if($convert_price)
  2989. $conv_value = CurrencyField::convertToUserFormat ($keyhdr[$arraykey]);
  2990. else
  2991. $conv_value = CurrencyField::convertToUserFormat ($keyhdr[$arraykey], null, true);
  2992. $coltotalhtml .= "<td class='rptTotal'>".$conv_value.'</td>';
  2993. }else
  2994. {
  2995. $coltotalhtml .= "<td class='rptTotal'>&nbsp;</td>";
  2996. }
  2997. $arraykey = $value.'_MAX';
  2998. if(isset($keyhdr[$arraykey]))
  2999. {
  3000. if($convert_price)
  3001. $conv_value = CurrencyField::convertToUserFormat ($keyhdr[$arraykey]);
  3002. else
  3003. $conv_value = CurrencyField::convertToUserFormat ($keyhdr[$arraykey], null, true);
  3004. $coltotalhtml .= "<td class='rptTotal'>".$conv_value.'</td>';
  3005. }else
  3006. {
  3007. $coltotalhtml .= "<td class='rptTotal'>&nbsp;</td>";
  3008. }
  3009. $coltotalhtml .= '</tr>';
  3010. // Performation Optimization: If Direct output is desired
  3011. if($directOutput) {
  3012. echo $coltotalhtml;
  3013. $coltotalhtml = '';
  3014. }
  3015. // END
  3016. }
  3017. $coltotalhtml .= "</table>";
  3018. // Performation Optimization: If Direct output is desired
  3019. if($directOutput) {
  3020. echo $coltotalhtml;
  3021. $coltotalhtml = '';
  3022. }
  3023. // END
  3024. }
  3025. }
  3026. return $coltotalhtml;
  3027. }
  3028. }
  3029. //<<<<<<<new>>>>>>>>>>
  3030. function getColumnsTotal($reportid)
  3031. {
  3032. // Have we initialized it already?
  3033. if($this->_columnstotallist !== false) {
  3034. return $this->_columnstotallist;
  3035. }
  3036. global $adb;
  3037. global $modules;
  3038. global $log, $current_user;
  3039. static $modulename_cache = array();
  3040. $query = "select * from vtiger_reportmodules where reportmodulesid =?";
  3041. $res = $adb->pquery($query , array($reportid));
  3042. $modrow = $adb->fetch_array($res);
  3043. $premod = $modrow["primarymodule"];
  3044. $secmod = $modrow["secondarymodules"];
  3045. $coltotalsql = "select vtiger_reportsummary.* from vtiger_report";
  3046. $coltotalsql .= " inner join vtiger_reportsummary on vtiger_report.reportid = vtiger_reportsummary.reportsummaryid";
  3047. $coltotalsql .= " where vtiger_report.reportid =?";
  3048. $result = $adb->pquery($coltotalsql, array($reportid));
  3049. while($coltotalrow = $adb->fetch_array($result))
  3050. {
  3051. $fieldcolname = $coltotalrow["columnname"];
  3052. if($fieldcolname != "none")
  3053. {
  3054. $fieldlist = explode(":",$fieldcolname);
  3055. $field_tablename = $fieldlist[1];
  3056. $field_columnname = $fieldlist[2];
  3057. $cachekey = $field_tablename . ":" . $field_columnname;
  3058. if (!isset($modulename_cache[$cachekey])) {
  3059. $mod_query = $adb->pquery("SELECT distinct(tabid) as tabid from vtiger_field where tablename = ? and columnname=?",array($fieldlist[1],$fieldlist[2]));
  3060. if($adb->num_rows($mod_query)>0){
  3061. $module_name = getTabName($adb->query_result($mod_query,0,'tabid'));
  3062. $modulename_cache[$cachekey] = $module_name;
  3063. }
  3064. } else {
  3065. $module_name = $modulename_cache[$cachekey];
  3066. }
  3067. $fieldlabel = trim($fieldlist[3]);
  3068. if($field_tablename == 'vtiger_inventoryproductrel') {
  3069. $field_columnalias = $premod."_".$fieldlist[3];
  3070. } else {
  3071. if($module_name){
  3072. $field_columnalias = $module_name."_".$fieldlist[3];
  3073. } else {
  3074. $field_columnalias = $module_name."_".$fieldlist[3];
  3075. }
  3076. }
  3077. //$field_columnalias = $fieldlist[3];
  3078. $field_permitted = false;
  3079. if(CheckColumnPermission($field_tablename,$field_columnname,$premod) != "false"){
  3080. $field_permitted = true;
  3081. } else {
  3082. $mod = split(":",$secmod);
  3083. foreach($mod as $key){
  3084. if(CheckColumnPermission($field_tablename,$field_columnname,$key) != "false"){
  3085. $field_permitted=true;
  3086. }
  3087. }
  3088. }
  3089. //Calculation fields of "Events" module should show in Calendar related report
  3090. $secondaryModules = split(":", $secmod);
  3091. if ($field_permitted === false && ($premod === 'Calendar' || in_array('Calendar', $secondaryModules)) && CheckColumnPermission($field_tablename, $field_columnname, "Events") != "false") {
  3092. $field_permitted = true;
  3093. }
  3094. if($field_permitted == true)
  3095. {
  3096. $field = $field_tablename.".".$field_columnname;
  3097. if($field_tablename == 'vtiger_products' && $field_columnname == 'unit_price') {
  3098. // Query needs to be rebuild to get the value in user preferred currency. [innerProduct and actual_unit_price are table and column alias.]
  3099. $field = " innerProduct.actual_unit_price";
  3100. $this->queryPlanner->addTable("innerProduct");
  3101. }
  3102. if($field_tablename == 'vtiger_service' && $field_columnname == 'unit_price') {
  3103. // Query needs to be rebuild to get the value in user preferred currency. [innerProduct and actual_unit_price are table and column alias.]
  3104. $field = " innerService.actual_unit_price";
  3105. $this->queryPlanner->addTable("innerService");
  3106. }
  3107. if(($field_tablename == 'vtiger_invoice' || $field_tablename == 'vtiger_quotes' || $field_tablename == 'vtiger_purchaseorder' || $field_tablename == 'vtiger_salesorder')
  3108. && ($field_columnname == 'total' || $field_columnname == 'subtotal' || $field_columnname == 'discount_amount' || $field_columnname == 's_h_amount'
  3109. || $field_columnname == 'paid' || $field_columnname == 'balance' || $field_columnname == 'received')) {
  3110. $field = " $field_tablename.$field_columnname/$field_tablename.conversion_rate ";
  3111. }
  3112. if($field_tablename == 'vtiger_inventoryproductrel') {
  3113. // Check added so that query planner can prepare query properly for inventory modules
  3114. $this->lineItemFieldsInCalculation = true;
  3115. $field = $field_tablename.$premod.'.'.$field_columnname;
  3116. $itemTableName = 'vtiger_inventoryproductrel'.$premod;
  3117. $this->queryPlanner->addTable($itemTableName);
  3118. if($field_columnname == 'listprice') {
  3119. $primaryModuleInstance = CRMEntity::getInstance($premod);
  3120. $field = $field.'/'.$primaryModuleInstance->table_name.'.conversion_rate';
  3121. } else if($field_columnname == 'discount_amount') {
  3122. $field = ' CASE WHEN '.$itemTableName.'.discount_amount is not null THEN '.$itemTableName.'.discount_amount/'.$primaryModuleInstance->table_name.'.conversion_rate '.
  3123. 'WHEN '.$itemTableName.'.discount_percent IS NOT NULL THEN ('.$itemTableName.'.listprice*'.$itemTableName.'.quantity*'.$itemTableName.'.discount_percent/100/'.$primaryModuleInstance->table_name.'.conversion_rate) ELSE 0 END ';
  3124. }
  3125. }
  3126. if($fieldlist[4] == 2)
  3127. {
  3128. $stdfilterlist[$fieldcolname] = "sum($field) '".$field_columnalias."'";
  3129. }
  3130. if($fieldlist[4] == 3)
  3131. {
  3132. //Fixed average calculation issue due to NULL values ie., when we use avg() function, NULL values will be ignored.to avoid this we use (sum/count) to find average.
  3133. //$stdfilterlist[$fieldcolname] = "avg(".$fieldlist[1].".".$fieldlist[2].") '".$fieldlist[3]."'";
  3134. $stdfilterlist[$fieldcolname] = "(sum($field)/count(*)) '".$field_columnalias."'";
  3135. }
  3136. if($fieldlist[4] == 4)
  3137. {
  3138. $stdfilterlist[$fieldcolname] = "min($field) '".$field_columnalias."'";
  3139. }
  3140. if($fieldlist[4] == 5)
  3141. {
  3142. $stdfilterlist[$fieldcolname] = "max($field) '".$field_columnalias."'";
  3143. }
  3144. $this->queryPlanner->addTable($field_tablename);
  3145. }
  3146. }
  3147. }
  3148. // Save the information
  3149. $this->_columnstotallist = $stdfilterlist;
  3150. $log->info("ReportRun :: Successfully returned getColumnsTotal".$reportid);
  3151. return $stdfilterlist;
  3152. }
  3153. //<<<<<<new>>>>>>>>>
  3154. /** function to get query for the columns to total for the given reportid
  3155. * @ param $reportid : Type integer
  3156. * This returns columnstoTotal query for the reportid
  3157. */
  3158. function getColumnsToTotalColumns($reportid)
  3159. {
  3160. global $adb;
  3161. global $modules;
  3162. global $log;
  3163. $sreportstdfiltersql = "select vtiger_reportsummary.* from vtiger_report";
  3164. $sreportstdfiltersql .= " inner join vtiger_reportsummary on vtiger_report.reportid = vtiger_reportsummary.reportsummaryid";
  3165. $sreportstdfiltersql .= " where vtiger_report.reportid =?";
  3166. $result = $adb->pquery($sreportstdfiltersql, array($reportid));
  3167. $noofrows = $adb->num_rows($result);
  3168. for($i=0; $i<$noofrows; $i++)
  3169. {
  3170. $fieldcolname = $adb->query_result($result,$i,"columnname");
  3171. if($fieldcolname != "none")
  3172. {
  3173. $fieldlist = explode(":",$fieldcolname);
  3174. if($fieldlist[4] == 2)
  3175. {
  3176. $sSQLList[] = "sum(".$fieldlist[1].".".$fieldlist[2].") ".$fieldlist[3];
  3177. }
  3178. if($fieldlist[4] == 3)
  3179. {
  3180. $sSQLList[] = "avg(".$fieldlist[1].".".$fieldlist[2].") ".$fieldlist[3];
  3181. }
  3182. if($fieldlist[4] == 4)
  3183. {
  3184. $sSQLList[] = "min(".$fieldlist[1].".".$fieldlist[2].") ".$fieldlist[3];
  3185. }
  3186. if($fieldlist[4] == 5)
  3187. {
  3188. $sSQLList[] = "max(".$fieldlist[1].".".$fieldlist[2].") ".$fieldlist[3];
  3189. }
  3190. }
  3191. }
  3192. if(isset($sSQLList))
  3193. {
  3194. $sSQL = implode(",",$sSQLList);
  3195. }
  3196. $log->info("ReportRun :: Successfully returned getColumnsToTotalColumns".$reportid);
  3197. return $sSQL;
  3198. }
  3199. /** Function to convert the Report Header Names into i18n
  3200. * @param $fldname: Type Varchar
  3201. * Returns Language Converted Header Strings
  3202. **/
  3203. function getLstringforReportHeaders($fldname)
  3204. {
  3205. global $modules,$current_language,$current_user,$app_strings;
  3206. $rep_header = ltrim($fldname);
  3207. $rep_header = decode_html($rep_header);
  3208. $labelInfo = explode('_', $rep_header);
  3209. $rep_module = $labelInfo[0];
  3210. if(is_array($this->labelMapping) && !empty($this->labelMapping[$rep_header])) {
  3211. $rep_header = $this->labelMapping[$rep_header];
  3212. } else {
  3213. if($rep_module == 'LBL') {
  3214. $rep_module = '';
  3215. }
  3216. array_shift($labelInfo);
  3217. $fieldLabel = decode_html(implode("_",$labelInfo));
  3218. $rep_header_temp = preg_replace("/\s+/","_",$fieldLabel);
  3219. $rep_header = "$rep_module $fieldLabel";
  3220. }
  3221. $curr_symb = "";
  3222. $fieldLabel = ltrim(str_replace($rep_module, '', $rep_header), '_');
  3223. $fieldInfo = getFieldByReportLabel($rep_module, $fieldLabel);
  3224. if($fieldInfo['uitype'] == '71') {
  3225. $curr_symb = " (".$app_strings['LBL_IN']." ".$current_user->currency_symbol.")";
  3226. }
  3227. $rep_header .=$curr_symb;
  3228. return $rep_header;
  3229. }
  3230. /** Function to get picklist value array based on profile
  3231. * * returns permitted fields in array format
  3232. **/
  3233. function getAccessPickListValues()
  3234. {
  3235. global $adb;
  3236. global $current_user;
  3237. $id = array(getTabid($this->primarymodule));
  3238. if($this->secondarymodule != '')
  3239. array_push($id, getTabid($this->secondarymodule));
  3240. $query = 'select fieldname,columnname,fieldid,fieldlabel,tabid,uitype from vtiger_field where tabid in('. generateQuestionMarks($id) .') and uitype in (15,33,55)'; //and columnname in (?)';
  3241. $result = $adb->pquery($query, $id);//,$select_column));
  3242. $roleid=$current_user->roleid;
  3243. $subrole = getRoleSubordinates($roleid);
  3244. if(count($subrole)> 0)
  3245. {
  3246. $roleids = $subrole;
  3247. array_push($roleids, $roleid);
  3248. }
  3249. else
  3250. {
  3251. $roleids = $roleid;
  3252. }
  3253. $temp_status = Array();
  3254. for($i=0;$i < $adb->num_rows($result);$i++)
  3255. {
  3256. $fieldname = $adb->query_result($result,$i,"fieldname");
  3257. $fieldlabel = $adb->query_result($result,$i,"fieldlabel");
  3258. $tabid = $adb->query_result($result,$i,"tabid");
  3259. $uitype = $adb->query_result($result,$i,"uitype");
  3260. $fieldlabel1 = str_replace(" ","_",$fieldlabel);
  3261. $keyvalue = getTabModuleName($tabid)."_".$fieldlabel1;
  3262. $fieldvalues = Array();
  3263. if (count($roleids) > 1) {
  3264. $mulsel="select distinct $fieldname from vtiger_$fieldname inner join vtiger_role2picklist on vtiger_role2picklist.picklistvalueid = vtiger_$fieldname.picklist_valueid where roleid in (\"". implode($roleids,"\",\"") ."\") and picklistid in (select picklistid from vtiger_$fieldname)"; // order by sortid asc - not requried
  3265. } else {
  3266. $mulsel="select distinct $fieldname from vtiger_$fieldname inner join vtiger_role2picklist on vtiger_role2picklist.picklistvalueid = vtiger_$fieldname.picklist_valueid where roleid ='".$roleid."' and picklistid in (select picklistid from vtiger_$fieldname)"; // order by sortid asc - not requried
  3267. }
  3268. if($fieldname != 'firstname')
  3269. $mulselresult = $adb->query($mulsel);
  3270. for($j=0;$j < $adb->num_rows($mulselresult);$j++)
  3271. {
  3272. $fldvalue = $adb->query_result($mulselresult,$j,$fieldname);
  3273. if(in_array($fldvalue,$fieldvalues)) continue;
  3274. $fieldvalues[] = $fldvalue;
  3275. }
  3276. $field_count = count($fieldvalues);
  3277. if( $uitype == 15 && $field_count > 0 && ($fieldname == 'taskstatus' || $fieldname == 'eventstatus'))
  3278. {
  3279. $temp_count =count($temp_status[$keyvalue]);
  3280. if($temp_count > 0)
  3281. {
  3282. for($t=0;$t < $field_count;$t++)
  3283. {
  3284. $temp_status[$keyvalue][($temp_count+$t)] = $fieldvalues[$t];
  3285. }
  3286. $fieldvalues = $temp_status[$keyvalue];
  3287. }
  3288. else
  3289. $temp_status[$keyvalue] = $fieldvalues;
  3290. }
  3291. if($uitype == 33)
  3292. $fieldlists[1][$keyvalue] = $fieldvalues;
  3293. else if($uitype == 55 && $fieldname == 'salutationtype')
  3294. $fieldlists[$keyvalue] = $fieldvalues;
  3295. else if($uitype == 15)
  3296. $fieldlists[$keyvalue] = $fieldvalues;
  3297. }
  3298. return $fieldlists;
  3299. }
  3300. function getReportPDF($filterlist=false) {
  3301. require_once 'libraries/tcpdf/tcpdf.php';
  3302. $arr_val = $this->GenerateReport("PDF",$filterlist);
  3303. if(isset($arr_val)) {
  3304. foreach($arr_val as $wkey=>$warray_value) {
  3305. foreach($warray_value as $whd=>$wvalue) {
  3306. if(strlen($wvalue) < strlen($whd)) {
  3307. $w_inner_array[] = strlen($whd);
  3308. } else {
  3309. $w_inner_array[] = strlen($wvalue);
  3310. }
  3311. }
  3312. $warr_val[] = $w_inner_array;
  3313. unset($w_inner_array);
  3314. }
  3315. foreach($warr_val[0] as $fkey=>$fvalue) {
  3316. foreach($warr_val as $wkey=>$wvalue) {
  3317. $f_inner_array[] = $warr_val[$wkey][$fkey];
  3318. }
  3319. sort($f_inner_array,1);
  3320. $farr_val[] = $f_inner_array;
  3321. unset($f_inner_array);
  3322. }
  3323. foreach($farr_val as $skkey=>$skvalue) {
  3324. if($skvalue[count($arr_val)-1] == 1) {
  3325. $col_width[] = ($skvalue[count($arr_val)-1] * 50);
  3326. } else {
  3327. $col_width[] = ($skvalue[count($arr_val)-1] * 10) + 10 ;
  3328. }
  3329. }
  3330. $count = 0;
  3331. foreach($arr_val[0] as $key=>$value) {
  3332. $headerHTML .= '<td width="'.$col_width[$count].'" bgcolor="#DDDDDD"><b>'.$this->getLstringforReportHeaders($key).'</b></td>';
  3333. $count = $count + 1;
  3334. }
  3335. foreach($arr_val as $key=>$array_value) {
  3336. $valueHTML = "";
  3337. $count = 0;
  3338. foreach($array_value as $hd=>$value) {
  3339. $valueHTML .= '<td width="'.$col_width[$count].'">'.$value.'</td>';
  3340. $count = $count + 1;
  3341. }
  3342. $dataHTML .= '<tr>'.$valueHTML.'</tr>';
  3343. }
  3344. }
  3345. $totalpdf = $this->GenerateReport("PRINT_TOTAL",$filterlist);
  3346. $html = '<table border="0.5"><tr>'.$headerHTML.'</tr>'.$dataHTML.'<tr><td>'.$totalpdf.'</td></tr>'.'</table>';
  3347. $columnlength = array_sum($col_width);
  3348. if($columnlength > 14400) {
  3349. die("<br><br><center>".$app_strings['LBL_PDF']." <a href='javascript:window.history.back()'>".$app_strings['LBL_GO_BACK'].".</a></center>");
  3350. }
  3351. if($columnlength <= 420 ) {
  3352. $pdf = new TCPDF('P','mm','A5',true);
  3353. } elseif($columnlength >= 421 && $columnlength <= 1120) {
  3354. $pdf = new TCPDF('L','mm','A3',true);
  3355. }elseif($columnlength >=1121 && $columnlength <= 1600) {
  3356. $pdf = new TCPDF('L','mm','A2',true);
  3357. }elseif($columnlength >=1601 && $columnlength <= 2200) {
  3358. $pdf = new TCPDF('L','mm','A1',true);
  3359. }
  3360. elseif($columnlength >=2201 && $columnlength <= 3370) {
  3361. $pdf = new TCPDF('L','mm','A0',true);
  3362. }
  3363. elseif($columnlength >=3371 && $columnlength <= 4690) {
  3364. $pdf = new TCPDF('L','mm','2A0',true);
  3365. }
  3366. elseif($columnlength >=4691 && $columnlength <= 6490) {
  3367. $pdf = new TCPDF('L','mm','4A0',true);
  3368. }
  3369. else {
  3370. $columnhight = count($arr_val)*15;
  3371. $format = array($columnhight,$columnlength);
  3372. $pdf = new TCPDF('L','mm',$format,true);
  3373. }
  3374. $pdf->SetMargins(10, PDF_MARGIN_TOP, PDF_MARGIN_RIGHT);
  3375. $pdf->SetAutoPageBreak(TRUE, PDF_MARGIN_BOTTOM);
  3376. $pdf->SetHeaderMargin(PDF_MARGIN_HEADER);
  3377. $pdf->SetFooterMargin(PDF_MARGIN_FOOTER);
  3378. $pdf->setHeaderFont(Array(PDF_FONT_NAME_MAIN, '', PDF_FONT_SIZE_MAIN));
  3379. $pdf->setFooterFont(Array(PDF_FONT_NAME_DATA, '', PDF_FONT_SIZE_DATA));
  3380. $pdf->setLanguageArray($l);
  3381. //echo '<pre>';print_r($columnlength);echo '</pre>';
  3382. $pdf->AddPage();
  3383. $pdf->SetFillColor(224,235,255);
  3384. $pdf->SetTextColor(0);
  3385. $pdf->SetFont('FreeSerif','B',14);
  3386. $pdf->Cell(($pdf->columnlength*50),10,getTranslatedString($oReport->reportname),0,0,'C',0);
  3387. //$pdf->writeHTML($oReport->reportname);
  3388. $pdf->Ln();
  3389. $pdf->SetFont('FreeSerif','',10);
  3390. $pdf->writeHTML($html);
  3391. return $pdf;
  3392. }
  3393. function writeReportToExcelFile($fileName, $filterlist='') {
  3394. global $currentModule, $current_language;
  3395. $mod_strings = return_module_language($current_language, $currentModule);
  3396. require_once("libraries/PHPExcel/PHPExcel.php");
  3397. $workbook = new PHPExcel();
  3398. $worksheet = $workbook->setActiveSheetIndex(0);
  3399. $arr_val = $this->GenerateReport("PDF",$filterlist);
  3400. $totalxls = $this->GenerateReport("TOTALXLS",$filterlist);
  3401. $header_styles = array(
  3402. 'fill' => array( 'type' => PHPExcel_Style_Fill::FILL_SOLID, 'color' => array('rgb'=>'E1E0F7') ),
  3403. //'font' => array( 'bold' => true )
  3404. );
  3405. if(isset($arr_val)) {
  3406. $count = 0;
  3407. $rowcount = 1;
  3408. //copy the first value details
  3409. $arrayFirstRowValues = $arr_val[0];
  3410. array_pop($arrayFirstRowValues); // removed action link in details
  3411. foreach($arrayFirstRowValues as $key=>$value) {
  3412. $worksheet->setCellValueExplicitByColumnAndRow($count, $rowcount, $key, true);
  3413. $worksheet->getStyleByColumnAndRow($count, $rowcount)->applyFromArray($header_styles);
  3414. // NOTE Performance overhead: http://stackoverflow.com/questions/9965476/phpexcel-column-size-issues
  3415. //$worksheet->getColumnDimensionByColumn($count)->setAutoSize(true);
  3416. $count = $count + 1;
  3417. }
  3418. $rowcount++;
  3419. foreach($arr_val as $key=>$array_value) {
  3420. $count = 0;
  3421. array_pop($array_value); // removed action link in details
  3422. foreach($array_value as $hdr=>$value) {
  3423. if($hdr == 'ACTION') continue;
  3424. $value = decode_html($value);
  3425. // TODO Determine data-type based on field-type.
  3426. // String type helps having numbers prefixed with 0 intact.
  3427. $worksheet->setCellValueExplicitByColumnAndRow($count, $rowcount, $value, PHPExcel_Cell_DataType::TYPE_STRING);
  3428. $count = $count + 1;
  3429. }
  3430. $rowcount++;
  3431. }
  3432. // Summary Total
  3433. $rowcount++;
  3434. $count=0;
  3435. if(is_array($totalxls[0])) {
  3436. foreach($totalxls[0] as $key=>$value) {
  3437. $chdr=substr($key,-3,3);
  3438. $translated_str = in_array($chdr ,array_keys($mod_strings))?$mod_strings[$chdr]:$key;
  3439. $worksheet->setCellValueExplicitByColumnAndRow($count, $rowcount, $translated_str);
  3440. $worksheet->getStyleByColumnAndRow($count, $rowcount)->applyFromArray($header_styles);
  3441. $count = $count + 1;
  3442. }
  3443. }
  3444. $rowcount++;
  3445. foreach($totalxls as $key=>$array_value) {
  3446. $count = 0;
  3447. foreach($array_value as $hdr=>$value) {
  3448. $value = decode_html($value);
  3449. $worksheet->setCellValueExplicitByColumnAndRow($count, $key+$rowcount, $value);
  3450. $count = $count + 1;
  3451. }
  3452. }
  3453. }
  3454. $workbookWriter = PHPExcel_IOFactory::createWriter($workbook, 'Excel5');
  3455. $workbookWriter->save($fileName);
  3456. }
  3457. function writeReportToCSVFile($fileName, $filterlist='') {
  3458. global $currentModule, $current_language;
  3459. $mod_strings = return_module_language($current_language, $currentModule);
  3460. $arr_val = $this->GenerateReport("PDF",$filterlist);
  3461. $fp = fopen($fileName, 'w+');
  3462. if(isset($arr_val)) {
  3463. $csv_values = array();
  3464. // Header
  3465. $csv_values = array_keys($arr_val[0]);
  3466. array_pop($csv_values); //removed header in csv file
  3467. fputcsv($fp, $csv_values);
  3468. foreach($arr_val as $key=>$array_value) {
  3469. array_pop($array_value); //removed action link
  3470. $csv_values = array_map('decode_html', array_values($array_value));
  3471. fputcsv($fp, $csv_values);
  3472. }
  3473. }
  3474. fclose($fp);
  3475. }
  3476. function getGroupByTimeList($reportId){
  3477. global $adb;
  3478. $groupByTimeQuery = "SELECT * FROM vtiger_reportgroupbycolumn WHERE reportid=?";
  3479. $groupByTimeRes = $adb->pquery($groupByTimeQuery,array($reportId));
  3480. $num_rows = $adb->num_rows($groupByTimeRes);
  3481. for($i=0;$i<$num_rows;$i++){
  3482. $sortColName = $adb->query_result($groupByTimeRes, $i,'sortcolname');
  3483. list($tablename,$colname,$module_field,$fieldname,$single) = split(':',$sortColName);
  3484. $groupField = $module_field;
  3485. $groupCriteria = $adb->query_result($groupByTimeRes, $i,'dategroupbycriteria');
  3486. if(in_array($groupCriteria,array_keys($this->groupByTimeParent))){
  3487. $parentCriteria = $this->groupByTimeParent[$groupCriteria];
  3488. foreach($parentCriteria as $criteria){
  3489. $groupByCondition[]=$this->GetTimeCriteriaCondition($criteria, $groupField);
  3490. }
  3491. }
  3492. $groupByCondition[] = $this->GetTimeCriteriaCondition($groupCriteria, $groupField);
  3493. $this->queryPlanner->addTable($tablename);
  3494. }
  3495. return $groupByCondition;
  3496. }
  3497. function GetTimeCriteriaCondition($criteria,$dateField){
  3498. $condition = "";
  3499. if(strtolower($criteria)=='year'){
  3500. $condition = "to_char($dateField, '%Y' )";
  3501. }
  3502. else if (strtolower($criteria)=='month'){
  3503. $condition = "CEIL(to_char($dateField,'%m')%13)";
  3504. }
  3505. else if(strtolower($criteria)=='quarter'){
  3506. $condition = "CEIL(to_char($dateField,'%m')/3)";
  3507. }
  3508. return $condition;
  3509. }
  3510. function GetFirstSortByField($reportid)
  3511. {
  3512. global $adb;
  3513. $groupByField ="";
  3514. $sortFieldQuery = "SELECT * FROM vtiger_reportsortcol
  3515. LEFT JOIN vtiger_reportgroupbycolumn ON (vtiger_reportsortcol.sortcolid = vtiger_reportgroupbycolumn.sortid and vtiger_reportsortcol.reportid = vtiger_reportgroupbycolumn.reportid)
  3516. WHERE columnname!='none' and vtiger_reportsortcol.reportid=? ORDER By sortcolid";
  3517. $sortFieldResult= $adb->pquery($sortFieldQuery,array($reportid));
  3518. $inventoryModules = getInventoryModules();
  3519. if($adb->num_rows($sortFieldResult)>0){
  3520. $fieldcolname = $adb->query_result($sortFieldResult,0,'columnname');
  3521. list($tablename,$colname,$module_field,$fieldname,$typeOfData) = explode(":",$fieldcolname);
  3522. list($modulename,$fieldlabel) = explode('_', $module_field, 2);
  3523. $groupByField = $module_field;
  3524. if($typeOfData == "D"){
  3525. $groupCriteria = $adb->query_result($sortFieldResult,0,'dategroupbycriteria');
  3526. if(strtolower($groupCriteria)!='none'){
  3527. if(in_array($groupCriteria,array_keys($this->groupByTimeParent))){
  3528. $parentCriteria = $this->groupByTimeParent[$groupCriteria];
  3529. foreach($parentCriteria as $criteria){
  3530. $groupByCondition[]=$this->GetTimeCriteriaCondition($criteria, $groupByField);
  3531. }
  3532. }
  3533. $groupByCondition[] = $this->GetTimeCriteriaCondition($groupCriteria, $groupByField);
  3534. $groupByField = implode(", ",$groupByCondition);
  3535. }
  3536. } elseif(CheckFieldPermission($fieldname,$modulename) != 'true') {
  3537. if (!(in_array($modulename, $inventoryModules) && $fieldname == 'serviceid')) {
  3538. $groupByField = $tablename.".".$colname;
  3539. }
  3540. }
  3541. }
  3542. return $groupByField;
  3543. }
  3544. function getReferenceFieldColumnList($moduleName, $fieldInfo) {
  3545. $adb = PearDatabase::getInstance();
  3546. $columnsSqlList = array();
  3547. $fieldInstance = WebserviceField::fromArray($adb, $fieldInfo);
  3548. $referenceModuleList = $fieldInstance->getReferenceList();
  3549. $reportSecondaryModules = explode(':', $this->secondarymodule);
  3550. if($moduleName != $this->primarymodule && in_array($this->primarymodule, $referenceModuleList)) {
  3551. $entityTableFieldNames = getEntityFieldNames($this->primarymodule);
  3552. $entityTableName = $entityTableFieldNames['tablename'];
  3553. $entityFieldNames = $entityTableFieldNames['fieldname'];
  3554. $columnList = array();
  3555. if(is_array($entityFieldNames)) {
  3556. foreach ($entityFieldNames as $entityColumnName) {
  3557. $columnList["$entityColumnName"] = "$entityTableName.$entityColumnName";
  3558. }
  3559. } else {
  3560. $columnList[] = "$entityTableName.$entityFieldNames";
  3561. }
  3562. if(count($columnList) > 1) {
  3563. $columnSql = getSqlForNameInDisplayFormat($columnList, $this->primarymodule);
  3564. } else {
  3565. $columnSql = implode('', $columnList);
  3566. }
  3567. $columnsSqlList[] = $columnSql;
  3568. } else {
  3569. foreach($referenceModuleList as $referenceModule) {
  3570. $entityTableFieldNames = getEntityFieldNames($referenceModule);
  3571. $entityTableName = $entityTableFieldNames['tablename'];
  3572. $entityFieldNames = $entityTableFieldNames['fieldname'];
  3573. $referenceTableName = '';
  3574. $dependentTableName = '';
  3575. if($moduleName == 'HelpDesk' && $referenceModule == 'Accounts') {
  3576. $referenceTableName = 'vtiger_accountRelHelpDesk';
  3577. } elseif ($moduleName == 'HelpDesk' && $referenceModule == 'Contacts') {
  3578. $referenceTableName = 'vtiger_contactdetailsRelHelpDesk';
  3579. } elseif ($moduleName == 'HelpDesk' && $referenceModule == 'Products') {
  3580. $referenceTableName = 'vtiger_productsRel';
  3581. } elseif ($moduleName == 'Calendar' && $referenceModule == 'Accounts') {
  3582. $referenceTableName = 'vtiger_accountRelCalendar';
  3583. } elseif ($moduleName == 'Calendar' && $referenceModule == 'Contacts') {
  3584. $referenceTableName = 'vtiger_contactdetailsCalendar';
  3585. } elseif ($moduleName == 'Calendar' && $referenceModule == 'Leads') {
  3586. $referenceTableName = 'vtiger_leaddetailsRelCalendar';
  3587. } elseif ($moduleName == 'Calendar' && $referenceModule == 'Potentials') {
  3588. $referenceTableName = 'vtiger_potentialRelCalendar';
  3589. } elseif ($moduleName == 'Calendar' && $referenceModule == 'Invoice') {
  3590. $referenceTableName = 'vtiger_invoiceRelCalendar';
  3591. } elseif ($moduleName == 'Calendar' && $referenceModule == 'Quotes') {
  3592. $referenceTableName = 'vtiger_quotesRelCalendar';
  3593. } elseif ($moduleName == 'Calendar' && $referenceModule == 'PurchaseOrder') {
  3594. $referenceTableName = 'vtiger_purchaseorderRelCalendar';
  3595. } elseif ($moduleName == 'Calendar' && $referenceModule == 'SalesOrder') {
  3596. $referenceTableName = 'vtiger_salesorderRelCalendar';
  3597. } elseif ($moduleName == 'Calendar' && $referenceModule == 'HelpDesk') {
  3598. $referenceTableName = 'vtiger_troubleticketsRelCalendar';
  3599. } elseif ($moduleName == 'Calendar' && $referenceModule == 'Campaigns') {
  3600. $referenceTableName = 'vtiger_campaignRelCalendar';
  3601. } elseif ($moduleName == 'Contacts' && $referenceModule == 'Accounts') {
  3602. $referenceTableName = 'vtiger_accountContacts';
  3603. } elseif ($moduleName == 'Contacts' && $referenceModule == 'Contacts') {
  3604. $referenceTableName = 'vtiger_contactdetailsContacts';
  3605. } elseif ($moduleName == 'Accounts' && $referenceModule == 'Accounts') {
  3606. $referenceTableName = 'vtiger_accountAccounts';
  3607. } elseif ($moduleName == 'Campaigns' && $referenceModule == 'Products') {
  3608. $referenceTableName = 'vtiger_productsCampaigns';
  3609. } elseif ($moduleName == 'Faq' && $referenceModule == 'Products') {
  3610. $referenceTableName = 'vtiger_productsFaq';
  3611. } elseif ($moduleName == 'Invoice' && $referenceModule == 'SalesOrder') {
  3612. $referenceTableName = 'vtiger_salesorderInvoice';
  3613. } elseif ($moduleName == 'Invoice' && $referenceModule == 'Contacts') {
  3614. $referenceTableName = 'vtiger_contactdetailsInvoice';
  3615. } elseif ($moduleName == 'Invoice' && $referenceModule == 'Accounts') {
  3616. $referenceTableName = 'vtiger_accountInvoice';
  3617. } elseif ($moduleName == 'Potentials' && $referenceModule == 'Campaigns') {
  3618. $referenceTableName = 'vtiger_campaignPotentials';
  3619. } elseif ($moduleName == 'Products' && $referenceModule == 'Vendors') {
  3620. $referenceTableName = 'vtiger_vendorRelProducts';
  3621. } elseif ($moduleName == 'PurchaseOrder' && $referenceModule == 'Contacts') {
  3622. $referenceTableName = 'vtiger_contactdetailsPurchaseOrder';
  3623. } elseif ($moduleName == 'PurchaseOrder' && $referenceModule == 'Vendors') {
  3624. $referenceTableName = 'vtiger_vendorRelPurchaseOrder';
  3625. } elseif ($moduleName == 'Quotes' && $referenceModule == 'Potentials') {
  3626. $referenceTableName = 'vtiger_potentialRelQuotes';
  3627. } elseif ($moduleName == 'Quotes' && $referenceModule == 'Accounts') {
  3628. $referenceTableName = 'vtiger_accountQuotes';
  3629. } elseif ($moduleName == 'Quotes' && $referenceModule == 'Contacts') {
  3630. $referenceTableName = 'vtiger_contactdetailsQuotes';
  3631. } elseif ($moduleName == 'SalesOrder' && $referenceModule == 'Potentials') {
  3632. $referenceTableName = 'vtiger_potentialRelSalesOrder';
  3633. } elseif ($moduleName == 'SalesOrder' && $referenceModule == 'Accounts') {
  3634. $referenceTableName = 'vtiger_accountSalesOrder';
  3635. } elseif ($moduleName == 'SalesOrder' && $referenceModule == 'Contacts') {
  3636. $referenceTableName = 'vtiger_contactdetailsSalesOrder';
  3637. } elseif ($moduleName == 'SalesOrder' && $referenceModule == 'Quotes') {
  3638. $referenceTableName = 'vtiger_quotesSalesOrder';
  3639. } elseif ($moduleName == 'Potentials' && $referenceModule == 'Contacts') {
  3640. $referenceTableName = 'vtiger_contactdetailsPotentials';
  3641. } elseif ($moduleName == 'Potentials' && $referenceModule == 'Accounts') {
  3642. $referenceTableName = 'vtiger_accountPotentials';
  3643. } elseif (in_array($referenceModule, $reportSecondaryModules)) {
  3644. $referenceTableName = "{$entityTableName}Rel$referenceModule";
  3645. $dependentTableName = "vtiger_crmentityRel{$referenceModule}{$fieldInstance->getFieldId()}";
  3646. } elseif (in_array($moduleName, $reportSecondaryModules)) {
  3647. $referenceTableName = "{$entityTableName}Rel$moduleName";
  3648. $dependentTableName = "vtiger_crmentityRel{$moduleName}{$fieldInstance->getFieldId()}";
  3649. } else {
  3650. $referenceTableName = "{$entityTableName}Rel{$moduleName}{$fieldInstance->getFieldId()}";
  3651. $dependentTableName = "vtiger_crmentityRel{$moduleName}{$fieldInstance->getFieldId()}";
  3652. }
  3653. $this->queryPlanner->addTable($referenceTableName);
  3654. if(isset($dependentTableName)){
  3655. $this->queryPlanner->addTable($dependentTableName);
  3656. }
  3657. $columnList = array();
  3658. if(is_array($entityFieldNames)) {
  3659. foreach ($entityFieldNames as $entityColumnName) {
  3660. $columnList["$entityColumnName"] = "$referenceTableName.$entityColumnName";
  3661. }
  3662. } else {
  3663. $columnList[] = "$referenceTableName.$entityFieldNames";
  3664. }
  3665. if(count($columnList) > 1) {
  3666. $columnSql = getSqlForNameInDisplayFormat($columnList, $referenceModule);
  3667. } else {
  3668. $columnSql = implode('', $columnList);
  3669. }
  3670. if ($referenceModule == 'DocumentFolders' && $fieldInstance->getFieldName() == 'folderid') {
  3671. $columnSql = 'vtiger_attachmentsfolder.foldername';
  3672. $this->queryPlanner->addTable("vtiger_attachmentsfolder");
  3673. }
  3674. if ($referenceModule == 'Currency' && $fieldInstance->getFieldName() == 'currency_id') {
  3675. $columnSql = "vtiger_currency_info$moduleName.currency_name";
  3676. $this->queryPlanner->addTable("vtiger_currency_info$moduleName");
  3677. }
  3678. $columnsSqlList[] = $columnSql;
  3679. }
  3680. }
  3681. return $columnsSqlList;
  3682. }
  3683. }
  3684. ?>