• Модуль: crm
  • Путь к файлу: ~/bitrix/modules/crm/lib/widget/data/leadconversionrate.php
  • Класс: Bitrix\Crm\Widget\Data\LeadConversionRate
  • Вызов: LeadConversionRate::getList
public function getList(array $params)
{
	$group = isset($params['group'])? mb_strtoupper($params['group']) : '';
	if($group !== '' && $group !== self::GROUP_BY_USER && $group !== self::GROUP_BY_DATE)
	{
		$group = '';
	}

	/** @var array $select */
	$select = isset($params['select']) && is_array($params['select']) ? $params['select'] : array();
	$name = '';
	if(!empty($select))
	{
		$selectItem = $select[0];
		if(isset($selectItem['name']))
		{
			$name = $selectItem['name'];
		}
	}

	if($name === '')
	{
		$name = 'SUCCESS';
	}

	$listParams = array(
		'group' => $group,
		'filter' => $params['filter'],
		'select' => array(array('name' => 'COUNT', 'aggregate' => 'COUNT'))
	);

	if($name == 'SUCCESS')
	{
		$numeratorSrc = new LeadConversionStatistics($this->settings, $this->userID, $this->enablePermissionCheck);
		$numeratorItems = $numeratorSrc->getList($listParams);
	}
	elseif($name == 'FAIL')
	{
		$numeratorSrc = new LeadJunk($this->settings, $this->userID, $this->enablePermissionCheck);
		$numeratorItems = $numeratorSrc->getList($listParams);
	}
	else
	{
		throw new Main\NotSupportedException("The field '{$name}' is not supported in current context");
	}

	$denominatorSrc = new LeadInWork($this->settings, $this->userID, $this->enablePermissionCheck);
	$denominatorItems = $denominatorSrc->getList($listParams);

	$results = array();
	if($group === self::GROUP_BY_DATE || $group === self::GROUP_BY_USER)
	{
		$items = array();
		foreach($denominatorItems as $item)
		{
			if($group === self::GROUP_BY_USER)
			{
				$userID = isset($item['USER_ID']) ? (int)$item['USER_ID'] : 0;
				if($userID <= 0)
				{
					continue;
				}

				$qty = isset($item['COUNT']) ? (int)$item['COUNT'] : 0;
				$items[$userID] = array(
					'USER_ID' => $userID,
					'USER' => isset($item['USER']) ? $item['USER'] : $userID,
					'DENOMINATOR' => $qty,
					'NUMERATOR' => 0
				);
			}
			else//if($group === self::GROUP_BY_DATE)
			{
				$date = isset($item['DATE']) ? $item['DATE'] : '';
				if($date === '')
				{
					continue;
				}

				$qty = isset($item['COUNT']) ? (int)$item['COUNT'] : 0;
				$items[$date] = array('DATE' => $date, 'DENOMINATOR' => $qty, 'NUMERATOR' => 0);
			}
		}

		foreach($numeratorItems as $item)
		{
			if($group === self::GROUP_BY_USER)
			{
				$userID = isset($item['USER_ID']) ? (int)$item['USER_ID'] : 0;
				if($userID <= 0)
				{
					continue;
				}

				$currentItem = isset($items[$userID])
					? $items[$userID]
					: array(
						'USER_ID' => $userID,
						'USER' => isset($item['USER']) ? $item['USER'] : $userID,
						'DENOMINATOR' => 0,
						'NUMERATOR' => 0
					);

				if(isset($item['COUNT']))
				{
					$currentItem['NUMERATOR'] = (int)$item['COUNT'];
				}
				$items[$userID] = $currentItem;
			}
			else//if($group === self::GROUP_BY_DATE)
			{
				$date = isset($item['DATE']) ? $item['DATE'] : '';
				if($date === '')
				{
					continue;
				}

				$currentItem = isset($items[$date])
					? $items[$date]
					: array('DATE' => $date, 'DENOMINATOR' => 0, 'NUMERATOR' => 0);

				if(isset($item['COUNT']))
				{
					$currentItem['NUMERATOR'] = (int)$item['COUNT'];
				}
				$items[$date] = $currentItem;
			}
		}

		foreach($items as $item)
		{
			$resultItem = array(
				$name => $item['NUMERATOR'] > 0 && $item['DENOMINATOR'] > 0
					? round(100 * ($item['NUMERATOR'] / $item['DENOMINATOR']), 2) : 0.0
			);

			if($group === self::GROUP_BY_USER)
			{
				$resultItem['USER_ID'] = $item['USER_ID'];
				$resultItem['USER'] = $item['USER'];
			}
			else//if($group === self::GROUP_BY_DATE)
			{
				$resultItem['DATE'] = $item['DATE'];
			}
			$results[] = $resultItem;
		}
	}
	else
	{
		$numerator = count($numeratorItems) !== 0 && isset($numeratorItems[0]['COUNT'])
			? (int)$numeratorItems[0]['COUNT'] : 0;

		$denominator = count($denominatorItems) !== 0 && isset($denominatorItems[0]['COUNT'])
			? (int)$denominatorItems[0]['COUNT'] : 0;

		$value = 0;
		if($numerator > 0 && $denominator > 0)
		{
			$value = round(100 * ($numerator / $denominator), 2);
		}
		$results[] = array($name => $value);
	}

	$results = array_values($results);

	if(isset($params['sort']) && is_array($params['sort']))
	{
		foreach($params['sort'] as $sortItem)
		{
			if(isset($sortItem['name']) && $sortItem['name'] === $name)
			{
				$order = isset($sortItem['order']) && mb_strtolower($sortItem['order']) === 'desc'
					? SORT_DESC : SORT_ASC;
				Collection::sortByColumn($results, array($name => $order));
				break;
			}
		}
	}
	return $results;
}