From df05493355f2216ded797c40430e4dd9e4d8dd05 Mon Sep 17 00:00:00 2001
From: Uma <uma.s@vtiger.com>
Date: Fri, 14 Aug 2020 13:28:53 +0530
Subject: [PATCH] Fixes Pricebook Relatedlist inline search

---
 .../PriceBooks/models/RelationListView.php    | 60 +++++++++++++++++++
 modules/PriceBooks/views/Detail.php           | 24 ++++++++
 2 files changed, 84 insertions(+)

diff --git a/modules/PriceBooks/models/RelationListView.php b/modules/PriceBooks/models/RelationListView.php
index ec5f81882..440f53e26 100644
--- a/modules/PriceBooks/models/RelationListView.php
+++ b/modules/PriceBooks/models/RelationListView.php
@@ -27,12 +27,72 @@ class PriceBooks_RelationListView_Model extends Vtiger_RelationListView_Model {
 		$db = PearDatabase::getInstance();
 		$parentModule = $this->getParentRecordModel()->getModule();
 		$relationModule = $this->getRelationModel()->getRelationModuleModel();
+                $relationModuleName = $relationModule->get('name');
 		$relatedColumnFieldMapping = $relationModule->getConfigureRelatedListFields();
 		if(count($relatedColumnFieldMapping) <= 0){
 			$relatedColumnFieldMapping = $relationModule->getRelatedListFields();
 		}
 
 		$query = $this->getRelationQuery();
+                
+                if ($this->get('whereCondition') && is_array($this->get('whereCondition'))) {
+                    $currentUser = Users_Record_Model::getCurrentUserModel();
+                    //EnhancedQueryGenerator is used instead of QueryGenerator since below case was faling 
+                    //AssignTo Empty 
+                    $queryGenerator = new EnhancedQueryGenerator($relationModuleName, $currentUser);
+                    $queryGenerator->setFields(array_values($relatedColumnFieldMapping));
+                    $whereCondition = $this->get('whereCondition');
+                    foreach ($whereCondition as $fieldName => $fieldValue) {
+                        $fieldModel = $relationModule->getField($fieldName);
+                        $fieldType= explode('~',$fieldModel->get('typeofdata'))[0];
+                        $referenceModuleList = $fieldModel->getReferenceList();
+                        if (is_array($fieldValue)) {
+                            $comparator = $fieldValue[1];
+                            $searchValue = $fieldValue[2];
+                            $type = $fieldValue[3];
+                            if ($type == 'time') {
+                                $searchValue = Vtiger_Time_UIType::getTimeValueWithSeconds($searchValue);
+                            } else if($type == 'owner' || ($type == 'reference' && in_array('Users', $referenceModuleList))) {
+                                $searchValue = $fieldValue[2];
+                                if(!$fieldModel->isCustomField()) {
+                                    $userFieldValues = explode(',', $searchValue);
+                                    $userValues = array();
+                                    foreach ($userFieldValues as $key => $value) {
+                                        if(is_numeric($value)) {
+                                            $userValues[$key] = getUserFullName($value);
+                                        } else {
+                                            $userValues[$key] = $value;
+                                        }
+                                    }
+                                    $searchValue = implode(',',$userValues);
+                                }
+                            }
+                            else if ($fieldType == 'DT') {
+                                $dateValues = explode(',', $searchValue);
+                                //Indicate whether it is fist date in the between condition
+                                $isFirstDate = true;
+                                foreach ($dateValues as $key => $dateValue) {
+                                        $dateTimeCompoenents = explode(' ', $dateValue);
+                                        if (empty($dateTimeCompoenents[1])) {
+                                                if ($isFirstDate)
+                                                        $dateTimeCompoenents[1] = '00:00:00';
+                                                else
+                                                        $dateTimeCompoenents[1] = '23:59:59';
+                                        }
+                                        $dateValue = implode(' ', $dateTimeCompoenents);
+                                        $dateValues[$key] = $dateValue;
+                                        $isFirstDate = false;
+                                }
+                                $searchValue = implode(',', $dateValues);
+                            }
+                            // #3681555-Relation fields column's search fields are missing in related list view.
+                            $query = ($type == 'reference') ? $this->getReferenceFieldJoinClause($query, $relationModuleName, $fieldModel) : $query;
+                            $queryGenerator->addCondition($fieldName, $searchValue, $comparator, "AND");
+                        }
+                    }
+                    $whereQuerySplit = split("WHERE", $queryGenerator->getWhereClause());
+                    $query.=" AND " . $whereQuerySplit[1];
+                }
 
 		$startIndex = $pagingModel->getStartIndex();
 		$pageLimit = $pagingModel->getPageLimit();
diff --git a/modules/PriceBooks/views/Detail.php b/modules/PriceBooks/views/Detail.php
index 944a75501..c8fe9bfe5 100644
--- a/modules/PriceBooks/views/Detail.php
+++ b/modules/PriceBooks/views/Detail.php
@@ -31,6 +31,27 @@ class PriceBooks_Detail_View extends Vtiger_Detail_View {
 			return parent::showRelatedList($request);
 		}
 
+                $searchParams = $request->get('search_params');
+                if(empty($searchParams)) {
+                    $searchParams = array();
+                }
+                $whereCondition = array();
+                $relatedModuleModel = Vtiger_Module_Model::getInstance($relatedModuleName);
+		$moduleFields = $relatedModuleModel->getFields();
+                foreach($searchParams as $fieldListGroup){
+                    foreach($fieldListGroup as $fieldSearchInfo){
+                        $fieldModel = $moduleFields[$fieldSearchInfo[0]];
+                        $tableName = $fieldModel->get('table');
+                        $column = $fieldModel->get('column');
+                        $whereCondition[$fieldSearchInfo[0]] = array($tableName.'.'.$column, $fieldSearchInfo[1],  $fieldSearchInfo[2],$fieldSearchInfo[3]);
+
+                        $fieldSearchInfoTemp= array();
+                        $fieldSearchInfoTemp['searchValue'] = $fieldSearchInfo[2];
+                        $fieldSearchInfoTemp['fieldName'] = $fieldName = $fieldSearchInfo[0];
+                        $fieldSearchInfoTemp['comparator'] = $fieldSearchInfo[1];
+                        $searchParams[$fieldName] = $fieldSearchInfoTemp;
+                    }
+               }
 		$pagingModel = new Vtiger_Paging_Model();
 		$pagingModel->set('page',$requestedPage);
 
@@ -45,6 +66,8 @@ class PriceBooks_Detail_View extends Vtiger_Detail_View {
 			$nextSortOrder = "ASC";
 			$sortImage = "icon-chevron-up";
 		}
+                if(!empty($whereCondition))
+                    $relationListView->set('whereCondition', $whereCondition);
 		if(!empty($orderBy)) {
 			$relationListView->set('orderby', $orderBy);
 			$relationListView->set('sortorder',$sortOrder);
@@ -114,6 +137,7 @@ class PriceBooks_Detail_View extends Vtiger_Detail_View {
 		$viewer->assign('SORT_IMAGE',$sortImage);
 		$viewer->assign('COLUMN_NAME',$orderBy);
 		$viewer->assign('USER_MODEL', Users_Record_Model::getCurrentUserModel());
+                $viewer->assign('SEARCH_DETAILS', $searchParams);
 		$viewer->assign('TAB_LABEL', $request->get('tab_label'));
 		
 		return $viewer->view('RelatedList.tpl', $moduleName, 'true');
-- 
GitLab