403Webshell
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 :
current_dir [ Writeable] document_root [ Writeable]

 

Command :


[ Back ]     

Current File : /home/bitrix/ext_www/rospirotorg.ru/bitrix/modules/sender/lib/integration/crm/connectors/lead.php
<?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;
	}
}

Youez - 2016 - github.com/yon3zu
LinuXploit