- Модуль: crm
- Путь к файлу: ~/bitrix/modules/crm/classes/general/crm_lead.php
- Класс: \CAllCrmLead
- Вызов: CAllCrmLead::__AfterPrepareSql
static function __AfterPrepareSql(/*CCrmEntityListBuilder*/ $sender, $arOrder, $arFilter, $arGroupBy, $arSelectFields) { $sqlData = array('FROM' => array(), 'WHERE' => array()); if(isset($arFilter['SEARCH_CONTENT']) && $arFilter['SEARCH_CONTENT'] !== '') { $tableAlias = $sender->GetTableAlias(); $queryWhere = new CSQLWhere(); $queryWhere->SetFields( array( 'SEARCH_CONTENT' => array( 'FIELD_NAME' => "{$tableAlias}.SEARCH_CONTENT", 'FIELD_TYPE' => 'string', 'JOIN' => false ) ) ); $options = []; if (isset($arFilter['__ENABLE_SEARCH_CONTENT_PHONE_DETECTION'])) { $options['ENABLE_PHONE_DETECTION'] = $arFilter['__ENABLE_SEARCH_CONTENT_PHONE_DETECTION']; unset($arFilter['__ENABLE_SEARCH_CONTENT_PHONE_DETECTION']); } $query = $queryWhere->GetQuery( Crm\Search\SearchEnvironment::prepareEntityFilter( CCrmOwnerType::Lead, array( 'SEARCH_CONTENT' => Crm\Search\SearchEnvironment::prepareSearchContent($arFilter['SEARCH_CONTENT'], $options) ) ) ); if($query !== '') { $sqlData['WHERE'][] = $query; } } if (!empty($arFilter['ACTIVE_TIME_PERIOD_from']) || !empty($arFilter['%STATUS_ID_FROM_HISTORY']) || !empty($arFilter['%STATUS_ID_FROM_SUPPOSED_HISTORY']) || !empty($arFilter['%STATUS_SEMANTIC_ID_FROM_HISTORY'])) { global $DB; $supposedHistoryConditions = []; if (!empty($arFilter['ACTIVE_TIME_PERIOD_from']) && !empty($arFilter['ACTIVE_TIME_PERIOD_to'])) { $supposedHistoryConditions[] = "LSHWS.LAST_UPDATE_DATE <= " . $DB->CharToDateFunction($arFilter['ACTIVE_TIME_PERIOD_to'], 'SHORT'); $supposedHistoryConditions[] = "LSHWS.CLOSE_DATE >= " . $DB->CharToDateFunction($arFilter['ACTIVE_TIME_PERIOD_from'], 'SHORT'); } if (!empty($arFilter['%STATUS_SEMANTIC_ID_FROM_HISTORY'])) { $statusSemanticIdsFromFilter = is_array($arFilter['%STATUS_SEMANTIC_ID_FROM_HISTORY']) ? $arFilter['%STATUS_SEMANTIC_ID_FROM_HISTORY'] : array($arFilter['%STATUS_SEMANTIC_ID_FROM_HISTORY']); $statusSemanticIdsForSql = []; foreach ($statusSemanticIdsFromFilter as $value) { $statusSemanticIdsForSql[] = "'" . \Bitrix\Main\Application::getConnection()->getSqlHelper()->forSql($value) . "'"; } $supposedHistoryConditions[] = "LSHWS.IS_SUPPOSED = 'N'"; $supposedHistoryConditions[] = "LSHWS.STATUS_SEMANTIC_ID IN (" . implode(', ', $statusSemanticIdsForSql) . ")"; } if (!empty($arFilter['%STATUS_ID_FROM_HISTORY'])) { $statusIdsFromFilter = is_array($arFilter['%STATUS_ID_FROM_HISTORY']) ? $arFilter['%STATUS_ID_FROM_HISTORY'] : array($arFilter['%STATUS_ID_FROM_HISTORY']); $statusIdsForSql = []; foreach ($statusIdsFromFilter as $value) { $statusIdsForSql[] = "'" . \Bitrix\Main\Application::getConnection()->getSqlHelper()->forSql($value) . "'"; } $supposedHistoryConditions[] = "LSHWS.IS_SUPPOSED = 'N'"; $supposedHistoryConditions[] = "LSHWS.STATUS_ID IN (" . implode(', ', $statusIdsForSql) . ")"; } if (!empty($arFilter['%STATUS_ID_FROM_SUPPOSED_HISTORY'])) { $statusIdsFromFilter = is_array($arFilter['%STATUS_ID_FROM_SUPPOSED_HISTORY']) ? $arFilter['%STATUS_ID_FROM_SUPPOSED_HISTORY'] : array($arFilter['%STATUS_ID_FROM_SUPPOSED_HISTORY']); $statusIdsForSql = []; foreach ($statusIdsFromFilter as $value) { $statusIdsForSql[] = "'" . \Bitrix\Main\Application::getConnection()->getSqlHelper()->forSql($value) . "'"; } $supposedHistoryConditions[] .= " LSHWS.STATUS_ID IN (" . implode(', ', $statusIdsForSql) . ")"; } $sqlData['WHERE'][] = "L.ID IN (SELECT DISTINCT LSHWS.OWNER_ID FROM b_crm_lead_status_history_with_supposed LSHWS WHERE " . implode(" AND ", $supposedHistoryConditions) . ")"; } if(isset($arFilter['CALENDAR_DATE_FROM']) && $arFilter['CALENDAR_DATE_FROM'] !== '' && isset($arFilter['CALENDAR_DATE_TO']) && $arFilter['CALENDAR_DATE_TO'] !== '') { global $DB; if ($arFilter['CALENDAR_FIELD'] == 'DATE_CREATE') { $sqlData['WHERE'][] = "L.DATE_CREATE <= ".$DB->CharToDateFunction($arFilter['CALENDAR_DATE_TO'], 'SHORT'); $sqlData['WHERE'][] = "L.DATE_CREATE >= ".$DB->CharToDateFunction($arFilter['CALENDAR_DATE_FROM'], 'SHORT'); } else { [$ufId, $ufType, $ufName] = \Bitrix\Crm\Integration\Calendar::parseUserfieldKey($arFilter['CALENDAR_FIELD']); if (intval($ufId) > 0 && $ufType == 'resourcebooking' || is_null($ufType)) { // L = b_crm_lead $sqlData['FROM'][] = "INNER JOIN b_calendar_resource RBUF ". "ON RBUF.PARENT_ID = L.ID". " AND RBUF.PARENT_TYPE = 'CRM_LEAD'". " AND RBUF.UF_ID = ".intval($arFilter['CALENDAR_FIELD']); $sqlData['SELECT'][] = $DB->DateToCharFunction("RBUF.DATE_FROM").' as RES_BOOKING_FROM'; $sqlData['SELECT'][] = $DB->DateToCharFunction("RBUF.DATE_TO").' as RES_BOOKING_TO'; $sqlData['SELECT'][] = 'RBUF.SKIP_TIME as RES_BOOKING_SKIP_TIME'; $sqlData['SELECT'][] = 'RBUF.TZ_FROM as RES_BOOKING_TZ_FROM'; $sqlData['SELECT'][] = 'RBUF.TZ_TO as RES_BOOKING_TZ_TO'; $sqlData['SELECT'][] = 'RBUF.RESOURCE_ID as RES_BOOKING_RESOURCE_ID'; $sqlData['SELECT'][] = 'RBUF.CAL_TYPE as RES_BOOKING_CAL_TYPE'; $sqlData['SELECT'][] = 'RBUF.EVENT_ID as RES_BOOKING_EVENT_ID'; $sqlData['WHERE'][] = "RBUF.DATE_FROM <= ".$DB->CharToDateFunction($arFilter['CALENDAR_DATE_TO'], 'SHORT'); $sqlData['WHERE'][] = "RBUF.DATE_TO >= ".$DB->CharToDateFunction($arFilter['CALENDAR_DATE_FROM'], 'SHORT'); } elseif(intval($ufId) > 0 && ($ufType == 'date' || $ufType == 'datetime')) { if (!in_array($ufName, $arSelectFields)) { $alias = $sender->GetTableAlias(); $ufSelectSql = new CUserTypeSQL(); $ufSelectSql->SetEntity(self::GetUserFieldEntityID(), $alias.'.ID'); $ufSelectSql->SetSelect(array($ufName)); $sqlData['SELECT'][] = trim($ufSelectSql->GetSelect(), ', '); $sqlData['FROM'][] = $ufSelectSql->GetJoin($alias.'.ID'); } $sqlData['WHERE'][] = $DB->ForSql($ufName)." <= ".$DB->CharToDateFunction($arFilter['CALENDAR_DATE_TO'], 'SHORT'); $sqlData['WHERE'][] = $DB->ForSql($ufName)." >= ".$DB->CharToDateFunction($arFilter['CALENDAR_DATE_FROM'], 'SHORT'); } } } // Applying filter by PRODUCT_ID $operationInfo = Crm\UI\Filter\EntityHandler::findFieldOperation('PRODUCT_ROW_PRODUCT_ID', $arFilter); if(is_array($operationInfo)) { $prodID = (int)$operationInfo['CONDITION']; if($prodID > 0 && $operationInfo['OPERATION'] === '=') { $tableAlias = $sender->GetTableAlias(); $sqlData['WHERE'][] = "{$tableAlias}.ID IN (SELECT LP.OWNER_ID from b_crm_product_row LP where LP.OWNER_TYPE = 'L' and LP.OWNER_ID = {$tableAlias}.ID and LP.PRODUCT_ID = {$prodID})"; } } $operationInfo = Crm\UI\Filter\EntityHandler::findFieldOperation('ASSOCIATED_CONTACT_ID', $arFilter); if(is_array($operationInfo)) { if($operationInfo['OPERATION'] === '=') { $sqlData['FROM'][] = LeadContactTable::prepareFilterJoinSql( CCrmOwnerType::Contact, $operationInfo['CONDITION'], $sender->GetTableAlias() ); } } Tracking\UI\Filter::buildFilterAfterPrepareSql( $sqlData, $arFilter, \CCrmOwnerType::Lead, $sender->GetTableAlias() ); if (isset($arFilter['OBSERVER_IDS'])) { $observerIds = is_array($arFilter['OBSERVER_IDS']) ? $arFilter['OBSERVER_IDS'] : []; $observersFilter = CCrmEntityHelper::prepareObserversFieldFilter( CCrmOwnerType::Lead, $sender->GetTableAlias(), $observerIds ); if (!empty($observersFilter)) { $sqlData['WHERE'][] = $observersFilter; } } $result = []; if(!empty($sqlData['SELECT'])) { $result['SELECT'] = ", ".implode(', ', $sqlData['SELECT']); } if(!empty($sqlData['FROM'])) { $result['FROM'] = implode(' ', $sqlData['FROM']); } if(!empty($sqlData['WHERE'])) { $result['WHERE'] = implode(' AND ', $sqlData['WHERE']); } return !empty($result) ? $result : false; }