Server IP : 80.87.202.40 / Your IP : 216.73.216.169 Web Server : Apache System : Linux rospirotorg.ru 5.14.0-539.el9.x86_64 #1 SMP PREEMPT_DYNAMIC Thu Dec 5 22:26:13 UTC 2024 x86_64 User : bitrix ( 600) PHP Version : 8.2.27 Disable Function : NONE MySQL : OFF | cURL : ON | WGET : ON | Perl : ON | Python : OFF | Sudo : ON | Pkexec : ON Directory : /home/bitrix/ext_www/rospirotorg.ru/bitrix/modules/sender/lib/integration/crm/connectors/ |
Upload File : |
<?php /** * Bitrix Framework * @package bitrix * @subpackage sender * @copyright 2001-2012 Bitrix */ namespace Bitrix\Sender\Integration\Crm\Connectors; use Bitrix\Crm\LeadTable; use Bitrix\Crm\PhaseSemantics; use Bitrix\Crm\Service\Container; use Bitrix\Main\DB\Result; use Bitrix\Main\Entity; use Bitrix\Main\Loader; use Bitrix\Main\Localization\Loc; use Bitrix\Main\Page\Asset; use Bitrix\Main\UI\Filter\AdditionalDateType; use Bitrix\Sender\Connector; use Bitrix\Sender\Connector\BaseFilter as ConnectorBaseFilter; use Bitrix\Sender\Connector\ResultView; Loc::loadMessages(__FILE__); /** * Class Lead * @package Bitrix\Sender\Integration\Crm\Connectors */ class Lead extends ConnectorBaseFilter implements Connector\IncrementallyConnector { /** * Get name. * * @return string */ public function getName() { return Loc::getMessage('SENDER_INTEGRATION_CRM_CONNECTOR_LEAD_NAME'); } /** * Get code. * * @return string */ public function getCode() { return "crm_lead"; } /** * Get query. * * @return null|Entity\Query */ public function getQuery($selectList = []) { $filter = Helper::getFilterByFields( self::getUiFilterFields(), $this->getFieldValues() ); $runtime = Helper::getRuntimeByEntity(null); $sqlHelper = \Bitrix\Main\Application::getConnection()->getSqlHelper(); $nameExprField = new Entity\ExpressionField( $sqlHelper->quote('NAME'), 'CASE WHEN %2$s=\'Y\' AND %3$s>0 THEN %4$s WHEN %2$s=\'Y\' AND %5$s>0 THEN %6$s ELSE %1$s END', [ 'NAME', 'IS_RETURN_CUSTOMER', 'CONTACT_ID', 'CONTACT.NAME', 'COMPANY_ID', 'COMPANY.TITLE' ] ); $query = new Entity\Query(LeadTable::getEntity()); $query->setFilter($filter); $query->setSelect(array_merge($selectList, [ $nameExprField, 'CRM_ENTITY_ID' => 'ID', 'CRM_ENTITY_TYPE_ID', 'CRM_ENTITY_TYPE', 'CRM_CONTACT_ID' => 'CONTACT_ID', 'CRM_COMPANY_ID' => 'COMPANY_ID', ])); $query->registerRuntimeField(new Entity\ExpressionField('CRM_ENTITY_TYPE', '\''.\CCrmOwnerType::LeadName.'\'')); $query->registerRuntimeField(Helper::createExpressionMultiField( \CCrmOwnerType::LeadName, 'EMAIL' )); $query->registerRuntimeField(Helper::createExpressionMultiField( \CCrmOwnerType::LeadName, 'PHONE' )); $query->registerRuntimeField(new Entity\ExpressionField('CRM_ENTITY_TYPE_ID', \CCrmOwnerType::Lead)); $query->registerRuntimeField(null, new Entity\ReferenceField( 'CONTACT', "\\Bitrix\\Crm\\ContactTable", ['=this.CONTACT_ID' => 'ref.ID'], ['join_type' => 'LEFT'] )); $query->registerRuntimeField(null, new Entity\ReferenceField( 'COMPANY', "\\Bitrix\\Crm\\CompanyTable", ['=this.COMPANY_ID' => 'ref.ID'], ['join_type' => 'LEFT'] )); foreach ($runtime as $item) { $item = new Entity\ExpressionField( $item['name'], $item['expression'], $item['buildFrom'] ); $query->registerRuntimeField($item); } //echo "<pre>" . $query->getQuery(); die(); return $query; } /** * Get data count by type. * * @return null|array */ protected function getDataCountByType() { if (!$this->hasFieldValues()) { return array(); } return QueryCount::getCount($this->getQuery(), $this->getDataTypeId()); } /** * Get data. * * @return array|Result */ public function getData() { if (!$this->hasFieldValues()) { return array(); } $query = $this->getQuery(); if ($this->getResultView()->hasNav()) { $query->setOffset($this->getResultView()->getNav()->getOffset()); $query->setLimit($this->getResultView()->getNav()->getLimit()); } return QueryData::getData($query, $this->getDataTypeId()); } /** * Get personalize field list. * * @return array */ public static function getPersonalizeList() { return Loader::includeModule('crm') ? array_merge( Helper::getPersonalizeList(), Helper::buildPersonalizeList(\CCrmOwnerType::LeadName) ) : Helper::getPersonalizeList(); } /** * Get filter fields. * * @param bool $checkAccessRights * * @return array * @throws \Bitrix\Main\NotSupportedException */ public static function getUiFilterFields(bool $checkAccessRights = true): array { $list = [ [ 'id' => 'EMAIL', 'type' => 'string', 'sender_segment_filter' => '%EMAIL', 'sender_internal' => true ], [ 'id' => 'PHONE', 'type' => 'string', 'sender_segment_filter' => '%PHONE', 'sender_internal' => true ], [ 'id' => 'NAME', 'type' => 'string', 'sender_segment_filter' => '%NAME', 'sender_internal' => true ], ]; $list[] = array( "id" => "DATE_CREATE", "name" => Loc::getMessage('SENDER_INTEGRATION_CRM_CONNECTOR_LEAD_FIELD_DATE_CREATE'), "type" => "date", "include" => [ AdditionalDateType::CUSTOM_DATE, AdditionalDateType::PREV_DAY, AdditionalDateType::NEXT_DAY, AdditionalDateType::MORE_THAN_DAYS_AGO, AdditionalDateType::AFTER_DAYS, ], "allow_years_switcher" => true, "default" => true ); $list[] = array( "id" => "STATUS_ID", "name" => Loc::getMessage('SENDER_INTEGRATION_CRM_CONNECTOR_LEAD_FIELD_STATUS_ID'), "type" => "list", "items" => \CCrmStatus::GetStatusList('STATUS'), "default" => true, 'params' => array('multiple' => 'Y'), ); $list[] = array( "id" => "SOURCE_ID", "name" => Loc::getMessage('SENDER_INTEGRATION_CRM_CONNECTOR_LEAD_FIELD_SOURCE_ID'), "type" => "list", "items" => \CCrmStatus::GetStatusList('SOURCE'), "default" => true, 'params' => array('multiple' => 'Y'), ); $list[] = array( 'id' => 'COMMUNICATION_TYPE', "name" => Loc::getMessage('SENDER_INTEGRATION_CRM_CONNECTOR_LEAD_FIELD_COMMUNICATION_TYPE'), 'params' => array('multiple' => 'Y'), 'default' => true, 'type' => 'list', 'items' => \CCrmFieldMulti::PrepareListItems(array( \CCrmFieldMulti::PHONE, \CCrmFieldMulti::EMAIL, \CCrmFieldMulti::IM )), 'filter_callback' => ['\Bitrix\Sender\Integration\Crm\Connectors\Helper', 'getCommunicationTypeFilter'] ); $list[] = PhaseSemantics::getListFilterInfo( \CCrmOwnerType::Lead, array( 'id' => 'STATUS_SEMANTIC_ID', "name" => Loc::getMessage('SENDER_INTEGRATION_CRM_CONNECTOR_LEAD_FIELD_STATUS_SEMANTIC_ID'), 'default' => true, 'params' => array('multiple' => 'Y'), ), true ); $list[] = array( 'id' => 'PRODUCT_ROW.PRODUCT_ID', "name" => Loc::getMessage("SENDER_INTEGRATION_CRM_CONNECTOR_LEAD_FIELD_PRODUCT_ID"), 'default' => true, 'type' => 'dest_selector', 'partial' => true, 'params' => array( 'multiple' => 'Y', 'apiVersion' => 3, 'context' => 'CRM_LEAD_FILTER_PRODUCT_ID', 'contextCode' => 'CRM', 'useClientDatabase' => 'N', 'enableAll' => 'N', 'enableDepartments' => 'N', 'enableUsers' => 'N', 'enableSonetgroups' => 'N', 'allowEmailInvitation' => 'N', 'allowSearchEmailUsers' => 'N', 'departmentSelectDisable' => 'Y', 'addTabCrmProducts' => 'Y', 'enableCrm' => 'Y', 'enableCrmProducts' => 'Y', 'convertJson' => 'Y' ) ); $list[] = array( "id" => "STATUS_CONVERTED", "name" => Loc::getMessage('SENDER_INTEGRATION_CRM_CONNECTOR_LEAD_FIELD_STATUS_CONVERTED'), 'type' => 'checkbox', 'sender_segment_filter' => array( 'N' => array('=STATUS_SEMANTIC_ID', PhaseSemantics::PROCESS), 'Y' => array('!=STATUS_SEMANTIC_ID', PhaseSemantics::PROCESS), ), "default" => false, ); $list[] = array( "id" => "ASSIGNED_BY_ID", "name" => Loc::getMessage('SENDER_INTEGRATION_CRM_CONNECTOR_LEAD_FIELD_ASSIGNED_BY_ID'), 'type' => 'dest_selector', 'params' => array( 'context' => 'SENDER_LEAD_FILTER_ASSIGNED_BY_ID', 'multiple' => 'Y', 'contextCode' => 'U', 'enableAll' => 'N', 'enableSonetgroups' => 'N', 'allowEmailInvitation' => 'N', 'allowSearchEmailUsers' => 'N', 'departmentSelectDisable' => 'Y', 'isNumeric' => 'Y', 'prefix' => 'U' ), "default" => false, ); $list[] = array( "id" => "POST", 'type' => 'string', "name" => Loc::getMessage('SENDER_INTEGRATION_CRM_CONNECTOR_LEAD_FIELD_POST'), 'params' => array('multiple' => 'Y'), "default" => false ); $list[] = array( "id" => "BIRTHDATE", "name" => Loc::getMessage('SENDER_INTEGRATION_CRM_CONNECTOR_LEAD_FIELD_BIRTHDATE'), 'type' => 'date', "include" => [ AdditionalDateType::CUSTOM_DATE, AdditionalDateType::PREV_DAY, AdditionalDateType::NEXT_DAY, AdditionalDateType::MORE_THAN_DAYS_AGO, AdditionalDateType::AFTER_DAYS, ], "allow_years_switcher" => true, "default" => false, ); $list[] = array( 'id' => 'HONORIFIC', 'name' => Loc::getMessage('SENDER_INTEGRATION_CRM_CONNECTOR_LEAD_FIELD_HONORIFIC'), 'params' => array('multiple' => 'Y'), 'default' => false, 'type' => 'list', 'items' => \CCrmStatus::GetStatusList('HONORIFIC'), ); return array_merge($list, Helper::getFilterUserFields(\CCrmOwnerType::Lead, $checkAccessRights)); } /** * Get filter presets. * * @return array */ public static function getUiFilterPresets() { return array( 'crm_lead_all' => array( 'name' => Loc::getMessage('SENDER_INTEGRATION_CRM_CONNECTOR_LEAD_PRESET_ALL'), 'sender_segment_name' => Loc::getMessage('SENDER_INTEGRATION_CRM_CONNECTOR_LEAD_PRESET_SEGMENT_ALL'), 'fields' => array( self::FIELD_FOR_PRESET_ALL => 'Y', ) ), 'crm_lead_converted' => array( 'name' => Loc::getMessage('SENDER_INTEGRATION_CRM_CONNECTOR_LEAD_PRESET_CONV'), 'sender_segment_name' => Loc::getMessage('SENDER_INTEGRATION_CRM_CONNECTOR_LEAD_PRESET_SEGMENT_CONV'), 'fields' => array( 'STATUS_SEMANTIC_ID' => array(PhaseSemantics::SUCCESS), ) ), 'crm_lead_in_work' => array( 'name' => Loc::getMessage('SENDER_INTEGRATION_CRM_CONNECTOR_LEAD_PRESET_INW'), 'sender_segment_name' => Loc::getMessage('SENDER_INTEGRATION_CRM_CONNECTOR_LEAD_PRESET_SEGMENT_INW'), 'fields' => array( 'STATUS_SEMANTIC_ID' => array(PhaseSemantics::PROCESS), ) ), 'crm_lead_birthday' => array( 'name' => Loc::getMessage('SENDER_INTEGRATION_CRM_CONNECTOR_LEAD_PRESET_BIRTH'), 'sender_segment_name' => Loc::getMessage('SENDER_INTEGRATION_CRM_CONNECTOR_LEAD_PRESET_SEGMENT_BIRTH'), 'sender_segment_business_case' => true, 'fields' => array( 'BIRTHDATE_datesel' => 'NEXT_DAY', 'BIRTHDATE_days' => '5', 'BIRTHDATE_allow_year' => '0', ) ), ); } /** * Return true if support view of result. * * @return bool */ public function isResultViewable() { return true; } protected function onInitResultView() { $this->getResultView() ->setCallback( ResultView::ColumnModifier, function (array &$columns) { Asset::getInstance()->addJs('/bitrix/js/crm/common.js'); $columns = array_merge( [[ 'id' => 'CRM_LEAD', 'name' => Loc::getMessage('SENDER_INTEGRATION_CRM_CONNECTOR_LEAD_FIELD_LEAD'), 'default' => true ]], $columns ); return $columns; } ) ->setCallback( ResultView::Draw, function(array &$row) { (new Helper())->onResultViewDraw($row); } ); } public function getUiFilterId() { $code = str_replace('_', '', $this->getCode()); return $this->getId() . '_--filter--'.$code.'--'; } /** * Get fields for statistic * @return array */ public function getStatFields() { return ['PRODUCT_ROW.PRODUCT_ID']; } /** * @param int $offset * @param int $limit * @param string|null $excludeType * * @return array|Entity\Query[]|null[] */ public function getLimitedQueries(int $offset, int $limit, string $excludeType = null): array { $query = $this->getQuery(); $query->whereBetween('ID', $offset, $limit); return [ $query ]; } /** * @return array */ public function getEntityLimitInfo(): array { $lastLead = \CCrmLead::GetListEx( ['ID' => 'DESC'], ['CHECK_PERMISSIONS' => 'N'], false, ['nTopCount' => '1'], ['ID'] )->Fetch(); $lastLeadId = $lastLead['ID'] ?? 0; return [ 'lastContactId' => 0, 'lastCompanyId' => 0, 'lastId' => $lastLeadId, ]; } /** * @param int $offset * @param int $limit * * @return Result */ public function getLimitedData(int $offset, int $limit): \Bitrix\Main\DB\Result { $query = $this->getLimitedQueries($offset, $limit)[0]; return QueryData::getData($query, $this->getDataTypeId()); } public function getContactDataLead(int $leadId): ?array { $query = LeadTable::query() ->setSelect(['NAME', 'LAST_NAME', 'POST', 'HONORIFIC', 'BIRTHDATE', 'HAS_EMAIL', 'HAS_IMOL', 'HAS_PHONE']) ->where('ID', $leadId); // $leadDb = LeadTable::getById($leadId); if ($lead = $query->fetch()) { $contactsFields = []; if ( ($lead['HAS_EMAIL'] === 'Y') || ($lead['HAS_IMOL'] === 'Y') || ($lead['HAS_PHONE'] === 'Y') ) { $leadMultiFields = Container::getInstance() ->getMultifieldStorage() ->get(new \Bitrix\Crm\ItemIdentifier(\CCrmOwnerType::Lead, $leadId)); $contactsFields = $leadMultiFields->toArray(); } return [ 'NAME' => $lead['NAME'], 'LAST_NAME' => $lead['LAST_NAME'], 'POST' => $lead['POST'], 'HONORIFIC' => $lead['HONORIFIC'], 'BIRTHDATE' => $lead['BIRTHDATE'], 'FM' => $contactsFields, ]; } return null; } }