PageRenderTime 74ms CodeModel.GetById 20ms RepoModel.GetById 1ms app.codeStats 1ms

/trunk/rucrm/modules/Reports/ReportRun.php

https://code.google.com/p/vtiger-ru-fork/
PHP | 2982 lines | 2517 code | 261 blank | 204 comment | 924 complexity | a5bd9e1add0aaf621ac1d8d072e6e847 MD5 | raw file
Possible License(s): LGPL-2.1, MPL-2.0-no-copyleft-exception, GPL-2.0, LGPL-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. class ReportRun extends CRMEntity
  20. {
  21. var $primarymodule;
  22. var $secondarymodule;
  23. var $orderbylistsql;
  24. var $orderbylistcolumns;
  25. var $selectcolumns;
  26. var $groupbylist;
  27. var $reporttype;
  28. var $reportname;
  29. var $totallist;
  30. var $_groupinglist = false;
  31. var $_columnslist = false;
  32. var $_stdfilterlist = false;
  33. var $_columnstotallist = false;
  34. var $_advfiltersql = false;
  35. var $convert_currency = array('Potentials_Amount', 'Accounts_Annual_Revenue', 'Leads_Annual_Revenue', 'Campaigns_Budget_Cost',
  36. 'Campaigns_Actual_Cost', 'Campaigns_Expected_Revenue', 'Campaigns_Actual_ROI', 'Campaigns_Expected_ROI');
  37. //var $add_currency_sym_in_headers = array('Amount', 'Unit_Price', 'Total', 'Sub_Total', 'S&H_Amount', 'Discount_Amount', 'Adjustment');
  38. var $append_currency_symbol_to_value = array('Products_Unit_Price','Services_Price',
  39. 'Invoice_Total', 'Invoice_Sub_Total', 'Invoice_S&H_Amount', 'Invoice_Discount_Amount', 'Invoice_Adjustment',
  40. 'Quotes_Total', 'Quotes_Sub_Total', 'Quotes_S&H_Amount', 'Quotes_Discount_Amount', 'Quotes_Adjustment',
  41. 'SalesOrder_Total', 'SalesOrder_Sub_Total', 'SalesOrder_S&H_Amount', 'SalesOrder_Discount_Amount', 'SalesOrder_Adjustment',
  42. 'PurchaseOrder_Total', 'PurchaseOrder_Sub_Total', 'PurchaseOrder_S&H_Amount', 'PurchaseOrder_Discount_Amount', 'PurchaseOrder_Adjustment'
  43. );
  44. var $ui10_fields = array();
  45. /** Function to set reportid,primarymodule,secondarymodule,reporttype,reportname, for given reportid
  46. * This function accepts the $reportid as argument
  47. * It sets reportid,primarymodule,secondarymodule,reporttype,reportname for the given reportid
  48. */
  49. function ReportRun($reportid)
  50. {
  51. $oReport = new Reports($reportid);
  52. $this->reportid = $reportid;
  53. $this->primarymodule = $oReport->primodule;
  54. $this->secondarymodule = $oReport->secmodule;
  55. $this->reporttype = $oReport->reporttype;
  56. $this->reportname = $oReport->reportname;
  57. }
  58. /** Function to get the columns for the reportid
  59. * This function accepts the $reportid and $outputformat (optional)
  60. * This function returns $columnslist Array($tablename:$columnname:$fieldlabel:$fieldname:$typeofdata=>$tablename.$columnname As Header value,
  61. * $tablename1:$columnname1:$fieldlabel1:$fieldname1:$typeofdata1=>$tablename1.$columnname1 As Header value,
  62. * |
  63. * $tablenamen:$columnnamen:$fieldlabeln:$fieldnamen:$typeofdatan=>$tablenamen.$columnnamen As Header value
  64. * )
  65. *
  66. */
  67. function getQueryColumnsList($reportid,$outputformat='')
  68. {
  69. // Have we initialized information already?
  70. if($this->_columnslist !== false) {
  71. return $this->_columnslist;
  72. }
  73. global $adb;
  74. global $modules;
  75. global $log,$current_user,$current_language;
  76. $ssql = "select vtiger_selectcolumn.* from vtiger_report inner join vtiger_selectquery on vtiger_selectquery.queryid = vtiger_report.queryid";
  77. $ssql .= " left join vtiger_selectcolumn on vtiger_selectcolumn.queryid = vtiger_selectquery.queryid";
  78. $ssql .= " where vtiger_report.reportid = ?";
  79. $ssql .= " order by vtiger_selectcolumn.columnindex";
  80. $result = $adb->pquery($ssql, array($reportid));
  81. $permitted_fields = Array();
  82. while($columnslistrow = $adb->fetch_array($result))
  83. {
  84. $fieldname ="";
  85. $fieldcolname = $columnslistrow["columnname"];
  86. list($tablename,$colname,$module_field,$fieldname,$single) = split(":",$fieldcolname);
  87. list($module,$field) = split("_",$module_field);
  88. $inventory_fields = array('quantity','listprice','serviceid','productid','discount','comment');
  89. $inventory_modules = array('SalesOrder','Quotes','PurchaseOrder','Invoice');
  90. require('user_privileges/user_privileges_'.$current_user->id.'.php');
  91. if(sizeof($permitted_fields) == 0 && $is_admin == false && $profileGlobalPermission[1] == 1 && $profileGlobalPermission[2] == 1)
  92. {
  93. list($module,$field) = split("_",$module_field);
  94. $permitted_fields = $this->getaccesfield($module);
  95. }
  96. if(in_array($module,$inventory_modules)){
  97. $permitted_fields = array_merge($permitted_fields,$inventory_fields);
  98. }
  99. $selectedfields = explode(":",$fieldcolname);
  100. $querycolumns = $this->getEscapedColumns($selectedfields);
  101. $mod_strings = return_module_language($current_language,$module);
  102. $fieldlabel = trim(str_replace($module," ",$selectedfields[2]));
  103. $mod_arr=explode('_',$fieldlabel);
  104. $mod = ($mod_arr[0] == '')?$module:$mod_arr[0];
  105. $fieldlabel = trim(str_replace("_"," ",$fieldlabel));
  106. //modified code to support i18n issue
  107. $fld_arr = explode(" ",$fieldlabel);
  108. $mod_lbl = getTranslatedString($fld_arr[0],$module); //module
  109. array_shift($fld_arr);
  110. $fld_lbl_str = implode(" ",$fld_arr);
  111. $fld_lbl = getTranslatedString($fld_lbl_str,$module); //fieldlabel
  112. $fieldlabel = $mod_lbl." ".$fld_lbl;
  113. if((CheckFieldPermission($fieldname,$mod) != 'true' && $colname!="crmid" && (!in_array($fieldname,$inventory_fields) && in_array($module,$inventory_modules))) || empty($fieldname))
  114. {
  115. continue;
  116. }
  117. else
  118. {
  119. $header_label = $selectedfields[2]; // Header label to be displayed in the reports table
  120. // To check if the field in the report is a custom field
  121. // and if yes, get the label of this custom field freshly from the vtiger_field as it would have been changed.
  122. // Asha - Reference ticket : #4906
  123. if($querycolumns == "")
  124. {
  125. if($selectedfields[4] == 'C')
  126. {
  127. $field_label_data = split("_",$selectedfields[2]);
  128. $module= $field_label_data[0];
  129. if($module!=$this->primarymodule)
  130. $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]'";
  131. else
  132. $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]'";
  133. }
  134. elseif($selectedfields[0] == 'vtiger_activity' && $selectedfields[1] == 'status')
  135. {
  136. $columnslist[$fieldcolname] = " case when (vtiger_activity.status not like '') then vtiger_activity.status else vtiger_activity.eventstatus end as Calendar_Status";
  137. }
  138. elseif($selectedfields[0] == 'vtiger_activity' && $selectedfields[1] == 'date_start')
  139. {
  140. $columnslist[$fieldcolname] = "cast(concat(vtiger_activity.date_start,' ',vtiger_activity.time_start) as DATETIME) as Calendar_Start_Date_and_Time";
  141. }
  142. elseif(stristr($selectedfields[0],"vtiger_users") && ($selectedfields[1] == 'user_name') && $module_field != 'Products_Handler' && $module_field!='Services_Owner')
  143. {
  144. $temp_module_from_tablename = str_replace("vtiger_users","",$selectedfields[0]);
  145. if($module!=$this->primarymodule){
  146. $condition = "and vtiger_crmentity".$module.".crmid!=''";
  147. } else {
  148. $condition = "and vtiger_crmentity.crmid!=''";
  149. }
  150. if($temp_module_from_tablename == $module)
  151. $columnslist[$fieldcolname] = " case when (".$selectedfields[0].".user_name not like '' $condition) then ".$selectedfields[0].".user_name else vtiger_groups".$module.".groupname end as '".$module."_Assigned_To'";
  152. else//Some Fields can't assigned to groups so case avoided (fields like inventory manager)
  153. $columnslist[$fieldcolname] = $selectedfields[0].".user_name as '".$header_label."'";
  154. }
  155. elseif(stristr($selectedfields[0],"vtiger_users") && ($selectedfields[1] == 'user_name') && $module_field == 'Products_Handler')//Products cannot be assiged to group only to handler so group is not included
  156. {
  157. $columnslist[$fieldcolname] = $selectedfields[0].".user_name as ".$module."_Handler";
  158. }
  159. elseif($selectedfields[0] == "vtiger_crmentity".$this->primarymodule)
  160. {
  161. $columnslist[$fieldcolname] = "vtiger_crmentity.".$selectedfields[1]." AS '".$header_label."'";
  162. }
  163. elseif($selectedfields[0] == 'vtiger_invoice' && $selectedfields[1] == 'salesorderid')//handled for salesorder fields in Invoice Module Reports
  164. {
  165. $columnslist[$fieldcolname] = "vtiger_salesorderInvoice.subject AS '".$selectedfields[2]."'";
  166. }
  167. elseif($selectedfields[0] == 'vtiger_campaign' && $selectedfields[1] == 'product_id')//handled for product fields in Campaigns Module Reports
  168. {
  169. $columnslist[$fieldcolname] = "vtiger_productsCampaigns.productname AS '".$header_label."'";
  170. }
  171. elseif($selectedfields[0] == 'vtiger_products' && $selectedfields[1] == 'unit_price')//handled for product fields in Campaigns Module Reports
  172. {
  173. $columnslist[$fieldcolname] = "concat(".$selectedfields[0].".currency_id,'::',innerProduct.actual_unit_price) as '". $header_label ."'";
  174. }
  175. elseif(in_array($selectedfields[2], $this->append_currency_symbol_to_value)) {
  176. $columnslist[$fieldcolname] = "concat(".$selectedfields[0].".currency_id,'::',".$selectedfields[0].".".$selectedfields[1].") as '" . $header_label ."'";
  177. }
  178. 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
  179. {
  180. if($selectedfields[1] == 'filelocationtype'){
  181. $columnslist[$fieldcolname] = "case ".$selectedfields[0].".".$selectedfields[1]." when 'I' then 'Internal' when 'E' then 'External' else '-' end as '$selectedfields[2]'";
  182. } else if($selectedfields[1] == 'folderid'){
  183. $columnslist[$fieldcolname] = "vtiger_attachmentsfolder.foldername as '$selectedfields[2]'";
  184. } elseif($selectedfields[1] == 'filestatus'){
  185. $columnslist[$fieldcolname] = "case ".$selectedfields[0].".".$selectedfields[1]." when '1' then 'yes' when '0' then 'no' else '-' end as '$selectedfields[2]'";
  186. } elseif($selectedfields[1] == 'filesize'){
  187. $columnslist[$fieldcolname] = "case ".$selectedfields[0].".".$selectedfields[1]." when '' then '-' else concat(".$selectedfields[0].".".$selectedfields[1]."/1024,' ','KB') end as '$selectedfields[2]'";
  188. }
  189. }
  190. elseif($selectedfields[0] == 'vtiger_inventoryproductrel')//handled for product fields in Campaigns Module Reports
  191. {
  192. if($selectedfields[1] == 'discount'){
  193. $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 ."'";
  194. } else if($selectedfields[1] == 'productid'){
  195. $columnslist[$fieldcolname] = "vtiger_products{$module}.productname as '" . $header_label ."'";
  196. } else if($selectedfields[1] == 'serviceid'){
  197. $columnslist[$fieldcolname] = "vtiger_service{$module}.servicename as '" . $header_label ."'";
  198. } else {
  199. $columnslist[$fieldcolname] = $selectedfields[0].$module.".".$selectedfields[1]." as '".$header_label."'";
  200. }
  201. }
  202. elseif(stristr($selectedfields[1],'cf_')==true && stripos($selectedfields[1],'cf_')==0)
  203. {
  204. $columnslist[$fieldcolname] = $selectedfields[0].".".$selectedfields[1]." AS '".$adb->sql_escape_string(decode_html($header_label))."'";
  205. }
  206. else
  207. {
  208. $columnslist[$fieldcolname] = $selectedfields[0].".".$selectedfields[1]." AS '".$header_label."'";
  209. }
  210. }
  211. else
  212. {
  213. $columnslist[$fieldcolname] = $querycolumns;
  214. }
  215. }
  216. }
  217. if ($outputformat == "HTML") $columnslist['vtiger_crmentity:crmid:LBL_ACTION:crmid:I'] = 'vtiger_crmentity.crmid AS "LBL_ACTION"' ;
  218. // Save the information
  219. $this->_columnslist = $columnslist;
  220. $log->info("ReportRun :: Successfully returned getQueryColumnsList".$reportid);
  221. return $columnslist;
  222. }
  223. /** Function to get field columns based on profile
  224. * @ param $module : Type string
  225. * returns permitted fields in array format
  226. */
  227. function getaccesfield($module)
  228. {
  229. global $current_user;
  230. global $adb;
  231. $access_fields = Array();
  232. $profileList = getCurrentUserProfileList();
  233. $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";
  234. $params = array();
  235. if($module == "Calendar")
  236. {
  237. if (count($profileList) > 0) {
  238. $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 and vtiger_profile2field.profileid in (". generateQuestionMarks($profileList) .") group by vtiger_field.fieldid order by block,sequence";
  239. array_push($params, $profileList);
  240. } else {
  241. $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 group by vtiger_field.fieldid order by block,sequence";
  242. }
  243. }
  244. else
  245. {
  246. array_push($params, $this->primarymodule, $this->secondarymodule);
  247. if (count($profileList) > 0) {
  248. $query .= " vtiger_field.tabid in (select tabid from vtiger_tab where vtiger_tab.name in (?,?)) and vtiger_field.displaytype in (1,2,3) and vtiger_profile2field.visible=0 and vtiger_def_org_field.visible=0 and vtiger_profile2field.profileid in (". generateQuestionMarks($profileList) .") group by vtiger_field.fieldid order by block,sequence";
  249. array_push($params, $profileList);
  250. } else {
  251. $query .= " vtiger_field.tabid in (select tabid from vtiger_tab where vtiger_tab.name in (?,?)) and vtiger_field.displaytype in (1,2,3) and vtiger_profile2field.visible=0 and vtiger_def_org_field.visible=0 group by vtiger_field.fieldid order by block,sequence";
  252. }
  253. }
  254. $result = $adb->pquery($query, $params);
  255. while($collistrow = $adb->fetch_array($result))
  256. {
  257. $access_fields[] = $collistrow["fieldname"];
  258. }
  259. //added to include ticketid for Reports module in select columnlist for all users
  260. if($module == "HelpDesk")
  261. $access_fields[] = "ticketid";
  262. return $access_fields;
  263. }
  264. /** Function to get Escapedcolumns for the field in case of multiple parents
  265. * @ param $selectedfields : Type Array
  266. * returns the case query for the escaped columns
  267. */
  268. function getEscapedColumns($selectedfields)
  269. {
  270. global $current_user,$adb;
  271. $fieldname = $selectedfields[3];
  272. $tmp = split("_",$selectedfields[2]);
  273. $module = $tmp[0];
  274. if($fieldname == "parent_id" && ($module == "HelpDesk" || $module == "Calendar"))
  275. {
  276. if($module == "HelpDesk" && $selectedfields[0] == "vtiger_crmentityRelHelpDesk")
  277. {
  278. $querycolumn = "case vtiger_crmentityRelHelpDesk.setype when 'Accounts' then vtiger_accountRelHelpDesk.accountname when 'Contacts' then concat(vtiger_contactdetailsRelHelpDesk.lastname,' ',vtiger_contactdetailsRelHelpDesk.firstname) End"." '".$selectedfields[2]."', vtiger_crmentityRelHelpDesk.setype 'Entity_type'";
  279. return $querycolumn;
  280. }
  281. if($module == "Calendar") {
  282. $querycolumn = "case vtiger_crmentityRelCalendar.setype when 'Accounts' then vtiger_accountRelCalendar.accountname when 'Leads' then concat(vtiger_leaddetailsRelCalendar.lastname,' ',vtiger_leaddetailsRelCalendar.firstname) when 'Potentials' then vtiger_potentialRelCalendar.potentialname when 'Quotes' then vtiger_quotesRelCalendar.subject when 'PurchaseOrder' then vtiger_purchaseorderRelCalendar.subject when 'Invoice' then vtiger_invoiceRelCalendar.subject when 'SalesOrder' then vtiger_salesorderRelCalendar.subject when 'HelpDesk' then vtiger_troubleticketsRelCalendar.title when 'Campaigns' then vtiger_campaignRelCalendar.campaignname End"." '".$selectedfields[2]."', vtiger_crmentityRelCalendar.setype 'Entity_type'";
  283. }
  284. } elseif($fieldname == "contact_id" && strpos($selectedfields[2],"Contact_Name")) {
  285. if(($this->primarymodule == 'PurchaseOrder' || $this->primarymodule == 'SalesOrder' || $this->primarymodule == 'Quotes' || $this->primarymodule == 'Invoice' || $this->primarymodule == 'Calendar') && $module==$this->primarymodule) {
  286. if (getFieldVisibilityPermission("Contacts", $current_user->id, "firstname") == '0')
  287. $querycolumn = " case when vtiger_crmentity.crmid!='' then concat(vtiger_contactdetails".$this->primarymodule.".lastname,' ',vtiger_contactdetails".$this->primarymodule.".firstname) else '-' end as ".$selectedfields[2];
  288. else
  289. $querycolumn = " case when vtiger_crmentity.crmid!='' then vtiger_contactdetails".$this->primarymodule.".lastname else '-' end as ".$selectedfields[2];
  290. }
  291. if(stristr($this->secondarymodule,$module) && ($module== 'Quotes' || $module== 'SalesOrder' || $module== 'PurchaseOrder' ||$module== 'Calendar' || $module == 'Invoice')) {
  292. if (getFieldVisibilityPermission("Contacts", $current_user->id, "firstname") == '0')
  293. $querycolumn = " case when vtiger_crmentity".$module.".crmid!='' then concat(vtiger_contactdetails".$module.".lastname,' ',vtiger_contactdetails".$module.".firstname) else '-' end as ".$selectedfields[2];
  294. else
  295. $querycolumn = " case when vtiger_crmentity".$module.".crmid!='' then vtiger_contactdetails".$module.".lastname else '-' end as ".$selectedfields[2];
  296. }
  297. }
  298. else{
  299. if(stristr($selectedfields[0],"vtiger_crmentityRel")){
  300. $module = str_replace("vtiger_crmentityRel","",$selectedfields[0]);
  301. $fields_query = $adb->pquery("SELECT vtiger_field.fieldname,vtiger_field.tablename,vtiger_field.fieldid from vtiger_field INNER JOIN vtiger_tab on vtiger_tab.name = ? WHERE vtiger_tab.tabid=vtiger_field.tabid and vtiger_field.fieldname=?",array($module,$selectedfields[3]));
  302. if($adb->num_rows($fields_query)>0){
  303. for($i=0;$i<$adb->num_rows($fields_query);$i++){
  304. $field_name = $selectedfields[3];
  305. $field_id = $adb->query_result($fields_query,$i,'fieldid');
  306. $tab_name = $selectedfields[1];
  307. $ui10_modules_query = $adb->pquery("SELECT relmodule FROM vtiger_fieldmodulerel WHERE fieldid=?",array($field_id));
  308. if($adb->num_rows($ui10_modules_query)>0){
  309. $querycolumn = " case vtiger_crmentityRel$module$field_id.setype";
  310. for($j=0;$j<$adb->num_rows($ui10_modules_query);$j++){
  311. $rel_mod = $adb->query_result($ui10_modules_query,$j,'relmodule');
  312. $rel_obj = CRMEntity::getInstance($rel_mod);
  313. vtlib_setup_modulevars($rel_mod, $rel_obj);
  314. $rel_tab_name = $rel_obj->table_name;
  315. $link_field = $rel_tab_name."Rel".$module.".".$rel_obj->list_link_field;
  316. if($rel_mod=="Contacts" || $rel_mod=="Leads"){
  317. if(getFieldVisibilityPermission($rel_mod,$current_user->id,'firstname')==0){
  318. $link_field = "concat($link_field,' ',".$rel_tab_name."Rel$module"."_via_field".$field_id.".firstname)";
  319. }
  320. }
  321. $querycolumn.= " when '$rel_mod' then $link_field ";
  322. }
  323. $querycolumn .= "end as '".$selectedfields[2]."', vtiger_crmentityRel$module$field_id.setype as 'Entity_type'" ;
  324. }
  325. }
  326. }
  327. }
  328. if($fieldname == 'creator'){
  329. $querycolumn .= "case when (vtiger_usersModComments.user_name not like '' and vtiger_crmentity.crmid!='') then vtiger_usersModComments.user_name end as 'ModComments_Creator'";
  330. }
  331. }
  332. return $querycolumn;
  333. }
  334. /** Function to get selectedcolumns for the given reportid
  335. * @ param $reportid : Type Integer
  336. * returns the query of columnlist for the selected columns
  337. */
  338. function getSelectedColumnsList($reportid)
  339. {
  340. global $adb;
  341. global $modules;
  342. global $log;
  343. $ssql = "select vtiger_selectcolumn.* from vtiger_report inner join vtiger_selectquery on vtiger_selectquery.queryid = vtiger_report.queryid";
  344. $ssql .= " left join vtiger_selectcolumn on vtiger_selectcolumn.queryid = vtiger_selectquery.queryid where vtiger_report.reportid = ? ";
  345. $ssql .= " order by vtiger_selectcolumn.columnindex";
  346. $result = $adb->pquery($ssql, array($reportid));
  347. $noofrows = $adb->num_rows($result);
  348. if ($this->orderbylistsql != "")
  349. {
  350. $sSQL .= $this->orderbylistsql.", ";
  351. }
  352. for($i=0; $i<$noofrows; $i++)
  353. {
  354. $fieldcolname = $adb->query_result($result,$i,"columnname");
  355. $ordercolumnsequal = true;
  356. if($fieldcolname != "")
  357. {
  358. for($j=0;$j<count($this->orderbylistcolumns);$j++)
  359. {
  360. if($this->orderbylistcolumns[$j] == $fieldcolname)
  361. {
  362. $ordercolumnsequal = false;
  363. break;
  364. }else
  365. {
  366. $ordercolumnsequal = true;
  367. }
  368. }
  369. if($ordercolumnsequal)
  370. {
  371. $selectedfields = explode(":",$fieldcolname);
  372. if($selectedfields[0] == "vtiger_crmentity".$this->primarymodule)
  373. $selectedfields[0] = "vtiger_crmentity";
  374. $sSQLList[] = $selectedfields[0].".".$selectedfields[1]." '".$selectedfields[2]."'";
  375. }
  376. }
  377. }
  378. $sSQL .= implode(",",$sSQLList);
  379. $log->info("ReportRun :: Successfully returned getSelectedColumnsList".$reportid);
  380. return $sSQL;
  381. }
  382. /** Function to get advanced comparator in query form for the given Comparator and value
  383. * @ param $comparator : Type String
  384. * @ param $value : Type String
  385. * returns the check query for the comparator
  386. */
  387. function getAdvComparator($comparator,$value,$datatype="")
  388. {
  389. global $log,$adb,$default_charset,$ogReport;
  390. $value=html_entity_decode(trim($value),ENT_QUOTES,$default_charset);
  391. $value_len = strlen($value);
  392. $is_field = false;
  393. if($value[0]=='$' && $value[$value_len-1]=='$'){
  394. $temp = str_replace('$','',$value);
  395. $is_field = true;
  396. }
  397. if($datatype=='C'){
  398. $value = str_replace("yes","1",str_replace("no","0",$value));
  399. }
  400. if($is_field==true){
  401. $value = $this->getFilterComparedField($temp);
  402. }
  403. if($comparator == "e")
  404. {
  405. if(trim($value) == "NULL")
  406. {
  407. $rtvalue = " is NULL";
  408. }elseif(trim($value) != "")
  409. {
  410. $rtvalue = " = ".$adb->quote($value);
  411. }elseif(trim($value) == "" && $datatype == "V")
  412. {
  413. $rtvalue = " = ".$adb->quote($value);
  414. }else
  415. {
  416. $rtvalue = " is NULL";
  417. }
  418. }
  419. if($comparator == "n")
  420. {
  421. if(trim($value) == "NULL")
  422. {
  423. $rtvalue = " is NOT NULL";
  424. }elseif(trim($value) != "")
  425. {
  426. $rtvalue = " <> ".$adb->quote($value);
  427. }elseif(trim($value) == "" && $datatype == "V")
  428. {
  429. $rtvalue = " <> ".$adb->quote($value);
  430. }else
  431. {
  432. $rtvalue = " is NOT NULL";
  433. }
  434. }
  435. if($comparator == "s")
  436. {
  437. $rtvalue = " like '". formatForSqlLike($value, 2,$is_field) ."'";
  438. }
  439. if($comparator == "ew")
  440. {
  441. $rtvalue = " like '". formatForSqlLike($value, 1,$is_field) ."'";
  442. }
  443. if($comparator == "c")
  444. {
  445. $rtvalue = " like '". formatForSqlLike($value,0,$is_field) ."'";
  446. }
  447. if($comparator == "k")
  448. {
  449. $rtvalue = " not like '". formatForSqlLike($value,0,$is_field) ."'";
  450. }
  451. if($comparator == "l")
  452. {
  453. $rtvalue = " < ".$adb->quote($value);
  454. }
  455. if($comparator == "g")
  456. {
  457. $rtvalue = " > ".$adb->quote($value);
  458. }
  459. if($comparator == "m")
  460. {
  461. $rtvalue = " <= ".$adb->quote($value);
  462. }
  463. if($comparator == "h")
  464. {
  465. $rtvalue = " >= ".$adb->quote($value);
  466. }
  467. if($comparator == "b") {
  468. $rtvalue = " < ".$adb->quote($value);
  469. }
  470. if($comparator == "a") {
  471. $rtvalue = " > ".$adb->quote($value);
  472. }
  473. if($is_field==true){
  474. $rtvalue = str_replace("'","",$rtvalue);
  475. $rtvalue = str_replace("\\","",$rtvalue);
  476. }
  477. $log->info("ReportRun :: Successfully returned getAdvComparator");
  478. return $rtvalue;
  479. }
  480. /** Function to get field that is to be compared in query form for the given Comparator and field
  481. * @ param $field : field
  482. * returns the value for the comparator
  483. */
  484. function getFilterComparedField($field){
  485. global $adb,$ogReport;
  486. $field = split('#',$field);
  487. $module = $field[0];
  488. $fieldname = trim($field[1]);
  489. $tabid = getTabId($module);
  490. $field_query = $adb->pquery("SELECT tablename,columnname,typeofdata,fieldname,uitype FROM vtiger_field WHERE tabid = ? AND fieldname= ?",array($tabid,$fieldname));
  491. $fieldtablename = $adb->query_result($field_query,0,'tablename');
  492. $fieldcolname = $adb->query_result($field_query,0,'columnname');
  493. $typeofdata = $adb->query_result($field_query,0,'typeofdata');
  494. $fieldtypeofdata=ChangeTypeOfData_Filter($fieldtablename,$fieldcolname,$typeofdata[0]);
  495. $uitype = $adb->query_result($field_query,0,'uitype');
  496. /*if($tr[0]==$ogReport->primodule)
  497. $value = $adb->query_result($field_query,0,'tablename').".".$adb->query_result($field_query,0,'columnname');
  498. else
  499. $value = $adb->query_result($field_query,0,'tablename').$tr[0].".".$adb->query_result($field_query,0,'columnname');
  500. */
  501. if($uitype == 68 || $uitype == 59)
  502. {
  503. $fieldtypeofdata = 'V';
  504. }
  505. if($fieldtablename == "vtiger_crmentity")
  506. {
  507. $fieldtablename = $fieldtablename.$module;
  508. }
  509. if($fieldname == "assigned_user_id")
  510. {
  511. $fieldtablename = "vtiger_users".$module;
  512. $fieldcolname = "user_name";
  513. }
  514. if($fieldname == "account_id")
  515. {
  516. $fieldtablename = "vtiger_account".$module;
  517. $fieldcolname = "accountname";
  518. }
  519. if($fieldname == "contact_id")
  520. {
  521. $fieldtablename = "vtiger_contactdetails".$module;
  522. $fieldcolname = "lastname";
  523. }
  524. if($fieldname == "parent_id")
  525. {
  526. $fieldtablename = "vtiger_crmentityRel".$module;
  527. $fieldcolname = "setype";
  528. }
  529. if($fieldname == "vendor_id")
  530. {
  531. $fieldtablename = "vtiger_vendorRel".$module;
  532. $fieldcolname = "vendorname";
  533. }
  534. if($fieldname == "potential_id")
  535. {
  536. $fieldtablename = "vtiger_potentialRel".$module;
  537. $fieldcolname = "potentialname";
  538. }
  539. if($fieldname == "assigned_user_id1")
  540. {
  541. $fieldtablename = "vtiger_usersRel1";
  542. $fieldcolname = "user_name";
  543. }
  544. if($fieldname == 'quote_id')
  545. {
  546. $fieldtablename = "vtiger_quotes".$module;
  547. $fieldcolname = "subject";
  548. }
  549. if($fieldname == 'product_id' && $fieldtablename == 'vtiger_troubletickets')
  550. {
  551. $fieldtablename = "vtiger_productsRel";
  552. $fieldcolname = "productname";
  553. }
  554. if($fieldname == 'product_id' && $fieldtablename == 'vtiger_campaign')
  555. {
  556. $fieldtablename = "vtiger_productsCampaigns";
  557. $fieldcolname = "productname";
  558. }
  559. if($fieldname == 'product_id' && $fieldtablename == 'vtiger_products')
  560. {
  561. $fieldtablename = "vtiger_productsProducts";
  562. $fieldcolname = "productname";
  563. }
  564. if($fieldname == 'campaignid' && $module=='Potentials')
  565. {
  566. $fieldtablename = "vtiger_campaign".$module;
  567. $fieldcolname = "campaignname";
  568. }
  569. $value = $fieldtablename.".".$fieldcolname;
  570. return $value;
  571. }
  572. /** Function to get the advanced filter columns for the reportid
  573. * This function accepts the $reportid
  574. * This function returns $columnslist Array($columnname => $tablename:$columnname:$fieldlabel:$fieldname:$typeofdata=>$tablename.$columnname filtercriteria,
  575. * $tablename1:$columnname1:$fieldlabel1:$fieldname1:$typeofdata1=>$tablename1.$columnname1 filtercriteria,
  576. * |
  577. * $tablenamen:$columnnamen:$fieldlabeln:$fieldnamen:$typeofdatan=>$tablenamen.$columnnamen filtercriteria
  578. * )
  579. *
  580. */
  581. function getAdvFilterSql($reportid)
  582. {
  583. // Have we initialized information already?
  584. if($this->_advfiltersql !== false) {
  585. return $this->_advfiltersql;
  586. }
  587. global $adb;
  588. global $modules;
  589. global $log;
  590. $advfiltersql = "";
  591. $advfiltergroupssql = "SELECT * FROM vtiger_relcriteria_grouping WHERE queryid = ? ORDER BY groupid";
  592. $advfiltergroups = $adb->pquery($advfiltergroupssql, array($reportid));
  593. $numgrouprows = $adb->num_rows($advfiltergroups);
  594. $groupctr =0;
  595. while($advfiltergroup = $adb->fetch_array($advfiltergroups)) {
  596. $groupctr++;
  597. $groupid = $advfiltergroup["groupid"];
  598. $groupcondition = $advfiltergroup["group_condition"];
  599. $advfiltercolumnssql = "select vtiger_relcriteria.* from vtiger_report";
  600. $advfiltercolumnssql .= " inner join vtiger_selectquery on vtiger_selectquery.queryid = vtiger_report.queryid";
  601. $advfiltercolumnssql .= " left join vtiger_relcriteria on vtiger_relcriteria.queryid = vtiger_selectquery.queryid";
  602. $advfiltercolumnssql .= " where vtiger_report.reportid = ? AND vtiger_relcriteria.groupid = ?";
  603. $advfiltercolumnssql .= " order by vtiger_relcriteria.columnindex";
  604. $result = $adb->pquery($advfiltercolumnssql, array($reportid, $groupid));
  605. $noofrows = $adb->num_rows($result);
  606. if($noofrows > 0) {
  607. $advfiltergroupsql = "";
  608. $columnctr = 0;
  609. while($advfilterrow = $adb->fetch_array($result)) {
  610. $columnctr++;
  611. $fieldcolname = $advfilterrow["columnname"];
  612. $comparator = $advfilterrow["comparator"];
  613. $value = $advfilterrow["value"];
  614. $columncondition = $advfilterrow["column_condition"];
  615. if($fieldcolname != "" && $comparator != "") {
  616. $selectedfields = explode(":",$fieldcolname);
  617. //Added to handle yes or no for checkbox field in reports advance filters. -shahul
  618. if($selectedfields[4] == 'C') {
  619. if(strcasecmp(trim($value),"yes")==0)
  620. $value="1";
  621. if(strcasecmp(trim($value),"no")==0)
  622. $value="0";
  623. }
  624. $valuearray = explode(",",trim($value));
  625. $datatype = (isset($selectedfields[4])) ? $selectedfields[4] : "";
  626. if(isset($valuearray) && count($valuearray) > 1 && $comparator != 'bw') {
  627. $advcolumnsql = "";
  628. for($n=0;$n<count($valuearray);$n++) {
  629. if($selectedfields[0] == 'vtiger_crmentityRelHelpDesk' && $selectedfields[1]=='setype') {
  630. $advcolsql[] = "(case vtiger_crmentityRelHelpDesk.setype when 'Accounts' then vtiger_accountRelHelpDesk.accountname else concat(vtiger_contactdetailsRelHelpDesk.lastname,' ',vtiger_contactdetailsRelHelpDesk.firstname) end) ". $this->getAdvComparator($comparator,trim($valuearray[$n]),$datatype);
  631. } elseif($selectedfields[0] == 'vtiger_crmentityRelCalendar' && $selectedfields[1]=='setype') {
  632. $advcolsql[] = "(case vtiger_crmentityRelHelpDesk.setype when 'Accounts' then vtiger_accountRelHelpDesk.accountname else concat(vtiger_contactdetailsRelHelpDesk.lastname,' ',vtiger_contactdetailsRelHelpDesk.firstname) end) ". $this->getAdvComparator($comparator,trim($valuearray[$n]),$datatype);
  633. } elseif(($selectedfields[0] == "vtiger_users".$this->primarymodule || $selectedfields[0] == "vtiger_users".$this->secondarymodule) && $selectedfields[1] == 'user_name') {
  634. $module_from_tablename = str_replace("vtiger_users","",$selectedfields[0]);
  635. if($this->primarymodule == 'Products') {
  636. $advcolsql[] = ($selectedfields[0].".user_name ".$this->getAdvComparator($comparator,trim($valuearray[$n]),$datatype));
  637. } else {
  638. $advcolsql[] = " ".$selectedfields[0].".user_name".$this->getAdvComparator($comparator,trim($valuearray[$n]),$datatype)." or vtiger_groups".$module_from_tablename.".groupname ".$this->getAdvComparator($comparator,trim($valuearray[$n]),$datatype);
  639. }
  640. } elseif($selectedfields[1] == 'status') {//when you use comma seperated values.
  641. if($selectedfields[2] == 'Calendar_Status')
  642. $advcolsql[] = "(case when (vtiger_activity.status not like '') then vtiger_activity.status else vtiger_activity.eventstatus end)".$this->getAdvComparator($comparator,trim($valuearray[$n]),$datatype);
  643. elseif($selectedfields[2] == 'HelpDesk_Status')
  644. $advcolsql[] = "vtiger_troubletickets.status".$this->getAdvComparator($comparator,trim($valuearray[$n]),$datatype);
  645. } elseif($selectedfields[1] == 'description') {//when you use comma seperated values.
  646. if($selectedfields[0]=='vtiger_crmentity'.$this->primarymodule)
  647. $advcolsql[] = "vtiger_crmentity.description".$this->getAdvComparator($comparator,trim($valuearray[$n]),$datatype);
  648. else
  649. $advcolsql[] = $selectedfields[0].".".$selectedfields[1].$this->getAdvComparator($comparator,trim($valuearray[$n]),$datatype);
  650. } else {
  651. $advcolsql[] = $selectedfields[0].".".$selectedfields[1].$this->getAdvComparator($comparator,trim($valuearray[$n]),$datatype);
  652. }
  653. }
  654. //If negative logic filter ('not equal to', 'does not contain') is used, 'and' condition should be applied instead of 'or'
  655. if($comparator == 'n' || $comparator == 'k')
  656. $advcolumnsql = implode(" and ",$advcolsql);
  657. else
  658. $advcolumnsql = implode(" or ",$advcolsql);
  659. $fieldvalue = " (".$advcolumnsql.") ";
  660. } elseif(($selectedfields[0] == "vtiger_users".$this->primarymodule || $selectedfields[0] == "vtiger_users".$this->secondarymodule) && $selectedfields[1] == 'user_name') {
  661. $module_from_tablename = str_replace("vtiger_users","",$selectedfields[0]);
  662. if($this->primarymodule == 'Products') {
  663. $fieldvalue = ($selectedfields[0].".user_name ".$this->getAdvComparator($comparator,trim($value),$datatype));
  664. } else {
  665. $fieldvalue = " case when (".$selectedfields[0].".user_name not like '') then ".$selectedfields[0].".user_name else vtiger_groups".$module_from_tablename.".groupname end ".$this->getAdvComparator($comparator,trim($value),$datatype);
  666. }
  667. } elseif($selectedfields[0] == "vtiger_crmentity".$this->primarymodule) {
  668. $fieldvalue = "vtiger_crmentity.".$selectedfields[1]." ".$this->getAdvComparator($comparator,trim($value),$datatype);
  669. } elseif($selectedfields[0] == 'vtiger_crmentityRelHelpDesk' && $selectedfields[1]=='setype') {
  670. $fieldvalue = "(vtiger_accountRelHelpDesk.accountname ".$this->getAdvComparator($comparator,trim($value),$datatype)." or vtiger_contactdetailsRelHelpDesk.lastname ".$this->getAdvComparator($comparator,trim($value),$datatype)." or vtiger_contactdetailsRelHelpDesk.firstname ".$this->getAdvComparator($comparator,trim($value),$datatype).")";
  671. } elseif($selectedfields[0] == 'vtiger_crmentityRelCalendar' && $selectedfields[1]=='setype') {
  672. $fieldvalue = "(vtiger_accountRelCalendar.accountname ".$this->getAdvComparator($comparator,trim($value),$datatype)." or concat(vtiger_leaddetailsRelCalendar.lastname,' ',vtiger_leaddetailsRelCalendar.firstname) ".$this->getAdvComparator($comparator,trim($value),$datatype)." or vtiger_potentialRelCalendar.potentialname ".$this->getAdvComparator($comparator,trim($value),$datatype)." or vtiger_invoiceRelCalendar.subject ".$this->getAdvComparator($comparator,trim($value),$datatype)." or vtiger_quotesRelCalendar.subject ".$this->getAdvComparator($comparator,trim($value),$datatype)." or vtiger_purchaseorderRelCalendar.subject ".$this->getAdvComparator($comparator,trim($value),$datatype)." or vtiger_salesorderRelCalendar.subject ".$this->getAdvComparator($comparator,trim($value),$datatype)." or vtiger_troubleticketsRelCalendar.title ".$this->getAdvComparator($comparator,trim($value),$datatype)." or vtiger_campaignRelCalendar.campaignname ".$this->getAdvComparator($comparator,trim($value),$datatype).")";
  673. } elseif($selectedfields[0] == "vtiger_activity" && $selectedfields[1] == 'status') {
  674. $fieldvalue = "(case when (vtiger_activity.status not like '') then vtiger_activity.status else vtiger_activity.eventstatus end)".$this->getAdvComparator($comparator,trim($value),$datatype);
  675. } elseif($selectedfields[3] == "contact_id" && strpos($selectedfields[2],"Contact_Name")) {
  676. if($this->primarymodule == 'PurchaseOrder' || $this->primarymodule == 'SalesOrder' || $this->primarymodule == 'Quotes' || $this->primarymodule == 'Invoice' || $this->primarymodule == 'Calendar')
  677. $fieldvalue = "concat(vtiger_contactdetails". $this->primarymodule .".lastname,' ',vtiger_contactdetails". $this->primarymodule .".firstname)".$this->getAdvComparator($comparator,trim($value),$datatype);
  678. if($this->secondarymodule == 'Quotes' || $this->secondarymodule == 'Invoice')
  679. $fieldvalue = "concat(vtiger_contactdetails". $this->secondarymodule .".lastname,' ',vtiger_contactdetails". $this->secondarymodule .".firstname)".$this->getAdvComparator($comparator,trim($value),$datatype);
  680. } elseif($comparator == 'e' && (trim($value) == "NULL" || trim($value) == '')) {
  681. $fieldvalue = "(".$selectedfields[0].".".$selectedfields[1]." IS NULL OR ".$selectedfields[0].".".$selectedfields[1]." = '')";
  682. } elseif($comparator == 'bw' && count($valuearray) == 2) {
  683. $fieldvalue = "(".$selectedfields[0].".".$selectedfields[1]." between '".trim($valuearray[0])."' and '".trim($valuearray[1])."')";
  684. } else {
  685. $fieldvalue = $selectedfields[0].".".$selectedfields[1].$this->getAdvComparator($comparator,trim($value),$datatype);
  686. }
  687. $advfiltergroupsql .= $fieldvalue;
  688. if($columncondition != NULL && $columncondition != '' && $noofrows > $columnctr ) {
  689. $advfiltergroupsql .= ' '.$columncondition.' ';
  690. }
  691. }
  692. }
  693. if (trim($advfiltergroupsql) != "") {
  694. $advfiltergroupsql = "( $advfiltergroupsql ) ";
  695. if($groupcondition != NULL && $groupcondition != '' && $numgrouprows > $groupctr) {
  696. $advfiltergroupsql .= ' '. $groupcondition . ' ';
  697. }
  698. $advfiltersql .= $advfiltergroupsql;
  699. }
  700. }
  701. }
  702. if (trim($advfiltersql) != "") $advfiltersql = '('.$advfiltersql.')';
  703. // Save the information
  704. $this->_advfiltersql = $advfiltersql;
  705. $log->info("ReportRun :: Successfully returned getAdvFilterSql".$reportid);
  706. return $advfiltersql;
  707. }
  708. /** Function to get the Standard filter columns for the reportid
  709. * This function accepts the $reportid datatype Integer
  710. * This function returns $stdfilterlist Array($columnname => $tablename:$columnname:$fieldlabel:$fieldname:$typeofdata=>$tablename.$columnname filtercriteria,
  711. * $tablename1:$columnname1:$fieldlabel1:$fieldname1:$typeofdata1=>$tablename1.$columnname1 filtercriteria,
  712. * )
  713. *
  714. */
  715. function getStdFilterList($reportid)
  716. {
  717. // Have we initialized information already?
  718. if($this->_stdfilterlist !== false) {
  719. return $this->_stdfilterlist;
  720. }
  721. global $adb;
  722. global $modules;
  723. global $log;
  724. $stdfiltersql = "select vtiger_reportdatefilter.* from vtiger_report";
  725. $stdfiltersql .= " inner join vtiger_reportdatefilter on vtiger_report.reportid = vtiger_reportdatefilter.datefilterid";
  726. $stdfiltersql .= " where vtiger_report.reportid = ?";
  727. $result = $adb->pquery($stdfiltersql, array($reportid));
  728. $stdfilterrow = $adb->fetch_array($result);
  729. if(isset($stdfilterrow))
  730. {
  731. $fieldcolname = $stdfilterrow["datecolumnname"];
  732. $datefilter = $stdfilterrow["datefilter"];
  733. $startdate = $stdfilterrow["startdate"];
  734. $enddate = $stdfilterrow["enddate"];
  735. if($fieldcolname != "none")
  736. {
  737. $selectedfields = explode(":",$fieldcolname);
  738. if($selectedfields[0] == "vtiger_crmentity".$this->primarymodule)
  739. $selectedfields[0] = "vtiger_crmentity";
  740. if($datefilter == "custom")
  741. {
  742. if($startdate != "0000-00-00" && $enddate != "0000-00-00" && $selectedfields[0] != "" && $selectedfields[1] != "")
  743. {
  744. $stdfilterlist[$fieldcolname] = $selectedfields[0].".".$selectedfields[1]." between '".$startdate." 00:00:00' and '".$enddate." 23:59:59'";
  745. }
  746. }else
  747. {
  748. $startenddate = $this->getStandarFiltersStartAndEndDate($datefilter);
  749. if($startenddate[0] != "" && $startenddate[1] != "" && $selectedfields[0] != "" && $selectedfields[1] != "")
  750. {
  751. $stdfilterlist[$fieldcolname] = $selectedfields[0].".".$selectedfields[1]." between '".$startenddate[0]." 00:00:00' and '".$startenddate[1]." 23:59:59'";
  752. }
  753. }
  754. }
  755. }
  756. // Save the information
  757. $this->_stdfilterlist = $stdfilterlist;
  758. $log->info("ReportRun :: Successfully returned getStdFilterList".$reportid);
  759. return $stdfilterlist;
  760. }
  761. /** Function to get the RunTime filter columns for the given $filtercolumn,$filter,$startdate,$enddate
  762. * @ param $filtercolumn : Type String
  763. * @ param $filter : Type String
  764. * @ param $startdate: Type String
  765. * @ param $enddate : Type String
  766. * This function returns $stdfilterlist Array($columnname => $tablename:$columnname:$fieldlabel=>$tablename.$columnname 'between' $startdate 'and' $enddate)
  767. *
  768. */
  769. function RunTimeFilter($filtercolumn,$filter,$startdate,$enddate)
  770. {
  771. if($filtercolumn != "none")
  772. {
  773. $selectedfields = explode(":",$filtercolumn);
  774. if($selectedfields[0] == "vtiger_crmentity".$this->primarymodule)
  775. $selectedfields[0] = "vtiger_crmentity";
  776. if($filter == "custom")
  777. {
  778. if($startdate != "" && $enddate != "" && $selectedfields[0] != "" && $selectedfields[1] != "")
  779. {
  780. $stdfilterlist[$filtercolumn] = $selectedfields[0].".".$selectedfields[1]." between '".$startdate." 00:00:00' and '".$enddate." 23:59:00'";
  781. }
  782. }else
  783. {
  784. if($startdate != "" && $enddate != "")
  785. {
  786. $startenddate = $this->getStandarFiltersStartAndEndDate($filter);
  787. if($startenddate[0] != "" && $startenddate[1] != "" && $selectedfields[0] != "" && $selectedfields[1] != "")
  788. {
  789. $stdfilterlist[$filtercolumn] = $selectedfields[0].".".$selectedfields[1]." between '".$startenddate[0]." 00:00:00' and '".$startenddate[1]." 23:59:00'";
  790. }
  791. }
  792. }
  793. }
  794. return $stdfilterlist;
  795. }
  796. /** Function to get standardfilter for the given reportid
  797. * @ param $reportid : Type Integer
  798. * returns the query of columnlist for the selected columns
  799. */
  800. function getStandardCriterialSql($reportid)
  801. {
  802. global $adb;
  803. global $modules;
  804. global $log;
  805. $sreportstdfiltersql = "select vtiger_reportdatefilter.* from vtiger_report";
  806. $sreportstdfiltersql .= " inner join vtiger_reportdatefilter on vtiger_report.reportid = vtiger_reportdatefilter.datefilterid";
  807. $sreportstdfiltersql .= " where vtiger_report.reportid = ?";
  808. $result = $adb->pquery($sreportstdfiltersql, array($reportid));
  809. $noofrows = $adb->num_rows($result);
  810. for($i=0; $i<$noofrows; $i++)
  811. {
  812. $fieldcolname = $adb->query_result($result,$i,"datecolumnname");
  813. $datefilter = $adb->query_result($result,$i,"datefilter");
  814. $startdate = $adb->query_result($result,$i,"startdate");
  815. $enddate = $adb->query_result($result,$i,"enddate");
  816. if($fieldcolname != "none")
  817. {
  818. $selectedfields = explode(":",$fieldcolname);
  819. if($selectedfields[0] == "vtiger_crmentity".$this->primarymodule)
  820. $selectedfields[0] = "vtiger_crmentity";
  821. if($datefilter == "custom")
  822. {
  823. if($startdate != "0000-00-00" && $enddate != "0000-00-00" && $selectedfields[0] != "" && $selectedfields[1] != "")
  824. {
  825. $sSQL .= $selectedfields[0].".".$selectedfields[1]." between '".$startdate."' and '".$enddate."'";
  826. }
  827. }else
  828. {
  829. $startenddate = $this->getStandarFiltersStartAndEndDate($datefilter);
  830. if($startenddate[0] != "" && $startenddate[1] != "" && $selectedfields[0] != "" && $selectedfields[1] != "")
  831. {
  832. $sSQL .= $selectedfields[0].".".$selectedfields[1]." between '".$startenddate[0]."' and '".$startenddate[1]."'";
  833. }
  834. }
  835. }
  836. }
  837. $log->info("ReportRun :: Successfully returned getStandardCriterialSql".$reportid);
  838. return $sSQL;
  839. }
  840. /** Function to get standardfilter startdate and enddate for the given type
  841. * @ param $type : Type String
  842. * returns the $datevalue Array in the given format
  843. * $datevalue = Array(0=>$startdate,1=>$enddate)
  844. */
  845. function getStandarFiltersStartAndEndDate($type)
  846. {
  847. $today = date("Y-m-d",mktime(0, 0, 0, date("m") , date("d"), date("Y")));
  848. $tomorrow = date("Y-m-d",mktime(0, 0, 0, date("m") , date("d")+1, date("Y")));
  849. $yesterday = date("Y-m-d",mktime(0, 0, 0, date("m") , date("d")-1, date("Y")));
  850. $currentmonth0 = date("Y-m-d",mktime(0, 0, 0, date("m"), "01", date("Y")));
  851. $currentmonth1 = date("Y-m-t");
  852. $lastmonth0 = date("Y-m-d",mktime(0, 0, 0, date("m")-1, "01", date("Y")));
  853. $lastmonth1 = date("Y-m-t", strtotime("-1 Month"));
  854. $nextmonth0 = date("Y-m-d",mktime(0, 0, 0, date("m")+1, "01", date("Y")));
  855. $nextmonth1 = date("Y-m-t", strtotime("+1 Month"));
  856. $lastweek0 = date("Y-m-d",strtotime("-2 week Sunday"));
  857. $lastweek1 = date("Y-m-d",strtotime("-1 week Saturday"));
  858. $thisweek0 = date("Y-m-d",strtotime("-1 week Sunday"));
  859. $thisweek1 = date("Y-m-d",strtotime("this Saturday"));
  860. $nextweek0 = date("Y-m-d",strtotime("this Sunday"));
  861. $nextweek1 = date("Y-m-d",strtotime("+1 week Saturday"));
  862. $next7days = date("Y-m-d",mktime(0, 0, 0, date("m") , date("d")+6, date("Y")));
  863. $next30days = date("Y-m-d",mktime(0, 0, 0, date("m") , date("d")+29, date("Y")));
  864. $next60days = date("Y-m-d",mktime(0, 0, 0, date("m") , date("d")+59, date("Y")));
  865. $next90days = date("Y-m-d",mktime(0, 0, 0, date("m") , date("d")+89, date("Y")));
  866. $next120days = date("Y-m-d",mktime(0, 0, 0, date("m") , date("d")+119, date("Y")));
  867. $last7days = date("Y-m-d",mktime(0, 0, 0, date("m") , date("d")-6, date("Y")));
  868. $last30days = date("Y-m-d",mktime(0, 0, 0, date("m") , date("d")-29, date("Y")));
  869. $last60days = date("Y-m-d",mktime(0, 0, 0, date("m") , date("d")-59, date("Y")));
  870. $last90days = date("Y-m-d",mktime(0, 0, 0, date("m") , date("d")-89, date("Y")));
  871. $last120days = date("Y-m-d",mktime(0, 0, 0, date("m") , date("d")-119, date("Y")));
  872. $currentFY0 = date("Y-m-d",mktime(0, 0, 0, "01", "01", date("Y")));
  873. $currentFY1 = date("Y-m-t",mktime(0, 0, 0, "12", date("d"), date("Y")));
  874. $lastFY0 = date("Y-m-d",mktime(0, 0, 0, "01", "01", date("Y")-1));
  875. $lastFY1 = date("Y-m-t", mktime(0, 0, 0, "12", date("d"), date("Y")-1));
  876. $nextFY0 = date("Y-m-d",mktime(0, 0, 0, "01", "01", date("Y")+1));
  877. $nextFY1 = date("Y-m-t", mktime(0, 0, 0, "12", date("d"), date("Y")+1));
  878. if(date("m") <= 3)
  879. {
  880. $cFq = date("Y-m-d",mktime(0, 0, 0, "01","01",date("Y")));
  881. $cFq1 = date("Y-m-d",mktime(0, 0, 0, "03","31",date("Y")));
  882. $nFq = date("Y-m-d",mktime(0, 0, 0, "04","01",date("Y")));
  883. $nFq1 = date("Y-m-d",mktime(0, 0, 0, "06","30",date("Y")));
  884. $pFq = date("Y-m-d",mktime(0, 0, 0, "10","01",date("Y")-1));
  885. $pFq1 = date("Y-m-d",mktime(0, 0, 0, "12","31",date("Y")-1));
  886. }else if(date("m") > 3 and date("m") <= 6)
  887. {
  888. $pFq = date("Y-m-d",mktime(0, 0, 0, "01","01",date("Y")));
  889. $pFq1 = date("Y-m-d",mktime(0, 0, 0, "03","31",date("Y")));
  890. $cFq = date("Y-m-d",mktime(0, 0, 0, "04","01",date("Y")));
  891. $cFq1 = date("Y-m-d",mktime(0, 0, 0, "06","30",date("Y")));
  892. $nFq = date("Y-m-d",mktime(0, 0, 0, "07","01",date("Y")));
  893. $nFq1 = date("Y-m-d",mktime(0, 0, 0, "09","30",date("Y")));
  894. }else if(date("m") > 6 and date("m") <= 9)
  895. {
  896. $nFq = date("Y-m-d",mktime(0, 0, 0, "10","01",date("Y")));
  897. $nFq1 = date("Y-m-d",mktime(0, 0, 0, "12","31",date("Y")));
  898. $pFq = date("Y-m-d",mktime(0, 0, 0, "04","01",date("Y")));
  899. $pFq1 = date("Y-m-d",mktime(0, 0, 0, "06","30",date("Y")));
  900. $cFq = date("Y-m-d",mktime(0, 0, 0, "07","01",date("Y")));
  901. $cFq1 = date("Y-m-d",mktime(0, 0, 0, "09","30",date("Y")));
  902. }
  903. else if(date("m") > 9 and date("m") <= 12)
  904. {
  905. $nFq = date("Y-m-d",mktime(0, 0, 0, "01","01",date("Y")+1));
  906. $nFq1 = date("Y-m-d",mktime(0, 0, 0, "03","31",date("Y")+1));
  907. $pFq = date("Y-m-d",mktime(0, 0, 0, "07","01",date("Y")));
  908. $pFq1 = date("Y-m-d",mktime(0, 0, 0, "09","30",date("Y")));
  909. $cFq = date("Y-m-d",mktime(0, 0, 0, "10","01",date("Y")));
  910. $cFq1 = date("Y-m-d",mktime(0, 0, 0, "12","31",date("Y")));
  911. }
  912. if($type == "today" )
  913. {
  914. $datevalue[0] = $today;
  915. $datevalue[1] = $today;
  916. }
  917. elseif($type == "yesterday" )
  918. {
  919. $datevalue[0] = $yesterday;
  920. $datevalue[1] = $yesterday;
  921. }
  922. elseif($type == "tomorrow" )
  923. {
  924. $datevalue[0] = $tomorrow;
  925. $datevalue[1] = $tomorrow;
  926. }
  927. elseif($type == "thisweek" )
  928. {
  929. $datevalue[0] = $thisweek0;
  930. $datevalue[1] = $thisweek1;
  931. }
  932. elseif($type == "lastweek" )
  933. {
  934. $datevalue[0] = $lastweek0;
  935. $datevalue[1] = $lastweek1;
  936. }
  937. elseif($type == "nextweek" )
  938. {
  939. $datevalue[0] = $nextweek0;
  940. $datevalue[1] = $nextweek1;
  941. }
  942. elseif($type == "thismonth" )
  943. {
  944. $datevalue[0] =$currentmonth0;
  945. $datevalue[1] = $currentmonth1;
  946. }
  947. elseif($type == "lastmonth" )
  948. {
  949. $datevalue[0] = $lastmonth0;
  950. $datevalue[1] = $lastmonth1;
  951. }
  952. elseif($type == "nextmonth" )
  953. {
  954. $datevalue[0] = $nextmonth0;
  955. $datevalue[1] = $nextmonth1;
  956. }
  957. elseif($type == "next7days" )
  958. {
  959. $datevalue[0] = $today;
  960. $datevalue[1] = $next7days;
  961. }
  962. elseif($type == "next30days" )
  963. {
  964. $datevalue[0] =$today;
  965. $datevalue[1] =$next30days;
  966. }
  967. elseif($type == "next60days" )
  968. {
  969. $datevalue[0] = $today;
  970. $datevalue[1] = $next60days;
  971. }
  972. elseif($type == "next90days" )
  973. {
  974. $datevalue[0] = $today;
  975. $datevalue[1] = $next90days;
  976. }
  977. elseif($type == "next120days" )
  978. {
  979. $datevalue[0] = $today;
  980. $datevalue[1] = $next120days;
  981. }
  982. elseif($type == "last7days" )
  983. {
  984. $datevalue[0] = $last7days;
  985. $datevalue[1] = $today;
  986. }
  987. elseif($type == "last30days" )
  988. {
  989. $datevalue[0] = $last30days;
  990. $datevalue[1] = $today;
  991. }
  992. elseif($type == "last60days" )
  993. {
  994. $datevalue[0] = $last60days;
  995. $datevalue[1] = $today;
  996. }
  997. else if($type == "last90days" )
  998. {
  999. $datevalue[0] = $last90days;
  1000. $datevalue[1] = $today;
  1001. }
  1002. elseif($type == "last120days" )
  1003. {
  1004. $datevalue[0] = $last120days;
  1005. $datevalue[1] = $today;
  1006. }
  1007. elseif($type == "thisfy" )
  1008. {
  1009. $datevalue[0] = $currentFY0;
  1010. $datevalue[1] = $currentFY1;
  1011. }
  1012. elseif($type == "prevfy" )
  1013. {
  1014. $datevalue[0] = $lastFY0;
  1015. $datevalue[1] = $lastFY1;
  1016. }
  1017. elseif($type == "nextfy" )
  1018. {
  1019. $datevalue[0] = $nextFY0;
  1020. $datevalue[1] = $nextFY1;
  1021. }
  1022. elseif($type == "nextfq" )
  1023. {
  1024. $datevalue[0] = $nFq;
  1025. $datevalue[1] = $nFq1;
  1026. }
  1027. elseif($type == "prevfq" )
  1028. {
  1029. $datevalue[0] = $pFq;
  1030. $datevalue[1] = $pFq1;
  1031. }
  1032. elseif($type == "thisfq" )
  1033. {
  1034. $datevalue[0] = $cFq;
  1035. $datevalue[1] = $cFq1;
  1036. }
  1037. else
  1038. {
  1039. $datevalue[0] = "";
  1040. $datevalue[1] = "";
  1041. }
  1042. return $datevalue;
  1043. }
  1044. /** Function to get getGroupingList for the given reportid
  1045. * @ param $reportid : Type Integer
  1046. * returns the $grouplist Array in the following format
  1047. * $grouplist = Array($tablename:$columnname:$fieldlabel:fieldname:typeofdata=>$tablename:$columnname $sorder,
  1048. * $tablename1:$columnname1:$fieldlabel1:fieldname1:typeofdata1=>$tablename1:$columnname1 $sorder,
  1049. * $tablename2:$columnname2:$fieldlabel2:fieldname2:typeofdata2=>$tablename2:$columnname2 $sorder)
  1050. * This function also sets the return value in the class variable $this->groupbylist
  1051. */
  1052. function getGroupingList($reportid)
  1053. {
  1054. global $adb;
  1055. global $modules;
  1056. global $log;
  1057. // Have we initialized information already?
  1058. if($this->_groupinglist !== false) {
  1059. return $this->_groupinglist;
  1060. }
  1061. $sreportsortsql = "select vtiger_reportsortcol.* from vtiger_report";
  1062. $sreportsortsql .= " inner join vtiger_reportsortcol on vtiger_report.reportid = vtiger_reportsortcol.reportid";
  1063. $sreportsortsql .= " where vtiger_report.reportid =? AND vtiger_reportsortcol.columnname IN (SELECT columnname from vtiger_selectcolumn WHERE queryid=?) order by vtiger_reportsortcol.sortcolid";
  1064. $result = $adb->pquery($sreportsortsql, array($reportid,$reportid));
  1065. while($reportsortrow = $adb->fetch_array($result))
  1066. {
  1067. $fieldcolname = $reportsortrow["columnname"];
  1068. list($tablename,$colname,$module_field,$fieldname,$single) = split(":",$fieldcolname);
  1069. $sortorder = $reportsortrow["sortorder"];
  1070. if($sortorder == "Ascending")
  1071. {
  1072. $sortorder = "ASC";
  1073. }elseif($sortorder == "Descending")
  1074. {
  1075. $sortorder = "DESC";
  1076. }
  1077. if($fieldcolname != "none")
  1078. {
  1079. $selectedfields = explode(":",$fieldcolname);
  1080. if($selectedfields[0] == "vtiger_crmentity".$this->primarymodule)
  1081. $selectedfields[0] = "vtiger_crmentity";
  1082. if(stripos($selectedfields[1],'cf_')==0 && stristr($selectedfields[1],'cf_')==true){
  1083. $sqlvalue = "".$adb->sql_escape_string(decode_html($selectedfields[2]))." ".$sortorder;
  1084. } else {
  1085. $sqlvalue = "".self::replaceSpecialChar($selectedfields[2])." ".$sortorder;
  1086. }
  1087. $grouplist[$fieldcolname] = $sqlvalue;
  1088. $temp = split("_",$selectedfields[2],2);
  1089. $module = $temp[0];
  1090. if(CheckFieldPermission($fieldname,$module) == 'true')
  1091. {
  1092. $this->groupbylist[$fieldcolname] = $selectedfields[0].".".$selectedfields[1]." ".$selectedfields[2];
  1093. }
  1094. }
  1095. }
  1096. if(in_array($this->primarymodule, array('Invoice', 'Quotes', 'SalesOrder', 'PurchaseOrder')) ) {
  1097. $instance = CRMEntity::getInstance($this->primarymodule);
  1098. $grouplist[$instance->table_index] = $instance->table_name.'.'.$instance->table_index;
  1099. $grouplist['subject'] = $instance->table_name.'.subject';
  1100. $this->groupbylist[$fieldcolname] = $instance->table_name.'.'.$instance->table_index;
  1101. $this->groupbylist['subject'] = $instance->table_name.'.subject';
  1102. }
  1103. // Save the information
  1104. $this->_groupinglist = $grouplist;
  1105. $log->info("ReportRun :: Successfully returned getGroupingList".$reportid);
  1106. return $grouplist;
  1107. }
  1108. /** function to replace special characters
  1109. * @ param $selectedfield : type string
  1110. * this returns the string for grouplist
  1111. */
  1112. function replaceSpecialChar($selectedfield){
  1113. $selectedfield = decode_html(decode_html($selectedfield));
  1114. preg_match('/&/', $selectedfield, $matches);
  1115. if(!empty($matches)){
  1116. $selectedfield = str_replace('&', 'and',($selectedfield));
  1117. }
  1118. return $selectedfield;
  1119. }
  1120. /** function to get the selectedorderbylist for the given reportid
  1121. * @ param $reportid : type integer
  1122. * this returns the columns query for the sortorder columns
  1123. * this function also sets the return value in the class variable $this->orderbylistsql
  1124. */
  1125. function getSelectedOrderbyList($reportid)
  1126. {
  1127. global $adb;
  1128. global $modules;
  1129. global $log;
  1130. $sreportsortsql = "select vtiger_reportsortcol.* from vtiger_report";
  1131. $sreportsortsql .= " inner join vtiger_reportsortcol on vtiger_report.reportid = vtiger_reportsortcol.reportid";
  1132. $sreportsortsql .= " where vtiger_report.reportid =? order by vtiger_reportsortcol.sortcolid";
  1133. $result = $adb->pquery($sreportsortsql, array($reportid));
  1134. $noofrows = $adb->num_rows($result);
  1135. for($i=0; $i<$noofrows; $i++)
  1136. {
  1137. $fieldcolname = $adb->query_result($result,$i,"columnname");
  1138. $sortorder = $adb->query_result($result,$i,"sortorder");
  1139. if($sortorder == "Ascending")
  1140. {
  1141. $sortorder = "ASC";
  1142. }
  1143. elseif($sortorder == "Descending")
  1144. {
  1145. $sortorder = "DESC";
  1146. }
  1147. if($fieldcolname != "none")
  1148. {
  1149. $this->orderbylistcolumns[] = $fieldcolname;
  1150. $n = $n + 1;
  1151. $selectedfields = explode(":",$fieldcolname);
  1152. if($n > 1)
  1153. {
  1154. $sSQL .= ", ";
  1155. $this->orderbylistsql .= ", ";
  1156. }
  1157. if($selectedfields[0] == "vtiger_crmentity".$this->primarymodule)
  1158. $selectedfields[0] = "vtiger_crmentity";
  1159. $sSQL .= $selectedfields[0].".".$selectedfields[1]." ".$sortorder;
  1160. $this->orderbylistsql .= $selectedfields[0].".".$selectedfields[1]." ".$selectedfields[2];
  1161. }
  1162. }
  1163. $log->info("ReportRun :: Successfully returned getSelectedOrderbyList".$reportid);
  1164. return $sSQL;
  1165. }
  1166. /** function to get secondary Module for the given Primary module and secondary module
  1167. * @ param $module : type String
  1168. * @ param $secmodule : type String
  1169. * this returns join query for the given secondary module
  1170. */
  1171. function getRelatedModulesQuery($module,$secmodule)
  1172. {
  1173. global $log,$current_user;
  1174. $query = '';
  1175. if($secmodule!=''){
  1176. $secondarymodule = explode(":",$secmodule);
  1177. foreach($secondarymodule as $key=>$value) {
  1178. $foc = CRMEntity::getInstance($value);
  1179. $query .= $foc->generateReportsSecQuery($module,$value);
  1180. $query .= getNonAdminAccessControlQuery($value,$current_user,$value);
  1181. }
  1182. }
  1183. $log->info("ReportRun :: Successfully returned getRelatedModulesQuery".$secmodule);
  1184. return $query;
  1185. }
  1186. /** function to get report query for the given module
  1187. * @ param $module : type String
  1188. * this returns join query for the given module
  1189. */
  1190. function getReportsQuery($module, $type='')
  1191. {
  1192. global $log, $current_user;
  1193. $secondary_module ="'";
  1194. $secondary_module .= str_replace(":","','",$this->secondarymodule);
  1195. $secondary_module .="'";
  1196. if($module == "Leads")
  1197. {
  1198. $query = "from vtiger_leaddetails
  1199. inner join vtiger_crmentity on vtiger_crmentity.crmid=vtiger_leaddetails.leadid
  1200. inner join vtiger_leadsubdetails on vtiger_leadsubdetails.leadsubscriptionid=vtiger_leaddetails.leadid
  1201. inner join vtiger_leadaddress on vtiger_leadaddress.leadaddressid=vtiger_leadsubdetails.leadsubscriptionid
  1202. inner join vtiger_leadscf on vtiger_leaddetails.leadid = vtiger_leadscf.leadid
  1203. left join vtiger_groups as vtiger_groupsLeads on vtiger_groupsLeads.groupid = vtiger_crmentity.smownerid
  1204. left join vtiger_users as vtiger_usersLeads on vtiger_usersLeads.id = vtiger_crmentity.smownerid
  1205. left join vtiger_groups on vtiger_groups.groupid = vtiger_crmentity.smownerid
  1206. left join vtiger_users on vtiger_users.id = vtiger_crmentity.smownerid
  1207. ".$this->getRelatedModulesQuery($module,$this->secondarymodule).
  1208. getNonAdminAccessControlQuery($this->primarymodule,$current_user)."
  1209. where vtiger_crmentity.deleted=0 and vtiger_leaddetails.converted=0";
  1210. }
  1211. else if($module == "Accounts")
  1212. {
  1213. $query = "from vtiger_account
  1214. inner join vtiger_crmentity on vtiger_crmentity.crmid=vtiger_account.accountid
  1215. inner join vtiger_accountbillads on vtiger_account.accountid=vtiger_accountbillads.accountaddressid
  1216. inner join vtiger_accountshipads on vtiger_account.accountid=vtiger_accountshipads.accountaddressid
  1217. inner join vtiger_accountscf on vtiger_account.accountid = vtiger_accountscf.accountid
  1218. left join vtiger_groups as vtiger_groupsAccounts on vtiger_groupsAccounts.groupid = vtiger_crmentity.smownerid
  1219. left join vtiger_account as vtiger_accountAccounts on vtiger_accountAccounts.accountid = vtiger_account.parentid
  1220. left join vtiger_users as vtiger_usersAccounts on vtiger_usersAccounts.id = vtiger_crmentity.smownerid
  1221. left join vtiger_groups on vtiger_groups.groupid = vtiger_crmentity.smownerid
  1222. left join vtiger_users on vtiger_users.id = vtiger_crmentity.smownerid
  1223. ".$this->getRelatedModulesQuery($module,$this->secondarymodule).
  1224. getNonAdminAccessControlQuery($this->primarymodule,$current_user)."
  1225. where vtiger_crmentity.deleted=0 ";
  1226. }
  1227. else if($module == "Contacts")
  1228. {
  1229. $query = "from vtiger_contactdetails
  1230. inner join vtiger_crmentity on vtiger_crmentity.crmid = vtiger_contactdetails.contactid
  1231. inner join vtiger_contactaddress on vtiger_contactdetails.contactid = vtiger_contactaddress.contactaddressid
  1232. inner join vtiger_customerdetails on vtiger_customerdetails.customerid = vtiger_contactdetails.contactid
  1233. inner join vtiger_contactsubdetails on vtiger_contactdetails.contactid = vtiger_contactsubdetails.contactsubscriptionid
  1234. inner join vtiger_contactscf on vtiger_contactdetails.contactid = vtiger_contactscf.contactid
  1235. left join vtiger_groups vtiger_groupsContacts on vtiger_groupsContacts.groupid = vtiger_crmentity.smownerid
  1236. left join vtiger_contactdetails as vtiger_contactdetailsContacts on vtiger_contactdetailsContacts.contactid = vtiger_contactdetails.reportsto
  1237. left join vtiger_account as vtiger_accountContacts on vtiger_accountContacts.accountid = vtiger_contactdetails.accountid
  1238. left join vtiger_users as vtiger_usersContacts on vtiger_usersContacts.id = vtiger_crmentity.smownerid
  1239. left join vtiger_users on vtiger_users.id = vtiger_crmentity.smownerid
  1240. left join vtiger_groups on vtiger_groups.groupid = vtiger_crmentity.smownerid
  1241. ".$this->getRelatedModulesQuery($module,$this->secondarymodule).
  1242. getNonAdminAccessControlQuery($this->primarymodule,$current_user)."
  1243. where vtiger_crmentity.deleted=0";
  1244. }
  1245. else if($module == "Potentials")
  1246. {
  1247. $query = "from vtiger_potential
  1248. inner join vtiger_crmentity on vtiger_crmentity.crmid=vtiger_potential.potentialid
  1249. inner join vtiger_potentialscf on vtiger_potentialscf.potentialid = vtiger_potential.potentialid
  1250. left join vtiger_account as vtiger_accountPotentials on vtiger_potential.related_to = vtiger_accountPotentials.accountid
  1251. left join vtiger_contactdetails as vtiger_contactdetailsPotentials on vtiger_potential.related_to = vtiger_contactdetailsPotentials.contactid
  1252. left join vtiger_campaign as vtiger_campaignPotentials on vtiger_potential.campaignid = vtiger_campaignPotentials.campaignid
  1253. left join vtiger_groups vtiger_groupsPotentials on vtiger_groupsPotentials.groupid = vtiger_crmentity.smownerid
  1254. left join vtiger_users as vtiger_usersPotentials on vtiger_usersPotentials.id = vtiger_crmentity.smownerid
  1255. left join vtiger_groups on vtiger_groups.groupid = vtiger_crmentity.smownerid
  1256. left join vtiger_users on vtiger_users.id = vtiger_crmentity.smownerid
  1257. ".$this->getRelatedModulesQuery($module,$this->secondarymodule).
  1258. getNonAdminAccessControlQuery($this->primarymodule,$current_user)."
  1259. where vtiger_crmentity.deleted=0 ";
  1260. }
  1261. //For this Product - we can related Accounts, Contacts (Also Leads, Potentials)
  1262. else if($module == "Products")
  1263. {
  1264. $query = "from vtiger_products
  1265. inner join vtiger_crmentity on vtiger_crmentity.crmid=vtiger_products.productid
  1266. left join vtiger_productcf on vtiger_products.productid = vtiger_productcf.productid
  1267. left join vtiger_users as vtiger_usersProducts on vtiger_usersProducts.id = vtiger_products.handler
  1268. left join vtiger_vendor as vtiger_vendorRelProducts on vtiger_vendorRelProducts.vendorid = vtiger_products.vendor_id
  1269. LEFT JOIN (
  1270. SELECT vtiger_products.productid,
  1271. (CASE WHEN (vtiger_products.currency_id = 1 ) THEN vtiger_products.unit_price
  1272. ELSE (vtiger_products.unit_price / vtiger_currency_info.conversion_rate) END
  1273. ) AS actual_unit_price
  1274. FROM vtiger_products
  1275. LEFT JOIN vtiger_currency_info ON vtiger_products.currency_id = vtiger_currency_info.id
  1276. LEFT JOIN vtiger_productcurrencyrel ON vtiger_products.productid = vtiger_productcurrencyrel.productid
  1277. AND vtiger_productcurrencyrel.currencyid = ". $current_user->currency_id . "
  1278. ) AS innerProduct ON innerProduct.productid = vtiger_products.productid
  1279. ".$this->getRelatedModulesQuery($module,$this->secondarymodule).
  1280. getNonAdminAccessControlQuery($this->primarymodule,$current_user)."
  1281. where vtiger_crmentity.deleted=0";
  1282. }
  1283. else if($module == "HelpDesk")
  1284. {
  1285. $query = "from vtiger_troubletickets
  1286. inner join vtiger_crmentity
  1287. on vtiger_crmentity.crmid=vtiger_troubletickets.ticketid
  1288. inner join vtiger_ticketcf on vtiger_ticketcf.ticketid = vtiger_troubletickets.ticketid
  1289. left join vtiger_crmentity as vtiger_crmentityRelHelpDesk on vtiger_crmentityRelHelpDesk.crmid = vtiger_troubletickets.parent_id
  1290. left join vtiger_account as vtiger_accountRelHelpDesk on vtiger_accountRelHelpDesk.accountid=vtiger_crmentityRelHelpDesk.crmid
  1291. left join vtiger_contactdetails as vtiger_contactdetailsRelHelpDesk on vtiger_contactdetailsRelHelpDesk.contactid= vtiger_crmentityRelHelpDesk.crmid
  1292. left join vtiger_products as vtiger_productsRel on vtiger_productsRel.productid = vtiger_troubletickets.product_id
  1293. left join vtiger_groups as vtiger_groupsHelpDesk on vtiger_groupsHelpDesk.groupid = vtiger_crmentity.smownerid
  1294. left join vtiger_users as vtiger_usersHelpDesk on vtiger_crmentity.smownerid=vtiger_usersHelpDesk.id
  1295. left join vtiger_groups on vtiger_groups.groupid = vtiger_crmentity.smownerid
  1296. left join vtiger_users on vtiger_crmentity.smownerid=vtiger_users.id
  1297. ".$this->getRelatedModulesQuery($module,$this->secondarymodule).
  1298. getNonAdminAccessControlQuery($this->primarymodule,$current_user)."
  1299. where vtiger_crmentity.deleted=0 ";
  1300. }
  1301. else if($module == "Calendar")
  1302. {
  1303. $query = "from vtiger_activity
  1304. inner join vtiger_crmentity on vtiger_crmentity.crmid=vtiger_activity.activityid
  1305. left join vtiger_activitycf on vtiger_activitycf.activityid = vtiger_crmentity.crmid
  1306. left join vtiger_cntactivityrel on vtiger_cntactivityrel.activityid= vtiger_activity.activityid
  1307. left join vtiger_contactdetails as vtiger_contactdetailsCalendar on vtiger_contactdetailsCalendar.contactid= vtiger_cntactivityrel.contactid
  1308. left join vtiger_groups as vtiger_groupsCalendar on vtiger_groupsCalendar.groupid = vtiger_crmentity.smownerid
  1309. left join vtiger_users as vtiger_usersCalendar on vtiger_usersCalendar.id = vtiger_crmentity.smownerid
  1310. left join vtiger_groups on vtiger_groups.groupid = vtiger_crmentity.smownerid
  1311. left join vtiger_users on vtiger_users.id = vtiger_crmentity.smownerid
  1312. left join vtiger_seactivityrel on vtiger_seactivityrel.activityid = vtiger_activity.activityid
  1313. left join vtiger_activity_reminder on vtiger_activity_reminder.activity_id = vtiger_activity.activityid
  1314. left join vtiger_recurringevents on vtiger_recurringevents.activityid = vtiger_activity.activityid
  1315. left join vtiger_crmentity as vtiger_crmentityRelCalendar on vtiger_crmentityRelCalendar.crmid = vtiger_seactivityrel.crmid
  1316. left join vtiger_account as vtiger_accountRelCalendar on vtiger_accountRelCalendar.accountid=vtiger_crmentityRelCalendar.crmid
  1317. left join vtiger_leaddetails as vtiger_leaddetailsRelCalendar on vtiger_leaddetailsRelCalendar.leadid = vtiger_crmentityRelCalendar.crmid
  1318. left join vtiger_potential as vtiger_potentialRelCalendar on vtiger_potentialRelCalendar.potentialid = vtiger_crmentityRelCalendar.crmid
  1319. left join vtiger_quotes as vtiger_quotesRelCalendar on vtiger_quotesRelCalendar.quoteid = vtiger_crmentityRelCalendar.crmid
  1320. left join vtiger_purchaseorder as vtiger_purchaseorderRelCalendar on vtiger_purchaseorderRelCalendar.purchaseorderid = vtiger_crmentityRelCalendar.crmid
  1321. left join vtiger_invoice as vtiger_invoiceRelCalendar on vtiger_invoiceRelCalendar.invoiceid = vtiger_crmentityRelCalendar.crmid
  1322. left join vtiger_salesorder as vtiger_salesorderRelCalendar on vtiger_salesorderRelCalendar.salesorderid = vtiger_crmentityRelCalendar.crmid
  1323. left join vtiger_troubletickets as vtiger_troubleticketsRelCalendar on vtiger_troubleticketsRelCalendar.ticketid = vtiger_crmentityRelCalendar.crmid
  1324. left join vtiger_campaign as vtiger_campaignRelCalendar on vtiger_campaignRelCalendar.campaignid = vtiger_crmentityRelCalendar.crmid
  1325. ".$this->getRelatedModulesQuery($module,$this->secondarymodule).
  1326. getNonAdminAccessControlQuery($this->primarymodule,$current_user)."
  1327. WHERE vtiger_crmentity.deleted=0 and (vtiger_activity.activitytype != 'Emails')";
  1328. }
  1329. else if($module == "Quotes")
  1330. {
  1331. $query = "from vtiger_quotes
  1332. inner join vtiger_crmentity on vtiger_crmentity.crmid=vtiger_quotes.quoteid
  1333. inner join vtiger_quotesbillads on vtiger_quotes.quoteid=vtiger_quotesbillads.quotebilladdressid
  1334. inner join vtiger_quotesshipads on vtiger_quotes.quoteid=vtiger_quotesshipads.quoteshipaddressid";
  1335. if($type !== 'COLUMNSTOTOTAL') {
  1336. $query .= " left join vtiger_inventoryproductrel as vtiger_inventoryproductrelQuotes on vtiger_quotes.quoteid = vtiger_inventoryproductrelQuotes.id
  1337. left join vtiger_products as vtiger_productsQuotes on vtiger_productsQuotes.productid = vtiger_inventoryproductrelQuotes.productid
  1338. left join vtiger_service as vtiger_serviceQuotes on vtiger_serviceQuotes.serviceid = vtiger_inventoryproductrelQuotes.productid";
  1339. }
  1340. $query .= " left join vtiger_quotescf on vtiger_quotes.quoteid = vtiger_quotescf.quoteid
  1341. left join vtiger_groups as vtiger_groupsQuotes on vtiger_groupsQuotes.groupid = vtiger_crmentity.smownerid
  1342. left join vtiger_users as vtiger_usersQuotes on vtiger_usersQuotes.id = vtiger_crmentity.smownerid
  1343. left join vtiger_groups on vtiger_groups.groupid = vtiger_crmentity.smownerid
  1344. left join vtiger_users on vtiger_users.id = vtiger_crmentity.smownerid
  1345. left join vtiger_users as vtiger_usersRel1 on vtiger_usersRel1.id = vtiger_quotes.inventorymanager
  1346. left join vtiger_potential as vtiger_potentialRelQuotes on vtiger_potentialRelQuotes.potentialid = vtiger_quotes.potentialid
  1347. left join vtiger_contactdetails as vtiger_contactdetailsQuotes on vtiger_contactdetailsQuotes.contactid = vtiger_quotes.contactid
  1348. left join vtiger_account as vtiger_accountQuotes on vtiger_accountQuotes.accountid = vtiger_quotes.accountid
  1349. ".$this->getRelatedModulesQuery($module,$this->secondarymodule).
  1350. getNonAdminAccessControlQuery($this->primarymodule,$current_user)."
  1351. where vtiger_crmentity.deleted=0";
  1352. }
  1353. else if($module == "PurchaseOrder")
  1354. {
  1355. $query = "from vtiger_purchaseorder
  1356. inner join vtiger_crmentity on vtiger_crmentity.crmid=vtiger_purchaseorder.purchaseorderid
  1357. inner join vtiger_pobillads on vtiger_purchaseorder.purchaseorderid=vtiger_pobillads.pobilladdressid
  1358. inner join vtiger_poshipads on vtiger_purchaseorder.purchaseorderid=vtiger_poshipads.poshipaddressid";
  1359. if($type !== 'COLUMNSTOTOTAL') {
  1360. $query .= " left join vtiger_inventoryproductrel as vtiger_inventoryproductrelPurchaseOrder on vtiger_purchaseorder.purchaseorderid = vtiger_inventoryproductrelPurchaseOrder.id
  1361. left join vtiger_products as vtiger_productsPurchaseOrder on vtiger_productsPurchaseOrder.productid = vtiger_inventoryproductrelPurchaseOrder.productid
  1362. left join vtiger_service as vtiger_servicePurchaseOrder on vtiger_servicePurchaseOrder.serviceid = vtiger_inventoryproductrelPurchaseOrder.productid";
  1363. }
  1364. $query .= " left join vtiger_purchaseordercf on vtiger_purchaseorder.purchaseorderid = vtiger_purchaseordercf.purchaseorderid
  1365. left join vtiger_groups as vtiger_groupsPurchaseOrder on vtiger_groupsPurchaseOrder.groupid = vtiger_crmentity.smownerid
  1366. left join vtiger_users as vtiger_usersPurchaseOrder on vtiger_usersPurchaseOrder.id = vtiger_crmentity.smownerid
  1367. left join vtiger_groups on vtiger_groups.groupid = vtiger_crmentity.smownerid
  1368. left join vtiger_users on vtiger_users.id = vtiger_crmentity.smownerid
  1369. left join vtiger_vendor as vtiger_vendorRelPurchaseOrder on vtiger_vendorRelPurchaseOrder.vendorid = vtiger_purchaseorder.vendorid
  1370. left join vtiger_contactdetails as vtiger_contactdetailsPurchaseOrder on vtiger_contactdetailsPurchaseOrder.contactid = vtiger_purchaseorder.contactid
  1371. ".$this->getRelatedModulesQuery($module,$this->secondarymodule).
  1372. getNonAdminAccessControlQuery($this->primarymodule,$current_user)."
  1373. where vtiger_crmentity.deleted=0";
  1374. }
  1375. else if($module == "Invoice")
  1376. {
  1377. $query = "from vtiger_invoice
  1378. inner join vtiger_crmentity on vtiger_crmentity.crmid=vtiger_invoice.invoiceid
  1379. inner join vtiger_invoicebillads on vtiger_invoice.invoiceid=vtiger_invoicebillads.invoicebilladdressid
  1380. inner join vtiger_invoiceshipads on vtiger_invoice.invoiceid=vtiger_invoiceshipads.invoiceshipaddressid";
  1381. if($type !== 'COLUMNSTOTOTAL') {
  1382. $query .=" left join vtiger_inventoryproductrel as vtiger_inventoryproductrelInvoice on vtiger_invoice.invoiceid = vtiger_inventoryproductrelInvoice.id
  1383. left join vtiger_products as vtiger_productsInvoice on vtiger_productsInvoice.productid = vtiger_inventoryproductrelInvoice.productid
  1384. left join vtiger_service as vtiger_serviceInvoice on vtiger_serviceInvoice.serviceid = vtiger_inventoryproductrelInvoice.productid";
  1385. }
  1386. $query .= " left join vtiger_salesorder as vtiger_salesorderInvoice on vtiger_salesorderInvoice.salesorderid=vtiger_invoice.salesorderid
  1387. left join vtiger_invoicecf on vtiger_invoice.invoiceid = vtiger_invoicecf.invoiceid
  1388. left join vtiger_groups as vtiger_groupsInvoice on vtiger_groupsInvoice.groupid = vtiger_crmentity.smownerid
  1389. left join vtiger_users as vtiger_usersInvoice on vtiger_usersInvoice.id = vtiger_crmentity.smownerid
  1390. left join vtiger_groups on vtiger_groups.groupid = vtiger_crmentity.smownerid
  1391. left join vtiger_users on vtiger_users.id = vtiger_crmentity.smownerid
  1392. left join vtiger_account as vtiger_accountInvoice on vtiger_accountInvoice.accountid = vtiger_invoice.accountid
  1393. left join vtiger_contactdetails as vtiger_contactdetailsInvoice on vtiger_contactdetailsInvoice.contactid = vtiger_invoice.contactid
  1394. ".$this->getRelatedModulesQuery($module,$this->secondarymodule).
  1395. getNonAdminAccessControlQuery($this->primarymodule,$current_user)."
  1396. where vtiger_crmentity.deleted=0";
  1397. }
  1398. else if($module == "SalesOrder")
  1399. {
  1400. $query = "from vtiger_salesorder
  1401. inner join vtiger_crmentity on vtiger_crmentity.crmid=vtiger_salesorder.salesorderid
  1402. inner join vtiger_sobillads on vtiger_salesorder.salesorderid=vtiger_sobillads.sobilladdressid
  1403. inner join vtiger_soshipads on vtiger_salesorder.salesorderid=vtiger_soshipads.soshipaddressid";
  1404. if($type !== 'COLUMNSTOTOTAL') {
  1405. $query .= " left join vtiger_inventoryproductrel as vtiger_inventoryproductrelSalesOrder on vtiger_salesorder.salesorderid = vtiger_inventoryproductrelSalesOrder.id
  1406. left join vtiger_products as vtiger_productsSalesOrder on vtiger_productsSalesOrder.productid = vtiger_inventoryproductrelSalesOrder.productid
  1407. left join vtiger_service as vtiger_serviceSalesOrder on vtiger_serviceSalesOrder.serviceid = vtiger_inventoryproductrelSalesOrder.productid";
  1408. }
  1409. $query .=" left join vtiger_salesordercf on vtiger_salesorder.salesorderid = vtiger_salesordercf.salesorderid
  1410. left join vtiger_contactdetails as vtiger_contactdetailsSalesOrder on vtiger_contactdetailsSalesOrder.contactid = vtiger_salesorder.contactid
  1411. left join vtiger_quotes as vtiger_quotesSalesOrder on vtiger_quotesSalesOrder.quoteid = vtiger_salesorder.quoteid
  1412. left join vtiger_account as vtiger_accountSalesOrder on vtiger_accountSalesOrder.accountid = vtiger_salesorder.accountid
  1413. left join vtiger_potential as vtiger_potentialRelSalesOrder on vtiger_potentialRelSalesOrder.potentialid = vtiger_salesorder.potentialid
  1414. left join vtiger_invoice_recurring_info on vtiger_invoice_recurring_info.salesorderid = vtiger_salesorder.salesorderid
  1415. left join vtiger_groups as vtiger_groupsSalesOrder on vtiger_groupsSalesOrder.groupid = vtiger_crmentity.smownerid
  1416. left join vtiger_users as vtiger_usersSalesOrder on vtiger_usersSalesOrder.id = vtiger_crmentity.smownerid
  1417. left join vtiger_groups on vtiger_groups.groupid = vtiger_crmentity.smownerid
  1418. left join vtiger_users on vtiger_users.id = vtiger_crmentity.smownerid
  1419. ".$this->getRelatedModulesQuery($module,$this->secondarymodule).
  1420. getNonAdminAccessControlQuery($this->primarymodule,$current_user)."
  1421. where vtiger_crmentity.deleted=0";
  1422. }
  1423. else if($module == "Campaigns")
  1424. {
  1425. $query = "from vtiger_campaign
  1426. inner join vtiger_campaignscf as vtiger_campaignscf on vtiger_campaignscf.campaignid=vtiger_campaign.campaignid
  1427. inner join vtiger_crmentity on vtiger_crmentity.crmid=vtiger_campaign.campaignid
  1428. left join vtiger_products as vtiger_productsCampaigns on vtiger_productsCampaigns.productid = vtiger_campaign.product_id
  1429. left join vtiger_groups as vtiger_groupsCampaigns on vtiger_groupsCampaigns.groupid = vtiger_crmentity.smownerid
  1430. left join vtiger_users as vtiger_usersCampaigns on vtiger_usersCampaigns.id = vtiger_crmentity.smownerid
  1431. left join vtiger_groups on vtiger_groups.groupid = vtiger_crmentity.smownerid
  1432. left join vtiger_users on vtiger_users.id = vtiger_crmentity.smownerid
  1433. ".$this->getRelatedModulesQuery($module,$this->secondarymodule).
  1434. getNonAdminAccessControlQuery($this->primarymodule,$current_user)."
  1435. where vtiger_crmentity.deleted=0";
  1436. }
  1437. else {
  1438. if($module!=''){
  1439. $focus = CRMEntity::getInstance($module);
  1440. $query = $focus->generateReportsQuery($module)
  1441. .$this->getRelatedModulesQuery($module,$this->secondarymodule)
  1442. .getNonAdminAccessControlQuery($this->primarymodule,$current_user).
  1443. " WHERE vtiger_crmentity.deleted=0";
  1444. }
  1445. }
  1446. $log->info("ReportRun :: Successfully returned getReportsQuery".$module);
  1447. return $query;
  1448. }
  1449. /** function to get query for the given reportid,filterlist,type
  1450. * @ param $reportid : Type integer
  1451. * @ param $filterlist : Type Array
  1452. * @ param $module : Type String
  1453. * this returns join query for the report
  1454. */
  1455. function sGetSQLforReport($reportid,$filterlist,$type='')
  1456. {
  1457. global $log;
  1458. $columnlist = $this->getQueryColumnsList($reportid,$type);
  1459. $groupslist = $this->getGroupingList($reportid);
  1460. $stdfilterlist = $this->getStdFilterList($reportid);
  1461. $columnstotallist = $this->getColumnsTotal($reportid);
  1462. $advfiltersql = $this->getAdvFilterSql($reportid);
  1463. $this->totallist = $columnstotallist;
  1464. global $current_user;
  1465. $tab_id = getTabid($this->primarymodule);
  1466. //Fix for ticket #4915.
  1467. $selectlist = $columnlist;
  1468. //columns list
  1469. if(isset($selectlist))
  1470. {
  1471. $selectedcolumns = implode(", ",$selectlist);
  1472. }
  1473. //groups list
  1474. if(isset($groupslist))
  1475. {
  1476. $groupsquery = implode(", ",$groupslist);
  1477. }
  1478. //standard list
  1479. if(isset($stdfilterlist))
  1480. {
  1481. $stdfiltersql = implode(", ",$stdfilterlist);
  1482. }
  1483. if(isset($filterlist))
  1484. {
  1485. $stdfiltersql = implode(", ",$filterlist);
  1486. }
  1487. //columns to total list
  1488. if(isset($columnstotallist))
  1489. {
  1490. $columnstotalsql = implode(", ",$columnstotallist);
  1491. }
  1492. if($stdfiltersql != "")
  1493. {
  1494. $wheresql = " and ".$stdfiltersql;
  1495. }
  1496. if($advfiltersql != "")
  1497. {
  1498. $wheresql .= " and ".$advfiltersql;
  1499. }
  1500. $reportquery = $this->getReportsQuery($this->primarymodule, $type);
  1501. // If we don't have access to any columns, let us select one column and limit result to shown we have not results
  1502. // Fix for: http://trac.vtiger.com/cgi-bin/trac.cgi/ticket/4758 - Prasad
  1503. $allColumnsRestricted = false;
  1504. if($type == 'COLUMNSTOTOTAL')
  1505. {
  1506. if($columnstotalsql != '')
  1507. {
  1508. $reportquery = "select ".$columnstotalsql." ".$reportquery." ".$wheresql;
  1509. }
  1510. }else
  1511. {
  1512. if($selectedcolumns == '') {
  1513. // Fix for: http://trac.vtiger.com/cgi-bin/trac.cgi/ticket/4758 - Prasad
  1514. $selectedcolumns = "''"; // "''" to get blank column name
  1515. $allColumnsRestricted = true;
  1516. }
  1517. if(in_array($this->primarymodule, array('Invoice', 'Quotes',
  1518. 'SalesOrder', 'PurchaseOrder'))) {
  1519. $selectedcolumns = ' distinct '. $selectedcolumns;
  1520. }
  1521. $reportquery = "select ".$selectedcolumns." ".$reportquery." ".$wheresql;
  1522. }
  1523. $reportquery = listQueryNonAdminChange($reportquery, $this->primarymodule);
  1524. if(trim($groupsquery) != "" && !empty($type) && $type !== 'COLUMNSTOTOTAL')
  1525. {
  1526. $reportquery .= " order by ".$groupsquery ;
  1527. }
  1528. // Prasad: No columns selected so limit the number of rows directly.
  1529. if($allColumnsRestricted) {
  1530. $reportquery .= " limit 0";
  1531. }
  1532. $log->info("ReportRun :: Successfully returned sGetSQLforReport".$reportid);
  1533. return $reportquery;
  1534. }
  1535. /** function to get the report output in HTML,PDF,TOTAL,PRINT,PRINTTOTAL formats depends on the argument $outputformat
  1536. * @ param $outputformat : Type String (valid parameters HTML,PDF,TOTAL,PRINT,PRINT_TOTAL)
  1537. * @ param $filterlist : Type Array
  1538. * This returns HTML Report if $outputformat is HTML
  1539. * Array for PDF if $outputformat is PDF
  1540. * HTML strings for TOTAL if $outputformat is TOTAL
  1541. * Array for PRINT if $outputformat is PRINT
  1542. * HTML strings for TOTAL fields if $outputformat is PRINTTOTAL
  1543. * HTML strings for
  1544. */
  1545. // Performance Optimization: Added parameter directOutput to avoid building big-string!
  1546. function GenerateReport($outputformat,$filterlist, $directOutput=false)
  1547. {
  1548. global $adb,$current_user,$php_max_execution_time;
  1549. global $modules,$app_strings;
  1550. global $mod_strings,$current_language;
  1551. require('user_privileges/user_privileges_'.$current_user->id.'.php');
  1552. $modules_selected = array();
  1553. $modules_selected[] = $this->primarymodule;
  1554. if(!empty($this->secondarymodule)){
  1555. $sec_modules = split(":",$this->secondarymodule);
  1556. for($i=0;$i<count($sec_modules);$i++){
  1557. $modules_selected[] = $sec_modules[$i];
  1558. }
  1559. }
  1560. // Update Currency Field list
  1561. $currencyfieldres = $adb->pquery("SELECT tabid, fieldlabel, uitype from vtiger_field WHERE uitype in (71,72,10)", array());
  1562. if($currencyfieldres) {
  1563. foreach($currencyfieldres as $currencyfieldrow) {
  1564. $modprefixedlabel = getTabModuleName($currencyfieldrow['tabid']).' '.$currencyfieldrow['fieldlabel'];
  1565. $modprefixedlabel = str_replace(' ','_',$modprefixedlabel);
  1566. if($currencyfieldrow['uitype']!=10){
  1567. if(!in_array($modprefixedlabel, $this->convert_currency) && !in_array($modprefixedlabel, $this->append_currency_symbol_to_value)) {
  1568. $this->convert_currency[] = $modprefixedlabel;
  1569. }
  1570. } else {
  1571. if(!in_array($modprefixedlabel, $this->ui10_fields)) {
  1572. $this->ui10_fields[] = $modprefixedlabel;
  1573. }
  1574. }
  1575. }
  1576. }
  1577. if($outputformat == "HTML")
  1578. {
  1579. $sSQL = $this->sGetSQLforReport($this->reportid,$filterlist,$outputformat);
  1580. $result = $adb->query($sSQL);
  1581. $error_msg = $adb->database->ErrorMsg();
  1582. if(!$result && $error_msg!=''){
  1583. // Performance Optimization: If direct output is requried
  1584. if($directOutput) {
  1585. echo getTranslatedString('LBL_REPORT_GENERATION_FAILED', $currentModule) . "<br>" . $error_msg;
  1586. $error_msg = false;
  1587. }
  1588. // END
  1589. return $error_msg;
  1590. }
  1591. // Performance Optimization: If direct output is required
  1592. if($directOutput) {
  1593. echo '<table cellpadding="5" cellspacing="0" align="center" class="rptTable"><tr>';
  1594. }
  1595. // END
  1596. if($is_admin==false && $profileGlobalPermission[1] == 1 && $profileGlobalPermission[2] == 1)
  1597. $picklistarray = $this->getAccessPickListValues();
  1598. if($result)
  1599. {
  1600. $y=$adb->num_fields($result);
  1601. $arrayHeaders = Array();
  1602. for ($x=0; $x<$y; $x++)
  1603. {
  1604. $fld = $adb->field_name($result, $x);
  1605. if(in_array($this->getLstringforReportHeaders($fld->name), $arrayHeaders))
  1606. {
  1607. $headerLabel = str_replace("_"," ",$fld->name);
  1608. $arrayHeaders[] = $headerLabel;
  1609. }
  1610. else
  1611. {
  1612. $headerLabel = str_replace($modules," ",$this->getLstringforReportHeaders($fld->name));
  1613. $headerLabel = str_replace("_"," ",$this->getLstringforReportHeaders($fld->name));
  1614. $arrayHeaders[] = $headerLabel;
  1615. }
  1616. /*STRING TRANSLATION starts */
  1617. $mod_name = split(' ',$headerLabel,2);
  1618. $module ='';
  1619. if(in_array($mod_name[0],$modules_selected)){
  1620. $module = getTranslatedString($mod_name[0],$mod_name[0]);
  1621. }
  1622. if(!empty($this->secondarymodule)){
  1623. if($module!=''){
  1624. $headerLabel_tmp = $module." ".getTranslatedString($mod_name[1],$mod_name[0]);
  1625. } else {
  1626. $headerLabel_tmp = getTranslatedString($mod_name[0]." ".$mod_name[1]);
  1627. }
  1628. } else {
  1629. if($module!=''){
  1630. $headerLabel_tmp = getTranslatedString($mod_name[1],$mod_name[0]);
  1631. } else {
  1632. $headerLabel_tmp = getTranslatedString($mod_name[0]." ".$mod_name[1]);
  1633. }
  1634. }
  1635. if($headerLabel == $headerLabel_tmp) $headerLabel = getTranslatedString($headerLabel_tmp);
  1636. else $headerLabel = $headerLabel_tmp;
  1637. /*STRING TRANSLATION ends */
  1638. $header .= "<td class='rptCellLabel'>".$headerLabel."</td>";
  1639. // Performance Optimization: If direct output is required
  1640. if($directOutput) {
  1641. echo $header;
  1642. $header = '';
  1643. }
  1644. // END
  1645. }
  1646. // Performance Optimization: If direct output is required
  1647. if($directOutput) {
  1648. echo '</tr><tr>';
  1649. }
  1650. // END
  1651. $noofrows = $adb->num_rows($result);
  1652. $custom_field_values = $adb->fetch_array($result);
  1653. $groupslist = $this->getGroupingList($this->reportid);
  1654. $column_definitions = $adb->getFieldsDefinition($result);
  1655. do
  1656. {
  1657. $arraylists = Array();
  1658. if(count($groupslist) == 1)
  1659. {
  1660. $newvalue = $custom_field_values[0];
  1661. }elseif(count($groupslist) == 2)
  1662. {
  1663. $newvalue = $custom_field_values[0];
  1664. $snewvalue = $custom_field_values[1];
  1665. }elseif(count($groupslist) == 3)
  1666. {
  1667. $newvalue = $custom_field_values[0];
  1668. $snewvalue = $custom_field_values[1];
  1669. $tnewvalue = $custom_field_values[2];
  1670. }
  1671. if($newvalue == "") $newvalue = "-";
  1672. if($snewvalue == "") $snewvalue = "-";
  1673. if($tnewvalue == "") $tnewvalue = "-";
  1674. $valtemplate .= "<tr>";
  1675. // Performance Optimization
  1676. if($directOutput) {
  1677. echo $valtemplate;
  1678. $valtemplate = '';
  1679. }
  1680. // END
  1681. for ($i=0; $i<$y; $i++)
  1682. {
  1683. $fld = $adb->field_name($result, $i);
  1684. $fld_type = $column_definitions[$i]->type;
  1685. if (in_array($fld->name, $this->convert_currency)) {
  1686. if($custom_field_values[$i]!='')
  1687. $fieldvalue = convertFromMasterCurrency($custom_field_values[$i],$current_user->conv_rate);
  1688. else
  1689. $fieldvalue = getTranslatedString($custom_field_values[$i]);
  1690. } elseif(in_array($fld->name, $this->append_currency_symbol_to_value)) {
  1691. $curid_value = explode("::", $custom_field_values[$i]);
  1692. $currency_id = $curid_value[0];
  1693. $currency_value = $curid_value[1];
  1694. $cur_sym_rate = getCurrencySymbolandCRate($currency_id);
  1695. if($custom_field_values[$i]!='')
  1696. $fieldvalue = $cur_sym_rate['symbol']." ".$currency_value;
  1697. else
  1698. $fieldvalue = getTranslatedString($custom_field_values[$i]);
  1699. }elseif ($fld->name == "PurchaseOrder_Currency" || $fld->name == "SalesOrder_Currency"
  1700. || $fld->name == "Invoice_Currency" || $fld->name == "Quotes_Currency") {
  1701. if($custom_field_values[$i]!='')
  1702. $fieldvalue = getCurrencyName($custom_field_values[$i]);
  1703. else
  1704. $fieldvalue =getTranslatedString($custom_field_values[$i]);
  1705. }elseif (in_array($fld->name,$this->ui10_fields) && !empty($custom_field_values[$i])) {
  1706. $type = getSalesEntityType($custom_field_values[$i]);
  1707. $tmp =getEntityName($type,$custom_field_values[$i]);
  1708. if (is_array($tmp)){
  1709. foreach($tmp as $key=>$val){
  1710. $fieldvalue = $val;
  1711. break;
  1712. }
  1713. }else{
  1714. $fieldvalue = $custom_field_values[$i];
  1715. }
  1716. }
  1717. else {
  1718. if($custom_field_values[$i]!='')
  1719. $fieldvalue = getTranslatedString($custom_field_values[$i]);
  1720. else
  1721. $fieldvalue = getTranslatedString($custom_field_values[$i]);
  1722. }
  1723. $fieldvalue = str_replace("<", "&lt;", $fieldvalue);
  1724. $fieldvalue = str_replace(">", "&gt;", $fieldvalue);
  1725. //check for Roll based pick list
  1726. $temp_val= $fld->name;
  1727. if(is_array($picklistarray))
  1728. if(array_key_exists($temp_val,$picklistarray))
  1729. {
  1730. if(!in_array($custom_field_values[$i],$picklistarray[$fld->name]) && $custom_field_values[$i] != '')
  1731. $fieldvalue =$app_strings['LBL_NOT_ACCESSIBLE'];
  1732. }
  1733. if(is_array($picklistarray[1]))
  1734. if(array_key_exists($temp_val,$picklistarray[1]))
  1735. {
  1736. $temp =explode(",",str_ireplace(' |##| ',',',$fieldvalue));
  1737. $temp_val = Array();
  1738. foreach($temp as $key =>$val)
  1739. {
  1740. if(!in_array(trim($val),$picklistarray[1][$fld->name]) && trim($val) != '')
  1741. {
  1742. $temp_val[]=$app_strings['LBL_NOT_ACCESSIBLE'];
  1743. }
  1744. else
  1745. $temp_val[]=$val;
  1746. }
  1747. $fieldvalue =(is_array($temp_val))?implode(", ",$temp_val):'';
  1748. }
  1749. if($fieldvalue == "" )
  1750. {
  1751. $fieldvalue = "-";
  1752. }
  1753. else if($fld->name == 'LBL_ACTION')
  1754. {
  1755. $fieldvalue = "<a href='index.php?module={$this->primarymodule}&action=DetailView&record={$fieldvalue}' target='_blank'>".getTranslatedString('LBL_VIEW_DETAILS')."</a>";
  1756. }
  1757. else if(stristr($fieldvalue,"|##|"))
  1758. {
  1759. $fieldvalue = str_ireplace(' |##| ',', ',$fieldvalue);
  1760. }
  1761. else if($fld_type == "date" || $fld_type == "datetime") {
  1762. $fieldvalue = getDisplayDate($fieldvalue);
  1763. }
  1764. if(($lastvalue == $fieldvalue) && $this->reporttype == "summary")
  1765. {
  1766. if($this->reporttype == "summary")
  1767. {
  1768. $valtemplate .= "<td class='rptEmptyGrp'>&nbsp;</td>";
  1769. }else
  1770. {
  1771. $valtemplate .= "<td class='rptData'>".$fieldvalue."</td>";
  1772. }
  1773. }else if(($secondvalue === $fieldvalue) && $this->reporttype == "summary")
  1774. {
  1775. if($lastvalue === $newvalue)
  1776. {
  1777. $valtemplate .= "<td class='rptEmptyGrp'>&nbsp;</td>";
  1778. }else
  1779. {
  1780. $valtemplate .= "<td class='rptGrpHead'>".$fieldvalue."</td>";
  1781. }
  1782. }
  1783. else if(($thirdvalue === $fieldvalue) && $this->reporttype == "summary")
  1784. {
  1785. if($secondvalue === $snewvalue)
  1786. {
  1787. $valtemplate .= "<td class='rptEmptyGrp'>&nbsp;</td>";
  1788. }else
  1789. {
  1790. $valtemplate .= "<td class='rptGrpHead'>".$fieldvalue."</td>";
  1791. }
  1792. }
  1793. else
  1794. {
  1795. if($this->reporttype == "tabular")
  1796. {
  1797. $valtemplate .= "<td class='rptData'>".$fieldvalue."</td>";
  1798. }else
  1799. {
  1800. $valtemplate .= "<td class='rptGrpHead'>".$fieldvalue."</td>";
  1801. }
  1802. }
  1803. // Performance Optimization: If direct output is required
  1804. if($directOutput) {
  1805. echo $valtemplate;
  1806. $valtemplate = '';
  1807. }
  1808. // END
  1809. }
  1810. $valtemplate .= "</tr>";
  1811. // Performance Optimization: If direct output is required
  1812. if($directOutput) {
  1813. echo $valtemplate;
  1814. $valtemplate = '';
  1815. }
  1816. // END
  1817. $lastvalue = $newvalue;
  1818. $secondvalue = $snewvalue;
  1819. $thirdvalue = $tnewvalue;
  1820. $arr_val[] = $arraylists;
  1821. set_time_limit($php_max_execution_time);
  1822. }while($custom_field_values = $adb->fetch_array($result));
  1823. // Performance Optimization
  1824. if($directOutput) {
  1825. echo "</tr></table>";
  1826. echo "<script type='text/javascript' id='__reportrun_directoutput_recordcount_script'>
  1827. if($('_reportrun_total')) $('_reportrun_total').innerHTML=$noofrows;</script>";
  1828. } else {
  1829. $sHTML ='<table cellpadding="5" cellspacing="0" align="center" class="rptTable">
  1830. <tr>'.
  1831. $header
  1832. .'<!-- BEGIN values -->
  1833. <tr>'.
  1834. $valtemplate
  1835. .'</tr>
  1836. </table>';
  1837. }
  1838. //<<<<<<<<construct HTML>>>>>>>>>>>>
  1839. $return_data[] = $sHTML;
  1840. $return_data[] = $noofrows;
  1841. $return_data[] = $sSQL;
  1842. return $return_data;
  1843. }
  1844. }elseif($outputformat == "PDF")
  1845. {
  1846. $sSQL = $this->sGetSQLforReport($this->reportid,$filterlist);
  1847. $result = $adb->query($sSQL);
  1848. if($is_admin==false && $profileGlobalPermission[1] == 1 && $profileGlobalPermission[2] == 1)
  1849. $picklistarray = $this->getAccessPickListValues();
  1850. if($result)
  1851. {
  1852. $y=$adb->num_fields($result);
  1853. $noofrows = $adb->num_rows($result);
  1854. $custom_field_values = $adb->fetch_array($result);
  1855. $column_definitions = $adb->getFieldsDefinition($result);
  1856. do
  1857. {
  1858. $arraylists = Array();
  1859. for ($i=0; $i<$y; $i++)
  1860. {
  1861. $fld = $adb->field_name($result, $i);
  1862. $fld_type = $column_definitions[$i]->type;
  1863. if (in_array($fld->name, $this->convert_currency)) {
  1864. $fieldvalue = convertFromMasterCurrency($custom_field_values[$i],$current_user->conv_rate);
  1865. } elseif(in_array($fld->name, $this->append_currency_symbol_to_value)) {
  1866. $curid_value = explode("::", $custom_field_values[$i]);
  1867. $currency_id = $curid_value[0];
  1868. $currency_value = $curid_value[1];
  1869. $cur_sym_rate = getCurrencySymbolandCRate($currency_id);
  1870. $fieldvalue = $cur_sym_rate['symbol']." ".$currency_value;
  1871. }elseif ($fld->name == "PurchaseOrder_Currency" || $fld->name == "SalesOrder_Currency"
  1872. || $fld->name == "Invoice_Currency" || $fld->name == "Quotes_Currency") {
  1873. $fieldvalue = getCurrencyName($custom_field_values[$i]);
  1874. }elseif (in_array($fld->name,$this->ui10_fields) && !empty($custom_field_values[$i])) {
  1875. $type = getSalesEntityType($custom_field_values[$i]);
  1876. $tmp =getEntityName($type,$custom_field_values[$i]);
  1877. foreach($tmp as $key=>$val){
  1878. $fieldvalue = $val;
  1879. break;
  1880. }
  1881. }else {
  1882. $fieldvalue = getTranslatedString($custom_field_values[$i]);
  1883. }
  1884. $append_cur = str_replace($fld->name,"",decode_html($this->getLstringforReportHeaders($fld->name)));
  1885. $headerLabel = str_replace("_"," ",$fld->name);
  1886. /*STRING TRANSLATION starts */
  1887. $mod_name = split(' ',$headerLabel,2);
  1888. $module ='';
  1889. if(in_array($mod_name[0],$modules_selected))
  1890. $module = getTranslatedString($mod_name[0],$mod_name[0]);
  1891. if(!empty($this->secondarymodule)){
  1892. if($module!=''){
  1893. $headerLabel_tmp = $module." ".getTranslatedString($mod_name[1],$mod_name[0]);
  1894. } else {
  1895. $headerLabel_tmp = getTranslatedString($mod_name[0]." ".$mod_name[1]);
  1896. }
  1897. } else {
  1898. if($module!=''){
  1899. $headerLabel_tmp = getTranslatedString($mod_name[1],$mod_name[0]);
  1900. } else {
  1901. $headerLabel_tmp = getTranslatedString($mod_name[0]." ".$mod_name[1]);
  1902. }
  1903. }
  1904. if($headerLabel == $headerLabel_tmp) $headerLabel = getTranslatedString($headerLabel_tmp);
  1905. else $headerLabel = $headerLabel_tmp;
  1906. /*STRING TRANSLATION starts */
  1907. if(trim($append_cur)!="") $headerLabel .= $append_cur;
  1908. $fieldvalue = str_replace("<", "&lt;", $fieldvalue);
  1909. $fieldvalue = str_replace(">", "&gt;", $fieldvalue);
  1910. // Check for role based pick list
  1911. $temp_val= $fld->name;
  1912. if(is_array($picklistarray))
  1913. if(array_key_exists($temp_val,$picklistarray))
  1914. {
  1915. if(!in_array($custom_field_values[$i],$picklistarray[$fld->name]) && $custom_field_values[$i] != '')
  1916. {
  1917. $fieldvalue =$app_strings['LBL_NOT_ACCESSIBLE'];
  1918. }
  1919. }
  1920. if(is_array($picklistarray[1]))
  1921. if(array_key_exists($temp_val,$picklistarray[1]))
  1922. {
  1923. $temp =explode(",",str_ireplace(' |##| ',',',$fieldvalue));
  1924. $temp_val = Array();
  1925. foreach($temp as $key =>$val)
  1926. {
  1927. if(!in_array(trim($val),$picklistarray[1][$fld->name]) && trim($val) != '')
  1928. {
  1929. $temp_val[]=$app_strings['LBL_NOT_ACCESSIBLE'];
  1930. }
  1931. else
  1932. $temp_val[]=$val;
  1933. }
  1934. $fieldvalue =(is_array($temp_val))?implode(", ",$temp_val):'';
  1935. }
  1936. if($fieldvalue == "" )
  1937. {
  1938. $fieldvalue = "-";
  1939. }
  1940. else if(stristr($fieldvalue,"|##|"))
  1941. {
  1942. $fieldvalue = str_ireplace(' |##| ',', ',$fieldvalue);
  1943. }
  1944. else if($fld_type == "date" || $fld_type == "datetime") {
  1945. $fieldvalue = getDisplayDate($fieldvalue);
  1946. }
  1947. if(array_key_exists($this->getLstringforReportHeaders($fld->name), $arraylists))
  1948. $arraylists[$headerLabel] = $fieldvalue;
  1949. else
  1950. $arraylists[$headerLabel] = $fieldvalue;
  1951. }
  1952. $arr_val[] = $arraylists;
  1953. set_time_limit($php_max_execution_time);
  1954. }while($custom_field_values = $adb->fetch_array($result));
  1955. return $arr_val;
  1956. }
  1957. }elseif($outputformat == "TOTALXLS")
  1958. {
  1959. $escapedchars = Array('_SUM','_AVG','_MIN','_MAX');
  1960. $totalpdf=array();
  1961. $sSQL = $this->sGetSQLforReport($this->reportid,$filterlist,"COLUMNSTOTOTAL");
  1962. if(isset($this->totallist))
  1963. {
  1964. if($sSQL != "")
  1965. {
  1966. $result = $adb->query($sSQL);
  1967. $y=$adb->num_fields($result);
  1968. $custom_field_values = $adb->fetch_array($result);
  1969. foreach($this->totallist as $key=>$value)
  1970. {
  1971. $fieldlist = explode(":",$key);
  1972. $mod_query = $adb->pquery("SELECT distinct(tabid) as tabid, uitype as uitype from vtiger_field where tablename = ? and columnname=?",array($fieldlist[1],$fieldlist[2]));
  1973. if($adb->num_rows($mod_query)>0){
  1974. $module_name = getTabName($adb->query_result($mod_query,0,'tabid'));
  1975. $fieldlabel = trim(str_replace($escapedchars," ",$fieldlist[3]));
  1976. $fieldlabel = str_replace("_", " ", $fieldlabel);
  1977. if($module_name){
  1978. $field = getTranslatedString($module_name)." ".getTranslatedString($fieldlabel,$module_name);
  1979. } else {
  1980. $field = getTranslatedString($module_name)." ".getTranslatedString($fieldlabel);
  1981. }
  1982. }
  1983. $uitype_arr[str_replace($escapedchars," ",$module_name."_".$fieldlist[3])] = $adb->query_result($mod_query,0,"uitype");
  1984. $totclmnflds[str_replace($escapedchars," ",$module_name."_".$fieldlist[3])] = $field;
  1985. }
  1986. for($i =0;$i<$y;$i++)
  1987. {
  1988. $fld = $adb->field_name($result, $i);
  1989. $keyhdr[$fld->name] = $custom_field_values[$i];
  1990. }
  1991. $rowcount=0;
  1992. foreach($totclmnflds as $key=>$value)
  1993. {
  1994. $col_header = trim(str_replace($modules," ",$value));
  1995. $fld_name_1 = $this->primarymodule . "_" . trim($value);
  1996. $fld_name_2 = $this->secondarymodule . "_" . trim($value);
  1997. if($uitype_arr[$value]==71 || in_array($fld_name_1,$this->convert_currency) || in_array($fld_name_1,$this->append_currency_symbol_to_value)
  1998. || in_array($fld_name_2,$this->convert_currency) || in_array($fld_name_2,$this->append_currency_symbol_to_value)) {
  1999. $col_header .= " (".$app_strings['LBL_IN']." ".$current_user->currency_symbol.")";
  2000. $convert_price = true;
  2001. } else{
  2002. $convert_price = false;
  2003. }
  2004. $value = trim($key);
  2005. $arraykey = $value.'_SUM';
  2006. if(isset($keyhdr[$arraykey]))
  2007. {
  2008. if($convert_price)
  2009. $conv_value = convertFromMasterCurrency($keyhdr[$arraykey],$current_user->conv_rate);
  2010. else
  2011. $conv_value = $keyhdr[$arraykey];
  2012. $totalpdf[$rowcount][$arraykey] = $conv_value;
  2013. }else
  2014. {
  2015. $totalpdf[$rowcount][$arraykey] = '';
  2016. }
  2017. $arraykey = $value.'_AVG';
  2018. if(isset($keyhdr[$arraykey]))
  2019. {
  2020. if($convert_price)
  2021. $conv_value = convertFromMasterCurrency($keyhdr[$arraykey],$current_user->conv_rate);
  2022. else
  2023. $conv_value = $keyhdr[$arraykey];
  2024. $totalpdf[$rowcount][$arraykey] = $conv_value;
  2025. }else
  2026. {
  2027. $totalpdf[$rowcount][$arraykey] = '';
  2028. }
  2029. $arraykey = $value.'_MIN';
  2030. if(isset($keyhdr[$arraykey]))
  2031. {
  2032. if($convert_price)
  2033. $conv_value = convertFromMasterCurrency($keyhdr[$arraykey],$current_user->conv_rate);
  2034. else
  2035. $conv_value = $keyhdr[$arraykey];
  2036. $totalpdf[$rowcount][$arraykey] = $conv_value;
  2037. }else
  2038. {
  2039. $totalpdf[$rowcount][$arraykey] = '';
  2040. }
  2041. $arraykey = $value.'_MAX';
  2042. if(isset($keyhdr[$arraykey]))
  2043. {
  2044. if($convert_price)
  2045. $conv_value = convertFromMasterCurrency($keyhdr[$arraykey],$current_user->conv_rate);
  2046. else
  2047. $conv_value = $keyhdr[$arraykey];
  2048. $totalpdf[$rowcount][$arraykey] = $conv_value;
  2049. }else
  2050. {
  2051. $totalpdf[$rowcount][$arraykey] = '';
  2052. }
  2053. $rowcount++;
  2054. }
  2055. }
  2056. }
  2057. return $totalpdf;
  2058. }elseif($outputformat == "TOTALHTML")
  2059. {
  2060. $escapedchars = Array('_SUM','_AVG','_MIN','_MAX');
  2061. $sSQL = $this->sGetSQLforReport($this->reportid,$filterlist,"COLUMNSTOTOTAL");
  2062. if(isset($this->totallist))
  2063. {
  2064. if($sSQL != "")
  2065. {
  2066. $result = $adb->query($sSQL);
  2067. $y=$adb->num_fields($result);
  2068. $custom_field_values = $adb->fetch_array($result);
  2069. $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>";
  2070. // Performation Optimization: If Direct output is desired
  2071. if($directOutput) {
  2072. echo $coltotalhtml;
  2073. $coltotalhtml = '';
  2074. }
  2075. // END
  2076. foreach($this->totallist as $key=>$value)
  2077. {
  2078. $fieldlist = explode(":",$key);
  2079. $mod_query = $adb->pquery("SELECT distinct(tabid) as tabid, uitype as uitype from vtiger_field where tablename = ? and columnname=?",array($fieldlist[1],$fieldlist[2]));
  2080. if($adb->num_rows($mod_query)>0){
  2081. $module_name = getTabName($adb->query_result($mod_query,0,'tabid'));
  2082. $fieldlabel = trim(str_replace($escapedchars," ",$fieldlist[3]));
  2083. $fieldlabel = str_replace("_", " ", $fieldlabel);
  2084. if($module_name){
  2085. $field = getTranslatedString($module_name)." ".getTranslatedString($fieldlabel,$module_name);
  2086. } else {
  2087. $field = getTranslatedString($module_name)." ".getTranslatedString($fieldlabel);
  2088. }
  2089. }
  2090. $uitype_arr[str_replace($escapedchars," ",$module_name."_".$fieldlist[3])] = $adb->query_result($mod_query,0,"uitype");
  2091. $totclmnflds[str_replace($escapedchars," ",$module_name."_".$fieldlist[3])] = $field;
  2092. }
  2093. for($i =0;$i<$y;$i++)
  2094. {
  2095. $fld = $adb->field_name($result, $i);
  2096. $keyhdr[$fld->name] = $custom_field_values[$i];
  2097. }
  2098. foreach($totclmnflds as $key=>$value)
  2099. {
  2100. $coltotalhtml .= '<tr class="rptGrpHead" valign=top>';
  2101. $col_header = trim(str_replace($modules," ",$value));
  2102. $fld_name_1 = $this->primarymodule . "_" . trim($value);
  2103. $fld_name_2 = $this->secondarymodule . "_" . trim($value);
  2104. if($uitype_arr[$value]==71 || in_array($fld_name_1,$this->convert_currency) || in_array($fld_name_1,$this->append_currency_symbol_to_value)
  2105. || in_array($fld_name_2,$this->convert_currency) || in_array($fld_name_2,$this->append_currency_symbol_to_value)) {
  2106. $col_header .= " (".$app_strings['LBL_IN']." ".$current_user->currency_symbol.")";
  2107. $convert_price = true;
  2108. } else{
  2109. $convert_price = false;
  2110. }
  2111. $coltotalhtml .= '<td class="rptData">'. $col_header .'</td>';
  2112. $value = trim($key);
  2113. $arraykey = $value.'_SUM';
  2114. if(isset($keyhdr[$arraykey]))
  2115. {
  2116. if($convert_price)
  2117. $conv_value = convertFromMasterCurrency($keyhdr[$arraykey],$current_user->conv_rate);
  2118. else
  2119. $conv_value = $keyhdr[$arraykey];
  2120. $coltotalhtml .= '<td class="rptTotal">'.$conv_value.'</td>';
  2121. }else
  2122. {
  2123. $coltotalhtml .= '<td class="rptTotal">&nbsp;</td>';
  2124. }
  2125. $arraykey = $value.'_AVG';
  2126. if(isset($keyhdr[$arraykey]))
  2127. {
  2128. if($convert_price)
  2129. $conv_value = convertFromMasterCurrency($keyhdr[$arraykey],$current_user->conv_rate);
  2130. else
  2131. $conv_value = $keyhdr[$arraykey];
  2132. $coltotalhtml .= '<td class="rptTotal">'.$conv_value.'</td>';
  2133. }else
  2134. {
  2135. $coltotalhtml .= '<td class="rptTotal">&nbsp;</td>';
  2136. }
  2137. $arraykey = $value.'_MIN';
  2138. if(isset($keyhdr[$arraykey]))
  2139. {
  2140. if($convert_price)
  2141. $conv_value = convertFromMasterCurrency($keyhdr[$arraykey],$current_user->conv_rate);
  2142. else
  2143. $conv_value = $keyhdr[$arraykey];
  2144. $coltotalhtml .= '<td class="rptTotal">'.$conv_value.'</td>';
  2145. }else
  2146. {
  2147. $coltotalhtml .= '<td class="rptTotal">&nbsp;</td>';
  2148. }
  2149. $arraykey = $value.'_MAX';
  2150. if(isset($keyhdr[$arraykey]))
  2151. {
  2152. if($convert_price)
  2153. $conv_value = convertFromMasterCurrency($keyhdr[$arraykey],$current_user->conv_rate);
  2154. else
  2155. $conv_value = $keyhdr[$arraykey];
  2156. $coltotalhtml .= '<td class="rptTotal">'.$conv_value.'</td>';
  2157. }else
  2158. {
  2159. $coltotalhtml .= '<td class="rptTotal">&nbsp;</td>';
  2160. }
  2161. $coltotalhtml .= '<tr>';
  2162. // Performation Optimization: If Direct output is desired
  2163. if($directOutput) {
  2164. echo $coltotalhtml;
  2165. $coltotalhtml = '';
  2166. }
  2167. // END
  2168. }
  2169. $coltotalhtml .= "</table>";
  2170. // Performation Optimization: If Direct output is desired
  2171. if($directOutput) {
  2172. echo $coltotalhtml;
  2173. $coltotalhtml = '';
  2174. }
  2175. // END
  2176. }
  2177. }
  2178. return $coltotalhtml;
  2179. }elseif($outputformat == "PRINT")
  2180. {
  2181. $sSQL = $this->sGetSQLforReport($this->reportid,$filterlist);
  2182. $result = $adb->query($sSQL);
  2183. if($is_admin==false && $profileGlobalPermission[1] == 1 && $profileGlobalPermission[2] == 1)
  2184. $picklistarray = $this->getAccessPickListValues();
  2185. if($result)
  2186. {
  2187. $y=$adb->num_fields($result);
  2188. $arrayHeaders = Array();
  2189. for ($x=0; $x<$y; $x++)
  2190. {
  2191. $fld = $adb->field_name($result, $x);
  2192. if(in_array($this->getLstringforReportHeaders($fld->name), $arrayHeaders))
  2193. {
  2194. $headerLabel = str_replace("_"," ",$fld->name);
  2195. $arrayHeaders[] = $headerLabel;
  2196. }
  2197. else
  2198. {
  2199. $headerLabel = str_replace($modules," ",$this->getLstringforReportHeaders($fld->name));
  2200. $arrayHeaders[] = $headerLabel;
  2201. }
  2202. /*STRING TRANSLATION starts */
  2203. $mod_name = split(' ',$headerLabel,2);
  2204. $module ='';
  2205. if(in_array($mod_name[0],$modules_selected)){
  2206. $module = getTranslatedString($mod_name[0],$mod_name[0]);
  2207. }
  2208. if(!empty($this->secondarymodule)){
  2209. if($module!=''){
  2210. $headerLabel_tmp = $module." ".getTranslatedString($mod_name[1],$mod_name[0]);
  2211. } else {
  2212. $headerLabel_tmp = getTranslatedString($mod_name[0]." ".$mod_name[1]);
  2213. }
  2214. } else {
  2215. if($module!=''){
  2216. $headerLabel_tmp = getTranslatedString($mod_name[1],$mod_name[0]);
  2217. } else {
  2218. $headerLabel_tmp = getTranslatedString($mod_name[0]." ".$mod_name[1]);
  2219. }
  2220. }
  2221. if($headerLabel == $headerLabel_tmp) $headerLabel = getTranslatedString($headerLabel_tmp);
  2222. else $headerLabel = $headerLabel_tmp;
  2223. /*STRING TRANSLATION ends */
  2224. $header .= "<th>".$headerLabel."</th>";
  2225. }
  2226. $noofrows = $adb->num_rows($result);
  2227. $custom_field_values = $adb->fetch_array($result);
  2228. $groupslist = $this->getGroupingList($this->reportid);
  2229. $column_definitions = $adb->getFieldsDefinition($result);
  2230. do
  2231. {
  2232. $arraylists = Array();
  2233. if(count($groupslist) == 1)
  2234. {
  2235. $newvalue = $custom_field_values[0];
  2236. }elseif(count($groupslist) == 2)
  2237. {
  2238. $newvalue = $custom_field_values[0];
  2239. $snewvalue = $custom_field_values[1];
  2240. }elseif(count($groupslist) == 3)
  2241. {
  2242. $newvalue = $custom_field_values[0];
  2243. $snewvalue = $custom_field_values[1];
  2244. $tnewvalue = $custom_field_values[2];
  2245. }
  2246. if($newvalue == "") $newvalue = "-";
  2247. if($snewvalue == "") $snewvalue = "-";
  2248. if($tnewvalue == "") $tnewvalue = "-";
  2249. $valtemplate .= "<tr>";
  2250. for ($i=0; $i<$y; $i++)
  2251. {
  2252. $fld = $adb->field_name($result, $i);
  2253. $fld_type = $column_definitions[$i]->type;
  2254. if (in_array($fld->name, $this->convert_currency)) {
  2255. $fieldvalue = convertFromMasterCurrency($custom_field_values[$i],$current_user->conv_rate);
  2256. } elseif(in_array($fld->name, $this->append_currency_symbol_to_value)) {
  2257. $curid_value = explode("::", $custom_field_values[$i]);
  2258. $currency_id = $curid_value[0];
  2259. $currency_value = $curid_value[1];
  2260. $cur_sym_rate = getCurrencySymbolandCRate($currency_id);
  2261. $fieldvalue = $cur_sym_rate['symbol']." ".$currency_value;
  2262. }elseif ($fld->name == "PurchaseOrder_Currency" || $fld->name == "SalesOrder_Currency"
  2263. || $fld->name == "Invoice_Currency" || $fld->name == "Quotes_Currency") {
  2264. $fieldvalue = getCurrencyName($custom_field_values[$i]);
  2265. }elseif (in_array($fld->name,$this->ui10_fields) && !empty($custom_field_values[$i])) {
  2266. $type = getSalesEntityType($custom_field_values[$i]);
  2267. $tmp =getEntityName($type,$custom_field_values[$i]);
  2268. foreach($tmp as $key=>$val){
  2269. $fieldvalue = $val;
  2270. break;
  2271. }
  2272. }else {
  2273. $fieldvalue = getTranslatedString($custom_field_values[$i]);
  2274. }
  2275. $fieldvalue = str_replace("<", "&lt;", $fieldvalue);
  2276. $fieldvalue = str_replace(">", "&gt;", $fieldvalue);
  2277. //Check For Role based pick list
  2278. $temp_val= $fld->name;
  2279. if(is_array($picklistarray))
  2280. if(array_key_exists($temp_val,$picklistarray))
  2281. {
  2282. if(!in_array($custom_field_values[$i],$picklistarray[$fld->name]) && $custom_field_values[$i] != '')
  2283. {
  2284. $fieldvalue =$app_strings['LBL_NOT_ACCESSIBLE'];
  2285. }
  2286. }
  2287. if(is_array($picklistarray[1]))
  2288. if(array_key_exists($temp_val,$picklistarray[1]))
  2289. {
  2290. $temp =explode(",",str_ireplace(' |##| ',',',$fieldvalue));
  2291. $temp_val = Array();
  2292. foreach($temp as $key =>$val)
  2293. {
  2294. if(!in_array(trim($val),$picklistarray[1][$fld->name]) && trim($val) != '')
  2295. {
  2296. $temp_val[]=$app_strings['LBL_NOT_ACCESSIBLE'];
  2297. }
  2298. else
  2299. $temp_val[]=$val;
  2300. }
  2301. $fieldvalue =(is_array($temp_val))?implode(", ",$temp_val):'';
  2302. }
  2303. if($fieldvalue == "" )
  2304. {
  2305. $fieldvalue = "-";
  2306. }
  2307. else if(stristr($fieldvalue,"|##|"))
  2308. {
  2309. $fieldvalue = str_ireplace(' |##| ',', ',$fieldvalue);
  2310. }
  2311. else if($fld_type == "date" || $fld_type == "datetime") {
  2312. $fieldvalue = getDisplayDate($fieldvalue);
  2313. }
  2314. if(($lastvalue == $fieldvalue) && $this->reporttype == "summary")
  2315. {
  2316. if($this->reporttype == "summary")
  2317. {
  2318. $valtemplate .= "<td style='border-top:1px dotted #FFFFFF;'>&nbsp;</td>";
  2319. }else
  2320. {
  2321. $valtemplate .= "<td>".$fieldvalue."</td>";
  2322. }
  2323. }else if(($secondvalue == $fieldvalue) && $this->reporttype == "summary")
  2324. {
  2325. if($lastvalue == $newvalue)
  2326. {
  2327. $valtemplate .= "<td style='border-top:1px dotted #FFFFFF;'>&nbsp;</td>";
  2328. }else
  2329. {
  2330. $valtemplate .= "<td>".$fieldvalue."</td>";
  2331. }
  2332. }
  2333. else if(($thirdvalue == $fieldvalue) && $this->reporttype == "summary")
  2334. {
  2335. if($secondvalue == $snewvalue)
  2336. {
  2337. $valtemplate .= "<td style='border-top:1px dotted #FFFFFF;'>&nbsp;</td>";
  2338. }else
  2339. {
  2340. $valtemplate .= "<td>".$fieldvalue."</td>";
  2341. }
  2342. }
  2343. else
  2344. {
  2345. if($this->reporttype == "tabular")
  2346. {
  2347. $valtemplate .= "<td>".$fieldvalue."</td>";
  2348. }else
  2349. {
  2350. $valtemplate .= "<td>".$fieldvalue."</td>";
  2351. }
  2352. }
  2353. }
  2354. $valtemplate .= "</tr>";
  2355. $lastvalue = $newvalue;
  2356. $secondvalue = $snewvalue;
  2357. $thirdvalue = $tnewvalue;
  2358. $arr_val[] = $arraylists;
  2359. set_time_limit($php_max_execution_time);
  2360. }while($custom_field_values = $adb->fetch_array($result));
  2361. $sHTML = '<tr>'.$header.'</tr>'.$valtemplate;
  2362. $return_data[] = $sHTML;
  2363. $return_data[] = $noofrows;
  2364. return $return_data;
  2365. }
  2366. }elseif($outputformat == "PRINT_TOTAL")
  2367. {
  2368. $escapedchars = Array('_SUM','_AVG','_MIN','_MAX');
  2369. $sSQL = $this->sGetSQLforReport($this->reportid,$filterlist,"COLUMNSTOTOTAL");
  2370. if(isset($this->totallist))
  2371. {
  2372. if($sSQL != "")
  2373. {
  2374. $result = $adb->query($sSQL);
  2375. $y=$adb->num_fields($result);
  2376. $custom_field_values = $adb->fetch_array($result);
  2377. $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>";
  2378. // Performation Optimization: If Direct output is desired
  2379. if($directOutput) {
  2380. echo $coltotalhtml;
  2381. $coltotalhtml = '';
  2382. }
  2383. // END
  2384. foreach($this->totallist as $key=>$value)
  2385. {
  2386. $fieldlist = explode(":",$key);
  2387. $mod_query = $adb->pquery("SELECT distinct(tabid) as tabid, uitype as uitype from vtiger_field where tablename = ? and columnname=?",array($fieldlist[1],$fieldlist[2]));
  2388. if($adb->num_rows($mod_query)>0){
  2389. $module_name = getTabName($adb->query_result($mod_query,0,'tabid'));
  2390. $fieldlabel = trim(str_replace($escapedchars," ",$fieldlist[3]));
  2391. $fieldlabel = str_replace("_", " ", $fieldlabel);
  2392. if($module_name){
  2393. $field = getTranslatedString($module_name)." ".getTranslatedString($fieldlabel,$module_name);
  2394. } else {
  2395. $field = getTranslatedString($module_name)." ".getTranslatedString($fieldlabel);
  2396. }
  2397. }
  2398. $uitype_arr[str_replace($escapedchars," ",$module_name."_".$fieldlist[3])] = $adb->query_result($mod_query,0,"uitype");
  2399. $totclmnflds[str_replace($escapedchars," ",$module_name."_".$fieldlist[3])] = $field;
  2400. }
  2401. for($i =0;$i<$y;$i++)
  2402. {
  2403. $fld = $adb->field_name($result, $i);
  2404. $keyhdr[$fld->name] = $custom_field_values[$i];
  2405. }
  2406. foreach($totclmnflds as $key=>$value)
  2407. {
  2408. $coltotalhtml .= '<tr class="rptGrpHead">';
  2409. $col_header = getTranslatedString(trim(str_replace($modules," ",$value)));
  2410. $fld_name_1 = $this->primarymodule . "_" . trim($value);
  2411. $fld_name_2 = $this->secondarymodule . "_" . trim($value);
  2412. if($uitype_arr[$value]==71 || in_array($fld_name_1,$this->convert_currency) || in_array($fld_name_1,$this->append_currency_symbol_to_value)
  2413. || in_array($fld_name_2,$this->convert_currency) || in_array($fld_name_2,$this->append_currency_symbol_to_value)) {
  2414. $col_header .= " (".$app_strings['LBL_IN']." ".$current_user->currency_symbol.")";
  2415. $convert_price = true;
  2416. } else{
  2417. $convert_price = false;
  2418. }
  2419. $coltotalhtml .= '<td class="rptData">'. $col_header .'</td>';
  2420. $value = trim($key);
  2421. $arraykey = $value.'_SUM';
  2422. if(isset($keyhdr[$arraykey]))
  2423. {
  2424. if($convert_price)
  2425. $conv_value = convertFromMasterCurrency($keyhdr[$arraykey],$current_user->conv_rate);
  2426. else
  2427. $conv_value = $keyhdr[$arraykey];
  2428. $coltotalhtml .= "<td class='rptTotal'>".$conv_value.'</td>';
  2429. }else
  2430. {
  2431. $coltotalhtml .= "<td class='rptTotal'>&nbsp;</td>";
  2432. }
  2433. $arraykey = $value.'_AVG';
  2434. if(isset($keyhdr[$arraykey]))
  2435. {
  2436. if($convert_price)
  2437. $conv_value = convertFromMasterCurrency($keyhdr[$arraykey],$current_user->conv_rate);
  2438. else
  2439. $conv_value = $keyhdr[$arraykey];
  2440. $coltotalhtml .= "<td class='rptTotal'>".$conv_value.'</td>';
  2441. }else
  2442. {
  2443. $coltotalhtml .= "<td class='rptTotal'>&nbsp;</td>";
  2444. }
  2445. $arraykey = $value.'_MIN';
  2446. if(isset($keyhdr[$arraykey]))
  2447. {
  2448. if($convert_price)
  2449. $conv_value = convertFromMasterCurrency($keyhdr[$arraykey],$current_user->conv_rate);
  2450. else
  2451. $conv_value = $keyhdr[$arraykey];
  2452. $coltotalhtml .= "<td class='rptTotal'>".$conv_value.'</td>';
  2453. }else
  2454. {
  2455. $coltotalhtml .= "<td class='rptTotal'>&nbsp;</td>";
  2456. }
  2457. $arraykey = $value.'_MAX';
  2458. if(isset($keyhdr[$arraykey]))
  2459. {
  2460. if($convert_price)
  2461. $conv_value = convertFromMasterCurrency($keyhdr[$arraykey],$current_user->conv_rate);
  2462. else
  2463. $conv_value = $keyhdr[$arraykey];
  2464. $coltotalhtml .= "<td class='rptTotal'>".$conv_value.'</td>';
  2465. }else
  2466. {
  2467. $coltotalhtml .= "<td class='rptTotal'>&nbsp;</td>";
  2468. }
  2469. $coltotalhtml .= '</tr>';
  2470. // Performation Optimization: If Direct output is desired
  2471. if($directOutput) {
  2472. echo $coltotalhtml;
  2473. $coltotalhtml = '';
  2474. }
  2475. // END
  2476. }
  2477. $coltotalhtml .= "</table>";
  2478. // Performation Optimization: If Direct output is desired
  2479. if($directOutput) {
  2480. echo $coltotalhtml;
  2481. $coltotalhtml = '';
  2482. }
  2483. // END
  2484. }
  2485. }
  2486. return $coltotalhtml;
  2487. }
  2488. }
  2489. //<<<<<<<new>>>>>>>>>>
  2490. function getColumnsTotal($reportid)
  2491. {
  2492. // Have we initialized it already?
  2493. if($this->_columnstotallist !== false) {
  2494. return $this->_columnstotallist;
  2495. }
  2496. global $adb;
  2497. global $modules;
  2498. global $log, $current_user;
  2499. $query = "select * from vtiger_reportmodules where reportmodulesid =?";
  2500. $res = $adb->pquery($query , array($reportid));
  2501. $modrow = $adb->fetch_array($res);
  2502. $premod = $modrow["primarymodule"];
  2503. $secmod = $modrow["secondarymodules"];
  2504. $coltotalsql = "select vtiger_reportsummary.* from vtiger_report";
  2505. $coltotalsql .= " inner join vtiger_reportsummary on vtiger_report.reportid = vtiger_reportsummary.reportsummaryid";
  2506. $coltotalsql .= " where vtiger_report.reportid =?";
  2507. $result = $adb->pquery($coltotalsql, array($reportid));
  2508. while($coltotalrow = $adb->fetch_array($result))
  2509. {
  2510. $fieldcolname = $coltotalrow["columnname"];
  2511. if($fieldcolname != "none")
  2512. {
  2513. $fieldlist = explode(":",$fieldcolname);
  2514. $field_tablename = $fieldlist[1];
  2515. $field_columnname = $fieldlist[2];
  2516. $mod_query = $adb->pquery("SELECT distinct(tabid) as tabid from vtiger_field where tablename = ? and columnname=?",array($fieldlist[1],$fieldlist[2]));
  2517. if($adb->num_rows($mod_query)>0){
  2518. $module_name = getTabName($adb->query_result($mod_query,0,'tabid'));
  2519. $fieldlabel = trim($fieldlist[3]);
  2520. if($module_name){
  2521. $field_columnalias = $module_name."_".$fieldlist[3];
  2522. } else {
  2523. $field_columnalias = $module_name."_".$fieldlist[3];
  2524. }
  2525. }
  2526. //$field_columnalias = $fieldlist[3];
  2527. $field_permitted = false;
  2528. if(CheckColumnPermission($field_tablename,$field_columnname,$premod) != "false"){
  2529. $field_permitted = true;
  2530. } else {
  2531. $mod = split(":",$secmod);
  2532. foreach($mod as $key){
  2533. if(CheckColumnPermission($field_tablename,$field_columnname,$key) != "false"){
  2534. $field_permitted=true;
  2535. }
  2536. }
  2537. }
  2538. if($field_permitted == true)
  2539. {
  2540. $field = $field_tablename.".".$field_columnname;
  2541. if($field_tablename == 'vtiger_products' && $field_columnname == 'unit_price') {
  2542. // Query needs to be rebuild to get the value in user preferred currency. [innerProduct and actual_unit_price are table and column alias.]
  2543. $field = " innerProduct.actual_unit_price";
  2544. }
  2545. if($field_tablename == 'vtiger_service' && $field_columnname == 'unit_price') {
  2546. // Query needs to be rebuild to get the value in user preferred currency. [innerProduct and actual_unit_price are table and column alias.]
  2547. $field = " innerService.actual_unit_price";
  2548. }
  2549. if(($field_tablename == 'vtiger_invoice' || $field_tablename == 'vtiger_quotes' || $field_tablename == 'vtiger_purchaseorder' || $field_tablename == 'vtiger_salesorder')
  2550. && ($field_columnname == 'total' || $field_columnname == 'subtotal' || $field_columnname == 'discount_amount' || $field_columnname == 's_h_amount')) {
  2551. $field = " $field_tablename.$field_columnname/$field_tablename.conversion_rate ";
  2552. }
  2553. if($fieldlist[4] == 2)
  2554. {
  2555. $stdfilterlist[$fieldcolname] = "sum($field) '".$field_columnalias."'";
  2556. }
  2557. if($fieldlist[4] == 3)
  2558. {
  2559. //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.
  2560. //$stdfilterlist[$fieldcolname] = "avg(".$fieldlist[1].".".$fieldlist[2].") '".$fieldlist[3]."'";
  2561. $stdfilterlist[$fieldcolname] = "(sum($field)/count(*)) '".$field_columnalias."'";
  2562. }
  2563. if($fieldlist[4] == 4)
  2564. {
  2565. $stdfilterlist[$fieldcolname] = "min($field) '".$field_columnalias."'";
  2566. }
  2567. if($fieldlist[4] == 5)
  2568. {
  2569. $stdfilterlist[$fieldcolname] = "max($field) '".$field_columnalias."'";
  2570. }
  2571. }
  2572. }
  2573. }
  2574. // Save the information
  2575. $this->_columnstotallist = $stdfilterlist;
  2576. $log->info("ReportRun :: Successfully returned getColumnsTotal".$reportid);
  2577. return $stdfilterlist;
  2578. }
  2579. //<<<<<<new>>>>>>>>>
  2580. /** function to get query for the columns to total for the given reportid
  2581. * @ param $reportid : Type integer
  2582. * This returns columnstoTotal query for the reportid
  2583. */
  2584. function getColumnsToTotalColumns($reportid)
  2585. {
  2586. global $adb;
  2587. global $modules;
  2588. global $log;
  2589. $sreportstdfiltersql = "select vtiger_reportsummary.* from vtiger_report";
  2590. $sreportstdfiltersql .= " inner join vtiger_reportsummary on vtiger_report.reportid = vtiger_reportsummary.reportsummaryid";
  2591. $sreportstdfiltersql .= " where vtiger_report.reportid =?";
  2592. $result = $adb->pquery($sreportstdfiltersql, array($reportid));
  2593. $noofrows = $adb->num_rows($result);
  2594. for($i=0; $i<$noofrows; $i++)
  2595. {
  2596. $fieldcolname = $adb->query_result($result,$i,"columnname");
  2597. if($fieldcolname != "none")
  2598. {
  2599. $fieldlist = explode(":",$fieldcolname);
  2600. if($fieldlist[4] == 2)
  2601. {
  2602. $sSQLList[] = "sum(".$fieldlist[1].".".$fieldlist[2].") ".$fieldlist[3];
  2603. }
  2604. if($fieldlist[4] == 3)
  2605. {
  2606. $sSQLList[] = "avg(".$fieldlist[1].".".$fieldlist[2].") ".$fieldlist[3];
  2607. }
  2608. if($fieldlist[4] == 4)
  2609. {
  2610. $sSQLList[] = "min(".$fieldlist[1].".".$fieldlist[2].") ".$fieldlist[3];
  2611. }
  2612. if($fieldlist[4] == 5)
  2613. {
  2614. $sSQLList[] = "max(".$fieldlist[1].".".$fieldlist[2].") ".$fieldlist[3];
  2615. }
  2616. }
  2617. }
  2618. if(isset($sSQLList))
  2619. {
  2620. $sSQL = implode(",",$sSQLList);
  2621. }
  2622. $log->info("ReportRun :: Successfully returned getColumnsToTotalColumns".$reportid);
  2623. return $sSQL;
  2624. }
  2625. /** Function to convert the Report Header Names into i18n
  2626. * @param $fldname: Type Varchar
  2627. * Returns Language Converted Header Strings
  2628. **/
  2629. function getLstringforReportHeaders($fldname)
  2630. {
  2631. global $modules,$current_language,$current_user,$app_strings;
  2632. $rep_header = ltrim(str_replace($modules," ",$fldname));
  2633. $rep_header_temp = preg_replace("/\s+/","_",$rep_header);
  2634. $rep_module = preg_replace("/_$rep_header_temp/","",$fldname);
  2635. $temp_mod_strings = return_module_language($current_language,$rep_module);
  2636. // htmlentities should be decoded in field names (eg. &). Noticed for fields like 'Terms & Conditions', 'S&H Amount'
  2637. $rep_header = decode_html($rep_header);
  2638. $curr_symb = "";
  2639. if(in_array($fldname, $this->convert_currency)) {
  2640. $curr_symb = " (".$app_strings['LBL_IN']." ".$current_user->currency_symbol.")";
  2641. }
  2642. if($temp_mod_strings[$rep_header] != '')
  2643. {
  2644. $rep_header = $temp_mod_strings[$rep_header];
  2645. }
  2646. $rep_header .=$curr_symb;
  2647. return $rep_header;
  2648. }
  2649. /** Function to get picklist value array based on profile
  2650. * * returns permitted fields in array format
  2651. **/
  2652. function getAccessPickListValues()
  2653. {
  2654. global $adb;
  2655. global $current_user;
  2656. $id = array(getTabid($this->primarymodule));
  2657. if($this->secondarymodule != '')
  2658. array_push($id, getTabid($this->secondarymodule));
  2659. $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 (?)';
  2660. $result = $adb->pquery($query, $id);//,$select_column));
  2661. $roleid=$current_user->roleid;
  2662. $subrole = getRoleSubordinates($roleid);
  2663. if(count($subrole)> 0)
  2664. {
  2665. $roleids = $subrole;
  2666. array_push($roleids, $roleid);
  2667. }
  2668. else
  2669. {
  2670. $roleids = $roleid;
  2671. }
  2672. $temp_status = Array();
  2673. for($i=0;$i < $adb->num_rows($result);$i++)
  2674. {
  2675. $fieldname = $adb->query_result($result,$i,"fieldname");
  2676. $fieldlabel = $adb->query_result($result,$i,"fieldlabel");
  2677. $tabid = $adb->query_result($result,$i,"tabid");
  2678. $uitype = $adb->query_result($result,$i,"uitype");
  2679. $fieldlabel1 = str_replace(" ","_",$fieldlabel);
  2680. $keyvalue = getTabModuleName($tabid)."_".$fieldlabel1;
  2681. $fieldvalues = Array();
  2682. if (count($roleids) > 1) {
  2683. $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";
  2684. } else {
  2685. $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";
  2686. }
  2687. if($fieldname != 'firstname')
  2688. $mulselresult = $adb->query($mulsel);
  2689. for($j=0;$j < $adb->num_rows($mulselresult);$j++)
  2690. {
  2691. $fldvalue = $adb->query_result($mulselresult,$j,$fieldname);
  2692. if(in_array($fldvalue,$fieldvalues)) continue;
  2693. $fieldvalues[] = $fldvalue;
  2694. }
  2695. $field_count = count($fieldvalues);
  2696. if( $uitype == 15 && $field_count > 0 && ($fieldname == 'taskstatus' || $fieldname == 'eventstatus'))
  2697. {
  2698. $temp_count =count($temp_status[$keyvalue]);
  2699. if($temp_count > 0)
  2700. {
  2701. for($t=0;$t < $field_count;$t++)
  2702. {
  2703. $temp_status[$keyvalue][($temp_count+$t)] = $fieldvalues[$t];
  2704. }
  2705. $fieldvalues = $temp_status[$keyvalue];
  2706. }
  2707. else
  2708. $temp_status[$keyvalue] = $fieldvalues;
  2709. }
  2710. if($uitype == 33)
  2711. $fieldlists[1][$keyvalue] = $fieldvalues;
  2712. else if($uitype == 55 && $fieldname == 'salutationtype')
  2713. $fieldlists[$keyvalue] = $fieldvalues;
  2714. else if($uitype == 15)
  2715. $fieldlists[$keyvalue] = $fieldvalues;
  2716. }
  2717. return $fieldlists;
  2718. }
  2719. }
  2720. ?>