/modules/Reports/ReportRun.php
PHP | 4148 lines | 3424 code | 463 blank | 261 comment | 1207 complexity | d0e1602f47650ef9bcdbac9c00ebc173 MD5 | raw file
Possible License(s): Apache-2.0, LGPL-3.0, LGPL-2.1, GPL-2.0, GPL-3.0
Large files files are truncated, but you can click here to view the full file
- <?php
- /*+********************************************************************************
- * The contents of this file are subject to the vtiger CRM Public License Version 1.0
- * ("License"); You may not use this file except in compliance with the License
- * The Original Code is: vtiger CRM Open Source
- * The Initial Developer of the Original Code is vtiger.
- * Portions created by vtiger are Copyright (C) vtiger.
- * All Rights Reserved.
- ********************************************************************************/
- global $calpath;
- global $app_strings,$mod_strings;
- global $theme;
- global $log;
- $theme_path="themes/".$theme."/";
- $image_path=$theme_path."images/";
- require_once('include/database/PearDatabase.php');
- require_once('data/CRMEntity.php');
- require_once("modules/Reports/Reports.php");
- require_once 'modules/Reports/ReportUtils.php';
- require_once("vtlib/Vtiger/Module.php");
- require_once(VTIGER6_REL_DIR . 'modules/Vtiger/helpers/Util.php');
- /*
- * Helper class to determine the associative dependency between tables.
- */
- class ReportRunQueryDependencyMatrix {
- protected $matrix = array();
- protected $computedMatrix = null;
- function setDependency($table, array $dependents) {
- $this->matrix[$table] = $dependents;
- }
- function addDependency($table, $dependent) {
- if (isset($this->matrix[$table]) && !in_array($dependent, $this->matrix[$table])) {
- $this->matrix[$table][] = $dependent;
- } else {
- $this->setDependency($table, array($dependent));
- }
- }
- function getDependents($table) {
- $this->computeDependencies();
- return isset($this->computedMatrix[$table])? $this->computedMatrix[$table] : array();
- }
- protected function computeDependencies() {
- if ($this->computedMatrix !== null) return;
- $this->computedMatrix = array();
- foreach ($this->matrix as $key => $values) {
- $this->computedMatrix[$key] =
- $this->computeDependencyForKey($key, $values);
- }
- }
- protected function computeDependencyForKey($key, $values) {
- $merged = array();
- foreach ($values as $value) {
- $merged[] = $value;
- if (isset($this->matrix[$value])) {
- $merged = array_merge($merged, $this->matrix[$value]);
- }
- }
- return $merged;
- }
- }
- class ReportRunQueryPlanner {
- // Turn-off the query planning to revert back - backward compatiblity
- protected $disablePlanner = false;
- protected $tables = array();
- protected $tempTables = array();
- protected $tempTablesInitialized = false;
- // Turn-off in case the query result turns-out to be wrong.
- protected $allowTempTables = true;
- protected $tempTablePrefix = 'vtiger_reptmptbl_';
- protected static $tempTableCounter = 0;
- protected $registeredCleanup = false;
- function addTable($table) {
- $this->tables[$table] = $table;
- }
- function requireTable($table, $dependencies=null) {
- if ($this->disablePlanner) {
- return true;
- }
- if (isset($this->tables[$table])) {
- return true;
- }
- if (is_array($dependencies)) {
- foreach ($dependencies as $dependentTable) {
- if (isset($this->tables[$dependentTable])) {
- return true;
- }
- }
- } else if ($dependencies instanceof ReportRunQueryDependencyMatrix) {
- $dependents = $dependencies->getDependents($table);
- if ($dependents) {
- return count(array_intersect($this->tables, $dependents)) > 0;
- }
- }
- return false;
- }
- function getTables() {
- return $this->tables;
- }
- function newDependencyMatrix() {
- return new ReportRunQueryDependencyMatrix();
- }
- function registerTempTable($query, $keyColumns) {
- if ($this->allowTempTables && !$this->disablePlanner) {
- global $current_user;
- $keyColumns = is_array($keyColumns)? array_unique($keyColumns) : array($keyColumns);
- // Minor optimization to avoid re-creating similar temporary table.
- $uniqueName = NULL;
- foreach ($this->tempTables as $tmpUniqueName => $tmpTableInfo) {
- if (strcasecmp($query, $tmpTableInfo['query']) === 0) {
- // Capture any additional key columns
- $tmpTableInfo['keycolumns'] = array_unique(array_merge($tmpTableInfo['keycolumns'], $keyColumns));
- $uniqueName = $tmpUniqueName;
- break;
- }
- }
- // Nothing found?
- if ($uniqueName === NULL) {
- // TODO Adding randomness in name to avoid concurrency
- // even when same-user opens the report multiple instances at same-time.
- $uniqueName = $this->tempTablePrefix .
- str_replace('.', '', uniqid($current_user->id , true)) . (self::$tempTableCounter++);
- $this->tempTables[$uniqueName] = array(
- 'query' => $query,
- 'keycolumns' => is_array($keyColumns)? array_unique($keyColumns) : array($keyColumns),
- );
- }
- return $uniqueName;
- }
- return "($query)";
- }
- function initializeTempTables() {
- global $adb;
- $oldDieOnError = $adb->dieOnError;
- $adb->dieOnError = false; // If query planner is re-used there could be attempt for temp table...
- foreach ($this->tempTables as $uniqueName => $tempTableInfo) {
- $query1 = sprintf('CREATE TEMPORARY TABLE %s AS %s', $uniqueName, $tempTableInfo['query']);
- $adb->pquery($query1, array());
- $keyColumns = $tempTableInfo['keycolumns'];
- foreach ($keyColumns as $keyColumn) {
- $query2 = sprintf('ALTER TABLE %s ADD INDEX (%s)', $uniqueName, $keyColumn);
- $adb->pquery($query2, array());
- }
- }
- $adb->dieOnError = $oldDieOnError;
- // Trigger cleanup of temporary tables when the execution of the request ends.
- // NOTE: This works better than having in __destruct
- // (as the reference to this object might end pre-maturely even before query is executed)
- if (!$this->registeredCleanup) {
- register_shutdown_function(array($this, 'cleanup'));
- // To avoid duplicate registration on this instance.
- $this->registeredCleanup = true;
- }
- }
- function cleanup() {
- global $adb;
- $oldDieOnError = $adb->dieOnError;
- $adb->dieOnError = false; // To avoid abnormal termination during shutdown...
- foreach ($this->tempTables as $uniqueName => $tempTableInfo) {
- $adb->pquery('DROP TABLE ' . $uniqueName, array());
- }
- $adb->dieOnError = $oldDieOnError;
- $this->tempTables = array();
- }
- }
- class ReportRun extends CRMEntity
- {
- // Maximum rows that should be emitted in HTML view.
- static $HTMLVIEW_MAX_ROWS = 1000;
- var $reportid;
- var $primarymodule;
- var $secondarymodule;
- var $orderbylistsql;
- var $orderbylistcolumns;
- var $selectcolumns;
- var $groupbylist;
- var $reporttype;
- var $reportname;
- var $totallist;
- var $_groupinglist = false;
- var $_columnslist = false;
- var $_stdfilterlist = false;
- var $_columnstotallist = false;
- var $_advfiltersql = false;
- // All UItype 72 fields are added here so that in reports the values are append currencyId::value
- var $append_currency_symbol_to_value = array('Products_Unit_Price','Services_Price',
- 'Invoice_Total', 'Invoice_Sub_Total', 'Invoice_S&H_Amount', 'Invoice_Discount_Amount', 'Invoice_Adjustment',
- 'Quotes_Total', 'Quotes_Sub_Total', 'Quotes_S&H_Amount', 'Quotes_Discount_Amount', 'Quotes_Adjustment',
- 'SalesOrder_Total', 'SalesOrder_Sub_Total', 'SalesOrder_S&H_Amount', 'SalesOrder_Discount_Amount', 'SalesOrder_Adjustment',
- 'PurchaseOrder_Total', 'PurchaseOrder_Sub_Total', 'PurchaseOrder_S&H_Amount', 'PurchaseOrder_Discount_Amount', 'PurchaseOrder_Adjustment',
- 'Invoice_Received','PurchaseOrder_Paid','Invoice_Balance','PurchaseOrder_Balance'
- );
- var $ui10_fields = array();
- var $ui101_fields = array();
- var $groupByTimeParent = array( 'Quarter'=>array('Year'),
- 'Month'=>array('Year')
- );
- var $queryPlanner = null;
- protected static $instances = false;
- // Added to support line item fields calculation, if line item fields
- // are selected then module fields cannot be selected and vice versa
- var $lineItemFieldsInCalculation = false;
- /** Function to set reportid,primarymodule,secondarymodule,reporttype,reportname, for given reportid
- * This function accepts the $reportid as argument
- * It sets reportid,primarymodule,secondarymodule,reporttype,reportname for the given reportid
- * To ensure single-instance is present for $reportid
- * as we optimize using ReportRunPlanner and setup temporary tables.
- */
- function ReportRun($reportid)
- {
- $oReport = new Reports($reportid);
- $this->reportid = $reportid;
- $this->primarymodule = $oReport->primodule;
- $this->secondarymodule = $oReport->secmodule;
- $this->reporttype = $oReport->reporttype;
- $this->reportname = $oReport->reportname;
- $this->queryPlanner = new ReportRunQueryPlanner();
- }
- public static function getInstance($reportid) {
- if (!isset(self::$instances[$reportid])) {
- self::$instances[$reportid] = new ReportRun($reportid);
- }
- return self::$instances[$reportid];
- }
- /** Function to get the columns for the reportid
- * This function accepts the $reportid and $outputformat (optional)
- * This function returns $columnslist Array($tablename:$columnname:$fieldlabel:$fieldname:$typeofdata=>$tablename.$columnname As Header value,
- * $tablename1:$columnname1:$fieldlabel1:$fieldname1:$typeofdata1=>$tablename1.$columnname1 As Header value,
- * |
- * $tablenamen:$columnnamen:$fieldlabeln:$fieldnamen:$typeofdatan=>$tablenamen.$columnnamen As Header value
- * )
- *
- */
- function getQueryColumnsList($reportid,$outputformat='')
- {
- // Have we initialized information already?
- if($this->_columnslist !== false) {
- return $this->_columnslist;
- }
- global $adb;
- global $modules;
- global $log,$current_user,$current_language;
- $ssql = "select vtiger_selectcolumn.* from vtiger_report inner join vtiger_selectquery on vtiger_selectquery.queryid = vtiger_report.queryid";
- $ssql .= " left join vtiger_selectcolumn on vtiger_selectcolumn.queryid = vtiger_selectquery.queryid";
- $ssql .= " where vtiger_report.reportid = ?";
- $ssql .= " order by vtiger_selectcolumn.columnindex";
- $result = $adb->pquery($ssql, array($reportid));
- $permitted_fields = Array();
- while($columnslistrow = $adb->fetch_array($result))
- {
- $fieldname ="";
- $fieldcolname = $columnslistrow["columnname"];
- list($tablename,$colname,$module_field,$fieldname,$single) = split(":",$fieldcolname);
- list($module,$field) = split("_",$module_field,2);
- $inventory_fields = array('serviceid');
- $inventory_modules = getInventoryModules();
- require('user_privileges/user_privileges_'.$current_user->id.'.php');
- if(sizeof($permitted_fields[$module]) == 0 && $is_admin == false && $profileGlobalPermission[1] == 1 && $profileGlobalPermission[2] == 1)
- {
- $permitted_fields[$module] = $this->getaccesfield($module);
- }
- if(in_array($module,$inventory_modules)){
- if (!empty ($permitted_fields)) {
- foreach ($inventory_fields as $value) {
- array_push($permitted_fields[$module], $value);
- }
- }
- }
- $selectedfields = explode(":",$fieldcolname);
- if($is_admin == false && $profileGlobalPermission[1] == 1 && $profileGlobalPermission[2] == 1
- && !in_array($selectedfields[3], $permitted_fields[$module])) {
- //user has no access to this field, skip it.
- continue;
- }
- $concatSql = getSqlForNameInDisplayFormat(array('first_name'=>$selectedfields[0].".first_name",'last_name'=>$selectedfields[0].".last_name"), 'Users');
- $querycolumns = $this->getEscapedColumns($selectedfields);
- if(isset($module) && $module!="") {
- $mod_strings = return_module_language($current_language,$module);
- }
- $targetTableName = $tablename;
- $fieldlabel = trim(preg_replace("/$module/"," ",$selectedfields[2],1));
- $mod_arr=explode('_',$fieldlabel);
- $fieldlabel = trim(str_replace("_"," ",$fieldlabel));
- //modified code to support i18n issue
- $fld_arr = explode(" ",$fieldlabel);
- if(($mod_arr[0] == '')) {
- $mod = $module;
- $mod_lbl = getTranslatedString($module,$module); //module
- } else {
- $mod = $mod_arr[0];
- array_shift($fld_arr);
- $mod_lbl = getTranslatedString($fld_arr[0],$mod); //module
- }
- $fld_lbl_str = implode(" ",$fld_arr);
- $fld_lbl = getTranslatedString($fld_lbl_str,$module); //fieldlabel
- $fieldlabel = $mod_lbl." ".$fld_lbl;
- if(($selectedfields[0] == "vtiger_usersRel1") && ($selectedfields[1] == 'user_name') && ($selectedfields[2] == 'Quotes_Inventory_Manager')){
- $columnslist[$fieldcolname] = "trim( $concatSql ) as ".$module."_Inventory_Manager";
- $this->queryPlanner->addTable($selectedfields[0]);
- continue;
- }
- if((CheckFieldPermission($fieldname,$mod) != 'true' && $colname!="crmid" && (!in_array($fieldname,$inventory_fields) && in_array($module,$inventory_modules))) || empty($fieldname))
- {
- continue;
- }
- else
- {
- $this->labelMapping[$selectedfields[2]] = str_replace(" ","_",$fieldlabel);
- $header_label = $selectedfields[2]; // Header label to be displayed in the reports table
- // To check if the field in the report is a custom field
- // and if yes, get the label of this custom field freshly from the vtiger_field as it would have been changed.
- // Asha - Reference ticket : #4906
- if($querycolumns == "")
- {
- if($selectedfields[4] == 'C')
- {
- $field_label_data = split("_",$selectedfields[2]);
- $module= $field_label_data[0];
- if($module!=$this->primarymodule){
- $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]'";
- $this->queryPlanner->addTable("vtiger_crmentity$module");
- }
- else{
- $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]'";
- $this->queryPlanner->addTable("vtiger_crmentity$module");
- }
- }
- elseif($selectedfields[0] == 'vtiger_activity' && $selectedfields[1] == 'status')
- {
- $columnslist[$fieldcolname] = " case when (vtiger_activity.status not like '') then vtiger_activity.status else vtiger_activity.eventstatus end as Calendar_Status";
- }
- elseif($selectedfields[0] == 'vtiger_activity' && $selectedfields[1] == 'date_start') {
- if($module == 'Emails') {
- $columnslist[$fieldcolname] = "cast(concat(vtiger_activity.date_start,' ',vtiger_activity.time_start) as DATE) as Emails_Date_Sent";
- } else {
- $columnslist[$fieldcolname] = "cast(concat(vtiger_activity.date_start,' ',vtiger_activity.time_start) as DATETIME) as Calendar_Start_Date_and_Time";
- }
- }
- elseif(stristr($selectedfields[0],"vtiger_users") && ($selectedfields[1] == 'user_name'))
- {
- $temp_module_from_tablename = str_replace("vtiger_users","",$selectedfields[0]);
- if($module!=$this->primarymodule){
- $condition = "and vtiger_crmentity".$module.".crmid!=''";
- $this->queryPlanner->addTable("vtiger_crmentity$module");
- } else {
- $condition = "and vtiger_crmentity.crmid!=''";
- }
- if($temp_module_from_tablename == $module) {
- $columnslist[$fieldcolname] = " case when(".$selectedfields[0].".last_name NOT LIKE '' $condition ) THEN ".$concatSql." else vtiger_groups".$module.".groupname end as '".$module."_$field'";
- $this->queryPlanner->addTable('vtiger_groups'.$module); // Auto-include the dependent module table.
- }
- else//Some Fields can't assigned to groups so case avoided (fields like inventory manager)
- $columnslist[$fieldcolname] = $selectedfields[0].".user_name as '".$header_label."'";
- }
- elseif(stristr($selectedfields[0],"vtiger_crmentity") && ($selectedfields[1] == 'modifiedby')) {
- $targetTableName = 'vtiger_lastModifiedBy'.$module;
- $concatSql = getSqlForNameInDisplayFormat(array('last_name'=>$targetTableName.'.last_name', 'first_name'=>$targetTableName.'.first_name'), 'Users');
- $columnslist[$fieldcolname] = "trim($concatSql) as $header_label";
- $this->queryPlanner->addTable("vtiger_crmentity$module");
- $this->queryPlanner->addTable($targetTableName);
- }
- elseif($selectedfields[0] == "vtiger_crmentity".$this->primarymodule)
- {
- $columnslist[$fieldcolname] = "vtiger_crmentity.".$selectedfields[1]." AS '".$header_label."'";
- }
- elseif($selectedfields[0] == 'vtiger_products' && $selectedfields[1] == 'unit_price')//handled for product fields in Campaigns Module Reports
- {
- $columnslist[$fieldcolname] = "concat(".$selectedfields[0].".currency_id,'::',innerProduct.actual_unit_price) as '". $header_label ."'";
- $this->queryPlanner->addTable("innerProduct");
- }
- elseif(in_array($selectedfields[2], $this->append_currency_symbol_to_value)) {
- if($selectedfields[1] == 'discount_amount') {
- $columnslist[$fieldcolname] = "CONCAT(".$selectedfields[0].".currency_id,'::', IF(".$selectedfields[0].".discount_amount != '',".$selectedfields[0].".discount_amount, (".$selectedfields[0].".discount_percent/100) * ".$selectedfields[0].".subtotal)) AS ".$header_label;
- } else {
- $columnslist[$fieldcolname] = "concat(".$selectedfields[0].".currency_id,'::',".$selectedfields[0].".".$selectedfields[1].") as '" . $header_label ."'";
- }
- }
- 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
- {
- if($selectedfields[1] == 'filelocationtype'){
- $columnslist[$fieldcolname] = "case ".$selectedfields[0].".".$selectedfields[1]." when 'I' then 'Internal' when 'E' then 'External' else '-' end as '$selectedfields[2]'";
- } else if($selectedfields[1] == 'folderid'){
- $columnslist[$fieldcolname] = "vtiger_attachmentsfolder.foldername as '$selectedfields[2]'";
- } elseif($selectedfields[1] == 'filestatus'){
- $columnslist[$fieldcolname] = "case ".$selectedfields[0].".".$selectedfields[1]." when '1' then 'yes' when '0' then 'no' else '-' end as '$selectedfields[2]'";
- } elseif($selectedfields[1] == 'filesize'){
- $columnslist[$fieldcolname] = "case ".$selectedfields[0].".".$selectedfields[1]." when '' then '-' else concat(".$selectedfields[0].".".$selectedfields[1]."/1024,' ','KB') end as '$selectedfields[2]'";
- }
- }
- elseif($selectedfields[0] == 'vtiger_inventoryproductrel')//handled for product fields in Campaigns Module Reports
- {
- if($selectedfields[1] == 'discount_amount'){
- $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 ."'";
- $this->queryPlanner->addTable($selectedfields[0].$module);
- } else if($selectedfields[1] == 'productid'){
- $columnslist[$fieldcolname] = "vtiger_products{$module}.productname as '" . $header_label ."'";
- $this->queryPlanner->addTable("vtiger_products{$module}");
- } else if($selectedfields[1] == 'serviceid'){
- $columnslist[$fieldcolname] = "vtiger_service{$module}.servicename as '" . $header_label ."'";
- $this->queryPlanner->addTable("vtiger_service{$module}");
- } else if($selectedfields[1] == 'listprice') {
- $primaryModuleInstance = CRMEntity::getInstance($this->primarymodule);
- $columnslist[$fieldcolname] = $selectedfields[0].$module.".".$selectedfields[1]."/".$primaryModuleInstance->table_name.".conversion_rate as '".$header_label."'";
- $this->queryPlanner->addTable($selectedfields[0].$module);
- } else {
- $columnslist[$fieldcolname] = $selectedfields[0].$module.".".$selectedfields[1]." as '".$header_label."'";
- $this->queryPlanner->addTable($selectedfields[0].$module);
- }
- }
- elseif(stristr($selectedfields[1],'cf_')==true && stripos($selectedfields[1],'cf_')==0)
- {
- $columnslist[$fieldcolname] = $selectedfields[0].".".$selectedfields[1]." AS '".$adb->sql_escape_string(decode_html($header_label))."'";
- }
- else
- {
- $columnslist[$fieldcolname] = $selectedfields[0].".".$selectedfields[1]." AS '".$header_label."'";
- }
- }
- else
- {
- $columnslist[$fieldcolname] = $querycolumns;
- }
- $this->queryPlanner->addTable($targetTableName);
- }
- }
- if ($outputformat == "HTML" || $outputformat == "PDF") {
- $columnslist['vtiger_crmentity:crmid:LBL_ACTION:crmid:I'] = 'vtiger_crmentity.crmid AS "'.$this->primarymodule.'_LBL_ACTION"' ;
- }
- // Save the information
- $this->_columnslist = $columnslist;
- $log->info("ReportRun :: Successfully returned getQueryColumnsList".$reportid);
- return $columnslist;
- }
- /** Function to get field columns based on profile
- * @ param $module : Type string
- * returns permitted fields in array format
- */
- function getaccesfield($module) {
- global $current_user;
- global $adb;
- $access_fields = Array();
- $profileList = getCurrentUserProfileList();
- $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";
- $params = array();
- if($module == "Calendar")
- {
- if (count($profileList) > 0) {
- $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_field.presence IN (0,2) and vtiger_profile2field.profileid in (". generateQuestionMarks($profileList) .") group by vtiger_field.fieldid order by block,sequence";
- array_push($params, $profileList);
- } else {
- $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_field.presence IN (0,2) group by vtiger_field.fieldid order by block,sequence";
- }
- }
- else
- {
- array_push($params, $module);
- if (count($profileList) > 0) {
- $query .= " vtiger_field.tabid in (select tabid from vtiger_tab where vtiger_tab.name in (?)) and vtiger_field.displaytype in (1,2,3,5) and vtiger_profile2field.visible=0
- and vtiger_field.presence IN (0,2) and vtiger_def_org_field.visible=0 and vtiger_profile2field.profileid in (". generateQuestionMarks($profileList) .") group by vtiger_field.fieldid order by block,sequence";
- array_push($params, $profileList);
- } else {
- $query .= " vtiger_field.tabid in (select tabid from vtiger_tab where vtiger_tab.name in (?)) and vtiger_field.displaytype in (1,2,3,5) and vtiger_profile2field.visible=0
- and vtiger_field.presence IN (0,2) and vtiger_def_org_field.visible=0 group by vtiger_field.fieldid order by block,sequence";
- }
- }
- $result = $adb->pquery($query, $params);
- while($collistrow = $adb->fetch_array($result))
- {
- $access_fields[] = $collistrow["fieldname"];
- }
- //added to include ticketid for Reports module in select columnlist for all users
- if($module == "HelpDesk")
- $access_fields[] = "ticketid";
- return $access_fields;
- }
- /** Function to get Escapedcolumns for the field in case of multiple parents
- * @ param $selectedfields : Type Array
- * returns the case query for the escaped columns
- */
- function getEscapedColumns($selectedfields) {
- $tableName = $selectedfields[0];
- $columnName = $selectedfields[1];
- $moduleFieldLabel = $selectedfields[2];
- $fieldName = $selectedfields[3];
- list($moduleName, $fieldLabel) = explode('_', $moduleFieldLabel, 2);
- $fieldInfo = getFieldByReportLabel($moduleName, $fieldLabel);
- if($moduleName == 'ModComments' && $fieldName == 'creator') {
- $concatSql = getSqlForNameInDisplayFormat(array('first_name' => 'vtiger_usersModComments.first_name',
- 'last_name' => 'vtiger_usersModComments.last_name'), 'Users');
- $queryColumn = "trim(case when (vtiger_usersModComments.user_name not like '' and vtiger_crmentity.crmid!='') then $concatSql end) as 'ModComments_Creator'";
- } elseif(($fieldInfo['uitype'] == '10' || isReferenceUIType($fieldInfo['uitype']))
- && $fieldInfo['uitype'] != '52' && $fieldInfo['uitype'] != '53') {
- $fieldSqlColumns = $this->getReferenceFieldColumnList($moduleName, $fieldInfo);
- if(count($fieldSqlColumns) > 0) {
- $queryColumn = "(CASE WHEN $tableName.$columnName NOT LIKE '' THEN (CASE";
- foreach($fieldSqlColumns as $columnSql) {
- $queryColumn .= " WHEN $columnSql NOT LIKE '' THEN $columnSql";
- }
- $queryColumn .= " ELSE '' END) ELSE '' END) AS $moduleFieldLabel";
- $this->queryPlanner->addTable($tableName);
- }
- }
- return $queryColumn;
- }
- /** Function to get selectedcolumns for the given reportid
- * @ param $reportid : Type Integer
- * returns the query of columnlist for the selected columns
- */
- function getSelectedColumnsList($reportid)
- {
- global $adb;
- global $modules;
- global $log;
- $ssql = "select vtiger_selectcolumn.* from vtiger_report inner join vtiger_selectquery on vtiger_selectquery.queryid = vtiger_report.queryid";
- $ssql .= " left join vtiger_selectcolumn on vtiger_selectcolumn.queryid = vtiger_selectquery.queryid where vtiger_report.reportid = ? ";
- $ssql .= " order by vtiger_selectcolumn.columnindex";
- $result = $adb->pquery($ssql, array($reportid));
- $noofrows = $adb->num_rows($result);
- if ($this->orderbylistsql != "")
- {
- $sSQL .= $this->orderbylistsql.", ";
- }
- for($i=0; $i<$noofrows; $i++)
- {
- $fieldcolname = $adb->query_result($result,$i,"columnname");
- $ordercolumnsequal = true;
- if($fieldcolname != "")
- {
- for($j=0;$j<count($this->orderbylistcolumns);$j++)
- {
- if($this->orderbylistcolumns[$j] == $fieldcolname)
- {
- $ordercolumnsequal = false;
- break;
- }else
- {
- $ordercolumnsequal = true;
- }
- }
- if($ordercolumnsequal)
- {
- $selectedfields = explode(":",$fieldcolname);
- if($selectedfields[0] == "vtiger_crmentity".$this->primarymodule)
- $selectedfields[0] = "vtiger_crmentity";
- $sSQLList[] = $selectedfields[0].".".$selectedfields[1]." '".$selectedfields[2]."'";
- }
- }
- }
- $sSQL .= implode(",",$sSQLList);
- $log->info("ReportRun :: Successfully returned getSelectedColumnsList".$reportid);
- return $sSQL;
- }
- /** Function to get advanced comparator in query form for the given Comparator and value
- * @ param $comparator : Type String
- * @ param $value : Type String
- * returns the check query for the comparator
- */
- function getAdvComparator($comparator,$value,$datatype="")
- {
- global $log,$adb,$default_charset,$ogReport;
- $value=html_entity_decode(trim($value),ENT_QUOTES,$default_charset);
- $value_len = strlen($value);
- $is_field = false;
- if($value_len > 1 && $value[0]=='$' && $value[$value_len-1]=='$'){
- $temp = str_replace('$','',$value);
- $is_field = true;
- }
- if($datatype=='C'){
- $value = str_replace("yes","1",str_replace("no","0",$value));
- }
- if($is_field==true){
- $value = $this->getFilterComparedField($temp);
- }
- if($comparator == "e")
- {
- if(trim($value) == "NULL")
- {
- $rtvalue = " is NULL";
- }elseif(trim($value) != "")
- {
- $rtvalue = " = ".$adb->quote($value);
- }elseif(trim($value) == "" && $datatype == "V")
- {
- $rtvalue = " = ".$adb->quote($value);
- }else
- {
- $rtvalue = " is NULL";
- }
- }
- if($comparator == "n")
- {
- if(trim($value) == "NULL")
- {
- $rtvalue = " is NOT NULL";
- }elseif(trim($value) != "")
- {
- $rtvalue = " <> ".$adb->quote($value);
- }elseif(trim($value) == "" && $datatype == "V")
- {
- $rtvalue = " <> ".$adb->quote($value);
- }else
- {
- $rtvalue = " is NOT NULL";
- }
- }
- if($comparator == "s")
- {
- $rtvalue = " like '". formatForSqlLike($value, 2,$is_field) ."'";
- }
- if($comparator == "ew")
- {
- $rtvalue = " like '". formatForSqlLike($value, 1,$is_field) ."'";
- }
- if($comparator == "c")
- {
- $rtvalue = " like '". formatForSqlLike($value,0,$is_field) ."'";
- }
- if($comparator == "k")
- {
- $rtvalue = " not like '". formatForSqlLike($value,0,$is_field) ."'";
- }
- if($comparator == "l")
- {
- $rtvalue = " < ".$adb->quote($value);
- }
- if($comparator == "g")
- {
- $rtvalue = " > ".$adb->quote($value);
- }
- if($comparator == "m")
- {
- $rtvalue = " <= ".$adb->quote($value);
- }
- if($comparator == "h")
- {
- $rtvalue = " >= ".$adb->quote($value);
- }
- if($comparator == "b") {
- $rtvalue = " < ".$adb->quote($value);
- }
- if($comparator == "a") {
- $rtvalue = " > ".$adb->quote($value);
- }
- if($is_field==true){
- $rtvalue = str_replace("'","",$rtvalue);
- $rtvalue = str_replace("\\","",$rtvalue);
- }
- $log->info("ReportRun :: Successfully returned getAdvComparator");
- return $rtvalue;
- }
- /** Function to get field that is to be compared in query form for the given Comparator and field
- * @ param $field : field
- * returns the value for the comparator
- */
- function getFilterComparedField($field){
- global $adb,$ogReport;
- if(!empty ($this->secondarymodule)){
- $secModules = explode(':',$this->secondarymodule);
- foreach ($secModules as $secModule){
- $secondary = CRMEntity::getInstance($secModule);
- $this->queryPlanner->addTable($secondary->table_name);
- }
- }
- $field = split('#',$field);
- $module = $field[0];
- $fieldname = trim($field[1]);
- $tabid = getTabId($module);
- $field_query = $adb->pquery("SELECT tablename,columnname,typeofdata,fieldname,uitype FROM vtiger_field WHERE tabid = ? AND fieldname= ?",array($tabid,$fieldname));
- $fieldtablename = $adb->query_result($field_query,0,'tablename');
- $fieldcolname = $adb->query_result($field_query,0,'columnname');
- $typeofdata = $adb->query_result($field_query,0,'typeofdata');
- $fieldtypeofdata=ChangeTypeOfData_Filter($fieldtablename,$fieldcolname,$typeofdata[0]);
- $uitype = $adb->query_result($field_query,0,'uitype');
- /*if($tr[0]==$ogReport->primodule)
- $value = $adb->query_result($field_query,0,'tablename').".".$adb->query_result($field_query,0,'columnname');
- else
- $value = $adb->query_result($field_query,0,'tablename').$tr[0].".".$adb->query_result($field_query,0,'columnname');
- */
- if($uitype == 68 || $uitype == 59)
- {
- $fieldtypeofdata = 'V';
- }
- if($fieldtablename == "vtiger_crmentity" && $module != $this->primarymodule)
- {
- $fieldtablename = $fieldtablename.$module;
- }
- if($fieldname == "assigned_user_id")
- {
- $fieldtablename = "vtiger_users".$module;
- $fieldcolname = "user_name";
- }
- if($fieldtablename == "vtiger_crmentity" && $fieldname == "modifiedby")
- {
- $fieldtablename = "vtiger_lastModifiedBy".$module;
- $fieldcolname = "user_name";
- }
- if($fieldname == "assigned_user_id1")
- {
- $fieldtablename = "vtiger_usersRel1";
- $fieldcolname = "user_name";
- }
- $value = $fieldtablename.".".$fieldcolname;
- $this->queryPlanner->addTable($fieldtablename);
- return $value;
- }
- /** Function to get the advanced filter columns for the reportid
- * This function accepts the $reportid
- * This function returns $columnslist Array($columnname => $tablename:$columnname:$fieldlabel:$fieldname:$typeofdata=>$tablename.$columnname filtercriteria,
- * $tablename1:$columnname1:$fieldlabel1:$fieldname1:$typeofdata1=>$tablename1.$columnname1 filtercriteria,
- * |
- * $tablenamen:$columnnamen:$fieldlabeln:$fieldnamen:$typeofdatan=>$tablenamen.$columnnamen filtercriteria
- * )
- *
- */
- function getAdvFilterList($reportid) {
- global $adb, $log;
- $advft_criteria = array();
- $sql = 'SELECT * FROM vtiger_relcriteria_grouping WHERE queryid = ? ORDER BY groupid';
- $groupsresult = $adb->pquery($sql, array($reportid));
- $i = 1;
- $j = 0;
- while($relcriteriagroup = $adb->fetch_array($groupsresult)) {
- $groupId = $relcriteriagroup["groupid"];
- $groupCondition = $relcriteriagroup["group_condition"];
- $ssql = 'select vtiger_relcriteria.* from vtiger_report
- inner join vtiger_relcriteria on vtiger_relcriteria.queryid = vtiger_report.queryid
- left join vtiger_relcriteria_grouping on vtiger_relcriteria.queryid = vtiger_relcriteria_grouping.queryid
- and vtiger_relcriteria.groupid = vtiger_relcriteria_grouping.groupid';
- $ssql.= " where vtiger_report.reportid = ? AND vtiger_relcriteria.groupid = ? order by vtiger_relcriteria.columnindex";
- $result = $adb->pquery($ssql, array($reportid, $groupId));
- $noOfColumns = $adb->num_rows($result);
- if($noOfColumns <= 0) continue;
- while($relcriteriarow = $adb->fetch_array($result)) {
- $columnIndex = $relcriteriarow["columnindex"];
- $criteria = array();
- $criteria['columnname'] = html_entity_decode($relcriteriarow["columnname"]);
- $criteria['comparator'] = $relcriteriarow["comparator"];
- $advfilterval = $relcriteriarow["value"];
- $col = explode(":",$relcriteriarow["columnname"]);
- $criteria['value'] = $advfilterval;
- $criteria['column_condition'] = $relcriteriarow["column_condition"];
- $advft_criteria[$i]['columns'][$j] = $criteria;
- $advft_criteria[$i]['condition'] = $groupCondition;
- $j++;
- $this->queryPlanner->addTable($col[0]);
- }
- if(!empty($advft_criteria[$i]['columns'][$j-1]['column_condition'])) {
- $advft_criteria[$i]['columns'][$j-1]['column_condition'] = '';
- }
- $i++;
- }
- // Clear the condition (and/or) for last group, if any.
- if(!empty($advft_criteria[$i-1]['condition'])) $advft_criteria[$i-1]['condition'] = '';
- return $advft_criteria;
- }
- function generateAdvFilterSql($advfilterlist) {
- global $adb;
- $advfiltersql = "";
- $customView = new CustomView();
- $dateSpecificConditions = $customView->getStdFilterConditions();
- foreach($advfilterlist as $groupindex => $groupinfo) {
- $groupcondition = $groupinfo['condition'];
- $groupcolumns = $groupinfo['columns'];
- if(count($groupcolumns) > 0) {
- $advfiltergroupsql = "";
- foreach($groupcolumns as $columnindex => $columninfo) {
- $fieldcolname = $columninfo["columnname"];
- $comparator = $columninfo["comparator"];
- $value = $columninfo["value"];
- $columncondition = $columninfo["column_condition"];
- if($fieldcolname != "" && $comparator != "") {
- $selectedfields = explode(":",$fieldcolname);
- $moduleFieldLabel = $selectedfields[2];
- list($moduleName, $fieldLabel) = explode('_', $moduleFieldLabel, 2);
- $fieldInfo = getFieldByReportLabel($moduleName, $fieldLabel);
- $concatSql = getSqlForNameInDisplayFormat(array('first_name'=>$selectedfields[0].".first_name",'last_name'=>$selectedfields[0].".last_name"), 'Users');
- // Added to handle the crmentity table name for Primary module
- if($selectedfields[0] == "vtiger_crmentity".$this->primarymodule) {
- $selectedfields[0] = "vtiger_crmentity";
- }
- //Added to handle yes or no for checkbox field in reports advance filters. -shahul
- if($selectedfields[4] == 'C') {
- if(strcasecmp(trim($value),"yes")==0)
- $value="1";
- if(strcasecmp(trim($value),"no")==0)
- $value="0";
- }
- if(in_array($comparator,$dateSpecificConditions)) {
- $customView = new CustomView($moduleName);
- $columninfo['stdfilter'] = $columninfo['comparator'];
- $valueComponents = explode(',',$columninfo['value']);
- if($comparator == 'custom') {
- if($selectedfields[4] == 'DT') {
- $startDateTimeComponents = explode(' ',$valueComponents[0]);
- $endDateTimeComponents = explode(' ',$valueComponents[1]);
- $columninfo['startdate'] = DateTimeField::convertToDBFormat($startDateTimeComponents[0]);
- $columninfo['enddate'] = DateTimeField::convertToDBFormat($endDateTimeComponents[0]);
- } else {
- $columninfo['startdate'] = DateTimeField::convertToDBFormat($valueComponents[0]);
- $columninfo['enddate'] = DateTimeField::convertToDBFormat($valueComponents[1]);
- }
- }
- $dateFilterResolvedList = $customView->resolveDateFilterValue($columninfo);
- $startDate = DateTimeField::convertToDBFormat($dateFilterResolvedList['startdate']);
- $endDate = DateTimeField::convertToDBFormat($dateFilterResolvedList['enddate']);
- $columninfo['value'] = $value = implode(',', array($startDate,$endDate));
- $comparator = 'bw';
- }
- $valuearray = explode(",",trim($value));
- $datatype = (isset($selectedfields[4])) ? $selectedfields[4] : "";
- if(isset($valuearray) && count($valuearray) > 1 && $comparator != 'bw') {
- $advcolumnsql = "";
- for($n=0;$n<count($valuearray);$n++) {
- if(($selectedfields[0] == "vtiger_users".$this->primarymodule || $selectedfields[0] == "vtiger_users".$this->secondarymodule) && $selectedfields[1] == 'user_name') {
- $module_from_tablename = str_replace("vtiger_users","",$selectedfields[0]);
- $advcolsql[] = " trim($concatSql)".$this->getAdvComparator($comparator,trim($valuearray[$n]),$datatype)." or vtiger_groups".$module_from_tablename.".groupname ".$this->getAdvComparator($comparator,trim($valuearray[$n]),$datatype);
- $this->queryPlanner->addTable("vtiger_groups".$module_from_tablename);
- } elseif($selectedfields[1] == 'status') {//when you use comma seperated values.
- if($selectedfields[2] == 'Calendar_Status')
- $advcolsql[] = "(case when (vtiger_activity.status not like '') then vtiger_activity.status else vtiger_activity.eventstatus end)".$this->getAdvComparator($comparator,trim($valuearray[$n]),$datatype);
- elseif($selectedfields[2] == 'HelpDesk_Status')
- $advcolsql[] = "vtiger_troubletickets.status".$this->getAdvComparator($comparator,trim($valuearray[$n]),$datatype);
- } elseif($selectedfields[1] == 'description') {//when you use comma seperated values.
- if($selectedfields[0]=='vtiger_crmentity'.$this->primarymodule)
- $advcolsql[] = "vtiger_crmentity.description".$this->getAdvComparator($comparator,trim($valuearray[$n]),$datatype);
- else
- $advcolsql[] = $selectedfields[0].".".$selectedfields[1].$this->getAdvComparator($comparator,trim($valuearray[$n]),$datatype);
- } elseif($selectedfields[2] == 'Quotes_Inventory_Manager'){
- $advcolsql[] = ("trim($concatSql)".$this->getAdvComparator($comparator,trim($valuearray[$n]),$datatype));
- } else {
- $advcolsql[] = $selectedfields[0].".".$selectedfields[1].$this->getAdvComparator($comparator,trim($valuearray[$n]),$datatype);
- }
- }
- //If negative logic filter ('not equal to', 'does not contain') is used, 'and' condition should be applied instead of 'or'
- if($comparator == 'n' || $comparator == 'k')
- $advcolumnsql = implode(" and ",$advcolsql);
- else
- $advcolumnsql = implode(" or ",$advcolsql);
- $fieldvalue = " (".$advcolumnsql.") ";
- } elseif($selectedfields[1] == 'user_name') {
- if($selectedfields[0] == "vtiger_users".$this->primarymodule) {
- $module_from_tablename = str_replace("vtiger_users","",$selectedfields[0]);
- $fieldvalue = " trim(case when (".$selectedfields[0].".last_name NOT LIKE '') then ".$concatSql." else vtiger_groups".$module_from_tablename.".groupname end) ".$this->getAdvComparator($comparator,trim($value),$datatype);
- $this->queryPlanner->addTable("vtiger_groups".$module_from_tablename);
- } else {
- $secondaryModules = explode(':', $this->secondarymodule);
- $firstSecondaryModule = "vtiger_users".$secondaryModules[0];
- $secondSecondaryModule = "vtiger_users".$secondaryModules[1];
- if(($firstSecondaryModule && $firstSecondaryModule == $selectedfields[0]) || ($secondSecondaryModule && $secondSecondaryModule == $selectedfields[0])) {
- $module_from_tablename = str_replace("vtiger_users","",$selectedfields[0]);
- $moduleInstance = CRMEntity::getInstance($module_from_tablename);
- $fieldvalue = " trim(case when (".$selectedfields[0].".last_name NOT LIKE '') then ".$concatSql." else vtiger_groups".$module_from_tablename.".groupname end) ".$this->getAdvComparator($comparator,trim($value),$datatype);
- $this->queryPlanner->addTable("vtiger_groups".$module_from_tablename);
- $this->queryPlanner->addTable($moduleInstance->table_name);
- }
- }
- } elseif($comparator == 'bw' && count($valuearray) == 2) {
- if($selectedfields[0] == "vtiger_crmentity".$this->primarymodule) {
- $fieldvalue = "("."vtiger_crmentity.".$selectedfields[1]." between '".trim($valuearray[0])."' and '".trim($valuearray[1])."')";
- } else {
- $fieldvalue = "(".$selectedfields[0].".".$selectedfields[1]." between '".trim($valuearray[0])."' and '".trim($valuearray[1])."')";
- }
- } elseif($selectedfields[0] == "vtiger_crmentity".$this->primarymodule) {
- $fieldvalue = "vtiger_crmentity.".$selectedfields[1]." ".$this->getAdvComparator($comparator,trim($value),$datatype);
- } elseif($selectedfields[2] == 'Quotes_Inventory_Manager'){
- $fieldvalue = ("trim($concatSql)" . $this->getAdvComparator($comparator,trim($value),$datatype));
- } elseif($selectedfields[1]=='modifiedby') {
- $module_from_tablename = str_replace("vtiger_crmentity","",$selectedfields[0]);
- if($module_from_tablename != '') {
- $tableName = 'vtiger_lastModifiedBy'.$module_from_tablename;
- } else {
- $tableName = 'vtiger_lastModifiedBy'.$this->primarymodule;
- }
- $this->queryPlanner->addTable($tableName);
- $fieldvalue = getSqlForNameInDisplayFormat(array('last_name'=>"$tableName.last_name",'first_name'=>"$tableName.first_name"), 'Users').
- $this->getAdvComparator($comparator,trim($value),$datatype);
- } elseif($selectedfields[0] == "vtiger_activity" && $selectedfields[1] == 'status') {
- $fieldvalue = "(case when (vtiger_activity.status not like '') then vtiger_activity.status else vtiger_activity.eventstatus end)".$this->getAdvComparator($comparator,trim($value),$datatype);
- } elseif($comparator == 'y' || ($comparator == 'e' && (trim($value) == "NULL" || trim($value) == ''))) {
- if($selectedfields[0] == 'vtiger_inventoryproductrel') {
- $selectedfields[0]='vtiger_inventoryproductrel'.$this->primarymodule;
- }
- $fieldvalue = "(".$selectedfields[0].".".$selectedfields[1]." IS NULL OR ".$selectedfields[0].".".$selectedfields[1]." = '')";
- } elseif($selectedfields[0] == 'vtiger_inventoryproductrel' ) {
- if($selectedfields[1] == 'productid'){
- $fieldvalue = "vtiger_products{$this->primarymodule}.productname ".$this->getAdvComparator($comparator,trim($value),$datatype);
- $this->queryPlanner->addTable("vtiger_products{$this->primarymodule}");
- } else if($selectedfields[1] == 'serviceid'){
- $fieldvalue = "vtiger_service{$this->primarymodule}.servicename ".$this->getAdvComparator($comparator,trim($value),$datatype);
- $this->queryPlanner->addTable("vtiger_service{$this->primarymodule}");
- }
- else{
- //for inventory module table should be follwed by the module name
- $selectedfields[0]='vtiger_inventoryproductrel'.$this->primarymodule;
- $fieldvalue = $selectedfields[0].".".$selectedfields[1].$this->getAdvComparator($comparator, $value, $datatype);
- }
- } elseif($fieldInfo['uitype'] == '10' || isReferenceUIType($fieldInfo['uitype'])) {
- $comparatorValue = $this->getAdvComparator($comparator,trim($value),$datatype);
- $fieldSqls = array();
- $fieldSqlColumns = $this->getReferenceFieldColumnList($moduleName, $fieldInfo);
- foreach($fieldSqlColumns as $columnSql) {
- $fieldSqls[] = $columnSql.$comparatorValue;
- }
- $fieldvalue = ' ('. implode(' OR ', $fieldSqls).') ';
- } else {
- $fieldvalue = $selectedfields[0].".".$selectedfields[1].$this->getAdvComparator($comparator,trim($value),$datatype);
- }
- $advfiltergroupsql .= $fieldvalue;
- if(!empty($columncondition)) {
- $advfiltergroupsql .= ' '.$columncondition.' ';
- }
- $this->queryPlanner->addTable($selectedfields[0]);
- }
- }
- if (trim($advfiltergroupsql) != "") {
- $advfiltergroupsql = "( $advfiltergroupsql ) ";
- if(!empty($groupcondition)) {
- $advfiltergroupsql .= ' '. $groupcondition . ' ';
- }
- $advfiltersql .= $advfiltergroupsql;
- }
- }
- }
- if (trim($advfiltersql) != "") $advfiltersql = '('.$advfiltersql.')';
- return $advfiltersql;
- }
- function getAdvFilterSql($reportid) {
- // Have we initialized information already?
- if($this->_advfiltersql !== false) {
- return $this->_advfiltersql;
- }
- global $log;
- $advfilterlist = $this->getAdvFilterList($reportid);
- $advfiltersql = $this->generateAdvFilterSql($advfilterlist);
- // Save the information
- $this->_advfiltersql = $advfiltersql;
- $log->info("ReportRun :: Successfully returned getAdvFilterSql".$reportid);
- return $advfiltersql;
- }
- /** Function to get the Standard filter columns for the reportid
- * This function accepts the $reportid datatype Integer
- * This function returns $stdfilterlist Array($columnname => $tablename:$columnname:$fieldlabel:$fieldname:$typeofdata=>$tablename.$columnname filtercriteria,
- * $tablename1:$columnname1:$fieldlabel1:$fieldname1:$typeofdata1=>$tablename1.$columnname1 filtercriteria,
- * )
- *
- */
- function getStdFilterList($reportid)
- {
- // Have we initialized information already?
- if($this->_stdfilterlist !== false) {
- return $this->_stdfilterlist;
- }
- global $adb, $log;
- $stdfilterlist = array();
- $stdfiltersql = "select vtiger_reportdatefilter.* from vtiger_report";
- $stdfiltersql .= " inner join vtiger_reportdatefilter on vtiger_report.reportid = vtiger_reportdatefilter.datefilterid";
- $stdfiltersql .= " where vtiger_report.reportid = ?";
- $result = $adb->pquery($stdfiltersql, array($reportid));
- $stdfilterrow = $adb->fetch_array($result);
- if(isset($stdfilterrow)) {
- $fieldcolname = $stdfilterrow["datecolumnname"];
- $datefilter = $stdfilterrow["datefilter"];
- $startdate = $stdfilterrow["startdate"];
- $enddate = $stdfilterrow["enddate"];
- if($fieldcolname != "none") {
- $selectedfields = explode(":",$fieldcolname);
- if($selectedfields[0] == "vtiger_crmentity".$this->primarymodule)
- $selectedfields[0] = "vtiger_crmentity";
- $moduleFieldLabel = $selectedfields[3];
- list($moduleName, $fieldLabel) = explode('_', $moduleFieldLabel, 2);
- $fieldInfo = getFieldByReportLabel($moduleName, $fieldLabel);
- $typeOfData = $fieldInfo['typeofdata'];
- list($type, $typeOtherInfo) = explode('~', $typeOfData, 2);
- if($datefilter != "custom") {
- $startenddate = $this->getStandarFiltersStartAndEndDate($datefilter);
- $startdate = $startenddate[0];
- $enddate = $startenddate[1];
- }
- if($startdate != "0000-00-00" && $enddate != "0000-00-00" && $startdate != "" && $enddate != ""
- && $selectedfields[0] != "" && $selectedfields[1] != "") {
- $startDateTime = new DateTimeField($startdate.' '. date('H:i:s'));
- $userStartDate = $startDateTime->getDisplayDate();
- if($type == 'DT') {
- $userStartDate = $userStartDate.' 00:00:00';
- }
- $startDateTime = getValidDBInsertDateTimeValue($userStartDate);
- $endDateTime = new DateTimeField($enddate.' '. date('H:i:s'));
- $userEndDate = $endDateTime->getDisplayDate();
- if($type == 'DT') {
- $userEndDate = $userEndDate.' 23:59:00';
- }
- $endDateTime = getValidDBInsertDateTimeValue($userEndDate);
- if ($selectedfields[1] == 'birthday') {
- $tableColumnSql = "to_char(".$selectedfields[0].".".$selectedfields[1].", '%m%d')";
- $startDateTime = "to_char('$startDateTime', '%m%d')";
- $endDateTime = "to_char('$endDateTime', '%m%d')";
- } else {
- if($selectedfields[0] == 'vtiger_activity' && ($selectedfields[1] == 'date_start')) {
- $tableColumnSql = '';
- $tableColumnSql = "to_timestamp(date_start || ' ' || time_start AS DATETIME,'YYYY-MM-DD HH24:MI:SS')";
- } else {
- $tableColumnSql = $selectedfields[0].".".$selectedfields[1];
- }
- $startDateTime = "'$startDateTime'";
- $endDateTime = "'$endDateTime'";
- }
- $stdfilterlist[$fieldcolname] = $tableColumnSql." between ".$startDateTime." and ".$endDateTime;
- $this->queryPlanner->addTable($selectedfields[0]);
- }
- }
- }
- // Save the information
- $this->_stdfilterlist = $stdfilterlist;
- $log->info("ReportRun :: Successfully returned getStdFilterList".$reportid);
- return $stdfilterlist;
- }
- /** Function to get the RunTime filter columns for the given $filtercolumn,$filter,$startdate,$enddate
- * @ param $filtercolumn : Type String
- * @ param $filter : Type String
- * @ param $startdate: Type String
- * @ param $enddate : Type String
- * This function returns $stdfilterlist Array($columnname => $tablename:$columnname:$fieldlabel=>$tablename.$columnname 'between' $startdate 'and' $enddate)
- *
- */
- function RunTimeFilter($filtercolumn,$filter,$startdate,$enddate)
- {
- if($filtercolumn != "none")
- {
- $selectedfields = explode(":",$filtercolumn);
- if($selectedfields[0] == "vtiger_crmentity".$this->primarymodu…
Large files files are truncated, but you can click here to view the full file