• Модуль: tasks
  • Путь к файлу: ~/bitrix/modules/tasks/lib/provider/taskfilterbuilder.php
  • Класс: BitrixTasksProviderTaskFilterBuilder
  • Вызов: TaskFilterBuilder::translateFilterTs
private function translateFilterTs(string $key, $val): ?ConditionTree
{
	$timestamp = time();

	if (!CTimeZone::enabled())
	{
		CTimeZone::enable();
	}

	$tzOffset = CTimeZone::getOffset();
	$timestamp += $tzOffset;

	if (!CTimeZone::enabled())
	{
		CTimeZone::disable();
	}

	$filter = [
		'::LOGIC' => 'AND'
	];
	$key = ltrim($key);

	$operation = $this->parseOperation($key);
	if (mb_substr($operation, 0, 1) === self::OPERATION_LEGACY)
	{
		$operationCode = (int) mb_substr($operation, 1);

		$arManifest = CTaskFilterCtrl::getManifest();
		$arOperationsMap = $arManifest['Operations map'];
		$operationPrefix = $arOperationsMap[$operationCode];
		$fieldName = mb_substr($key, mb_strlen($operationPrefix) + 5, -3); // Cutoff operation, prefix "META:" and suffix "_TS"
	}
	else
	{
		$fieldName = mb_substr($key, 0, mb_strlen($key) - 3);
		if ($operation !== self::OPERATION_DEFAULT)
		{
			$fieldName = mb_substr($fieldName, mb_strlen($operation));
		}

		switch ($operation)
		{
			case self::OPERATION_LESS:
				$operationCode = CTaskFilterCtrl::OP_STRICTLY_LESS;
				break;

			case self::OPERATION_GREAT:
				$operationCode = CTaskFilterCtrl::OP_STRICTLY_GREATER;
				break;

			case self::OPERATION_LESS_EQ:
				$operationCode = CTaskFilterCtrl::OP_LESS_OR_EQUAL;
				break;

			case self::OPERATION_GREAT_EQ:
				$operationCode = CTaskFilterCtrl::OP_GREATER_OR_EQUAL;
				break;

			case self::OPERATION_NOT_EQUAL:
				$operationCode = CTaskFilterCtrl::OP_NOT_EQUAL;
				break;

			case self::OPERATION_DEFAULT:
			case self::OPERATION_EQUAL:
				$operationCode = CTaskFilterCtrl::OP_EQUAL;
				break;

			default:
				return null;
		}
	}

	if (
		$operationCode !== CTaskFilterCtrl::OP_DATE_NEXT_DAYS
		&& $operationCode !== CTaskFilterCtrl::OP_DATE_LAST_DAYS
	)
	{
		$val += $tzOffset;
	}

	$dateFinish = null;
	$operationB = null;
	$ts2 = null;
	$weekDay = date('N');

	switch ($operationCode)
	{
		case CTaskFilterCtrl::OP_DATE_TODAY:
			$operationA = self::OPERATION_GREAT_EQ;
			$operationB = self::OPERATION_LESS_EQ;
			$ts1 = $ts2 = $timestamp;
			break;

		case CTaskFilterCtrl::OP_DATE_YESTERDAY:
			$operationA = self::OPERATION_GREAT_EQ;
			$operationB = self::OPERATION_LESS_EQ;
			$ts1 = $ts2 = $timestamp - 86400;
			break;

		case CTaskFilterCtrl::OP_DATE_TOMORROW:
			$operationA = self::OPERATION_GREAT_EQ;
			$operationB = self::OPERATION_LESS_EQ;
			$ts1 = $ts2 = $timestamp + 86400;
			break;

		case CTaskFilterCtrl::OP_DATE_CUR_WEEK:
			$operationA = self::OPERATION_GREAT_EQ;
			$operationB = self::OPERATION_LESS_EQ;
			$ts1 = $timestamp - ($weekDay - 1) * 86400;
			$ts2 = $timestamp + (7 - $weekDay) * 86400;
			break;

		case CTaskFilterCtrl::OP_DATE_PREV_WEEK:
			$operationA = self::OPERATION_GREAT_EQ;
			$operationB = self::OPERATION_LESS_EQ;
			$ts1 = $timestamp - ($weekDay - 1 + 7) * 86400;
			$ts2 = $timestamp - $weekDay * 86400;
			break;

		case CTaskFilterCtrl::OP_DATE_NEXT_WEEK:
			$operationA = self::OPERATION_GREAT_EQ;
			$operationB = self::OPERATION_LESS_EQ;
			$ts1 = $timestamp + (7 - $weekDay + 1) * 86400;
			$ts2 = $timestamp + (7 - $weekDay + 7) * 86400;
			break;

		case CTaskFilterCtrl::OP_DATE_CUR_MONTH:
			$operationA = self::OPERATION_GREAT_EQ;
			$operationB = self::OPERATION_LESS_EQ;
			$ts1 = mktime(0, 0, 0, date('n', $timestamp), 1, date('Y', $timestamp));
			$ts2 = mktime(23, 59, 59, date('n', $timestamp) + 1, 0, date('Y', $timestamp));
			break;

		case CTaskFilterCtrl::OP_DATE_PREV_MONTH:
			$operationA = self::OPERATION_GREAT_EQ;
			$operationB = self::OPERATION_LESS_EQ;
			$ts1 = mktime(0, 0, 0, date('n', $timestamp) - 1, 1, date('Y', $timestamp));
			$ts2 = mktime(23, 59, 59, date('n', $timestamp), 0, date('Y', $timestamp));
			break;

		case CTaskFilterCtrl::OP_DATE_NEXT_MONTH:
			$operationA = self::OPERATION_GREAT_EQ;
			$operationB = self::OPERATION_LESS_EQ;
			$ts1 = mktime(0, 0, 0, date('n', $timestamp) + 1, 1, date('Y', $timestamp));
			$ts2 = mktime(23, 59, 59, date('n', $timestamp) + 2, 0, date('Y', $timestamp));
			break;

		case CTaskFilterCtrl::OP_DATE_LAST_DAYS:
			$operationA = self::OPERATION_GREAT_EQ;
			$operationB = self::OPERATION_LESS_EQ;
			$ts1 = $timestamp - ((int)$val) * 86400; // val in days
			$ts2 = $timestamp;
			break;

		case CTaskFilterCtrl::OP_DATE_NEXT_DAYS:
			$operationA = self::OPERATION_GREAT_EQ;
			$operationB = self::OPERATION_LESS_EQ;
			$ts1 = $timestamp;
			$ts2 = $timestamp + ((int)$val) * 86400; // val in days
			break;

		case CTaskFilterCtrl::OP_EQUAL:
			$operationA = self::OPERATION_GREAT_EQ;
			$operationB = self::OPERATION_LESS_EQ;
			$ts1 = mktime(0, 0, 0, date('n', $val), date('j', $val), date('Y', $val));
			$ts2 = mktime(23, 59, 59, date('n', $val), date('j', $val), date('Y', $val));
			break;

		case CTaskFilterCtrl::OP_LESS_OR_EQUAL:
			$operationA = self::OPERATION_LESS_EQ;
			$ts1 = $val;
			break;

		case CTaskFilterCtrl::OP_GREATER_OR_EQUAL:
			$operationA = self::OPERATION_GREAT_EQ;
			$ts1 = $val;
			break;

		case CTaskFilterCtrl::OP_NOT_EQUAL:
			$operationA = self::OPERATION_LESS;
			$operationB = self::OPERATION_GREAT;
			$ts1 = mktime(0, 0, 0, date('n', $val), date('j', $val), date('Y', $val));
			$ts2 = mktime(23, 59, 59, date('n', $val), date('j', $val), date('Y', $val));
			break;

		case CTaskFilterCtrl::OP_STRICTLY_LESS:
			$operationA = self::OPERATION_LESS;
			$ts1 = $val;
			break;

		case CTaskFilterCtrl::OP_STRICTLY_GREATER:
			$operationA = self::OPERATION_GREAT;
			$ts1 = $val;
			break;

		default:
			return null;
	}

	$dateStart = ConvertTimeStamp(mktime(0, 0, 0, date('n', $ts1), date('j', $ts1), date('Y', $ts1)), 'FULL');
	if ($ts2)
	{
		$dateFinish = ConvertTimeStamp(mktime(23, 59, 59, date('n', $ts2), date('j', $ts2), date('Y', $ts2)), 'FULL');
	}

	if ($dateStart)
	{
		$arrayKey = $operationA.$fieldName;
		while (isset($filter[$arrayKey]))
		{
			$arrayKey = ' '.$arrayKey;
		}

		$filter[$arrayKey] = $dateStart;
	}

	if (
		$operationB
		&& $dateFinish
	)
	{
		$arrayKey = $operationB.$fieldName;
		while (isset($filter[$arrayKey]))
		{
			$arrayKey = ' '.$arrayKey;
		}

		$filter[$arrayKey] = $dateFinish;
	}

	return $this->translateFilter($filter);
}