From 76b308f3d41653cd5c1d7be4a3f9d1ccfe98dc28 Mon Sep 17 00:00:00 2001
From: Prasad <prasad@vtiger.com>
Date: Mon, 13 May 2024 13:25:59 +0530
Subject: [PATCH] Fixes #1844: Skip date and datetime comparision with empty
 string - MySQL 8.x flags error

---
 data/CRMEntity.php                      |  9 +++++++--
 modules/Leads/Leads.php                 | 10 +++++++---
 modules/SalesOrder/SalesOrder.php       |  8 ++++++--
 modules/Vtiger/models/FindDuplicate.php | 14 +++++++++++---
 4 files changed, 31 insertions(+), 10 deletions(-)

diff --git a/data/CRMEntity.php b/data/CRMEntity.php
index a842d82e3..b55f91803 100644
--- a/data/CRMEntity.php
+++ b/data/CRMEntity.php
@@ -2998,9 +2998,10 @@ class CRMEntity {
 	 * @param <String> $selectedColumns
 	 * @param <Boolean> $ignoreEmpty
 	 * @param <Array> $requiredTables
+	 * @param <Array> $columnTypes
 	 * @return string
 	 */
-	function getQueryForDuplicates($module, $tableColumns, $selectedColumns = '', $ignoreEmpty = false,$requiredTables = array()) {
+	function getQueryForDuplicates($module, $tableColumns, $selectedColumns = '', $ignoreEmpty = false,$requiredTables = array(),$columnTypes = null) {
 		if(is_array($tableColumns)) {
 			$tableColumnsString = implode(',', $tableColumns);
 		}
@@ -3030,7 +3031,11 @@ class CRMEntity {
 
 		if($ignoreEmpty) {
 			foreach($tableColumns as $tableColumn){
-				$whereClause .= " AND ($tableColumn IS NOT NULL AND $tableColumn != '') ";
+				if ($columnTypes && ($columnTypes[$tableColumn] == "date" || $columnTypes[$tableColumn] == "datetime")) {
+					$whereClause .= " AND ($tableColumn IS NOT NULL) ";	
+				} else {
+					$whereClause .= " AND ($tableColumn IS NOT NULL AND $tableColumn != '') ";
+				}
 			}
 		}
 
diff --git a/modules/Leads/Leads.php b/modules/Leads/Leads.php
index 0d366b322..442145a3f 100755
--- a/modules/Leads/Leads.php
+++ b/modules/Leads/Leads.php
@@ -681,7 +681,7 @@ class Leads extends CRMEntity {
 		}
 	}
 
-	function getQueryForDuplicates($module, $tableColumns, $selectedColumns = '', $ignoreEmpty = false, $requiredTables = array()) {
+	function getQueryForDuplicates($module, $tableColumns, $selectedColumns = '', $ignoreEmpty = false, $requiredTables = array(), $columnTypes = null) {
 		if(is_array($tableColumns)) {
 			$tableColumnsString = implode(',', $tableColumns);
 		}
@@ -711,7 +711,11 @@ class Leads extends CRMEntity {
 
 		if($ignoreEmpty) {
 			foreach($tableColumns as $tableColumn){
-				$whereClause .= " AND ($tableColumn IS NOT NULL AND $tableColumn != '') ";
+				if ($columnTypes && ($columnTypes[$tableColumn] == "date" || $columnTypes[$tableColumn] == "datetime")) {
+					$whereClause .= " AND ($tableColumn IS NOT NULL) ";	
+				} else {
+					$whereClause .= " AND ($tableColumn IS NOT NULL AND $tableColumn != '') ";
+				}
 			}
 		}
 
@@ -759,4 +763,4 @@ class Leads extends CRMEntity {
 	}
 }
 
-?>
\ No newline at end of file
+?>
diff --git a/modules/SalesOrder/SalesOrder.php b/modules/SalesOrder/SalesOrder.php
index c7ca1a6d9..3ad88894f 100644
--- a/modules/SalesOrder/SalesOrder.php
+++ b/modules/SalesOrder/SalesOrder.php
@@ -540,7 +540,7 @@ class SalesOrder extends CRMEntity {
 	 * @return string
 	 */
 	// Note : remove getDuplicatesQuery API once vtiger5 code is removed
-    function getQueryForDuplicates($module, $tableColumns, $selectedColumns = '', $ignoreEmpty = false,$requiredTables = array()) {
+    function getQueryForDuplicates($module, $tableColumns, $selectedColumns = '', $ignoreEmpty = false,$requiredTables = array(), $columnTypes = null) {
 		if(is_array($tableColumns)) {
 			$tableColumnsString = implode(',', $tableColumns);
 		}
@@ -575,7 +575,11 @@ class SalesOrder extends CRMEntity {
 
 		if($ignoreEmpty) {
 			foreach($tableColumns as $tableColumn){
-				$whereClause .= " AND ($tableColumn IS NOT NULL AND $tableColumn != '') ";
+				if ($columnTypes && ($columnTypes[$tableColumn] == "date" || $columnTypes[$tableColumn] == "datetime")) {
+					$whereClause .= " AND ($tableColumn IS NOT NULL) ";	
+				} else {
+					$whereClause .= " AND ($tableColumn IS NOT NULL AND $tableColumn != '') ";
+				}
 			}
 		}
 
diff --git a/modules/Vtiger/models/FindDuplicate.php b/modules/Vtiger/models/FindDuplicate.php
index 892cb538d..d4889a243 100644
--- a/modules/Vtiger/models/FindDuplicate.php
+++ b/modules/Vtiger/models/FindDuplicate.php
@@ -42,11 +42,13 @@ class Vtiger_FindDuplicate_Model extends Vtiger_Base_Model {
         $fields = $this->get('fields');
         $fieldModels = $moduleModel->getFields();
 		$requiredTables = array();
+        $columnTypes = array();
         if(is_array($fields)) {
             foreach($fields as $fieldName) {
                 $fieldModel = $fieldModels[$fieldName];
                 $requiredTables[] = $fieldModel->get('table');
                 $tableColumns[] = $fieldModel->get('table').'.'.$fieldModel->get('column');
+                $columnTypes[$fieldModel->get('table').'.'.$fieldModel->get('column')] = $fieldModel->getFieldDataType();
             }
         }
 
@@ -55,7 +57,7 @@ class Vtiger_FindDuplicate_Model extends Vtiger_Base_Model {
 		$ignoreEmpty = $this->get('ignoreEmpty');
 
         $focus = CRMEntity::getInstance($module);
-        $query = $focus->getQueryForDuplicates($module, $tableColumns, '', $ignoreEmpty,$requiredTables);
+        $query = $focus->getQueryForDuplicates($module, $tableColumns, '', $ignoreEmpty,$requiredTables,$columnTypes);
         self::$query = $query;
 		$query .= " LIMIT $startIndex, ". ($pageLimit+1);
 		
@@ -134,16 +136,18 @@ class Vtiger_FindDuplicate_Model extends Vtiger_Base_Model {
                 $module = $moduleModel->getName();
                 $fields = $this->get('fields');
                 $fieldModels = $moduleModel->getFields();
+                $columnTypes = array();
                 if(is_array($fields)) {
                     foreach($fields as $fieldName) {
                         $fieldModel = $fieldModels[$fieldName];
                         $requiredTables[] = $fieldModel->get('table');
                         $tableColumns[] = $fieldModel->get('table').'.'.$fieldModel->get('column');
+                        $columnTypes[$fieldModel->get('table').'.'.$fieldModel->get('column')] = $fieldModel->getFieldDataType();
                     }
                 }
                 $focus = CRMEntity::getInstance($module);
                 $ignoreEmpty = $this->get('ignoreEmpty');
-                self::$query = $focus->getQueryForDuplicates($module, $tableColumns, '', $ignoreEmpty,$requiredTables);
+                self::$query = $focus->getQueryForDuplicates($module, $tableColumns, '', $ignoreEmpty,$requiredTables,$columnTypes);
             }
             $query = self::$query;
 			$position = stripos($query, 'from');
@@ -174,15 +178,19 @@ class Vtiger_FindDuplicate_Model extends Vtiger_Base_Model {
             $ignoreEmptyValue = true;
 
         $fieldModels = $moduleModel->getFields();
+        $requiredTables = array();
+        $columnTypes = array();
         if(is_array($fields)) {
             foreach($fields as $fieldName) {
                 $fieldModel = $fieldModels[$fieldName];
                 $tableColumns[] = $fieldModel->get('table').'.'.$fieldModel->get('column');
+                $requiredTables[] = $fieldModel->get('table');
+                $columnTypes[$fieldModel->get('table').'.'.$fieldModel->get('column')] = $fieldModel->getFieldDataType();
             }
         }
 
         $focus = CRMEntity::getInstance($module);
-        $query = $focus->getQueryForDuplicates($module, $tableColumns, '', $ignoreEmpty);
+        $query = $focus->getQueryForDuplicates($module, $tableColumns, '', $ignoreEmpty, $requiredTables, $columnTypes);
         $result = $db->pquery($query, array());
         
         $recordIds = array();
-- 
GitLab