• Модуль: voximplant
  • Путь к файлу: ~/bitrix/modules/voximplant/lib/integration/report/handler/base.php
  • Класс: BitrixVoximplantIntegrationReportHandlerBase
  • Вызов: Base::addToQueryFilterCase
protected function addToQueryFilterCase(Query $query, array $filterParameters): void
{
	$allowedUserIds = $this->getAllowedUserIds();
	if (!$filterParameters['PORTAL_USER_ID'] && $allowedUserIds)
	{
		$query->whereIn('PORTAL_USER_ID', $allowedUserIds);
	}

	foreach ($filterParameters as $filterKey => $filterValue)
	{
		if ($filterValue === '')
		{
			continue;
		}

		switch ($filterKey)
		{
			case 'PORTAL_USER_ID':
				if ($allowedUserIds)
				{
					$availableUserIds = array_intersect($allowedUserIds, [$filterValue]);
					$portalUserIds = $availableUserIds ?: [-1];

					$query->whereIn('PORTAL_USER_ID', $portalUserIds);
				}
				else
				{
					$query->whereIn('PORTAL_USER_ID', $filterValue);
				}
				break;

			case 'PORTAL_NUMBER':
				$query->whereIn('PORTAL_NUMBER', $filterValue);
				break;

			case 'PHONE_NUMBER':
				$query->whereIn('PHONE_NUMBER', $filterValue);
				break;

			case 'COMMENT':
				$query->whereLike('COMMENT', $filterValue);
				break;

			case 'INCOMING':
				if (is_array($filterValue))
				{
					$query->whereIn('INCOMING', $filterValue);
				}
				else
				{
					$query->where('INCOMING', '=', $filterValue);
				}
				break;

			case 'STATUS':
				if ($filterValue === self::CALL_STATUS_SUCCESS)
				{
					$query->where('CALL_FAILED_CODE', '=', '200');
				}
				elseif ($filterValue === self::CALL_STATUS_FAILURE)
				{
					$query->where('CALL_FAILED_CODE', '!=', '200');
				}
				break;

			case 'CALL_DURATION_numsel':
				$durationField = 'CALL_DURATION';
				switch ($filterValue)
				{
					case NumberType::SINGLE:
					case NumberType::RANGE:
						$query->whereBetween(
							$durationField,
							$filterParameters[$durationField.'_from'],
							$filterParameters[$durationField.'_to']
						);
						break;
					case NumberType::MORE:
						$query->where($durationField, '>', $filterParameters[$durationField.'_from']);
						break;
					case NumberType::LESS:
						$query->where($durationField, '<', $filterParameters[$durationField.'_from']);
						break;
				}
				break;

			case 'HOUR':
				$dateWithShift = $this->getDateExpressionWithTimeShiftForQuery();
				$query->registerRuntimeField(new ExpressionField(
					'HOUR',
					"hour($dateWithShift)",
					['CALL_START_DATE']
				));
				$query->where('HOUR', '=', $filterValue);
				break;

			case 'DAY_OF_WEEK':
				$dateWithShift = $this->getDateExpressionWithTimeShiftForQuery();
				$query->registerRuntimeField(new BitrixMainEntityExpressionField(
					'DAY_OF_WEEK',
					"dayofweek($dateWithShift) - 1",
					['CALL_START_DATE']
				));
				$query->where('DAY_OF_WEEK', '=', $filterValue);
				break;
		}
	}
}