• Модуль: tasks
  • Путь к файлу: ~/bitrix/modules/tasks/classes/general/task.php
  • Класс: CTasks
  • Вызов: CTasks::getFieldRuntimeOptions
static function getFieldRuntimeOptions($key, $value, $parameters)
{
	$runtimeOptions = [
		'FIELDS' => [],
		'FILTERS' => [],
	];
	$dates = ['DEADLINE', 'CREATED_DATE', 'CLOSED_DATE', 'DATE_START', 'START_DATE_PLAN', 'END_DATE_PLAN'];

	switch ($key)
	{
		case 'ID':
		case 'PRIORITY':
		case 'MARK':
		case 'ALLOW_TIME_TRACKING':
		case 'DEADLINE':
		case 'CREATED_DATE':
		case 'CLOSED_DATE':
		case 'DATE_START':
		case 'START_DATE_PLAN':
		case 'END_DATE_PLAN':
			foreach ($value as $name => $val)
			{
				if (in_array($key, $dates))
				{
					$val = new TypeDateTime($val);
				}

				$fieldKeyData = static::parseFieldKey($name, $key);
				$runtimeOptions['FILTERS'][$key] = Query::filter()->where($key, $fieldKeyData['OPERATOR'], $val);
			}
			break;

		case 'TITLE':
			foreach ($value as $name => $val)
			{
				$fieldKeyData = static::parseFieldKey($name, $key);

				$field = Query::expr()->upper($key);
				$val = '%' . ToUpper($val) . '%';

				$runtimeOptions['FILTERS'][$key] = Query::filter()->where($field, $fieldKeyData['OPERATOR'], $val);
			}
			break;

		case 'CREATED_BY':
		case 'RESPONSIBLE_ID':
		case 'GROUP_ID':
			$fieldKeyData = static::parseFieldKey(key($value), $key, 'in');
			$runtimeOptions['FILTERS'][$key] = Query::filter()
				->where($key, $fieldKeyData['OPERATOR'], current($value));
			break;

		case 'STATUS':
			if (!empty($value['REAL_STATUS']))
			{
				$runtimeOptions['FILTERS'][$key] = Query::filter()->where($key, 'in', $value['REAL_STATUS']);
			}
			break;

		case 'ACCOMPLICE':
		case 'AUDITOR':
		case 'TAG':
			$parameters['USER_ID'] = $parameters['NAME'] = current($value);
			$parameters['TYPE_CONDITION'] = true;

			$runtimeOptions['FILTERS'][$key] = Query::filter()
				->whereExists(static::getSelectionExpressionByType($key, $parameters));
			break;

		case 'ROLEID':
		case 'PROBLEM':
			if ($key === 'ROLEID')
			{
				$filterOptions = static::getFilterOptionsFromRoleField($value);
			}
			else
			{
				$filterOptions = static::getFilterOptionsFromProblemField($value, $parameters);
			}

			$runtimeOptions['FIELDS'] = $filterOptions['FIELDS'];
			$runtimeOptions['FILTERS'] = $filterOptions['FILTERS'];
			break;

		case 'ACTIVE':
			$date = $value[$key];
			$dateStart = $dateEnd = false;

			if (MakeTimeStamp($date['START']) > 0)
			{
				$dateStart = new TypeDateTime($date['START']);
			}
			if (MakeTimeStamp($date['END']))
			{
				$dateEnd = new TypeDateTime($date['END']);
			}

			if ($dateStart !== false && $dateEnd !== false)
			{
				$runtimeOptions['FILTERS'][$key] = Query::filter()->where(
					Query::filter()
						->logic('or')
						->where(
							Query::filter()
								->where('CREATED_DATE', '>=', $dateStart)
								->where('CLOSED_DATE', '<=', $dateEnd)
						)
						->where(
							Query::filter()
								->where('CHANGED_DATE', '>=', $dateStart)
								->where('CHANGED_DATE', '<=', $dateEnd)
						)
						->where(
							Query::filter()
								->where('CREATED_DATE', '<=', $dateStart)
								->where('CLOSED_DATE', '=', null)
						)
				);
			}
			break;

		case 'PARAMS':
			foreach ($value as $name => $val)
			{
				$fieldKeyData = static::parseFieldKey($name);
				$fieldName = $fieldKeyData['FIELD_NAME'];

				if ($fieldName == 'MARK' || $fieldName == 'ADD_IN_REPORT')
				{
					$operator = $fieldKeyData['OPERATOR'];
					$runtimeOptions['FILTERS'][$fieldName] = Query::filter()->where($fieldName, $operator, $val);
				}
				elseif ($fieldName == 'FAVORITE')
				{
					$runtimeOptions['FIELDS'][$fieldName] = new EntityReferenceField(
						'FVT',
						FavoriteTable::class,
						Join::on('ref.TASK_ID', 'this.ID')
							->where('ref.USER_ID', $parameters['USER_ID'])
					);
					$runtimeOptions['FILTERS'][$fieldName] = Query::filter()->where('FVT.TASK_ID', '!=', null);
				}
				elseif ($fieldName == 'OVERDUED')
				{
					$runtimeOptions['FILTERS'][$fieldName] = Query::filter()
						->where('DEADLINE', '!=', null)
						->where('CLOSED_DATE', '!=', null)
						->whereColumn('DEADLINE', '<', 'CLOSED_DATE');
				}
			}
			break;
	}

	return $runtimeOptions;
}