0
0
mirror of https://github.com/salesagility/SuiteCRM.git synced 2024-11-22 07:52:36 +00:00
salesagility_SuiteCRM/modules/Emails/include/ListView/ListViewDataEmailsSearchOnCrm.php
2023-07-18 15:53:48 +01:00

329 lines
15 KiB
PHP

<?php
/**
*
* SugarCRM Community Edition is a customer relationship management program developed by
* SugarCRM, Inc. Copyright (C) 2004-2013 SugarCRM Inc.
*
* SuiteCRM is an extension to SugarCRM Community Edition developed by SalesAgility Ltd.
* Copyright (C) 2011 - 2018 SalesAgility Ltd.
*
* This program is free software; you can redistribute it and/or modify it under
* the terms of the GNU Affero General Public License version 3 as published by the
* Free Software Foundation with the addition of the following permission added
* to Section 15 as permitted in Section 7(a): FOR ANY PART OF THE COVERED WORK
* IN WHICH THE COPYRIGHT IS OWNED BY SUGARCRM, SUGARCRM DISCLAIMS THE WARRANTY
* OF NON INFRINGEMENT OF THIRD PARTY RIGHTS.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
* FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more
* details.
*
* You should have received a copy of the GNU Affero General Public License along with
* this program; if not, see http://www.gnu.org/licenses or write to the Free
* Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
* 02110-1301 USA.
*
* You can contact SugarCRM, Inc. headquarters at 10050 North Wolfe Road,
* SW2-130, Cupertino, CA 95014, USA. or at email address contact@sugarcrm.com.
*
* The interactive user interfaces in modified source and object code versions
* of this program must display Appropriate Legal Notices, as required under
* Section 5 of the GNU Affero General Public License version 3.
*
* In accordance with Section 7(b) of the GNU Affero General Public License version 3,
* these Appropriate Legal Notices must retain the display of the "Powered by
* SugarCRM" logo and "Supercharged by SuiteCRM" logo. If the display of the logos is not
* reasonably feasible for technical reasons, the Appropriate Legal Notices must
* display the words "Powered by SugarCRM" and "Supercharged by SuiteCRM".
*/
if (!defined('sugarEntry') || !sugarEntry) {
die('Not A Valid Entry Point');
}
include_once 'modules/Emails/include/ListView/ListViewDataEmailsSearchAbstract.php';
class ListViewDataEmailsSearchOnCrm extends ListViewDataEmailsSearchAbstract
{
/**
* @param array $filterFields
* @param array $request $_REQUEST
* @param string $where
* @param InboundEmail $inboundEmail
* @param array $params
* @param Email $seed
* @param bool $singleSelect
* @param string $id
* @param int $limit
* @param User $currentUser
* @param string $idField
* @param int $offset
* @return array
*/
public function search($filterFields, $request, $where, InboundEmail $inboundEmail, $params, Email $seed, $singleSelect, $id, $limit, User $currentUser, $idField, $offset)
{
$ret_array = [];
$filter_fields = [];
$pageData = [];
// Fix fields in filter fields
if (!is_string($id)) {
$GLOBALS['log']->warn("ID should be a string: {$id}");
}
$filterFields = $this->lvde->fixFieldsInFilter($filterFields, $request, $where);
// Filter imported emails based on the UID of the results from the IMap server
if (!empty($where)) {
$where .= ' AND ';
}
if ($inboundEmail->id) {
$inboundEmailIdQuoted = DBManagerFactory::getInstance()->quote($inboundEmail->id);
} else {
$inboundEmailIdQuoted = '';
LoggerManager::getLogger()->warn('Unable to quote Inbound Email ID, Inbound Email is not set.');
}
$crmWhere = $where . "mailbox_id LIKE " ."'" . $inboundEmailIdQuoted . "'";
// Populates CRM fields
$crmQueryArray = $this->lvde->getCrmQueryArray($crmWhere, $filterFields, $params, $seed, $singleSelect);
// get crm emails query
$crmEmailsQuery = $this->lvde->getCrmEmailsQuery($crmQueryArray, $params);
$this->lvde->setVariableName($seed->object_name, $crmWhere, $this->lvde->listviewName, $id);
SugarVCR::erase($seed->module_dir);
$this->lvde->seed =& $seed;
$totalCounted = empty($GLOBALS['sugar_config']['disable_count_query']);
$_SESSION['MAILMERGE_MODULE_FROM_LISTVIEW'] = $seed->module_dir;
if (empty($request['action']) || $request['action'] != 'Popup') {
$_SESSION['MAILMERGE_MODULE'] = $seed->module_dir;
}
$this->lvde->setVariableName($seed->object_name, $where, $this->lvde->listviewName, $id);
$this->lvde->seed->id = '[SELECT_ID_LIST]';
// if $params tell us to override all ordering
if (!empty($params['overrideOrder']) && !empty($params['orderBy'])) {
$order = $this->lvde->getOrderBy(strtolower($params['orderBy']), (empty($params['sortOrder']) ? '' : $params['sortOrder'])); // retreive from $_REQUEST
} else {
$order = $this->lvde->getOrderBy(); // retreive from $_REQUEST
}
// still empty? try to use settings passed in $param
if (empty($order['orderBy']) && !empty($params['orderBy'])) {
$order['orderBy'] = $params['orderBy'];
$order['sortOrder'] = (empty($params['sortOrder']) ? '' : $params['sortOrder']);
}
if (empty($params['skipOrderSave'])) { // don't save preferences if told so
$currentUser->setPreference('listviewOrder', $order, 0, $this->lvde->var_name); // save preference
}
$data = array();
$rows = array();
$count = 0;
$idIndex = array();
$id_list = '';
$crmEmails = $this->lvde->db->query($crmEmailsQuery);
while (($row = $this->lvde->db->fetchByAssoc($crmEmails)) != null) {
if ($count < $limit) {
$id_list .= ',\''.$row[$idField].'\'';
$idIndex[$row[$idField]][] = count($rows);
$rows[] = $seed->convertRow($row);
}
$count++;
}
if (!empty($id_list)) {
$id_list = '('.substr($id_list, 1).')';
}
SugarVCR::store($this->lvde->seed->module_dir, $crmEmailsQuery);
if ($count != 0) {
//NOW HANDLE SECONDARY QUERIES
if (!empty($ret_array['secondary_select'])) {
$secondary_query = $ret_array['secondary_select'] . $ret_array['secondary_from'] . ' WHERE '.$this->lvde->seed->table_name.'.id IN ' .$id_list;
if (isset($ret_array['order_by'])) {
$secondary_query .= ' ' . $ret_array['order_by'];
}
$secondary_result = $this->lvde->db->query($secondary_query);
$ref_id_count = array();
while ($row = $this->lvde->db->fetchByAssoc($secondary_result)) {
$ref_id_count[$row['ref_id']][] = true;
foreach ($row as $name=>$value) {
//add it to every row with the given id
foreach ($idIndex[$row['ref_id']] as $index) {
$rows[$index][$name]=$value;
}
}
}
$rows_keys = array_keys($rows);
foreach ($rows_keys as $key) {
$rows[$key]['secondary_select_count'] = count($ref_id_count[$rows[$key]['ref_id']]);
}
}
// retrieve parent names
if (!empty($filter_fields['parent_name']) && !empty($filter_fields['parent_id']) && !empty($filter_fields['parent_type'])) {
foreach ($idIndex as $id => $rowIndex) {
if (!isset($post_retrieve[$rows[$rowIndex[0]]['parent_type']])) {
$post_retrieve[$rows[$rowIndex[0]]['parent_type']] = array();
}
if (!empty($rows[$rowIndex[0]]['parent_id'])) {
$post_retrieve[$rows[$rowIndex[0]]['parent_type']][] = array('child_id' => $id , 'parent_id'=> $rows[$rowIndex[0]]['parent_id'], 'parent_type' => $rows[$rowIndex[0]]['parent_type'], 'type' => 'parent');
}
}
if (isset($post_retrieve)) {
$parent_fields = $seed->retrieve_parent_fields($post_retrieve);
foreach ($parent_fields as $child_id => $parent_data) {
//add it to every row with the given id
foreach ($idIndex[$child_id] as $index) {
$rows[$index]['parent_name']= $parent_data['parent_name'];
}
}
}
}
reset($rows);
while ($row = current($rows)) {
$temp = clone $seed;
$dataIndex = count($data);
$temp->setupCustomFields($temp->module_dir);
$temp->loadFromRow($row);
if (empty($this->lvde->seed->assigned_user_id) && !empty($temp->assigned_user_id)) {
$this->lvde->seed->assigned_user_id = $temp->assigned_user_id;
}
if ($idIndex[$row[$idField]][0] === $dataIndex) {
$pageData['tag'][$dataIndex] = $temp->listviewACLHelper();
} else {
$pageData['tag'][$dataIndex] = $pageData['tag'][$idIndex[$row[$idField]][0]];
}
$data[$dataIndex] = $temp->get_list_view_data();
$detailViewAccess = $temp->ACLAccess('DetailView');
$editViewAccess = $temp->ACLAccess('EditView');
$pageData['rowAccess'][$dataIndex] = array('view' => $detailViewAccess, 'edit' => $editViewAccess);
$additionalDetailsAllow = $this->lvde->additionalDetails && $detailViewAccess && (file_exists(
'modules/' . $temp->module_dir . '/metadata/additionalDetails.php'
) || file_exists('custom/modules/' . $temp->module_dir . '/metadata/additionalDetails.php'));
$additionalDetailsEdit = $editViewAccess;
if ($additionalDetailsAllow) {
if ($this->lvde->additionalDetailsAjax) {
$ar = $this->lvde->getAdditionalDetailsAjax($data[$dataIndex]['ID']);
} else {
$additionalDetailsFile = 'modules/' . $this->lvde->seed->module_dir . '/metadata/additionalDetails.php';
if (file_exists('custom/modules/' . $this->lvde->seed->module_dir . '/metadata/additionalDetails.php')) {
$additionalDetailsFile = 'custom/modules/' . $this->lvde->seed->module_dir . '/metadata/additionalDetails.php';
}
require_once($additionalDetailsFile);
$ar = $this->lvde->getAdditionalDetails(
$data[$dataIndex],
(empty($this->lvde->additionalDetailsFunction) ? 'additionalDetails' : $this->lvde->additionalDetailsFunction) . $this->lvde->seed->object_name,
$additionalDetailsEdit
);
}
$pageData['additionalDetails'][$dataIndex] = $ar['string'];
$pageData['additionalDetails']['fieldToAddTo'] = $ar['fieldToAddTo'];
}
next($rows);
}
}
$nextOffset = -1;
$prevOffset = -1;
$endOffset = -1;
if ($count > $limit) {
$nextOffset = $offset + $limit;
}
if ($offset > 0) {
$prevOffset = $offset - $limit;
if ($prevOffset < 0) {
$prevOffset = 0;
}
}
$totalCount = $count + $offset;
if ($count >= $limit && $totalCounted) {
$totalCount = $this->lvde->getTotalCount($crmEmailsQuery);
}
SugarVCR::recordIDs($this->lvde->seed->module_dir, array_keys($idIndex), $offset, $totalCount);
$module_names = array(
'Prospects' => 'Targets'
);
$endOffset = (floor(($totalCount - 1) / $limit)) * $limit;
$pageData['ordering'] = $order;
$pageData['ordering']['sortOrder'] = $this->lvde->getReverseSortOrder($pageData['ordering']['sortOrder']);
//get url parameters as an array
$pageData['queries'] = $this->lvde->callGenerateQueries($pageData['ordering']['sortOrder'], $offset, $prevOffset, $nextOffset, $endOffset, $totalCounted);
//join url parameters from array to a string
$pageData['urls'] = $this->lvde->callGenerateURLS($pageData['queries']);
$pageData['offsets'] = array( 'current'=>$offset, 'next'=>$nextOffset, 'prev'=>$prevOffset, 'end'=>$endOffset, 'total'=>$totalCount, 'totalCounted'=>$totalCounted);
$pageData['bean'] = array('objectName' => $seed->object_name, 'moduleDir' => $seed->module_dir, 'moduleName' => strtr($seed->module_dir, $module_names));
$pageData['stamp'] = $this->lvde->stamp;
$pageData['access'] = array('view' => $this->lvde->seed->ACLAccess('DetailView'), 'edit' => $this->lvde->seed->ACLAccess('EditView'));
$pageData['idIndex'] = $idIndex;
if (!$this->lvde->seed->ACLAccess('ListView')) {
$pageData['error'] = 'ACL restricted access';
}
$queryString = '';
if ((isset($request["searchFormTab"]) && $request["searchFormTab"] == "advanced_search") ||
(isset($request["type_basic"]) && ((is_countable($request["type_basic"]) ? count($request["type_basic"]) : 0) > 1 || $request["type_basic"][0] != "")) ||
(isset($request["module"]) && $request["module"] == "MergeRecords")) {
$queryString = "-advanced_search";
} else {
if (isset($request["searchFormTab"]) && $request["searchFormTab"] == "basic_search") {
// TODO: figure out what was the SearchFormReports???
if ($seed->module_dir == "Reports") {
$searchMetaData = SearchFormReports::retrieveReportsSearchDefs();
} else {
$searchMetaData = SearchForm::retrieveSearchDefs($seed->module_dir);
} // TODO: figure out which SearchForm is it?
$basicSearchFields = array();
if (isset($searchMetaData['searchdefs']) && isset($searchMetaData['searchdefs'][$seed->module_dir]['layout']['basic_search'])) {
$basicSearchFields = $searchMetaData['searchdefs'][$seed->module_dir]['layout']['basic_search'];
}
foreach ($basicSearchFields as $basicSearchField) {
$field_name = (is_array($basicSearchField) && isset($basicSearchField['name'])) ? $basicSearchField['name'] : $basicSearchField;
$field_name .= "_basic";
if (isset($request[$field_name]) && (!is_array($basicSearchField) || !isset($basicSearchField['type']) || $basicSearchField['type'] == 'text' || $basicSearchField['type'] == 'name')) {
// Ensure the encoding is UTF-8
$queryString = htmlentities((string) $request[$field_name], null, 'UTF-8');
break;
}
}
}
}
$ret = array('data'=>$data , 'pageData'=>$pageData, 'query' => $queryString);
return $ret;
}
}