diff --git a/include/QueryGenerator/QueryGenerator.php b/include/QueryGenerator/QueryGenerator.php index 8844692dd9cc25e0ce0e222757b4ede1ec1596f6..b5bbd0f9d424fe8ba590a955b19ede523999f148 100644 --- a/include/QueryGenerator/QueryGenerator.php +++ b/include/QueryGenerator/QueryGenerator.php @@ -1029,30 +1029,55 @@ class QueryGenerator { if(!$this->isStringType($field->getFieldDataType())) { $value = trim($value); } - if ($operator == 'empty' || $operator == 'y') { - $sql[] = sprintf("IS NULL OR %s = ''", $this->getSQLColumn($field->getFieldName(), $field)); - continue; - } - if($operator == 'ny'){ - $sql[] = sprintf("IS NOT NULL AND %s != ''", $this->getSQLColumn($field->getFieldName(), $field)); - continue; - } - if ($operator == 'k') { + // If value is empty and comparator is equals then we have to check IS NULL (same as "is empty" condition) + if ($operator == 'empty' || $operator == 'y') { + $sqlFieldDataType = $field->getFieldDataType(); + if($sqlFieldDataType == 'date' || $sqlFieldDataType == 'birthday'){ + $sqlFormat = sprintf("IS NULL OR %s = '0000-00-00'", $this->getSQLColumn($field->getFieldName(), $field)); + } else if($sqlFieldDataType == 'datetime'){ + $sqlFormat = sprintf("IS NULL OR %s = '0000-00-00 00:00:00'", $this->getSQLColumn($field->getFieldName(), $field)); + } else { + $sqlFormat = sprintf("IS NULL OR %s = ''", $this->getSQLColumn($field->getFieldName(), $field)); + } + $sql[] = $sqlFormat; + continue; + } + if ($operator == 'ny') { + $sqlFieldDataType = $field->getFieldDataType(); + if ($sqlFieldDataType == 'date' || $sqlFieldDataType == 'birthday') { + $sqlFormat = sprintf("IS NOT NULL AND %s != '0000-00-00'", $this->getSQLColumn($field->getFieldName(), $field)); + } else if ($sqlFieldDataType == 'datetime') { + $sqlFormat = sprintf("IS NOT NULL AND %s != '0000-00-00 00:00:00'", $this->getSQLColumn($field->getFieldName(), $field)); + } else { + $sqlFormat = sprintf("IS NOT NULL AND %s != ''", $this->getSQLColumn($field->getFieldName(), $field)); + } + $sql[] = $sqlFormat; + continue; + } + if ($operator == 'k') { $sql[] = sprintf("IS NULL OR %s NOT LIKE '%%%s%%'", $this->getSQLColumn($field->getFieldName(), $field), $value); continue; } - if((strtolower(trim($value)) == 'null') || - (trim($value) == '' && !$this->isStringType($field->getFieldDataType())) && - ($operator == 'e' || $operator == 'n')) { - if($operator == 'e'){ - $sql[] = "IS NULL"; - $sql[] = "= ''"; - continue; - } else { - $sql[] = "IS NOT NULL"; - $sql[] = "!= ''"; - continue; - } + $trimmedValue = is_array($value) ? NULL : trim($value); + if((strtolower($trimmedValue) == 'null') || + ($trimmedValue == '' && !$this->isStringType($field->getFieldDataType())) && + ($operator == 'e' || $operator == 'n')) { + if($operator == 'e'){ + $sql[] = "IS NULL"; + $sqlFieldDataType = $field->getFieldDataType(); + if($sqlFieldDataType == 'date' || $sqlFieldDataType == 'birthday'){ + $sql[] = "= '0000-00-00'"; + } else if($sqlFieldDataType == 'datetime'){ + $sql[] = "= '0000-00-00 00:00:00'"; + } else { + $sql[] = "= ''"; + } + continue; + } else { + $sql[] = "IS NOT NULL"; + $sql[] = "!= ''"; + continue; + } } elseif($field->getFieldDataType() == 'boolean') { $value = strtolower($value); if ($value == 'yes') { @@ -1096,11 +1121,11 @@ class QueryGenerator { } if($field->getFieldName() == 'birthday' && !$this->isRelativeSearchOperators( - $operator)) { - $value = "DATE_FORMAT(".$db->quote($value).", '%m%d')"; - } else { - $value = $db->sql_escape_string($value); - } + $operator)) { + $value = "DATE_FORMAT(".$db->quote($value).", '%m%d')"; + } else { + $value = is_array($value) ? NULL : $db->sql_escape_string($value); + } if(trim($value) == '' && ($operator == 's' || $operator == 'ew' || $operator == 'c') && ($this->isStringType($field->getFieldDataType()) || @@ -1150,14 +1175,32 @@ class QueryGenerator { $sql[] = "IS NULL"; } - if( ($field->getFieldName() != 'birthday' || ($field->getFieldName() == 'birthday' - && $this->isRelativeSearchOperators($operator)))){ - $value = "'$value'"; - } - - if(($this->isNumericType($field->getFieldDataType())) && empty($value)) { - $value = '0'; - } + /** + * While searching in decimal type columns, then value will be stored like 100.1234 (as float value). + * When user search for 100 then also it should show up 100.1234 for which we are altering comparator and + * value here. If we search 'equal' or 'not equal' we will change to 'like' or 'not like' + * NOTE : Same thing handled in ReportRun->generateAdvFilterSql() api + */ + if($this->isFloatType($field->getFieldDataType()) && !empty($value) + && in_array($operator, array('e', 'n') )){ + $sqlOperator = ($operator == 'e') ? ' LIKE ' : ' NOT LIKE '; + if ((float) $value == round((float)$value)) { + // if given value is witn out any decimals (Ex:- 1234), then we search with '1234.%' + $value = $value.'.'; + } + $value = $value."%"; + } + + if( ($field->getFieldDataType() != 'birthday' || ($field->getFieldDataType() == 'birthday' + && $this->isRelativeSearchOperators($operator)))){ + if($field->getFieldDataType() !== 'integer'){ + $value = "'$value'"; + } + } + + if($this->isNumericType($field->getFieldDataType()) && empty($value)) { + $value = '0'; + } $sql[] = "$sqlOperator $value"; } return $sql; @@ -1185,6 +1228,14 @@ class QueryGenerator { protected function isNumericType($type) { return ($type == 'integer' || $type == 'double' || $type == 'currency'); } + + /** + * Function to identify given type is a floating(decimal) type or not. Column types like decimal will store + * information as floating values. All those column related field types comes under this + */ + protected function isFloatType($type) { + return ($type == 'double' || $type == 'currency' || $type == 'multicurrency'); + } protected function isStringType($type) { return ($type == 'string' || $type == 'text' || $type == 'email' || $type == 'reference'); diff --git a/modules/Reports/models/Chart.php b/modules/Reports/models/Chart.php index 10fbb99877103ad0386ddbae6bd55e026d358535..62ae4124b65e2221dce81f92b5c87451ef53c48f 100644 --- a/modules/Reports/models/Chart.php +++ b/modules/Reports/models/Chart.php @@ -359,33 +359,61 @@ abstract class Base_Chart extends Vtiger_Base_Model{ $filter = $reportRunObject->getAdvFilterList($reportModel->getId(), true); - // Special handling for date fields - $comparator = 'e'; - $dataFieldInfo = @explode(':', $field); - if(($dataFieldInfo[4] == 'D' || $dataFieldInfo[4] == 'DT') && !empty($dataFieldInfo[5])) { - $dataValue = explode(' ',$value); - if(php7_count($dataValue) > 1) { - $comparator = 'bw'; - if($dataFieldInfo[4] == 'D') { - $value = date('Y-m-d', strtotime($value)).','.date('Y-m-d', strtotime('last day of'.$value)); - } else { - $value = date('Y-m-d H:i:s' ,strtotime($value)).','.date('Y-m-d' ,strtotime('last day of'.$value)).' 23:59:59'; - } - } else { - $comparator = 'bw'; - if($dataFieldInfo[4] == 'D') { - $value = date('Y-m-d', strtotime('first day of JANUARY '.$value)).','.date('Y-m-d', strtotime('last day of DECEMBER '.$value)); - } else { - $value = date('Y-m-d H:i:s' ,strtotime('first day of JANUARY '.$value)).','.date('Y-m-d' ,strtotime('last day of DECEMBER '.$value)).' 23:59:59'; - } - } - } elseif($dataFieldInfo[4] == 'DT') { - $value = Vtiger_Date_UIType::getDisplayDateTimeValue($value); - } - - if(empty($value)) { - $comparator = 'empty'; - } + // Special handling for date fields + $comparator = 'e'; + $dataFieldInfo = @explode(':', $field); + if (($dataFieldInfo[4] == 'D' || $dataFieldInfo[4] == 'DT') && !empty($dataFieldInfo[5]) && !empty($value)) { + $dataValue = explode(' ', $value); + if ($dataFieldInfo[5] == 'WY') {//click through handling for group by week. + $comparator = 'bw'; + $dateRange = getWeekDateRange($value); + if ($dataFieldInfo[4] == 'D') { + $value = $dateRange[0] . ',' . $dateRange[1]; + } else { + $value = $dateRange[0] . ' 00:00:00' . ',' . $dateRange[1] . ' 23:59:59'; + } + } else if ($dataFieldInfo[5] == 'DD') { // click through handling for group by day + $comparator = 'bw'; + $value = date('Y-m-d H:i:s', strtotime($value)) . ',' . date('Y-m-d', strtotime($value)) . ' 23:59:59'; + } else if (php7_count($dataValue) > 1) { + $comparator = 'bw'; + if ($dataFieldInfo[4] == 'D') { + $value = date('Y-m-d', strtotime($value)) . ',' . date('Y-m-d', strtotime('last day of' . $value)); + } else { + $value = date('Y-m-d H:i:s', strtotime($value)) . ',' . date('Y-m-d', strtotime('last day of' . $value)) . ' 23:59:59'; + } + } else { + $comparator = 'bw'; + if ($dataFieldInfo[4] == 'D') { + $value = date('Y-m-d', strtotime('first day of JANUARY ' . $value)) . ',' . date('Y-m-d', strtotime('last day of DECEMBER ' . $value)); + } else { + $value = date('Y-m-d H:i:s', strtotime('first day of JANUARY ' . $value)) . ',' . date('Y-m-d', strtotime('last day of DECEMBER ' . $value)) . ' 23:59:59'; + } + } + + //Converting value to user format. + $valueParts = explode(',', $value); + foreach ($valueParts as $key => $valuePart) { + if ($dataFieldInfo[4] == 'DT') { + $value = explode(' ', trim($valuePart)); + $date = new DateTimeField($value[0]); + $valueParts[$key] = $date->getDisplayDate(); + } else { + $valueParts[$key] = Vtiger_Date_UIType::getDisplayDateValue(trim($valuePart)); + } + } + $value = implode(',', $valueParts); + } elseif ($dataFieldInfo[4] == 'DT') { + if (!empty($value) && $value != '0000-00-00 00:00:00') { + $value = Vtiger_Date_UIType::getDisplayDateTimeValue($value); + } + $value .= "," . $value; + } elseif ($dataFieldInfo[4] == 'D' && empty($dataFieldInfo[5]) && !empty($value)) { + $value = Vtiger_Date_UIType::getDisplayDateValue($value); + } + if (empty($value)) { + $comparator = 'empty'; + } $advancedFilterConditions = $reportModel->transformToNewAdvancedFilter(); //Step 1. Add the filter condition for the field @@ -797,4 +825,4 @@ class HorizontalbarChart extends VerticalbarChart { class LineChart extends VerticalbarChart{ -} \ No newline at end of file +}